บทนำ
ในบทความก่อนหน้าของการปรับใช้แอปพลิเคชันบน AKS ภาค 1 คุณได้ตรวจสอบการปรับใช้ Redis Master ที่สร้างขึ้น คุณเห็นว่า Deployment เกี่ยวข้องกับ ReplicaSet อย่างไร และ ReplicaSet เกี่ยวข้องกับ Pods อย่างไร ในภาค 2 นี้ คุณจะสร้าง Redis Master ใหม่ด้วยการกำหนดค่าที่เฉพาะเจาะจงสำหรับสภาพแวดล้อมซึ่งได้รับผ่าน ConfigMap แต่ก่อนอื่น เรามาสำรวจกันก่อนว่า ConfigMap คืออะไร
ConfigMap คืออะไร?
ConfigMap เป็นออบเจ็กต์ที่ใช้ให้รายละเอียดการกำหนดค่ากับ Pods มันช่วยให้คุณเก็บการตั้งค่าคอนฟิกูเรชันไว้นอกคอนเทนเนอร์จริง จากนั้นคุณสามารถส่งมอบรายละเอียดการกำหนดค่าเหล่านี้ให้แอปพลิเคชันของคุณได้โดยการเชื่อมต่อ ConfigMap กับ Deployment ของคุณ
Redis Master พร้อม ConfigMap
ไม่มีอะไรผิดปกติกับ Deployment ก่อนหน้า ในกรณีการใช้งานจริง จะเป็นเรื่องนادرةที่คุณจะเปิดแอปพลิเคชันโดยไม่มีการตั้งค่าคอนฟิกูเรชันบางอย่าง ในกรณีนี้ เราจะตั้งค่าคอนฟิกูเรชันสำหรับ redis-master โดยใช้ ConfigMap ConfigMap เป็นวิธีที่พกพาได้ในการกำหนดค่าคอนเทนเนอร์โดยไม่ต้องมีอิมเมจเฉพาะสำหรับแต่ละการกำหนดค่า มันมีคู่คีย์-ค่า (key-value pair) สำหรับข้อมูลที่ต้องตั้งค่าบนคอนเทนเนอร์ ConfigMap ใช้สำหรับการกำหนดค่าที่ไม่ใช่ข้อมูลลับ Kubernetes มีออบเจ็กต์แยกต่างหากที่เรียกว่า Secret ซึ่งใช้สำหรับการกำหนดค่าที่มีข้อมูลสำคัญ เช่น รหัสผ่าน
ในตัวอย่างนี้ เราจะสร้าง ConfigMap ใน ConfigMap นี้ เราจะกำหนดค่า redis-config เป็นคีย์ และค่าจะเป็นดังนี้:
maxmemory: "2mb"
maxmemory-policy: "allkeys-lru"
ตอนนี้ มาสร้าง ConfigMap นี้กัน มี 2 วิธีในการสร้าง ConfigMap:
- สร้าง ConfigMap จากไฟล์
- สร้าง ConfigMap จากไฟล์ YAML
เราจะสำรวจแต่ละวิธีอย่างละเอียด
การสร้าง ConfigMap จากไฟล์
ขั้นตอนต่อไปนี้จะช่วยให้เราสร้าง ConfigMap จากไฟล์ได้:
ขั้นตอนที่ 1. เปิดตัวแก้ไขโค้ด Azure Cloud Shell โดยพิมพ์ code redis-config ในเทอร์มินัล คัดลอกและวาง 2 บรรทัดต่อไปนี้และบันทึกเป็น redis-config
maxmemory: "2mb"
maxmemory-policy: "allkeys-lru"
ขั้นตอนที่ 2. ตอนนี้คุณสามารถสร้าง ConfigMap โดยใช้คำสั่งต่อไปนี้:
kubectl create configmap example-redis-config --from-file=redis-config
คุณควรได้ผลลัพธ์ดังนี้:
configmap/example-redis-config created
ขั้นตอนที่ 3. คุณสามารถใช้คำสั่งเดียวกันเพื่ออธิบาย ConfigMap นี้ได้
kubectl describe configmap/example-redis-config
การสร้าง ConfigMap จากไฟล์ YAML
ในส่วนนี้ คุณจะสร้าง ConfigMap ใหม่จากส่วนก่อนหน้าโดยใช้ไฟล์ YAML
ขั้นตอนที่ 1. เริ่มต้นด้วยการลบ ConfigMap ที่สร้างไว้ก่อนหน้านี้
kubectl delete configmap/example-redis-config
ขั้นตอนที่ 2. คัดลอกและวางบรรทัดต่อไปนี้ลงในไฟล์ชื่อ example-redis-config.yaml แล้วบันทึกไฟล์
apiVersion: v1
data:
redis-config: |-
maxmemory 2mb
maxmemory-policy allkeys-lru
kind: ConfigMap
metadata:
name: example-redis-config
namespace: default
ขั้นตอนที่ 3. ตอนนี้คุณสามารถสร้าง ConfigMap ใหม่ได้ผ่านคำสั่งต่อไปนี้:
kubectl create -f example-redis-config.yaml
คุณควรได้ผลลัพธ์ดังนี้:
configmap/example-redis-config created
ขั้นตอนที่ 4. คำสั่งนี้จะส่งคืนผลลัพธ์เดียวกับครั้งก่อน
ตามที่คุณเห็น การใช้ไฟล์ YAML คุณสามารถสร้าง ConfigMap เดียวกันได้
หมายเหตุ. kubectl get มีตัวเลือกที่มีประโยชน์คือ -o ซึ่งสามารถใช้เพื่อรับเอาต์พุตของออบเจ็กต์ในรูปแบบ YAML หรือ JSON นี่เป็นประโยชน์มากในกรณีที่คุณทำการเปลี่ยนแปลงด้วยตนเองระบบและต้องการดูออบเจ็กต์ที่เป็นผลลัพธ์ในรูปแบบ YAML คุณสามารถรับ ConfigMap ปัจจุบันในรูปแบบ YAML โดยใช้คำสั่งต่อไปนี้:
kubectl get -o yaml configmap/example-redis-config
ตอนนี้ที่คุณมี ConfigMap ที่กำหนดไว้แล้ว มาใช้มันกัน
การใช้ ConfigMap เพื่ออ่านข้อมูลการกำหนดค่า
ในส่วนนี้ คุณจะกำหนดค่า Redis Master Deployment ใหม่เพื่ออ่านการกำหนดค่าจาก ConfigMap
ขั้นตอนที่ 1. เริ่มต้นด้วยการแก้ไข redis-master-deployment.yaml เพื่อใช้ ConfigMap ดังนี้ การเปลี่ยนแปลงที่คุณต้องทำจะได้รับการอธิบายหลังจากโค้ดต้นฉบับ
หมายเหตุ. หากคุณดาวน์โหลดโค้ดต้นฉบับจาก GitHub จะมีไฟล์ในโฟลเดอร์ deployment: Application deployment on AKS ชื่อ redis-master-deployment_Modified.yaml ซึ่งมีการเปลี่ยนแปลงที่จำเป็นแล้ว
apiVersion: apps/v1 # สำหรับเวอร์ชันก่อน 1.9.0 ใช้ apps/v1beta2
kind: Deployment
metadata:
name: redis-master
labels:
app: redis
spec:
selector:
matchLabels:
app: redis
role: master
tier: backend
replicas: 1
template:
metadata:
labels:
app: redis
role: master
tier: backend
spec:
containers:
- name: master
image: k8s.gcr.io/redis:e2e
command:
- redis-server
- "/redis-master/redis.conf"
env:
- name: MASTER
value: "true"
volumeMounts:
- mountPath: /redis-master
name: config
resources:
requests:
cpu: 100m
memory: 100Mi
ports:
- containerPort: 6379
volumes:
- name: config
configMap:
name: example-redis-config
items:
- key: redis-config
path: redis.conf
มาสำรวจโค้ดให้ลึกขึ้นเพื่อเข้าใจส่วนต่างๆ
บรรทัดที่ 24-26
บรรทัดเหล่านี้แนะนำคำสั่งที่จะถูกดำเนินการเมื่อ Pod เริ่มต้น ในกรณีนี้ จะเริ่ม redis-server โดยชี้ไปที่ไฟล์กำหนดค่าเฉพาะ
command:
- redis-server
- "/redis-master/redis.conf"
บรรทัดที่ 27-29
แสดงวิธีส่งข้อมูลการกำหนดค่าไปยังคอนเทนเนอร์ที่กำลังทำงาน วิธีนี้ใช้ตัวแปรสภาพแวดล้อม ในรูปแบบ Docker จะเทียบเท่ากับ docker run -e "MASTER=true" --name master -p 6379:6379 -m 100M -c 100m -d Kubernetes /redis:v1 ตั้งค่าตัวแปรสภาพแวดล้อม MASTER เป็น true แอปพลิเคชันของคุณสามารถอ่านการตั้งค่าตัวแปรสภาพแวดล้อมเพื่อการกำหนดค่าได้
env:
- name: MASTER
value: "true"
บรรทัดที่ 30-32
บรรทัดเหล่านี้แม้ตะแกรงโวล्यूमที่เรียกว่า config (โวล्यุมนี้ถูกกำหนดในบรรทัดที่ 39-45) บนเส้นทาง /redis-master บนคอนเทนเนอร์ที่กำลังทำงาน มันจะซ่อนสิ่งที่มีอยู่บน /redis-master บนคอนเทนเนอร์เดิม ในแง่ของ Docker จะเทียบเท่ากับ docker run -v config:/redis-master -e "MASTER=TRUE" --name master -p 6379:6379 -m 100M -c 100m -d Kubernetes /redis:v1
volumeMounts:
- mountPath: /redis-master
name: config
บรรทัดที่ 40
ตั้งชื่อโวลยูมว่า config ชื่อนี้จะถูกใช้ภายในบริบทของ Pod นี้
name: config
บรรทัดที่ 41-42
ประกาศว่าโวลยูมนี้ควรโหลดจาก ConfigMap example-redis-config ConfigMap นี้ควรมีอยู่ในระบบแล้ว คุณได้กำหนดไว้แล้ว จึงพร้อมใช้งาน
configMap:
name: example-redis-config
บรรทัดที่ 43-45
ที่นี่ คุณกำลังโหลดค่าของคีย์ redis-config (การตั้งค่า maxmemory 2 บรรทัด) เป็นไฟล์ redis.conf
items:
- key: redis-config
path: redis.conf
ขั้นตอนที่ 2. มาสร้าง Deployment ที่อัปเดตแล้วกัน
kubectl create -f redis-master-deployment_Modified.yml
ควรแสดงผลดังนี้:
deployment.apps/redis-master created
ขั้นตอนที่ 3. ตอนนี้มาตรวจสอบว่าการกำหนดค่าถูกนำไปใช้สำเร็จหรือไม่ ก่อนอื่น ให้หาชื่อ Pod
kubectl get pods
ขั้นตอนที่ 4. จากนั้น exec เข้าไปใน Pod และตรวจสอบว่าการตั้งค่าถูกนำไปใช้แล้ว
kubectl exec -it redis-master-<pod-id> redis-cli
127.0.0.1:6379> CONFIG GET maxmemory
1) "maxmemory"
2) "2097152"
127.0.0.1:6379> CONFIG GET maxmemory-policy
"maxmemory-policy"
"allkeys-lru"
127.0.0.1:6379> exit
สรุปคือ คุณเพิ่งดำเนินการส่วนที่สำคัญและท้าทายของการกำหนดค่าแอปพลิเคชัน Cloud-native คุณจะสังเกตเห็นว่าแอปต้องถูกกำหนดค่าเพื่ออ่านคอนฟิกแบบไดนามิก หลังจากตั้งค่าแอปของคุณด้วยการกำหนดค่า คุณเข้าถึงคอนเทนเนอร์ที่กำลังทำงานเพื่อตรวจสอบการกำหนดค่าที่กำลังทำงานอยู่
ในภาค 2 นี้ คุณได้กำหนดค่า Redis Master ให้โหลดข้อมูลการกำหนดค่าจาก ConfigMap ในภาคสุดท้ายภาค 3 เราจะปรับใช้แอปพลิเคชันแบบ end-to-end