编排之神--Kubernetes集群环境搭建部署超详细演练
本文介绍了Kubernetes集群环境搭建的关键步骤,主要包括:1)K8S容器管理方式(containerd/docker/cri-o);2)集群部署环境准备,包括主机配置、防火墙设置和时间同步;3)Harbor私有镜像仓库的详细部署过程,涵盖证书生成、Docker配置和Harbor安装;4)测试验证环节。重点突出了K8S集群部署的系统要求和组件配置,为后续容器化应用部署奠定了基础。所有操作均基于
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项目

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

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
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
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
# 现将上面的资源包放到系统/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的套接字文件

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)}'
# 此时访问浏览器并刷新页面,查看镜像数目是否有变化


方法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
在此阶段如果生成的集群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

# 编辑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
所有阶段的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
更多推荐



所有评论(0)