การปรับขนาดด้วย 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 มาจากความสามารถในการซ้อนทับและแก้ไข Kubernetes YAML พื้นฐานด้วยค่าที่กำหนดเอง ในการดำเนินการแก้ไขนี้ จำเป็นต้องใช้ไฟล์พื้นฐานที่มีคำแนะนำเกี่ยวกับตำแหน่งของไฟล์และสิ่งที่จะลบล้าง Kustomize รวมอยู่ในระบบนิเวศ Kubernetes และดำเนินการผ่านวิธีต่างๆ ได้

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

  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 เวอร์ชันใดเวอร์ชันหนึ่ง

หรือจะดำเนินการกับเครื่องมือที่ผสานรวมภายใน kubectl เองก็ได้ ดังตัวอย่างต่อไปนี้

(ไม่ดำเนินการ - มีให้เพื่อการอ้างอิงเท่านั้น)

kubectl apply -k chat-app/base

4. การลบล้างองค์ประกอบทั่วไป

เมื่อกำหนดค่าพื้นที่ทำงานและตรวจสอบว่าคุกกี้ทำงานแล้ว ก็ถึงเวลาลบล้างค่าพื้นฐานบางส่วน

รูปภาพ เนมสเปซ และป้ายกำกับจะได้รับการปรับแต่งเป็นอย่างมากสำหรับแต่ละแอปพลิเคชันและสภาพแวดล้อม เนื่องจากแท็กเหล่านี้มีการเปลี่ยนแปลงอยู่บ่อยๆ Kustomize ให้คุณประกาศคีย์เหล่านี้ใน kustomize.yaml ได้โดยตรง ทำให้ไม่จำเป็นต้องสร้างแพตช์จำนวนมากสำหรับสถานการณ์ที่พบบ่อยเหล่านี้

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

ในตัวอย่างนี้ คุณจะเพิ่มเนมสเปซ คำนำหน้าชื่อ และเพิ่มป้ายกำกับลงใน 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/ติดตั้งใช้งาน.yaml ที่สร้างไว้ในขั้นตอนก่อนหน้า อย่างไรก็ตาม แพตช์เหล่านี้มีตัวแปรสภาพแวดล้อมที่ไม่ซ้ำกันสําหรับ dev และ prod

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

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

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

bases:

- deployment.yaml

commonLabels:

app: chat-app

EOF

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

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

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

bases:

- ../base

namespace: prod

nameprefix: prod-

commonLabels:

env: prod

patches:

- deployment.yaml

EOF

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

เมื่อสร้างไฟล์ฐานและสภาพแวดล้อมแล้ว คุณสามารถดำเนินการกระบวนการย่อยเพื่อแพตช์ไฟล์พื้นฐานได้

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

kustomize build chat-app/dev

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

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

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

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

  1. สร้างโฟลเดอร์การตรวจสอบที่แชร์

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 เป็นฐาน จากนั้นแพตช์การติดตั้งใช้งาน.yaml ของตัวเองที่ด้านบน จากนั้นโฟลเดอร์สภาพแวดล้อมจะเผยแพร่แพตช์อีกครั้ง

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

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

bases:

- ../../shared-kustomize

commonLabels:

app: chat-app

patches:

- deployment.yaml

EOF

  1. เรียกใช้การทดสอบและดูผลลัพธ์ที่ผสานรวมสำหรับ 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>