Kubernetes 是一款开源的容器编排系统,用于自动部署、扩容和管理容器应用,因为 Kubernetes 的首字母和尾字母之间有8个字母,所以也被简称为 K8s。K8s 在 v1.24 版本之前默认集成了 Docker Engine 作为 K8s 的容器运行时,而在 v1.24 及之后的版本中使用 containerd 作为 K8s 的容器运行时,本篇文章记录如何在 v1.24之后的 K8s 版本中使用 Docker Engine 作为容器运行时以及如何离线安装 K8s 集群
机器情况
|
server 1 |
server 2 |
server 3 |
| 是否有网 |
no |
no |
yes |
| 主机名 |
master-01 |
worker-01 |
- |
| IP |
192.168.1.20 |
192.168.1.21 |
- |
| 操作系统 |
centos:7.6.1810 |
centos:7.6.1810 |
macos |
| CPU架构 |
x86 |
x86 |
arm |
server 1 和 server 2 分别为 K8s 的 master 节点 和 worker 节点,server 3 用于提供安装 K8s 集群所需软件包
Docker CE
在 server 3 的 centos 容器中下载 Docker CE 安装包
On server 3
server 3 安装了 Docker Desktop
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| # 运行 centos:7.6.1810 docker run -itd --name centos --platform=linux/amd64 centos:7.6.1810
# 进入容器内部 docker exec -it centos /bin/sh
# 添加 docker-ce yum 源 yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 查看 docker-ce 最新的5个版本 yum list docker-ce --showduplicates | sort -r | head -5
docker-ce.x86_64 3:24.0.6-1.el7 docker-ce-stable docker-ce.x86_64 3:24.0.5-1.el7 docker-ce-stable docker-ce.x86_64 3:24.0.4-1.el7 docker-ce-stable docker-ce.x86_64 3:24.0.3-1.el7 docker-ce-stable docker-ce.x86_64 3:24.0.2-1.el7 docker-ce-stable
# 下载 24.0.6-1.el7 版本的 docker yum install --downloadonly --downloaddir=/root/docker docker-ce-24.0.6-1.el7.x86_64
# 压缩 docker-ce rpm 安装包 tar -zcvf docker.tar.gz docker
# 拷贝 docker.tar.gz 至宿主机 docker cp centos:/root/docker.tar.gz downloads
|
On server 1
server 2 和 server 1 进行同样操作,拷贝 docker.tar.gz 至服务器并解压缩
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| # 解压缩 tar -zxvf docker.tar.gz
# 安装 docker rpm -ivh --replacefiles --replacepkgs docker/*.rpm
# 启动 docker 并设置开启启动 systemctl enable docker systemctl start docker
# 配置 docker cgroupdriver 为 systemd cat > /etc/docker/daemon.json << EOF { "exec-opts": ["native.cgroupdriver=systemd"] } EOF
后续使用 kubeadm 搭建的 k8s 集群,默认使用 systemd 作为 cgroupdriver,这里保持一致
# 重启 docker systemctl restart docker
|
Kubernetes
在 server 3 的 centos 容器中下载 Kubernetes 所需组件
- kubectl: k8s 中的命令行工具
- kubelet: 在集群中 Worker Node (Node) 上运行的代理,确保容器在 Pod 中运行
- kubeadm: 用于构建 k8s 集群
- kube-proxy: 在集群中 Worker Node (Node) 上运行的网络代理,确保从集群内/外可访问 Pod
- kube-apiserver: 属于集群中 Master Node (Control Plane) 的 front end
- etcd: 在集群中 Master Node (Control Plane) 上运行的一致性高可用 key/value 存储,保存所有的集群数据
- kube-scheduler: 用于监听新创建的未分配 Worker Node (Node) 的 Pod,并将其调度到合适的 Worker Node (Node) 中,运行在集群中的 Master Node (Control Plane) 上
- kube-controller-manager: 运行在集群中的 Master Node (Control Plane) 上,包括 Deployment Controller / Node controller / Replica controller / EndpointSlice controller / ServiceAccount controller 等
- pause: 也称为 infra 容器,在 Pod 中作为 Linux 命名空间共享的基础,并且为 Pod 提供 1 号进程
- coredns: 选择 coredns 为 k8s 集群提供 DNS 服务
- flannel: 选择 flannel 作为 CNI(Container Network Interface)的实现,完成跨主机容器通信
- cri-dockerd: docker engine wrapper 以符合 k8s CRI(Container Runtime Interface) 标准
On server 3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
| # 进入容器内部 docker exec -it centos /bin/sh
# 添加 k8s yum 源 cat >> /etc/yum.repos.d/kubernetes.repo << EOF [kubernetes] name=Kubernetes baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg EOF
# 缓存安装提速 yum makecache fast
# 下载 1.28.1-0.x86_64 版本的 第 1~3 组件 yum install --downloadonly --downloaddir=/root/k8s kubectl-1.28.1-0.x86_64 kubeadm-1.28.1-0.x86_64 kubelet-1.28.1-0.x86_64
# 导出 k8s 依赖的第 4~10 docker image 组件 docker pull --platform=linux/amd64 registry.k8s.io/pause:3.9 docker save registry.k8s.io/pause:3.9 > /root/k8s/k8s-images/pause.tar
docker pull --platform=linux/amd64 registry.k8s.io/kube-apiserver:v1.28.1 docker save registry.k8s.io/kube-apiserver:v1.28.1 > /root/k8s/k8s-images/kube-apiserver.tar
docker pull --platform=linux/amd64 registry.k8s.io/kube-controller-manager:v1.28.1 docker save registry.k8s.io/kube-controller-manager:v1.28.1 > /root/k8s/k8s-images/kube-controller-manager.tar
docker pull --platform=linux/amd64 registry.k8s.io/kube-scheduler:v1.28.1 docker save registry.k8s.io/kube-scheduler:v1.28.1 > /root/k8s/k8s-images/kube-scheduler.tar
docker pull --platform=linux/amd64 registry.k8s.io/kube-proxy:v1.28.1 docker save registry.k8s.io/kube-proxy:v1.28.1 > /root/k8s/k8s-images/kube-proxy.tar
docker pull --platform=linux/amd64 registry.k8s.io/etcd:3.5.9-0 docker save registry.k8s.io/etcd:3.5.9-0 > /root/k8s/k8s-images/etcd.tar
docker pull --platform=linux/amd64 registry.k8s.io/coredns/coredns:v1.10.1 docker save registry.k8s.io/coredns/coredns:v1.10.1 > /root/k8s/k8s-images/coredns.tar
# 下载 k8s 依赖的 kube-flannel.yml wget -P /root/k8s/k8s-flannel https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
# 导出 flannel 依赖的 docker image 组件 cat kube-flannel.yml | grep image image: docker.io/flannel/flannel-cni-plugin:v1.2.0 image: docker.io/flannel/flannel:v0.22.2 image: docker.io/flannel/flannel:v0.22.2
docker pull --platform=linux/amd64 docker.io/flannel/flannel:v0.22.2 docker save docker.io/flannel/flannel:v0.22.2 > /root/k8s/k8s-flannel/flannel.tar
docker pull --platform=linux/amd64 docker.io/flannel/flannel-cni-plugin:v1.2.0 docker save docker.io/flannel/flannel-cni-plugin:v1.2.0 > /root/k8s/k8s-flannel/flannel-cni-plugin.tar
# 下载 v0.3.4 版本的 cri-dockerd wget -P /root/k8s/k8s-cri-dockerd https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.4/cri-dockerd-0.3.4-3.el7.x86_64.rpm
# 压缩 k8s 安装依赖 tar -zcvf k8s.tar.gz k8s
# 拷贝 k8s.tar.gz 至宿主机 docker cp centos:/root/k8s.tar.gz downloads
|
On server 1
安装 k8s 的一些配置操作,server 2 和 server 1 进行同样操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
| # 关闭防火墙 systemctl stop firewalld systemctl disable firewalld
# 关闭 selinux setenforce 0 sed -i 's/enforcing/disabled/' /etc/selinux/config
# 关闭 swap swapoff -a sed -ri 's/.swap./#&/' /etc/fsta
# 添加 hosts cat >> /etc/hosts << EOF 192.168.1.20 master-01 192.168.1.21 worker-01 EOF
# 网络配置 cat > /etc/sysctl.d/k8s.conf << EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF echo 1 > /proc/sys/net/ipv4/ip_forward
# 重新加载配置 modprobe br_netfilter sysctl --system
# 拷贝 k8s.tar.gz 至服务器并解压缩 tar -zxvf k8s.tar.gz
# 安装 k8s rpm -ivh --replacefiles --replacepkgs k8s/*.rpm
# 设置 kubelet 开机启动 systemctl enable kubelet
# 开启 kubectl 命令补全 source <(kubectl completion bash) kubectl completion bash > /etc/bash_completion.d/kubectl
# 版本查看 kubectl version Client Version: v1.28.1 ----------------------- kubelet --version Kubernetes v1.28.1
# 导入 k8s 依赖镜像 docker load < k8s/k8s-images/pause.tar docker load < k8s/k8s-images/kube-apiserver.tar docker load < k8s/k8s-images/kube-controller-manager.tar docker load < k8s/k8s-images/kube-scheduler.tar docker load < k8s/k8s-images/kube-proxy.tar docker load < k8s/k8s-images/etcd.tar docker load < k8s/k8s-images/coredns.tar docker load < k8s/k8s-flannel/flannel-cni-plugin.tar docker laod < k8s/k8s-flannel/flannel.tar
# 安装 cri-dockerd rpm -ivh --replacefiles --replacepkgs k8s/k8s-cri-dockerd/*.rpm
# 启动 cri-dockerd systemctl enable cri-docker.socket systemctl start cri-docker.socket cri-docker
# 查看 cri-docker 状况 systemctl status cri-docker ● cri-docker.service - CRI Interface for Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/cri-docker.service; enabled; vendor preset: disabled) Active: active (running) since Wed 2023-09-06 20:48:16 CST; 4min 8s ago Docs: https://docs.mirantis.com Main PID: 236691 (cri-dockerd) Tasks: 13 Memory: 14.1M CGroup: /system.slice/cri-docker.service └─236691 /usr/bin/cri-dockerd --container-runtime-endpoint fd://
# 修改 cri-docker.service 中的 ExecStart ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --network-plugin=cni --pod-infra-container-image=registry.k8s.io/pause:3.9
1. --network-plugin: 更改网络插件使用 cni, 因为默认的 kubenet 没有实现跨 Node 的网络访问 2. --pod-infra-container-image: 更改 infra 容器景象版本及 pause 版本
# 重启 cri-docker systemctl daemon-reload systemclt restart cri-docker
|
K8s 集群配置
使用 kubeadm 进行集群创建
On server 1
仅在 server 1 上进行如下操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| # 初始化 master node kubeadm init --kubernetes-version=v1.28.1 --apiserver-advertise-address=192.168.1.20 --pod-network-cidr=10.10.0.0/16 --cri-socket=unix:///var/run/cri-dockerd.sock
1. --apiserver-advertise-address: 指定 server 1 ip 2. --pod-network-cidr: 指定 Pod 网络段 3. --cri-socket: 指定使用 docker engine 作为 k8s container runtime
# 按提示进行配置 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
# 创建 Node Join Token kubeadm token create --print-join-command
# 修改 kube-flannel.yml net-conf.json: | { "Network": "10.10.0.0/16", // 与 --pod-network-cidr 设置一致 "Backend": { "Type": "vxlan" } }
# 部署 kube-flannel.yml kubectl apply -f kube-flannel.yml
|
On server 2
仅在 server 2 上进行如下操作
1 2 3 4 5 6 7 8 9 10
| # Worker Node 加入集群 kubeadm join 192.168.1.20:6443 --token mpyekp.e32b91pvl2itcld8 --discovery-token-ca-cert-hash sha256:932b2c4bda8597bfe2daf75c7dde53ae1bb5e55b488beaf628a18526d3a1c334 --cri-socket=unix:///var/run/cri-dockerd.sock
# 配置 crictl cat > /etc/crictl.yaml << EOF runtime-endpoint: unix:///var/run/cri-dockerd.sock image-endpoint: unix:///var/run/cri-dockerd.sock timeout: 10 debug: false EOF
|