【环境】Ubuntu 安装 Kubernetes

环境说明

以下是笔者的尝试过的搭建环境:

  • ubuntu 18.04 / 22.04
  • Kubernetes 1.24 ~ 1.26
  • docker / containerd

需要注意的是,Kubernetes 在 1.24 版本后删除了 dockershim ,搭建过程中如遇容器运行时、镜像等问题,参考一些旧版本的基于 docker 的解决方法大概率是不可行的。

环境准备

无论是 master 还是 worker 节点,都需要完成如下环境的修改与软件安装。

设置静态 IP

  • ifconfig查看当前 IP 和子网掩码,route -n查看网关地址

  • 进入/etc/netplan目录,编辑其中的01-network-manager-all.yaml文件(不同版本 Ubuntu 的文件名可能不一样),格式形如:

    yaml 复制代码
    network:
      version: 2
      renderer: NetworkManager
      ethernets:
        enp1s0:  # 网卡名称
          dhcp4: no  # 关闭dhcp
          dhcp6: no
          addresses: [192.168.122.120/24]  # 静态IP
          gateway4: 192.168.122.1  # 网关
          nameservers:
            addresses: [8.8.8.8, 114.114.114.114]  # DNS
  • 使配置生效:sudo netplan apply

  • 桌面版可以直接在网络设置的图形化界面设置

系统优化

  • 禁用 swap 分区:编辑/etc/fstab,将 swap 那行注释掉

  • 修改模块配置(安装了 docker 可跳过这步)

    bash 复制代码
    # 临时修改(立即生效,重启后失效)
    
    modprobe br_netfilter
    echo "1" > /proc/sys/net/ipv4/ip_forward
    
    # 永久修改(重启后生效)
    
    # 开机自动加载 br_netfilter 模块
    cat > /etc/modules-load.d/k8s.conf <<EOF
    br_netfilter
    EOF
    
    # 开机自动设置 ip_forward 值为1
    cat > /etc/sysctl.d/k8s.conf << EOF
    net.ipv4.ip_forward=1
    EOF
  • 重启

软件安装

  • 安装基础软件

    bash 复制代码
    sudo apt update
    sudo apt install -y apt-transport-https ca-certificates curl
  • 安装 conteinerd / docker(二选一即可)

    bash 复制代码
    sudo apt install -y docker.io
    sudo apt install -y containerd
  • 安装 kubenetes

    • 添加软件源

      bash 复制代码
      curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add - 
      cat > /etc/apt/sources.list.d/kubernetes.list << EOF
      deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
      EOF
    • 安装组件

      bash 复制代码
      sudo apt update
      sudo apt install -y kubelet kubeadm kubectl
      sudo apt-mark hold kubelet kubeadm kubectl  # 锁定版本

      组件说明:
      kubeadm:用来初始化集群的指令
      kubectl:用来与集群通信的命令行工具
      kubelet:在集群中的每个节点上用来启动 Pod 和容器等

k8s 配置

master 节点配置

master 的作用是创建集群网络

  • 初始化集群:

    css 复制代码
    kubeadm init \
    --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
    --pod-network-cidr=10.244.0.0/16
    [--cri-socket unix:///var/run/cri-dockerd.sock]

    参数说明:
    image-repository:镜像源
    pod-network-cidr:pod 网络地址范围

    这里是最容易出问题的地方,一般会显示超时,解决办法见文末。

    成功后会显示 Your Kubernetes control-plane has initialized successfully! ,注意记下最后生成的包含 token 的 join 命令。

  • 配置 kubectl

    bash 复制代码
    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
  • 配置 flannel 网络(否则节点状态为NotReady

    bash 复制代码
    kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

worker 节点配置

该配置是为了将 worker 节点加入集群网络

  • 拉取镜像

    bash 复制代码
    kubeadm config images pull --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers
  • 使用 join 命令加入网络

    bash 复制代码
    # 请换成你自己的 master 生成的命令
    kubeadm join 192.168.142.134:6443 --token q1twco.j374oo66pybp1lf2 --discovery-token-ca-cert-hash sha256:959c16f041e1b218bec3c8b27a4a75318590c6377e54ccdbda4956ba6d1424a2
  • 使用 kubectl get nodes 查看网络中的节点

Some Tips

  • 查看日志

    bash 复制代码
    journalctl -xeu kubelet
  • 主节点重新初始化前,或者工作节点加入集群前,都需要重置环境

    bash 复制代码
    kubeadm reset -f [--cri-socket unix:///var/run/cri-dockerd.sock]
  • 主节点初始化后,需要重新配置$HOME/.kube/config

  • 生成新的 Token

    bash 复制代码
    kubeadm token create --print-join-command

问题处理

  • (日志中)错误提示: failed to get sandbox image "registry.k8s.io/pause:3.6"

    解决:从国内仓库拉取pause镜像,修改tag,注意版本号和 tag 与报错提示的一致

    bash 复制代码
    ctr -n k8s.io i pull -k registry.aliyuncs.com/google_containers/pause:3.6
    ctr -n k8s.io i tag registry.aliyuncs.com/google_containers/pause:3.6 registry.k8s.io/pause:3.6
  • crictl 报错:runtime connect using default endpoints

    解决:指定容器运行时

    bash 复制代码
    # kubernetes 1.24 之后,dockershim 变成了 cri-dockerd,需要额外安装
    crictl config runtime-endpoint unix:///run/cri-dockerd.sock
    crictl config image-endpoint unix:///run/cri-dockerd.sock
    # 选择用 containerd 作为容器运行时
    crictl config runtime-endpoint unix:///run/containerd/containerd.sock
    crictl config image-endpoint unix:///run/containerd/containerd.sock
    # 还可以设置其他的容器运行时

    生成的配置在cat /etc/crictl.yaml,可以随时修改

参考资料

相关推荐
Dusk_橙子6 小时前
在K8S中,节点状态notReady如何排查?
云原生·容器·kubernetes
骑着王八撵玉兔6 小时前
【容器化技术 Docker 与微服务部署】详解
分布式·docker·微服务·中间件·容器·架构
ihengshuai9 小时前
Docker网络与数据卷持久化
网络·docker·容器
iffy19 小时前
Docker部署cosyvoice
运维·docker·容器
zyplanke10 小时前
Docker安装(Docker Engine安装)
运维·docker·容器
华为云开发者联盟10 小时前
Helm适配华为云OBS实践分享,更方便地部署、管理复杂应用
kubernetes·开源·华为云obs·helm应用
文浩(楠搏万)11 小时前
全面解析 Node-RED:功能、Docker 部署与实战示例
运维·物联网·docker·容器·编程工具·node-red·流编程
世界听的明白11 小时前
【docker】笔记
笔记·docker·容器
会飞的土拨鼠呀14 小时前
删除了overlay2 目录下的文件 存储空间(df -h)没有释放
运维·容器