Kubernetes(K8s) —— 部署(保姆级教程)

Kubernetes 部署

一、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
相关推荐
祁同伟.5 小时前
【C++】二叉搜索树(图码详解)
开发语言·数据结构·c++·容器·stl
一个处女座的暖男程序猿5 小时前
若依微服务 nacos的配置文件
微服务·云原生·架构
分布式存储与RustFS5 小时前
存算一体架构的先行者:RustFS在异构计算环境下的探索与实践
大数据·人工智能·物联网·云原生·对象存储·minio·rustfs
Akshsjsjenjd7 小时前
Docker资源限制详解
运维·docker·容器
xrkhy7 小时前
微服务之OpenFeign 服务调用
微服务·云原生·架构
小猪咪piggy7 小时前
【微服务】(2) 环境和工程搭建
微服务·云原生·架构
雲帝8 小时前
1panel docker开启swap内存
运维·docker·容器
陈陈CHENCHEN9 小时前
【Kubernetes】K8s 集群 RBAC 鉴权
kubernetes