Kubernetes 部署
一、k8s 中容器的管理方式
K8S 集群创建方式有 3 种:
- :默认情况下,K8S 在创建集群时使用的方式
Kubernetes 集群部署涉及环境初始化、容器运行时配置、私有镜像仓库搭建及组件安装。步骤包括静态 IP 设置、防火墙关闭、Swap 禁用、时间同步、Docker 与 CRI-Docker 配置、Harbor 仓库认证、K8s 工具安装、镜像拉取与标记、集群初始化、Flannel 网络插件部署及 Pod 测试验证。

K8S 集群创建方式有 3 种:
注意:
docker 和 cri-o 这两种方式要对 kubelet 程序的启动参数进行设置
K8S 中文官网:https://kubernetes.io/zh-cn/
| 主机名 | ip | 角色 |
|---|---|---|
| reg.hxd.org | 192.168.83.200 | harbor 仓库 |
| k8s-master | 192.168.83.100 | master,k8s 集群控制节点 |
| k8s-node1 | 192.168.83.10 | worker,k8s 集群工作节点 |
| k8s-node2 | 192.168.83.20 | worker,k8s 集群工作节点 |
1、[root@ ~]# nmtui 编辑连接 -> ens160 -> 修改内容 -> 确定 -> 返回 -> 退出 [root@ ~]# nmcli c up ens160 # 连接网络[root@ ~]# nmcli c reload # 登录网络连接
2、[root@ ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens160
# Generated by dracut initrd
NAME="ens160"
DEVICE="ens160"
ONBOOT=yes NETBOOT=yes UUID="42fc4d6c-82c6-4cea-b683-1ad03460b5fe"
IPV6INIT=yes BOOTPROTO=none IPADDR="192.168.83."
# ip
NETMASK="255.255.255.0"
GATEWAY="192.168.83.2"
DNS1="114.114.114.114"
TYPE=Ethernet
[root@ ~]# nmcli c up ens160
[root@ ~]# nmcli c reload
3、[root@ ~]# nmcli c mod ens160 ipv4.method manual ipv4.address 192.168.83. ipv4.gateway 192.168.83.2 ipv4.dns 114.114.114.114 ipv4.method manual connection.autoconnect yes
[root@ ~]# nmcli c up ens160
[root@ ~]# nmcli c reload
[root@ ~]# systemctl disable --now firewalld
[root@ ~]# vim /etc/selinux/config
SELINUX=disabled
或者
[root@ ~]# sed -i 's/^SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
[root@k8s- ~]# systemctl mask swap.target
[root@k8s- ~]# swapoff -a
[root@k8s- ~]# vim /etc/fstab
# 注释 swap
#/dev/mapper/rhel-swap swap swap defaults 0 0
[root@k8s- ~]# vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.83.100 k8s-master
192.168.83.10 k8s-node1
192.168.83.20 k8s-node2
192.168.83.200 reg.hxd.org
[root@k8s- ~]# vim /etc/chrony.conf
pool ntp1.aliyun.com iburst # 修改为阿里云的时间同步地址
[root@k8s- ~]# systemctl restart chronyd
[root@k8s- ~]# chronyc sources -v
# 最下面如果是^*,说明时间同步成功 ^* 118.31.40.99 2671 -138ms [ -143ms] +/- 173ms
[root@ ~]# vim /etc/yum.repos.d/docker.repo
[docker]
name =docker
baseurl = https://mirrors.aliyun.com/docker-ce/linux/rhel/9.5/x86_64/stable/
gpgcheck =0
[root@ ~]# dnf install docker-ce -y
[root@ ~]# vim /etc/docker/daemon.json
{"registry-mirrors":["https://reg.hxd.org"]}
[root@ ~]# systemctl enable --now docker
# 创建目录
[root@reg ~]# mkdir /data/certs/ -p
# 生成认证 key 和证书
[root@reg ~]# openssl req -newkey rsa:4096 \ -nodes -sha256 -keyout /data/certs/hxd.org.key \ -addext "subjectAltName = DNS:reg.hxd.org"\ -x509 -days 365 -out /data/certs/hxd.org.crt
# 注意创建时,必须写对域名 Common Name (eg, your name or your server's hostname)
[]:reg.hxd.org
# 查看证书信息
[root@reg ~]# openssl x509 -in /data/certs/hxd.org.crt -noout -text
[root@reg ~]# systemctl enable --now docker
[root@k8s- ~]# mkdir /etc/docker/certs.d/reg.hxd.org/ -p
[root@reg ~]# for i in 100 10 20 ; do scp /data/certs/hxd.org.crt [email protected].$i:/etc/docker/certs.d/reg.hxd.org/ca.crt; done
# 上传到 harbor 仓库主机并解压
[root@reg ~]# tar zxf harbor-offline-installer-v2.5.4.tgz -C /opt/# 复制配置文件格式为.yml 结尾来启用文件
[root@reg ~]# cd /opt/
[root@reg opt]# ls containerd harbor
[root@reg opt]# cd harbor/
[root@reg harbor]# ls common common.sh docker-compose.yml harbor.v2.5.4.tar.gz harbor.yml.tmpl install.sh LICENSE prepare
[root@reg harbor]# cp harbor.yml.tmpl harbor.yml
# 修改配置文件以下内容
[root@reg harbor]# vim harbor.yml
hostname: reg.hxd.org
certificate: /data/certs/hxd.org.crt
private_key: /data/certs/hxd.org.key
harbor_admin_password: 123
# 安装并启用 harbor
[root@reg harbor]# ./install.sh --help
Note: Please set hostname and other necessary attributes in harbor.yml first. DO NOT use localhost or 127.0.0.1 for hostname, because Harbor needs to be accessed by external clients. Please set --with-notary if needs enable Notary in Harbor, and set ui_url_protocol/ssl_cert/ssl_cert_key in harbor.yml bacause notary must run under https. Please set --with-trivy if needs enable Trivy Please set --with-chartmuseum if needs enable Chartmuseum in Harbor
[root@reg harbor]# ./install.sh --with-chartmuseum
# 在 master 主机上登陆 harbor 仓库
[root@k8s-master ~]# docker login reg.hxd.org
Login Succeeded
[root@k8s-master ~]# docker info
Cgroup Driver: systemd # 资源管理更改为 systemd
https://reg.hxd.org/ # 认证 harbor 仓库
[root@k8s- ~]# 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 ~]# dnf list kub* --showduplicates
# master 上安装
[root@k8s-master ~]# dnf install kubelet-1.30.0 kubeadm-1.30.0 kubectl-1.30.0 -y
# node1,node2 上安装
[root@k8s-node ~]# dnf install kubelet-1.30.0 kubeadm-1.30.0 -y
k8s 从 1.24 版本开始移除了 dockershim,所以需要安装 cri-docker 插件才能使用 docker 软件下载:https://github.com/Mirantis/cri-dockerd
# dnf install libcgroup-0.41-19.el8.x86_64.rpm \> cri-dockerd-0.3.14-3.el8.x86_64.rpm -y # 上传 k8s-1.30.tar.gz
# 上传 libcgroup-0.41-19.el8.x86_64.rpm cri-dockerd-0.3.14-3.el8.x86_64.rpm 安装包,并解压
[root@k8s-master ~]# dnf install *.rpm -y
# 传给 node 节点
[root@k8s-master ~]# scp libcgroup-0.41-19.el8.x86_64.rpm cri-dockerd-0.3.14-3.el8.x86_64.rpm [email protected]:/root/
[root@k8s-master ~]# scp libcgroup-0.41-19.el8.x86_64.rpm cri-dockerd-0.3.14-3.el8.x86_64.rpm [email protected]:/root/
[root@k8s- ~]# vim /lib/systemd/system/cri-docker.service
# 指定网络插件名称及基础容器镜像
ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --network-plugin=cni --pod-infra-container-image=reg.hxd.org/k8s/pause:3.9
[root@k8s-systemc ~]# systemctl daemon-reload
[root@k8s- ~]# systemctl enable --now cri-docker.service
# dockerd 的套接字文件
[root@k8s-master ~]# ll /var/run/cri-dockerd.sock # 默认文件信息
# [root@k8s-master ~]# kubeadm config print init-defaults | less
[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
[root@k8s-master ~]# docker images | awk '/google/{print $1":"$2}'
[root@k8s-master ~]# docker images | awk '/google/{ print $1":"$2}' | awk -F / '{print $3}'
[root@k8s-master ~]# docker images | awk '/google/{ print $1":"$2}' | awk -F / '{system("docker tag "$0" reg.hxd.org/k8s/"$3)}'
# 在浏览器 harbor 建立 k8s 项目选择公开
[root@k8s-master ~]# docker images | awk '/hxd/{system("docker push "$1":"$2)}'
# 注意拉取到仓库前必须登录仓库
[root@k8s-master ~]# docker login reg.hxd.org
用户:admin 密码:123
# 所有主机
[root@k8s- ~]# systemctl enable --now kubelet.service
[root@k8s- ~]# systemctl restart kubelet.service
[root@k8s-master ~]# kubeadm init --pod-network-cidr=10.244.0.0/16 \ --image-repository reg.hxd.org/k8s \ --kubernetes-version v1.30.0 \ --cri-socket=unix:///var/run/cri-dockerd.sock
# 指定集群配置文件变量 (不指定执行 kubectl get node 会报错)
[root@k8s-master ~]# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
kubeadm join 192.168.83.100:6443 --token 5hwptm.zwn7epa6pvatbpwf --discovery token-ca-cert-hash sha256:52f1a83b70ffc8744db5570288ab51987ef2b563bf906ba4244a300f61e9db23 --cri-socket=unix:///var/run/cri-dockerd.sock
# 当前节点没有就绪,因为还没有安装网络插件,容器没有运行
[root@k8s-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master NotReady control-plane 4m35s v1.30.0
注意:
在此阶段如果生成的集群 token 找不到了可以重新生成
# 上传下载好的 flannel-0.25.5.tag.gz 和 kube-flannel.yml
[root@k8s-master ~]# mkdir network
[root@k8s-master ~]# mv flannel-0.25.5.tag.gz kube-flannel.yml network/
[root@k8s-master ~]# cd network/
[root@k8s-master network]# docker load -i flannel-0.25.5.tag.gz
Loaded image: flannel/flannel-cni-plugin:v1.5.1-flannel1
# 在浏览器 harbor 建立 flannel 项目选择公开
# 给镜像打标签
[root@k8s-master ~]# docker tag flannel/flannel-cni-plugin:v1.5.1-flannel1 reg.hxd.org/flannel/flannel-cni-plugin:v1.5.1-flannel1
# 拉取镜像
[root@k8s-master ~]# docker push reg.hxd.org/flannel/flannel-cni-plugin:v1.5.1-flannel1
# 给镜像打标签
[root@k8s-master ~]# docker tag flannel/flannel:v0.25.5 reg.hxd.org/flannel/flannel:v0.25.5
# 拉取镜像
[root@k8s-master ~]# docker push reg.hxd.org/flannel/flannel:v0.25.5
[root@k8s-master ~]# vim kube-flannel.yml
image: flannel/flannel:v0.25.5
image: flannel/flannel-cni-plugin:v1.5.1-flannel1
image: flannel/flannel:v0.25.5
[root@k8s-master ~]# kubectl apply -f kube-flannel.yml
# 查看集群节点
[root@k8s-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane 4h13m v1.30.0
k8s-node1 Ready <none> 4h11m v1.30.0
k8s-node2 Ready <none> 4h11m v1.30.0
注意:
所有阶段的 STATUS 为 Ready 状态,那么恭喜你,你的 kubernetes 就装好了!!
# 上传 nginx-latest.tar.gz 镜像
# 打标签
[root@k8s-master ~]# docker tag nginx:latest reg.hxd.org/library/nginx:latest
# 拉取到仓库
[root@k8s-master ~]# docker push reg.hxd.org/library/nginx:latest
# 建立 pod
[root@k8s-master ~]# kubectl run test --image nginx:latest
# 查看 pod 状态
[root@k8s-master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
test 1/1 Running 0 4m48s
[root@k8s-master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
test 1/1 Running 0 6m38s 10.244.2.2 k8s-node2 <none><none>
# 查看建立的 pos 信息
[root@k8s-master ~]# kubectl describe pods test
Container ID: docker://5c3ac30e03bd991bc9a20aa1ab49a098893b6fbbf03565cedd8e406c33590d0a
容器 id
Normal Scheduled 9m53s default-scheduler Successfully assigned default/test to k8s-node2
# 删除 pod
[root@k8s-master ~]# kubectl delete pod test
注意:
node 主机删除了建立的 pos 镜像,也会自动生成
[root@k8s-master ~]# dnf install bash-completion -y
[root@k8s-master ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc
[root@k8s-master ~]# source ~/.bashrc

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online