在本地节点调试webhook
引言通过operator SDK创建的webhook默认使用的service的方式访问webhook server,这需要将webhook部署到k8s上才能工作。对于开发的初级阶段,往往需要在反复修改调试代码,每次将webhook部署到k8s上很不方便。本节将介绍在本地调试webhook的方法。原理webhook分别为两部分,其一是能够处理https请求的web服务器,以及webhook请求的处理
引言
通过operator SDK创建的webhook默认使用的service的方式访问webhook server,这需要将webhook部署到k8s上才能工作。对于开发的初级阶段,往往需要在反复修改调试代码,每次将webhook部署到k8s上很不方便。本节将介绍在本地调试webhook的方法。
原理
webhook分别为两部分,其一是能够处理https请求的web服务器,以及webhook请求的处理程序;其二是在k8s上声明哪些资源对象状态变化需要调用webhook请求,该功能通过创建mutatingwebhookconfigurations和validatingwebhookconfigurations实现。所以原理上web服务器可以本地节点启动,然后修改k8s上的webhook配置,使其将请求发送给本地的web服务器。
需要完成三个步骤:
- 生成认证证书,包括服务端和客户端,证书中必须包含本地节点的地址或域名。
- 使用认证证书,在本地启动webhook的服务端程序;
- 在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服务,并调试了
更多推荐
所有评论(0)