| 备注 | 修改日期 | 修改人 |
| 创建版本 | 2025-12-29 19:34:42[当前版本] | 文艺范儿 |
架构图
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]
在资源有限情况下,采用 “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) |
私有镜像仓库 |
| 用途 | 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 网段 |
| 组件 | 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 或独立管理/数据平面) |
千兆网卡 |
管理网与数据网分离(生产推荐) |
| 指标 | 告警阈值 | 处理措施 |
|---|---|---|
节点 CPU 使用率 |
> 80% 持续 5min |
检查 Pod 资源限制,考虑扩容 |
节点内存使用率 |
> 85% 持续 3min |
检查内存泄漏,清理未使用 Pod |
etcd 写延迟 |
> 100ms 持续 1min |
检查 etcd 磁盘性能,考虑 SSD 升级 |
API Server 错误率 |
> 5% 持续 2min |
检查认证/授权配置,重启 apiserver |
所有节点统一配置:
# 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
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 节点 |
✅✅ |
混合云管理、多集群 |
安装docker
安装harbor
此处省略…
# 创建证书存放目录,并进入目录
[root@k8s-harbor ~]# mkdir -pv /home/deploy/harbor/certs/{ca,harbor-server,docker-client}
[root@k8s-harbor ~]# cd /home/deploy/harbor/certs
# 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
# 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
# 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
安装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/
# 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
参考链接:
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:"
参考链接:
https://kubernetes.io/zh-cn/docs/tasks/tools/install-kubectl-linux/
https://developer.aliyun.com/mirror/kubernetes/
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 有助于避免不可预见的问题。
# 新版 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
也可以在 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
# 确定所有节点安装的版本都一直
[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
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
# 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
[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参数
[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
# 检查 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)
# 注意:初始化主节点的时候,会输出加入的命令,在输出的命令后面添加--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
[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”状态
# 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
# 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
[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
# 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