---
# System prepended metadata

title: Assignment - Webhook
tags: [Assignment, Webhook]

---

# 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