在 K8s 中,kube-apiserver
使用 etcd 对 REST object
资源进行持久化存储,本文介绍如何配置生成自签 https 证书,搭建 etcd 集群给 apiserver 使用,并附相关坑点记录。
yaml 文件:https://github.com/k8s-club/etcd-operator
dnsutils 安装:https://kubernetes.io/docs/tasks/administer-cluster/dns-debugging-resolution/
apiserver.yaml:通过 ConfigMap
将生成的 *.pem 证书挂载给 apiserver 使用
解决:重新配置正确的 hosts 域名
推荐设置 *.xxx.ns.svc
,这样扩容后也不需要重签证书
参考:https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/
Go 代码参考如下:
解决:etcdctl 需要带证书访问
先通过 http 建立了 cluster,然后再用自签证书 https 来建立,这样就会报错:
经过验证:无论是从 http => https,还是从 https => http 的切换都会报这个错,因为一旦建立 cluster 成功,则把连接的协议(http/https) 写入到 etcd 存储里了,不能再更改连接协议。
解决:如果真正遇到需要切换协议,可尝试下面方式
•允许删除数据:删除后重新建立 cluster•不允许删数据:可以尝试采用 snapshot & restore[1] 进行快照与恢复操作
经过验证,是可以直接使用 etcd 证书的,但生产上不建议这样使用。
生产上建议对 apiserver(或其他应用) 单独生成证书,可使用泛域名(*.xx.xx)、不同过期时间等方式灵活配置,也更有利于集群管控。
[1]
snapshot & restore: https://etcd.io/docs/v3.5/op-guide/recovery/