2.Kubernetes集群环境搭建部署

2.1 k8s中容器的管理方式

2.1.1 Kubernetes集群创建方式

centainerd

默认情况下,K8S在创建集群时使用的方式

docker

Docker使用的普记录最高,虽然K8S在1.24版本后已经费力了kubelet对docker的支持,但时可以借助cri-docker方式来实现集群创建

cri-o

CRI-O的方式是Kubernetes创建容器最直接的一种方式,在创建集群的时候,需要借助于cri-o插件的方式来实现Kubernetes集群的创建。

[!NOTE]

docker 和cri-o 这两种方式要对kubelet程序的启动参数进行设置

2.2 k8s 集群部署

2.2.1 k8s环境部署说明

K8S中文官网:https://kubernetes.io/zh-cn/

主机名 ip 角色
reg.dhj.org 172.25.254.200 harbor仓库
k8s-master 172.25.254.100 master,k8s集群控制节点
k8s-node1 172.25.254.10 worker,k8s集群工作节点
k8s-node2 172.25.254.20 worker,k8s集群工作节点
  • 所有节点禁用selinux和防火墙
  • 所有节点同步时间和解析
  • 所有节点安装docker-ce
  • 所有节点禁用swap,注意注释掉/etc/fstab文件中的定义
2.2.2 K8s–harbor主机

以下Docker章节都有,以下只是做了整合,方便查阅

# 以下火墙及selinux每个主机都得关
[root@docker-harbor ~]# systemctl disable --now firewalld
Removed "/etc/systemd/system/multi-user.target.wants/firewalld.service".
Removed "/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service".
[root@docker-harbor ~]# getenforce
Disabled

[root@docker-harbor ~]# cd /etc/yum.repos.d
[root@docker-harbor yum.repos.d]# vim docker.repo
[root@docker-harbor yum.repos.d]# cat docker.repo
[docker]
name = docker-ce
baseurl = https://mirrors.aliyun.com/docker-ce/linux/rhel/9/x86_64/stable
gpgcheck = 0

[root@docker-harbor yum.repos.d]# yum makecache

[root@docker-harbor yum.repos.d]# rpm -qa | grep podman
podman-4.6.1-5.el9.x86_64
cockpit-podman-76-1.el9_3.noarch

[root@docker-harbor yum.repos.d]# rm -rf podman-4.6.1-5.el9.x86_64
[root@docker-harbor yum.repos.d]# rm -rf cockpit-podman-76-1.el9_3.noarch

# 上传所需文件
[root@docker-harbor ~]# cd /mnt/
[root@docker-harbor mnt]# ls
docker.tar.gz  packages.zip

[root@docker-harbor mnt]# tar zxf docker.tar.gz
[root@docker-harbor mnt]# unzip packages.zip

[root@docker-harbor mnt]# ls
docker  docker.tar.gz packages  packages.zip
[root@docker-harbor mnt]# cd docker/

[root@docker-harbor docker]# yum install *.rpm -y

# 在第15行命令,在后面加上参数 --iptables=true
[root@docker-harbor docker]# vim /usr/lib/systemd/system/docker.service
15 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --iptables=true

[root@docker-harbor docker]# systemctl daemon-reload
[root@docker-harbor docker]# systemctl restart docker
[root@docker-harbor docker]# echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf
[root@docker-harbor docker]# sysctl -p
net.ipv4.ip_forward = 1

[root@docker-harbor docker]# systemctl  enable --now docker

[root@docker-harbor docker]# docker info
# 以下除了rhel9不需要做,其他版本的系统建议去做
# 激活内核网络选项
]# echo br_netfilter > /etc/modules-load.d/docker_mod.conf
]# modprobe br_netfilter
]# vim /etc/sysctl.d/docker.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1

]# sysctl --system
]# systemctl  restart docker
# 创建了证书与密钥
[root@docker-harbor ~]# mkdir -p /data/certs
[root@docker-harbor ~]#  openssl req -newkey  rsa:4096 \
-nodes -sha256 -keyout /data/certs/dhj.org.key \
-addext "subjectAltName = DNS:reg.dhj.org" \
-x509 -days 365 -out /data/certs/dhj.org.crt

Common Name (eg, your name or your server's hostname) []:reg.dhj.org

# 创建证书目录并部署信任证书(使Docker客户端信任私有仓库的HTTPS证书)
[root@docker-harbor ~]# mkdir /etc/docker/certs.d/reg.dhj.org/ -p
[root@docker-harbor ~]# cp /data/certs/dhj.org.crt  /etc/docker/certs.d/reg.dhj.org/ca.crt
[root@docker-harbor ~]# systemctl restart docker
[root@docker-harbor ~]# cd /mnt/packages/
[root@docker-harbor packages]# cp -p harbor-offline-installer-v2.5.4.tgz  /root

[root@docker-harbor packages]# cd
[root@docker-harbor ~]# tar zxf harbor-offline-installer-v2.5.4.tgz

[root@docker-harbor ~]# cd harbor
[root@docker-harbor harbor]# cp harbor.yml.tmpl harbor.yml

# 需要修改内容如下(如果一致,不变即可):
[root@docker-harbor harbor]# vim harbor.yml
  5 hostname: reg.dhj.org
 17   certificate: /data/certs/dhj.org.crt				# 看自己的存放位置
 18   private_key: /data/certs/dhj.org.key				# 看自己的存放位置
 34 harbor_admin_password: admin						# 初始密码
 47 data_volume: /data									# 此处挂载的目录(需要跟上面证书与密钥在一个目录下)


[root@docker-harbor harbor]# ./install.sh --with-chartmuseum
[root@docker-harbor harbor]# docker compose stop
[root@docker-harbor harbor]# docker compose up -d
# 去浏览器中去测试172.25.254.200
[root@docker-harbor ~]# cd /etc/docker/
[root@docker-harbor docker]# vim daemon.json
[root@docker-harbor docker]# cat daemon.json
{
        "registry-mirrors": ["https://reg.dhj.org"]
}

[root@docker-harbor docker]# systemctl restart docker

[root@k8s-harbor ~]# cd harbor/
[root@k8s-harbor harbor]# docker compose up -d

[root@docker-harbor harbor]# docker login reg.dhj.org
Username: admin
Password:admin
# 测试:上传一个镜像
[root@docker-harbor harbor]# cd
[root@docker-harbor ~]# cd /mnt/packages/

[root@docker-harbor packages]# docker load -i busybox-latest.tar.gz

[root@docker-harbor packages]# docker tag busybox:latest  reg.dhj.org/ceshi/busybox:latest
[root@docker-harbor packages]# docker push reg.dhj.org/ceshi/busybox:latest

# 查看是否上传成功
[root@docker-harbor packages]# curl -k https://reg.dhj.org/v2/_catalog -u admin:admin
{"repositories":["ceshi/busybox"]}

# 在浏览器中可以进行查看,如下图所示
# 成功即为部署完成!
# 创建一个k8s项目

image-20250810180806246

2.2.3 集群环境初始化

所有k8s集群节点执行以下步骤

2.2.3.0 关闭火墙及SELinux
2.2.3.1 所有禁用swap和本地解析
]# vim /etc/fstab
UUID=5b62292e-603b-467a-a1ad-160d612e6f81 /                       xfs     defaults        0 0
UUID=31c1cd5c-22a7-42e8-91d1-f36d1bc1edaa /boot                   xfs     defaults        0 0
# UUID=51600096-c0fa-4247-8d7f-6a40b6b05300 none                    swap    defaults        0 0		# 将最后一行注释掉即可

]# systemctl daemon-reload
]# systemctl mask swap.target
]# swapoff -a
]# swapon -s	# 没有显示内容即可(不保险的话:可以使用reboot之后,再次 swapon -s 查看)

[root@k8s-node1 ~]# vim /etc/hosts
172.25.254.10   k8s-node1
172.25.254.20   k8s-node2
172.25.254.100  k8s-master
172.25.254.200  reg.dhj.org

# 快速将每台主机部署
[root@k8s-node1 ~]# scp /etc/hosts root@172.25.254.20:/etc/hosts
[root@k8s-node1 ~]# scp /etc/hosts root@172.25.254.100:/etc/hosts
[root@k8s-node1 ~]# scp /etc/hosts root@172.25.254.200:/etc/hosts

image-20250810181156779

2.2.3.2 所有安装docker
[root@docker-harbor yum.repos.d]# rpm -qa | grep podman
podman-4.6.1-5.el9.x86_64
cockpit-podman-76-1.el9_3.noarch

[root@docker-harbor yum.repos.d]# rm -rf podman-4.6.1-5.el9.x86_64
[root@docker-harbor yum.repos.d]# rm -rf cockpit-podman-76-1.el9_3.noarch
# 之前harbor已经安装就不用管了,其余必须安装

]# vim /etc/yum.repos.d/docker.repo
[docker]
name=docker
baseurl=https://mirrors.aliyun.com/docker-ce/linux/rhel/9/x86_64/stable/
gpgcheck=0

]# yum makecache
]# dnf install docker-ce -y				# 此处要是不想安装的话,可以将harbor里面的东西使用scp复制过来即可。

# 在第15行命令,在后面加上参数 --iptables=true
]# vim /usr/lib/systemd/system/docker.service
15 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --iptables=true

]# systemctl daemon-reload
]# systemctl restart docker 
# 如果不想安装的话,执行以下命令
[root@reg ~]# cd /mnt/docker/
[root@reg docker]# scp * root@172.25.254.10:/mnt
[root@reg docker]# scp * root@172.25.254.20:/mnt
[root@reg docker]# scp * root@172.25.254.100:/mnt
]# dnf install -y /mnt/*.rpm


[root@k8s-master mnt]# vim /usr/lib/systemd/system/docker.service
15 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --iptables=true

[root@k8s-master mnt]# scp /usr/lib/systemd/system/docker.service root@172.25.254.10:/usr/lib/systemd/system/docker.service
[root@k8s-master mnt]# scp /usr/lib/systemd/system/docker.service root@172.25.254.20:/usr/lib/systemd/system/docker.service

]# systemctl daemon-reload
]# systemctl restart docker
2.2.3.3 (可选)所有节点设定docker的资源管理模式为systemd(rhel版本9不需要执行)
[root@k8s-master ~]# vim /etc/docker/daemon.json
{
        "registry-mirrors": ["https://reg.timinglee.org"],
        "exec-opts": ["native.cgroupdriver=systemd"],
        "log-driver": "json-file",
        "log-opts": {
                "max-size": "100m"
        },
        "storage-driver": "overlay2"
}
2.2.3.4 所有阶段复制harbor仓库中的证书并启动docker
]# mkdir /etc/docker/certs.d/reg.dhj.org/ -p
[root@reg ~]# scp /etc/docker/certs.d/reg.dhj.org/ca.crt root@172.25.254.10:/etc/docker/certs.d/reg.dhj.org/ca.crt
[root@reg ~]# scp /etc/docker/certs.d/reg.dhj.org/ca.crt root@172.25.254.20:/etc/docker/certs.d/reg.dhj.org/ca.crt
[root@reg ~]# scp /etc/docker/certs.d/reg.dhj.org/ca.crt root@172.25.254.100:/etc/docker/certs.d/reg.dhj.org/ca.crt
]# systemctl restart docker

]# systemctl enable --now docker

# 此时需要将docker作为我们的默认库
# 编写主机的镜像库的加速节点(这里以master主机为例,编写好之后进行scp即可)
[root@k8s-master ~]# cd /etc/docker/

[root@k8s-master docker]# vim daemon.json
{
        "registry-mirrors": ["https://reg.dhj.org"]
}

[root@k8s-master docker]# cd
[root@k8s-master ~]# scp /etc/docker/daemon.json root@172.25.254.10:/etc/docker/daemon.json
[root@k8s-master ~]# scp /etc/docker/daemon.json root@172.25.254.20:/etc/docker/daemon.json

]# systemctl restart docker

# 登陆harbor仓库
]# docker login reg.dhj.org
Username: admin
Password: admin

# 登录上去之后进行测试
]# docker info
# 此处要是显示Error response from daemon: Get "https://reg.dhj.org/v2/": dial tcp 172.25.254.200:443: connect: connection refused
# 可以在harbor主机中执行以下命令然后再次测试即可
[root@reg ~]# cd harbor/
[root@reg harbor]# docker compose stop
[root@reg harbor]# docker compose up -d
image-20250810190517124
2.2.3.5 安装K8S部署工具
# 部署软件仓库,添加K8S源
[root@k8s-master ~]# vim /etc/yum.repos.d/k8s.repo
[k8s]
name=k8s
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/rpm
gpgcheck=0

[root@k8s-master ~]# scp /etc/yum.repos.d/k8s.repo root@172.25.254.10:/etc/yum.repos.d/k8s.repo
[root@k8s-master ~]# scp /etc/yum.repos.d/k8s.repo root@172.25.254.20:/etc/yum.repos.d/k8s.repo

]# yum makecache

# 安装软件
]# dnf install kubelet-1.30.0 kubeadm-1.30.0 kubectl-1.30.0 -y
image-20250810193021869
2.2.3.6 设置kubectl命令补齐功能
]# dnf install bash-completion -y							# 此模块的操作步骤在master里面就行,其他没有太大的必要
]# echo "source <(kubectl completion bash)" >> ~/.bashrc
]# source  ~/.bashrc
2.2.3.7 在所有节点安装cri-docker

k8s从1.24版本开始移除了dockershim,所以需要安装cri-docker插件才能使用docker

软件下载:https://github.com/Mirantis/cri-dockerd

image-20250810191634538
# 现将上面的资源包放到系统/mnt里面
mnt]# ls
cri-dockerd-0.3.14-3.el8.x86_64.rpm  k8s-1.30.tar.gz  libcgroup-0.41-19.el8.x86_64.rpm

mnt]# dnf install libcgroup-0.41-19.el8.x86_64.rpm cri-dockerd-0.3.14-3.el8.x86_64.rpm -y

[root@k8s-master ~]# vim /lib/systemd/system/cri-docker.service
10 ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --network-plugin=cni --pod-infra-container-image=reg.dhj.org/k8s/pause:3.9			# 第10行:指定网络插件名称及基础容器镜像

[root@k8s-master ~]# scp /lib/systemd/system/cri-docker.service root@172.25.254.10:/lib/systemd/system/cri-docker.service
[root@k8s-master ~]# scp /lib/systemd/system/cri-docker.service root@172.25.254.20:/lib/systemd/system/cri-docker.service

]# systemctl daemon-reload
]# systemctl enable --now cri-docker
]# ll /var/run/cri-dockerd.sock				# cri-dockerd的套接字文件	

image-20250810192048107

2.2.3.8 在master节点拉取K8S所需镜像

方法1:或者直接使用资源包里面的

[root@k8s-master mnt]# cd /mnt/
[root@k8s-master mnt]# tar zxf k8s-1.30.tar.gz
[root@k8s-master mnt]# dnf install -y *.rpm

# 再次将资源包里面的东西上传
[root@k8s-master mnt]# ls
k8s_docker_images-1.30.tar

[root@k8s-master mnt]# docker load -i k8s_docker_images-1.30.tar

# 上传镜像到harbor仓库
[root@k8s-master ~]# docker images | awk '/google/{ print $1":"$2}' | awk -F "/" '{system("docker tag "$0" reg.dhj.org/k8s/"$3)}'
[root@k8s-master ~]# docker images  | awk '/k8s/{system("docker push "$1":"$2)}'

# 此时访问浏览器并刷新页面,查看镜像数目是否有变化

image-20250810230427077

image-20250810193859101

image-20250810194842869

方法2:使用国内镜像加速拉取

[root@k8s-master mnt]# cd /mnt/
[root@k8s-master mnt]# tar zxf k8s-1.30.tar.gz
[root@k8s-master mnt]# dnf install -y *.rpm

# 拉取k8s集群所需要的镜像
[root@k8s-master ~]# kubeadm config images pull \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.30.0 \
--cri-socket=unix:///var/run/cri-dockerd.sock

# 上传镜像到harbor仓库
[root@k8s-master ~]# docker images | awk '/google/{ print $1":"$2}' | awk -F "/" '{system("docker tag "$0" reg.dhj.org/k8s/"$3)}'
[root@k8s-master ~]# docker images  | awk '/k8s/{system("docker push "$1":"$2)}'	

# 效果是一样的
2.2.3.9 集群初始化
# 启动kubelet服务
]# systemctl enable --now kubelet.service
]# systemctl status kubelet.service	

# 执行初始化命令
[root@k8s-master ~]#]# kubeadm init --pod-network-cidr=10.244.0.0/16 \
--image-repository reg.dhj.org/k8s \
--kubernetes-version v1.30.0 \
--cri-socket=unix:///var/run/cri-dockerd.sock

# 指定集群配置文件变量
[root@k8s-master ~]# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
[root@k8s-master ~]# source ~/.bash_profile

# 当前节点没有就绪,因为还没有安装网络插件,容器没有运行
[root@k8s-master ~]# kubectl get node
NAME                       STATUS     ROLES           AGE     VERSION
k8s-master.timinglee.org   NotReady   control-plane   4m25s   v1.30.0
[root@k8s-master ~]# kubectl get pod -A
image-20250810230701024 image-20250810230736712

在此阶段如果生成的集群token找不到了可以重新生成

[root@k8s-master mnt]# kubeadm token create --print-join-command
kubeadm join 172.25.254.100:6443 --token hzol3l.co4jq70kifniewb1 --discovery-token-ca-cert-hash sha256:7c6ae3981484050792989e26bfd24fcc74711d3b2e26baebfbd7332ad0b5a50d
2.2.3.10 安装flannel网络插件

官方网站:https://github.com/flannel-io/flannel

# 资源包里面将剩余的撇到master里面
[root@k8s-master ~]# cd /mnt/
[root@k8s-master mnt]# docker load -i flannel-0.25.5.tag.gz

[root@k8s-master mnt]# docker tag flannel/flannel:v0.25.5  reg.dhj.org/flannel/flannel:v0.25.5
[root@k8s-master mnt]# docker push reg.dhj.org/flannel/flannel:v0.25.5

[root@k8s-master mnt]# docker tag flannel/flannel-cni-plugin:v1.5.1-flannel1  reg.dhj.org/flannel/flannel-cni-plugin:v1.5.1-flannel1
[root@k8s-master mnt]# docker push reg.dhj.org/flannel/flannel-cni-plugin:v1.5.1-flannel1
image-20250810211157346

image-20250810232107897

# 编辑kube-flannel.yml 修改镜像下载位置
[root@k8s-master mnt]# vim kube-flannel.yml

# 需要修改以下几行
[root@k8s-master ~]# grep -n image kube-flannel.yml
146:        image: reg.dhj.org/flannel/flannel:v0.25.5
173:        image: reg.dhj.org/flannel/flannel-cni-plugin:v1.5.1-flannel1
184:        image: reg.dhj.org/flannel/flannel:v0.25.5

#安装flannel网络插件
[root@k8s-master ~]# kubectl apply -f kube-flannel.yml


# 以下是使用官方仓库做法
# 下载flannel的yaml部署文件
[root@k8s-master ~]# wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

# 下载镜像:
[root@k8s-master ~]# docker pull docker.io/flannel/flannel:v0.25.5
[root@k8s-master ~]# docekr docker.io/flannel/flannel-cni-plugin:v1.5.1-flannel1

# 上传镜像到仓库
[root@k8s-master ~]# docker tag flannel/flannel:v0.25.5 \
reg.timinglee.org/flannel/flannel:v0.25.5
[root@k8s-master ~]# docker push reg.timinglee.org/flannel/flannel:v0.25.5

[root@k8s-master ~]# docker tag flannel/flannel-cni-plugin:v1.5.1-flannel1 \
reg.timinglee.org/flannel/flannel-cni-plugin:v1.5.1-flannel1
[root@k8s-master ~]# docker push reg.timinglee.org/flannel/flannel-cni-plugin:v1.5.1-flannel1


# 编辑kube-flannel.yml 修改镜像下载位置
[root@k8s-master ~]# vim kube-flannel.yml

# 需要修改以下几行
[root@k8s-master ~]# grep -n image kube-flannel.yml
146:        image: reg.timinglee.org/flannel/flannel:v0.25.5
173:        image: reg.timinglee.org/flannel/flannel-cni-plugin:v1.5.1-flannel1
184:        image: reg.timinglee.org/flannel/flannel:v0.25.5

#安装flannel网络插件
[root@k8s-master ~]# kubectl apply -f kube-flannel.yml
2.2.3.11 节点扩容
1.加入集群
[root@k8s-node1 & 2  ~]# kubeadm join 172.25.254.100:6443 --token hzol3l.co4jq70kifniewb1 --discovery-token-ca-cert-hash sha256:7c6ae3981484050792989e26bfd24fcc74711d3b2e26baebfbd7332ad0b5a50d --cri-socket=unix:///var/run/cri-dockerd.sock
2.在master阶段中查看所有node的状态
[root@k8s-master ~]# kubectl get nodes
NAME         STATUS     ROLES           AGE   VERSION
k8s-master   Ready      control-plane   21m   v1.30.0
k8s-node1    Ready      <none>          16s   v1.30.0
k8s-node2    NotReady   <none>          11s   v1.30.0
image-20250810232826351

所有阶段的STATUS为Ready状态,那么恭喜你,你的kubernetes就装好了!!

3.测试集群运行情况
#建立一个pod
[root@k8s-master ~]# kubectl run test --image nginx

#查看pod状态
[root@k8s-master ~]# kubectl get pods
NAME   READY   STATUS    RESTARTS   AGE
test   1/1     Running   0          6m29s

#删除pod
root@k8s-master ~]# kubectl delete pod
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐