一.Kubernetes(K8s)概述
Kubernetes 是 Google 基于 Borg 技术开源的容器集群管理系统,它在 Docker 等容器技术的基础上,为容器化应用提供了部署运行、资源调度、服务发现、动态伸缩、故障自愈等全生命周期管理能力,大幅提升了大规模容器集群管理的便捷性。
Kubernetes 的核心设计思想,是从宏观视角以统一方式定义任务间的各种关系,并为未来扩展更多任务类型预留空间。它最核心的能力,就是按照用户意愿与集群规则,自动化处理容器之间的各种关系,这一能力就是我们常说的「容器编排」。可以说,Kubernetes 的本质,就是一个具有普遍适用性的容器编排工具。
二.k8s的设计架构

K8s 采用主从(Master‑Node)分布式架构,整体分为控制平面和工作节点两大层,基于声明式 API,所有数据存 etcd,组件之间通过 API 交互。
控制平面(Master,集群控制中枢,不跑业务 Pod)
- etcd:分布式键值存储,集群唯一数据库,保存全部配置、状态数据。
- kube‑apiserver:集群统一入口,提供 REST API,负责认证鉴权,所有组件都和它交互,读写 etcd。
- kube‑controller‑manager:控制器集合,持续做调谐:对比期望状态与实际状态,出现偏差就执行修复。
- kube‑scheduler:调度器,监听未绑定节点的 Pod,按规则选出最合适 Node,把 Pod 分配过去。
- 生产环境控制平面做多实例实现高可用。
工作节点(Node,执行业务负载)
每个业务节点都运行下面组件:
- kubelet:节点代理,和 apiserver 通信;管理本机 Pod 生命周期,创建、监控、重启 Pod,上报节点状态。
- kube‑proxy:网络代理,维护转发规则,实现 Service 负载均衡,处理 Pod 流量。
- 容器运行时(containerd/cri‑o):负责拉取镜像、启动停止容器。
配套插件层
- CNI 网络插件(Calico/Flannel):实现 Pod 网络,完成 Pod 之间通信。
- Ingress‑controller:实现七层域名访问能力。
三.K8s 应用部署方式
3.1 Deployment(无状态,最常用)
- 适用:Web 后端、Nginx,无本地数据,Pod 随便销毁重建。
- 特点:滚动更新、回滚、扩缩容。
- 类比:盖浇饭,哪份坏了直接重做一份,新旧菜品逐步替换,不停止营业。
bash
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
3.2 StatefulSet(有状态部署)
- 适用:MySQL、Redis 集群、ZooKeeper,需要稳定网络标识、持久存储。
- 特点:Pod 有序创建删除,稳定主机名,绑定持久存储。
- 类比:包间,每个包间固定编号、固定储物柜子,不能随便打乱替换。
3.3. DaemonSet
- 适用:日志采集、监控代理(filebeat、node‑exporter)。
- 特点:每个节点跑一个 Pod,节点新增自动部署。
- 类比:每个后厨工位必须配一名卫生保洁。
3.4 Job / CronJob 任务部署
- Job:一次性任务,跑完就结束。类比:一次性批量预制 100 份半成品。
- CronJob:定时任务,按时间周期执行,类似 crontab。
- 类比:每天凌晨 3 点盘点库存。
3.5. Helm Chart 部署(包部署)
- 不是控制器,是应用打包工具。把一整套 yaml(Deployment、Service、Ingress 等)打包成 Chart。
- 类比:现成整套开店套餐,一键配齐后厨、前台、分拣全套配置,不用手写一堆 yaml。
3.6 直接裸 Pod(不推荐)
- 直接写 kind:Pod 创建。
- 问题:Pod 挂掉不会自动重建,没有扩缩容能力。
- 类比:临时做一份菜,打翻了没人重做。仅测试使用。
四. k8s的集群原理

把整个集群想象成一家外卖餐饮公司
控制平面(老板 + 管理办公室):不直接做菜,只管决策
- etcd:公司全部台账、订单、人员信息数据库
- apiserver:前台接待,所有需求都从这里进,所有信息从这里查
- controller‑manager:运营主管,不停对照「计划订单」和「实际出餐」,不一样就纠正
- scheduler:派单员,看哪个后厨工位有空,把订单派过去
- Node 工作节点 = 各个后厨工位
- kubelet = 后厨组长,接到派单,安排干活,盯着菜品(Pod),坏了就重做,上报状态
- Pod = 一份份做好的餐品(业务容器)
- kube‑proxy = 外卖分拣员,把顾客订单分发到对应餐品,做转发负载均衡
完整工作流程:
你(用户)提交需求 (YAML):要同时出 3 份盖浇饭(3 个 Pod 副本)。
- 需求给到前台 apiserver,记录进台账 etcd。
- 运营主管 controller‑manager 一看:现在只有 1 份饭,还差 2 份。
- 派单员 scheduler 看哪个后厨闲,把任务派过去。
- 后厨组长 kubelet 收到任务,做出另外 2 份饭 Pod。
- 如果一份饭打翻了(Pod 崩溃),主管发现数量不对,立刻再派单重做一份,保证始终 3 份,这就是自愈。
- 顾客点餐访问(外部请求),分拣员 kube‑proxy 把请求分发到任意一份盖浇饭上,就是Service 负载均衡。
- 滚动升级:把旧菜品一份份撤下,上新版本菜品,全程店里不断出餐,不影响顾客。
- HPA 自动扩缩容:饭点人多,自动多开后厨做更多份;深夜人少,减少份数节省人力。
滚动升级:把旧菜品一份份撤下,上新版本菜品,全程店里不断出餐,不影响顾客。
HPA 自动扩缩容:饭点人多,自动多开后厨做更多份;深夜人少,减少份数节省人力。
五.构建harbor镜像仓库
K8S中文官网:https://kubernetes.io/zh-cn/
#尽量不要把用172.25.254.254IP会报错
| 主机名 | IP | 角色 |
|---|---|---|
| harbor.timinglee.org | 172.25.254.250 | harbor 仓库 |
| k8s-master.timinglee.org | 172.25.254.100 | master,k8s 集群控制节点 |
| k8s-node1.timinglee.org | 172.25.254.10 | worker,k8s 集群工作节点 |
| k8s-node2.timinglee.org | 172.25.254.20 | worker,k8s 集群工作节点 |
部署docker本地仓库
bash
[root@harbor ~]# vim /etc/yum.repos.d/docker.repo
[docker]
name = docker
baseurl = https://mirrors.aliyun.com/docker-ce/linux/rhel/9.6/x86_64/stable/
gpgcheck = 0
[root@harbor ~]# dnf install httpd createrepo-y
[root@harbor ~]# mkdir /var/www/html/docker/ -p
[root@harbor ~]# vim /etc/httpd/conf/httpd.conf
Listen 4444
[root@harbor ~]# systemctl enable --now httpd
[root@harbor ~]# dnf install docker-ce -downloadonly --destdir /mnt/ -y
[root@harbor ~]# mv /mnt/*.rpm /var/www/html/docker/
[root@harbor ~]# createrepo -v /var/www/html/docker/
[root@harbor ~]# cat /etc/yum.repos.d/docker.repo <<EOF
[docker]
name = docker
baseurl = http://172.25.254.250:4444/docker
gpgcheck = 0
EOF
[root@harbor ~]# dnf install docker-ce -y
安装docker在harbor仓库节点
bash
[root@harbor ~]# dnf install docker-ce -y
[root@harbor ~]# echo br_netfilter > /etc/modules-load.d/docker_mod.conf
[root@harbor ~]# modprobe -a br_netfilter
[root@harbor ~]# 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
[root@harbor ~]# systemctl restart systemd-modules-load.service
[root@harbor ~]# sysctl --system
[root@harbor ~]# vim /lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --iptables=true
[root@harbor ~]# systemctl daemon-reload
[root@harbor ~]# systemctl enable --now docker
生成key
bash
[root@harbor ~]# mkdir /data/certs -p
[root@harbor ~]# mkdir /data/certs -p
[root@harbor ~]# openssl req -newkey rsa:4096 \
-nodes -sha256 -keyout /data/certs/timinglee.org.key \
-addext "subjectAltName = DNS:reg.timinglee.org" \
-x509 -days 365 -out /data/certs/timinglee.org.crt
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:CQ
Locality Name (eg, city) [Default City]:SHANPING
Organization Name (eg, company) [Default Company Ltd]:kubernetes
Organizational Unit Name (eg, section) []:harbor
Common Name (eg, your name or your server's hostname) []:reg.timinglee.org
Email Address []:2753086580@qq.com
编辑harbor配置文件
bash
[root@harbor ~]# tar zxf harbor-offline-installer-v2.5.4.tgz -C /opt/
[root@harbor ~]# cd /opt/harbor/
[root@harbor harbor]# ls
common.sh harbor.v2.5.4.tar.gz harbor.yml.tmpl install.sh LICENSE prepare
[root@harbor harbor]# cp harbor.yml.tmpl harbor.yml
[root@harbor harbor]# vim harbor.yml
hostname: reg.timinglee.org
certificate: /data/certs/timinglee.org.crt
private_key: /data/certs/timinglee.org.key
harbor_admin_password: lee #登录密码
[root@harbor harbor]# ./install.sh --with-chartmuseum
#编写启动脚本
[root@harbor ~]# vim /lib/systemd/system/harbor.service
[Unit]
Description=harbor with Docker Compose
Documentation=https://reg.timinglee.com/compose/
After=docker.service network-online.target
Requires=docker.service
[Service]
Type=oneshot
WorkingDirectory=/opt/harbor
ExecStart=/usr/bin/docker compose up -d
ExecStop=/usr/bin/docker compose down
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
#关闭容器
[root@harbor harbor]# docker compose down
[root@harbor ~]# systemctl enable --now harbor
[root@harbor harbor]# docker compose ps
启动并验证
bash
[root@harbor harbor]# mkdir /etc/docker/certs.d/reg.timinglee.org/ -p
[root@harbor harbor]# cp /data/certs/timinglee.org.crt /etc/docker/certs.d/reg.timinglee.org/ca.crt
[root@harbor harbor]# vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
172.25.254.250 harbor reg.timinglee.org
[root@harbor harbor]# systemctl restart docker
[root@harbor harbor]# docker compose up -d
[root@harbor harbor]# docker login reg.timinglee.org -u admin
Password:
WARNING! Your credentials are stored unencrypted in '/root/.docker/config.json'.
Configure a credential helper to remove this warning. See
https://docs.docker.com/go/credential-store/
Login Succeeded

六.构建部署kubernetes所需主机(用ansible搭建)
关闭swap(所有主机操作)
bash
#需要把以下注释掉
[root@node1/2|harbor|master ~]# vim /etc/fstab

bash
[root@node1/2|harbor|master ~]# systemctl mask swap.target
[root@node1/2|harbor|master ~]# sed '/swap/s/^/#/g' -i /etc/fstab
#记得重启
[root@node1/2|harbor|master ~]# reboot
#无数输出,才是ok
[root@node1/2|harbor|master ~]# swapon -s
[root@node1/2|harbor|master ~]#
ansible介绍
Ansible 是开源自动化运维工具,用 Python 开发,实现批量对多台服务器执行配置、部署、命令、软件安装。
- 特点:无 Agent(不需要在被管机器装客户端),基于 SSH 协议通信。
核心组件
- 控制节点:装 Ansible 的机器,执行运维操作(你的 k8s‑master 可以做控制机)
- 被管主机:被批量操作的服务器(master、node1、node2、harbor)
- Inventory(主机清单):记录所有被管服务器 IP、主机名、分组,/etc/ansible/hosts
- Module(模块):Ansible 内置功能单元,执行实际动作:yum安装、copy传文件、service管理服务、shell执行命令
- Playbook:YAML 编写的自动化剧本,把一堆任务编排,实现复杂自动化,可重复执行。
- Ad‑hoc:单条临时命令,一次性批量执行,不写剧本。
两种使用方式
- Ad‑hoc 临时命令(快速)
bash
# 给所有机器执行hostname命令
ansible all -m shell -a "hostname"
- Playbook 剧本(复杂自动化,生产用)
bash
#yaml 写任务,一键批量部署,例如批量初始化 k8s 节点、安装 docker、配置 hosts、部署 harbor。
- hosts: k8s_nodes
tasks:
- name: 设置主机名
hostname:
name: "{{ inventory_hostname }}"
你的 4 台机器,可以写 inventory 清单,ansible 批量完成:
- 统一修改 hosts 域名解析(harbor.timinglee.org、k8s‑master...)
- 批量关闭防火墙、selinux
- 批量安装 containerd、kubeadm、kubelet,搭建 k8s 集群
- 一键部署 harbor 私有镜像仓库
对比理解(生活例子)
- 手动运维:一台台 ssh 登录敲命令,重复劳动。
- Ansible:一个领班,通过 ssh 远程,同时指挥一批机器干活,写好剧本,反复执行。
优点
- 无 agent,只需要 ssh,被管理机器不用装软件
- Playbook 使用 YAML,可读性好
- 幂等性:重复执行不会搞坏系统,达到期望状态就不再操作
- 可以做配置管理、应用部署、批量命令
缺点
- 依赖 SSH,大批量机器并发性能不如有 agent 工具;
- 复杂大规模集群,执行速度会变慢。
记得在harbor仓库创建公开的k8s文件

安装ansible
bash
[root@harbor ~]# vim /etc/yum.repos.d/epel.repo
[epel]
name = epel
baseurl = https://mirrors.aliyun.com/epel/9/Everything/x86_64/
gpgcheck = 0
[root@harbor ~]# dnf install ansible-core.x86_64 ansible.noarch -y
配置所需用户
bash
[root@harbor ~]# useradd devops
[root@harbor ~]# echo xia | passwd --stdin devops
更改用户 devops 的密码 。
passwd:所有的身份验证令牌已经成功更新
[root@harbor ~]# su - devops
[devops@harbor ~]$ mkdir ansible
[devops@harbor ~]$ cd ansible/
[devops@harbor ansible]$
生成ansible的临时配置文件并建立运行环境
bash
[devops@harbor ansible]$ vim inventory
[servers]
172.25.254.100
172.25.254.20
172.25.254.10
[devops@harbor ansible]$ vim ansible.cfg
[defaults]
inventory = /home/devops/ansible/inventory
remote_user = root
ask_pass = false
host_key_checking = false
[devops@harbor ansible]$ ansible all -m ping
172.25.254.20 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": false,
"ping": "pong"
}
172.25.254.100 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": false,
"ping": "pong"
}
172.25.254.10 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": false,
"ping": "pong"
}
#建立用户
[devops@harbor ansible]$ ansible all -m user -a "name=devops state=present"
[devops@harbor ansible]$ ansible all -m shell -a 'echo "lee" | passwd --stdin devops'
[devops@harbor ansible]$ ansible all -m lineinfile -a 'path=/etc/sudoers line="devops ALL=(ALL) NOPASSWD: ALL" insertafter=EOF'
生成ansible的主配置文件并测试
bash
[devops@harbor ansible]$ vim ansible.cfg
[defaults]
inventory = /home/devops/ansible/inventory
remote_user = devops
ask_pass = false
host_key_checking = false
[privilege_escalation]
become = true
become_method = sudo
become_user = root
become_ask_pass = false
[devops@harbor ansible]$ ansible all -m shell -a 'whoami '
172.25.254.10 | CHANGED | rc=0 >>
root
172.25.254.100 | CHANGED | rc=0 >>
root
172.25.254.20 | CHANGED | rc=0 >>
root
利用ansible剧本部署docker
bash
[devops@harbor ansible]$ vim k8s.yml
- name: devops k8s from ansible
hosts: all
tasks:
- name: setup docker repo
yum_repository:
name: docker
description: docker
baseurl: http://172.25.254.254:4444/docker
file: docker
gpgcheck: no
- name: install docker
dnf:
name: docker-ce
state: present
- name: setup docker.service
replace:
path: /lib/systemd/system/docker.service
regexp: "ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock"
replace: "ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --iptables=true"
- name: setup docker registry
copy:
content: |
{
"registry-mirrors":["https://reg.timinglee.org"]
}
dest: /etc/docker/daemon.json
- name: setup docker certs
file:
path: /etc/docker/certs.d/reg.timinglee.org
state: directory
- name: cp certs file
copy:
src: "{{item.src}}"
dest: "{{item.dest}}"
loop:
- src: /etc/docker/certs.d/reg.timinglee.org/ca.crt
dest: /etc/docker/certs.d/reg.timinglee.org/ca.crt
- src: /etc/docker/certs.d/reg.timinglee.org/ca.crt
dest: /etc/pki/ca-trust/source/anchors/ca.crt
- name: load module
copy:
dest: "{{item.dest}}"
content: "{{item.value}}"
loop:
- dest: /etc/modules-load.d/docker_mod.conf
value: br_netfilter
- dest: /etc/sysctl.d/docker.conf
value: |
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
- name: update ca cert
shell: "update-ca-trust extract;sysctl --system"
- name: start services
service:
name: "{{item}}"
state: restarted
enabled: yes
loop:
- docker
- systemd-modules-load.service
[devops@harbor ansible]$ ansible-playbook k8s.yml
#如果不知道怎么写脚本的话,可以通过以下命令帮助
bash
[devops@harbor ansible]$ ansible-doc +模块名(比如 user,template,yum,dnf)
利用ansible安装cri-dockerd
bash
[devops@harbor ansible]$ tar zxf cri-dockerd-0.4.4.amd64.tgz
[devops@harbor ansible]$ ls
ansible.cfg cri-dockerd cri-dockerd-0.4.4.amd64.tgz inventory kubernetes-devops.yml
[devops@harbor ansible]$ cd cri-dockerd/
[devops@harbor cri-dockerd]$ ls
cri-dockerd cri-docker.service cri-docker.socket
[devops@harbor cri-dockerd]$ vim cri-docker.service
[Service]
Type=notify
ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --network-plugin=cni --pod-infra-container-image=reg.timinglee.org/k8s/pause:3.10.1
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
[devops@harbor ansible]$ vim k8s.yml
- name: devops k8s from ansible
hosts: all
tasks:
- name: setup docker repo
yum_repository:
name: docker
description: docker
baseurl: http://172.25.254.254:4444/docker
file: docker
gpgcheck: no
- name: install docker
dnf:
name: docker-ce
state: present
- name: setup docker.service
replace:
path: /lib/systemd/system/docker.service
regexp: "ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock"
replace: "ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --iptables=true"
- name: setup docker registry
copy:
content: |
{
"registry-mirrors":["https://reg.timinglee.org"]
}
dest: /etc/docker/daemon.json
- name: setup docker certs
file:
path: /etc/docker/certs.d/reg.timinglee.org
state: directory
- name: cp certs file
copy:
src: "{{item.src}}"
dest: "{{item.dest}}"
loop:
- src: /etc/docker/certs.d/reg.timinglee.org/ca.crt
dest: /etc/docker/certs.d/reg.timinglee.org/ca.crt
- src: /etc/docker/certs.d/reg.timinglee.org/ca.crt
dest: /etc/pki/ca-trust/source/anchors/ca.crt
########################################################
- name: stup cri-dockerd
copy:
src: "{{item.src}}"
dest: "{{item.dest}}"
mode: '0755'
loop:
- src: ./cri-dockerd/cri-dockerd
dest: /usr/bin/cri-dockerd
- src: "./cri-dockerd/cri-docker.service"
dest: "/lib/systemd/system/cri-docker.service"
- src: "./cri-dockerd/cri-docker.socket"
dest: "/lib/systemd/system/cri-docker.socket"
- name: update ca cert
shell: "update-ca-trust extract;sysctl --system;systemctl daemon-reload"
- name: start services
service:
name: "{{item}}"
state: restarted
enabled: yes
loop:
- docker
- systemd-modules-load.service
- cri-docker
[devops@harbor ansible]$ ansible-playbook k8s.yml
利用ansible部署k8s软件
bash
[devops@harbor ansible]$ vim k8s.yml
- name: install kubernetes from ansible
hosts: all
tasks:
- name: setup k8s repo
yum_repository:
name: kubernetes
description: kubernetes
baseurl: https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.35/rpm
file: kubernetes
gpgcheck: no
- name: install software in master
dnf:
name: "{{item}}"
state: present
loop:
- kubeadm-1.35.7-150500.1.1
- kubelet-1.35.7-150500.1.1
- kubectl-1.35.7-150500.1.1
when: inventory_hostname == "172.25.254.100"
- name: install software in work node
dnf:
name: "{{item}}"
state: present
loop:
- kubeadm-1.35.7-150500.1.1
- kubelet-1.35.7-150500.1.1
when: inventory_hostname == "172.25.254.10" or inventory_hostname == "172.25.254.20"
- name: setup kubectl kubeadm complication
lineinfile:
path: /root/.bashrc
line: |
source <(kubectl completion bash)
source <(kubeadm completion bash)
when: inventory_hostname == "172.25.254.100"
- name: start kubelet
service:
name: kubelet
state: started
enabled: yes
[devops@harbor ansible]$ ansible-playbook kubernetes-devops.yml
#让补齐功能生效
[root@k8s-master mnt]# source ~/.bashrc
[root@k8s-master mnt]# kubectl 命令后按2此tab键
alpha (Commands for features in alpha)
annotate (更新一个资源的注解)
api-resources (Print the supported API resources on the server)
api-versions (Print the supported API versions on the server, in the form of "group/version")
apply (Apply a configuration to a resource by file name or stdin)
attach (挂接到一个运行中的容器)
auth (Inspect authorization)
autoscale (Auto-scale a deployment, replica set, stateful set, or replication controller)
certificate (Modify certificate resources)
[root@k8s-master mnt]# kubeadm
certs config init kubeconfig token version
completion help join reset upgrade
#没变绿是正常的,后面初始化可以变绿
[root@k8s-master mnt]# systemctl status kubelet.service
● kubelet.service - kubelet: The Kubernetes Node Agent
Loaded: loaded (/usr/lib/systemd/system/kubelet.service; enabled; preset: disabled)
Drop-In: /usr/lib/systemd/system/kubelet.service.d
└─10-kubeadm.conf
Active: activating (auto-restart) (Result: exit-code) since Tue 2026-08-18 17:09:25 CST; 1s ago
Docs: https://kubernetes.io/docs/
Process: 79433 ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_>
Main PID: 79433 (code=exited, status=1/FAILURE)
打开harbor仓库看是否成功

七.在master中初始化kubernetes集群
添加kubernets环境变量到本机
bash
[root@master ~]# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" > ~/.bash_profile
[root@master ~]# source ~/.bash_profile
在master中完成集群初始化
bash
[root@master ~]# kubeadm init --pod-network-cidr=10.244.0.0/16 \
--image-repository reg.timinglee.org/k8s \
--kubernetes-version v1.35.7 \
--cri-socket=unix:///var/run/cri-dockerd.sock
#master本集群的凭证,如果忘记,可以通过以下查询
[root@master ~]# kubeadm token create --print-join-command
kubeadm join 172.25.254.100:6443 --token m5ay2n.lw75n4kqe9j6ild3 --discovery-token-ca-cert-hash sha256:4933cf96a92b2d06102614ffa2421b2ec4ab4071bc1bfd68cfdaf99a8754f84d
#如果初始化出问题
[root@master ~]# kubeadm reset --cri-socket=unix:///var/run/cri-dockerd.sock #可以重置集群设定
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master NotReady control-plane 102s v1.35.3
添加node节点到本集群
bash
[root@node1/2 ~]# kubeadm join 172.25.254.100:6443 --token kubeadm join 172.25.254.100:6443 kubeadm join 172.25.254.100:6443 --token m5ay2n.lw75n4kqe9j6ild3 --discovery-token-ca-cert-hash sha256:4933cf96a92b2d06102614ffa2421b2ec4ab4071bc1bfd68cfdaf99a8754f84d--cri-socket=unix:///var/run/cri-dockerd.sock
#测试
[root@master ~]# kubectl get nodes #可以看到集群中主机但是因为网络插件问题状态是NotReady
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready control-plane 6m12s v1.35.7
node1 NotReady <none> 45s v1.35.7
node2 NotReady <none> 56s v1.35.7
安装网络插件
#记得在harbor仓库创建"flannel"目录

bash
[root@k8s-master ~]# tar zxf kube-flannel-v0.28.9.tar.gz
[root@k8s-master ~]# ls
flannel kube-flannel-v0.28.9.tar.gz
[root@k8s-master ~]# cd flannel/
[root@k8s-master flannel]# docker load -i kube-flannel-v0.28.9.tar
Loaded image: ghcr.io/flannel-io/flannel-cni-plugin:v1.9.1-flannel3
Loaded image: ghcr.io/flannel-io/flannel:v0.28.9
[root@master ~]# docker tag ghcr.io/flannel-io/flannel-cni-plugin:v1.9.0-flannel1 reg.timinglee.org/flannel/flannel-cni-plugin
[root@master ~]# docker push reg.timinglee.org/flannel/flannel-cni-plugin
[root@master ~]# docker tag ghcr.io/flannel-io/flannel:v0.28.1 reg.timinglee.org/flannel-io/flannel
[root@master ~]# docker push reg.timinglee.org/flannel-io/flannel
[root@master ~]# vim kube-flannel.yml
image: flannel-io/flannel:v0.28.1
image: flannel-io/flannel-cni-plugin:v1.9.0-flannel1
image: flannel-io/flannel:v0.28.1
[root@k8s-master flannel]# grep -n image: kube-flannel.yml #要改内容所在行的位置
148: image: flannel-io/flannel:v0.28.9
175: image: flannel-io/flannel-cni-plugin:v1.9.1-flannel3
186: image: flannel-io/flannel:v0.28.9
[root@master ~]# kubectl apply -f kube-flannel.yml

bash
#测试
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready control-plane 14m v1.35.7
node1 Ready <none> 8m15s v1.35.7
node2 Ready <none> 7m56s v1.35.7
感谢各位耐心看完这篇博客。写作过程也是自我梳理复盘的过程,难免会有考虑不周的地方,欢迎大家批评指正。希望这篇内容能够对你有所帮助,我们下篇博文再会。
