您当前的位置:首页 > 计算机 > 服务器 > 网络服务

[kubeadm]v1.24之前的kubernetes集群搭建——使用contianerd作为容器运行时(后附一键安装脚本)

时间:04-15来源:作者:点击数:

说明

Kubernetes 1.24之前的版本一直将Docker作为默认容器运行时(runtime),因此在使用containerd作为容器运行时需要修改containerd的配置文件,向系统说明K8S的容器运行时是containerd而不是Docker。

使用Kubernetes/Docker集群搭建的传送门:[kubeadm] v1.24之前的Kubernetes集群搭建——使用Docker作为容器运行时(后附一键安装脚本)

1. 拓扑设计

1.1 IP地址及版本规划

节点名
Node
角色
Role
操作系统
OS
容器运行时
Container Runtime
IP地址
IP Address
版本
Version
k8s-01 master Ubuntu 20.04.2 LTS containerd 1.6.8 10.117.136.187 v1.22.1
k8s-02 worker Ubuntu 20.04.2 LTS containerd 1.6.8 10.117.136.184 v1.22.1

1.2 集群网络规划

  • Pod网络IP网段为 10.244.0.0/16

2. 部署说明

  • 为了避免权限问题,测试环境建议使用root用户安装。
  • 以下所有软件包均在阿里云开源镜像库中获取。
  • Kubernetes网络插件采用calico,calico支持网络策略。
  • 本教程使用kubeadm工具部署K8S集群。
  • 容器运行时(runtime)使用containerd。

3. 安装K8S

3.1 系统环境设置

以下命令根据实际情况,分别在2台VM上执行。

(1)修改主机名
hostnamectl set-hostname k8s2-0x   #x为具体编号
(2)修改系统hosts文件

下面以k8s2-01为例

vim /etc/hosts

修改和增加内容如下所示:

127.0.1.1 k8s2-01
10.117.136.187 k8s2-1
10.117.136.184 k8s2-2

以下命令均在三台VM上无差别执行

(3)修改ubuntu源

cn.archive.ubuntu.com改为阿里云的源,然后更新系统源。

sed 's/cn.archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list
apt-get update
(4)放行端口流量

实验环境下可以直接关闭防火墙或放行所有流量

#关闭防火墙 / 允许所有流量经过
iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat
iptables -P FORWARD ACCEPT
# 或
firewall-cmd --set-default-zone=trusted

关于 Kubernetes 组件使用了哪些端口和协议详见:Kubernetes 端口和协议

(5)关闭 swap
sed -i '/swap/d' /etc/fstab   # 永久关闭swap
swapoff -a   #临时关闭swap
(6)禁用SELinux

此版本的Ubuntu 提供 AppArmor 作为 SELinux 的替代品。Kubernetes安全也需要用到AppArmor模块。

因此以下命令可执行也可不执行,建议执行,防止系统开启了SELinux。

# 将 SELinux 设置为 permissive 模式(相当于将其禁用)
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
# 安装setenforce,查看SELinux情况
apt-get install selinux-utils
setenforce 0
(7)转发 IPv4 并让 iptables 看到桥接流量
# 此处为了区分与默认容器运行时docker,将配置文件名改为containerd.conf
cat > /etc/modules-load.d/containerd.conf <<EOF
overlay
br_netfilter
EOF

# 显式加载模块
modprobe overlay
modprobe br_netfilter

# 设置所需的 sysctl 参数,参数在重新启动后保持不变
cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

# 应用 sysctl 参数而不重新启动
sysctl -p /etc/sysctl.d/k8s.conf

3.2 安装容器运行时 Contanierd

DEB 和 RPM 格式的 containerd.io 包由 Docker 发布(而不是由 containerd 项目),所以使用命令行安装需要配置Docker环境。

最初Docker的底层也是使用containerd作为容器运行时,而containerd也是由Docker公司发布的开源项目,Docker公司将containerd交给CNCF孵化。因此假如想使用apt命令安装,需要配置docker。但只需下载containerd相关软件包。

(1)更新 apt 及安装相关依赖
apt-get update
apt-get install \
        ca-certificates \
        curl \
        gnupg \
        lsb-release
(2)添加 Docker 的 gpg key
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
(3)添加 Docker 下载源
add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
(4)更新系统apt源
apt-get update
(5)安装最新稳定版本
apt-get install containerd.io -y
(6)设置 containerd 配置文件 【重点

关于containerd的配置文件及其语法会在之后博客中详细说明。

cat > /etc/containerd/config.toml <<EOF
disabled_plugins = ["restart"]
[plugins.linux]
  shim_debug = true
[plugins.cri.registry.mirrors."docker.io"]
  endpoint = ["https://docker.mirrors.ustc.edu.cn"]
[plugins.cri]
  sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.5"
EOF
(7)设置开机启动 Docker
systemctl enable --now containerd
systemctl restart containerd
(8) 安装 nerdctl

由于containerd自带的ctr仅用于调试,因此需要安装一个稳定且用户体验高的镜像与容器管理工具。而nerdctl是用于 containerd 的与 Docker 兼容的 CLI,几乎所有docker命令,在nerdctl上能完美复现。

wget https://github.com/containerd/nerdctl/releases/download/v0.23.0/nerdctl-0.23.0-linux-amd64.tar.gz
tar Cxzvvf /usr/local/bin nerdctl-0.23.0-linux-amd64.tar.gz

3.3 安装 Kubernetes

(1)更新 apt 包并安装相关依赖
apt-get update
apt-get install -y apt-transport-https ca-certificates curl
(2)下载 Kubernetes 公共签名 gpg 密钥
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add - 
(3)添加 Kubernetes 的 apt 源
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
(4)更新 apt 包并安装指定版本的kubelet,kubeadm和kubectl
apt-get update
sudo apt-get install  kubelet=1.22.1-00 kubeadm=1.22.1-00 kubectl=1.22.1-00
(5)设置开启启动 kubelet
systemctl start kubelet
sudo systemctl enable --now kubelet

4. 初始化集群

以下命令在master节点执行

4.1 初始化

K8S官方指定的镜像仓库为Google 开源镜像仓库,但在国内因一些原因无法正常访问,因此需要使用--image-repository参数指定阿里云开源仓库,此仓库会从Google 开源镜像仓库完全复制镜像。

kubeadm init  --kubernetes-version=v1.22.1 --pod-network-cidr=10.244.0.0/16 --image-repository registry.aliyuncs.com/google_containers

等待2-5min后,当初始化到最后时,系统会给出类似下面的提示(包括三行命令)

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 10.117.136.187:6443 --token ub5d4t.id7djbc88pf8vuxs \
        --discovery-token-ca-cert-hash sha256:5409f1ac44ff1b37b3828580398f3296b4939ea7a333fea658b9abd19cd67761

此时需要在master节点执行以下三行命令。

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

在终端输入这些命令的目的:创建 kubeconfig文件,并将其导入k8s默认的config读取目录中。

4.2 节点加入集群

在 k8s2-02 上执行

kubeadm join 10.117.136.187:6443 --token ub5d4t.id7djbc88pf8vuxs \
        --discovery-token-ca-cert-hash sha256:5409f1ac44ff1b37b3828580398f3296b4939ea7a333fea658b9abd19cd67761

等待一段时间后,标准输出会提示加入集群成功。

4.3 查看集群状态

完成上述步骤后,在 master 上检查集群节点情况

# kubectl get node
NAME     STATUS     ROLES                  AGE     VERSION
k8s2-1   NotReady   control-plane,master   6m35s   v1.22.1
k8s2-2   NotReady   <none>                 99s     v1.22.1

此时所有节点状态均为NotReady状态。因为节点间还无法正常通信,需要在节点间建立通信通道,例如安装calico或者flannel等

4.4 补充说明

(1)关于初始化后配置文件目录的补充

如果执行了export KUBECONFIG=/etc/kubernetes/admin.conf,那么K8S集群默认的配置文件目录不再是$HOME/.kube/config,而是/etc/kubernetes/admin.conf。那么之后我们配置多集群切换时,就需要注意修改config文件的路径。

(2)关于初始化3行命令的补充

假如没有执行初始化后的三行命令,那么在终端中输入:kubectl get nodes时系统会报错,错误提示如下所示:

# kubectl get nodes
The connection to the server localhost:8080 was refused - did you specify the right host or port?

如果出现上面的错误,原因是没有指定合适的kubeconfig文件。

(3)关于加入集群命令的补充

如果新的节点想要加入集群,需要重新让 kubeadm 打印新的加入集群命令,该命令会每隔一段时间(1天左右?)发生变化。

kubeadm token create --print-join-command

5. 安装集群网络通道calico

以下命令在master节点执行

5.1 下载calico.yaml

curl https://docs.projectcalico.org/manifests/calico.yaml -O

5.2 修改calico.yaml

这两条命令的意思是将# - name: CALICO_IPV4POOL_CIDR的注释取消。

# value: "192.168.0.0\/16的注释取消,并将192.168改为10.244.

sed -i 's/# - name: CALICO_IPV4POOL_CIDR/- name: CALICO_IPV4POOL_CIDR/' calico.yaml
sed -i 's/# value: "192.168.0.0\/16"/ value: "10.244.0.0\/16"/' calico.yaml

5.3 安装calico

kubectl apply -f calico.yaml

等待1-2分钟后,再次查看节点状态

# kubectl get node
NAME     STATUS   ROLES                  AGE     VERSION
k8s2-1   Ready    control-plane,master   11m     v1.22.1
k8s2-2   Ready    <none>                 6m48s   v1.22.1

此时一个完整的Kubernetes集群安装完成。

6. 一键安装脚本 v1

此脚本为 【3. 安装K8S】的脚本,其它步骤顺序执行即可。

#!/bin/bash
#
# 替换ubuntu国内源
sed 's/cn.archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list
#实验环境设置
#关闭防火墙/允许所有流量经过
#firewall-cmd --set-default-zone=trusted
iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat
iptables -P FORWARD ACCEPT

#关闭swap
sudo sed -i '/swap/d' /etc/fstab
sudo swapoff -a

# 将 SELinux 设置为 permissive 模式(相当于将其禁用)
#sudo apt-get install selinux-utils
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
# 查看SELinux情况
sudo apt-get install selinux-utils
sudo setenforce 0

#安装containerd
#更新apt及安装相关依赖
sudo apt-get update
sudo apt-get install \
            ca-certificates \
                curl \
                    gnupg \
                        lsb-release
#添加docker的gpg key
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

#添加docker下载源
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"

#更新apt
sudo apt-get update
#安装最新稳定版本的containerd
sudo apt-get install containerd.io

# 修改containerd 配置文件
cat > /etc/containerd/config.toml <<EOF
disabled_plugins = ["restart"]
[plugins.linux]
  shim_debug = true
[plugins.cri.registry.mirrors."docker.io"]
  endpoint = ["https://docker.mirrors.ustc.edu.cn"]
[plugins.cri]
  sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.5"
EOF

# 设置开机启动containerd
systemctl enable --now containerd
systemctl restart containerd

# 安装nerdctl
wget https://github.com/containerd/nerdctl/releases/download/v0.23.0/nerdctl-0.23.0-linux-amd64.tar.gz
tar Cxzvvf /usr/local/bin nerdctl-0.23.0-linux-amd64.tar.gz

# 此处为了区分与默认容器运行时docker,将配置文件名改为containerd.conf
cat > /etc/modules-load.d/containerd.conf <<EOF
overlay
br_netfilter
EOF

# 显式加载模块
modprobe overlay
modprobe br_netfilter

# 设置所需的 sysctl 参数,参数在重新启动后保持不变
cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

# 应用 sysctl 参数而不重新启动
sysctl -p /etc/sysctl.d/k8s.conf

# 安装kubernetes
# 设置kubernetes源
# 更新apt包并安装相关依赖
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
# 下载kubernetes公共签名gpg密钥
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
# 添加kubernetes的apt源
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF

sudo apt-get update
#sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-get install  kubelet=1.22.1-00 kubeadm=1.22.1-00 kubectl=1.22.1-00
#sudo apt-mark hold kubelet kubeadm kubectl

systemctl start kubelet
sudo systemctl enable --now kubelet

sed -i '2i source <(kubectl completion bash)' /etc/profile

echo "在master上执行如下命令: "
echo ""
#echo "kubeadm init  --kubernetes-version=v1.20.1 --pod-network-cidr=10.244.0.0/16"
echo "kubeadm init  --kubernetes-version=v1.22.1 --pod-network-cidr=10.244.0.0/16 --image-repository registry.aliyuncs.com/google_containers"
echo ""

7. 参考资料

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门