DEV Community

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

Posted on

สร้าง 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 ได้โดยไม่มีข้อความแสดงข้อผิดพลาด

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

Top comments (0)