• k8s集群搭建(ubuntu 20.04 + k8s 1.28.3 + calico + containerd1.7.8)


    环境&需求

    服务器

    10.235.165.21 k8s-master
    10.235.165.22 k8s-slave1
    10.235.165.23 k8s-slave2
    
    • 1
    • 2
    • 3

    OS版本:

    root@vms131:~# lsb_release -a
    No LSB modules are available.
    Distributor ID: Ubuntu
    Description:  Ubuntu 20.04.5 LTS
    Release:    20.04
    Codename:    focal
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    需求

    ​ 在 Ubuntu 20.04上搭建k8s1.28.3,并使用containerd作为容器运行时,使用calico作为cni插件。

    安装步骤

    特别注意

    以下操作,除特别标注外,都是在所有节点上执行

    环境准备

    • 服务器:linux发行版,最低配置2C2G

    • 各节点网络互通

    • 节点之中不可以有重复的主机名、MAC 地址

      • 你可以使用命令 ip linkifconfig -a 来获取网络接口的 MAC 地址
      • 可以使用 sudo cat /sys/class/dmi/id/product_uuid 命令对 product_uuid 校验
    • 开放必要的端口(cni插件的端口要求以cni插件文档说明为准)
      在这里插入图片描述
      在这里插入图片描述

    • 配置节点主机名

      hostnamectl set-hostname k8s-master
      hostnamectl set-hostname k8s-slave1
      hostnamectl set-hostname k8s-slave2
      
      
      • 1
      • 2
      • 3
      • 4
    • 配置hostname解析

      cat>>/etc/hosts<<-eof
      10.235.165.21 k8s-master
      10.235.165.22 k8s-slave1
      10.235.165.23 k8s-slave2
      eof
      
      • 1
      • 2
      • 3
      • 4
      • 5
    • 关闭selinux

      echo "SELINUX=disabled" >> /etc/selinux/config
      
      • 1
    • 关闭swap

      swapoff -a && sed -i '/swap/ s/^\(.*\)$/#\1/' /etc/fstab
      
      • 1
    • 关闭防火墙并禁止开机自启

      ufw disable
      
      • 1
    • 转发 IPv4 并让 iptables 看到桥接流量

      cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
      overlay
      br_netfilter
      EOF
      
      sudo modprobe overlay
      sudo modprobe br_netfilter
      
      # 设置所需的 sysctl 参数,参数在重新启动后保持不变
      cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
      net.bridge.bridge-nf-call-iptables  = 1
      net.bridge.bridge-nf-call-ip6tables = 1
      net.ipv4.ip_forward                 = 1
      EOF
      
      # 应用 sysctl 参数而不重新启动
      sudo sysctl --system
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17

    安装容器运行时(containerd)

    安装containerd

    1)安装containerd 1.7.8

    # 下载二进制文件
    root@k8s-master:~# wget https://github.com/containerd/containerd/releases/download/v1.7.8/containerd-1.7.8-linux-amd64.tar.gz
    
    # 解压
    root@k8s-master:/zpdata/packages# tar Cxzvf /usr/local containerd-1.7.8-linux-amd64.tar.gz
    bin/
    bin/containerd-shim-runc-v1
    bin/containerd-stress
    bin/containerd-shim-runc-v2
    bin/containerd
    bin/containerd-shim
    bin/ctr
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    FAQ: For Kubernetes, do I need to download cri-containerd-(cni-)-.tar.gz too?

    Answer: No.

    As the Kubernetes CRI feature has been already included in containerd---.tar.gz, you do not need to download the cri-containerd-.... archives to use CRI.

    2)【可选】将containerd配置成systemd服务,方便使用systemctl命令管理

    root@k8s-master:/zpdata/packages# mkdir -p /usr/local/lib/systemd/system/ ; cd /usr/local/lib/systemd/system/
    root@k8s-master:/usr/local/lib/systemd/system# curl -s -o containerd.service http://raw.githubusercontent.com/containerd/containerd/main/containerd.service
    
    # 加载配置文件
    systemctl daemon-reload
    # 设置开启自启并立即启动
    systemctl enable --now containerd
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    配置containerd的config.toml

    containerd的一些默认参数可能不兼容,需要针对性的调整

    root@k8s-master:/zpdata/packages# mkdir /etc/containerd
    root@k8s-master:/zpdata/packages# containerd config default > /etc/containerd/config.toml
    
    • 1
    • 2

    做如下修改

    1. 修改“sandbox_image”
    [plugins."io.containerd.grpc.v1.cri"]
    ……
    sandbox_image = "registry.k8s.io/pause:3.8"  #修改为   sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.8"
    
    • 1
    • 2
    • 3
    1. 修改"SystemdCgroup"【重要,需要与kubelet的cGroupDriver匹配】
    [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
    ……
    [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
    ……
    SystemdCgroup = false    # 改为  SystemdCgroup = true
    
    • 1
    • 2
    • 3
    • 4
    • 5

    然后重启containerd

    sudo systemctl restart containerd
    
    • 1

    安装runc

    root@k8s-master:/zpdata/packages# wget http://github.com/opencontainers/runc/releases/download/v1.1.10/runc.amd64
    root@k8s-master:/zpdata/packages# install -m 755 runc.amd64 /usr/local/sbin/runc
    
    • 1
    • 2

    安装cni

    root@k8s-slave1:/zpdata/packages# wget http://github.com/containernetworking/plugins/releases/download/v1.3.0/cni-plugins-linux-amd64-v1.3.0.tgz 
    root@k8s-master:/zpdata/packages# mkdir -p /opt/cni/bin
    root@k8s-master:/zpdata/packages# tar Cxzvf /opt/cni/bin/ cni-plugins-linux-amd64-v1.3.0.tgz 
    
    • 1
    • 2
    • 3

    安装容器操作的客户端工具(crictl,nerdctl)

    crictl --For debugging only

    VERSION="v1.28.0" # check latest version in https://github.com/kubernetes-sigs/cri-tools/releases page
    wget https://github.com/kubernetes-sigs/cri-tools/releases/download/$VERSION/crictl-$VERSION-linux-amd64.tar.gz
    sudo tar zxvf crictl-$VERSION-linux-amd64.tar.gz -C /usr/local/bin
    
    # 检查
    root@k8s-master:/zpdata/packages# crictl -v
    crictl version v1.28.0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    nerdctl– General-purpose

    root@k8s-master:/zpdata/packages# wget https://github.com/containerd/nerdctl/releases/download/v1.7.0/nerdctl-1.7.0-linux-amd64.tar.gz
    root@k8s-master:/zpdata/packages# tar Cxzvvf /usr/local/bin nerdctl-1.7.0-linux-amd64.tar.gz
    # 检查
    root@k8s-master:/usr/local/bin# nerdctl -v
    nerdctl version 1.7.0
    
    • 1
    • 2
    • 3
    • 4
    • 5

    安装 kubeadm、kubelet 和 kubectl

    执行安装脚本install_kubeadm_kubelet_kubectl.sh:

    #!/usr/bin/sh
    # 1.更新 apt 包索引并安装使用 Kubernetes apt 仓库所需要的包
    echo "###step1#####
    apt-get update
    mkdir -p -m 755  /etc/apt/keyrings
    
    
    # 2.下载用于 Kubernetes 软件包仓库的公共签名密钥
    echo "###step2#####
    curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
    
    # 3. 添加 Kubernetes apt 仓库。 请注意,此仓库仅包含适用于 Kubernetes 1.28 的软件包; 对于其他 Kubernetes 次要版本,则需要更改 URL 中的 Kubernetes 次要版本以匹配你所需的次要版本 (你还应该检查正在阅读的安装文档是否为你计划安装的 Kubernetes 版本的文档)。
    echo "###step3#####
    echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
    
    # 4. 更新 apt 包索引,安装 kubelet、kubeadm 和 kubectl,并锁定其版本
    echo "###step4#####
    apt-get update
    apt-get install -y kubelet kubeadm kubectl
    #”apt-mark hold“用于避免执行apt upgrade命令时,将未锁定的包误更新。
    apt-mark hold kubelet kubeadm kubectl
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    kubelet 配置 cgroup 驱动程序

    警告

    需要确保容器运行时和 kubelet 所使用的是相同的 cgroup 驱动,否则 kubelet 进程会失败。

    前述步骤中containerd使用的systemd 作为cgroup驱动,所以kubelet也需要使用systemd作为cgroup驱动。

    相关细节可参见配置 cgroup 驱动

    kubeadm 支持在执行 kubeadm init 时,传递一个 KubeletConfiguration 结构体,形如kubeadm init --config kubeadm-config.yamlKubeletConfiguration 包含 cgroupDriver 字段,可用于控制 kubelet 的 cgroup 驱动。

    如下是KubeletConfiguration的最小样例:

    # kubeadm-config.yaml
    kind: ClusterConfiguration
    apiVersion: kubeadm.k8s.io/v1beta3
    kubernetesVersion: v1.21.0
    ---
    kind: KubeletConfiguration
    apiVersion: kubelet.config.k8s.io/v1beta1
    cgroupDriver: systemd
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    注意:

    在版本 1.22 及更高版本中,如果用户没有在 KubeletConfiguration 中设置 cgroupDriver 字段, kubeadm 会将它设置为默认值 systemd

    使用 kubeadm init 创建集群

    默认情况下,kubeadm 会从 registry.k8s.io 仓库拉取镜像,在没有互联网连接的情况下运行 kubeadm

    kubeadm config images list  #查看kubeadm init需要的镜像
    kubeadm config images pull  # 提前拉取这些镜像
    
    #查看kubeadm init的默认值
    kubeadm config print init-defaults
    #查看kubeadm join的默认值
    kubeadm config print join-defaults
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    【master节点】

    kubeadm init --image-repository registry.aliyuncs.com/google_containers --kubernetes-version=v1.28.3
    
    • 1

    出现这个提示说明init成功

    Your Kubernetes control-plane has initialized successfully!

    注意到kubectl get no发现状态为NotReady,是因为没有网络插件

    root@k8s-master:/etc/apt/sources.list.d# kubectl get no
    NAME         STATUS     ROLES           AGE     VERSION
    k8s-master   NotReady   control-plane   2m32s   v1.28.3
    
    • 1
    • 2
    • 3

    安装网络插件(Calico)

    k8s中网络插件有很中,比如:CalicoFlannel等,calico作为k8s的中的一种资源,只需要在master上执行即可。

    以下以安装Calico为例

    # 1)下载calico.yaml文件
    wget https://github.com/projectcalico/calico/raw/2f38bd7adc4771a1de28bd2545e28d888c017a00/manifests/calico.yaml
    
    # 2)做如下修改 calico.yaml.default为修改前,calico.yaml为修改后
    root@k8s-master:/zpdata/packages# diff calico.yaml.default  calico.yaml
    4931,4932c4931,4932
    <             # - name: CALICO_IPV4POOL_CIDR
    <             #   value: "192.168.0.0/16"
    ---
    >             - name: CALICO_IPV4POOL_CIDR
    >               value: "10.96.0.0/12"
    
    
    # 10.96.0.0/12  值来源于kubeadm init时指定的 --pod-network-cidr 参数,默认是:10.96.0.0/12
    root@k8s-master:/zpdata/packages# kubectl get cm -n kube-system kubeadm-config -o yaml | grep serviceSubnet
          serviceSubnet: 10.96.0.0/12
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    使用kubeadm join将node加入k8s集群

    【slave1,slave2节点执行】

    kubeadm join 10.235.165.21:6443 --token aziikp.bm2cdaqa19jh3o74 \
            --discovery-token-ca-cert-hash sha256:c93e7c0eb331a663783f5526322a1ceb231338f06c61647adb082395e3a5c1f7
    
    • 1
    • 2

    ps:

    若令牌过期,或丢失上述指令可在控制平面节点使用如下指令重新获取:kubeadm token create --print-join-command

    验证

    【master节点执行】

    root@k8s-master:/zpdata/packages# kubectl get no -o wide
    NAME         STATUS   ROLES           AGE   VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME
    k8s-master   Ready    control-plane   55m   v1.28.3   10.235.165.21   <none>        Ubuntu 20.04.5 LTS   5.4.0-137-generic   containerd://1.7.8
    k8s-slave1   Ready    <none>          28m   v1.28.3   10.235.165.22   <none>        Ubuntu 20.04.5 LTS   5.4.0-137-generic   containerd://1.7.8
    k8s-slave2   Ready    <none>          28m   v1.28.3   10.235.165.23   <none>        Ubuntu 20.04.5 LTS   5.4.0-137-generic   containerd://1.7.8
    root@k8s-master:/zpdata/packages# kubectl cluster-info
    Kubernetes control plane is running at https://10.235.165.21:6443
    CoreDNS is running at https://10.235.165.21:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
    
    To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    如上,k8s 1.28.3 集群搭建完成

  • 相关阅读:
    数据库的数据类型
    Linux安装Docker | 使用国内镜像
    验证UDP端口是否开放
    数据可视化ECharts:静态页面制作--主体
    C语言结构体详解
    本地事务与分布式事务
    【C++详解】——模板初阶
    苍穹外卖技术栈
    系统稳定性
    vue移动端项目渲染pdf步骤
  • 原文地址:https://blog.csdn.net/zpsimon/article/details/134388092