麒麟v10部署k8s+containerd

温馨提醒

环境

系统主机名IP角色kubernetes版本
Kylin Linux Advanced Server V10master192.168.200.125master1.28.2
Kylin Linux Advanced Server V10node-01192.168.200.154node1.28.2

环境初始化(所有节点)

  • 安装依赖

    1
    
    dnf install -y dnf-utils ipvsadm telnet wget net-tools conntrack ipset jq iptables curl sysstat libseccomp socat nfs-utils fuse
  • 修改主机名

    1
    2
    3
    4
    5
    
    # master 节点
    hostnamectl set-hostname master
    
    # node 节点
    hostnamectl set-hostname node-01
  • 修改本地解析

    1
    2
    3
    4
    
    cat >> /etc/hosts << EOF
    192.168.200.125	master
    192.168.200.154	node-01
    EOF
  • 关闭防火墙和 selinux

    1
    2
    3
    
    systemctl disable --now firewalld
    
    sed -i 's/enforcing/disabled/' /etc/selinux/config
  • 关闭 swap

    1
    2
    
    swapoff -a
    sed -ri 's/.*swap.*/#&/' /etc/fstab
  • 加载内核模块

    1
    2
    3
    4
    5
    
    cat <<EOF | tee /etc/modules-load.d/k8s.conf
    overlay
    br_netfilter
    nf_conntrack
    EOF
    1
    
    modprobe br_netfilter
  • 配置转发

    1
    2
    3
    4
    5
    
    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
    1
    2
    3
    
    sysctl -p /etc/sysctl.d/k8s.conf
    
    sysctl --system

部署容器运行时(所有节点)(任选其一)

安装 containerd

  • 安装

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    # 二进制安装
    wget https://github.com/containerd/containerd/releases/download/v1.7.14/containerd-1.7.14-linux-amd64.tar.gz
    tar xf containerd-1.7.14-linux-amd64.tar.gz
    cp bin/* /usr/local/bin
    
    # yum 安装
    yum install -y yum-utils
    yum-config-manager  --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    yum install containerd -y
  • 配置

    创建目录

    1
    
    mkdir -p /etc/containerd

    生成默认配置文件

    1
    
    containerd config default > /etc/containerd/config.toml

    修改配置

    1
    2
    3
    4
    5
    6
    7
    8
    
    # 修改配置
    sed -i '/SystemdCgroup/s/false/true/' /etc/containerd/config.toml
    
    # 手动修改
    sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"
    
    [grpc]
      address = "/var/run/containerd/containerd.sock"
  • 修改加速地址

    1
    2
    3
    4
    
    [plugins."io.containerd.grpc.v1.cri".registry]
      [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
          endpoint = ["https://hub.jzzx.vip"]
  • 创建启动脚本

    vim /usr/lib/systemd/system/containerd.service

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    
    [Unit]
    Description=containerd container runtime
    Documentation=https://containerd.io
    After=network.target local-fs.target
    
    [Service]
    #uncomment to enable the experimental sbservice (sandboxed) version of containerd/cri integration
    #Environment="ENABLE_CRI_SANDBOXES=sandboxed"
    ExecStartPre=-/sbin/modprobe overlay
    ExecStart=/usr/local/bin/containerd
    
    Type=notify
    Delegate=yes
    KillMode=process
    Restart=always
    RestartSec=5
    # Having non-zero Limit*s causes performance problems due to accounting overhead
    # in the kernel. We recommend using cgroups to do container-local accounting.
    LimitNPROC=infinity
    LimitCORE=infinity
    LimitNOFILE=infinity
    # Comment TasksMax if your systemd version does not supports it.
    # Only systemd 226 and above support this version.
    TasksMax=infinity
    OOMScoreAdjust=-999
    
    [Install]
    WantedBy=multi-user.target
  • 启动服务

    1
    2
    3
    
    systemctl daemon-reload
    
    systemctl enable --now containerd
  • 安装 runc

    1
    2
    3
    
    wget https://github.com/opencontainers/runc/releases/download/v1.1.4/runc.amd64
    
    install -m 755 runc.amd64 /usr/local/sbin/runc
  • 安装 CNI 插件

    1
    2
    3
    4
    5
    
    wget https://github.com/containernetworking/plugins/releases/download/v1.6.1/cni-plugins-linux-amd64-v1.6.1.tgz
    
    mkdir -p /opt/cni/bin
    
    tar Cxzvf /opt/cni/bin cni-plugins-linux-amd64-v1.6.1.tgz

安装 docker

  • 配置源

    1
    2
    
    yum install -y yum-utils 
    yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  • 安装

    1
    2
    
    yum install docker
    systemctl enable --now docker

部署 k8s(所有节点)

  • 添加安装源

    国外仓库

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    cat >> /etc/yum.repos.d/kubernetes.repo << EOF
    [kubernetes]
    name=Kubernetes
    baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch
    enabled=1
    gpgcheck=1
    gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
    exclude=kubelet kubeadm kubectl
    EOF

    国内仓库

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    cat >> /etc/yum.repos.d/kubernetes.repo << EOF
    [kubernetes]
    name=Kubernetes
    baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
    enabled=1
    gpgcheck=0
    repo_gpgcheck=0
    gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
    EOF
  • 查看版本

    1
    
    yum list kubeadm --showduplicates | sort -r
  • 安装

    默认安装最新版本,可以安装指定版本,如:kubeadm-1.28.2

    1
    
    yum install kubeadm kubectl kubelet
  • 修改 kubelet 配置

    1
    2
    3
    
    cat > /etc/default/kubelet << EOF
    KUBELET_EXTRA_ARGS="--cgroup-driver=systemd --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9"
    EOF
  • 修改 kubelet 启动脚本

    vim /usr/lib/systemd/system/kubelet.service

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    
    [Unit]
    Description=kubelet: The Kubernetes Node Agent
    Documentation=https://kubernetes.io/docs/
    Wants=network-online.target
    After=network-online.target
    
    [Service]
    ExecStart=/usr/bin/kubelet \
    --container-runtime=remote \			# 添加
    --container-runtime-endpoint=unix:///var/run/containerd/containerd.sock		# 添加
    Restart=always
    StartLimitInterval=0
    RestartSec=10
    
    [Install]
    WantedBy=multi-user.target
  • 设置开机自启

    1
    
    systemctl enable kubelet

初始化 k8s(master节点执行)

  • 生成默认文件

    1
    
    kubeadm config print init-defaults > kubeadm-config.yaml
  • 修改配置文件

    vim kubeadm-config.yml

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    
    apiVersion: kubeadm.k8s.io/v1beta3
    bootstrapTokens:
    - groups:
      - system:bootstrappers:kubeadm:default-node-token
      token: abcdef.0123456789abcdef
      ttl: 24h0m0s
      usages:
      - signing
      - authentication
    kind: InitConfiguration
    localAPIEndpoint:
      advertiseAddress: 192.168.200.125			# 修改成 master 节点的 IP 地址
      bindPort: 6443
    nodeRegistration:
      criSocket: unix:///var/run/containerd/containerd.sock
      imagePullPolicy: IfNotPresent
      name: master			# 修改成 master 节点主机名
      taints: null
    ---
    apiServer:
      timeoutForControlPlane: 4m0s
    apiVersion: kubeadm.k8s.io/v1beta3
    certificatesDir: /etc/kubernetes/pki
    clusterName: kubernetes
    controllerManager: {}
    dns: {}
    etcd:
      local:
        dataDir: /var/lib/etcd
    imageRepository: registry.aliyuncs.com/google_containers	# 修改成阿里云源
    kind: ClusterConfiguration
    kubernetesVersion: 1.28.2		# kubernetes 版本号
    networking:
      dnsDomain: cluster.local
      serviceSubnet: 10.96.0.0/12
      podSubnet: 10.244.0.0/16			# pod 网络地址
    scheduler: {}
  • 拉取镜像(所有节点执行)

    1
    
    kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers --kubernetes-version=v1.28.2
  • 查看镜像(node节点也要执行)

    当执行crictl images时,出现如下错误,说明 crictl 工具默认连接的是 dockershim 的 socket,但系统中并没有这个 socket

    image-20250409112445180

    解决办法:

    vim /etc/crictl.yaml

    1
    2
    3
    4
    
    runtime-endpoint: unix:///var/run/containerd/containerd.sock
    image-endpoint: unix:///var/run/containerd/containerd.sock
    timeout: 10
    debug: false

    再次执行crictl images时,就不在出现这个报错了

  • 初始化 master 节点

    1
    
    kubeadm init --config=kubeadm-config.yaml
  • 安装完成后执行命令

    1
    2
    3
    
    mkdir -p $HOME/.kube
    cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    chown $(id -u):$(id -g) $HOME/.kube/config
  • 安装 flannel 网络插件(所有节点执行)

    1
    
    kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

    可以查看该文件,提前下载好镜像ctr images pull ghcr.io/flannel-io/flannel:v0.27.0ctr images pull ghcr.io/flannel-io/flannel-cni-plugin:v1.7.1-flannel1,执行ctr --namespace default images import flannel.tarctr --namespace default images import flannel-cni-plugin.tar命令开始导入镜像

    执行ctr --namespace k8s.io images ls查看镜像

添加 node 节点

https://www.yangxingzhen.com/9805.html

如果忘记 token,可以执行kubeadm token create --print-join-command 重新获取,复制输出的内容在 node 节点上执行

在 master 节点查看集群状态:kubectl get nodes

在 master 节点查看 pod 状态:kubectl get pods -A

删除 node 节点

1
kubectl delete nodes node-01

然后清空 node 节点中的集群信息

1
kubeadm reset

ctr 和 crictl 介绍

ctr 是 containerd 自带工具,是 containerd 的 CLI 工具,相当于 containerd 的控制台,可以使用它来管理 containerd 中的镜像、容器、任务等

crictl 是 kubernetes 通用调试工具,用于连接 CRI 接口。

  • 导出镜像

    1
    
    ctr images export xxx.tar 镜像名
  • 导入镜像

    1
    
    ctr images import xxx.tar
  • 查看镜像

    1
    
    crictl images