Kubernetes Cluster With Docker | 8lovelife's life
0%

Kubernetes Cluster With Docker

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 所需组件

  1. kubectl: k8s 中的命令行工具
  2. kubelet: 在集群中 Worker Node (Node) 上运行的代理,确保容器在 Pod 中运行
  3. kubeadm: 用于构建 k8s 集群
  4. kube-proxy: 在集群中 Worker Node (Node) 上运行的网络代理,确保从集群内/外可访问 Pod
  5. kube-apiserver: 属于集群中 Master Node (Control Plane) 的 front end
  6. etcd: 在集群中 Master Node (Control Plane) 上运行的一致性高可用 key/value 存储,保存所有的集群数据
  7. kube-scheduler: 用于监听新创建的未分配 Worker Node (Node) 的 Pod,并将其调度到合适的 Worker Node (Node) 中,运行在集群中的 Master Node (Control Plane) 上
  8. kube-controller-manager: 运行在集群中的 Master Node (Control Plane) 上,包括 Deployment Controller / Node controller / Replica controller / EndpointSlice controller / ServiceAccount controller 等
  9. pause: 也称为 infra 容器,在 Pod 中作为 Linux 命名空间共享的基础,并且为 Pod 提供 1 号进程
  10. coredns: 选择 coredns 为 k8s 集群提供 DNS 服务
  11. flannel: 选择 flannel 作为 CNI(Container Network Interface)的实现,完成跨主机容器通信
  12. 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