【环境】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 的文件名可能不一样),格式形如:

    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
    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
    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 可跳过这步)

    # 临时修改(立即生效,重启后失效)
    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
    # 临时修改(立即生效,重启后失效)
    
    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
    # 临时修改(立即生效,重启后失效) 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
  • 重启

软件安装

  • 安装基础软件

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

    sudo apt install -y docker.io
    sudo apt install -y containerd
    sudo apt install -y docker.io
    sudo apt install -y containerd
    sudo apt install -y docker.io sudo apt install -y containerd
  • 安装 kubenetes

    • 添加软件源

      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
      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
      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
    • 安装组件

      sudo apt update
      sudo apt install -y kubelet kubeadm kubectl
      sudo apt-mark hold kubelet kubeadm kubectl # 锁定版本
      sudo apt update
      
      sudo apt install -y kubelet kubeadm kubectl
      sudo apt-mark hold kubelet kubeadm kubectl  # 锁定版本
      sudo apt update sudo apt install -y kubelet kubeadm kubectl sudo apt-mark hold kubelet kubeadm kubectl # 锁定版本

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

k8s 配置

master 节点配置

master 的作用是创建集群网络

  • 初始化集群:

    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]
    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]
    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 命令。

    11.jpg

  • 配置 kubectl

    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
    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

    kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
    kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
    kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

worker 节点配置

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

  • 拉取镜像

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

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

    3.png

Some Tips

  • 查看日志

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

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

  • 生成新的 Token

    kubeadm token create --print-join-command
    kubeadm token create --print-join-command
    kubeadm token create --print-join-command

问题处理

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

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

    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
    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
    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

    解决:指定容器运行时

    # 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
    # 还可以设置其他的容器运行时
    # 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
    # 还可以设置其他的容器运行时
    # 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,可以随时修改

参考资料

© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYVcONiC' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片