简介

在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

Logo

开源、云原生的融合云平台

更多推荐