0


部署kubernetes-1.27.1(1-2)

安装底层容器

先前说过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源。

  1. [root@localhost ~]# cd /etc/yum.repos.d/
  2. [root@localhost yum.repos.d]# wget https://download.docker.com/linux/centos/docker-ce.repo
  3. #上面是官方连接,这里是我自己存储的备用
  4. #https://github.com/2174873018/Kubernetes/raw/main/docker-ce.repo
  5. [root@localhost yum.repos.d]# yum install docker-ce -y
  6. 已加载插件:fastestmirror, langpacks
  7. Loading mirror speeds from cached hostfile
  8. * base: mirrors.aliyun.com
  9. * extras: mirrors.aliyun.com
  10. * updates: mirrors.aliyun.com
  11. 软件包 3:docker-ce-23.0.3-1.el7.x86_64 已安装并且是最新版本
  12. 无须任何处理

这里也可以使用其他的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

  1. [root@localhost ~]# wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.1/cri-dockerd-0.3.1.amd64.tgz
  2. #如果无法访问链接,则检查代理,或者通过其他途径将包导入。
  3. [root@localhost ~]# tar -zxvf cri-dockerd-0.3.1.amd64.tgz
  4. cri-dockerd/
  5. cri-dockerd/cri-dockerd
  6. [root@localhost ~]# cd cri-dockerd
  7. [root@localhost cri-dockerd]# cp cri-dockerd /usr/bin/
  8. [root@localhost cri-dockerd]# chmod 777 /usr/bin/cri-dockerd

接下来需要手搓service和socket文件,在官方说明中给出了service和socket文件提供给我们下载。这里直接写出来,复制即可,注意看清楚下面有两个文件。

  1. #已经添加完成cri-dockerd二进制文件,现在编写service文件。
  2. [root@localhost ~]# vim /etc/systemd/system/cri-docker.service
  3. [Unit]
  4. Description=CRI Interface for Docker Application Container Engine
  5. Documentation=https://docs.mirantis.com
  6. After=network-online.target firewalld.service docker.service
  7. Wants=network-online.target
  8. Requires=cri-docker.socket
  9. [Service]
  10. Type=notify
  11. ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd://
  12. ExecReload=/bin/kill -s HUP $MAINPID
  13. TimeoutSec=0
  14. RestartSec=2
  15. Restart=always
  16. # Note that StartLimit* options were moved from "Service" to "Unit" in systemd 229.
  17. # Both the old, and new location are accepted by systemd 229 and up, so using the old location
  18. # to make them work for either version of systemd.
  19. StartLimitBurst=3
  20. # Note that StartLimitInterval was renamed to StartLimitIntervalSec in systemd 230.
  21. # Both the old, and new name are accepted by systemd 230 and up, so using the old name to make
  22. # this option work for either version of systemd.
  23. StartLimitInterval=60s
  24. # Having non-zero Limit*s causes performance problems due to accounting overhead
  25. # in the kernel. We recommend using cgroups to do container-local accounting.
  26. LimitNOFILE=infinity
  27. LimitNPROC=infinity
  28. LimitCORE=infinity
  29. # Comment TasksMax if your systemd version does not support it.
  30. # Only systemd 226 and above support this option.
  31. TasksMax=infinity
  32. Delegate=yes
  33. KillMode=process
  34. [Install]
  35. WantedBy=multi-user.target
  36. ##############编写socket文件
  37. [root@localhost ~]# vim /etc/systemd/system/cri-docker.socket
  38. [Unit]
  39. Description=CRI Docker Socket for the API
  40. PartOf=cri-docker.service
  41. [Socket]
  42. ListenStream=%t/cri-dockerd.sock
  43. SocketMode=0660
  44. SocketUser=root
  45. SocketGroup=docker
  46. [Install]
  47. WantedBy=sockets.target

然后修改service文件,指定pause镜像来源,这里一定要完成,否则后面还是要修改。如果获取到默认使用的pause镜像则可以忽略此步骤。

  1. #在service文件中添加
  2. ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --pod-infra-container-image=registry.k8s.io/pause:3.9
  3. #一般指定pause设定在kubelet的配置当中,kubelet会在创建pod前拉取pause镜像,并缓存它后续使用。
  4. #将此参数放在kubelet中更加常见,但是在某些情况下也会将参数配置在cri-dockerd中,例如当使用自定义的cri运行时。

说明:另外pause容器其实不需要任何功能,它只是用来占据pod中的一个网络命名空间和ipc命名空间,并保持这些命名空间的开放状态。因此,可以使用一个很小的镜像,甚至一个空文件作为容器镜像。所以可以构建一个空镜像,打上标签,然后在指定仓库的时候指定本地镜像。

然后启动cri-docker,保证其正常运行。

  1. [root@master ~]# systemctl daemon-reload
  2. [root@master ~]# systemctl enable cri-docker
  3. Created symlink from /etc/systemd/system/multi-user.target.wants/cri-docker.service to /etc/systemd/system/cri-docker.service
  4. [root@master ~]# systemctl restart cri-docker

修改docker cgroup驱动

这里如果有特殊情况需要使用systemd驱动时才需要修改,没有特殊要求的尽量不修改使用默认的驱动,一般情况下推荐使用cgroupfs驱动。

  1. [root@localhost test]# docker info | grep Cgroup
  2. Cgroup Driver: cgroupfs
  3. Cgroup Version: 1
  4. #发现默认驱动为cgroupfs。
  5. [root@localhost test]# cat /etc/docker/daemon.json
  6. {
  7. "exec-opts":["native.cgroupdriver=systemd"]
  8. }
  9. [root@localhost test]# systemctl daemon-reload
  10. [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配置文件,然后修改配置文件。

  1. [root@master ~]# vim /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
  2. Environment="KUBELET_EXTRA_ARGS=--container-runtime= unix:///run/cri-dockerd.sock"
  3. #添加上面一行内容,sock文件路径根据实际环境设置。
  4. [root@master ~]# systemctl daemon-reload
  5. [root@master ~]# systemctl restart kubelet

获取kubernetes镜像

根据官网的说法,使用kubeadm工具,获取部署kubernetes集群所需镜像。

  1. [root@node2 images]# kubeadm config images list
  2. 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)
  3. registry.k8s.io/kube-apiserver:v1.27.1
  4. registry.k8s.io/kube-controller-manager:v1.27.1
  5. registry.k8s.io/kube-scheduler:v1.27.1
  6. registry.k8s.io/kube-proxy:v1.27.1
  7. registry.k8s.io/pause:3.9
  8. registry.k8s.io/etcd:3.5.7-0
  9. registry.k8s.io/coredns/coredns:v1.10.1
  10. #然后拉取镜像,这里需要指定cri,因为docker底层有containerd,现在还安装了cri
  11. #当有多个cri的时候kubernetes要求指定其中一个cri,没指定cri报错的时候会告知cri路径。
  12. [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中即可。

  1. [root@master images]# for i in $(ls);do docker load -i $i;done
  2. 256bc5c338a6: Loading layer 336.4kB/336.4kB
  3. df1818f16337: Loading layer 48.59MB/48.59MB
  4. Loaded image: registry.k8s.io/coredns/coredns:v1.9.3
  5. 9fce6bd02a21: Loading layer 3.676MB/3.676MB
  6. 2941b2b36c54: Loading layer 2.257MB/2.257MB
  7. 7772ba21d1e3: Loading layer 273.9MB/273.9MB
  8. 46efaf9cefbf: Loading layer 1.979MB/1.979MB
  9. 620ff9a81da1: Loading layer 19.04MB/19.04MB
  10. Loaded image: registry.k8s.io/etcd:3.5.6-0
  11. 28e757e6e258: Loading layer 3.768MB/3.768MB
  12. d47195e6336b: Loading layer 1.538MB/1.538MB
  13. 9e2c8ca3c538: Loading layer 130MB/130MB
  14. Loaded image: registry.k8s.io/kube-apiserver:v1.26.3
  15. 094b85b8ca91: Loading layer 119.4MB/119.4MB
  16. Loaded image: registry.k8s.io/kube-controller-manager:v1.26.3
  17. 8342c4e13d7f: Loading layer 22.19MB/22.19MB
  18. d3060b11e465: Loading layer 45.03MB/45.03MB
  19. Loaded image: registry.k8s.io/kube-proxy:v1.26.3
  20. c469cd94ce95: Loading layer 52.45MB/52.45MB
  21. Loaded image: registry.k8s.io/kube-scheduler:v1.26.3
  22. e3e5579ddd43: Loading layer 746kB/746kB
  23. Loaded image: registry.k8s.io/pause:3.9
  24. [root@master images]# docker images
  25. REPOSITORY TAG IMAGE ID CREATED SIZE
  26. registry.k8s.io/kube-apiserver v1.26.3 91601d91fc4e 5 weeks ago 134MB
  27. registry.k8s.io/kube-scheduler v1.26.3 205f9de51c6f 5 weeks ago 56.4MB
  28. registry.k8s.io/kube-controller-manager v1.26.3 939fcea57932 5 weeks ago 123MB
  29. registry.k8s.io/kube-proxy v1.26.3 81c02dd39967 5 weeks ago 65.6MB
  30. registry.k8s.io/etcd 3.5.6-0 7f6ebf76b396 5 months ago 299MB
  31. registry.k8s.io/pause 3.9 ffbd70d47332 6 months ago 744kB
  32. registry.k8s.io/coredns/coredns v1.9.3 bff821dafb5a 11 months ago 48.8MB

kubeadm创建kubernetes集群

生成kubeadm配置文件,然后修改配置文件。

  1. [root@localhost images]# kubeadm config print init-defaults > kubeadm.yaml
  2. [root@localhost images]# cat kubeadm.yaml
  3. apiVersion: kubeadm.k8s.io/v1beta3
  4. bootstrapTokens:
  5. - groups:
  6. - system:bootstrappers:kubeadm:default-node-token
  7. token: abcdef.0123456789abcdef
  8. ttl: 24h0m0s
  9. usages:
  10. - signing
  11. - authentication
  12. kind: InitConfiguration
  13. localAPIEndpoint:
  14. advertiseAddress: 1.2.3.4
  15. bindPort: 6443
  16. nodeRegistration:
  17. criSocket: unix:///var/run/containerd/containerd.sock
  18. imagePullPolicy: IfNotPresent
  19. name: node
  20. taints: null
  21. ---
  22. apiServer:
  23. timeoutForControlPlane: 4m0s
  24. apiVersion: kubeadm.k8s.io/v1beta3
  25. certificatesDir: /etc/kubernetes/pki
  26. clusterName: kubernetes
  27. controllerManager: {}
  28. dns: {}
  29. etcd:
  30. local:
  31. dataDir: /var/lib/etcd
  32. imageRepository: registry.k8s.io
  33. kind: ClusterConfiguration
  34. kubernetesVersion: 1.26.0
  35. networking:
  36. dnsDomain: cluster.local
  37. serviceSubnet: 10.96.0.0/12
  38. scheduler: {}

修改以下内容,根据自己的集群信息来进行更改。

  1. advertiseAddress: 192.168.100.10
  2. #修改为master节点ip
  3. criSocket: unix:///run/cri-dockerd.sock
  4. #根据自己定义的cri来决定,其他系统路径可能有所不同
  5. serviceSubnet: 10.96.0.0/12
  6. podSubnet: 192.168.0.0/16
  7. #设置pod划分地址网段。
  8. imageRepository: registry.k8s.io
  9. #当仓库名称和自己的不符时更改,或是更改docker标签。
  10. kubernetesVersion: 1.27.1
  11. #根据自己的kubernetes版本修改。

这里需要注意检查自己的系统是否配置有网关和dns,一般环境下都会有配置,如果没有需要自己添加网关和dns,根据自己的实际情况配置。

  1. [root@master images]# echo -e "GATEWAY=192.168.100.1\nDNS1=192.168.100.1" >> /etc/sysconfig/network-scripts/ifcfg-ens33
  2. [root@master images]# systemctl restart network

最后初始化集群,给予权限。

  1. [root@master images]# kubeadm init --config kubeadm.yaml
  2. #如果出错了就重置,然后重新构建集群 :
  3. #kubeadm reset --cri-socket=unix:///var/run/cri-dockerd.sock
  4. #因为docker的containerd-cri会和cri-dockerd冲突,所以需要指定。
  5. #如果已经修改了kubeadm配置文件请忽略指定cri的步骤。

这里可以通过设置环境变量或者添加config文件来获取权限。

  1. mkdir -p $HOME/.kube
  2. sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  3. sudo chown $(id -u):$(id -g) $HOME/.kube/config
  4. #或者使用
  5. export KUBECONFIG=/etc/kubernetes/admin.conf

接下来就是为kubernetes集群安装cni网络插件。


本文转载自: https://blog.csdn.net/m0_54534480/article/details/130379533
版权归原作者 [NING] 所有, 如有侵权,请联系我们删除。

“部署kubernetes-1.27.1(1-2)”的评论:

还没有评论