การปรับขนาดด้วย Kustomize

1. วัตถุประสงค์

Kustomize เป็นเครื่องมือที่นำเสนอวิธีปรับแต่งการกำหนดค่าแอปพลิเคชันโดยไม่ต้องใช้เทมเพลต ซึ่งช่วยให้การใช้แอปพลิเคชันสำเร็จรูปง่ายขึ้น โดยมีให้ใช้งานเป็นยูทิลิตีแบบสแตนด์อโลนและสร้างขึ้นใน kubectl ผ่าน kubectl apply -k หรือจะใช้เป็น CLI แบบสแตนด์อโลนก็ได้ ดูรายละเอียดเพิ่มเติมได้ที่ kustomize.io

ในบทแนะนำนี้ คุณจะได้เรียนรู้แนวคิดหลักบางอย่างของ Kustomize และใช้เพื่อจัดการรูปแบบต่างๆ ในแอปพลิเคชันและสภาพแวดล้อม

คุณจะได้รับสิ่งต่อไปนี้

  • ใช้ไคลเอ็นต์บรรทัดคำสั่ง kustomize
  • ลบล้างองค์ประกอบทั่วไป
  • แก้ไขโครงสร้าง YAML ขนาดใหญ่
  • ใช้เลเยอร์การวางซ้อนหลายชั้น

2. การเตรียมพื้นที่ทำงาน

  1. เปิดโปรแกรมแก้ไข Cloud Shell โดยไปที่ URL ต่อไปนี้

https://ide.cloud.google.com

  1. ในหน้าต่างเทอร์มินัล ให้สร้างไดเรกทอรีการทำงานสำหรับบทแนะนำนี้

mkdir kustomize-lab

  1. เปลี่ยนเป็นไดเรกทอรีและตั้งค่าพื้นที่ทํางานของ IDE

cd kustomize-lab && cloudshell workspace .

3. การใช้ไคลเอ็นต์บรรทัดคำสั่ง Kustomize

ความสามารถของ Kustomize มาจากการซ้อนทับและแก้ไข YAML ของ Kubernetes พื้นฐานด้วยค่าที่กำหนดเอง หากต้องการดำเนินการนี้ kustomize ต้องมีไฟล์ฐานที่มีวิธีการระบุตำแหน่งของไฟล์และสิ่งที่ต้องแทนที่ Kustomize รวมอยู่ในระบบนิเวศของ Kubernetes และเรียกใช้ได้หลายวิธี

ในส่วนนี้ คุณจะได้สร้างการกำหนดค่า kustomize พื้นฐานและประมวลผลไฟล์ด้วยไคลเอ็นต์บรรทัดคำสั่ง kustomize แบบสแตนด์อโลน

  1. โดยคุณจะสร้างโฟลเดอร์เพื่อเก็บไฟล์การกำหนดค่าพื้นฐานก่อน

mkdir -p chat-app/base

  1. สร้าง 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

  1. สร้างฐาน kustomization.yaml

Kustomize จะมองหาไฟล์ที่ชื่อ kustomization.yaml เป็นจุดแรกเข้า ไฟล์นี้มีการอ้างอิงถึงไฟล์ฐานและไฟล์แทนที่ต่างๆ รวมถึงค่าแทนที่ที่เฉพาะเจาะจง

สร้างkustomization.yamlไฟล์ที่อ้างอิงdeployment.yamlเป็นทรัพยากรฐาน

cat <<EOF > chat-app/base/kustomization.yaml

bases:

- deployment.yaml

EOF

  1. เรียกใช้คำสั่ง 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

  1. อัปเดตkustomization.yamlเพื่อรวมป้ายกำกับและเนมสเปซทั่วไป

คัดลอกและเรียกใช้คำสั่งต่อไปนี้ในเทอร์มินัล

cat <<EOF > chat-app/base/kustomization.yaml

bases:

- deployment.yaml

namespace: my-namespace

nameprefix: my-

commonLabels:

app: my-app

EOF

  1. เรียกใช้คำสั่งบิลด์

การเรียกใช้บิลด์ในตอนนี้แสดงให้เห็นว่าไฟล์ 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 ยังมีความสามารถในการใช้แพตช์ที่ซ้อนทับทรัพยากรพื้นฐาน เทคนิคนี้มักใช้เพื่อสร้างความแตกต่างระหว่างแอปพลิเคชันและสภาพแวดล้อม

ในขั้นตอนนี้ คุณจะสร้างรูปแบบสภาพแวดล้อมสำหรับแอปพลิเคชันเดียวที่ใช้ทรัพยากรฐานเดียวกัน

  1. เริ่มด้วยการสร้างโฟลเดอร์สำหรับสภาพแวดล้อมต่างๆ

mkdir -p chat-app/dev

mkdir -p chat-app/prod

  1. เขียนแพตช์ของสภาพแวดล้อมด้วยคำสั่งต่อไปนี้

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

  1. ตอนนี้ให้เขียนแพตช์ 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

  1. ใช้ไฟล์ YAML ของ Kustomize สำหรับไดเรกทอรีฐาน

เขียนไฟล์ kustomization.yaml พื้นฐานใหม่ นำเนมสเปซและคำนำหน้าชื่อออก เนื่องจากนี่เป็นเพียงการกำหนดค่าพื้นฐานที่ไม่มีการเปลี่ยนแปลง ระบบจะย้ายฟิลด์เหล่านั้นไปยังไฟล์สภาพแวดล้อมในอีกสักครู่

cat <<EOF > chat-app/base/kustomization.yaml

bases:

- deployment.yaml

commonLabels:

app: chat-app

EOF

  1. ใช้ไฟล์ 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 ควรซ้อนทับไฟล์เหล่านั้นบนทรัพยากรพื้นฐาน

  1. ใช้ไฟล์ YAML ของ Kustomize สำหรับไดเรกทอรี prod

cat <<EOF > chat-app/prod/kustomization.yaml

bases:

- ../base

namespace: prod

nameprefix: prod-

commonLabels:

env: prod

patches:

- deployment.yaml

EOF

  1. เรียกใช้ Kustomize เพื่อผสานไฟล์

เมื่อสร้างไฟล์ฐานและไฟล์สภาพแวดล้อมแล้ว คุณจะเรียกใช้กระบวนการ Kustomize เพื่อแก้ไขไฟล์ฐานได้

เรียกใช้คำสั่งต่อไปนี้สำหรับ dev เพื่อดูผลลัพธ์ที่ผสานรวม

kustomize build chat-app/dev

โปรดทราบว่าเอาต์พุตมีผลการค้นหาที่ผสาน เช่น ป้ายกำกับจากการกำหนดค่าฐานและการกำหนดค่าสำหรับนักพัฒนาซอฟต์แวร์ รวมถึงชื่ออิมเมจคอนเทนเนอร์จากฐานและตัวแปรสภาพแวดล้อมจากโฟลเดอร์สำหรับนักพัฒนาซอฟต์แวร์

6. การใช้เลเยอร์การวางซ้อนหลายชั้น

องค์กรจำนวนมากมีทีมที่ช่วยสนับสนุนทีมแอปและจัดการแพลตฟอร์ม บ่อยครั้งที่ทีมเหล่านี้ต้องการรวมรายละเอียดที่เฉพาะเจาะจงซึ่งต้องรวมไว้ในแอปทั้งหมดในทุกสภาพแวดล้อม เช่น ตัวแทนการบันทึก

ในตัวอย่างนี้ คุณจะสร้างshared-kustomizeโฟลเดอร์และทรัพยากรซึ่งจะรวมอยู่ในแอปพลิเคชันทั้งหมดและไม่ว่าแอปพลิเคชันจะได้รับการติดตั้งใช้งานในสภาพแวดล้อมใดก็ตาม

  1. สร้างโฟลเดอร์ shared-kustomize

mkdir shared-kustomize

  1. สร้าง 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

  1. สร้าง kustomization.yaml ในโฟลเดอร์ที่แชร์

cat <<EOF > shared-kustomize/kustomization.yaml

bases:

- deployment.yaml

EOF

  1. อ้างอิงโฟลเดอร์ 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

  1. เรียกใช้ 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>