安装底层容器
先前说过kubernetes官方文档中有多种底层容器可供使用,本篇文章使用docker作为kubernetes底层容器并尽量遵循官方文档,其他底层容器后面会有其他文章。
根据官方的说法,现在还想使用docker作为kubernetes底层容器,需要cri-dockerd来将docker engine与kubernetes集成,下面会说明。
Docker Engine
Docker Engine 是一款用于构建和运行容器化应用程序的软件。它具有以下特点:
1,简单易用:Docker Engine 提供了一个简单的命令行接口,可以方便地创建、启动、停止和删除容器。
2,轻量级:Docker Engine 容器非常轻量级,可以在几毫秒内启动和停止。
3,可移植性:Docker Engine 容器可以在不同的平台上运行,包括物理机、虚拟机和云环境。
4,可扩展性:Docker Engine 支持通过容器编排工具(如 Kubernetes、Docker Compose 等)进行自动化容器部署、管理和扩缩容等操作。
5,安全性:Docker Engine 提供了一系列安全措施,包括容器隔离、镜像签名和加密等,以确保容器的安全性和稳定性。
Docker Engine和Docker的区别
1,Docker Engine 是 Docker 的核心组件,是用于构建和运行容器化应用程序的基础平台。而普通的 Docker(也称为 Docker 客户端)则是用于与 Docker Engine 进行交互的命令行工具。
2,Docker Engine 包含了 Docker 客户端的所有功能,并且还提供了一系列 API 接口来简化容器管理、镜像管理和网络管理等操作。因此,Docker Engine 更加强大和灵活,可以被用作构建自动化容器化部署和持续集成/持续部署(CI/CD)的基础设施。
3,Docker Engine 可以安装在不同的操作系统上,包括 Linux、Windows 和 macOS 等,而普通的 Docker 则通常只支持运行在 Linux 操作系统上。
安装docker
记得关闭防火墙或者开放端口。根据docker官网的部署方式,centos系统可以直接配置repo源,下载安装即可。如果出现软件包冲突请检查repo源。
[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# wget https://download.docker.com/linux/centos/docker-ce.repo
#上面是官方连接,这里是我自己存储的备用
#https://github.com/2174873018/Kubernetes/raw/main/docker-ce.repo
[root@localhost yum.repos.d]# yum install docker-ce -y
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
软件包 3:docker-ce-23.0.3-1.el7.x86_64 已安装并且是最新版本
无须任何处理
这里也可以使用其他的repo源或者自己的rpm包制作repo源,只要能成功安装docker即可。
安装cri-dockerd
先前说过Docker 本身是一个容器运行时(Container Runtime),它负责管理容器的生命周期,包括创建、启动、停止和销毁等操作。然而,Docker 运行时在设计上并不符合 Kubernetes 等容器编排工具的要求,因此需要使用 CRI(Container Runtime Interface)来与容器编排工具进行交互。
根据kubernetes官网给出的方法,使用源代码仓库中说明的方式进行部署。
在官方的仓库中获取最新版本的软件包,然后继续执行以下步骤。这里使用的时cri-dockerd0.3.1的版本,记得每个节点都要配置。
下面如果没有代理无法访问并下载到软件包可以通过此链接下载(需要百度网盘)。
链接:https://pan.baidu.com/s/1mYGyYwvO4pqnJydXviavhw?pwd=2934
提取码:2934
[root@localhost ~]# wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.1/cri-dockerd-0.3.1.amd64.tgz
#如果无法访问链接,则检查代理,或者通过其他途径将包导入。
[root@localhost ~]# tar -zxvf cri-dockerd-0.3.1.amd64.tgz
cri-dockerd/
cri-dockerd/cri-dockerd
[root@localhost ~]# cd cri-dockerd
[root@localhost cri-dockerd]# cp cri-dockerd /usr/bin/
[root@localhost cri-dockerd]# chmod 777 /usr/bin/cri-dockerd
接下来需要手搓service和socket文件,在官方说明中给出了service和socket文件提供给我们下载。这里直接写出来,复制即可,注意看清楚下面有两个文件。
#已经添加完成cri-dockerd二进制文件,现在编写service文件。
[root@localhost ~]# vim /etc/systemd/system/cri-docker.service
[Unit]
Description=CRI Interface for Docker Application Container Engine
Documentation=https://docs.mirantis.com
After=network-online.target firewalld.service docker.service
Wants=network-online.target
Requires=cri-docker.socket
[Service]
Type=notify
ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd://
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
# Note that StartLimit* options were moved from "Service" to "Unit" in systemd 229.
# Both the old, and new location are accepted by systemd 229 and up, so using the old location
# to make them work for either version of systemd.
StartLimitBurst=3
# Note that StartLimitInterval was renamed to StartLimitIntervalSec in systemd 230.
# Both the old, and new name are accepted by systemd 230 and up, so using the old name to make
# this option work for either version of systemd.
StartLimitInterval=60s
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Comment TasksMax if your systemd version does not support it.
# Only systemd 226 and above support this option.
TasksMax=infinity
Delegate=yes
KillMode=process
[Install]
WantedBy=multi-user.target
##############编写socket文件
[root@localhost ~]# vim /etc/systemd/system/cri-docker.socket
[Unit]
Description=CRI Docker Socket for the API
PartOf=cri-docker.service
[Socket]
ListenStream=%t/cri-dockerd.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker
[Install]
WantedBy=sockets.target
然后修改service文件,指定pause镜像来源,这里一定要完成,否则后面还是要修改。如果获取到默认使用的pause镜像则可以忽略此步骤。
#在service文件中添加
ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --pod-infra-container-image=registry.k8s.io/pause:3.9
#一般指定pause设定在kubelet的配置当中,kubelet会在创建pod前拉取pause镜像,并缓存它后续使用。
#将此参数放在kubelet中更加常见,但是在某些情况下也会将参数配置在cri-dockerd中,例如当使用自定义的cri运行时。
说明:另外pause容器其实不需要任何功能,它只是用来占据pod中的一个网络命名空间和ipc命名空间,并保持这些命名空间的开放状态。因此,可以使用一个很小的镜像,甚至一个空文件作为容器镜像。所以可以构建一个空镜像,打上标签,然后在指定仓库的时候指定本地镜像。
然后启动cri-docker,保证其正常运行。
[root@master ~]# systemctl daemon-reload
[root@master ~]# systemctl enable cri-docker
Created symlink from /etc/systemd/system/multi-user.target.wants/cri-docker.service to /etc/systemd/system/cri-docker.service
[root@master ~]# systemctl restart cri-docker
修改docker cgroup驱动
这里如果有特殊情况需要使用systemd驱动时才需要修改,没有特殊要求的尽量不修改使用默认的驱动,一般情况下推荐使用cgroupfs驱动。
[root@localhost test]# docker info | grep Cgroup
Cgroup Driver: cgroupfs
Cgroup Version: 1
#发现默认驱动为cgroupfs。
[root@localhost test]# cat /etc/docker/daemon.json
{
"exec-opts":["native.cgroupdriver=systemd"]
}
[root@localhost test]# systemctl daemon-reload
[root@localhost test]# systemctl restart docker
在官方的说法中kubelet和docker本身都是默认使用cgroupfs驱动,并且官方也建议docker底层容器的话使用cgroupfs,而container或者CRI-O作为底层容器的时候建议使用systemd驱动,除非有特殊情况必须要使用systemd驱动的才需更改,而且kubelet的cgroupfs驱动需要一起更改。
指定kubeadm默认cri
当docker和cri-docker一起安装的时候,docker默认自带containerd的cri所以会导致kubeadm识别到两个cri,每次使用kubeadm都需要指定一下cri,所以干脆修改kubeadm配置文件,使其本身就使用其中一个cri。
找到10-kubeadm.conf配置文件,然后修改配置文件。
[root@master ~]# vim /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
Environment="KUBELET_EXTRA_ARGS=--container-runtime= unix:///run/cri-dockerd.sock"
#添加上面一行内容,sock文件路径根据实际环境设置。
[root@master ~]# systemctl daemon-reload
[root@master ~]# systemctl restart kubelet
获取kubernetes镜像
根据官网的说法,使用kubeadm工具,获取部署kubernetes集群所需镜像。
[root@node2 images]# kubeadm config images list
W0427 10:30:29.946236 17852 images.go:80] could not find officially supported version of etcd for Kubernetes v1.27.1, falling back to the nearest etcd version (3.5.7-0)
registry.k8s.io/kube-apiserver:v1.27.1
registry.k8s.io/kube-controller-manager:v1.27.1
registry.k8s.io/kube-scheduler:v1.27.1
registry.k8s.io/kube-proxy:v1.27.1
registry.k8s.io/pause:3.9
registry.k8s.io/etcd:3.5.7-0
registry.k8s.io/coredns/coredns:v1.10.1
#然后拉取镜像,这里需要指定cri,因为docker底层有containerd,现在还安装了cri
#当有多个cri的时候kubernetes要求指定其中一个cri,没指定cri报错的时候会告知cri路径。
[root@localhost ~]# kubeadm config images pull --cri-socket=unix:///var/run/cri-dockerd.sock
同样在拉取镜像的时候确保代理没有问题,可以成功访问国外镜像源,可以自己准备1.27版本镜像存放到本地,可以在部署的时候拉取本地镜像。
如果是在是找不到此版本镜像,则可以通过github+阿里云构建自己的镜像(实际上就是官方镜像)。自己构建的镜像标签不一致,后面需要注意。
如果实在无法拉取到镜像,可以通过此链接下载,这也是我自己保存的官方镜像。
链接:https://pan.baidu.com/s/1Xvupb2v5dCu7k5GiyhyvRA?pwd=2934
提取码:2934
下载好镜像后上传至docker中即可。
[root@master images]# for i in $(ls);do docker load -i $i;done
256bc5c338a6: Loading layer 336.4kB/336.4kB
df1818f16337: Loading layer 48.59MB/48.59MB
Loaded image: registry.k8s.io/coredns/coredns:v1.9.3
9fce6bd02a21: Loading layer 3.676MB/3.676MB
2941b2b36c54: Loading layer 2.257MB/2.257MB
7772ba21d1e3: Loading layer 273.9MB/273.9MB
46efaf9cefbf: Loading layer 1.979MB/1.979MB
620ff9a81da1: Loading layer 19.04MB/19.04MB
Loaded image: registry.k8s.io/etcd:3.5.6-0
28e757e6e258: Loading layer 3.768MB/3.768MB
d47195e6336b: Loading layer 1.538MB/1.538MB
9e2c8ca3c538: Loading layer 130MB/130MB
Loaded image: registry.k8s.io/kube-apiserver:v1.26.3
094b85b8ca91: Loading layer 119.4MB/119.4MB
Loaded image: registry.k8s.io/kube-controller-manager:v1.26.3
8342c4e13d7f: Loading layer 22.19MB/22.19MB
d3060b11e465: Loading layer 45.03MB/45.03MB
Loaded image: registry.k8s.io/kube-proxy:v1.26.3
c469cd94ce95: Loading layer 52.45MB/52.45MB
Loaded image: registry.k8s.io/kube-scheduler:v1.26.3
e3e5579ddd43: Loading layer 746kB/746kB
Loaded image: registry.k8s.io/pause:3.9
[root@master images]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry.k8s.io/kube-apiserver v1.26.3 91601d91fc4e 5 weeks ago 134MB
registry.k8s.io/kube-scheduler v1.26.3 205f9de51c6f 5 weeks ago 56.4MB
registry.k8s.io/kube-controller-manager v1.26.3 939fcea57932 5 weeks ago 123MB
registry.k8s.io/kube-proxy v1.26.3 81c02dd39967 5 weeks ago 65.6MB
registry.k8s.io/etcd 3.5.6-0 7f6ebf76b396 5 months ago 299MB
registry.k8s.io/pause 3.9 ffbd70d47332 6 months ago 744kB
registry.k8s.io/coredns/coredns v1.9.3 bff821dafb5a 11 months ago 48.8MB
kubeadm创建kubernetes集群
生成kubeadm配置文件,然后修改配置文件。
[root@localhost images]# kubeadm config print init-defaults > kubeadm.yaml
[root@localhost images]# cat kubeadm.yaml
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: 1.2.3.4
bindPort: 6443
nodeRegistration:
criSocket: unix:///var/run/containerd/containerd.sock
imagePullPolicy: IfNotPresent
name: node
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.k8s.io
kind: ClusterConfiguration
kubernetesVersion: 1.26.0
networking:
dnsDomain: cluster.local
serviceSubnet: 10.96.0.0/12
scheduler: {}
修改以下内容,根据自己的集群信息来进行更改。
advertiseAddress: 192.168.100.10
#修改为master节点ip
criSocket: unix:///run/cri-dockerd.sock
#根据自己定义的cri来决定,其他系统路径可能有所不同
serviceSubnet: 10.96.0.0/12
podSubnet: 192.168.0.0/16
#设置pod划分地址网段。
imageRepository: registry.k8s.io
#当仓库名称和自己的不符时更改,或是更改docker标签。
kubernetesVersion: 1.27.1
#根据自己的kubernetes版本修改。
这里需要注意检查自己的系统是否配置有网关和dns,一般环境下都会有配置,如果没有需要自己添加网关和dns,根据自己的实际情况配置。
[root@master images]# echo -e "GATEWAY=192.168.100.1\nDNS1=192.168.100.1" >> /etc/sysconfig/network-scripts/ifcfg-ens33
[root@master images]# systemctl restart network
最后初始化集群,给予权限。
[root@master images]# kubeadm init --config kubeadm.yaml
#如果出错了就重置,然后重新构建集群 :
#kubeadm reset --cri-socket=unix:///var/run/cri-dockerd.sock
#因为docker的containerd-cri会和cri-dockerd冲突,所以需要指定。
#如果已经修改了kubeadm配置文件请忽略指定cri的步骤。
这里可以通过设置环境变量或者添加config文件来获取权限。
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
#或者使用
export KUBECONFIG=/etc/kubernetes/admin.conf
接下来就是为kubernetes集群安装cni网络插件。
版权归原作者 [NING] 所有, 如有侵权,请联系我们删除。