สร้าง Pod ใน namesapce ที่ยังไม่เคยมีอยู่ก็ได้

rdamrong

Damrongsak Reetanon

Posted on February 1, 2021

สร้าง Pod ใน namesapce ที่ยังไม่เคยมีอยู่ก็ได้

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
Enter fullscreen mode Exit fullscreen mode

พบว่ามีข้อความแสดงข้อผิดพลาด 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
ในขั้นตอน 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

Enter fullscreen mode Exit fullscreen mode

สร้าง 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
Enter fullscreen mode Exit fullscreen mode

หลังจากที่เพิ่ม admission controller module ที่ชื่อว่า NamespaceAutoProvision สามารถสร้าง Pod myimage ที่ Namespace production ได้โดยไม่มีข้อความแสดงข้อผิดพลาด

มูลค่าความสุข
💖 💪 🙅 🚩
rdamrong
Damrongsak Reetanon

Posted on February 1, 2021

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related