สร้าง Pod ใน namesapce ที่ยังไม่เคยมีอยู่ก็ได้
Damrongsak Reetanon
Posted on February 1, 2021
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 ก็อยู่ในส่วนนี้ด้วย
ในขั้นตอน 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 ได้โดยไม่มีข้อความแสดงข้อผิดพลาด
มูลค่าความสุข
Posted on February 1, 2021
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.