Kubernetes 部署
- 一、k8s中容器的管理方式
- [二、k8s 集群部署](#二、k8s 集群部署)
-
- [1、k8s 环境部署说明](#1、k8s 环境部署说明)
- 2、集群环境初始化
- 3、所有节点安装docker-ce
- 4、配置harbor仓库
- 5、安装K8S部署工具
- 6、在所节点安装cri-docker
- 7、在master节点拉取K8S所需镜像
- 8、集群初始化
- 9、安装flannel网络插件
- 10、测试集群运行情况
- 11、设置kubectl命令补齐功能
一、k8s中容器的管理方式

K8S 集群创建方式有3种:
-
centainerd:默认情况下,K8S在创建集群时使用的方式
-
docker:Docker使用的普记录最高,虽然K8S在1.24版本后已经费力了kubelet对docker的支持,但时可以借助 cri-docker方式来实现集群创建
-
cri-o: CRI-O的方式是Kubernetes创建容器最直接的一种方式,在创建集群的时候,需要借助于cri-o插件的方 式来实现Kubernetes集群的创建。
注意:
docker 和cri-o 这两种方式要对kubelet程序的启动参数进行设置
二、k8s 集群部署
1、k8s 环境部署说明
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集群工作节点 |
2、集群环境初始化
- 设置静态ip,三种方式
bash
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
- 关掉防火墙和SELINUX
bash
[root@ ~]# systemctl enable --now firewalld
[root@ ~]# vim /etc/selinux/config
SELINUX=disabled
或者
[root@ ~]# sed -i 's/^SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
- master和node禁用swap和配置本地解析
bash
[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
- master和node节点时间同步
bash
[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 2 6 7 1 -138ms[ -143ms] +/- 173ms
3、所有节点安装docker-ce
- 配置docker仓库
bash
[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
- 所有节点设定docker的资源管理模式为systemd
bash
[root@ ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://reg.hxd.org"]
}
[root@ ~]# systemctl enable --now docker
4、配置harbor仓库
- 生成认证key和证书
bash
# 创建目录
[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
- 启用docker,并设置开机启动
bash
[root@reg ~]# systemctl enable --now docker
-
将harbor的证书颁发给其他三个主机
[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 root@192.168.83.$i:/etc/docker/certs.d/reg.hxd.org/ca.crt; done
-
启用harbor仓库
下载软件包地址
https://github.com/goharbor/harbor/releases
bash
# 上传到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 in Harbor
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仓库
- 在浏览器上搜索192.168.83.200


5、安装K8S部署工具
- 所有节点部署K8S软件仓库
bash
[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
- 安装软件
bash
# 显示所有版本
[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
6、在所节点安装cri-docker
- 安装cri-docker
k8s从1.24版本开始移除了dockershim,所以需要安装cri-docker插件才能使用docker 软件下载: https://github.com/Mirantis/cri-dockerd
bash
# 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 root@192.168.83.10:/root/
[root@k8s-master ~]# scp libcgroup-0.41-19.el8.x86_64.rpm cri-dockerd-0.3.14-3.el8.x86_64.rpm root@192.168.83.20:/root/
- 修改cri-docker配置文件
bash
[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
- 启用cri-docker
bash
[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
7、在master节点拉取K8S所需镜像
- 拉取k8s集群所需要的镜像
bash
[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

8、集群初始化
- 启动kubelet服务
bash
# 所有主机
[root@k8s- ~]# systemctl enable --now kubelet.service
[root@k8s- ~]# systemctl restart kubelet.service
- 执行初始化
bash
[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
- 给node主机指定这个master令牌
bash
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找不到了可以重新生成
bash[root@k8s-master ~]# kubeadm token create --print-join-command kubeadm join 192.168.83.100:6443 --token 5hwptm.zwn7epa6pvatbpwf --discovery token-ca-cert-hash sha256:52f1a83b70ffc8744db5570288ab51987ef2b563bf906ba4244a300f61e9db23 # 删除令牌 [root@k8s-master ~]# kubeadm reset --cri-socket=unix:///var/run/cri-dockerd.sock
9、安装flannel网络插件
官方网站: https://github.com/flannel-io/flannel
- 安装网咯插件
bash
# 上传下载好的 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
- 编辑kube-flannel.yml 修改镜像下载位置
bash
[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
- 安装flannel网络插件
bash
[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就装好了!!
10、测试集群运行情况
- 建立一个pod
bash
# 上传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镜像,也会自动生成
11、设置kubectl命令补齐功能
bash
[root@k8s-master ~]# dnf install bash-completion -y
[root@k8s-master ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc
[root@k8s-master ~]# source ~/.bashrc