有没有那么一首歌会让你轻轻跟着和

牵动我们共同过去记忆它不会沉默

有没有那么一首歌会让你心里记着我

就算日子匆匆过去我们曾走过

安装环境

操作系统

CentOS 10

master node1 node2
192.168.222.155/24 192.168.222.156/24 192.168.222.157/24

环境准备

这里我用MobaXterm连接三台虚拟机

MobaXterm的Multi-execution mode 可以同时操纵三台机器

image-20250716101404364

关闭防火墙与selinux

关闭防火墙

1
systemctl stop firewalld && systemctl disabale firewalld && iptables -F

image-20250716101826513

关闭selinux

1
sed -i 's/enforcing/disabled/' /etc/selinux/config && setenforce 0

image-20250716102358161

关闭swap分区

临时关闭

1
swapoff -a

永久关闭swap

1
sed -ri 's/.*swap.*/#&/' /etc/fstab

永久关闭是需要 重启才能生效的

image-20250716102705949

修改hosts文件

设置主机名

这里mater、node1、node2节点主机名我就分别设置为mater、node1、node2了。

1
2
3
4
5
6
#master 节点
hostnamectl set-hostname master
#node1 节点
hostnamectl set-hostname node1
#node2 节点
hostnamectl set-hostname node2

image-20250716103438596

修改hosts文件

加入

1
2
3
192.168.222.155 master
192.168.222.156 node1
192.168.222.157 node2

image-20250716103614162

修改内核参数

1
2
3
4
5
6
7
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

sysctl --system

image-20250716103751129

加载ip_vs内核模块

1
2
3
4
5
6
7
8
modprobe ip_vs
modprobe ip_vs_rr
modprobe ip_vs_wrr
modprobe ip_vs_sh
modprobe nf_conntrack
modprobe br_netfilter
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
echo 1 > /proc/sys/net/ipv4/ip_forward

image-20250716104220757

设置开机自启动

1
2
3
4
5
6
7
cat > /etc/modules-load.d/ip_vs.conf << EOF 
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
EOF

image-20250716104331529

安装docker

配置yum源

1
2
3
4
#下载 wget 
yum install wget -y
#从阿里云镜像站下载docker官方的yum源配置文件
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo

image-20250716110231515

安装docker

1
yum install docker-ce docker-ce-cli -y

编辑/etc/docker/daemon.json

DockerHub 国内加速镜像列表

1
2
3
4
5
6
7
8
9
10
11
12
mkdir /etc/docker/ 
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://docker.mybacc.com","https://docker.1ms.run"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF

启动docker服务

1
systemctl daemon-reload && systemctl enable docker && systemctl start docker

安装Kubernetes

配置yum源

1
2
3
4
5
6
7
8
9
10
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

image-20250716112609498

安装kubeadm、kubelet、kubectl

1
2
3
4
5
6
7
8
#列出所有版本
yum list kubelet --showduplicates

#指定版本安装
yum install -y kubelet-1.28.2 kubeadm-1.28.2 kubectl-1.28.2 --nogpgcheck

#设置开机自启
systemctl enable kubelet

image-20250716112858648

配置CRI

配置containerd

导出containerd默认配置到/etc/containerd/config.toml

1
containerd config default > /etc/containerd/config.toml 该方式已弃用

sandbox_image 是 Kubernetes 用来作为 Pod “沙箱”的 pause 容器镜像。里指定了一个国内阿里云镜像地址

1
2
[plugins."io.containerd.grpc.v1.cri"]
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"

image-20250716113834079

让 containerd 使用 systemd 管理 cgroup,和现代 Linux 系统及 Kubernetes 要求保持一致,避免资源管理问题。

1
2
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true

image-20250716114047551

配置镜像加速器

创建目录 /etc/containerd/certs.d/docker.io/

1
mkdir -p /etc/containerd/certs.d/docker.io

创建配置文件/etc/containerd/certs.d/docker.io/hosts.toml

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
server = "https://docker.io"

[host."https://docker.1ms.run"]
capabilities = ["pull", "resolve"]
skip_verify = true

[host."https://docker.mybacc.com"]
capabilities = ["pull", "resolve"]
skip_verify = true

[host."https://dytt.online"]
capabilities = ["pull", "resolve"]
skip_verify = true

[host."https://lispy.org"]
capabilities = ["pull", "resolve"]
skip_verify = true

[host."https://docker.xiaogenban1993.com"]
capabilities = ["pull", "resolve"]
skip_verify = true

[host."https://docker.yomansunter.com"]
capabilities = ["pull", "resolve"]
skip_verify = true

[host."https://aicarbon.xyz"]
capabilities = ["pull", "resolve"]
skip_verify = true

[host."https://666860.xyz"]
capabilities = ["pull", "resolve"]
skip_verify = true

[host."https://docker.zhai.cm"]
capabilities = ["pull", "resolve"]
skip_verify = true

[host."https://a.ussh.net"]
capabilities = ["pull", "resolve"]
skip_verify = true

[host."https://hub.littlediary.cn"]
capabilities = ["pull", "resolve"]
skip_verify = true

[host."https://hub.rat.dev"]
capabilities = ["pull", "resolve"]
skip_verify = true

[host."https://docker.m.daocloud.io"]
capabilities = ["pull", "resolve"]
skip_verify = true

重启 containerd

1
systemctl daemon-reexec && systemctl restart containerd && systemctl enable containerd

image-20250716114607079

验证 CRI 是否启用

1
ctr plugins list | grep cri

输出应包含

1
io.containerd.grpc.v1.cri         -          ok

image-20250716120239454

确保 containerd 启动成功并监听 CRI socket

确认是否有以下文件存在

1
ls /run/containerd/containerd.sock

如果存在,尝试运行:

1
crictl --runtime-endpoint=unix:///run/containerd/containerd.sock ps -a

image-20250716120400279

部署Kubernetes Master节点

初始化master节点

1
2
3
4
5
6
7
kubeadm init \
--kubernetes-version=1.28.2 \
--apiserver-advertise-address=192.168.222.155 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=10.244.0.0/16 \
--image-repository=registry.aliyuncs.com/google_containers \
--ignore-preflight-errors=Mem
参数 含义
kubeadm init 初始化 Kubernetes 主节点(control-plane),启动控制平面组件和 etcd
--kubernetes-version=1.28.2 指定安装的 Kubernetes 版本为 v1.28.2
--apiserver-advertise-address=192.168.222.155 指定 kube-apiserver 对外通告的 IP 地址,通常为主节点的内网 IP
--service-cidr=10.96.0.0/16 指定 Service 虚拟 IP 地址的网段,集群内部用于服务发现
--pod-network-cidr=10.244.0.0/16 指定 Pod 网络地址范围,需与所选网络插件(如 Flannel)兼容
--image-repository=registry.aliyuncs.com/google_containers 替换默认镜像仓库地址,使用阿里云镜像源加速国内拉取
--ignore-preflight-errors=Mem 忽略内存预检错误(比如内存小于推荐值),常用于低配测试环境

image-20250716145253213

配置kubectl

执行初始化成功之后给出的三条命令

image-20250716145458839

1
2
3
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

image-20250716145723436

查看节点信息

只能看到master节点信息等其他节点加入进来之后就能看到其他节点的信息了

image-20250716150029230

安装flannel

1
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml

为 Kubernetes 集群安装 Flannel 网络插件。Flannel 是一种常用的 Kubernetes 容器网络插件(CNI),用于实现 Pod 之间的网络通信。

image-20250716150806190

Node节点加入集群

在node1、node2上面都执行

1
2
kubeadm join 192.168.222.155:6443 --token 18d5th.zv9sunrhfwz4ftip \
--discovery-token-ca-cert-hash sha256:dfd6ba9b6071485d05f97637bfd719de7ed68964569887d4a9d7c7aab27d3bff

然后再次在master节点上使用kubectl get nodes命令就能看到node节点的信息

image-20250716151128856

然后也可以给node1与node2打上角色标签

1
2
kubectl label node node1 node-role.kubernetes.io/worker=worker
kubectl label node node2 node-role.kubernetes.io/worker=worker

image-20250716151357912

简单部署一个应用

部署一个nginx应用

1
2
3
4
5
#这个命令会创建一个名为 `nginx-test` 的 Deployment,里面运行官方的 Nginx 镜像。
kubectl create deployment nginx-test --image=nginx

#这会创建一个 Service,通过集群节点的某个端口暴露 Nginx。
kubectl expose deployment nginx-test --port=80 --type=NodePort

image-20250716152455674

查看服务详细

1
kubectl get svc nginx-test

image-20250716152549539

在集群外部

使用浏览器访问 <节点ip>:30381就能访问到nginx

image-20250716154356890

image-20250716154407716

image-20250716154417729

三个节点的ip全能够访问