k8s从1.20升级到v1.27,v1.2以前在集群内,是通过 dockershim 使用 Docker Engine 作为容器运行时,因为dockershim 维护的问题弃用,升级集群的话用cri-dockerd 代替dockershim
在 Kubernetes v1.24 及更早版本中,你可以在 Kubernetes 中使用 Docker Engine, 依赖于一个称作 dockershim 的内置 Kubernetes 组件。 dockershim 组件在 Kubernetes v1.24 发行版本中已被移除;不过,一种来自第三方的替代品,
cri-dockerd
是可供使用的。cri-dockerd
适配器允许你通过 容器运行时接口(Container Runtime Interface,CRI) 来使用 Docker Engine
可以安装 cri-dockerd 并使用它将 kubelet 连接到 Docker Engine
升级前了解的扩展知识,推荐阅读:
Docker现在在Kubernetes中被弃用了?我该怎么办?
容器运行时分为两种类型:CRI和OCI,它们的区别和联系:
在 Kubernetes 1.27 中,CRI(Container Runtime Interface)是 Kubernetes 与容器运行时进行通信的标准接口。CRI runtimes 是指实现了 CRI 接口规范的容器运行时,例如 Docker、CRI-O、containerd 等。Kubernetes 使用 CRI 接口与 CRI runtimes 进行交互,以管理容器的生命周期、资源限制和网络设置等。
OCI(Open Container Initiative)是一个开放的工业化容器标准。OCI 规范定义了容器格式和运行时标准,以确保容器在不同平台和环境中的互操作性和可移植性。CRI runtimes 与 OCI 的联系在于,CRI runtimes 可以使用 OCI 规范定义的容器格式运行容器,以确保容器的互操作性和可移植性。因此,大多数 CRI runtimes 都支持 OCI 规范,并使用 OCI 格式作为默认容器格式。
总之,CRI runtimes 是 Kubernetes 中实现了 CRI 接口规范的容器运行时,用于管理容器的生命周期、资源限制和网络设置等。而 OCI 是一个开放的工业化容器标准,定义了容器格式和运行时标准,以确保容器在不同平台和环境中的互操作性和可移植性。CRI runtimes 与 OCI 的联系在于,CRI runtimes 可以使用 OCI 规范定义的容器格式运行容器,以确保容器的互操作性和可移植性。因此,大多数 CRI runtimes 都支持 OCI 规范,并使用 OCI 格式作为默认容器格式。
一般称呼容器运行时指的是CRI
Kubernetes 多个容器运行CRI时,常用的有以下几种:
1. Docker:Docker 是目前最受欢迎的容器运行时之一,它支持 OCI 规范定义的容器格式,并提供了丰富的容器管理功能。
2. containerd:containerd 是一个轻量级的容器运行时,它是 Docker 引擎的一部分,并支持 OCI 规范定义的容器格式。containerd 可以与 Kubernetes 集成,提供容器的生命周期管理和资源限制等功能。
3. CRI-O:CRI-O 是一个专门为 Kubernetes 设计的轻量级容器运行时,它实现了 CRI 接口规范,并支持 OCI 规范定义的容器格式。CRI-O 的设计目标是提供最小化的依赖和最佳的性能。
4. rkt:rkt 是一个安全的、可信的容器引擎,它支持 OCI 规范定义的容器格式,并提供了高级的容器隔离和安全功能。rkt 可以与 Kubernetes 集成,并提供容器的生命周期管理和资源限制等功能。
以上容器运行时都可以与 Kubernetes 集成,并提供容器的生命周期管理和资源限制等功能。选择哪种容器运行时取决于您的具体需求和偏好。如果您已经熟悉 Docker,并且需要一些高级的容器管理功能,那么 Docker 可能是一个不错的选择。如果您需要一个轻量级的容器运行时,并希望尽量减少依赖,那么 CRI-O 可能更适合您。如果您需要一个安全的、可信的容器运行时,并希望使用高级的容器隔离和安全功能,那么 rkt 可能更适合您。无论您选择哪种容器运行时,都需要确保它支持 Kubernetes,并且可以与您的集群进行良好的集成。
1.操作系统环境
root@train-1:~# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 20.04.6 LTS
Release: 20.04
Codename: focal
主机名 | ip | |
master1 | 192.168.31.150 | |
node1 | 192.168.31.151 | |
node2 | 192.168.31.152 |
你需要在每台机器上安装以下的软件包:
kubeadm
:用来初始化集群的指令。
kubelet
:在集群中的每个节点上用来启动 Pod 和容器等。
kubectl
:用来与集群通信的命令行工具。
#!/bin/bash
#
#********************************************************************
#Author: lzlor
#FileName: k8s_install.sh
#Description: The test script
#********************************************************************
#说明:安装Kubernetes服务器内存建议至少2G
#需先下载cri-dockerd_-0.ubuntu-_amd64.deb文件,放在当前目录下
. /etc/os-release
KUBE_VERSION="1.27.1"
#KUBE_VERSION="1.26.2"
#KUBE_VERSION="1.25.3"
#KUBE_VERSION="1.25.0"
#KUBE_VERSION="1.24.4"
#KUBE_VERSION="1.24.3"
#KUBE_VERSION="1.24.0"
#KUBE_VERSION="1.22.1"
#KUBE_VERSION="1.17.2"
CIR_DOCKER_VERSION=0.3.1
#CIR_DOCKER_VERSION=0.2.6
CIR_DOCKER_FILE="cri-dockerd_${CIR_DOCKER_VERSION}.3-0.ubuntu-${UBUNTU_CODENAME}_amd64.deb"
PAUSE_VERSION=3.9
#PAUSE_VERSION=3.7
#以下地址和/etc/hosts文件有关,根据集群数量取消注释
KUBEAPI_IP=192.168.31.150
MASTER1_IP=192.168.31.150
#MASTER2_IP=192.168.31.151
#MASTER3_IP=192.168.31.152
NODE1_IP=192.168.31.151
NODE2_IP=192.168.31.152
#NODE3_IP=10.0.0.206
HARBOR_IP=192.168.31.155
DOMAIN=lzl.org
MASTER1=master1.$DOMAIN
#MASTER2=master2.$DOMAIN
#MASTER3=master3.$DOMAIN
NODE1=node1.$DOMAIN
NODE2=node2.$DOMAIN
#NODE3=node3.$DOMAIN
#HA1=ha1.$DOMAIN
#HA2=ha1.$DOMAIN
HARBOR=harbor.$DOMAIN
POD_NETWORK="10.244.0.0/16"
SERVICE_NETWORK="10.96.0.0/12"
IMAGES_URL="registry.aliyuncs.com/google_containers"
KUBE_VERSION2=$(echo $KUBE_VERSION |awk -F. '{print $2}')
CIR_DOCKER_URL="https://github.com/Mirantis/cri-dockerd/releases/download/v${CIR_DOCKER_VERSION}/${CIR_DOCKER_FILE}"
LOCAL_IP=`hostname -I|awk '{print $1}'`
COLOR_SUCCESS="echo -e \\033[1;32m"
COLOR_FAILURE="echo -e \\033[1;31m"
END="\033[m"
color () {
RES_COL=80
MOVE_TO_COL="echo -en \\033[${RES_COL}G"
SETCOLOR_SUCCESS="echo -en \\033[1;32m"
SETCOLOR_FAILURE="echo -en \\033[1;31m"
SETCOLOR_WARNING="echo -en \\033[1;33m"
SETCOLOR_NORMAL="echo -en \E[0m"
echo -n "$1" && $MOVE_TO_COL
echo -n "["
if [ $2 = "success" -o $2 = "0" ] ;then
${SETCOLOR_SUCCESS}
echo -n $" OK "
elif [ $2 = "failure" -o $2 = "1" ] ;then
${SETCOLOR_FAILURE}
echo -n $"FAILED"
else
${SETCOLOR_WARNING}
echo -n $"WARNING"
fi
${SETCOLOR_NORMAL}
echo -n "]"
echo
}
check () {
if [ ! -f "${CIR_DOCKER_FILE}" ];then
color "${CIR_DOCKER_FILE} 文件不存在,退出!" 1
exit
fi
if [ $ID = 'ubuntu' ] && [[ ${VERSION_ID} =~ 2[02].04 ]];then
true
else
color "不支持此操作系统,退出!" 1
exit
fi
}
install_prepare () {
[ -f ./prepare.check ] && { color "环境已初始化!" 0; } || {
cat >> /etc/hosts < /etc/docker/daemon.json </etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
apt-get update
apt-cache madison kubeadm |head
${COLOR_FAILURE}"5秒后即将安装: kubeadm-"${KUBE_VERSION}" 版本....."${END}
${COLOR_FAILURE}"如果想安装其它版本,请按ctrl+c键退出,修改版本再执行"${END}
sleep 6
#安装指定版本
apt install -y kubeadm=${KUBE_VERSION}-00 kubelet=${KUBE_VERSION}-00 kubectl=${KUBE_VERSION}-00
[ $? -eq 0 ] && { color "安装kubeadm成功!" 0;sleep 1; } || { color "安装kubeadm失败!" 1 ; exit 2; }
#实现kubectl命令自动补全功能
kubectl completion bash > /etc/profile.d/kubectl_completion.sh
}
#只有Kubernetes集群的第一个master节点需要执行下面初始化函数
kubernetes_init () {
if [ $KUBE_VERSION2 -lt 24 ] ;then
kubeadm init --control-plane-endpoint="kubeapi.$DOMAIN" \
--kubernetes-version=v${KUBE_VERSION} \
--pod-network-cidr=${POD_NETWORK} \
--service-cidr=${SERVICE_NETWORK} \
--token-ttl=0 \
--upload-certs \
--image-repository=${IMAGES_URL}
else
#Kubernetes-v1.24版本前无需加选项 --cri-socket=unix:///run/cri-dockerd.sock
kubeadm init --control-plane-endpoint="kubeapi.$DOMAIN" \
--kubernetes-version=v${KUBE_VERSION} \
--pod-network-cidr=${POD_NETWORK} \
--service-cidr=${SERVICE_NETWORK} \
--token-ttl=0 \
--upload-certs \
--image-repository=${IMAGES_URL} \
--cri-socket=unix:///run/cri-dockerd.sock
fi
[ $? -eq 0 ] && color "Kubernetes集群初始化成功!" 0 || { color "Kubernetes集群初始化失败!" 1 ; exit 3; }
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
}
reset_kubernetes() {
kubeadm reset -f --cri-socket unix:///run/cri-dockerd.sock
rm -rf /etc/cni/net.d/ $HOME/.kube/config
}
check
PS3="请选择编号(1-4): "
ACTIONS="
初始化新的Kubernetes集群
加入已有的Kubernetes集群
退出Kubernetes集群
退出本程序
"
select action in $ACTIONS;do
case $REPLY in
1)
install_prepare
install_docker
install_cri_dockerd
install_kubeadm
kubernetes_init
break
;;
2)
install_prepare
install_docker
install_cri_dockerd
install_kubeadm
$COLOR_SUCCESS"加入已有的Kubernetes集群已准备完毕,还需要执行最后一步加入集群的命令 kubeadm join ..."${END}
break
;;
3)
reset_kubernetes
break
;;
4)
exit
;;
esac
done
安装flannel
默认情况下,如果未指定 kubelet 网络插件,则使用 noop 插件, 该插件设置 net/bridge/bridge-nf-call-iptables=1,以确保简单的配置 (如带网桥的 Docker)与 iptables 代理正常工作
root@master1:~# proxychains4 kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
[proxychains] config file found: /etc/proxychains4.conf
[proxychains] preloading /usr/lib/x86_64-linux-gnu/libproxychains.so.4
namespace/kube-flannel created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created
ps: proxychain4 命令为配置的网络代理工具
#安装bash-completion
apt-get install -y bash-completion
#执行 source 命令:
source /usr/share/bash-completion/bash_completion
#如果想让系统中的所有用户都能拥有命令补全的功能,则执行如下命令:
kubectl completion bash | sudo tee /etc/bash_completion.d/kubectl > /dev/null
#如果只需要当前用户拥有命令自动补全功能,则执行如下命令:
echo 'source <(kubectl completion bash)' >> ~/.bashrc
source ~/.bashrc