bigywater.tech
Kubernetes · 100

kube-apiserver 关键参数:每个参数改变了什么

kube-apiserver 的那一长串参数到底改变了什么?哪些是默认值,哪些必须改?改了要多久生效?这篇把 kubeadm 生成的参数分类读一遍,再挑三个有可见效果的参数改一改、测一测、再改回来。

28 个
kubeadm 为 kube-apiserver 生成的启动参数个数
42 秒
修改 manifest 之后新的 apiserver 就绪所需的时间(改回去用了 75 秒)
403 → 401
--anonymous-auth=false 之后,不带令牌的请求的响应码

参数按作用分类

实测 · 本机执行输出
  共 28 个参数;按作用选几个:
    认证/鉴权:--authorization-mode=Node,RBAC --client-ca-file=pki/ca.crt --enable-bootstrap-token-auth=true --requestheader-client-ca-file=pki/front-proxy-ca.crt --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=pki/sa.pub --service-account-signing-key-file=pki/sa.key
    准入:--enable-admission-plugins=NodeRestriction
    网络范围:--advertise-address=172.18.0.3 --secure-port=6443 --service-cluster-ip-range=10.96.0.0/16
    etcd 与 kubelet:--etcd-cafile=pki/etcd/ca.crt --etcd-servers=https://127.0.0.1:2379 --kubelet-client-certificate=pki/apiserver-kubelet-client.crt --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
    TLS 服务证书:--tls-cert-file=pki/apiserver.crt --tls-private-key-file=pki/apiserver.key
  没有出现的、使用默认值的重要参数:--service-node-port-range(默认 30000-32767)、--anonymous-auth(默认 true)、--max-requests-inflight(默认 400)、--etcd-compaction-interval(默认 5m)

kubeadm 在 /etc/kubernetes/manifests/kube-apiserver.yaml 里生成了 28 个参数。认证与鉴权:--authorization-mode=Node,RBAC、--client-ca-file、--enable-bootstrap-token-auth=true、--service-account-issuer=https://kubernetes.default.svc.cluster.local、--service-account-key-file 与 --service-account-signing-key-file;准入:--enable-admission-plugins=NodeRestriction;网络范围:--service-cluster-ip-range=10.96.0.0/16、--secure-port=6443;etcd 与 kubelet:--etcd-servers、--kubelet-client-certificate、--kubelet-preferred-address-types;TLS:--tls-cert-file 与 --tls-private-key-file。没出现的重要参数用内置默认值:--service-node-port-range(30000-32767)、--anonymous-auth(true)、--max-requests-inflight(400)、--etcd-compaction-interval(5m)。

改三个参数

实测 · 本机执行输出
  改前:NodePort Service 分到 32326;Pod 写 imagePullPolicy: IfNotPresent → 实际 IfNotPresent;不带令牌访问 /api/v1/namespaces/default/pods → HTTP 403(匿名请求默认被当作 system:anonymous,走到鉴权才被拒)
  修改 /etc/kubernetes/manifests/kube-apiserver.yaml 之后 42 秒,新的 apiserver 就绪(旧容器 50732059 → 新容器 01baf1f4)
  改后:新建 NodePort Service → 退出码 0
    nodePort=31010(落在 31000-31010 里);原来分到的 32326 的 Service before 仍在:32326(已有的不动)
    指定 nodePort: 30050 → 退出码 1;['The Service "manual" is invalid: spec.ports[0].nodePort: Invalid value: 30050: provided port is not in the valid range. The range of valid ports is 31000-31010']
    Pod 写 imagePullPolicy: IfNotPresent → 实际 Always(AlwaysPullImages 准入把它改成了 Always);旧的 pre 仍是 IfNotPresent
    不带令牌访问 /api/v1/namespaces/default/pods → HTTP 401(--anonymous-auth=false 之后是 401 而不是 403)

一次改:--service-node-port-range=31000-31010、--anonymous-auth=false、--enable-admission-plugins 追加 AlwaysPullImages。改前:新建 NodePort Service 分到 32326;Pod 写 imagePullPolicy: IfNotPresent 实际也是 IfNotPresent;不带令牌访问 /api/v1/namespaces/default/pods 得到 HTTP 403。改 manifest 后 42 秒新 apiserver 就绪:新的 NodePort Service 分到 31010,旧的 Service 仍是 32326(已有的不动);指定 nodePort: 30050 被拒(The range of valid ports is 31000-31010);新 Pod 的 imagePullPolicy 被准入改成 Always,旧 Pod 不变;匿名访问变成 HTTP 401——没有身份是 401(认证失败),带了身份而无权限才是 403。

改回去

实测 · 本机执行输出
  恢复原来的 manifest,75 秒后 apiserver 就绪;匿名访问 → HTTP 403;新建 NodePort Service 分到 31874

把 manifest 恢复成原样,75 秒后 apiserver 就绪;匿名访问回到 403;新建 NodePort Service 分到 31874,又在默认范围里。这些都是启动参数,改完要重启 apiserver;单节点控制面的集群在这几十秒里 kubectl 不可用。多控制面节点要逐台滚动修改,改前先备份原 manifest 方便回滚。

分步演示

apiserver 参数
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 arm64 / kind(Docker 里的单节点或多节点真实集群,节点是 Docker Desktop 虚拟机里的容器)/ kubectl;用空的 kubeconfig 之外的独立 kubeconfig,不碰用户自己的集群;计时用 date +%s%N / kubectl 事件时间戳,数字每次运行会有小幅抖动。三节点 kind 集群 kx-main(Kubernetes v1.37.0,单控制面节点);修改通过 docker cp + cp 替换控制面节点上的静态 Pod manifest;就绪时间 = 新容器出现且 /readyz 为 ok;匿名访问用宿主机 curl -k 访问 apiserver 的映射端口;实验结束后 manifest 已恢复原样;每种情形各一次
    • 没有验证:--max-requests-inflight / --max-mutating-requests-inflight 与 APF 的关系(见 k17);--etcd-servers-overrides;--audit-* 参数(见 k18);--oidc-* 外部认证;--feature-gates;--runtime-config 开关 API 组;--request-timeout;参数名在不同版本里的弃用与改名
    京ICP备2026067502号-1京公网安备11010502063487号