Kubernetes Zero-2-Hero EP.4 สร้าง Secret ConfigMap และสำรองข้อมูลด้วย PersistentVolume

by. Settakit

settakit
Sirisoft
10 min readAug 13, 2021

--

สวัสดีครับ กลับมาเจอกันอีกครั้งกับ Series “Kubernetes Zero-2-Hero” ซึ่งก็ได้ดำเนินการมาถึง EP.4 กันแล้วนะครับ ใครที่มาถึงจุดนี้แล้วก็ถือว่าไม่ธรรมดาแล้วครับ ก็ขอขอบคุณที่ยังคงติดกันมาจนถึง EP นี้นะครับ ส่วนใน EP.4 นี้ เราจะมาพูดถึงเรื่อง Resouce Type ที่สามารถจัดการกับค่า Config ต่าง ๆ และ การทำพื้นที่สำหรับสำรองข้อมูลให้กับ Pods โดยสิ่งที่เราจะมาแนะนำให้รู้จักในวันนี้คือ

ConfigMap

Secret

Persistent Volume

Persistent Volume Claim

Storage Class

ConfigMap

มาเริ่มกันที่ ConfigMap กันเลยนะครับ

ConfigMap เป็นตัวที่คอยเก็บค่า Config ต่าง ๆ ไม่ว่าจะเป็นค่า Environment Variable (ENV) หรือว่าจะเป็นไฟล์ Config สำหรับ Pods ต่างๆ เราสามารถสร้าง ConfigMap เพื่อเก็บสิ่งเหล่านี้ได้ ซึ่งข้อมูลภายในของ ConfigMap นั้น จะเป็นค่าแบบ Key/Value เมื่อเราสร้าง ConfigMap เอาไว้แล้ว Pods สามารถเรียกใช้ค่า Config หรือไฟล์ที่เราสร้างเก็บไว้ที่ ConfigMap ได้

การสร้าง ConfigMap สามารถสร้างได้ทั้งจาก Command หรือ YAML แต่ในวันนี้เราจะสร้างมันด้วย Command กัน เพราะผมคิดว่ามันสะดวก และทำได้เร็วกว่า

มาเริ่มกันเลยดีกว่านะครับ การสร้าง ConfigMap จากการใช้ KEY/VALUE เหมาะสำหรับการทำ ENV สำหรับนำไปใข้งานใน Pods

เราสามารถดูได้ว่า ConfigMap ใน Cluster ของเรามีอะไรบ้างได้ดังนี้

ดูรายละเอียดของ ConfigMap

จะเห็นใน “first-config” ที่เราสร้างไว้จะมีข้อมูลที่เป็น Key/Value ตามที่เราได้กำหนดไว้

หลายคนอาจจะสงสัยว่าถ้าเรามี Key/Value เยอะมาก ๆ เราต้องคอยมาพิมพ์ Command ยาว ๆ เพื่อสร้างข้อมูลให้กับ ConfigMap รึเปล่า ผมบอกเลยว่า ไม่จำเป็นครับ เพราะเราสามารถสร้าง ConfigMap ได้จากไฟล์ ENV ที่เราได้เตรียมเอาไว้แล้วได้ ดังตัวอย่างนี้

เมื่อเราสร้าง ConfigMap เสร็จแล้วก็ลองมาดูผลลัพธ์กันนะครับ

จะพบว่าข้อมูลที่อยู่ภายในไฟล์ ENV ที่เราสร้างไว้ทั้งหมด ก็จะเข้าไปอยู่ใน ConfigMap แล้ว

ต่อไปเราจะนำค่าข้อมูลภายใน ConfigMap ไปใช้ใน Pod กัน

ก่อนอื่นสร้างไฟล์ YAML สำหรับการสร้าง Pod

จากนั้นแก้ไขไฟล์ที่ Command สร้างขึ้นมาให้

จากนั้นสร้าง Pod

ทดลอง Access เข้าไปยัง Pod เพื่อตรวจสอบดูว่า ภายใน Pod มีค่า ENV ที่เรากำหนดไว้ดังนี้

เพื่อลดเวลาการสร้างไฟล์ YAML สำหรับ Pod ที่ต้องการเรียกใช้งานค่าข้อมูลใน ConfigMap หลายค่า เราสามารถใช้วิธีดังนี้เพื่อประหยัดเวลาในการเขียนไฟล์มากยิ่งขึ้น

แก้ไขไฟล์ดังนี้

สร้าง Pod

ทดลอง Access เข้าไปยัง Pod เพื่อตรวจสอบ ENV ที่เราสร้างไว้

จะเห็นว่าค่าใน ConfigMap “first-config” เข้าไปอยู่ภายใน Pod ทั้งหมด

ต่อไปจะเป็นการสร้าง ConfigMap จากไฟล์ เพื่อนำไฟล์เหล่านั้นเข้าไปใช้งานภายใน Pods โดยชื่อไฟล์จะเป็น Key ส่วนข้อมูลจะเป็น Value ภายใน ConfigMap

เริ่มจากการสร้าง ConfigMap จากไฟล์ โดยไฟล์ที่เรานำมาใช้ก็จะเป็นไฟล์ env.txt ที่เราได้สร้างไว้ในก่อนหน้านี้ โดยมีวิธีการสร้าง ConfigMap ดังนี้

ดูข้อมูลรายละเอียดของ ConfigMap

จะเห็นได้ว่า Key ของข้อมูลจะเป็นชื่อไฟล์ ส่วน Value จะเป็นข้อมูลภายในไฟล์

ต่อไปเราจะสร้าง Pod เพื่อนำไฟล์ใน ConfigMap ไปใส่ไว้ภายใน Pod โดยเขียน YAML สำหรับ Pod ดังนี้

ทดลอง Access เข้าไปยัง Pod เพื่อตรวจสอบว่าไฟล์ได้เข้าไปอยู่ภายใน Pod แล้ว

จะเห็นว่าไฟล์ “env.txt” ได้เข้าไปอยู่ภายใน Pod และ Path ที่เรากำหนด

Secret

ในส่วนของ Secret นั้นก็จะลักษณะที่คล้ายกับ ConfigMap ที่สามารถใช้เก็บ ENV หรือไฟล์ต่าง ๆ ได้ แต่จะแตกต่างกันตรงที่ว่า Secret นั้นข้อมูลภายในเมื่อเราสร้างขึ้นมาข้อมูลจะถูก Encode ให้เป็น Base64 ซึ่งไม่สามารถอ่านได้ด้วยตาเปล่า ต้องนำไป Decode ก่อนถึงจะอ่านเข้าใจ จึงเหมาะสำหรับการนำไปใช้กับข้อมูลที่เป็นความลับ เช่น Username, Password

มาเริ่มสร้าง Secret กันเลยดีกว่า เริ่มจากการสร้าง Secret จาก Key/Value

เรียกดูข้อมูลภายใน Secret

จะเห็นได้ว่าข้อมูลที่เรากำหนดไว้ในตอนแรกได้ถูก Encode ให้เป็น Base64

โดยเราสามารถนำไปใช้กับ Pod ได้ดังนี้

จะเห็นว่าการเรียกใช้งานก็จะคล้ายกับการเรียกใช้ ConfigMap

ทดลองสร้าง Pod จากนั้น Access เข้าไปยัง Pod เพื่อดูค่าของ ENV ภายใน Pod

จะเห็นได้ว่ามี ENV ที่เรากำหนดไว้อยู่ภายใน Pod และ Value ที่เคยถูก Encode ไว้ก็จะถูก Decode กลับมาเมื่อเรานำ Value ไปใช้งานใน Pod

Secret ก็สามารถสร้างจากไฟล์เพื่อกำหนดค่า ENV หลายตัวให้กับ Pod ได้ ดังนี้

เริ่มจากสร้างไฟล์สำหรับเก็บค่า ENV

จากนั้นสร้าง Secret จาก ENV ไฟล์

สร้าง Pod เพื่อเรียกใช้ ENV ทั้งหมดภายใน “first-env-secret”

Access เข้าไปยัง Pod เพื่อตรวจสอบว่า Pod ได้รับ ENV จาก Secret แล้ว

ก็จะคล้าย ๆ กับ ConfigMap เราจะลองนำไฟล์จาก Secret ไปใส่ไว้ภายใน Pod โดยเริ่มจากการสร้าง Secret จากไฟล์ “env.txt” ที่เคยสร้างไว้ก่อนหน้านี้

ตรวจสอบรายละเอียดของ Secret

จะเห็นได้ว่าชื่อไฟล์จะเป็น Key ส่วน Value ก็จะเป็นข้อมูลภายในไฟล์ที่ถูก Encode ไว้

จากนั้นสร้าง Pod เพื่อนำไฟล์จาก Secret ไปใส่ไว้ภาย Pod

จากนั้น Access เข้าไปยัง Pod เพื่อดูว่าไฟล์ได้ถูกนำไปวางไว้ภายใน Pod แล้ว

Secret สามารถใช้สร้างเป็น Credential สำหรับการใช้งาน Pull Image จาก Private Registry ที่จำเป็นต้องทำการยืนยันตัวตนก่อนถึงจะใช้งาน Image ได้ โดยเราสามารถสร้างได้ดังนี้

นำไปใช้ในไฟล์ YAML

ต่อไปจะเป็นการสร้าง Secret สำหรับการเก็บ Key และ Cert สำหรับการทำ Ingress แบบ HTTPs ซึ่งเราก็ได้ใช้งานไปแล้วใน EP ก่อนหน้านี้ วิธีสร้างก็มีดังนี้

นำไปใช้ในไฟล์ YAML

Persistent Volume

ถึงแม้ว่า Pods จะมี Volumes อยู่ภายในตัวของ Pods เองแล้วก็ตาม แต่ Volume ภาย ใน Pod นั้นสามารถหายไปได้เมื่อ Pod นั้นมีปัญหาแล้วถูกลบออกไป จึงจำเป็นต้องมี Persistent Volume (PV) เป็นเครื่องมือสำหรับการจองพื้นที่บน Disks จริง ๆ เพื่อให้ Pods สามารถใช้พื้นที่ตรงนั้นในการเก็บข้อมูลสำรองได้ โดยเราสามารถสร้าง PV ได้ดังนี้

จากนั้นเมื่อสร้าง PV เรียบร้อยแล้วให้ลองเรียก PV ใน Cluster ออกมาดู

ตอนนี้เรามี PV แล้ว แต่ว่า Pods นั้นไม่สามารถเรียกใช้งาน PV ได้โดยตรง Pods จะเข้าถึงพื้นที่ใน PV ได้ด้วย Persistent Volume Claim

Persistent Volume Claim

เนื่องจาก Pods นั้นไม่สามารถเข้าถึงพื้นที่ของ PV ได้โดยตรง จึงจำเป็นต้องมี Persistent Volume Claim (PVC) เป็นตัวกลางในการขอใช้งานพื้นที่จาก PV โดยเราสามารถสร้าง PVC ได้ ดังนี้

เรียกดู PVC ใน Cluster

เมื่อเราลองเรียกดู PV อีกครั้งจะพบว่า PV ได้ถูกขอใช้พื้นที่ไปแล้ว

จากนั้นลองสร้าง Deployment ขึ้นมา 2 Deployment โดย Deployment ทั้งสองอันจะแตกต่างกันตรงที่ว่าอันนึงได้ทำการสำรองข้อมูลด้วย PVC ส่วนอีกหนึ่งอันไม่มีการทำสำรองข้อมูลเอาไว้

Deployment A

Deployment A จะมีการทำสำรองข้อมูลด้วย PVC

Deployment B

Deployment B ไม่มีการทำสำรองข้อมูล

ทดลองตามขั้นตอนดังนี้ทั้งสอง Deployment

หากทดลองตามขั้นตอนแล้ว จะพบว่า Pods ที่ไม่ได้ทำ Persistent Volume จะไม่สามารถนำข้อมูลเดิมที่เคยมีอยู่ภายใน Pods กลับมาใช้งานได้

Storage Class

ทุกครั้งที่เราจะทำ Persistent Volume ให้กับ Pods เราต้องคอยสร้าง PV ก่อนสร้าง PVC ก่อนตลอด จึง Storage Class (SC) ขึ้นมาช่วยในเรื่องของการสร้าง PV ให้อัตโนมัติเมื่อมีการสร้าง PVC ที่นี้เราก็ไม่จำเป็นต้องสร้าง PV เองอีกต่อไป

ซึ่งตัว SC หน้าที่การติดตั้งถูกทำโดย Admin ที่คอยจัดการกับ Cluster ซึ่งก็แล้วแต่ว่า Cluster นั้น Admin ได้สร้าง SC ไว้ให้หรือไม่ แต่ใน Local Cluster ของเรานั้นได้ทำการติดตั้งตัว SC ไว้ให้เรียบร้อยแล้ว สามารถเรียกดูได้ดังนี้

มาทดลองสร้าง PVC จาก SC กัน เริ่มจากการสร้างไฟล์ YAML สำหรับ PVC ขึ้นมาดังนี้

เรียก PVC และ PVC ขึ้นมาดู

จะพบ PV นั้น จะถูกสร้างขึ้นมาโดยอัตโนมัติ เมื่อเราสร้าง PVC

จากนั้นเราสามารถนำ PVC ไปใช้งานใน Pods ได้เหมือน PVC ทั่วไปได้เลย

Conclusion

  1. ConfigMap เป็นเครื่องมือที่เอาไว้จัดการเรื่องของการนำ ENV ไปใช้ภายใน Pods และยังสามารถสร้าง ConfigMap จากไฟล์ เพื่อนำไฟล์นั้นนำเข้าไปไว้ภายใน Pods ได้
  2. Secret การทำงานจะคล้าย ๆ กับ ConfigMap แต่ Secret นั้นข้อมูลภายในจะถูก Encode เป็น Base64 โดยสามารถนำไปใช้ใน Pods ได้เหมือนกับ ConfigMap ทุกอย่าง และ Secret ยังสามารถสร้าง Credential Secret ที่นำเอาไปใช้ในการ Pull Image ที่ต้องได้รับอนุญาติก่อนถึงจะสามารถใช้งานได้ และสุดท้ายสามารถสร้าง Secret สำหรับการนำไปทำ Ingress แบบ HTTPs ได้อีกด้วย
  3. Persistent Volume (PV) เป็นเครื่องมือในการจองพื้นที่กับ Disks จริง ๆ เพื่อให้ Pods ได้ใช้พื้นที่สำหรับสำรองข้อมูล
  4. Persistent Volume Claim (PVC) เรามีพื้นที่จาก PV แล้ว แต่ว่า Pods ไม่สามารถใช้งานพื้นที่จาก PV ได้โดยตรง จึงจำเป็นต้องมี PVC เป็นตัวกลางในการขอใช้งานพื้นที่
  5. Storage Class เป็นเครื่องมือที่จะทำให้เราสามารถสร้าง PVC ได้ง่ายขึ้น โดยเราสามารถสร้าง PVC ได้เลย โดยไม่ต้องสร้าง PV ก่อน โดยที่ Storage Class จะสร้าง PV ให้เองอัตโนมัติเมื่อเราสร้าง PVC

เป็นอย่างไรกันบ้างครับ ก็จบกันไปแล้วนะครับสำหรับ EP.4 ซึ่งถ้าได้เรียนมาถึงจุดนี้แล้วก็สามารถทำงานกับ Kubernetes Cluster ในเบื้องต้นได้แล้วครับ แต่สำหรับใครที่อยากจะรู้ และเข้าใจมันมากขึ้นกว่านี้ก็สามารถไปศึกษาหาความรู้เพิ่มเติมได้เลยครับ ยังมีคนสอนในเรื่องนี้เยอะแยะมากมาย ยังไงก็ลองเข้าไปศึกษาเพิ่มเติมดูนะครับ ส่วน Blog ของผม EP ถัดไป จะเป็น EP สุดท้ายแล้วนะครับ ซึ่ง EP สุดท้าย เราก็จะมาพูดถึงเรื่องของ Good to Know ของ Kubernetes ซึ่งผมก็เตรียมไว้อยู่ 3 เรื่องด้วยกันคือ Liveness, Readiness และ เรื่องของการจัดการ Version ของ Deployment ก็อย่าลืมรอติดตามกันนะครับ

เพื่อนๆสามารถติดตามกันได้ที่ https://www.facebook.com/sirisoft แล้วพบกันใหม่เร็วๆนี้ ขอบคุณครับ 👋🏻👋🏻👋🏻

--

--