目录
3.4.1 支持 docker 插件cri-docker介绍
3.6.1 指定仓库地址 版本号 使用与docker通讯的插件
1 Kubernetes 简介及原理
1.1 应用部署方式演变
在部署应用程序的方式上,主要经历了三个阶段:
传统部署:互联网早期,会直接将应用程序部署在物理机上
-
优点:简单,不需要其它技术的参与
-
缺点:不能为应用程序定义资源使用边界,很难合理地分配计算资源,而且程序之间容易产生影响
虚拟化部署:可以在一台物理机上运行多个虚拟机,每个虚拟机都是独立的一个环境
-
优点:程序环境不会相互产生影响,提供了一定程度的安全性
-
缺点:增加了操作系统,浪费了部分资源
容器化部署:与虚拟化类似,但是共享了操作系统
容器化部署方式给带来很多的便利,但是也会出现一些问题,比如说:
一个容器故障停机了,怎么样让另外一个容器立刻启动去替补停机的容器
当并发访问量变大的时候,怎么样做到横向扩展容器数量
1.2 容器编排应用
为了解决这些容器编排问题,就产生了一些容器编排的软件:
-
Swarm:Docker自己的容器编排工具
-
Mesos:Apache的一个资源统一管控的工具,需要和Marathon结合使用
-
Kubernetes:Google开源的的容器编排工具
1.3 kubernetes 简介
-
在Docker 作为高级容器引擎快速发展的同时,在Google内部,容器技术已经应用了很多年
-
Borg系统运行管理着成千上万的容器应用。
-
Kubernetes项目来源于Borg,可以说是集结了Borg设计思想的精华,并且吸收了Borg系统中的经验和教训。
-
Kubernetes对计算资源进行了更高层次的抽象,通过将容器进行细致的组合,将最终的应用服务交给用户。
kubernetes的本质是一组服务器集群,它可以在集群的每个节点上运行特定的程序,来对节点中的容器进行管理。目的是实现资源管理的自动化,主要提供了如下的主要功能:
-
自我修复:一旦某一个容器崩溃,能够在1秒中左右迅速启动新的容器
-
弹性伸缩:可以根据需要,自动对集群中正在运行的容器数量进行调整
-
服务发现:服务可以通过自动发现的形式找到它所依赖的服务
-
负载均衡:如果一个服务起动了多个容器,能够自动实现请求的负载均衡
-
版本回退:如果发现新发布的程序版本有问题,可以立即回退到原来的版本
-
存储编排:可以根据容器自身的需求自动创建存储卷
1.4 K8S的设计架构
一个kubernetes集群主要是由控制节点(master)、工作节点(node)构成,每个节点上都会安装不同的组件
1 master:集群的控制平面,负责集群的决策
-
ApiServer : 资源操作的唯一入口,接收用户输入的命令,提供认证、授权、API注册和发现等机制
-
Scheduler : 负责集群资源调度,按照预定的调度策略将Pod调度到相应的node节点上
-
ControllerManager : 负责维护集群的状态,比如程序部署安排、故障检测、自动扩展、滚动更新等
-
Etcd :负责存储集群中各种资源对象的信息
2 node:集群的数据平面,负责为容器提供运行环境
-
kubelet:负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理
-
Container runtime:负责镜像管理以及Pod和容器的真正运行(CRI)
-
kube-proxy:负责为Service提供cluster内部的服务发现和负载均衡
1.5 K8S 各组件之间的调用关系
当我们要运行一个web服务时
-
kubernetes环境启动之后,master和node都会将自身的信息存储到etcd数据库中
-
web服务的安装请求会首先被发送到master节点的apiServer组件
-
apiServer组件会调用scheduler组件来决定到底应该把这个服务安装到哪个node节点上在此时,它会从etcd中读取各个node节点的信息,然后按照一定的算法进行选择,并将结果告知apiServer。负责将未调度的 Pod 分配到集群中的合适节点上。
-
apiServer调用controller-manager去调度Node节点安装web服务
-
kubelet接收到指令后,会通知docker,然后由docker来启动一个web服务的pod
-
如果需要访问web服务,就需要通过kube-proxy来对pod产生访问的代理
1.6 K8S 的 常用名词感念
-
Master:集群控制节点,每个集群需要至少一个master节点负责集群的管控
-
Node:工作负载节点,由master分配容器到这些node工作节点上,然后node节点上的
-
Pod:kubernetes的最小控制单元,容器都是运行在pod中的,一个pod中可以有1个或者多个容器
-
Controller:控制器,通过它来实现对pod的管理,比如启动pod、停止pod、伸缩pod的数量等等
-
Service:pod对外服务的统一入口,下面可以维护者同一类的多个pod
-
Label:标签,用于对pod进行分类,同一类pod会拥有相同的标签
-
NameSpace:命名空间,用来隔离pod的运行环境
1.7 k8S的分层架构
-
核心层:Kubernetes最核心的功能,对外提供API构建高层的应用,对内提供插件式应用执行环境
-
应用层:部署(无状态应用、有状态应用、批处理任务、集群应用等)和路由(服务发现、DNS解析等)
-
管理层:系统度量(如基础设施、容器和网络的度量),自动化(如自动扩展、动态Provision等)以及策略管理(RBAC、Quota、PSP、NetworkPolicy等)
-
接口层:kubectl命令行工具、客户端SDK以及集群联邦
-
生态系统:在接口层之上的庞大容器集群管理调度的生态系统,可以划分为两个范畴
-
Kubernetes外部:日志、监控、配置管理、CI、CD、Workflow、FaaS、OTS应用、ChatOps等
-
Kubernetes内部:CRI、CNI、CVI、镜像仓库、Cloud Provider、集群自身的配置和管理等
2 K8S 集群环境搭建
2.1 k8s 中容器的管理方式
CRI 实际上是 Container Runtime Interface 的缩写。CRI 是 Kubernetes 项目定义的一个标准接口,用于与不同的容器运行时(Container Runtimes)进行交互。通过 CRI,Kubernetes 可以与各种容器运行时进行通信,从而管理容器的生命周期。
CRI 的作用
CRI 的主要作用是定义了一个通用的接口,使得 Kubernetes 可以与不同的容器运行时进行通信。
具体来说,CRI 包括以下功能:
容器管理:
- 创建、启动、停止和删除容器。
- 管理容器的生命周期。
镜像管理:
- 拉取、推送和管理容器镜像。
网络管理:
- 配置容器网络接口(NIC)。
资源管理:
- 分配和管理容器的资源(CPU、内存等)。
2.2 k8s中使用的几种管理容器的介绍
Kubernetes 集群创建方式主要涉及不同的容器运行时(Container Runtime)及其与 Kubernetes 的集成方式。以下是三种主要的创建方式及其特点
centainerd
containerd 是 Kubernetes 默认推荐和支持的容器运行时。containerd 是一个高性能、轻量级的容器运行时,专注于容器的生命周期管理。它被设计为与 Kubernetes 高度集成,并且提供了与 Kubernetes CRI 接口的实现。
docker
虽然 Kubernetes 在 1.24 版本之后正式移除了对 Docker 作为容器运行时的直接支持,但仍然可以通过 cri-dockerd(即 cri-docker)来实现与 Docker 的集成。cri-dockerd 是一个实现了Kubernetes CRI 接口的 Docker 引擎替代品。
cri-o
CRI-O
是另一种实现 Kubernetes CRI 接口的容器运行时。它旨在提供更轻量级的容器运行时,并且直接与 Kubernetes 集成,无需额外的中间层。
kubernetes 中文官网:
Kuberneteshttps://kubernetes.io/zh-cn/
3 kubernetes 的环境部署
3.1 实验环境准备
主机名 | ip | 角色 |
---|---|---|
reg.shuyan.com | 192.168.239.20 | harbor仓库 |
k8s-master | 192.168.239.100 | master,k8s集群控制节点 |
k8s-node1 | 192.168.239.110 | worker,k8s集群工作节点 |
k8s-node2 | 192.168.239.120 | worker,k8s集群工作节点 |
3.1.1 所有机子配置dns解析
[root@complete certs]# vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.239.20 complete reg.shuyan.com
192.168.239.110 k8s-node1
192.168.239.120 k8s-node2
192.168.239.100 k8s-master
3.1.2 部署docker
(已经配置过网络源了不做介绍了)
[root@k8s-master ~]# dnf install docker-ce
[root@k8s-node1 ~]# dnf install docker-ce
[root@k8s-node2 ~]# dnf install docker-ce
[root@k8s-master ~]# systemctl enable --now docker
Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /usr/lib/systemd/system/docker.service.
[root@k8s-master ~]# systemctl restart docker.service
3.1.3 k8s 所有机子都需执行,指定仓库地址
所有节点设定docker的资源管理模式为systemd
[root@k8s-master ~]# vim /etc/docker/daemon.json
{ # 第一行写的是harbor仓库的地址
"registry-mirrors": ["https://reg.shuyan.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
[root@k8s-master ~]# systemctl restart docker.service
3.1.4 k8s 所有机子都需执行,存放仓库证书文件
[root@k8s-master ~]# mkdir -p /etc/docker/certs.d/reg.shuyan.com/
[root@k8s-master ~]# systemctl enable --now docker
Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /usr/lib/systemd/system/docker.service.
仓库端将证书存到k8s 集群
[root@complete certs]# pwd
/data/certs
[root@complete data]# ls
ca_download certs database job_logs redis registry secret
[root@complete certs]# scp shuyan.crt root@192.168.239.100:/etc/docker/certs.d/reg.shuyan.com/
root@192.168.239.100's password:
shuyan.crt 100% 2175 3.1MB/s 00:00
[root@complete certs]# scp shuyan.crt root@192.168.239.110:/etc/docker/certs.d/reg.shuyan.com/
root@192.168.239.110's password:
shuyan.crt 100% 2175 1.7MB/s 00:00
[root@complete certs]# scp shuyan.crt root@192.168.239.120:/etc/docker/certs.d/reg.shuyan.com/
root@192.168.239.120's password:
shuyan.crt 100% 2175 2.6MB/s 00:00
3.1.5 查看仓库是否指定成功
[root@k8s-master ~]# systemctl restart docker.service
[root@k8s-node1 ~]# systemctl restart docker.service
[root@k8s-node2 ~]# systemctl restart docker.service
[root@k8s-master ~]# docker info
3.1.6 登录harbor仓库
除仓库的机子其余的所有机子都得登录
[root@k8s-master ~]# docker login reg.shuyan.com
Username: admin
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credential-stores
Login Succeeded
3.2 关闭交换分区--k8s集群都得执行
[root@k8s-master ~]# systemctl list-unit-files | grep swap
dev-mapper-rl\x2dswap.swap generated -
swap.target static -
[root@k8s-master ~]# systemctl mask swap.target
Created symlink /etc/systemd/system/swap.target → /dev/null.
[root@k8s-master ~]# systemctl list-unit-files | grep swap
dev-mapper-rl\x2dswap.swap generated -
swap.target masked disabled
[root@k8s-master ~]# swapoff -a
[root@k8s-master ~]# vim /etc/fstab
/dev/mapper/rl-root / xfs defaults 0 0
UUID=a4ed9067-12b1-4a7e-af8e-a5430ba2edfb /boot xfs defaults 0 0
UUID=1EB7-071A /boot/efi vfat umask=0077,shortname=winnt 0 2
#/dev/mapper/rl-swap none swap defaults 0 0
查看交换分区是否占用
[root@k8s-master ~]# free -m
total used free shared buff/cache available
Mem: 1742 836 377 12 690 906
Swap: 0 0 0
3.3 安装kubernetes相关工具
(k8s集群所有机子都得执行)除仓库以外
[root@k8s-master ~]# vim /etc/yum.repos.d/k8s.repo
[k8s]
name=k8s-aliyun
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/rpm/
gpgcheck=0
[root@k8s-master ~]# dnf install kubelet-1.30.0 kubeadm-1.30.0 kubectl-1.30.0 -y
设置kubectl命令补齐功能
[root@k8s-master ~]# dnf install bash-completion -y
[root@k8s-master ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc
[root@k8s-master ~]# source ~/.bashrc
3.4 在所有节点上安装插件cri-docker
下载地址
https://github.com/Mirantis/cri-dockerdhttps://github.com/Mirantis/cri-dockerd
3.4.1 支持 docker 插件cri-docker介绍
k8s从1.24版本开始移除了dockershim,所以需要安装cri-docker插件才能使用docker
cri-dockerd 是 Docker 引擎的一个版本,它实现了 Kubernetes 的容器运行时接口(CRI)。CRI 是 Kubernetes 用来与容器运行时(如 Docker, containerd, etc.)通信的一套接口规范。
cri-dockerd允许 Kubernetes 直接管理 Docker 容器,而不需要使用额外的适配层。cri-dockerd 被设计为与 Kubernetes 集群兼容,并且可以作为集群中的容器运行时来使用。
-node1 ~]# yum localinstall cri-dockerd-0.3.14-3.el8.x86_64.rpm \
libcgroup-0.41-19.el8.x86_64.rpm
3.5 在master节点拉取K8S集群所需镜像
思路:将k8s集群所需镜像都拉下来,上传到镜像仓库到时候方便构建主节点和从节点
3.5.1 查看k8s初始化默认配置参数是否正确
[root@k8s-master ~]# kubeadm config print init-defaults
3.5.2 使用国内源下载
/var/run/cri-dockerd.sock 是 cri-dockerd(或 cri-docker)服务使用的 Unix 域套接字(Unix domain socket),用于与 Kubernetes 控制面进行通信。这个套接字允许 Kubernetes 通过 Container Runtime Interface (CRI) 与 Docker 引擎进行交互,从而管理和调度容器。
由于网络原因需要使用阿里云的进行下载
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
3.5.3 查看是否拉取成功
[root@k8s-master ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry.aliyuncs.com/google_containers/kube-apiserver v1.30.0 c42f13656d0b 4 months ago 117MB
registry.aliyuncs.com/google_containers/kube-controller-manager v1.30.0 c7aad43836fa 4 months ago 111MB
registry.aliyuncs.com/google_containers/kube-scheduler v1.30.0 259c8277fcbb 4 months ago 62MB
registry.aliyuncs.com/google_containers/kube-proxy v1.30.0 a0bf559e280c 4 months ago 84.7MB
registry.aliyuncs.com/google_containers/etcd 3.5.12-0 3861cfcd7c04 7 months ago 149MB
registry.aliyuncs.com/google_containers/coredns v1.11.1 cbb01a7bd410 12 months ago 59.8MB
registry.aliyuncs.com/google_containers/pause 3.9 e6f181688397 22 months ago 744kB
3.5.4 在harbor中新建项目
3.5.5 批量打标签并上传
批量打标签
[root@k8s-master ~]# docker images | awk '/google/{ print $1":"$2}' \
| awk 'BEGIN{FS="/"}{system("docker tag "$0" reg.shuyan.com/k8s/"$3)}'
[root@k8s-master ~]# docker images | awk '/k8s/'
reg.shuyan.com/k8s/kube-apiserver v1.30.0 c42f13656d0b 4 months ago 117MB
reg.shuyan.com/k8s/kube-controller-manager v1.30.0 c7aad43836fa 4 months ago 111MB
reg.shuyan.com/k8s/kube-scheduler v1.30.0 259c8277fcbb 4 months ago 62MB
reg.shuyan.com/k8s/kube-proxy v1.30.0 a0bf559e280c 4 months ago 84.7MB
reg.shuyan.com/k8s/etcd 3.5.12-0 3861cfcd7c04 7 months ago 149MB
reg.shuyan.com/k8s/coredns v1.11.1 cbb01a7bd410 12 months ago 59.8MB
reg.shuyan.com/k8s/pause 3.9 e6f181688397 22 months ago 744kB
批量上传镜像
[root@k8s-master ~]# docker images | awk '/k8s/{system("docker push "$1":"$2)}'
3.5.6 修改插件服务启动参数
所有集群的机器都需要修改
由于k8s是由容器的方式运行的,所以需要找到根容器在哪里
[root@k8s-master ~]# vim /lib/systemd/system/cri-docker.service
[Unit]
Description=CRI Interface for Docker Application Container Engine
Documentation=https://docs.mirantis.com
After=network-online.target firewalld.service docker.service
Wants=network-online.target
Requires=cri-docker.socket
[Service]
Type=notify
# 仅修改这一行
ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --network-plugin=cni --pod-infra-container-image=reg.shuyan.com/k8s/pause:3.9
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
[root@k8s-master ~]# systemctl daemon-reload
[root@k8s-master ~]# systemctl start cri-docker
3.6 初始化k8s集群
方法一:通过配置文件初始化
1)生成并修改配置文件
# 生成配置文件
$ kubeadm config print init-defaults > kubeadm.yml
修改如下配置:
-
advertiseAddress:为控制切面地址,( Master 主机 IP )
-
criSocket:为 containerd 的 socket 文件地址
-
name: node 修改node为 master
-
imageRepository:阿里云镜像代理地址,否则拉取镜像会失败
-
kubernetesVersion:为 k8s 版本
注意:一定要配置镜像代理,否则会由于防火墙问题导致集群安装失败
修改后配置文件如下:
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
# 控制切面的IP地址
advertiseAddress: 172.16.90.111
bindPort: 6443
nodeRegistration:
# 容器运行时 socket 文件地址
criSocket: unix:///var/run/containerd/containerd.sock
imagePullPolicy: IfNotPresent
# 控制面主机名,可省略
name: master
taints:
- effect: NoSchedule
key: node-role.kubernetes.io/master
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
local:
dataDir: /var/lib/etcd
# 镜像服务地址
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
# K8S 版本
kubernetesVersion: 1.24.2
networking:
dnsDomain: cluster.local
# service 的网段
serviceSubnet: 10.96.0.0/12
scheduler: {}
---
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
cgroupDriver: systemd
2)初始化 K8S 集群
# 查看所需镜像列表
$ kubeadm config images list --config kubeadm.yml
# 拉取镜像
$ kubeadm config images pull --config kubeadm.yml
# 根据配置文件启动 kubeadm 初始化 k8s
$ kubeadm init --config=kubeadm.yml --upload-certs --v=6
方法二:通过命令初始化
参数 | 作用 | 缺省 | 配置 |
---|---|---|---|
--apiserver-advertise-address | apiserver 绑定的 IP | Master 主机 IP 如果要做keepalived需要填keepalived的VIP | |
--apiserver-bind-port | apiserver 监听的端口 | 6443 | 6443 |
--cri-socket | CRI socket 文件路径 | unix:///var/run/cri-dockerd.sock | |
--control-plane-endpoint | 控制面地址 | master_vip:6440 | |
--image-repository | 选择拉取镜像的仓库 | k8s.gcr.io | reg.shuyan.com/k8s |
--kubernetes-version | 选择K8S版本 | stable-1 | 1.30.0 |
--pod-network-cidr | 指定 pod 的网络 | 10.244.0.0/16 | |
--service-cidr | 指定service 的IP 范围 | 10.96.0.0/12 | 10.96.0.0/12 |
以下是初始化模版
[root@k8s-master01 ~]# kubeadm init --node-name=k8s-master01
--image-repository=registry.aliyuncs.com/google_containers
--cri-socket=unix:///var/run/cri-dockerd.sock
--apiserver-advertise-address=172.16.100.21 # 填自己的地址,假如以后做keepalived需要填VIP
--pod-network-cidr=10.244.0.0/16
--service-cidr=10.96.0.0/12
但是我使用的是自己的仓库有一些东西暂时也用不到那么多,所以简略了一些东西
3.6.1 指定仓库地址 版本号 使用与docker通讯的插件
[root@k8s-master ~]# systemctl enable --now kubelet.service
Created symlink /etc/systemd/system/multi-user.target.wants/kubelet.service → /usr/lib/systemd/system/kubelet.service.
[root@k8s-master ~]# kubeadm init --pod-network-cidr=10.244.0.0/16 \
--image-repository reg.shuyan.com/k8s \ # 指定自己仓库地址
--kubernetes-version v1.30.0 \
--cri-socket=unix:///var/run/cri-dockerd.sock
3.6.2 成功标志
底下出现这一串证明成功了
不过还需要处理一些事情,就是得指定配置文件的路径
3.6.3 指定配置文件
master ~]# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
[root@k8s-master ~]# source ~/.bash_profile
3.6.4 查看节点状态
# 状态为NotReady当前节点没有就绪,因为还没有安装网络插件,容器没有运行
[root@k8s-master ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master NotReady control-plane 6m2s v1.30.0
[root@k8s-master ~]# kubectl get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-66d4c695bb-29qbq 0/1 Pending 0 6m11s
kube-system coredns-66d4c695bb-6th24 0/1 Pending 0 6m11s
kube-system etcd-k8s-master 1/1 Running 0 6m26s
kube-system kube-apiserver-k8s-master 1/1 Running 0 6m26s
kube-system kube-controller-manager-k8s-master 1/1 Running 0 6m26s
kube-system kube-proxy-4fllj 1/1 Running 0 6m12s
kube-system kube-scheduler-k8s-master 1/1 Running 0 6m26s
如果初始化失败需要使用reset对集群进行重置
kubeadm reset --cri-socket=unix:///var/run/cri-dockerd.sock
3.7 安装flannel网络插件
官方网址
3.7.1 Flannel 介绍
Flannel 是一个为容器集群设计的虚拟网络层,它主要解决的是如何让运行在不同主机上的容器能够相互通信的问题。Flannel 可以创建一个覆盖网络(Overlay Network),使得每个节点上的容器都能通过 IP 地址直接通信,即使它们不在同一个物理网络上。
3.7.2 使用魔法将镜像下载到本地
#下载flannel的yaml部署文件
master test]# wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
# 拉取所需镜像
master test]# docker pull docker.io/flannel/flannel:v0.25.5
master test]# docker pull docker.io/flannel/flannel-cni-plugin:v1.5.1-flannel1
3.7.3 上传所需镜像到本地仓库
master test]# docker tag flannel/flannel:v0.25.5 \
reg.shuyan.com/flannel/flannel:v0.25.5
master test]# docker push reg.shuyan.com/flannel/flannel:v0.25.5
master test]# docker tag flannel/flannel-cni-plugin:v1.5.1-flannel1 \
reg.shuyan.com/flannel/flannel-cni-plugin:v1.5.1-flannel1
master test]# docker push reg.shuyan.com/flannel/flannel-cni-plugin:v1.5.1-flannel1
3.7.4 修改yml配置文件
需要修改成如下几行
[root@k8s-master test]# grep -n image kube-flannel.yml
146: image: reg.shuyan.com/flannel/flannel:v0.25.5
173: image: reg.shuyan.com/flannel/flannel-cni-plugin:v1.5.1-flannel1
184: image: reg.shuyan.com/flannel/flannel:v0.25.5
3.7.5 运行并查看状态
[root@k8s-master test]# kubectl apply -f /root/test/kube-flannel.yml
namespace/kube-flannel created
serviceaccount/flannel created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created
[root@k8s-master test]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane 23m v1.30.0
[root@k8s-master test]# kubectl get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-flannel kube-flannel-ds-fpcns 1/1 Running 0 79s
kube-system coredns-66d4c695bb-29qbq 1/1 Running 0 24m
kube-system coredns-66d4c695bb-6th24 1/1 Running 0 24m
kube-system etcd-k8s-master 1/1 Running 0 24m
kube-system kube-apiserver-k8s-master 1/1 Running 0 24m
kube-system kube-controller-manager-k8s-master 1/1 Running 0 24m
kube-system kube-proxy-4fllj 1/1 Running 0 24m
kube-system kube-scheduler-k8s-master 1/1 Running 0 24m
# kube-flannel 命名空间:
# Pod: kube-flannel-ds-fpcns
# 这个 Pod 是 Flannel 网络插件的一部分,
# 用于为集群中的 Pod 提供网络连接。状态为 Running,
# 并且没有重启记录,表明网络插件运行正常。
4 节点扩容(工作节点加入)
4.1 节点扩容的要求
在所有的worker节点中
确认部署好以下内容
1 禁用swap
2 安装:
-
kubelet-1.30.0
-
kubeadm-1.30.0
-
kubectl-1.30.0
-
docker-ce
-
cri-dockerd
3 修改cri-dockerd启动文件systemd添加
-
--network-plugin=cni
-
--pod-infra-container-image=reg.timinglee.org/k8s/pause:3.9
4 启动服务
-
kubelet.service
-
cri-docker.service
以上信息确认完毕后即可加入集群
4.2 MASTER 节点上获取token
# 重新生成集群token,并复制集群的token到从节点执行
[root@k8s-master test]# kubeadm token create --print-join-command
kubeadm join 192.168.239.100:6443 --token 52llq9.31a5w9pr4set4yet --discovery-token-ca-cert-hash sha256:2a5aeaece9ad08daed2744ac6fc5b652172fd597e45022b81820085fb3c8b18a
4.3 复制到从节点指定套接字运行
# 注意:加入集群时需要添加 --cri-socket=unix:///var/run/cri-dockerd.sock
[root@k8s-node1 ~]# kubeadm join 192.168.239.100:6443 \
--token 52llq9.31a5w9pr4set4yet \
--discovery-token-ca-cert-hash sha256:2a5aeaece9ad08daed2744ac6fc5b652172fd597e45022b81820085fb3c8b18a \
--cri-socket=unix:///var/run/cri-dockerd.sock
[root@k8s-node2 ~]# kubeadm join 192.168.239.100:6443 \
--token 52llq9.31a5w9pr4set4yet \
--discovery-token-ca-cert-hash sha256:2a5aeaece9ad08daed2744ac6fc5b652172fd597e45022b81820085fb3c8b18a \
--cri-socket=unix:///var/run/cri-dockerd.sock
成功!
[root@k8s-master ~]# kubectl -n kube-flannel get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
kube-flannel-ds-fpcns 1/1 Running 1 (26m ago) 7h14m 192.168.239.100 k8s-master <none> <none>
kube-flannel-ds-mnt72 1/1 Running 0 7h2m 192.168.239.110 k8s-node1 <none> <none>
kube-flannel-ds-xfhw7 1/1 Running 0 7h2m 192.168.239.120 k8s-node2 <none> <none>
[root@k8s-master ~]# kubectl -n kube-flannel get pods
NAME READY STATUS RESTARTS AGE
kube-flannel-ds-fpcns 1/1 Running 1 (27m ago) 7h15m
kube-flannel-ds-mnt72 1/1 Running 0 7h3m
kube-flannel-ds-xfhw7 1/1 Running 0 7h3m