หนังสือ “Kubernetes สำหรับ DevOps”

หนังสือ “Kubernetes สำหรับ DevOps” สวัสดีชาวคาโบร! Kubernetes เป็นหนึ่งในองค์ประกอบสำคัญของระบบนิเวศคลาวด์สมัยใหม่ เทคโนโลยีนี้มอบความน่าเชื่อถือ ความสามารถในการปรับขนาด และความยืดหยุ่นให้กับการจำลองเสมือนของคอนเทนเนอร์ John Arundel และ Justin Domingus พูดคุยเกี่ยวกับระบบนิเวศของ Kubernetes และแนะนำวิธีแก้ปัญหาที่ได้รับการพิสูจน์แล้วสำหรับปัญหาในชีวิตประจำวัน คุณจะสร้างแอปพลิเคชันแบบเนทีฟบนคลาวด์ของคุณเองทีละขั้นตอน และสร้างโครงสร้างพื้นฐานเพื่อรองรับ ตั้งค่าสภาพแวดล้อมการพัฒนา และไปป์ไลน์การปรับใช้อย่างต่อเนื่องซึ่งจะช่วยคุณในขณะที่คุณทำงานกับแอปพลิเคชันถัดไป

• เริ่มต้นใช้งานคอนเทนเนอร์และ 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

เมื่อเปิดที่อยู่ localhost:9999/ คุณควรเห็นสิ่งต่อไปนี้:

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

เพิ่มความคิดเห็น