安装底层容器

先部署完成基础环境的文章再部署底层容器,先前说过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是否已经启动。

指定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.2, falling back to the nearest etcd version (3.5.7-0)
registry.k8s.io/kube-apiserver:v1.27.2
registry.k8s.io/kube-controller-manager:v1.27.2
registry.k8s.io/kube-scheduler:v1.27.2
registry.k8s.io/kube-proxy:v1.27.2
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/1sEao32r2BI4kYGuN2unRIg?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.27.2
094b85b8ca91: Loading layer  119.4MB/119.4MB
Loaded image: registry.k8s.io/kube-controller-manager:v1.27.2
8342c4e13d7f: Loading layer  22.19MB/22.19MB
d3060b11e465: Loading layer  45.03MB/45.03MB
Loaded image: registry.k8s.io/kube-proxy:v1.27.2
c469cd94ce95: Loading layer  52.45MB/52.45MB
Loaded image: registry.k8s.io/kube-scheduler:v1.27.2
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.27.2   91601d91fc4e   5 weeks ago     134MB
registry.k8s.io/kube-scheduler            v1.27.2   205f9de51c6f   5 weeks ago     56.4MB
registry.k8s.io/kube-controller-manager   v1.27.2   939fcea57932   5 weeks ago     123MB
registry.k8s.io/kube-proxy                v1.27.2   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.27.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: 10.244.0.0/16
#设置pod划分地址网段。
imageRepository: registry.k8s.io
#当仓库名称和自己的不符时更改,或是更改docker标签。
kubernetesVersion: 1.27.2
#根据自己的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网络插件,完成网络插件的安装集群则会ready。

Logo

开源、云原生的融合云平台

更多推荐