Containerd方式部署K8s集群

1.1 集群创建说明

Kubernetes支持多种容器运行时,包括Containerd、Docker和CRI-O。以下是这三种方式的详细说明:

  • Containerd:Containerd是Kubernetes默认使用的容器运行时。它是一个轻量级的容器运行时,专为Kubernetes设计,提供了高效、稳定的容器管理能力。Containerd直接与Kubernetes集群交互,无需额外的桥接层,这使得它在性能和兼容性上都表现出色。

  • Docker:尽管Kubernetes默认情况下已经废弃了对Docker的直接支持,但是通过使用Mirantis维护的cri-dockerd插件,仍然可以实现Kubernetes集群的创建。Docker作为一个全面的容器平台,提供了丰富的功能和强大的社区支持。但是,由于Kubernetes对Docker的直接支持已经停止,因此在使用Docker时可能需要对Kubelet的启动参数进行一些调整,以确保其与Docker容器运行时正确交互。

  • CRI-O:CRI-O是一个专为Kubernetes设计的轻量级容器运行时,它直接实现了Kubernetes的容器运行时接口(CRI)。使用CRI-O创建Kubernetes集群需要安装CRI-O插件,并对Kubelet的启动参数进行配置,以指定CRI-O作为容器运行时。CRI-O专为Kubernetes优化,提供了简单、高效的容器管理功能,是一个很好的选择,特别是对于希望最大化Kubernetes集群性能和资源利用率的用户

注意:

Kubernetes 1.24版本引入了许多新特性和改进,以下是一些重要的更新:

  • 从kubelet中移除dockershim:自1.20版本被弃用之后,dockershim组件终于在1.24的kubelet中被删除。这是确保Kubernetes项目未来发展的必要步骤。从1.24开始,用户需要使用其他受支持的运行时选项,例如containerd或CRI-O。如果选择Docker Engine作为运行时,则需要使用cri-dockerd插件。

  • 关闭测试版API:Kubernetes 1.24版本将一些beta版API标记为废弃,转而使用稳定版API。这是为了确保API的稳定性和向后兼容性。

  • 对发布工件进行签名:为了提高安全性,Kubernetes 1.24版本引入了对发布工件的签名验证。这意味着用户可以验证下载的Kubernetes二进制文件的完整性和来源。

  • OpenAPIv3:Kubernetes 1.24版本引入了对OpenAPIv3的支持,这是一个更现代的API描述规范,提供了更丰富的元数据和更好的API文档生成能力。

  • 正式发布存储容量和卷扩展:Kubernetes 1.24版本正式发布了存储容量和卷扩展的功能,这使得用户可以更灵活地管理存储资源,并支持动态扩展存储卷。

  • NonPreemptingPriority稳定版发布:Kubernetes 1.24版本将NonPreemptingPriority策略升级为稳定版,这使得用户可以在Pod调度时使用更多的优先级控制选项。

  • 存储插件迁移:Kubernetes 1.24版本进一步支持存储插件的迁移,提供了更多的选项和工具来帮助用户迁移到新的存储解决方案。

  • gRPC探针升级为Beta版:Kubernetes 1.24版本将gRPC探针升级为Beta版,这使得用户可以利用gRPC探针进行更高效的健康检查和故障排查。

  • Kubelet证书提供程序升级至beta版:Kubernetes 1.24版本升级了Kubelet证书提供程序到Beta版,这提供了更灵活的证书管理选项,包括自动轮换和更细粒度的权限控制。

  • 上下文日志记录进入alpha阶段:Kubernetes 1.24版本引入了上下文日志记录的alpha阶段,这为用户提供了更多的日志记录选项和灵活性。

  • 避免在向服务分配IP时发生冲突:Kubernetes 1.24版本引入了避免在向服务分配IP时发生冲突的功能,这提高了服务的可用性和稳定性。

1.2 环境规划

kubernetes集群大体上分为两类:一主多从多主多从

  • 一主多从:一台Master节点和多台Node节点,搭建简单,但是有单机故障风险,适合用于测试环境

  • 多主多从:多台Master节点和多台Node节点,搭建麻烦,安全性高,适合用于生产环境

受资源限制,本次环境一主两从

1.3 Kubernetes基础环境部署

kubernetes有多种部署方式,目前主流的方式有kubeadm、minikube、二进制包

  • minikube:一个用于快速搭建单节点kubernetes的工具

  • kubeadm:一个用于快速搭建kubernetes集群的工具

  • 二进制包 :从官网下载每个组件的二进制包,依次去安装,此方式对于理解kubernetes组件更加有效

  • K8s-all:主机名为三台都做

主机名 IP地址 系统 配置
k8s-master-01 192.168.110.21/24 CentOS 7.9 4颗CPU 8G内存 100G硬盘
K8s-node-01 192.168.110.22/24 CentOS 7.9 4颗CPU 8G内存 100G硬盘
K8s-node-02 192.168.110.23/24 CentOS 7.9 4颗CPU 8G内存 100G硬盘

**注意:**关闭防火墙和SElinux

1.1.1 配置hosts解析和免密钥

复制代码
[root@K8s-master-01 ~]# cat >> /etc/hosts << EOF
192.168.110.21 k8s-master-01
192.168.110.22 K8s-node-01
192.168.110.23 K8s-node-02
EOF
[root@K8s-master-01 ~]# scp /etc/hosts K8s-node-01:/etc/
[root@K8s-master-01 ~]# scp /etc/hosts K8s-node-02:/etc/
​
# master节点可以免密钥访问其他节点
[root@k8s-master-01 ~]# ssh-keygen -f ~/.ssh/id_rsa -N '' -q
[root@k8s-master-01 ~]# ssh-copy-id k8s-node-01
[root@k8s-master-01 ~]# ssh-copy-id k8s-node-02

1.1.2 配置NTP时间服务

复制代码
[root@K8s-master-01 ~]# sed -i '3,6 s/^/# /' /etc/chrony.conf
[root@K8s-master-01 ~]# sed -i '6 a server ntp.aliyun.com iburst' /etc/chrony.conf
[root@K8s-master-01 ~]# systemctl restart chronyd.service
[root@K8s-master-01 ~]# chronyc sources
210 Number of sources = 1
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^* 201.107.6.88                  2   6    17    18   +266us[+1386us] +/-   24ms

[root@K8s-node-01 ~]# sed -i '3,6 s/^/# /' /etc/chrony.conf
[root@K8s-node-01 ~]# sed -i '6 a server ntp.aliyun.com iburst' /etc/chrony.conf
[root@K8s-node-01 ~]# systemctl restart chronyd.service
[root@K8s-node-01 ~]# chronyc sources
210 Number of sources = 1
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^* 201.107.6.88                  2   6    17    18   +266us[+1386us] +/-   24ms

[root@K8s-node-02 ~]# sed -i '3,6 s/^/# /' /etc/chrony.conf
[root@K8s-node-02 ~]# sed -i '6 a server ntp.aliyun.com iburst' /etc/chrony.conf
[root@K8s-node-02 ~]# systemctl restart chronyd.service
[root@K8s-node-02 ~]# chronyc sources
210 Number of sources = 1
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^* 201.107.6.88                  2   6     7     1   -291us[-4455us] +/-   30ms

1.1.3 禁用Swap交换分区

由于容器设计为尽可能高效地使用资源,Kubernetes通常要求在节点上禁用swap分区,原因包括:

  • 性能问题 :如前所述,使用swap会降低系统性能,这可能会影响容器的性能和稳定性。

  • 资源隔离 :禁用swap可以确保容器之间的资源隔离更加清晰,避免一个容器使用过多swap空间而影响其他容器。

  • 调试和监控 :禁用swap可以简化系统监控和调试,因为不需要考虑磁盘空间作为内存使用的复杂性。

复制代码
[root@K8s-master-01 ~]# sed -i 's/.*swap.*/# &/' /etc/fstab
[root@K8s-node-01 ~]# sed -i 's/.*swap.*/# &/' /etc/fstab
[root@K8s-node-02 ~]# sed -i 's/.*swap.*/# &/' /etc/fstab

1.1.4 升级操作系统内核

**注意:**三台机器同时做

复制代码
[root@k8s-all ~]# wget -c http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-ml-6.0.3-1.el7.elrepo.x86_64.rpm
[root@k8s-all ~]# wget -c http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-ml-devel-6.0.3-1.el7.elrepo.x86_64.rpm
  • 安装并设置启动顺序
复制代码
[root@k8s-all ~]# rpm -ivh kernel-ml-6.0.3-1.el7.elrepo.x86_64.rpm
[root@k8s-all ~]# rpm -ivh kernel-ml-devel-6.0.3-1.el7.elrepo.x86_64.rpm
[root@k8s-all ~]# awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg
CentOS Linux (6.0.3-1.el7.elrepo.x86_64) 7 (Core)
CentOS Linux (1.10.0-1160.119.1.el7.x86_64) 7 (Core)
CentOS Linux (1.10.0-1160.71.1.el7.x86_64) 7 (Core)
CentOS Linux (0-rescue-35f6b014eff0419881bbf71f1d9d4943) 7 (Core)
[root@k8s-all ~]# grub2-set-default 0
  • 重启生效
复制代码
[root@k8s-all ~]# reboot
[root@k8s-all ~]# uname -r
6.0.3-1.el7.elrepo.x86_64

1.1.5 开启内核路由转发

复制代码
[root@K8s-all ~]# sysctl -w net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1
[root@K8s-all ~]# modprobe br_netfilter
[root@k8s-all ~]# echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf 
[root@k8s-all ~]# sysctl -p
net.ipv4.ip_forward = 1

1.1.6 添加网桥过滤及内核转发配置文件

复制代码
[root@K8s-all ~]# cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
vm.swappiness = 0
EOF
[root@K8s-all ~]# modprobe br-netfilter
[root@K8s-all ~]# sysctl -p /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
vm.swappiness = 0

1.1.7 开启IPVS

复制代码
[root@K8s-all ~]# yum install ipset ipvsadm -y
[root@K8s-all ~]# cat >> /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash

ipvs_modules="ip_vs ip_vs_lc ip_vs_wlc ip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_lblcr ip_vs_dh ip_vs_vip ip_vs_sed ip_vs_ftp nf_conntrack"

for kernel_module in $ipvs_modules; 
do
        /sbin/modinfo -F filename $kernel_module >/dev/null 2>&1
        if [ $? -eq 0 ]; then
                /sbin/modprobe $kernel_module
        fi
done

chmod 755 /etc/sysconfig/modules/ipvs.modules
EOF

[root@K8s-all ~]# bash /etc/sysconfig/modules/ipvs.modules

1.1.8 配置国内镜像源

复制代码
[root@K8s-all ~]# cat >> /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

1.1.9 安装软件包

复制代码
[root@K8s-all ~]# yum install kubeadm kubelet kubectl -y
[root@k8s-all ~]# kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"28", GitVersion:"v1.28.2", GitCommit:"89a4ea3e1e4ddd7f7572286090359983e0387b2f", GitTreeState:"clean", BuildDate:"2023-09-13T09:34:32Z", GoVersion:"go1.20.8", Compiler:"gc", Platform:"linux/amd64"}

#为了实现docker使用的cgroupdriver与kubelet使用的cgroup的一致性,修改如下文件内容
[root@K8s-all ~]# cat <<EOF > /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"
EOF

[root@K8s-all ~]# systemctl enable kubelet.service --now

1.1.10 kubectl命令自动补全

复制代码
[root@K8s-all ~]# yum install -y bash-completion
[root@K8s-all ~]# source /usr/share/bash-completion/bash_completion
[root@K8s-all ~]# source <(kubectl completion bash)
[root@K8s-all ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc
  • 做完基础环境,创建快照,后续会分别使用四种不同方式创建集群。

1.4 Containerd方式部署K8s集群

注意 :基于1.3 Kubernetes基础环境部署

1.4.1 Containerd安装部署

1.4.1.1 安装基本工具
复制代码
[root@K8s-all ~]# yum install yum-utils device-mapper-persistent-data lvm2 -y
1.4.1.2 下载Docker-ce的源
复制代码
[root@K8s-all ~]# wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.huaweicloud.com/docker-ce/linux/centos/docker-ce.repo
1.4.1.3 替换仓库源
复制代码
[root@K8s-all ~]# sed -i 's+download.docker.com+mirrors.huaweicloud.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo 
[root@K8s-all ~]# sed -i 's/$releasever/7Server/g' /etc/yum.repos.d/docker-ce.repo
1.4.1.4 安装Containerd
复制代码
[root@K8s-all ~]# yum install containerd -y
1.4.1.5 初始化默认配置
复制代码
[root@K8s-all ~]# containerd config default | tee /etc/containerd/config.toml
[root@K8s-all ~]# sed -i "s#SystemdCgroup\ \=\ false#SystemdCgroup\ \=\ true#g" /etc/containerd/config.toml
[root@K8s-all ~]# sed -i "s#registry.k8s.io#registry.aliyuncs.com/google_containers#g" /etc/containerd/config.toml

#配置crictl
[root@K8s-all ~]# cat <<EOF | tee /etc/crictl.yaml
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF
[root@K8s-all ~]# systemctl daemon-reload
[root@K8s-all ~]# systemctl restart containerd
[root@K8s-all ~]# systemctl enable containerd
1.4.1.6 测试
复制代码
[root@K8s-node-02 ~]# crictl pull nginx:alpine
Image is up to date for sha256:f4215f6ee683f29c0a4611b02d1adc3b7d986a96ab894eb5f7b9437c862c9499
[root@K8s-node-02 ~]# crictl images
IMAGE                     TAG                 IMAGE ID            SIZE
docker.io/library/nginx   alpine              f4215f6ee683f       20.5MB
[root@K8s-node-02 ~]# crictl rmi nginx:alpine
Deleted: docker.io/library/nginx:alpine

1.4.2 初始化Master节点

复制代码
[root@K8s-master-01 ~]# kubeadm init --apiserver-advertise-address=192.168.110.21 --apiserver-bind-port=6443 --cri-socket="unix:///var/run/containerd/containerd.sock" --image-repository registry.aliyuncs.com/google_containers --kubernetes-version=1.24.2 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12
重要输出结果
Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.110.21:6443 --token 5vvo64.efx6hh9fgs241rpd \
        --discovery-token-ca-cert-hash sha256:c45394687f8bfe23150c1eede9768af735c1dd4bced577c1408f8845ace89569 
参数 作用 缺省配置 供的配置
--apiserver-advertise-address API 服务器绑定的 IP 地址,用于集群内节点通信。 Master 主机 IP 192.168.110.21
--apiserver-bind-port API 服务器监听的端口。 6443 6443
--cri-socket 指定容器运行时接口(CRI)的 socket 文件路径。 unix:///var/run/containerd/containerd.sock
--control-plane-endpoint 控制面地址,通常为 master 的 VIP 和端口。 master_vip:6440 (未提供,通常不需要手动指定,除非使用高可用配置)
--image-repository 选择拉取镜像的仓库。 k8s.gcr.io registry.aliyuncs.com/google_containers
--kubernetes-version 选择要安装的 Kubernetes 版本。 stable-1 1.24.2
--pod-network-cidr 指定 Pod 网络的 CIDR,用于集群内 Pod 通信。 10.244.0.0/16 10.244.0.0/16
--service-cidr 指定 Kubernetes 服务的 IP 范围,用于服务发现。 10.96.0.0/12 10.96.0.0/12
  • 加入指令可以通过如下命令重复获取
复制代码
[root@K8s-master-01 ~]# kubeadm token create --print-join-command
kubeadm join 192.168.110.21:6443 --token ew9q7c.i86isio9knu36hm5 --discovery-token-ca-cert-hash sha256:c45394687f8bfe23150c1eede9768af735c1dd4bced577c1408f8845ace89569 
  • 初始化失败可以用 reset 指令重置,解决问题后重新初始化
复制代码
[root@K8s-master-01 ~]# kubeadm reset
  • token 失效处理
复制代码
1、重新生成 token:
使用 kubeadm token create 命令可以创建一个新的 token,用于加入集群。这个命令会输出一个 token,格式通常是 abcdef.0123456789abcdef。

[root@K8s-master-01 ~]# kubeadm token create
abcdef.0123456789abcdef

2、获取 ca 证书 sha256 编码 hash 值:
要将节点加入集群,需要提供集群的 CA 证书的 SHA256 哈希值。这可以通过以下命令获得:

[root@K8s-master-01 ~]# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
b615fccddcd4e80fc6f9c5e477bfc7a053b017660b73fdeccf89c559739664d7
这条命令的作用是:

- 使用 openssl x509 提取 CA 证书的公钥部分。
- 通过 openssl rsa 将公钥从 PEM 格式转换为 DER 格式。
- 使用 openssl dgst 计算 DER 格式公钥的 SHA256 哈希值。
- 使用 sed 命令去除哈希值前面的任何文本,只保留哈希值本身。
- 将新的 node 节点加入到 k8s 集群中:

3、使用 kubeadm join 命令将节点加入到集群。您需要提供主节点的 IP 地址和端口(默认为 6443),加入 token,以及 CA 证书的哈希值。

$ kubeadm join 主机IP地址:6443 --token abcdef.0123456789abcdef \
  --discovery-token-ca-cert-hash sha256:b615fccddcd4e80fc6f9c5e477bfc7a053b017660b73fdeccf89c559739664d7
请注意,命令中的 主机IP地址 应该替换为您的 Kubernetes 主节点的实际 IP 地址。同时,CA 证书哈希值应该是完整的哈希值,您提供的哈希值在中间被截断了,实际使用时应确保它是完整的。

1.4.3 添加Worker节点

1.4.1.1 Master执行

**注意:**这些都是初始化生成的内容,直接粘贴就好

复制代码
[root@K8s-master-01 ~]# mkdir -p $HOME/.kube
[root@K8s-master-01 ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@K8s-master-01 ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
[root@K8s-master-01 ~]# export KUBECONFIG=/etc/kubernetes/admin.conf
1.4.1.2 Node执行
复制代码
[root@K8s-node-01 ~]# kubeadm join 192.168.110.21:6443 --token 5vvo64.efx6hh9fgs241rpd \
--discovery-token-ca-cert-hash sha256:c45394687f8bfe23150c1eede9768af735c1dd4bced577c1408f8845ace89569 

[root@K8s-node-02 ~]# kubeadm join 192.168.110.21:6443 --token 5vvo64.efx6hh9fgs241rpd \
--discovery-token-ca-cert-hash sha256:c45394687f8bfe23150c1eede9768af735c1dd4bced577c1408f8845ace89569 

1.4.4 查看集群

复制代码
[root@K8s-master-01 ~]# kubectl get nodes  #状态为Ready
NAME             STATUS     ROLES           AGE   VERSION
k8s-master-01    NoReady    control-plane   12m   v1.28.2
k8s-node-01      NoReady    <none>          11m   v1.28.2
k8s-node-02      NoReady    <none>          11m   v1.28.2

1.4.5 安装网络插件

复制代码
[root@k8s-all ~]# crictl pull docker.io/calico/cni:v1.25.0
[root@k8s-all ~]# crictl pull docker.io/calico/node:v1.25.0
[root@k8s-all ~]# crictl pull docker.io/calico/kube-controllers:v1.25.0
[root@k8s-master-01 ~]# wget -c https://gitee.com/kong-xiangyuxcz/svn/releases/download/V1.25.0/calico.yaml

[root@k8s-master-01 ~]# kubectl apply -f calico.yaml 

1.4.6 检查

复制代码
[[root@K8s-master-01 ~]# kubectl get nodes  #状态为Ready
NAME             STATUS   ROLES           AGE   VERSION
k8s-master-01    Ready    control-plane   12m   v1.28.2
k8s-node-01      Ready    <none>          11m   v1.28.2
k8s-node-02      Ready    <none>          11m   v1.28.2

[root@K8s-master-01 ~]# kubectl get pods -n kube-system   #网络正常,如果没用全部Running就稍等片刻
NAME                                       READY   STATUS    RESTARTS   AGE
calico-kube-controllers-658d97c59c-qcht6   1/1     Running   0          10m
calico-node-gqx2x                          1/1     Running   0          10m
calico-node-rj64n                          1/1     Running   0          10m
calico-node-xkphs                          1/1     Running   0          10m
coredns-66f779496c-rvgqq                   1/1     Running   0          13m
coredns-66f779496c-vvxxk                   1/1     Running   0          13m
etcd-k8s-master-01                         1/1     Running   0          13m
kube-apiserver-k8s-master-01               1/1     Running   0          13m
kube-controller-manager-k8s-master-01      1/1     Running   0          13m
kube-proxy-dw4tq                           1/1     Running   0          11m
kube-proxy-n6x4f                           1/1     Running   0          11m
kube-proxy-pc8tq                           1/1     Running   0          13m
kube-scheduler-k8s-master-01               1/1     Running   0          13m

1.5 Docker方式部署K8s集群

注意 :基于1.3 Kubernetes基础环境部署

1.5.1 Docker安装部署

1.5.1.1 安装镜像源
复制代码
[root@K8s-all ~]# wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.huaweicloud.com/docker-ce/linux/centos/docker-ce.repo
[root@K8s-all ~]# sed -i 's+download.docker.com+mirrors.huaweicloud.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
[root@K8s-all ~]# sed -i 's/$releasever/7Server/g' /etc/yum.repos.d/docker-ce.repo
1.5.1.2 安装Docker-ce
复制代码
[root@K8s-all ~]# yum install docker-ce -y
1.5.1.3 配置镜像加速器
复制代码
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://lfhqfxbn.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

[root@K8s-all ~]# docker --version
Docker version 20.10.21, build baeda1f

1.5.2 安装cri-dockererd插件

注意:K8s从1.24版本后不支持docker了所以这里需要用cri-dockererd

下载地址:https://github.com/Mirantis/cri-dockerd/releases/download/

复制代码
[root@K8s-all ~]# wget -c https://github.com/Mirantis/cri-dockerd/releases/download/v0.1.13/cri-dockerd-0.1.13-1.el7.x86_64.rpm
[root@K8s-all ~]# yum install cri-dockerd-0.1.13-1.el7.x86_64.rpm -y
[root@K8s-all ~]# sed -i 's#^ExecStart=.*#ExecStart=/usr/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:1.9#' /usr/lib/systemd/system/cri-docker.service
[root@K8s-all ~]# systemctl daemon-reload
[root@K8s-all ~]# systemctl restart docker
[root@K8s-all ~]# systemctl enable --now cri-docker.service

1.5.3 初始化Master节点

复制代码
[root@K8s-master-01 ~]# kubeadm init --kubernetes-version=v1.28.2 --pod-network-cidr=10.224.0.0/16 --apiserver-advertise-address=192.168.110.21 --apiserver-bind-port=6443 --cri-socket unix:///var/run/cri-dockerd.sock --image-repository registry.aliyuncs.com/google_containers

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.110.21:6443 --token p6zmgi.oepmiwbmg61704br \
        --discovery-token-ca-cert-hash sha256:4688b4812501fe5b1e7d545ba2d7f4f077cf22ef9a139bf9e7229f2109354898
        
[root@K8s-master-01 ~]# mkdir -p $HOME/.kube
[root@K8s-master-01 ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@K8s-master-01 ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
[root@K8s-master-01 ~]# export KUBECONFIG=/etc/kubernetes/admin.conf

1.5.4 添加Worker节点

**注意:**加入集群时需要添加 --cri-socket unix:///var/run/cri-dockerd.sock

复制代码
[root@K8s-node-01 ~]# kubeadm join 192.168.110.21:6443 --token p6zmgi.oepmiwbmg61704br \
--discovery-token-ca-cert-hash sha256:4688b4812501fe5b1e7d545ba2d7f4f077cf22ef9a139bf9e7229f2109354898 \
--cri-socket unix:///var/run/cri-dockerd.sock

[root@K8s-node-02 ~]# kubeadm join 192.168.110.21:6443 --token p6zmgi.oepmiwbmg61704br \
--discovery-token-ca-cert-hash sha256:4688b4812501fe5b1e7d545ba2d7f4f077cf22ef9a139bf9e7229f2109354898 \
--cri-socket unix:///var/run/cri-dockerd.sock

1.5.5 查看集群

复制代码
[root@K8s-master-01 ~]# kubectl get nodes
NAME             STATUS     ROLES           AGE    VERSION
k8s-master-01    NotReady   control-plane   6m1s   v1.28.2
k8s-node-01      NotReady   <none>          91s    v1.28.2
k8s-node-02      NotReady   <none>          104s   v1.28.2

1.5.6 安装网络插件

复制代码
[root@k8s-all ~]# docker pull docker.io/calico/cni:v1.25.0
[root@k8s-all ~]# docker pull docker.io/calico/node:v1.25.0
[root@k8s-all ~]# docker pull docker.io/calico/kube-controllers:v1.25.0

[root@k8s-master-01 ~]# wget -c https://gitee.com/kong-xiangyuxcz/svn/releases/download/V1.25.0/calico.yaml

[root@k8s-master-01 ~]# kubectl apply -f calico.yaml

1.5.7 检查

复制代码
[root@K8s-master-01 ~]# kubectl get nodes  #状态为Ready
NAME             STATUS   ROLES           AGE   VERSION
k8s-master-01    Ready    control-plane   12m   v1.28.2
k8s-node-01      Ready    <none>          11m   v1.28.2
k8s-node-02      Ready    <none>          11m   v1.28.2

[root@K8s-master-01 ~]# kubectl get pods -n kube-system   #网络正常,如果没用全部Running就稍等片刻
NAME                                       READY   STATUS    RESTARTS   AGE
calico-kube-controllers-658d97c59c-qcht6   1/1     Running   0          10m
calico-node-gqx2x                          1/1     Running   0          10m
calico-node-rj64n                          1/1     Running   0          10m
calico-node-xkphs                          1/1     Running   0          10m
coredns-66f779496c-rvgqq                   1/1     Running   0          13m
coredns-66f779496c-vvxxk                   1/1     Running   0          13m
etcd-k8s-master-01                         1/1     Running   0          13m
kube-apiserver-k8s-master-01               1/1     Running   0          13m
kube-controller-manager-k8s-master-01      1/1     Running   0          13m
kube-proxy-dw4tq                           1/1     Running   0          11m
kube-proxy-n6x4f                           1/1     Running   0          11m
kube-proxy-pc8tq                           1/1     Running   0          13m
kube-scheduler-k8s-master-01               1/1     Running   0          13m

1.6 Cri-O方式部署K8s集群

注意:基于Kubernetes基础环境

1.6.1 所有节点安装配置cri-o

复制代码
[root@k8s-all ~]# VERSION=1.28
[root@k8s-all ~]# curl -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable.repo https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/CentOS_7/devel:kubic:libcontainers:stable.repo
[root@k8s-all ~]# curl -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable:cri-o:${VERSION}.repo https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable:cri-o:${VERSION}/CentOS_7/devel:kubic:libcontainers:stable:cri-o:${VERSION}.repo
[root@k8s-all ~]# yum install cri-o -y
[root@k8s-all ~]# vim /etc/crio/crio.conf 
509 pause_image = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:1.9"

548  insecure_registries = [
549         "docker.mirrors.ustc.edu.cn","dockerhub.azk8s.cn","hub-mirror.c.161.com"
550  ]

[root@k8s-all ~]# systemctl daemon-reload 
[root@k8s-all ~]# systemctl enable --now crio
  • 修改/etc/sysconfig/kubelet
复制代码
[root@k8s-all ~]# vim /etc/sysconfig/kubelet 
KUBELET_EXTRA_ARGS="--container-runtime=remote --cgroup-driver=systemd --
container-runtime-endpoint='unix:///var/run/crio/crio.sock' --runtime-req
uest-timeout=5m"

[root@k8s-all ~]# systemctl daemon-reload 
[root@k8s-all ~]# systemctl restart kubelet.service

1.6.2 集群初始化

复制代码
[root@k8s-master-01 ~]# kubeadm init --kubernetes-version=v1.28.2 --pod-network-cidr=10.224.0.0/16 \
--apiserver-advertise-address=192.168.110.21 \
--service-cidr=10.96.0.0/12 \
--cri-socket unix:///var/run/crio/crio.sock \
--image-repository registry.aliyuncs.com/google_containers

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.110.21:6443 --token tct0yt.1bf5docmg9loxj8m \
        --discovery-token-ca-cert-hash sha256:b504dc351e052f7ebe92162c0989088b09c2243467ee510d172187e87caf9b74

[root@k8s-master-01 ~]# mkdir -p $HOME/.kube
[root@k8s-master-01 ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@k8s-master-01 ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config

1.6.3 Work结点加入集群

复制代码
[root@k8s-node-01 ~]# kubeadm join 192.168.110.21:6443 --token tct0yt.1bf5docmg9loxj8m \
--discovery-token-ca-cert-hash sha256:b504dc351e052f7ebe92162c0989088b09c2243467ee510d172187e87caf9b74

[root@k8s-node-02 ~]# kubeadm join 192.168.110.21:6443 --token tct0yt.1bf5docmg9loxj8m \
--discovery-token-ca-cert-hash sha256:b504dc351e052f7ebe92162c0989088b09c2243467ee510d172187e87caf9b74

1.6.4 安装网络插件

复制代码
[root@k8s-master-01 ~]# wget -c https://docs.projectcalico.org/v1.25/manifests/calico.yaml
- name: CALICO_IPV4POOL_CIDR
  value: "10.244.0.0/16"

- name: CLUSTER_TYPE
  value: "k8s,bgp"   
# 下方为新增
- name: IP_AUTODETECTION_METHOD
  value: "interface=ens33"
  
[root@k8s-all ~]# crictl pull docker.io/calico/cni:v1.25.0
[root@k8s-all ~]# crictl pull docker.io/calico/node:v1.25.0
[root@k8s-all ~]# crictl pull docker.io/calico/kube-controllers:v1.25.0

[root@k8s-master-01 ~]# kubectl apply -f calico.yaml

1.6.5 检测

复制代码
[root@k8s-master-01 ~]# kubectl get pod -n kube-system
NAME                                       READY   STATUS              RESTARTS   AGE
calico-kube-controllers-658d97c59c-q6b5z   1/1     Running             0          33s
calico-node-88hrv                          1/1     Running             0          33s
calico-node-ph7sw                          1/1     Running             0          33s
calico-node-ws2h5                          1/1     Running             0          33s
coredns-66f779496c-gt4zg                   1/1     Running             0          22m
coredns-66f779496c-jsqcw                   1/1     Running             0          22m
etcd-k8s-master-01                         1/1     Running             0          22m
kube-apiserver-k8s-master-01               1/1     Running             0          22m
kube-controller-manager-k8s-master-01      1/1     Running             0          22m
kube-proxy-5v4sr                           1/1     Running             0          19m
kube-proxy-b8xvq                           1/1     Running             0          22m
kube-proxy-vl5k2                           1/1     Running             0          19m
kube-scheduler-k8s-master-01               1/1     Running             0          22m
相关推荐
KingRumn3 小时前
Linux信号之标准信号与实时信号
linux·算法
weixin_46686 小时前
K8S-特殊容器
云原生·容器·kubernetes
QT 小鲜肉6 小时前
【Linux命令大全】001.文件管理之git命令(实操篇)
linux·服务器·笔记·git·elasticsearch
半夏知半秋6 小时前
docker常用指令整理
运维·笔记·后端·学习·docker·容器
sishen41996 小时前
嵌入式Linux没有学习方向怎么办,嵌入式Linux怎么学
linux
逆风水手6 小时前
Ansible自动化运维入门指南
linux·运维·自动化·ansible
旖旎夜光8 小时前
Linux(3)(下)
linux·学习
没有bug.的程序员8 小时前
Nacos vs Eureka 服务发现深度对比
jvm·微服务·云原生·容器·eureka·服务发现
小鹿学程序8 小时前
任务一-1.子任务一:基础环境准备
linux·bigdata
Nautiluss8 小时前
一起玩XVF3800麦克风阵列(十)
linux·人工智能·python·音频·语音识别·实时音视频·dsp开发