1. วัตถุประสงค์
Kustomize เป็นเครื่องมือที่นำเสนอวิธีปรับแต่งการกำหนดค่าแอปพลิเคชันโดยไม่ต้องใช้เทมเพลต ซึ่งช่วยให้การใช้แอปพลิเคชันสำเร็จรูปง่ายขึ้น โดยมีให้ใช้งานเป็นยูทิลิตีแบบสแตนด์อโลนและสร้างขึ้นใน kubectl ผ่าน kubectl apply -k หรือจะใช้เป็น CLI แบบสแตนด์อโลนก็ได้ ดูรายละเอียดเพิ่มเติมได้ที่ kustomize.io
ในบทแนะนำนี้ คุณจะได้เรียนรู้แนวคิดหลักบางอย่างของ Kustomize และใช้เพื่อจัดการรูปแบบต่างๆ ในแอปพลิเคชันและสภาพแวดล้อม
คุณจะได้รับสิ่งต่อไปนี้
- ใช้ไคลเอ็นต์บรรทัดคำสั่ง kustomize
- ลบล้างองค์ประกอบทั่วไป
- แก้ไขโครงสร้าง YAML ขนาดใหญ่
- ใช้เลเยอร์การวางซ้อนหลายชั้น
2. การเตรียมพื้นที่ทำงาน
- เปิดโปรแกรมแก้ไข Cloud Shell โดยไปที่ URL ต่อไปนี้
https://ide.cloud.google.com
- ในหน้าต่างเทอร์มินัล ให้สร้างไดเรกทอรีการทำงานสำหรับบทแนะนำนี้
mkdir kustomize-lab
- เปลี่ยนเป็นไดเรกทอรีและตั้งค่าพื้นที่ทํางานของ IDE
cd kustomize-lab && cloudshell workspace .
3. การใช้ไคลเอ็นต์บรรทัดคำสั่ง Kustomize
ความสามารถของ Kustomize มาจากการซ้อนทับและแก้ไข YAML ของ Kubernetes พื้นฐานด้วยค่าที่กำหนดเอง หากต้องการดำเนินการนี้ kustomize ต้องมีไฟล์ฐานที่มีวิธีการระบุตำแหน่งของไฟล์และสิ่งที่ต้องแทนที่ Kustomize รวมอยู่ในระบบนิเวศของ Kubernetes และเรียกใช้ได้หลายวิธี
ในส่วนนี้ คุณจะได้สร้างการกำหนดค่า kustomize พื้นฐานและประมวลผลไฟล์ด้วยไคลเอ็นต์บรรทัดคำสั่ง kustomize แบบสแตนด์อโลน
- โดยคุณจะสร้างโฟลเดอร์เพื่อเก็บไฟล์การกำหนดค่าพื้นฐานก่อน
mkdir -p chat-app/base
- สร้าง kubernetes
deployment.yamlอย่างง่ายในโฟลเดอร์ฐาน
cat <<EOF > chat-app/base/deployment.yaml
kind: Deployment
apiVersion: apps/v1
metadata:
name: app
spec:
template:
`metadata:`
`name: chat-app`
`spec:`
`containers:`
`- name: chat-app`
`image: chat-app-image`
EOF
- สร้างฐาน
kustomization.yaml
Kustomize จะมองหาไฟล์ที่ชื่อ kustomization.yaml เป็นจุดแรกเข้า ไฟล์นี้มีการอ้างอิงถึงไฟล์ฐานและไฟล์แทนที่ต่างๆ รวมถึงค่าแทนที่ที่เฉพาะเจาะจง
สร้างkustomization.yamlไฟล์ที่อ้างอิงdeployment.yamlเป็นทรัพยากรฐาน
cat <<EOF > chat-app/base/kustomization.yaml
bases:
- deployment.yaml
EOF
- เรียกใช้คำสั่ง Kustomize ในโฟลเดอร์ฐาน การทำเช่นนี้จะส่งออกไฟล์ YAML ของการติดตั้งใช้งานโดยไม่มีการเปลี่ยนแปลง ซึ่งเป็นไปตามที่คาดไว้เนื่องจากคุณยังไม่ได้รวมรูปแบบใดๆ
kustomize build chat-app/base
ไคลเอ็นต์แบบสแตนด์อโลนนี้สามารถใช้ร่วมกับไคลเอ็นต์ kubectl เพื่อใช้เอาต์พุตโดยตรงได้ดังตัวอย่างต่อไปนี้ ซึ่งจะเป็นการสตรีมเอาต์พุตของคำสั่งบิลด์ไปยังคำสั่ง kubectl apply โดยตรง
(ห้ามดำเนินการ - รวมไว้เพื่อใช้อ้างอิงเท่านั้น)
kustomize build chat-app/base | kubectl apply -f -
เทคนิคนี้มีประโยชน์หากจำเป็นต้องใช้ไคลเอ็นต์ Kustomize เวอร์ชันใดเวอร์ชันหนึ่ง
หรือจะเรียกใช้ Kustomize ด้วยเครื่องมือที่ผสานรวมอยู่ใน kubectl เองก็ได้ ดังตัวอย่างต่อไปนี้
(ห้ามดำเนินการ - รวมไว้เพื่อใช้อ้างอิงเท่านั้น)
kubectl apply -k chat-app/base
4. การลบล้างองค์ประกอบทั่วไป
ตอนนี้คุณได้กำหนดค่าพื้นที่ทํางานและยืนยันว่า Kustomize ทํางานแล้ว ก็ถึงเวลาที่จะลบล้างค่าพื้นฐานบางค่า
โดยทั่วไปแล้ว รูปภาพ เนมสเปซ และป้ายกำกับจะได้รับการปรับแต่งสำหรับแต่ละแอปพลิเคชันและสภาพแวดล้อม เนื่องจากมีการเปลี่ยนแปลงบ่อย Kustomize จึงช่วยให้คุณประกาศตัวแปรเหล่านี้ได้โดยตรงใน kustomize.yaml ซึ่งช่วยลดความจำเป็นในการสร้างแพตช์จำนวนมากสำหรับสถานการณ์ทั่วไปเหล่านี้
เทคนิคนี้มักใช้เพื่อสร้างอินสแตนซ์ที่เฉพาะเจาะจงของเทมเพลต ตอนนี้คุณสามารถใช้ชุดทรัพยากรพื้นฐานชุดเดียวกับการติดตั้งใช้งานหลายรายการได้โดยเพียงแค่เปลี่ยนชื่อและเนมสเปซ
ในตัวอย่างนี้ คุณจะเพิ่มเนมสเปซ คำนำหน้าชื่อ และป้ายกำกับบางรายการลงใน kustomization.yaml
- อัปเดต
kustomization.yamlเพื่อรวมป้ายกำกับและเนมสเปซทั่วไป
คัดลอกและเรียกใช้คำสั่งต่อไปนี้ในเทอร์มินัล
cat <<EOF > chat-app/base/kustomization.yaml
bases:
- deployment.yaml
namespace: my-namespace
nameprefix: my-
commonLabels:
app: my-app
EOF
- เรียกใช้คำสั่งบิลด์
การเรียกใช้บิลด์ในตอนนี้แสดงให้เห็นว่าไฟล์ YAML ที่ได้จะมีเนมสเปซ ป้ายกำกับ และชื่อที่มีคำนำหน้าทั้งในคำจำกัดความของบริการและการติดตั้งใช้งาน
kustomize build chat-app/base
โปรดสังเกตว่าเอาต์พุตมีป้ายกำกับและเนมสเปซที่ไม่ได้อยู่ในไฟล์ YAML ของการทำให้ใช้งานได้ โปรดสังเกตด้วยว่าเราได้เปลี่ยนชื่อจาก chat-app เป็น my-chat-app
(เอาต์พุตไม่คัดลอก)
kind: Deployment
metadata:
labels:
`app: my-app`
name: my-chat-app
namespace: my-namespace
5. การแก้ไขโครงสร้าง YAML ขนาดใหญ่
นอกจากนี้ Kustomize ยังมีความสามารถในการใช้แพตช์ที่ซ้อนทับทรัพยากรพื้นฐาน เทคนิคนี้มักใช้เพื่อสร้างความแตกต่างระหว่างแอปพลิเคชันและสภาพแวดล้อม
ในขั้นตอนนี้ คุณจะสร้างรูปแบบสภาพแวดล้อมสำหรับแอปพลิเคชันเดียวที่ใช้ทรัพยากรฐานเดียวกัน
- เริ่มด้วยการสร้างโฟลเดอร์สำหรับสภาพแวดล้อมต่างๆ
mkdir -p chat-app/dev
mkdir -p chat-app/prod
- เขียนแพตช์ของสภาพแวดล้อมด้วยคำสั่งต่อไปนี้
cat <<EOF > chat-app/dev/deployment.yaml
kind: Deployment
apiVersion: apps/v1
metadata:
name: app
spec:
template:
`spec:`
`containers:`
`- name: chat-app`
`env:`
`- name: ENVIRONMENT`
`value: dev`
EOF
- ตอนนี้ให้เขียนแพตช์ prod ด้วยคำสั่งต่อไปนี้
cat <<EOF > chat-app/prod/deployment.yaml
kind: Deployment
apiVersion: apps/v1
metadata:
name: app
spec:
template:
`spec:`
`containers:`
`- name: chat-app`
`env:`
`- name: ENVIRONMENT`
`value: prod`
EOF
โปรดทราบว่าแพตช์ด้านบนไม่มีชื่ออิมเมจคอนเทนเนอร์ ค่าดังกล่าวจะอยู่ใน base/deployment.yaml ที่คุณสร้างไว้ในขั้นตอนก่อนหน้า แต่แพตช์เหล่านี้มีตัวแปรสภาพแวดล้อมที่ไม่ซ้ำกันสำหรับ dev และ prod
- ใช้ไฟล์ YAML ของ Kustomize สำหรับไดเรกทอรีฐาน
เขียนไฟล์ kustomization.yaml พื้นฐานใหม่ นำเนมสเปซและคำนำหน้าชื่อออก เนื่องจากนี่เป็นเพียงการกำหนดค่าพื้นฐานที่ไม่มีการเปลี่ยนแปลง ระบบจะย้ายฟิลด์เหล่านั้นไปยังไฟล์สภาพแวดล้อมในอีกสักครู่
cat <<EOF > chat-app/base/kustomization.yaml
bases:
- deployment.yaml
commonLabels:
app: chat-app
EOF
- ใช้ไฟล์ YAML ของ Kustomize สำหรับไดเรกทอรี dev
ตอนนี้ให้ใช้รูปแบบสำหรับ dev และ prod โดยเรียกใช้คำสั่งต่อไปนี้ในเทอร์มินัล
cat <<EOF > chat-app/dev/kustomization.yaml
bases:
- ../base
namespace: dev
nameprefix: dev-
commonLabels:
env: dev
patches:
- deployment.yaml
EOF
โปรดสังเกตส่วน patches: ที่เพิ่มเข้ามาในไฟล์ ซึ่งระบุว่า kustomize ควรซ้อนทับไฟล์เหล่านั้นบนทรัพยากรพื้นฐาน
- ใช้ไฟล์ YAML ของ Kustomize สำหรับไดเรกทอรี prod
cat <<EOF > chat-app/prod/kustomization.yaml
bases:
- ../base
namespace: prod
nameprefix: prod-
commonLabels:
env: prod
patches:
- deployment.yaml
EOF
- เรียกใช้ Kustomize เพื่อผสานไฟล์
เมื่อสร้างไฟล์ฐานและไฟล์สภาพแวดล้อมแล้ว คุณจะเรียกใช้กระบวนการ Kustomize เพื่อแก้ไขไฟล์ฐานได้
เรียกใช้คำสั่งต่อไปนี้สำหรับ dev เพื่อดูผลลัพธ์ที่ผสานรวม
kustomize build chat-app/dev
โปรดทราบว่าเอาต์พุตมีผลการค้นหาที่ผสาน เช่น ป้ายกำกับจากการกำหนดค่าฐานและการกำหนดค่าสำหรับนักพัฒนาซอฟต์แวร์ รวมถึงชื่ออิมเมจคอนเทนเนอร์จากฐานและตัวแปรสภาพแวดล้อมจากโฟลเดอร์สำหรับนักพัฒนาซอฟต์แวร์
6. การใช้เลเยอร์การวางซ้อนหลายชั้น
องค์กรจำนวนมากมีทีมที่ช่วยสนับสนุนทีมแอปและจัดการแพลตฟอร์ม บ่อยครั้งที่ทีมเหล่านี้ต้องการรวมรายละเอียดที่เฉพาะเจาะจงซึ่งต้องรวมไว้ในแอปทั้งหมดในทุกสภาพแวดล้อม เช่น ตัวแทนการบันทึก
ในตัวอย่างนี้ คุณจะสร้างshared-kustomizeโฟลเดอร์และทรัพยากรซึ่งจะรวมอยู่ในแอปพลิเคชันทั้งหมดและไม่ว่าแอปพลิเคชันจะได้รับการติดตั้งใช้งานในสภาพแวดล้อมใดก็ตาม
- สร้างโฟลเดอร์ shared-kustomize
mkdir shared-kustomize
- สร้าง
deployment.yamlอย่างง่ายในโฟลเดอร์ที่แชร์
cat <<EOF > shared-kustomize/deployment.yaml
kind: Deployment
apiVersion: apps/v1
metadata:
name: app
spec:
template:
`spec:`
`containers:`
`- name: logging-agent`
`image: logging-agent-image`
EOF
- สร้าง kustomization.yaml ในโฟลเดอร์ที่แชร์
cat <<EOF > shared-kustomize/kustomization.yaml
bases:
- deployment.yaml
EOF
- อ้างอิงโฟลเดอร์ shared-kustomize จากแอปพลิเคชัน
เนื่องจากคุณต้องการให้โฟลเดอร์ shared-kustomize เป็นฐานสำหรับแอปพลิเคชันทั้งหมด คุณจึงต้องอัปเดต chat-app/base/kustomization.yaml เพื่อใช้ shared-kustomize เป็นฐาน จากนั้นแก้ไข deployment.yaml ของตัวเองที่ด้านบน จากนั้นโฟลเดอร์สภาพแวดล้อมจะแพตช์อีกครั้งที่ด้านบน
คัดลอกและเรียกใช้คำสั่งต่อไปนี้ในเทอร์มินัล
cat <<EOF > chat-app/base/kustomization.yaml
bases:
- ../../shared-kustomize
commonLabels:
app: chat-app
patches:
- deployment.yaml
EOF
- เรียกใช้ Kustomize และดูผลลัพธ์ที่ผสานรวมสำหรับ dev
kustomize build chat-app/dev
โปรดทราบว่าเอาต์พุตมีผลลัพธ์ที่ผสานจากฐานแอป สภาพแวดล้อมของแอป และโฟลเดอร์ shared-kustomize โดยคุณจะเห็นค่าจากทั้ง 3 ตำแหน่งในส่วนคอนเทนเนอร์
(เอาต์พุตห้ามคัดลอก)
<pre>
`containers:`
`- env:`
`- name: ENVIRONMENT`
`value: dev`
`name: chat-app`
`- image: image`
`name: app`
`- image: logging-agent-image`
`name: logging-agent`
</pre>