# Assignment - Webhook ###### tags: `Assignment`, `Webhook` ## Outline 這次我們要實作一個webhook,其功能與先前實作的Operator/controller相當, 因此可以沿用當初寫的監測pod的image(`riyazhu/podmonitor:latest`) 這次的Assignment與[Assignment - Operator](https://hackmd.io/@lsalab-k8s-2020/assignments)最大的不同在於: + monitor pod改以**container**的方式inject到原先要監測的pod裡面 ## Hint 1. 你需先確認是否啟動MutatingAdmissionWebhook和ValidatingAdmissionWebhook兩個控制器 2. 產生相關的憑證供開發使用,推薦將憑證存於secret ![](https://i.imgur.com/h1UWukP.png) 3. 相關說明請見Reference ## Problem Description ![](https://i.imgur.com/z6w1cxl.png) 上圖是一個admission webhook的示意圖, 我們這次主要實作兩個部分: 1. Validate 2. Mutate 測試的話請分開測試,先測試Validate,再測試Mutate, 從上圖我們可以知道mutate會將我們所缺失的一些標記自動補齊, 故如果測試順序反過來,則將無法正確驗證結果。 接下來會分別介紹兩者需要實現功能。 ### Validate 這個部分主要用於練練手, 學習該如何實現一個validate功能的webhook。 你需驗證你的pod擁有這個label`app.kubernetes.io/name=not_available`, (不需驗證kube-system和kube-public裡的pod) ![](https://i.imgur.com/G9TQRpe.png) 若沒有的話, 拒絕創建pod ![](https://i.imgur.com/qMqqqXG.png) **測資0:** ```yaml= # sleep.yaml apiVersion: v1 kind: Pod metadata: name: sleep01 labels: env: test spec: containers: - name: sleep01 image: busybox command: ["sleep", "3600"] imagePullPolicy: IfNotPresent ``` ### Mutate 本次作業的重點,主要在於這個部分。 如同一開始所說的需要將以這個image為基礎`riyazhu/podmonitor:latest`創建出的container, (詳見[sorce code](https://github.com/StarCoral/K8S_Study_Group_2020/tree/master/Operator/metrics-test),或是使用當出自己寫的監測的image), 將其inject到原先的pod,目的和Operator一樣 <font color = green>**正確情況:**</font> 成功創建 + pod - podtest01, podtest02 + deployment - sleep podtest02 為這次功能的實現, 其餘用來測試正確性 ![](https://i.imgur.com/gw2q709.png) ```bash= $ kubectl logs podtest02 -c podmonitor ``` ![](https://i.imgur.com/54NaBPt.png) 相對應的file log也成功create ![](https://i.imgur.com/B5rAcCN.png) **測資1:** ```yaml= # podtest01.yaml apiVersion: v1 kind: Pod metadata: name: podtest01 labels: env: test spec: containers: - name: podtest01 image: busybox command: ["sleep", "3600"] imagePullPolicy: IfNotPresent ``` **測資2:** ```yaml= # podtest02.yaml apiVersion: v1 kind: Pod metadata: name: podtest02 annotations: podmonitor-webhook.nthu.lsalab: "true" labels: env: test spec: containers: - name: podtest02 image: busybox command: ["sleep", "3600"] imagePullPolicy: IfNotPresent ``` **測資3:** ```yaml= # sleep-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: sleep labels: app: sleep1 spec: replicas: 1 selector: matchLabels: app: sleep template: metadata: labels: app: sleep spec: containers: - name: sleep image: busybox command: ["sleep", "3600"] imagePullPolicy: IfNotPresent ``` <font color = red>**錯誤情況:**</font> 請務必注意實現的webhook,<font color = red>不能影響其他的功能正常運行。</font> 當apply deployment或其他resource時, 不可以因為啟動webhook功能,而產生一堆Pod,如下圖所示。 ![](https://i.imgur.com/Vciar3H.png) ## Reference + https://www.qikqiak.com/post/k8s-admission-webhook/ + https://github.com/cnych/admission-webhook-example + http://www.iceyao.com.cn/2019/06/05/%E7%8E%A9%E8%BD%ACK8s-AdmissionWebhook/ + https://github.com/yaoice/webhook-demo + 建立測試用的憑證 https://blog.miniasp.com/post/2019/02/25/Creating-Self-signed-Certificate-using-OpenSSL