• เริ่มต้นใช้งานคอนเทนเนอร์และ Kubernetes จากพื้นฐาน: ไม่จำเป็นต้องมีประสบการณ์พิเศษในการเรียนรู้หัวข้อนี้ • เรียกใช้คลัสเตอร์ของคุณเองหรือเลือกบริการ Kubernetes ที่มีการจัดการจาก Amazon, Google ฯลฯ • ใช้ Kubernetes เพื่อจัดการวงจรการใช้งานคอนเทนเนอร์และการใช้ทรัพยากร • เพิ่มประสิทธิภาพคลัสเตอร์โดยพิจารณาจากต้นทุน ประสิทธิภาพ ความยืดหยุ่น พลังงาน และความสามารถในการปรับขนาด • เรียนรู้เครื่องมือที่ดีที่สุดในการพัฒนา ทดสอบ และปรับใช้แอปพลิเคชันของคุณ • ใช้ประโยชน์จากแนวทางปฏิบัติของอุตสาหกรรมในปัจจุบันเพื่อให้มั่นใจในความปลอดภัยและการควบคุม • นำหลักการ DevOps ไปใช้ทั่วทั้งบริษัทของคุณ เพื่อให้ทีมพัฒนาสามารถดำเนินการได้อย่างยืดหยุ่น รวดเร็ว และมีประสิทธิภาพมากขึ้น
หนังสือเล่มนี้เหมาะกับใคร?
หนังสือเล่มนี้มีความเกี่ยวข้องมากที่สุดสำหรับพนักงานแผนกธุรการที่รับผิดชอบเซิร์ฟเวอร์ แอปพลิเคชัน และบริการ ตลอดจนนักพัฒนาที่เกี่ยวข้องกับการสร้างบริการคลาวด์ใหม่หรือการย้ายแอปพลิเคชันที่มีอยู่ไปยัง Kubernetes และระบบคลาวด์ ไม่ต้องกังวล คุณไม่จำเป็นต้องรู้วิธีทำงานกับ Kubernetes หรือคอนเทนเนอร์ เราจะสอนทุกอย่างให้คุณ
ผู้ใช้ Kubernetes ที่มีประสบการณ์จะค้นพบคุณค่ามากมาย โดยครอบคลุมหัวข้อต่างๆ อย่างเจาะลึก เช่น RBAC การปรับใช้อย่างต่อเนื่อง การจัดการข้อมูลที่ละเอียดอ่อน และความสามารถในการสังเกต เราหวังว่าหน้าหนังสือจะมีสิ่งที่น่าสนใจสำหรับคุณอย่างแน่นอน ไม่ว่าคุณจะมีทักษะและประสบการณ์ของคุณอย่างไรก็ตาม
หนังสือตอบคำถามอะไรบ้าง?
ในขณะที่วางแผนและเขียนหนังสือ เราได้หารือเกี่ยวกับเทคโนโลยีคลาวด์และ Kubernetes กับผู้คนหลายร้อยคน โดยพูดคุยกับผู้นำในอุตสาหกรรมและผู้เชี่ยวชาญตลอดจนมือใหม่ที่มีความรู้ความเข้าใจ ด้านล่างนี้คือคำถามที่เลือกไว้ซึ่งพวกเขาต้องการเห็นคำตอบในเอกสารเผยแพร่นี้
- “ฉันสนใจว่าทำไมคุณจึงควรใช้เวลากับเทคโนโลยีนี้ มันจะช่วยฉันและทีมแก้ปัญหาอะไรได้บ้าง”
- “Kubernetes ดูน่าสนใจ แต่มีอุปสรรคในการเข้าค่อนข้างสูง การเตรียมตัวอย่างง่ายๆ นั้นไม่ใช่เรื่องยาก แต่การดูแลระบบและการดีบักเพิ่มเติมนั้นเป็นเรื่องที่น่ากังวล เราต้องการคำแนะนำที่เชื่อถือได้เกี่ยวกับวิธีที่ผู้คนจัดการคลัสเตอร์ Kubernetes ในโลกแห่งความเป็นจริง และปัญหาใดบ้างที่เราน่าจะพบ"
- “คำแนะนำแบบอัตนัยจะเป็นประโยชน์ ระบบนิเวศของ Kubernetes ทำให้ทีมใหม่มีตัวเลือกมากมายให้เลือก เมื่อมีหลายวิธีในการทำสิ่งเดียวกัน คุณจะรู้ได้อย่างไรว่าวิธีใดดีที่สุด? จะต้องเลือกอย่างไร?
และบางทีคำถามที่สำคัญที่สุดของทั้งหมด:
- “ฉันจะใช้ Kubernetes โดยไม่รบกวนบริษัทของฉันได้อย่างไร”
ข้อความที่ตัดตอนมา การกำหนดค่าและวัตถุลับ
ความสามารถในการแยกตรรกะของแอปพลิเคชัน Kubernetes ออกจากการกำหนดค่า (นั่นคือจากค่าหรือการตั้งค่าใด ๆ ที่อาจเปลี่ยนแปลงเมื่อเวลาผ่านไป) มีประโยชน์มาก โดยทั่วไปค่าการกำหนดค่าจะรวมถึงการตั้งค่าเฉพาะสภาพแวดล้อม ที่อยู่ DNS ของบริการบุคคลที่สาม และข้อมูลรับรองการตรวจสอบ
แน่นอนว่าทั้งหมดนี้สามารถใส่ลงในโค้ดได้โดยตรง แต่แนวทางนี้ไม่ยืดหยุ่นเพียงพอ ตัวอย่างเช่น การเปลี่ยนค่าการกำหนดค่าจะทำให้คุณต้องสร้างและปรับใช้โค้ดของคุณอีกครั้ง วิธีแก้ปัญหาที่ดีกว่ามากคือแยกการกำหนดค่าออกจากโค้ดและอ่านจากไฟล์หรือตัวแปรสภาพแวดล้อม
Kubernetes มีวิธีต่างๆ มากมายในการจัดการการกำหนดค่า ขั้นแรก คุณสามารถส่งค่าไปยังแอปพลิเคชันผ่านตัวแปรสภาพแวดล้อมที่ระบุในข้อกำหนดของ pod wrapper ได้ (ดู “ตัวแปรสภาพแวดล้อม” ในหน้า 192) ประการที่สอง ข้อมูลการกำหนดค่าสามารถจัดเก็บไว้ใน Kubernetes ได้โดยตรงโดยใช้อ็อบเจ็กต์ ConfigMap และ Secret
ในบทนี้ เราจะสำรวจออบเจ็กต์เหล่านี้โดยละเอียด และดูแนวทางปฏิบัติบางประการในการจัดการการกำหนดค่าและข้อมูลที่ละเอียดอ่อนโดยใช้แอปพลิเคชันสาธิต
กำลังอัปเดตพ็อดเชลล์เมื่อการกำหนดค่าเปลี่ยนแปลง
ลองนึกภาพคุณมีการปรับใช้ในคลัสเตอร์ของคุณและต้องการเปลี่ยนแปลงค่าบางค่าใน ConfigMap หากคุณใช้แผนภูมิ Helm (ดู “Helm: Package Manager สำหรับ Kubernetes” ในหน้า 102) คุณสามารถตรวจจับการเปลี่ยนแปลงการกำหนดค่าได้โดยอัตโนมัติและโหลด pod Shell ของคุณใหม่ด้วยเคล็ดลับง่ายๆ เพียงครั้งเดียว เพิ่มคำอธิบายประกอบต่อไปนี้ในข้อกำหนดการใช้งานของคุณ:
checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") .
| sha256sum }}
ขณะนี้เทมเพลตการปรับใช้ประกอบด้วยการตรวจสอบพารามิเตอร์การกำหนดค่า หากพารามิเตอร์มีการเปลี่ยนแปลง ผลรวมจะได้รับการอัปเดต หากคุณเรียกใช้การอัปเกรด helm Helm จะตรวจพบว่าข้อกำหนดการใช้งานมีการเปลี่ยนแปลง และจะรีสตาร์ทพ็อดเชลล์ทั้งหมด
ข้อมูลที่ละเอียดอ่อนใน Kubernetes
เรารู้อยู่แล้วว่าออบเจ็กต์ ConfigMap มอบกลไกที่ยืดหยุ่นสำหรับการจัดเก็บและการเข้าถึงข้อมูลการกำหนดค่าในคลัสเตอร์ อย่างไรก็ตาม แอปพลิเคชันส่วนใหญ่มีข้อมูลที่ละเอียดอ่อนและละเอียดอ่อน เช่น รหัสผ่านหรือคีย์ API นอกจากนี้ยังสามารถจัดเก็บไว้ใน ConfigMap ได้ แต่โซลูชันนี้ไม่เหมาะ
Kubernetes เสนอออบเจ็กต์ประเภทพิเศษที่ออกแบบมาเพื่อจัดเก็บข้อมูลที่ละเอียดอ่อนแทน: ความลับ ต่อไป มาดูตัวอย่างวิธีการใช้ออบเจ็กต์นี้ในแอปพลิเคชันสาธิตของเรา
ในการเริ่มต้น โปรดดูที่รายการ Kubernetes สำหรับอ็อบเจ็กต์ Secret (ดู hello-secret-env/k8s/secret.yaml):
apiVersion: v1
kind: Secret
metadata:
name: demo-secret
stringData:
magicWord: xyzzy
ในตัวอย่างนี้ คีย์ส่วนตัว magicWord คือ xyzzy (en.wikipedia.org/wiki/Xyzzy_(computing)) โดยทั่วไปคำว่า xyzzy มีประโยชน์มากในโลกของคอมพิวเตอร์ เช่นเดียวกับ ConfigMap คุณสามารถจัดเก็บคีย์และค่าต่างๆ ไว้ในออบเจ็กต์ Secret ได้ เพื่อความง่าย เราใช้คู่คีย์-ค่าเพียงคู่เดียวเท่านั้น
การใช้วัตถุลับเป็นตัวแปรสภาพแวดล้อม
เช่นเดียวกับ ConfigMap ออบเจ็กต์ Secret สามารถทำให้พร้อมใช้งานในคอนเทนเนอร์เป็นตัวแปรสภาพแวดล้อมหรือเป็นไฟล์บนดิสก์ได้ ในตัวอย่างต่อไปนี้ เราจะกำหนดตัวแปรสภาพแวดล้อมให้กับค่าจาก Secret:
spec:
containers:
- name: demo
image: cloudnatived/demo:hello-secret-env
ports:
- containerPort: 8888
env:
- name: GREETING
valueFrom:
secretKeyRef:
name: demo-secret
key: magicWord
รันคำสั่งต่อไปนี้ในพื้นที่เก็บข้อมูลสาธิตเพื่อใช้รายการ:
kubectl apply -f hello-secret-env/k8s/
deployment.extensions "demo" configured
secret "demo-secret" created
เช่นเคย ให้ส่งต่อพอร์ตในเครื่องไปยังการปรับใช้เพื่อดูผลลัพธ์ในเบราว์เซอร์ของคุณ:
kubectl port-forward deploy/demo 9999:8888
Forwarding from 127.0.0.1:9999 -> 8888
Forwarding from [::1]:9999 -> 8888
เมื่อเปิดที่อยู่
The magic word is "xyzzy"
การเขียนวัตถุลับลงในไฟล์
ในตัวอย่างนี้ เราจะแนบอ็อบเจ็กต์ Secret เข้ากับคอนเทนเนอร์เป็นไฟล์ รหัสอยู่ในโฟลเดอร์ hello-secret-file ของพื้นที่เก็บข้อมูลสาธิต
ในการเชื่อมต่อ Secret เป็นไฟล์ เราจะใช้การปรับใช้ต่อไปนี้:
spec:
containers:
- name: demo
image: cloudnatived/demo:hello-secret-file
ports:
- containerPort: 8888
volumeMounts:
- name: demo-secret-volume
mountPath: "/secrets/"
readOnly: true
volumes:
- name: demo-secret-volume
secret:
secretName: demo-secret
ดังในส่วนย่อย “การสร้างไฟล์การกำหนดค่าจากออบเจ็กต์ ConfigMap” บนหน้า 240 เราสร้างโวลุ่ม (ในกรณีนี้คือ demo-secret-volume) และต่อเข้ากับคอนเทนเนอร์ในส่วน VolumeMounts ของข้อกำหนด ช่อง mountPath คือ /secrets ดังนั้น Kubernetes จะสร้างไฟล์ XNUMX ไฟล์ในโฟลเดอร์นี้สำหรับคู่คีย์/ค่าแต่ละคู่ที่กำหนดไว้ในออบเจ็กต์ Secret
ในตัวอย่างของเรา เราได้กำหนดคู่คีย์-ค่าเพียงคู่เดียวที่เรียกว่า magicWord ดังนั้นรายการจะสร้างไฟล์ /secrets/magicWord แบบอ่านอย่างเดียวไฟล์เดียวพร้อมข้อมูลที่ละเอียดอ่อนในคอนเทนเนอร์
หากคุณใช้รายการนี้ในลักษณะเดียวกับตัวอย่างก่อนหน้านี้ คุณควรได้รับผลลัพธ์เดียวกัน:
The magic word is "xyzzy"
การอ่านวัตถุลับ
ในส่วนก่อนหน้านี้ เราใช้คำสั่ง kubectl อธิบายเพื่อแสดงเนื้อหาของ ConfigMap เช่นเดียวกับ Secret สามารถทำได้หรือไม่?
kubectl describe secret/demo-secret
Name: demo-secret
Namespace: default
Labels: <none>
Annotations:
Type: Opaque
Data
====
magicWord: 5 bytes
โปรดทราบว่าข้อมูลจะไม่แสดง ออบเจ็กต์ลับใน Kubernetes เป็นประเภท Opaque ซึ่งหมายความว่าเนื้อหาจะไม่แสดงใน kubectl อธิบายเอาต์พุต รายการบันทึก หรือเทอร์มินัล ทำให้ไม่สามารถเปิดเผยข้อมูลที่ละเอียดอ่อนโดยไม่ตั้งใจได้
หากต้องการดูข้อมูลที่ละเอียดอ่อนในเวอร์ชัน YAML ที่เข้ารหัส ให้ใช้คำสั่ง kubectl get:
kubectl get secret/demo-secret -o yaml
apiVersion: v1
data:
magicWord: eHl6enk=
kind: Secret
metadata:
...
type: Opaque
base64
eHl6enk= คืออะไร แตกต่างอย่างสิ้นเชิงจากค่าเดิมของเรา? นี่เป็นวัตถุลับจริงๆ ซึ่งแสดงในการเข้ารหัส base64 Base64 เป็นรูปแบบสำหรับการเข้ารหัสข้อมูลไบนารี่ตามอำเภอใจเป็นสตริงอักขระ
เนื่องจากข้อมูลที่ละเอียดอ่อนอาจเป็นไบนารี่และไม่ได้ส่งออก (เช่นในกรณีของคีย์เข้ารหัส TLS) ออบเจ็กต์ที่เป็นความลับจึงถูกจัดเก็บในรูปแบบ base64 เสมอ
ข้อความ beHl6enk= เป็นเวอร์ชันเข้ารหัส base64 ของคำลับของเรา xyzzy คุณสามารถตรวจสอบได้ด้วยการรันคำสั่ง base64 —decode ในเทอร์มินัล:
echo "eHl6enk=" | base64 --decode
xyzzy
ดังนั้น แม้ว่า Kubernetes จะปกป้องคุณจากการส่งออกข้อมูลที่ละเอียดอ่อนโดยไม่ตั้งใจในเทอร์มินัลหรือไฟล์บันทึก หากคุณมีสิทธิ์อ่านบนออบเจ็กต์ลับในเนมสเปซเฉพาะ ข้อมูลนั้นสามารถเป็น base64 และถอดรหัสในภายหลังได้
หากคุณต้องการเข้ารหัสข้อความ base64 (เช่น เพื่อเก็บไว้เป็นความลับ) ให้ใช้คำสั่ง base64 โดยไม่มีอาร์กิวเมนต์:
echo xyzzy | base64
eHl6enkK
การเข้าถึงวัตถุลับ
ใครสามารถอ่านและแก้ไขวัตถุลับได้บ้าง สิ่งนี้ถูกกำหนดโดย RBAC ซึ่งเป็นกลไกการควบคุมการเข้าถึง (เราจะหารือโดยละเอียดในส่วนย่อย “บทนำเกี่ยวกับการควบคุมการเข้าถึงตามบทบาท” ในหน้า 258) หากคุณใช้งานคลัสเตอร์ที่ไม่มี RBAC หรือไม่ได้เปิดใช้งาน ออบเจ็กต์ Secret ทั้งหมดจะพร้อมใช้งานสำหรับผู้ใช้และคอนเทนเนอร์ใดๆ (เราจะอธิบายในภายหลังว่าคุณไม่ควรมีคลัสเตอร์ที่ใช้งานจริงโดยไม่มี RBAC)
การเข้ารหัสข้อมูลแบบพาสซีฟ
แล้วผู้ที่สามารถเข้าถึงฐานข้อมูล etcd ที่ Kubernetes เก็บข้อมูลทั้งหมดล่ะ? พวกเขาสามารถอ่านข้อมูลที่ละเอียดอ่อนโดยไม่ต้องได้รับอนุญาตให้อ่านวัตถุลับผ่าน API ได้หรือไม่
ตั้งแต่เวอร์ชัน 1.7 เป็นต้นมา Kubernetes รองรับการเข้ารหัสข้อมูลแบบพาสซีฟ ซึ่งหมายความว่าข้อมูลที่ละเอียดอ่อนภายใน ฯลฯ จะถูกจัดเก็บไว้ในดิสก์และไม่สามารถอ่านได้แม้แต่ผู้ที่เข้าถึงฐานข้อมูลโดยตรง หากต้องการถอดรหัส คุณต้องมีคีย์ที่มีเฉพาะเซิร์ฟเวอร์ Kubernetes API เท่านั้น ในคลัสเตอร์ที่กำหนดค่าอย่างถูกต้อง ควรเปิดใช้งานการเข้ารหัสแบบพาสซีฟ
คุณสามารถตรวจสอบว่าการเข้ารหัสแบบพาสซีฟทำงานในคลัสเตอร์ของคุณด้วยวิธีนี้หรือไม่:
kubectl describe pod -n kube-system -l component=kube-apiserver |grep encryption
--experimental-encryption-provider-config=...
หากคุณไม่เห็นการตั้งค่าสถานะ Experimental-encryption-provider-config แสดงว่าไม่ได้เปิดใช้การเข้ารหัสแบบพาสซีฟ เมื่อใช้ Google Kubernetes Engine หรือบริการการจัดการ Kubernetes อื่นๆ ข้อมูลของคุณจะถูกเข้ารหัสโดยใช้กลไกอื่น ดังนั้นแฟล็กจะไม่ปรากฏ ตรวจสอบกับผู้จำหน่าย Kubernetes เพื่อดูว่าเนื้อหา ฯลฯ ได้รับการเข้ารหัสหรือไม่
การจัดเก็บข้อมูลที่เป็นความลับ
มีทรัพยากร Kubernetes บางส่วนที่ไม่ควรลบออกจากคลัสเตอร์ เช่น ออบเจ็กต์ข้อมูลลับที่มีความละเอียดอ่อนสูง คุณสามารถปกป้องทรัพยากรไม่ให้ถูกลบได้โดยใช้คำอธิบายประกอบที่ผู้จัดการ Helm ให้มา:
kind: Secret
metadata:
annotations:
"helm.sh/resource-policy": keep
กลยุทธ์การจัดการวัตถุลับ
ในตัวอย่างจากส่วนก่อนหน้า ข้อมูลที่ละเอียดอ่อนได้รับการปกป้องจากการเข้าถึงโดยไม่ได้รับอนุญาตทันทีหลังจากถูกจัดเก็บไว้ในคลัสเตอร์ แต่ในไฟล์ Manifest พวกเขาจะถูกจัดเก็บเป็นข้อความธรรมดา
คุณไม่ควรวางข้อมูลที่เป็นความลับในไฟล์ที่อยู่ในการควบคุมเวอร์ชัน คุณจะจัดการและจัดเก็บข้อมูลนี้อย่างปลอดภัยก่อนที่จะนำไปใช้กับคลัสเตอร์ Kubernetes ได้อย่างไร
คุณสามารถเลือกเครื่องมือหรือกลยุทธ์ในการจัดการข้อมูลที่ละเอียดอ่อนในแอปพลิเคชันของคุณได้ แต่คุณยังคงต้องตอบคำถามต่อไปนี้เป็นอย่างน้อย
- ข้อมูลที่ละเอียดอ่อนควรเก็บไว้ที่ไหนเพื่อให้สามารถเข้าถึงได้สูง?
- จะทำให้แอปพลิเคชันที่ใช้งานอยู่ของคุณสามารถเข้าถึงข้อมูลที่ละเอียดอ่อนได้อย่างไร
- จะเกิดอะไรขึ้นกับแอปพลิเคชันของคุณเมื่อคุณแทนที่หรือแก้ไขข้อมูลที่ละเอียดอ่อน
เกี่ยวกับผู้แต่ง
จอห์น อรันเดล เป็นที่ปรึกษาที่มีประสบการณ์ 30 ปีในอุตสาหกรรมคอมพิวเตอร์ เขาเขียนหนังสือหลายเล่มและทำงานร่วมกับบริษัทหลายแห่งจากประเทศต่างๆ โดยให้คำแนะนำเกี่ยวกับโครงสร้างพื้นฐานบนคลาวด์และ Kubernetes ในเวลาว่าง เขาสนุกกับการเล่นเซิร์ฟ เป็นนักยิงปืนที่เก่ง และเล่นเปียโนในฐานะมือสมัครเล่น อาศัยอยู่ในกระท่อมในเทพนิยายในเมืองคอร์นวอลล์ ประเทศอังกฤษ
จัสติน โดมิงกัส — วิศวกรบริหารระบบที่ทำงานในสภาพแวดล้อม DevOps ด้วย Kubernetes และเทคโนโลยีคลาวด์ เขาชอบใช้เวลานอกบ้าน ดื่มกาแฟ ปู และนั่งหน้าคอมพิวเตอร์ อาศัยอยู่ในซีแอตเทิล รัฐวอชิงตัน กับแมวแสนวิเศษตัวหนึ่ง และภรรยาและเพื่อนสนิทที่แสนวิเศษอีกคนหนึ่งคือเอเดรียน
» ดูรายละเอียดหนังสือเพิ่มเติมได้ที่
»
»
สำหรับ Khabrozhiteley ส่วนลด 25% โดยใช้คูปอง - Kubernetes
เมื่อชำระเงินค่าหนังสือในรูปแบบกระดาษ หนังสืออิเล็กทรอนิกส์จะถูกส่งทางอีเมล
ที่มา: will.com