kubeadm-管理工具
基础语法
命令简介
kubeadm 是 Kubernetes 官方提供的集群引导工具,用于快速搭建符合最佳实践的生产级 Kubernetes 集群。它自动化了证书生成、控制平面组件部署、etcd 配置等复杂流程,支持集群初始化、节点加入、升级和降级等全生命周期操作。
语法格式
kubeadm <command> [flags]主要子命令
| 命令 | 描述 | 示例 |
|---|---|---|
init | 初始化控制平面节点 | kubeadm init --apiserver-advertise-address=192.168.1.100 |
join | 将节点加入集群 | kubeadm join 192.168.1.100:6443 --token <token> |
upgrade | 升级集群版本 | kubeadm upgrade apply v1.28.0 |
reset | 重置节点状态 | kubeadm reset --force |
token | 管理引导令牌 | kubeadm token create --ttl 2h |
config | 管理集群配置 | kubeadm config print init-defaults |
kubeadm init - 初始化 Kubernetes 控制平面节点
命令简介
kubeadm init 是 Kubernetes 集群初始化的核心命令,负责在第一个控制平面节点上部署所有必要的控制组件(API Server、Controller Manager、Scheduler、etcd 等),生成集群 CA 证书和引导令牌,并输出加入其他节点所需的命令。
语法格式
kubeadm init [flags]核心选项
| 选项 | 描述 | 示例 |
|---|---|---|
--apiserver-advertise-address | API Server 通告地址 | --apiserver-advertise-address=192.168.1.100 |
--pod-network-cidr | 指定 Pod 网络 CIDR(需与 CNI 插件匹配) | --pod-network-cidr=10.244.0.0/16(Flannel 默认) |
--control-plane-endpoint | 高可用集群负载均衡地址 | --control-plane-endpoint=k8s-api.example.com:6443 |
--upload-certs | 自动上传控制平面证书(高可用场景) | --upload-certs |
--kubernetes-version | 指定 Kubernetes 版本 | --kubernetes-version=v1.28.0 |
--cri-socket | 指定容器运行时套接字路径 | --cri-socket=unix:///var/run/containerd/containerd.sock |
--dry-run | 试运行模式 | --dry-run=client |
--ignore-preflight-errors | 忽略特定预检错误 | --ignore-preflight-errors=Swap |
经典案例
# 单节点集群初始化(使用 containerd 运行时)
kubeadm init \
--apiserver-advertise-address=192.168.1.100 \
--pod-network-cidr=10.244.0.0/16 \
--cri-socket=unix:///var/run/containerd/containerd.sock \
--kubernetes-version=v1.28.0
# 高可用集群初始化(3个控制平面节点)
kubeadm init \
--control-plane-endpoint=k8s-api.example.com:6443 \
--upload-certs \
--pod-network-cidr=192.168.0.0/16
# 生产环境推荐配置(带证书自动续期)
kubeadm init \
--apiserver-advertise-address=10.0.0.1 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--feature-gates=RotateKubeletServerCertificate=true \
--certificate-renewal=true初始化后操作
# 配置 kubectl(普通用户)
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 安装网络插件(示例使用 Calico)
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml
# 获取加入命令(工作节点)
kubeadm token create --print-join-command注意事项
- 系统要求:
- 2GB+ 内存
- 禁用 swap(或通过
--ignore-preflight-errors=Swap忽略) - 唯一的主机名、MAC 地址和 product_uuid
- 网络冲突:
--pod-network-cidr不能与主机网络重叠--service-cidr默认10.96.0.0/12需确保不冲突
- 证书管理:
- 默认证书有效期 1 年
- 通过
kubeadm certs check-expiration检查 - 生产环境建议启用
RotateKubeletServerCertificate特性
- 重置风险:
kubeadm reset会彻底清除节点状态- 重置前需手动清理
/etc/cni/net.d和/var/lib/cni/
- 版本兼容:
- kubeadm 与 kubelet 版本差不得超过 ±1 个小版本
- 使用
--kubernetes-version确保版本一致性
kubeadm join - 将节点加入 Kubernetes 集群
命令简介
kubeadm join 是将工作节点或额外控制平面节点加入现有 Kubernetes 集群的关键命令。它通过引导令牌(bootstrap token)或发现令牌(discovery token)完成节点认证,自动配置 kubelet 并建立与 API Server 的安全连接。
语法格式
kubeadm join <control-plane-host>:<control-plane-port> --token <token> \
--discovery-token-ca-cert-hash sha256:<hash> [flags]核心选项
| 选项 | 描述 | 示例 |
|---|---|---|
--token | 引导令牌(24小时有效) | --token abcdef.0123456789abcdef |
--discovery-token-ca-cert-hash | CA证书的SHA256哈希 | --discovery-token-ca-cert-hash sha256:xxxxxx |
--control-plane | 加入为控制平面节点 | --control-plane |
--certificate-key | 解密控制平面证书的密钥 | --certificate-key xxxxxx |
--node-name | 指定节点名称 | --node-name worker-01 |
--ignore-preflight-errors | 忽略预检错误 | --ignore-preflight-errors=NumCPU |
--cri-socket | 指定容器运行时路径 | --cri-socket=unix:///var/run/containerd/containerd.sock |
经典案例
# 加入工作节点(标准方式)
kubeadm join 192.168.1.100:6443 \
--token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:xxxxxx
# 加入控制平面节点(高可用集群)
kubeadm join k8s-api.example.com:6443 \
--token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:xxxxxx \
--control-plane \
--certificate-key xxxxxx
# 使用配置文件加入
kubeadm join --config kubeadm-join.yaml
# 生成长期有效的加入命令(需先安装kubeadm)
kubeadm token create --ttl 0 --print-join-command令牌管理
# 查看现有令牌
kubectl get secrets -n kube-system | grep bootstrap-token
# 创建新令牌(默认24小时有效)
kubeadm token create --ttl 2h
# 获取CA证书哈希(当忘记保存时)
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | \
openssl rsa -pubin -outform der 2>/dev/null | \
openssl dgst -sha256 -hex | sed 's/^.* //'注意事项
令牌有效期:
- 默认令牌24小时后失效
- 可通过
kubeadm token create --ttl 0创建永久令牌
网络要求:
- 节点必须能访问API Server的6443端口
- 控制平面节点间需开放2379/2380(etcd)、10250(kubelet)等端口
证书同步:
- 控制平面节点会自动同步证书
- 工作节点仅需kubelet证书
常见错误处理:
bash# 重置错误状态 kubeadm reset systemctl restart kubelet生产建议:
使用
--control-plane-endpoint而非直接IP为不同角色节点打标签:
bashkubectl label node worker-01 node-role.kubernetes.io/worker=
提示:加入节点后需等待若干分钟,
kubectl get nodes才会显示 READY 状态,期间可通过journalctl -xu kubelet查看进度。
kubeadm upgrade - Kubernetes 集群升级工具
命令简介
kubeadm upgrade 是 Kubernetes 官方提供的集群升级工具,用于安全地将集群从一个版本升级到另一个版本。它采用分阶段升级策略,确保控制平面组件(API Server、Controller Manager、Scheduler、etcd)和工作节点可以逐步升级,最小化对工作负载的影响。
升级流程
- 升级控制平面:先升级第一个控制平面节点,再升级其他控制平面节点
- 升级工作节点:逐个升级工作节点(可并行)
- 升级插件:最后升级 CoreDNS 和 kube-proxy
核心子命令
| 命令 | 描述 | 示例 |
|---|---|---|
plan | 检查可升级版本和前置条件 | kubeadm upgrade plan |
apply | 执行控制平面升级 | kubeadm upgrade apply v1.28.0 |
node | 升级工作节点 | kubeadm upgrade node |
diff | 显示升级前后的配置差异 | kubeadm upgrade diff v1.28.0 |
关键选项
| 选项 | 描述 | 示例 |
|---|---|---|
--config | 使用配置文件升级 | --config=kubeadm-config.yaml |
--etcd-upgrade | 自动升级 etcd | --etcd-upgrade=true |
--certificate-renewal | 自动续期证书 | --certificate-renewal=true |
--allow-experimental-upgrades | 允许升级到测试版 | --allow-experimental-upgrades |
--force | 强制跳过版本验证 | --force |
--dry-run | 试运行模式 | --dry-run=client |
经典案例
# 1. 检查可升级版本(在所有控制平面节点执行)
kubeadm upgrade plan
# 2. 升级第一个控制平面节点
kubeadm upgrade apply v1.28.0 \
--etcd-upgrade=true \
--certificate-renewal=true
# 3. 升级其他控制平面节点(依次执行)
kubeadm upgrade node
# 4. 升级工作节点(逐个执行)
kubeadm upgrade node \
--kubelet-version=v1.28.0
# 5. 验证升级结果
kubectl get nodes -o wide升级前准备
# 备份关键数据
mkdir k8s-backup
cp -i /etc/kubernetes/admin.conf k8s-backup/
cp -R /etc/kubernetes/manifests/ k8s-backup/
cp -R /etc/kubernetes/pki/ k8s-backup/
# 检查版本兼容性
kubeadm version
kubectl version
kubelet --version
# 排空节点(优雅驱逐Pod)
kubectl drain <node> --ignore-daemonsets --delete-emptydir-data升级后操作
# 解除节点保护
kubectl uncordon <node>
# 验证组件版本
kubectl get pods -n kube-system -o wide
# 升级网络插件(如需要)
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml注意事项
版本跳跃限制:
- 仅支持升级到下一个次要版本(如 1.26 → 1.27)
- 大版本升级需逐步进行(1.25 → 1.26 → 1.27)
证书管理:
- 升级默认会续期即将过期的证书
- 通过
kubeadm certs check-expiration检查有效期
工作负载影响:
- 控制平面升级期间API Server会有短暂不可用
- 建议在维护窗口期执行升级
回滚方案:
bash# 从备份恢复(极端情况) cp -R k8s-backup/pki/ /etc/kubernetes/ systemctl restart kubelet特殊场景:
使用外部 etcd 时需手动升级 etcd 集群
离线环境需预先下载镜像:
bashkubeadm config images pull --kubernetes-version=v1.28.0
最佳实践:生产环境建议先在测试集群验证升级过程,使用
--dry-run检查潜在问题,并通过 Prometheus 监控升级过程中的关键指标。
kubeadm reset - Kubernetes 节点重置工具
命令简介
kubeadm reset 是用于将节点恢复为未加入集群状态的清理工具,它会删除所有由 kubeadm init 或 kubeadm join 创建的 Kubernetes 组件和配置,但不会移除容器运行时管理的容器或用户数据。
语法格式
kubeadm reset [flags]核心选项
| 选项 | 描述 | 示例 |
|---|---|---|
--force | 跳过交互式确认 | kubeadm reset --force |
--ignore-preflight-errors | 忽略特定预检错误 | --ignore-preflight-errors=all |
--cri-socket | 指定容器运行时套接字路径 | --cri-socket=unix:///var/run/containerd/containerd.sock |
--cleanup-tmp-dir | 清理临时目录 | --cleanup-tmp-dir=true |
--cert-dir | 指定证书目录 | --cert-dir=/etc/kubernetes/pki |
--dry-run | 试运行模式 | --dry-run=client |
执行流程
停止 kubelet 服务
删除 Kubernetes 管理组件
:
- 移除
/etc/kubernetes/下的配置文件 - 清理
/var/lib/kubelet/数据 - 删除
/var/lib/etcd/(控制平面节点)
清理 CNI 网络配置
(需手动):
rm -rf /etc/cni/net.d/*保留内容
:
- 容器运行时管理的容器(需手动清理)
- 用户创建的证书和密钥(非默认路径)
经典案例
# 安全重置节点(交互式)
kubeadm reset
# 强制重置(非交互式)
kubeadm reset --force
# 彻底清理容器运行时
containerd rm -f $(containerd ps -aq)
docker rm -f $(docker ps -aq)
# 完整清理流程(生产环境推荐)
systemctl stop kubelet
kubeadm reset --force
rm -rf /etc/cni/net.d/ /var/lib/kubelet/
iptables -F && iptables -t nat -F
ipvsadm --clear
systemctl restart containerd注意事项
数据风险:
- 不会自动清理持久卷数据(需手动备份)
- 控制平面节点的 etcd 数据会被完全删除
网络残留:
- 建议手动清理 iptables 规则和 IPVS 表
bashiptables -F && iptables -t nat -F ipvsadm --clear容器清理:
- 重置后需手动删除残留容器:
bash# Docker docker rm -f $(docker ps -aq) # Containerd crictl rm -f $(crictl ps -aq)高可用集群:
- 重置控制平面节点前需从 etcd 集群移除该节点
bash# 在其他正常节点执行 etcdctl member list etcdctl member remove <ID>证书处理:
- 重置不会删除用户手动创建的证书
- 生产环境建议备份
/etc/kubernetes/pki/
重置后检查清单
验证服务状态:
bashsystemctl status kubelet检查目录清理:
bashls /etc/kubernetes/ ls /var/lib/kubelet/确认网络清理:
bashiptables -L -n ip link show
重要提示:生产环境执行 reset 前,务必确保已备份关键数据(如 etcd 快照),并优先在测试环境验证操作流程。对于加入集群的工作节点,建议先执行
kubectl drain优雅驱逐工作负载。
kubeadm token - Kubernetes 集群节点加入令牌管理
命令简介
kubeadm token 是管理 Kubernetes 集群节点加入令牌的核心命令,用于创建、列出和删除引导令牌(bootstrap tokens)。这些令牌是工作节点或额外控制平面节点加入集群时的临时身份凭证,默认24小时有效。
核心子命令
| 命令 | 描述 | 示例 |
|---|---|---|
create | 创建新令牌 | kubeadm token create --ttl 2h |
list | 列出有效令牌 | kubeadm token list |
delete | 删除指定令牌 | kubeadm delete abcdef.0123456789abcdef |
generate | 生成令牌(不创建) | kubeadm token generate |
关键选项
| 选项 | 描述 | 示例 |
|---|---|---|
--ttl | 设置令牌有效期 | --ttl 4h30m |
--description | 添加令牌描述 | --description "For temporary nodes" |
--usages | 指定令牌用途 | --usages signing,authentication |
--groups | 设置认证组 | --groups system:bootstrappers:kubeadm:default-node-token |
--print-join-command | 输出完整加入命令 | --print-join-command |
--config | 使用配置文件 | --config token-config.yaml |
经典案例
# 创建24小时有效的标准令牌
kubeadm token create
# 创建长期有效的令牌(生产环境慎用)
kubeadm token create --ttl 0
# 获取完整节点加入命令(含CA证书哈希)
kubeadm token create --print-join-command
# 创建带描述的限时令牌
kubeadm token create \
--ttl 2h \
--description "For temporary worker nodes"
# 列出所有有效令牌
kubeadm token list -o json
# 立即撤销令牌
kubeadm token delete abcdef.0123456789abcdef令牌结构解析
典型令牌格式:abcdef.0123456789abcdef
- 前6位:Token ID(随机字符串)
- 后16位:Token Secret(随机字符串)
安全实践
最小化有效期:
bash# 创建仅2小时有效的令牌 kubeadm token create --ttl 2h按需创建令牌:
bash# 在需要加入节点时临时生成 JOIN_CMD=$(kubeadm token create --print-join-command)令牌轮换:
bash# 定期删除旧令牌 kubeadm token list | grep expired | awk '{print $1}' | xargs kubeadm token delete
高级配置
通过配置文件创建定制令牌:
# token-config.yaml
apiVersion: bootstrap.k8s.io/v1
kind: Token
metadata:
name: custom-token
spec:
token-id: abcdef
token-secret: 0123456789abcdef
ttl: 24h
usages:
- authentication
- signing
groups:
- system:bootstrappers:kubeadm:default-node-token应用配置:
kubeadm token create --config token-config.yaml注意事项
令牌存储位置:
- 实际存储在 kube-system 命名空间的 Secret 中
bashkubectl get secrets -n kube-system | grep bootstrap-tokenCA证书哈希:
令牌必须配合CA证书哈希使用
获取哈希的替代方法:
bashopenssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | \ openssl rsa -pubin -outform der 2>/dev/null | \ openssl dgst -sha256 -hex | sed 's/^.* //'
控制平面加入:
- 加入控制平面节点需要额外
--certificate-key
bashkubeadm init phase upload-certs --upload-certs- 加入控制平面节点需要额外
故障排查:
令牌失效时检查:
bashkubectl get secrets -n kube-system bootstrap-token-abcdef -o yaml
审计日志:
- 所有令牌使用记录可在 API Server 审计日志中查看
kubeadm token - Kubernetes 集群节点加入令牌管理
命令简介
kubeadm token 是管理 Kubernetes 集群节点加入令牌的核心命令,用于创建、列出和删除引导令牌(bootstrap tokens)。这些令牌是工作节点或额外控制平面节点加入集群时的临时身份凭证,默认24小时有效。
核心子命令
| 命令 | 描述 | 示例 |
|---|---|---|
create | 创建新令牌 | kubeadm token create --ttl 2h |
list | 列出有效令牌 | kubeadm token list |
delete | 删除指定令牌 | kubeadm delete abcdef.0123456789abcdef |
generate | 生成令牌(不创建) | kubeadm token generate |
关键选项
| 选项 | 描述 | 示例 |
|---|---|---|
--ttl | 设置令牌有效期 | --ttl 4h30m |
--description | 添加令牌描述 | --description "For temporary nodes" |
--usages | 指定令牌用途 | --usages signing,authentication |
--groups | 设置认证组 | --groups system:bootstrappers:kubeadm:default-node-token |
--print-join-command | 输出完整加入命令 | --print-join-command |
--config | 使用配置文件 | --config token-config.yaml |
经典案例
# 创建24小时有效的标准令牌
kubeadm token create
# 创建长期有效的令牌(生产环境慎用)
kubeadm token create --ttl 0
# 获取完整节点加入命令(含CA证书哈希)
kubeadm token create --print-join-command
# 创建带描述的限时令牌
kubeadm token create \
--ttl 2h \
--description "For temporary worker nodes"
# 列出所有有效令牌
kubeadm token list -o json
# 立即撤销令牌
kubeadm token delete abcdef.0123456789abcdef令牌结构解析
典型令牌格式:abcdef.0123456789abcdef
- 前6位:Token ID(随机字符串)
- 后16位:Token Secret(随机字符串)
安全实践
最小化有效期:
bash# 创建仅2小时有效的令牌 kubeadm token create --ttl 2h按需创建令牌:
bash# 在需要加入节点时临时生成 JOIN_CMD=$(kubeadm token create --print-join-command)令牌轮换:
bash# 定期删除旧令牌 kubeadm token list | grep expired | awk '{print $1}' | xargs kubeadm token delete
高级配置
通过配置文件创建定制令牌:
# token-config.yaml
apiVersion: bootstrap.k8s.io/v1
kind: Token
metadata:
name: custom-token
spec:
token-id: abcdef
token-secret: 0123456789abcdef
ttl: 24h
usages:
- authentication
- signing
groups:
- system:bootstrappers:kubeadm:default-node-token应用配置:
kubeadm token create --config token-config.yaml注意事项
令牌存储位置:
- 实际存储在 kube-system 命名空间的 Secret 中
bashkubectl get secrets -n kube-system | grep bootstrap-tokenCA证书哈希:
令牌必须配合CA证书哈希使用
获取哈希的替代方法:
bashopenssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | \ openssl rsa -pubin -outform der 2>/dev/null | \ openssl dgst -sha256 -hex | sed 's/^.* //'
控制平面加入:
- 加入控制平面节点需要额外
--certificate-key
bashkubeadm init phase upload-certs --upload-certs- 加入控制平面节点需要额外
故障排查:
令牌失效时检查:
bashkubectl get secrets -n kube-system bootstrap-token-abcdef -o yaml
审计日志:
- 所有令牌使用记录可在 API Server 审计日志中查看
