智能
助手
最大化  清空记录 停止  历史记录
翻译选中文本
选中一段文本后进行翻译
名词解释
选中一段文本后进行名词解释
知识图谱生成
通过图谱展示知识信息
登录用户在知识浏览页面可用
答案生成
AI自动回答一个问答功能中的问题
登录用户在问答浏览页面,且问题开放回答中可用
知识摘要
自动为当前知识生成摘要
知识浏览页面可用
知识问答
针对当前知识进行智能问答
知识浏览面可用
2025-12-29 19:34:42 版本 : 3. k8s单master节点部署
作者: 文艺范儿 于 2025年12月29日 发布在分类 / Docker & K8S / K8S基础 下,并于 2025年12月29日 编辑
 历史版本

备注 修改日期 修改人
创建版本 2025-12-29 19:34:42[当前版本] 文艺范儿

3. k8s单master节点部署

3.1 节点规划

架构图

graph TB
    subgraph "Master 控制节点"
        M[Master<br/>192.168.1.231]
        API[kube-apiserver<br/>6443]
        DB[etcd<br/>数据库]
    end

    subgraph "Worker 计算节点"
        W1[Worker-01<br/>192.168.1.232]
        W2[Worker-02<br/>192.168.1.233]
    end

    subgraph "网络组件"
        F[Flannel<br/>Pod网络]
        DNS[CoreDNS]
    end

    %% 连接关系
    M -->|管理| W1
    M -->|管理| W2
    M --> API
    API --> DB
    W1 --> F
    W2 --> F
    M --> DNS
    W1 -->|运行业务| POD1[业务 Pod]
    W2 -->|运行业务| POD2[业务 Pod]

3.1.1 节点角色分配

在资源有限情况下,采用 “master + 双 Worker” 混合架构(生产推荐):

主机名 IP 地址 角色 关键组件 配置要求 说明

k8s-master-01

192.168.1.231

Control Plane + Etcd

kube-apiserver<br/>kube-controller-manager<br/>kube-scheduler<br/>etcd

高配(CPU ≥ 8 核,内存 ≥ 16GB)

控制平面主节点

k8s-worker-01

192.168.1.232

Worker节点1

kubelet<br/>kube-proxy<br/>containerd

中配(CPU ≥ 4 核,内存 ≥ 8GB)

纯工作节点,运行业务 Pod

k8s-worker-02

192.168.1.233

Worker节点2

kubelet<br/>kube-proxy<br/>containerd

中配(CPU ≥ 4 核,内存 ≥ 8GB)

纯工作节点,运行业务 Pod

k8s-harbor-01

192.168.1.250

harbor

中配(CPU ≥ 4 核,内存 ≥ 8GB)

私有镜像仓库

3.1.2 IP地址规划

用途 IP/域名 端口 说明

K8s API Server VIP

192.168.1.100

6443

Keepalived 虚拟 IP

Master 节点

192.168.1.231

22, 6443, 2379-2380

SSH, API, etcd

Worker 节点 1

192.168.1.232

22, 10250, 30000-32767

SSH, kubelet, NodePort

Worker 节点 2

192.168.1.233

22, 10250, 30000-32767

SSH, kubelet, NodePort

Harbor 节点

192.168.1.250

22, 80, 443, 5000

SSH, HTTP, HTTPS, Docker Registry

Pod 网络 CIDR

10.100.0.0/16

-

Calico 默认,可容纳 65535 个 Pod

Service CIDR

10.200.0.0/16

-

Kubernetes Service 网段

3.1.3 最低硬件要求(生产环境)

组件 k8s-master-01 k8s-worker-01/02 说明

CPU

8 核(支持虚拟化)

4 核

主节点需运行 etcd(高 CPU 敏感)

内存

16GB(12GB 可用)

8GB(6GB 可用)

预留 4GB 给系统与 Kubernetes 组件

存储

200GB SSD(≥ 5000 IOPS)

100GB SSD(≥ 3000 IOPS)

etcd 必须用 SSD,避免性能瓶颈

网络

双千兆网卡(bonding 或独立管理/数据平面)

千兆网卡

管理网与数据网分离(生产推荐)

3.1.4 关键监控指标

指标 告警阈值 处理措施

节点 CPU 使用率

> 80% 持续 5min

检查 Pod 资源限制,考虑扩容

节点内存使用率

> 85% 持续 3min

检查内存泄漏,清理未使用 Pod

etcd 写延迟

> 100ms 持续 1min

检查 etcd 磁盘性能,考虑 SSD 升级

API Server 错误率

> 5% 持续 2min

检查认证/授权配置,重启 apiserver

3.1.5 操作系统与内核优化

所有节点统一配置:

# 1. 操作系统选择(三选一)
- Ubuntu 22.04 LTS(推荐,社区支持好)


# 2. 内核参数优化(/etc/sysctl.d/k8s.conf)
cat > /etc/sysctl.d/99-k8s.conf << EOF
# 网络转发
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1

# 连接跟踪
net.netfilter.nf_conntrack_max = 131072
net.nf_conntrack_max = 131072

# TCP 优化
net.core.somaxconn = 32768
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30

# 内存管理
vm.swappiness = 0
vm.overcommit_memory = 1
vm.panic_on_oom = 0

# 文件系统
fs.file-max = 2097152
fs.inotify.max_user_instances = 8192
EOF
sysctl -p /etc/sysctl.d/99-k8s.conf

# 3. 系统服务禁用
systemctl disable firewalld --now  # 使用 iptables/calico 策略
systemctl disable swap --now       # 必须关闭 swap
swapoff -a && sed -i '/swap/d' /etc/fstab

# 4. 时间同步(必须)
timedatectl set-timezone Asia/Shanghai
systemctl enable systemd-timesyncd
systemctl start systemd-timesyncd

# 5.节点统一配置主机名
cat >> /etc/hosts << EOF
# Kubernetes Cluster
192.168.1.100 k8s-api.wyasw.com k8s-api
192.168.1.231 k8s-master-01
192.168.1.232 k8s-worker-01
192.168.1.233 k8s-worker-02
192.168.1.250 harbor.wyasw.com harbor k8s-harbor-01
EOF

#6. 配置 SSH 密钥互信(可选,便于管理),如果使用root需要在sshd添加允许root登录
ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa
for node in k8s-master-01 k8s-worker-01 k8s-worker-02 k8s-harbor-01; do
  ssh-copy-id -i ~/.ssh/id_rsa.pub $node
done

3.2 部署方式全景

graph TB
    A[Kubernetes 部署方式] --> B[本地/开发]
    A --> C[云端托管]
    A --> D[物理机/边缘]
    A --> E[混合/多云]

    B --> B1[Minikube/Kind]
    B --> B2[kubeadm]

    C --> C1[云托管 EKS/GKE/AKS]
    C --> C2[自动化脚本 Kops/Kubespray]

    D --> D1[裸金属部署]
    D --> D2[边缘部署 K3s/KubeEdge]

    E --> E1[混合云 Rancher]
    E --> E2[多云 Cluster API]

    style A fill:#f9f,stroke:#333
    style B1 fill:#ccf,stroke:#333
    style C1 fill:#cfc,stroke:#333

部署方式选型矩阵

部署方式 学习成本 运维复杂度 适用规模 高可用性 适用场景

Minikube

1 节点

本地开发、学习

Kind

⭐⭐

1 节点

CI/CD 测试、快速验证

kubeadm

⭐⭐⭐

⭐⭐⭐

3-100 节点

中小生产、PoC

Kops

⭐⭐⭐

⭐⭐

10-1000 节点

AWS 生产环境

Kubespray

⭐⭐⭐⭐

⭐⭐⭐⭐

10-500 节点

多云/私有云生产

云托管

无上限

✅✅

企业生产(免运维控制平面)

K3s

⭐⭐

⭐⭐

1-100 节点

边缘计算、资源受限环境

Rancher

⭐⭐⭐

⭐⭐

10-5000 节点

✅✅

混合云管理、多集群

3.3 harbor基于自建证书搭建

3.3.1 部署harbor

安装docker

安装harbor

此处省略…

3.3.2 自建证书

3.3.2.1 创建证书存放目录

# 创建证书存放目录,并进入目录
[root@k8s-harbor ~]# mkdir -pv /home/deploy/harbor/certs/{ca,harbor-server,docker-client}
[root@k8s-harbor ~]# cd /home/deploy/harbor/certs

3.3.2.2 生成自建的CA证书

# 1.创建CA的私钥
[root@k8s-harbor certs]# openssl genrsa -out ca/ca.key 4096

# 2.基于自建的CA私钥生成CA证书(注意:域名是wyasw.com)
[root@k8s-harbor certs]# openssl req -x509 -new -nodes -sha512 -days 3650 \
 -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=wyasw.com" \
 -key ca/ca.key \
 -out ca/ca.crt

# 3.查看自建证书信息
[root@k8s-harbor certs]# openssl  x509 -in ca/ca.crt -noout -text

3.3.2.3 配置harbor证书

# 1.生成harbor服务器的私钥
[root@k8s-harbor certs]# openssl genrsa -out harbor-server/harbor.wyasw.com.key 4096

# 2.harbor服务器基于私钥签发证书认证请求(csr文件),让自建CA认证
[root@k8s-harbor certs]# openssl req -sha512 -new \
    -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=harbor.wyasw.com" \
    -key harbor-server/harbor.wyasw.com.key \
    -out harbor-server/harbor.wyasw.com.csr

# 3.生成 x 509 v3 的扩展用于认证
[root@k8s-harbor certs]# cat > harbor-server/v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
DNS.1=harbor.wyasw.com
EOF

# 4.基于 x509 v3 的扩展文件认证签发harbor server证书
[root@k8s-harbor certs]# openssl x509 -req -sha512 -days 3650 \
    -extfile harbor-server/v3.ext \
    -CA ca/ca.crt -CAkey ca/ca.key -CAcreateserial \
    -in harbor-server/harbor.wyasw.com.csr \
    -out harbor-server/harbor.wyasw.com.crt

3.3.2.4 修改harbor的配置文件使用自建证书

# 1. 修改harbor的配置文件
[root@k8s-harbor certs]# cd /opt/harbor/
[root@k8s-harbor harbor]# vim harbor.yml
...
hostname: harbor.wyasw.com
...
https:
  port: 443
  certificate: /home/deploy/harbor/certs/harbor-server/harbor.wyasw.com.crt
  private_key: /home/deploy/harbor/certs/harbor-server/harbor.wyasw.com.key
...

# 2.开始安装harbor
[root@k8s-harbor harbor]# ./prepare
[root@k8s-harbor harbor]# ./install.sh

# 3.安装完成用web访问
# hosts添加
192.168.1.250  harbor.wyasw.com
#访问
https://harbor.wyasw.com

3.4 k8s集群节点配置docker客户端证书

3.4.1 全部节点安装docker

安装docker,此处省略。。。

3.4.2 harbor服务端生成docker客户端证书

# 1.harbor服务端生成docker客户端证书
[root@k8s-harbor ~]# cd /home/deploy/harbor/certs/
[root@k8s-harbor certs]#  openssl x509 -inform PEM -in harbor-server/harbor.wyasw.com.crt -out docker-client/harbor.wyasw.com.cert
# 本质其实是复制
[root@k8s-harbor certs]# md5sum harbor-server/harbor.wyasw.com.crt docker-client/harbor.wyasw.com.cert 
e5c1bb27e68b904a40e2cc54aa28cd01  harbor-server/harbor.wyasw.com.crt
e5c1bb27e68b904a40e2cc54aa28cd01  docker-client/harbor.wyasw.com.cert

# 3.拷贝docker client证书文件
[root@k8s-harbor certs]# cp harbor-server/harbor.wyasw.com.key docker-client/
[root@k8s-harbor certs]# cp ca/ca.crt docker-client/

3.4.3 docker客户端(k8s所有节点)使用证书

# 1.docker客户端创建证书目录(所有节点)
mkdir -pv /etc/docker/certs.d/harbor.wyasw.com/

# 2.将客户端证书文件分发到所有集群节点
[root@k8s-harbor certs]# scp docker-client/* 192.168.1.231:/etc/docker/certs.d/harbor.wyasw.com/
[root@k8s-harbor certs]# scp docker-client/* 192.168.1.232:/etc/docker/certs.d/harbor.wyasw.com/
[root@k8s-harbor certs]# scp docker-client/* 192.168.1.233:/etc/docker/certs.d/harbor.wyasw.com/

# 3.docker客户端验证(所有节点)
[root@k8s-master-01 ~]# docker login -u admin -p 123456 harbor.wyasw.com
WARNING! Using --password via the CLI is insecure. Use --password-stdin.

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

[root@k8s-worker-01 ~]# docker login -u admin -p 123456 harbor.wyasw.com

[root@k8s-worker-02 ~]# docker login -u admin -p 123456 harbor.wyasw.com

3.5 k8s各节点环境准备

参考链接:
https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

此文档前面优化做过:所有节点检查下即可。

# 1.关闭swap分区

# 2.确保各节点MAC地址或product_uuid唯一
ifconfig  ens34  | grep ether | awk '{print $2}'
ifconfig  ens35  | grep ether | awk '{print $2}'
cat /sys/class/dmi/id/product_uuid 

# 3.检查网络是否互通
ping baidu.com

# 4.允许iptables桥接流量
cat <<EOF | tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

cat <<EOF | tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
sysctl --system

# 5.检查端口是否被占用
参考链接: https://kubernetes.io/zh-cn/docs/reference/networking/ports-and-protocols/

# 6.所有节点修改cgroup的管理进程为systemd
docker info  | grep "Cgroup Driver:"

3.6 安装k8s各组件

参考链接:

https://kubernetes.io/zh-cn/docs/tasks/tools/install-kubectl-linux/

https://developer.aliyun.com/mirror/kubernetes/

3.6.1 软件包说明

kubeadm:
    Kubeadm 为构建 Kubernetes 提供了便捷、高效的“最佳实践” ,该工具提供了初始化完整 Kubernetes 过程所需的组件,其主要命令及功能有:
    kubeadm init:用于搭建 Kubernetes 控制平面节点;
    kubeadm join:用于搭建 Kubernetes 工作节点并将其加入到集群中;
    kubeadm upgrade:用于升级 Kubernetes 集群到新版本;
    kubeadm token:用于管理 kubeadm join 使用的 token;
    kubeadm reset:用于恢复(重置)通过 kubeadm init 或者 kubeadm join 命令对节点进行的任何变更;
    kubeadm certs:用于管理 Kubernetes 证书;
    kubeadm kubeconfig:用于管理 kubeconfig 文件;
    kubeadm version:用于显示(查询)kubeadm 的版本信息;
    kubeadm alpha:用于预览当前从社区收集到的反馈中的 kubeadm 特性。

kubelet:
    kubelet 是 Kubernetes 集群中用于操作 Docker 、containerd 等容器运行时的核心组件,需要在每个节点运行。通常该操作是基于 CRI 实现,kubelet 和 CRI 交互,以便于实现对 Kubernetes 的管控。

kubectl:
    kubectl 控制 Kubernetes 集群管理器,是作为 Kubernetes 的命令行工具,用于与 apiserver 进行通信,使用 kubectl 工具在 Kubernetes 上部署和管理应用程序。
使用 kubectl,可以检查群集资源的创建、删除和更新组件。

kubeadm不能帮你安装或者管理kubelet或kubectl,所以你需要确保它们与通过kubeadm安装的控制平面(master)的版本相匹配。 如果不这样做,则存在发生版本偏差的风险,可能会导致一些预料之外的错误和问题。

kubectl 版本和集群版本之间的差异必须在一个小版本号内。 例如:v1.35 版本的客户端能与 v1.34、 v1.35 和 v1.36 版本的控制面通信。 用最新兼容版的 kubectl 有助于避免不可预见的问题。

3.6.2 k8s所有节点配置阿里云软件源

# 新版 kubernetes 源按照安装版本区分不同仓库,该文档示例为配置 1.34 版本,如需其他版本请在对应位置字符串替换即可。

# 所有节点执行
apt-get update && apt-get install -y apt-transport-https

curl -fsSL https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.34/deb/Release.key |
    gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.34/deb/ /" |
    tee /etc/apt/sources.list.d/kubernetes.list

apt-get update

# 完成以后,查看当前环境支持安装源的k8s版本
[root@k8s-master-01 ~]# apt-cache madison kubeadm
   kubeadm | 1.34.3-1.1 | https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.34/deb  Packages
   kubeadm | 1.34.2-1.1 | https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.34/deb  Packages
   kubeadm | 1.34.1-1.1 | https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.34/deb  Packages
   kubeadm | 1.34.0-1.1 | https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.34/deb  Packages

3.6.3 所有节点安装kubelet kubeadm kubectl

也可以在 https://mirrors.aliyun.com/kubernetes-new/core/stable/ 下面找到对应版本的deb或者rpm包下载后用包管理工具安装。

# 1.k8s-master-01节点安装
[root@k8s-master-01 ~]# apt-get -y install kubelet=1.34.3-1.1 kubeadm=1.34.3-1.1 kubectl=1.34.3-1.1

# 2.k8s-worker-01节点安装
[root@k8s-worker-01 ~]# apt-get -y install kubelet=1.34.3-1.1 kubeadm=1.34.3-1.1 kubectl=1.34.3-1.1

# 3.k8s-worker-02节点安装
[root@k8s-worker-02 ~]# apt-get -y install kubelet=1.34.3-1.1 kubeadm=1.34.3-1.1 kubectl=1.34.3-1.1

3.6.4 检查各组件版本

# 确定所有节点安装的版本都一直

[root@k8s-master-01 ~]# kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"34", EmulationMajor:"", EmulationMinor:"", MinCompatibilityMajor:"", MinCompatibilityMinor:"", GitVersion:"v1.34.3", GitCommit:"df11db1c0f08fab3c0baee1e5ce6efbf816af7f1", GitTreeState:"clean", BuildDate:"2025-12-09T15:05:15Z", GoVersion:"go1.24.11", Compiler:"gc", Platform:"linux/amd64"}

[root@k8s-master-01 ~]# kubectl version
Client Version: v1.34.3
Kustomize Version: v5.7.1
The connection to the server localhost:8080 was refused - did you specify the right host or port?

[root@k8s-master-01 ~]# kubelet --version
Kubernetes v1.34.3

3.7 基于kubeadm组件初始化k8s的master组件

3.7.1 使用 cri-dockerd(注意:所有节点安装)

Kubernetes 1.24+ 移除了 dockershim,所以需要使用 cri-dockerd 来连接 Docker

# 下载并安装 cri-dockerd
# 访问 https://github.com/Mirantis/cri-dockerd/releases 获取最新版本
# 或者直接使用以下命令(请根据实际情况调整版本):

# 对于 Ubuntu/Debian:

# wget https://beijing-wy.oss-cn-beijing.aliyuncs.com/linux-test/cri-dockerd_0.3.21.3-0.ubuntu-jammy_amd64.deb

wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.21/cri-dockerd_0.3.21.3-0.ubuntu-jammy_amd64.deb
dpkg -i cri-dockerd_0.3.21.3-0.ubuntu-jammy_amd64.deb

vim /usr/lib/systemd/system/cri-docker.service
# 修改下面这一行为,注意:不添加会导致k8s初始化失败
ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.10.1
## 添加了 --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.10.1
## 指定 Kubernetes 网络插件的类型为cni,指定 Pod 基础架构容器(也称为 "pause" 容器)的镜像

systemctl enable cri-docker
systemctl daemon-reload
systemctl restart cri-docker


# 完成可以看到
[root@k8s-master-01 ~]# ps -ef|grep cri-docker
root        2543       1  0 22:41 ?        00:00:00 /usr/bin/cri-dockerd --container-runtime-endpoint fd:// --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.10.1

3.7.2 准备集群镜像(master-01节点)

# 1.在安装kubernetes集群之前,必须要提前准备好集群需要的镜像,所需镜像可以通过下面命令查看
[root@k8s-master-01 ~]# kubeadm config images list
I1228 20:47:00.575839    3611 version.go:260] remote version is much newer: v1.35.0; falling back to: stable-1.34
registry.k8s.io/kube-apiserver:v1.34.3
registry.k8s.io/kube-controller-manager:v1.34.3
registry.k8s.io/kube-scheduler:v1.34.3
registry.k8s.io/kube-proxy:v1.34.3
registry.k8s.io/coredns/coredns:v1.12.1
registry.k8s.io/pause:3.10.1
registry.k8s.io/etcd:3.6.5-0

# 2.下载镜像:此镜像在kubernetes的仓库中,由于网络原因,无法连接,下面提供了一种替代方案下载这些镜像
[root@k8s-master-01 ~]# kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers --cri-socket unix:///var/run/cri-dockerd.sock

3.7.2 使用kubeadm组件初始化k8s(master-01节点)

[root@k8s-master-01 ~]# kubeadm init \
  --kubernetes-version=v1.34.3 \
  --image-repository registry.aliyuncs.com/google_containers \
  --pod-network-cidr=10.100.0.0/16 \
  --service-cidr=10.200.0.0/16 \
  --service-dns-domain=wyasw.com \
  --cri-socket unix:///var/run/cri-dockerd.sock

说明:

# 相关参数说明:
    --kubernetes-version:
        指定要安装的 Kubernetes 版本
    --image-repository:
        指定 Kubernetes 镜像的下载仓库(默认值:registry.k8s.io(官方仓库,国内访问较慢))
    --pod-network-cidr:
        指定 Pod 网络的 CIDR 范围(为每个 Pod 分配 IP 地址的范围,注意:必须与后续安装的网络插件配置匹配)
    --service-cidr:
        指定 Service 网络的 CIDR 范围(Kubernetes Service 的虚拟 IP 地址范围,kube-proxy 使用这个网段来实现 Service 的负载均衡)
    --service-dns-domain:
        指定集群内部 Service 的 DNS 域名后缀。若不指定,默认为"cluster.local"。
    --cri-socket
        指定容器运行时接口(CRI)的套接字路径

# 使用kubeadm初始化集群时,会出现类似如下的输出信息:
    [init] 
        使用初始化的K8S版本。

    [preflight] 
        主要是做安装K8S集群的前置工作,比如下载镜像,这个时间取决于你的网速。

    [certs] 
        生成证书文件,默认存储在"/etc/kubernetes/pki"目录哟。

    [kubeconfig]
        生成K8S集群的默认配置文件,默认存储在"/etc/kubernetes"目录哟。

    [kubelet-start] 
        启动kubelet,
        环境变量默认写入:"/var/lib/kubelet/kubeadm-flags.env"
        配置文件默认写入:"/var/lib/kubelet/config.yaml"

    [control-plane]
        使用静态的目录,默认的资源清单存放在:"/etc/kubernetes/manifests"。
        此过程会创建静态Pod,包括"kube-apiserver","kube-controller-manager"和"kube-scheduler"

    [etcd] 
        创建etcd的静态Pod,默认的资源清单存放在:""/etc/kubernetes/manifests"

    [wait-control-plane] 
        等待kubelet从资源清单目录"/etc/kubernetes/manifests"启动静态Pod。

    [apiclient]
        等待所有的master组件正常运行。

    [upload-config] 
        创建名为"kubeadm-config"的ConfigMap在"kube-system"名称空间中。

    [kubelet] 
        创建名为"kubelet-config"的ConfigMap在"kube-system"名称空间中,其中包含集群中kubelet的配置

    [upload-certs] 
        跳过此节点,详情请参考”--upload-certs"

    [mark-control-plane]
        标记控制面板,包括打标签和污点,目的是为了标记master节点。

    [bootstrap-token] 
        创建token口令,例如:"9i8c9s.jszd2nzr9meh3dia"。
        这个口令将来在加入集群节点时很有用,而且对于RBAC控制也很有用处

    [kubelet-finalize] 
        更新kubelet的证书文件信息/etc/kubernetes/kubelet.conf

    [addons] 
        添加附加组件,例如:"CoreDNS"和"kube-proxy”

成功后会出现类似以下输出,说明k8s control-plane 初始化成功:

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.1.231:6443 --token 2lz6b1.dj3xziiics88kxyl \
    --discovery-token-ca-cert-hash sha256:49a5966b6790ffc593f8e25362b319cb881d5bbf863690957175bc16dada5fe0

如果出现错误:

# 如果出现报错,可以清理集群初始化产生的文件和停止kubelet进程,删除所有容器,重新尝试
rm -rf /etc/kubernetes/*
rm -rf /var/lib/etcd/*
rm -rf ~/.kube/*
rm -rf /var/lib/cni/*
rm -rf /opt/cni/*
rm -rf /etc/cni/

kill -9 $(ps -ef|grep -v grep|grep kubelet|awk -F ' ' '{ print $2 }')
docker rm -f $(docker ps -aq)
kubeadm reset -f --cri-socket unix:///var/run/cri-dockerd.sock
docker volume prune -f
docker network prune -f

# 删除未使用的资源
docker system prune -af

# 查看日志
journalctl -u kubelet --no-pager|grep err

# 如果忘记添加节点密钥,可以选择重新生成
kubeadm token create --print-join-command

# 若想预执行添加--dry-run参数

3.7.3 拷贝授权文件,用于管理k8s集群(master-01节点)

[root@k8s-master-01 ~]# mkdir -p $HOME/.kube
[root@k8s-master-01 ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@k8s-master-01 ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config

3.7.4 查看集群节点(master-01节点)

# 检查 kube-system 命名空间中的控制平面 Pod
[root@k8s-master-01 ~]# kubectl get pods -n kube-system -l tier=control-plane
NAME                                    READY   STATUS    RESTARTS   AGE
etcd-k8s-master-01                      1/1     Running   0          21m
kube-apiserver-k8s-master-01            1/1     Running   0          21m
kube-controller-manager-k8s-master-01   1/1     Running   0          21m
kube-scheduler-k8s-master-01            1/1     Running   0          21m

# 查看节点信息
[root@k8s-master-01 ~]# kubectl get nodes
NAME            STATUS     ROLES           AGE   VERSION
k8s-master-01   NotReady   control-plane   20m   v1.34.3

# 检查 API Server 健康状态
kubectl cluster-info

# 查看节点详细信息
kubectl describe node $(hostname)

3.8 基于kubeadm部署worker组件

3.8.1 在所有worker节点执行加入的命令(worker-01 and worker-02)

# 注意:初始化主节点的时候,会输出加入的命令,在输出的命令后面添加--cri-socket unix:///var/run/cri-dockerd.sock 即可

[root@k8s-worker-01 ~]# kubeadm join 192.168.1.231:6443 --token 2lz6b1.dj3xziiics88kxyl \
    --discovery-token-ca-cert-hash sha256:49a5966b6790ffc593f8e25362b319cb881d5bbf863690957175bc16dada5fe0 \
    --cri-socket unix:///var/run/cri-dockerd.sock

[root@k8s-worker-02 ~]# kubeadm join 192.168.1.231:6443 --token 2lz6b1.dj3xziiics88kxyl \
    --discovery-token-ca-cert-hash sha256:49a5966b6790ffc593f8e25362b319cb881d5bbf863690957175bc16dada5fe0 \
    --cri-socket unix:///var/run/cri-dockerd.sock

3.8.2 master节点查看集群的worker节点

[root@k8s-master-01 ~]# kubectl get nodes
NAME            STATUS     ROLES           AGE     VERSION
k8s-master-01   NotReady   control-plane   32m     v1.34.3
k8s-worker-01   NotReady   <none>          2m20s   v1.34.3
k8s-worker-02   NotReady   <none>          105s    v1.34.3

# 此时K8S组件就算部署成功了,但是容器的网络依旧没有准备就绪,因此各节点处于“NotReady”状态

3.9 部署CNI插件并验证Pod网络连通性

3.9.1 使用官方 Flannel YAML 并修改应用(master-01节点)

# 1. 下载官方 Flannel YAML(注意版本)
# wget https://beijing-wy.oss-cn-beijing.aliyuncs.com/linux-test/kube-flannel.yml
[root@k8s-master-01 ~]# wget https://github.com/flannel-io/flannel/releases/download/v0.27.3/kube-flannel.yml

# 2. 修改其中的网络配置,将 Network 从 10.244.0.0/16 改为 10.100.0.0/16
[root@k8s-master-01 ~]# grep Network kube-flannel.yml 
      "Network": "10.244.0.0/16",
      hostNetwork: true
[root@k8s-master-01 ~]# sed -i 's|"Network": "10.244.0.0/16"|"Network": "10.100.0.0/16"|g' kube-flannel.yml

# 3.查看配置文件中的flanner镜像
[root@k8s-master-01 ~]# grep image kube-flannel.yml 
        image: ghcr.io/flannel-io/flannel:v0.27.3
        image: ghcr.io/flannel-io/flannel-cni-plugin:v1.7.1-flannel1
        image: ghcr.io/flannel-io/flannel:v0.27.3
# 4.修改kube-flannel.yml里面的镜像地址
[root@k8s-master-01 ~]# sed -i 's#ghcr.io/flannel-io/flannel:v0.27.3#flannel/flannel:v0.27.3#g'  kube-flannel.yml 
[root@k8s-master-01 ~]# sed -i 's#ghcr.io/flannel-io/flannel-cni-plugin:v1.7.1-flannel1#flannel/flannel-cni-plugin:v1.7.1-flannel1#g'  kube-flannel.yml 
[root@k8s-master-01 ~]# grep image kube-flannel.yml 
        image: flannel/flannel:v0.27.3
        image: flannel/flannel-cni-plugin:v1.7.1-flannel1
        image: flannel/flannel:v0.27.3

# 5.使用docker在本地拉取以上版本的镜像(或者导入也行)(在worker-01和worker-02节点也可以提前拉取镜像,如果不提前拉取则都会自动从配置文件中镜像地址拉取镜像)
[root@k8s-master-01 ~]# docker pull flannel/flannel:v0.27.3
[root@k8s-master-01 ~]# docker pull flannel/flannel-cni-plugin:v1.7.1-flannel1

[root@k8s-worker-01 ~]# docker pull flannel/flannel:v0.27.3
[root@k8s-worker-01 ~]# docker pull flannel/flannel-cni-plugin:v1.7.1-flannel1

[root@k8s-worker-02 ~]# docker pull flannel/flannel:v0.27.3
[root@k8s-worker-02 ~]# docker pull flannel/flannel-cni-plugin:v1.7.1-flannel1

[root@k8s-master-01 ~]# docker images |grep flannel
flannel/flannel-cni-plugin:v1.7.1-flannel1                                48b5d33f9a21       10.7MB             0B        
flannel/flannel:v0.27.3                                                   3475d115f79b       91.1MB             0B        

# 6. 应用修改后的配置
[root@k8s-master-01 ~]# kubectl apply -f kube-flannel.yml

# 7. 清理下载的文件
[root@k8s-master-01 ~]# rm -f kube-flannel.yml

如果安装错误:

# 删除现有安装
kubectl delete -f kube-flannel.yml

# 在每个节点上执行(包括 master 和 workers):
rm -rf /etc/cni/net.d/10-flannel.conflist
rm -rf /etc/cni/net.d/*.conflist
rm -rf /opt/cni/bin/flannel
rm -rf /run/flannel/
rm -rf /var/lib/cni/

# 重启 kubelet 和容器运行时
systemctl restart kubelet
systemctl restart cri-docker.service

3.9.2 检查是否安装成功(master-01节点)

# 1.检查falnnel各组件是否安装成功
[root@k8s-master-01 ~]# kubectl get pods -o wide -n kube-flannel 
NAME                    READY   STATUS    RESTARTS   AGE   IP              NODE            NOMINATED NODE   READINESS GATES
kube-flannel-ds-46s4x   1/1     Running   0          33s   192.168.1.232   k8s-worker-01   <none>           <none>
kube-flannel-ds-kd5jp   1/1     Running   0          33s   192.168.1.231   k8s-master-01   <none>           <none>
kube-flannel-ds-vvb6f   1/1     Running   0          33s   192.168.1.233   k8s-worker-02   <none>           <none>

# 2.测试各节点组件(此时STATUS由 NotReady 变为 Ready )
[root@k8s-master-01 ~]# kubectl get nodes
NAME            STATUS   ROLES           AGE     VERSION
k8s-master-01   Ready    control-plane   10m     v1.34.3
k8s-worker-01   Ready    <none>          7m27s   v1.34.3
k8s-worker-02   Ready    <none>          7m16s   v1.34.3

3.9.3 验证Pod的CNI网络是否正常(master-01节点)

[root@k8s-master-01 ~]# vim network-cni-test.yaml
[root@k8s-master-01 ~]# cat network-cni-test.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: nginx-01
spec:
  nodeName: k8s-worker-01
  containers:
  - image: nginx:1.25
    name: nginx

---

apiVersion: v1
kind: Pod
metadata:
  name: nginx-02
spec:
  nodeName: k8s-worker-02
  containers:
  - image: nginx:1.25
    name: nginx

[root@k8s-master-01 ~]# kubectl apply -f  network-cni-test.yaml 
pod/nginx-01 created
pod/nginx-02 created

# 稍等一会会拉取镜像创建pod,可以看到以下输出
[root@k8s-master-01 ~]# kubectl get pods -o wide
NAME       READY   STATUS    RESTARTS   AGE   IP           NODE            NOMINATED NODE   READINESS GATES
nginx-01   1/1     Running   0          17s   10.100.1.5   k8s-worker-01   <none>           <none>
nginx-02   1/1     Running   0          17s   10.100.2.3   k8s-worker-02   <none>           <none>

[root@k8s-master-01 ~]# curl 10.100.1.5 
...
<h1>Welcome to nginx!</h1>
...
[root@k8s-master-01 ~]# curl 10.100.2.3 
...
<h1>Welcome to nginx!</h1>
...


# 测试完成以后删除
[root@k8s-master-01 ~]# kubectl delete -f network-cni-test.yaml 
pod "nginx-01" deleted from default namespace
pod "nginx-02" deleted from default namespace

3.10 kubectl命令自动补全

# 1.添加环境变量
[root@k8s-master-01 ~]# kubectl completion bash > ~/.kube/completion.bash.inc
[root@k8s-master-01 ~]# echo source '$HOME/.kube/completion.bash.inc' >> ~/.bashrc 
[root@k8s-master-01 ~]# source ~/.bashrc

# 2.验证自动补全(输入命令后连续按TAB键,测试是否出现后续命令)
[root@k8s-master-01 ~]# kubectl
历史版本-目录  [回到顶端]
    文艺知识分享平台 -V 5.2.5 -wcp