简介
在kubernetes中,为了保证安全要求必须使用https协议访问webhook服务器。这里就会涉及到TLS证书问题,介绍TLS证书的资料很多,基本原理就是通过公钥和私钥验证通信双方的合法身份。在使用operator SDk开发中webhook默认使用名字为webhook-server-cert的secret提供TLS证书。详细内容可以查看配置文件config/default/manager_webhook_patch.yaml中下面部分:
...
volumes:
- name: cert
secret:
defaultMode: 420
secretName: webhook-server-cert
本节主要目的是弄清楚operator SDK生成webhook-server-cert的过程。
创建webhook-server-cert
在工程中搜索webhook-server-cert,可以发现是在config/certmanager/certificate.yaml中创建,相关脚本如下:
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: serving-cert # this name should match the one appeared in kustomizeconfig.yaml
namespace: system
spec:
# $(SERVICE_NAME) and $(SERVICE_NAMESPACE) will be substituted by kustomize
dnsNames:
- $(SERVICE_NAME).$(SERVICE_NAMESPACE).svc
- $(SERVICE_NAME).$(SERVICE_NAMESPACE).svc.cluster.local
issuerRef:
kind: Issuer
name: selfsigned-issuer
secretName: webhook-server-cert # this secret will not be prefixed, since it's not managed by kustomize
可以看到是通过类型为Certificate的资源创建的webhook-server-cert,其中dns域名使用的是webhook的service的名字$(SERVICE_NAME).$(SERVICE_NAMESPACE)
,这两个变量是在config/default/kustomization.yaml中定义。另外还使用了类别为Issuer的资源selfsigned-issuer,其定义如下:
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
name: selfsigned-issuer
namespace: system
spec:
selfSigned: {}
至此基本可知webhook-server-cert是由cert-manager组件的Certificate资源和Issuer资源自动创建并维护,这里又引入了一个新的问题cert-manager是什么?怎么用?
cert-manager
简介
cert-manager是一个Kubernetes插件,用于自动管理和颁发来自各种颁发源的TLS证书。它将确保证书有效和定期更新,并在到期前的适当时间尝试更新证书。详见:https://github.com/jetstack/cert-manager
解决的问题
- k8s集群上部署的应用较多,要为每个应用的不同域名生成TLS证书,操作太麻烦;
- 手动创建TLS证书与deployment描述文件独立存储,很容易丢失;
- 证书过期后,需要手动执行命令重新生成证书;
部署cert manager的crd资源
kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.4.1/cert-manager.crds.yaml
查看部署的crd资源如下:
$ kubectl get crd | grep cert-manager
certificaterequests.cert-manager.io 2021-07-27T16:09:08Z
certificates.cert-manager.io 2021-07-27T16:09:08Z
challenges.acme.cert-manager.io 2021-07-27T16:09:08Z
clusterissuers.cert-manager.io 2021-07-27T16:09:09Z
issuers.cert-manager.io 2021-07-27T16:09:09Z
orders.acme.cert-manager.io 2021-07-27T16:09:10Z
可以看到issusers和certificates正是之前使用的资源。
部署cert manager的后台服务
kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.4.1/cert-manager.yaml
查看部署的service
kubectl get svc -n cert-manager
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
cert-manager ClusterIP 10.109.162.144 <none> 9402/TCP 12m
cert-manager-webhook ClusterIP 10.106.245.74 <none> 443/TCP 12m
cert-manager部署了cert-manager和cert-manager-webhook两个服务,而且分别对应不同的deployment。
cert-manager实际上也是一个operator,只不过它的开发时间比较早,是直接基于kubernetes client API,而非control-runtime。
查看部署的deployment
kubectl get deployment -n cert-manager
NAME READY UP-TO-DATE AVAILABLE AGE
cert-manager 1/1 1 1 13m
cert-manager-cainjector 1/1 1 1 13m
cert-manager-webhook 1/1 1 1 13m
参考
https://cloud.tencent.com/developer/article/1402451
https://github.com/jetstack/cert-manager