引言

通过operator SDK创建的webhook默认使用的service的方式访问webhook server,这需要将webhook部署到k8s上才能工作。对于开发的初级阶段,往往需要在反复修改调试代码,每次将webhook部署到k8s上很不方便。本节将介绍在本地调试webhook的方法。

原理

webhook分别为两部分,其一是能够处理https请求的web服务器,以及webhook请求的处理程序;其二是在k8s上声明哪些资源对象状态变化需要调用webhook请求,该功能通过创建mutatingwebhookconfigurations和validatingwebhookconfigurations实现。所以原理上web服务器可以本地节点启动,然后修改k8s上的webhook配置,使其将请求发送给本地的web服务器。

需要完成三个步骤:

  1. 生成认证证书,包括服务端和客户端,证书中必须包含本地节点的地址或域名。
  2. 使用认证证书,在本地启动webhook的服务端程序;
  3. 在k8s创建mutatingwebhookconfigurations和validatingwebhookconfigurations对象,指定使用本地webhook服务,其中clientConfig字段指定为本地地址,例如:https://192.168.56.200:9443/mutate-znbase-inspur-com-v1alpha1-znbasecluster

生成证书

operator SDK使用Kubernetes的认证证书管理插件cert-manager,生成所需的认证证书,参见。修改认证证书生成config/certmanager/certificate.yaml文件,添加本地服务器的ip地址,如下:

...
spec:
  # $(SERVICE_NAME) and $(SERVICE_NAMESPACE) will be substituted by kustomize
  dnsNames:
  - $(SERVICE_NAME).$(SERVICE_NAMESPACE).svc
  - $(SERVICE_NAME).$(SERVICE_NAMESPACE).svc.cluster.local
+  ipAddresses:
+  - 192.168.56.200
...

部署operator

假设当前我们已经有了一个可运行的operator,并添加了webhook。使用make deploy IMG=registry.inspur.com/zb-controller部署。
成功后,operator SDK会为我们创建运行operator的pod、持有认证证书的secret以及mutatingwebhookconfigurations和validatingwebhookconfigurations。

将认证证书保存到本地

部署operator后,我们查看pod的配置,结果如下:

apiVersion: v1
kind: Pod
metadata:
  name: zb-operator-controller-manager-7565cd76-przbh
  namespace: zb-operator-system
spec:
  containers:
    ...
    name: manager
    ...
    volumeMounts:
    - mountPath: /tmp/k8s-webhook-server/serving-certs
      name: cert
      readOnly: true
    ...
  volumes:
  - name: cert
    secret:
      defaultMode: 420
      secretName: webhook-server-cert
  ...

这里有两个有用的信息:

  • pod使用的认证来自名为webhook-server-cert的secret;
  • 认证证书映射到本地的路径:/tmp/k8s-webhook-server/serving-certs;

根据上面的信息,我们执行如下命令:

kubectl get secret webhook-server-cert -n zb-operator-system -o jsonpath='{.data.tls\.crt}'| base64 --decode > /tmp/k8s-webhook-server/serving-certs/tls.crt
kubectl get secret webhook-server-cert -n zb-operator-system -o jsonpath='{.data.tls\.key}'| base64 --decode > /tmp/k8s-webhook-server/serving-certs/tls.key

分别将认证证书的公钥和私钥保存到本地目录。

修改k8s上的webhook配置

执行如下命令,修改mutatingwebhookconfigurations,将clientConf替换为本地节点
kubectl patch mutatingwebhookconfigurations zb-operator-mutating-webhook-configuration -n zb-operator-system --type='json' -p '[{"op":"remove","path":"/webhooks/0/clientConfig/service"},{"op":"replace","path":"/webhooks/0/clientConfig/url","value":"https://192.168.56.200:9443/validate-znbase-inspur-com-v1alpha1-znbasecluster"}]'

使用同样的方法,修改validatingwebhookconfigurations

在本地启动webhook服务

至此就可以在本地节点启动webhook服务,并调试了

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐