สร้าง Pod ใน namesapce ที่ยังไม่เคยมีอยู่ก็ได้
Tags: kubernetes, admissioncontrol, kubeapiserver
Published: 2021-02-01 10:52:26

Namespace เป็นกลไกหนึ่งที่เอาไว้เพื่อการจัดการทรัพทยากรใน Kubernetes Cluster ให้บริหารได้ง่ายขึ้น ไม่ว่าจะเป็นการจัดการเรื่องสิทธิ์ในการเข้าถึง cluster หรือการใช้ทรัพยากรใน cluster เช่น CPU, Memory หรือ Storage เป็นต้น ให้จำกัดในค่าที่เหมาะสม และทำให้เกิดผลกระทบหากมีการใช้งานอย่างผิดปกติ **การสร้าง Kubernetes Object ใน namesapce ที่ยังไม่มีอยู่ โดยปกติจะเกิดข้อผิดพลาดเกิดขึ้น** 

###สร้าง pod ชื่อว่า myimage ใน namespace production
```
❯ kubectl get namespace
NAME              STATUS   AGE
default           Active   4d1h
kube-node-lease   Active   4d1h
kube-public       Active   4d1h
kube-system       Active   4d1h

❯ kubectl run myimage --image damrongsak/hello:8080 -n production
Error from server (NotFound): namespaces "production" not found
```
>  พบว่ามีข้อความแสดงข้อผิดพลาด Error from server (NotFound): namespaces "production" not found เนื่องจากใน **cluster ยังไม่มี namespace ที่ชื่อ production**

พักเรื่อง namespace ไว้ก่อน มามองในมุมของ Kubernetes API Server ในขั้นตอนที่เราร้องขอเพื่อบริหารจัดการ Kubernetes Object ซึ่งในตัวอย่างก็คือ Pod ไปที่ Kubernetes API Server คำร้องขอของเราจะผ่าน 3 ขั้นตอนภายใน Kubernetes API Server ... ขั้นตอนแรกเป็นการ authentication เพื่อพิสูจน์ตัวตนของผู้ร้องขอว่าเป็นผู้ใช้งานในระบบ ขั้นตอนถัดมาเป็นการ authorization เพื่อระบุว่าผู้ร้องขอมีสิทธิ์ตามที่ร้องขอมาหรือไม่ สุดท้ายเป็นขั้นตอนการ admission control เพื่อแก้ไขหรือตรวจสอบความถูกต้องเป็นขั้นตอนสุดท้าย เช่นขั้นตอนการตรวจสอบและจำกัดในการใช้งานทรัพยากรของ Kubernetes Cluster ก็อยู่ในส่วนนี้ด้วย
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/1ie8hd0g85l605ow0o7w.png)
ในขั้นตอน admission control มีความสามารถที่หลากหลาย หนึ่งในนั้นก็คือ NamespaceAutoProvision โดยที่ admission controller จะตรวจสอบความร้องขอที่ขอเข้ามาใน namespace ใด และตรวจสอบว่า namespace นั้นมีอยู่ใน Kubernetes Cluster หรือไม่ หากไม่พบ namesapce ก็จะส่งคำร้องให้สร้าง namespace ให้ด้วย

### แก้ไข option ของ kube-apiserver ที่ Control Plane
```
> vi /etc/kubernetes/manifests/kube-apiserver.yaml
... truncated output
spec:
  containers:
  - command:
    - kube-apiserver
    - --advertise-address=192.168.254.71
    - --allow-privileged=true
    - --authorization-mode=Node,RBAC
    - --client-ca-file=/etc/kubernetes/pki/ca.crt

##แก้ไขบรรทัด --enable-admission-plugins##
    - --enable-admission-plugins=NodeRestriction,NamespaceAutoProvision
##เพิ่ม NamespaceAutoProvision##

    - --enable-bootstrap-token-auth=true
    - --etcd-cafile=/etc/kubernetes/pki/etcd/ca.crt
... truncated output

```
###สร้าง pod ชื่อว่า myimage ใน namespace production
```
❯ kubectl get namespace
NAME              STATUS   AGE
default           Active   4d4h
kube-node-lease   Active   4d4h
kube-public       Active   4d4h
kube-system       Active   4d4h

❯ kubectl run myimage --image damrongsak/hello:8080 -n production
pod/myimage created

❯ kubectl get pods -n production
NAME      READY   STATUS    RESTARTS   AGE
myimage   1/1     Running   0          63s
```
> หลังจากที่เพิ่ม admission controller module ที่ชื่อว่า NamespaceAutoProvision สามารถสร้าง Pod myimage ที่ Namespace production ได้โดยไม่มีข้อความแสดงข้อผิดพลาด

#####มูลค่าความสุข