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