外观
搭建 Kubernetes 集群
集群节点前置准备
想要 Kubernetes 正常部署运行,还需要做一些前置的初始化操作。
并且 Kubernetes 后续会使用 K8S代称。
服务器硬件建议
官方建议参考:
- 每台机器 2 GB 或更多的 RAM(如果少于这个数字将会影响你应用的运行内存)。
- 控制平面机器需要 CPU 2 核心或更多。
我这边结合自身条件,在同一网段下,准备了三台 Rocky 9.4 系统的服务器。
3 台服务器(虚拟机)
服务器名称 ip地址 硬件情况 备注 master 10.10.22.150 8核16G,100G系统盘、100G数据盘 node1 10.10.22.151 8核16G,100G系统盘、100G数据盘 node2 10.10.22.152 4核8G,100G系统盘、100G数据盘 三台服务器处于同一网段,网络互通。
服务器系统环境准备
关闭防火墙(可选放行必要的端口)
我这里是内网测试环境,有额外防火墙进行安全组防御,也为了方便后续操作,所以是直接关闭了防火墙,但是实际上,如果是生产环境中,则不能直接鲁莽的关闭防火墙,而是根据官方建议,启用这些必要的端口后才能使 Kubernetes 的各组件相互通信。
bash
systemctl stop firewalld
systemctl disable firewalld1
2
2
关闭 Selinux(强制)
因为我集群节点都是 Rocky 系统,所以必须该配置。如果非红帽系列的版本(如Ubuntu、Debian等)则可跳过该配置。
bash
# 将 SELinux 设置为 permissive 模式(相当于将其禁用)
setenforce 0 # 临时
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config # 永久1
2
3
2
3
关闭 Swap 交换分区(强制)
bash
swapoff -a # 临时
sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久1
2
2
关闭完swap后,一定要重启一下虚拟机!!!
kubelet 的默认行为是在节点上检测到交换内存时无法启动。 这意味着要么禁用交换(swap)功能,要么让 kubelet 容忍交换。所以遵循简单必要原则,直接关闭交换分区。
对于特殊情况,也可以在 kubelet 配置文件中添加 failSwapOn: false 跳过检验,具体请参考官方吧。
参考链接:
时间同步(集群节点同步操作)
bash
yum install ntpdate -y
ntpdate time.windows.com1
2
2
根据规划设置主机名 (集群节点同步操作)
bash
hostnamectl set-hostname nightingale
hostnamectl set-hostname ragflow
hostnamectl set-hostname dify
# 直接运行下面的命令,记得将IP地址修改为自己机器的IP地址,主机名字也换成自己的
cat >> /etc/hosts << EOF
10.10.22.150 nightingale
10.10.22.151 ragflow
10.10.22.152 dify
EOF1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
数据盘格式化和挂载(集群节点同步操作)
bash
[root@nightingale ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 100G 0 disk
├─sda1 8:1 0 600M 0 part /boot/efi
├─sda2 8:2 0 1G 0 part /boot
└─sda3 8:3 0 98.4G 0 part
├─rl-root 253:0 0 60.8G 0 lvm /
├─rl-swap 253:1 0 7.9G 0 lvm
└─rl-home 253:2 0 29.7G 0 lvm /home
sdb 8:16 0 100G 0 disk
sr0 11:0 1 1024M 0 rom
# 创建 lvm 逻辑卷
[root@nightingale /]# pvcreate /dev/sdb
Physical volume "/dev/sdb" successfully created.
[root@nightingale /]# vgcreate docker /dev/sdb
Volume group "docker" successfully created
[root@nightingale /]# lvcreate -l 100%FREE -n lv-docker docker
Logical volume "lv-docker" created.
# 格式化数据盘
[root@nightingale /]# mkfs.xfs /dev/mapper/docker-lv--docker
meta-data=/dev/mapper/docker-lv--docker isize=512 agcount=4, agsize=6553344 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1 bigtime=1 inobtcount=1 nrext64=0
data = bsize=4096 blocks=26213376, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=16384, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
Discarding blocks...Done.
# 临时挂载
[root@nightingale /]# mount /dev/mapper/docker-lv--docker /docker
# 永久挂载
[root@nightingale /]# echo "/dev/mapper/docker-lv--docker /docker xfs defaults 0 0" >> /etc/fstab
[root@nightingale /]# systemctl daemon-reload
[root@nightingale /]# mount -a
[root@nightingale /]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs tmpfs 7.7G 0 7.7G 0% /dev/shm
tmpfs tmpfs 3.1G 8.7M 3.1G 1% /run
/dev/mapper/rl-root xfs 61G 2.0G 59G 4% /
/dev/sda2 xfs 960M 218M 743M 23% /boot
/dev/sda1 vfat 599M 7.1M 592M 2% /boot/efi
/dev/mapper/rl-home xfs 30G 244M 30G 1% /home
tmpfs tmpfs 1.6G 0 1.6G 0% /run/user/0
/dev/mapper/docker-lv--docker xfs 100G 746M 100G 1% /docker1
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
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
安装 kubeadm、kubelet 和 kubectl
首先,学习 Kubernetes (后续会使用K8S代称) 集群管理的人,都会有一个大概的印象:Docker 是单主机的容器集群管理,而 K8S 则是负责管理多主机的容器集群。在 Docker 单节点中,我们只需要使用其本身的服务命令即可,而在 K8S 的集群部署和管理过程中,我们会接触到三个工具,分别用来进行集群的初始化、集群节点上的容器控制、集群之间的通信:
kubeadm:用来初始化集群的指令,主要用于集群的控制面板初始化、集群节点的增删以及集群的升级。kubelet:在集群中的每个节点上用来启动 Pod 和容器等。kubectl:用来与集群通信的命令行工具。
安装基础软件(所有节点)
添加清华的kubernetes源
具体要安装哪个版本把下面的
v1.32修改一下就好。
bash
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=kubernetes
baseurl=https://mirrors.tuna.tsinghua.edu.cn/kubernetes/yum/repos/kubernetes-el7-
name=Kubernetes
baseurl=https://mirrors.tuna.tsinghua.edu.cn/kubernetes/core:/stable:/v1.32/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.tuna.tsinghua.edu.cn/kubernetes/core:/stable:/v1.32/rpm/repodata/repomd.xml.key
EOF1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
安装 Docker 作为容器运行时
自 1.24 版起,Dockershim 已从 Kubernetes 项目中移除
Kubernetes 中的 Pod 必须基于一个容器运行时上去运行,而大部分学习 K8S 的都是从 Docker 过渡而来的,所以本次也是使用 Docker 作为容器运行时。
容器运行时参考:容器运行时 | Kubernetes
前置条件
将桥接的IPv4流量传递到iptables的链 (集群节点同步操作)
bashcat > /etc/sysctl.d/k8s.conf << EOF net.ipv4.ip_forward = 1 net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF sysctl --system # 生效1
2
3
4
5
6
7
安装 Docker 并配置 systemd cgroup 驱动
你需要确保容器运行时和 kubelet 所使用的是相同的 cgroup 驱动,否则 kubelet 进程会失败
参考链接:
bash
#下载对应工具,方便直接下载 docekr 的 repo
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#下载 docker ,默认下载最新( ce 是社区版本,免费)
yum -y install docker-ce
#启动 docker 并设置自启动
systemctl enable docker --now
#配置 docker 镜像加速器,默认官方镜像下载,所以为了提高下载速度,修改为国外镜像下载源
tee /etc/docker/daemon.json <<'EOF'
{
"data-root": "/docker/docker_data/",
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": [
"https://docker.1panel.live",
"https://hub.mirrorify.net",
"https://docker.m.daocloud.io",
"https://registry.dockermirror.com",
"https://docker.aityp.com/",
"https://docker.anyhub.us.kg",
"https://dockerhub.icu",
"https://docker.awsl9527.cn"
]
}
EOF
# 使配置文件生效和重启 docker
systemctl daemon-reload
systemctl restart docker1
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
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
安装 kubeadm、kubelet、kubectl
bash
yum install -y kubelet-1.32.3 kubeadm-1.32.3 kubectl-1.32.3
systemctl enable kubelet
#查看需要安装哪些镜像
kubeadm config images list --kubernetes-version=v1.32.3
# 配置关闭 Docker 的 cgroups,修改 /etc/docker/daemon.json,加入以下内容,此步已经在上面配置好了。
"exec-opts": ["native.cgroupdriver=systemd"]
# 重启 docker
systemctl daemon-reload
systemctl restart docker1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
安装 cri-dockerd
bash
# 安装 go 环境, Go 环境到至少 1.23.7 才能成功编译 cri-dockerd 项目
wget https://mirrors.aliyun.com/golang/go1.24.2.linux-amd64.tar.gz
tar -zxvf go1.24.2.linux-amd64.tar.gz -C /usr/bin/
export PATH=$PATH:/usr/bin/go/bin
source ~/.bashrc1
2
3
4
5
2
3
4
5
bash
# 编译安装 cri-dockerd
git clone https://github.com/Mirantis/cri-dockerd.git
cd cri-dockerd
mkdir bin
go build -o bin/cri-dockerd
mkdir -p /usr/local/bin
install -o root -g root -m 0755 bin/cri-dockerd /usr/local/bin/cri-dockerd
cp -a packaging/systemd/* /etc/systemd/system
sed -i -e 's,/usr/bin/cri-dockerd,/usr/local/bin/cri-dockerd,' /etc/systemd/system/cri-docker.service
#需要进入文件将 ExecStart 的内容追加 --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9
ExecStart=/usr/local/bin/cri-dockerd --container-runtime-endpoint fd:// --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.91
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
/etc/systemd/system/cri-docker.service配置文件修改后的具体内容
bash
[root@dify ~]# cat /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/local/bin/cri-dockerd --container-runtime-endpoint fd:// --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9
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.target1
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
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
- [Kubeadm初始化遇到的坑:[ERROR CRI]: container runtime is not running:-CSDN博客](https://blog.csdn.net/realize_dream/article/details/127284864#:~:text=需要追加–network-plugin%3Dcni,通过该配置告诉容器,使用kubernetes的网络接口。 %23 追加 ExecStart%3D%2Fusr%2Flocal%2Fbin%2Fcri-dockerd --container-runtime-endpoint,fd%3A%2F%2F --network-plugin %3Dcni --pod-infra-container-image %3Dkubebiz%2Fpause%3A3.8)
bash
# 启动
systemctl daemon-reload
systemctl enable cri-docker.service
systemctl enable --now cri-docker.socket
systemctl restart docker
systemctl restart cri-docker
# 验证
systemctl status docker
systemctl status cri-docker
systemctl status kubelet1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
- 重要配置文件的检查
bash
#cri-docker的自启动配置文件
/etc/systemd/system/cri-docker.service
#docker的配置文件
/etc/docker/daemon.json
#kubelet的配置文件
/usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf1
2
3
4
5
6
2
3
4
5
6
- 如果
crictl ps有问题,那么就需要修改相关配置文件
bash
cat << EOF | tee /etc/crictl.yaml
runtime-endpoint: "unix:///var/run/cri-dockerd.sock"
timeout: 0
debug: false
EOF1
2
3
4
5
2
3
4
5
- 重置k8s环境
bash
#如果init初始化过程中有问题,需要重置
# 执行kubeadm reset
kubeadm reset --cri-socket unix:///var/run/cri-dockerd.sock --force
# 手动删除所有kubernetes相关配置文件
rm -rf /etc/kubernetes/
rm -rf /var/lib/kubelet/
rm -rf /var/lib/etcd/
rm -rf $HOME/.kube/
# 如果有必要可以重新安装相关k8s相关软件
#yum remove -y kubelet kubeadm kubectl
#yum install -y kubelet kubeadm kubectl
#重启
systemctl daemon-reload
systemctl restart docker
systemctl restart cri-docker
systemctl restart kubelet1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
部署 Kubernetes Master
bash
# 在 Master 节点下执行
kubeadm init \
--apiserver-advertise-address=10.10.22.152 \
--kubernetes-version v1.32.3 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--image-repository=registry.aliyuncs.com/google_containers \
--cri-socket unix:///var/run/cri-dockerd.sock \
--v=9
# 安装成功后,复制如下配置并执行
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubectl get nodes1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
加入 Kubernetes Node
bash
#分别在 k8s-node1 和 k8s-node2 执行
# 下方命令可以在 k8s master 控制台初始化成功后复制 join 命令
kubeadm join 10.10.22.152:6443 --token z8rhe5.mlt3b0iwhqrtelm6 \
--discovery-token-ca-cert-hash sha256:5938fe9136b3e774c4c0733b5d27accc6e34dec95917934f7831e97abc9b4683 \
--cri-socket unix:///var/run/cri-dockerd.sock
# 如果初始化的 token 不小心清空了,可以通过如下命令获取或者重新申请
# 如果 token 已经过期,就重新申请
kubeadm token create
# token 没有过期可以通过如下命令获取
kubeadm token list1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
部署 CNI 网络插件
bash
# 在 master 节点上执行
# 下载 calico 配置文件,可能会网络超时
wget https://docs.projectcalico.org/manifests/calico.yaml
# 修改 calico.yaml 文件中的 CALICO_IPV4POOL_CIDR 配置,修改为与初始化的 cidr 相同,也就是pod-network-cidr参数
# 修改 IP_AUTODETECTION_METHOD 下的网卡名称
# 删除镜像 docker.io/ 前缀,避免下载过慢导致失败
sed -i 's#docker.io/##g' calico.yaml
# 应用
kubectl apply -f calico.yaml1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
测试 kubernetes 集群
bash
# 创建部署
kubectl create deployment nginx --image=nginx
# 暴露端口
kubectl expose deployment nginx --port=80 --type=NodePort
# 查看 pod 以及服务信息
kubectl get pod,svc1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
补全执行命令
bash
yum -y install bash-completion
source /usr/share/bash-completion/bash_completion
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc1
2
3
4
5
6
7
2
3
4
5
6
7
互动评论 (0)