CentOS7下用kubeadm部署K8s时,如何生成5年期kube-apiserver证书?
嘿,我刚好碰到过这个问题!kubeadm默认生成的1年期kube-apiserver证书确实太折腾人了,你之前单独用openssl genrsa没奏效是因为没踩对kubeadm的路子——它有自己完整的证书生成体系,得通过配置文件来指定有效期才行。下面是部署阶段直接生成5年有效期证书的靠谱方法:
方法一:通过kubeadm配置文件自定义证书有效期
这是kubeadm官方推荐的方式,能在集群初始化阶段直接生成符合要求的证书,还能顺便指定你需要的TLS加密套件。
1. 导出kubeadm默认配置模板
先把kubeadm的默认配置导出来,方便我们修改:
kubeadm config print init-defaults > kubeadm-config.yaml
2. 修改配置文件,设置证书有效期和加密套件
打开kubeadm-config.yaml,按照下面的方式修改:
- 如果你只想单独设置kube-apiserver的证书有效期,就在
apiServer节点下添加certificateValidity字段(值设为1825天,刚好5年),同时指定TLS加密套件:
apiServer: certSANs: - "kube-apiserver" - "localhost" - "127.0.0.1" # 这里可以添加你的集群域名、API Server的公网/内网IP extraArgs: tls-cipher-suites: TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 certificateValidity: 1825 # 5年 = 365*5 = 1825天
- 要是想给所有集群证书(比如kube-controller-manager、kube-scheduler等)都设置5年有效期,可以在配置文件的顶层
ClusterConfiguration节点下添加全局的certificateValidity:
apiVersion: kubeadm.k8s.io/v1beta3 kind: ClusterConfiguration kubernetesVersion: v1.28.0 # 替换成你要部署的K8s版本 certificateValidity: 1825 # 全局设置所有证书有效期为5年 apiServer: certSANs: - "kube-apiserver" extraArgs: tls-cipher-suites: TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
3. 用自定义配置初始化集群
修改完配置文件后,用它来执行kubeadm初始化命令:
kubeadm init --config=kubeadm-config.yaml
这样kubeadm就会严格按照你指定的参数生成证书,包括5年有效期和要求的TLS加密套件。
为什么单独用openssl生成没用?
kubeadm在部署时会自动构建一套完整的证书信任链(由它自己生成的kubernetes CA签名所有组件证书),你单独用openssl生成的证书不在这个信任链里,kube-apiserver和其他组件(比如kubelet、kube-controller-manager)之间会因为证书不被信任而无法正常通信,自然就没用啦。
验证证书是否生效
集群初始化完成后,你可以用这条命令查看kube-apiserver证书的有效期:
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -text -noout | grep -A2 "Validity"
输出里的起始日期和过期日期应该刚好间隔5年,就说明配置生效了。
内容的提问来源于stack exchange,提问作者sfgroups




