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 มาจากความสามารถในการซ้อนทับและแก้ไข Kubernetes YAML พื้นฐานด้วยค่าที่กำหนดเอง ในการดำเนินการแก้ไขนี้ จำเป็นต้องใช้ไฟล์พื้นฐานที่มีคำแนะนำเกี่ยวกับตำแหน่งของไฟล์และสิ่งที่จะลบล้าง Kustomize รวมอยู่ในระบบนิเวศ Kubernetes และดำเนินการผ่านวิธีต่างๆ ได้
ในส่วนนี้ คุณจะสร้างการกำหนดค่าการกำหนดค่าพื้นฐานและประมวลผลไฟล์ด้วยไคลเอ็นต์บรรทัดคำสั่งแบบสแตนด์อโลน
- ในการเริ่มต้น คุณจะต้องสร้างโฟลเดอร์เพื่อใช้เก็บไฟล์การกำหนดค่าพื้นฐาน
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 เวอร์ชันใดเวอร์ชันหนึ่ง
หรือจะดำเนินการกับเครื่องมือที่ผสานรวมภายใน kubectl เองก็ได้ ดังตัวอย่างต่อไปนี้
(ไม่ดำเนินการ - มีให้เพื่อการอ้างอิงเท่านั้น)
kubectl apply -k chat-app/base
4. การลบล้างองค์ประกอบทั่วไป
เมื่อกำหนดค่าพื้นที่ทำงานและตรวจสอบว่าคุกกี้ทำงานแล้ว ก็ถึงเวลาลบล้างค่าพื้นฐานบางส่วน
รูปภาพ เนมสเปซ และป้ายกำกับจะได้รับการปรับแต่งเป็นอย่างมากสำหรับแต่ละแอปพลิเคชันและสภาพแวดล้อม เนื่องจากแท็กเหล่านี้มีการเปลี่ยนแปลงอยู่บ่อยๆ Kustomize ให้คุณประกาศคีย์เหล่านี้ใน kustomize.yaml
ได้โดยตรง ทำให้ไม่จำเป็นต้องสร้างแพตช์จำนวนมากสำหรับสถานการณ์ที่พบบ่อยเหล่านี้
เทคนิคนี้มักใช้ในการสร้างอินสแตนซ์ที่เจาะจงของเทมเพลต ในตอนนี้ คุณใช้ทรัพยากรฐาน 1 ชุดสำหรับการติดตั้งใช้งานหลายรายการได้แล้ว เพียงแค่เปลี่ยนชื่อและเนมสเปซ
ในตัวอย่างนี้ คุณจะเพิ่มเนมสเปซ คำนำหน้าชื่อ และเพิ่มป้ายกำกับลงใน 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/ติดตั้งใช้งาน.yaml ที่สร้างไว้ในขั้นตอนก่อนหน้า อย่างไรก็ตาม แพตช์เหล่านี้มีตัวแปรสภาพแวดล้อมที่ไม่ซ้ำกันสําหรับ dev และ prod
- ใช้ไฟล์ Kustomize YAML สำหรับไดเรกทอรีฐาน
เขียน kustomization.yaml พื้นฐานใหม่ แล้วนำเนมสเปซและคำนำหน้าชื่อออกเนื่องจากนี่เป็นเพียงการกำหนดค่าพื้นฐานเท่านั้นโดยไม่มีรูปแบบ ระบบจะย้ายช่องเหล่านั้นไปยังไฟล์สภาพแวดล้อมในอีกสักครู่
cat <<EOF > chat-app/base/kustomization.yaml
bases:
- deployment.yaml
commonLabels:
app: chat-app
EOF
- ใช้ไฟล์ Kustomize YAML สำหรับไดเรกทอรี 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 ควรวางซ้อนไฟล์เหล่านั้นที่ด้านบนของทรัพยากรฐาน
- ใช้ไฟล์ Kustomize YAML สำหรับไดเรกทอรี Prod
cat <<EOF > chat-app/prod/kustomization.yaml
bases:
- ../base
namespace: prod
nameprefix: prod-
commonLabels:
env: prod
patches:
- deployment.yaml
EOF
- เรียกใช้ Kustomize เพื่อผสานไฟล์
เมื่อสร้างไฟล์ฐานและสภาพแวดล้อมแล้ว คุณสามารถดำเนินการกระบวนการย่อยเพื่อแพตช์ไฟล์พื้นฐานได้
เรียกใช้คำสั่งต่อไปนี้สำหรับ dev เพื่อดูผลลัพธ์ที่ผสานรวม
kustomize build chat-app/dev
โปรดทราบว่าเอาต์พุตจะมีผลลัพธ์ที่ผสานรวม เช่น ป้ายกำกับจากการกำหนดค่าพื้นฐานและการกำหนดค่านักพัฒนาซอฟต์แวร์ รวมถึงชื่ออิมเมจคอนเทนเนอร์จากตัวแปรฐานและสภาพแวดล้อมจากโฟลเดอร์นักพัฒนาซอฟต์แวร์
6. การใช้การวางซ้อนหลายชั้น
องค์กรจำนวนมากมีทีมที่ช่วยสนับสนุนทีมแอปและจัดการแพลตฟอร์ม บ่อยครั้งที่ทีมเหล่านี้จะต้องใส่รายละเอียดเฉพาะลงในทุกแอปในทุกสภาพแวดล้อม เช่น Logging Agent
ในตัวอย่างนี้ คุณจะสร้างโฟลเดอร์และทรัพยากร 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
เป็นฐาน จากนั้นแพตช์การติดตั้งใช้งาน.yaml ของตัวเองที่ด้านบน จากนั้นโฟลเดอร์สภาพแวดล้อมจะเผยแพร่แพตช์อีกครั้ง
คัดลอกและเรียกใช้คำสั่งต่อไปนี้ในเทอร์มินัลของคุณ
cat <<EOF > chat-app/base/kustomization.yaml
bases:
- ../../shared-kustomize
commonLabels:
app: chat-app
patches:
- deployment.yaml
EOF
- เรียกใช้การทดสอบและดูผลลัพธ์ที่ผสานรวมสำหรับ 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>