🔧 kubeadm 参数全解
关于本文档
kubeadm 所有核心命令的参数手册。本文档是使用 kubeadm 创建集群 的配套参考。
#k8s#kubeadm#reference
📋 目录
- #kubeadm init — 初始化控制平面
- #kubeadm join — 加入节点
- #kubeadm token — 令牌管理
- #kubeadm certs — 证书管理
- #kubeadm config — 配置管理
- #kubeadm reset — 重置集群
- #kubeadm upgrade — 升级集群
- #kubeadm alpha — Alpha 功能
- #kubeadm 配置文件 YAML — YAML 配置方式
- #kubeadm 常用参数速查表
kubeadm init
初始化 Kubernetes 控制平面节点。
kubeadm init [flags]
核心参数
| 参数 | 默认值 | 说明 | 面试价值 |
|---|---|---|---|
--apiserver-advertise-address | 默认网关 IP | API Server 公告的 IP 地址 | ⭐⭐⭐ |
--apiserver-bind-port | 6443 | API Server 绑定的端口 | ⭐⭐ |
--apiserver-cert-extra-sans | [] | 证书额外的 SAN(域名/IP),多 SAN 用逗号分隔 | ⭐⭐⭐ |
--cert-dir | /etc/kubernetes/pki | 证书存储目录 | ⭐⭐ |
--config | 无 | kubeadm 配置文件路径(推荐使用) | ⭐⭐⭐ |
--control-plane-endpoint | 无 | 高可用必用,负载均衡器地址 host:port | ⭐⭐⭐⭐ |
--cri-socket | 自动检测 | CRI 套接字路径,如 unix:///run/containerd/containerd.sock | ⭐⭐ |
--dry-run | false | 试运行,不实际执行,常用于验证配置 | ⭐⭐ |
--feature-gates | "" | 启用/禁用实验特性,如 --feature-gates="EtcdLearnerMode=true" | ⭐⭐⭐ |
--ignore-preflight-errors | [] | 忽略指定的预检错误,如 --ignore-preflight-errors=Swap,NumCPU | ⭐⭐⭐ |
--image-repository | registry.k8s.io | 镜像仓库地址,离线部署时修改 | ⭐⭐⭐ |
--kubernetes-version | stable-1 | 指定 K8s 版本,如 v1.36.0 | ⭐⭐ |
--node-name | 主机名 | 节点名称 | ⭐⭐ |
--pod-network-cidr | 无 | Pod 网段 CIDR,必须与 CNI 插件一致 | ⭐⭐⭐⭐ |
--service-cidr | 10.96.0.0/12 | Service 网段 CIDR | ⭐⭐ |
--service-dns-domain | cluster.local | Service DNS 域名后缀 | ⭐ |
--skip-token-print | false | 不打印默认 token | ⭐ |
--token | 自动生成 | 指定 bootstrap token | ⭐⭐ |
--token-ttl | 24h0m0s | token 有效时长(0 表示永不过期) | ⭐⭐ |
--upload-certs | false | HA 专用,上传控制平面证书供其他节点使用 | ⭐⭐⭐⭐ |
--v | 0 | 日志级别,--v=5 查看详细日志用于排错 | ⭐⭐ |
实战示例
## 📖 最简方式
sudo kubeadm init
## ⚡ 单控制平面(完整参数)
sudo kubeadm init \
--apiserver-advertise-address=192.168.1.100 \
--apiserver-cert-extra-sans="k8s.example.com,10.0.0.1" \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \
--kubernetes-version=v1.36.0 \
--node-name=master-1 \
--v=5
## 🔧 高可用控制平面首节点
sudo kubeadm init \
--control-plane-endpoint=192.168.1.20:6443 \
--apiserver-advertise-address=192.168.1.101 \
--pod-network-cidr=10.244.0.0/16 \
--upload-certs
## ⚙️ 离线部署(指定私有镜像仓库)
sudo kubeadm init \
--image-repository=registry.internal.company.com/k8s \
--kubernetes-version=v1.36.0 \
--pod-network-cidr=10.244.0.0/16
## 5. 忽略预检错误(踩坑时用)
sudo kubeadm init \
--ignore-preflight-errors=Swap,NumCPU,FileAvailable--etc-kubernetes-manifests-etcd.yaml \
--pod-network-cidr=10.244.0.0/16
## 6. 试运行验证配置
sudo kubeadm init --config=kubeadm-config.yaml --dry-run
参数组合速记
面试口诀
单控制平面记 3 个:
--apiserver-advertise-address+--pod-network-cidr+--kubernetes-version高可用多加 2 个:
--control-plane-endpoint+--upload-certs排错用 3 个:
--v=5+--ignore-preflight-errors+--dry-run
kubeadm join
将节点加入已有集群。
kubeadm join [endpoint:port] [flags]
核心参数
| 参数 | 默认值 | 说明 | 面试价值 |
|---|---|---|---|
--config | 无 | 配置文件路径 | ⭐⭐ |
--control-plane | false | HA 专用,将节点作为控制平面加入 | ⭐⭐⭐⭐ |
--certificate-key | 无 | HA 专用,解密控制平面证书的密钥 | ⭐⭐⭐⭐ |
--cri-socket | 自动检测 | CRI 套接字路径 | ⭐⭐ |
--discovery-file | 无 | 用于发现集群的配置文件(替代 token) | ⭐⭐ |
--discovery-token | 无 | 发现令牌 | ⭐⭐⭐ |
--discovery-token-ca-cert-hash | 无 | CA 证书的 SHA256 哈希值,验证集群身份 | ⭐⭐⭐⭐ |
--discovery-token-unsafe-skip-ca-verification | false | 跳过 CA 验证(仅测试用,生产禁止) | ⭐⭐⭐ |
--ignore-preflight-errors | [] | 忽略预检错误 | ⭐⭐ |
--node-name | 主机名 | 节点名称 | ⭐ |
--tls-bootstrap-token | 无 | TLS 引导令牌 | ⭐⭐ |
--token | 无 | bootstrap token | ⭐⭐⭐ |
--v | 0 | 日志级别 | ⭐ |
实战示例
## 📖 Worker 节点加入(最常用)
sudo kubeadm join 192.168.1.100:6443 \
--token <token> \
--discovery-token-ca-cert-hash sha256:<hash>
## ⚡ 控制平面节点加入(HA)
sudo kubeadm join 192.168.1.20:6443 \
--token <token> \
--discovery-token-ca-cert-hash sha256:<hash> \
--control-plane \
--certificate-key <key>
## 🔧 指定节点名加入
sudo kubeadm join 192.168.1.100:6443 \
--token <token> \
--discovery-token-ca-cert-hash sha256:<hash> \
--node-name=worker-production-01
## ⚙️ 跳过证书验证(仅开发环境!)
sudo kubeadm join 192.168.1.100:6443 \
--token <token> \
--discovery-token-unsafe-skip-ca-verification
## 5. 使用配置文件加入
sudo kubeadm join --config=join-config.yaml
## 6. 忽略预检错误
sudo kubeadm join 192.168.1.100:6443 \
--token <token> \
--discovery-token-ca-cert-hash sha256:<hash> \
--ignore-preflight-errors=Swap
安全警告
--discovery-token-unsafe-skip-ca-verification严禁在生产环境使用! 跳过 CA 验证意味着无法确认连接的是否是真正的集群,可能被中间人攻击。
kubeadm token
管理 bootstrap token。
kubeadm token [subcommand] [flags]
子命令
| 子命令 | 说明 | 常用度 |
|---|---|---|
create | 创建新 token | ⭐⭐⭐⭐⭐ |
list | 列出所有 token | ⭐⭐⭐⭐ |
delete | 删除 token | ⭐⭐⭐ |
generate | 生成但不保存 token | ⭐⭐ |
create 参数
kubeadm token create [flags]
| 参数 | 默认值 | 说明 |
|---|---|---|
--config | 无 | 配置文件路径 |
--description | "" | token 描述,如 --description="用于 worker 节点加入" |
--groups | [] | token 关联的额外组 |
--print-join-command | false | 最实用! 直接打印完整的 join 命令 |
--ttl | 24h0m0s | 有效时长,0 表示永不过期 |
--usages | [signing,authentication] | token 用途 |
实战示例
## 📖 创建 token 并直接打印 join 命令(最常用)
kubeadm token create --print-join-command
## ⚡ 创建永不过期的 token(生产不推荐)
kubeadm token create --ttl=0
## 🔧 创建 2 小时有效期的 token(适合临时使用)
kubeadm token create --ttl=2h --description="临时扩容"
## ⚙️ 列出所有 token
kubeadm token list
## 5. 删除指定 token
kubeadm token delete <token-id>
## 6. 只生成 token 但不保存到集群
kubeadm token generate
实用技巧
最常用的就是
kubeadm token create --print-join-command,一步搞定! 这个命令会自动生成 token 并拼好完整的kubeadm join命令,直接复制粘贴即可。
kubeadm certs
管理集群证书。
kubeadm certs [subcommand] [flags]
子命令
| 子命令 | 说明 | 面试价值 |
|---|---|---|
check-expiration | 查看所有证书有效期 | ⭐⭐⭐⭐⭐ |
renew | 续期证书 | ⭐⭐⭐⭐ |
generate-csr | 生成 CSR(证书签名请求) | ⭐⭐ |
certificate-key | 生成用于 HA 的 certificate-key | ⭐⭐⭐⭐ |
renew 子参数
kubeadm certs renew [subcommand] [flags]
| 子命令 | 续期的证书 |
|---|---|
all | 续期所有证书 |
admin.conf | admin 客户端证书 |
apiserver | API Server 服务端证书 |
apiserver-etcd-client | API Server 连接 etcd 的客户端证书 |
apiserver-kubelet-client | API Server 连接 kubelet 的客户端证书 |
controller-manager.conf | Controller Manager 证书 |
etcd-healthcheck-client | etcd 健康检查证书 |
etcd-peer | etcd 节点间通信证书 |
etcd-server | etcd 服务端证书 |
front-proxy-client | Front Proxy 客户端证书 |
scheduler.conf | Scheduler 证书 |
实战示例
## 📖 查看所有证书到期时间(日常巡检)
kubeadm certs check-expiration
## 输出示例:
## [CERTIFICATE] EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY
## admin.conf May 30, 2027 00:00 UTC 364d ca
## apiserver May 30, 2027 00:00 UTC 364d ca
## ...
## ⚡ 续期所有证书
kubeadm certs renew all
## 🔧 只续期 API Server 证书
kubeadm certs renew apiserver
## ⚙️ 续期后需要重启控制平面组件
## 修改 Static Pod Manifest 的 annotation 触发滚动更新
## 或直接重启 kubelet
sudo systemctl restart kubelet
## 5. 生成 HA 用的 certificate-key
kubeadm certs certificate-key
## ⚙️ kubectl(续期后需要)
## 如果 admin.conf 更新了,需要重新复制
sudo cp /etc/kubernetes/admin.conf $HOME/.kube/config
重要
kubeadm certs renew all只续期证书,不会重启组件!续期后需要:
- 重启 kubelet:
sudo systemctl restart kubelet- 或者修改 Static Pod Manifest(加个 annotation 触发重建)
- 更新用户的 kubeconfig:重新
cp admin.conf ~/.kube/config
kubeadm config
查看和管理 kubeadm 配置。
kubeadm config [subcommand] [flags]
子命令
| 子命令 | 说明 | 常用度 |
|---|---|---|
view | 查看当前集群的 kubeadm 配置 | ⭐⭐⭐⭐ |
print | 打印默认配置模板 | ⭐⭐⭐ |
migrate | 将旧版配置迁移到新版 API | ⭐⭐ |
images | 管理镜像相关操作 | ⭐⭐⭐ |
images 子命令
kubeadm config images [subcommand] [flags]
| 子命令 | 说明 | 实践价值 |
|---|---|---|
list | 列出所需镜像列表 | ⭐⭐⭐⭐ |
pull | 拉取所需镜像 | ⭐⭐⭐⭐ |
实战示例
## 📖 查看当前集群的 kubeadm 配置
kubeadm config view
## ⚡ 打印 kubeadm init 的默认配置模板
kubeadm config print init-defaults
## 🔧 打印 kubeadm join 的默认配置模板
kubeadm config print join-defaults
## ⚙️ 列出指定版本所需的镜像
kubeadm config images list --kubernetes-version=v1.36.0
## 5. 拉取 kubeadm 所需镜像(离线部署准备)
kubeadm config images pull --kubernetes-version=v1.36.0
## 6. 使用自定义仓库拉取镜像
kubeadm config images pull \
--image-repository=registry.internal.company.com/k8s \
--kubernetes-version=v1.36.0
## 7. 将旧版配置迁移到新版
kubeadm config migrate --old-config old.yaml --new-config new.yaml
离线部署批量拉取镜像
# 先拉取全部镜像 kubeadm config images pull --kubernetes-version=v1.36.0 # 然后导出并传到离线环境 docker save -o k8s-images.tar $(kubeadm config images list --kubernetes-version=v1.36.0 | tr '\n' ' ')
kubeadm reset
重置节点,清除所有 kubeadm 安装的数据。
kubeadm reset [flags]
| 参数 | 默认值 | 说明 |
|---|---|---|
--cert-dir | /etc/kubernetes/pki | 证书目录,指定后清除该目录 |
--config | 无 | 配置文件路径 |
--cri-socket | 自动检测 | CRI 套接字路径 |
--force | false | 强制重置,不提示确认 |
--ignore-preflight-errors | [] | 忽略预检错误 |
实战示例
## 📖 标准重置
sudo kubeadm reset
## ⚡ 强制重置(不提示确认)
sudo kubeadm reset --force
## 🔧 重置后清理 kubeconfig
rm -rf $HOME/.kube
## ⚙️ 完整重置脚本
sudo kubeadm reset --force
sudo rm -rf /etc/kubernetes/
sudo rm -rf /var/lib/etcd/
sudo rm -rf $HOME/.kube/
sudo iptables -F && sudo iptables -t nat -F && sudo iptables -t mangle -F
sudo systemctl restart containerd
注意
kubeadm reset不会自动清理 kubelet 配置、容器运行时数据、iptables 规则等。尤其在控制平面节点上,etcd 数据目录
/var/lib/etcd/需要手动删除,否则重新 init 时会报错。
kubeadm upgrade
升级 Kubernetes 集群版本。
kubeadm upgrade [subcommand] [flags]
子命令
| 子命令 | 说明 | 面试价值 |
|---|---|---|
plan | 检查可升级的版本并显示差异 | ⭐⭐⭐⭐ |
apply | 执行升级 | ⭐⭐⭐⭐ |
diff | 显示升级前后配置差异 | ⭐⭐⭐ |
node | 升级节点配置 | ⭐⭐ |
参数
| 参数 | 默认值 | 说明 |
|---|---|---|
--certificate-renewal | true | 升级时是否自动续期证书 |
--config | 无 | 配置文件路径 |
--etcd-upgrade | true | 是否升级 etcd |
--feature-gates | "" | 特性开关 |
--force | false | 强制升级 |
--image-repository | registry.k8s.io | 镜像仓库 |
--kubeconfig | /etc/kubernetes/admin.conf | kubeconfig 路径 |
--v | 0 | 日志级别 |
--yes | false | 跳过确认提示 |
HA 集群升级流程
## ----- 重要:HA 集群必须逐个节点升级!-----
## Step 1:在每个节点上依次执行
## 先 drain 节点(迁移 Pod)
kubectl drain master-1 --ignore-daemonsets --delete-emptydir-data
## 升级 kubeadm
sudo apt-mark unhold kubeadm
sudo apt-get update && sudo apt-get install -y kubeadm=1.36.0-1.1
sudo apt-mark hold kubeadm
## 查看升级计划
sudo kubeadm upgrade plan
## 执行升级
sudo kubeadm upgrade apply v1.36.0
## 升级 kubelet 和 kubectl
sudo apt-mark unhold kubelet kubectl
sudo apt-get update && sudo apt-get install -y kubelet=1.36.0-1.1 kubectl=1.36.0-1.1
sudo apt-mark hold kubelet kubectl
sudo systemctl daemon-reload && sudo systemctl restart kubelet
## 恢复节点调度
kubectl uncordon master-1
## 然后到下一个控制平面节点重复以上步骤
kubeadm alpha
提供 Alpha 级别的功能,可能在未来版本中变更或移除。
kubeadm alpha [subcommand] [flags]
| 子命令 | 说明 |
|---|---|
certs | 证书相关操作(已移入 kubeadm certs,旧版用) |
kubeconfig | 生成 kubeconfig 文件 |
selfhosting | 将静态 Pod 转换为自托管 DaemonSet(已废弃) |
实用示例
## 生成一个指定用户名的 kubeconfig
kubeadm alpha kubeconfig user --client-name=deploy-bot
注意
kubeadm 1.36 中大部分
alpha功能已迁移到正式子命令(如certs)。 不再建议使用alpha子命令,直接使用对应的正式子命令即可。
kubeadm 配置文件 YAML
面试重点:为什么要用配置文件而不是命令行参数?
- 可重复 — 配置文件可以版本化管理(Git)
- 可审计 — 清晰记录集群的初始化配置
- 完整 — 命令行参数有限,配置文件的选项更全面
- 可迁移 — 配置文件可用于
init、join、upgrade
kubeadm init 配置示例
## kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1beta4
kind: InitConfiguration
bootstrapTokens:
- token: "abcdef.0123456789abcdef"
description: "kubeadm bootstrap token"
ttl: "24h"
nodeRegistration:
name: "master-1"
criSocket: "unix:///run/containerd/containerd.sock"
kubeletExtraArgs:
node-ip: "192.168.1.100"
localAPIEndpoint:
advertiseAddress: "192.168.1.100"
bindPort: 6443
---
apiVersion: kubeadm.k8s.io/v1beta4
kind: ClusterConfiguration
kubernetesVersion: "v1.36.0"
controlPlaneEndpoint: "192.168.1.20:6443" # HA 专用
networking:
podSubnet: "10.244.0.0/16"
serviceSubnet: "10.96.0.0/12"
dnsDomain: "cluster.local"
apiServer:
certSANs:
- "k8s.example.com"
- "10.0.0.1"
extraArgs:
authorization-mode: "Node,RBAC"
controllerManager:
extraArgs:
bind-address: "0.0.0.0"
scheduler:
extraArgs:
bind-address: "0.0.0.0"
imageRepository: "registry.k8s.io"
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: "systemd"
maxPods: 110
## 使用配置文件初始化
sudo kubeadm init --config=kubeadm-config.yaml --upload-certs
kubeadm join 配置示例
## kubeadm-join-config.yaml
apiVersion: kubeadm.k8s.io/v1beta4
kind: JoinConfiguration
nodeRegistration:
name: "worker-1"
criSocket: "unix:///run/containerd/containerd.sock"
kubeletExtraArgs:
node-ip: "192.168.1.201"
discovery:
bootstrapToken:
token: "abcdef.0123456789abcdef"
apiServerEndpoint: "192.168.1.20:6443"
caCertHashes:
- "sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
tlsBootstrapToken: "abcdef.0123456789abcdef"
---
## 如果是控制平面节点加入,追加以下部分
apiVersion: kubeadm.k8s.io/v1beta4
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: "192.168.1.102"
bindPort: 6443
nodeRegistration:
name: "master-2"
## 使用配置文件加入
sudo kubeadm join --config=kubeadm-join-config.yaml
配置文件对比:命令行 vs YAML
| 命令行参数 | YAML 配置路径 | 备注 |
|---|---|---|
--apiserver-advertise-address | InitConfiguration.localAPIEndpoint.advertiseAddress | 节点级 |
--pod-network-cidr | ClusterConfiguration.networking.podSubnet | 集群级 |
--control-plane-endpoint | ClusterConfiguration.controlPlaneEndpoint | HA 专用 |
--kubernetes-version | ClusterConfiguration.kubernetesVersion | 集群级 |
--node-name | InitConfiguration.nodeRegistration.name | 节点级 |
--cri-socket | InitConfiguration.nodeRegistration.criSocket | 节点级 |
--cert-dir | InitConfiguration.certificateDir | 节点级 |
--image-repository | ClusterConfiguration.imageRepository | 集群级 |
--service-cidr | ClusterConfiguration.networking.serviceSubnet | 集群级 |
--token | InitConfiguration.bootstrapTokens[0].token | 节点级 |
如何从现有集群导出配置?
# 查看当前集群的 InitConfiguration kubectl -n kube-system get configmap kubeadm-config -o yaml # 或使用 kubeadm 命令 kubeadm config view
kubeadm 常用参数速查表
按场景分类
flowchart TD
subgraph "场景与参数速查"
A1[单控制平面] --> B1["--pod-network-cidr<br/>--apiserver-advertise-address"]
A2[高可用 HA] --> B2["--control-plane-endpoint<br/>--upload-certs<br/>--certificate-key"]
A3[离线部署] --> B3["--image-repository<br/>kubeadm config images pull"]
A4[问题排查] --> B4["--v=5<br/>--ignore-preflight-errors<br/>--dry-run"]
A5[版本升级] --> B5["kubeadm upgrade plan<br/>kubeadm upgrade apply"]
A6[证书管理] --> B6["kubeadm certs check-expiration<br/>kubeadm certs renew all"]
A7[节点加入] --> B7["--token<br/>--discovery-token-ca-cert-hash"]
end
全部命令一览
| 命令 | 用途 | 推荐参数 |
|---|---|---|
kubeadm init | 初始化控制平面 | --pod-network-cidr, --control-plane-endpoint, --upload-certs |
kubeadm join | 加入节点 | --token, --discovery-token-ca-cert-hash, --control-plane |
kubeadm token create --print-join-command | 生成 join 命令 | 最常用,记这一个就够了 |
kubeadm reset | 重置节点 | --force |
kubeadm certs check-expiration | 查看证书到期 | — |
kubeadm certs renew all | 续期所有证书 | — |
kubeadm config view | 查看集群配置 | — |
kubeadm config images list | 列出所需镜像 | --kubernetes-version |
kubeadm config images pull | 拉取镜像 | --kubernetes-version, --image-repository |
kubeadm upgrade plan | 查看升级计划 | — |
kubeadm upgrade apply | 执行升级 | --yes(跳过确认) |
关联文档
- 完整集群搭建流程 →使用 kubeadm 创建集群
- K8s 核心概念 → ../core/K8s 核心概念
- ../../network/网络 — 集群网络配置(CNI/flannel/Calico)
- ../../network/tools/firewalld 与 iptables 对比 — 节点防火墙配置
- ../service/K8s Service DNS 实现原理 — CoreDNS 域名解析