บันทึก. แปล: เนื่องจากการกำหนดค่า YAML สำหรับสภาพแวดล้อม K8s มีเพิ่มมากขึ้น ความจำเป็นในการตรวจสอบอัตโนมัติจึงมีความจำเป็นเร่งด่วนมากขึ้นเรื่อยๆ ผู้เขียนการทบทวนนี้ไม่เพียงแต่เลือกโซลูชันที่มีอยู่สำหรับงานนี้ แต่ยังใช้ Deployment เป็นตัวอย่างเพื่อดูว่าโซลูชันทำงานอย่างไร กลายเป็นข้อมูลที่เป็นประโยชน์มากสำหรับผู้ที่สนใจหัวข้อนี้
TL; DR: บทความนี้จะเปรียบเทียบเครื่องมือแบบคงที่ XNUMX รายการเพื่อตรวจสอบและประเมินไฟล์ Kubernetes YAML ตามแนวทางปฏิบัติที่ดีที่สุดและข้อกำหนด
โดยทั่วไปปริมาณงาน Kubernetes จะได้รับการกำหนดในรูปแบบของเอกสาร YAML ปัญหาประการหนึ่งของ YAML คือความยากในการระบุข้อจำกัดหรือความสัมพันธ์ระหว่างไฟล์ Manifest
จะเกิดอะไรขึ้นหากเราต้องการให้แน่ใจว่าอิมเมจทั้งหมดที่ปรับใช้กับคลัสเตอร์มาจากรีจีสทรีที่เชื่อถือได้
ฉันจะป้องกันการปรับใช้ที่ไม่มี PodDisruptionBudgets ไม่ให้ถูกส่งไปยังคลัสเตอร์ได้อย่างไร
การบูรณาการการทดสอบแบบคงที่ทำให้คุณสามารถระบุข้อผิดพลาดและการละเมิดนโยบายได้ในขั้นตอนการพัฒนา สิ่งนี้จะเพิ่มการรับประกันว่าคำจำกัดความของทรัพยากรนั้นถูกต้องและปลอดภัย และทำให้มีแนวโน้มมากขึ้นที่ปริมาณงานการผลิตจะเป็นไปตามแนวทางปฏิบัติที่ดีที่สุด
ระบบนิเวศการตรวจสอบไฟล์ YAML แบบคงที่ของ Kubernetes สามารถแบ่งออกเป็นหมวดหมู่ต่อไปนี้:
- เครื่องมือตรวจสอบ API. เครื่องมือในหมวดหมู่นี้จะตรวจสอบไฟล์ Manifest ของ YAML กับข้อกำหนดของเซิร์ฟเวอร์ Kubernetes API
- ผู้ทดสอบพร้อมแล้ว. เครื่องมือจากหมวดหมู่นี้มาพร้อมกับการทดสอบความปลอดภัย การปฏิบัติตามแนวทางปฏิบัติที่ดีที่สุด ฯลฯ
- เครื่องมือตรวจสอบแบบกำหนดเอง. ตัวแทนของหมวดหมู่นี้อนุญาตให้คุณสร้างการทดสอบแบบกำหนดเองในภาษาต่างๆ เช่น Rego และ Javascript
ในบทความนี้เราจะอธิบายและเปรียบเทียบเครื่องมือที่แตกต่างกันหกรายการ:
- คูเบวัล;
- kube-คะแนน;
- config-ผ้าสำลี;
- ทองแดง;
- คอนเฟิร์ม;
- ดาวเหนือ
เอาล่ะ มาเริ่มกันเลย!
การตรวจสอบการปรับใช้
ก่อนที่เราจะเริ่มเปรียบเทียบเครื่องมือ เรามาสร้างพื้นหลังเพื่อทดสอบเครื่องมือกันก่อน
ประกาศด้านล่างนี้ประกอบด้วยข้อผิดพลาดและการไม่ปฏิบัติตามแนวทางปฏิบัติที่ดีที่สุดจำนวนหนึ่ง คุณจะพบข้อผิดพลาดเหล่านี้ได้กี่ข้อ
apiVersion: apps/v1
kind: Deployment
metadata:
name: http-echo
spec:
replicas: 2
selector:
matchLabels:
app: http-echo
template:
metadata:
labels:
app: http-echo
spec:
containers:
- name: http-echo
image: hashicorp/http-echo
args: ["-text", "hello-world"]
ports:
- containerPort: 5678
---
apiVersion: v1
kind: Service
metadata:
name: http-echo
spec:
ports:
- port: 5678
protocol: TCP
targetPort: 5678
selector:
app: http-echo
(base-valid.yaml
)
เราจะใช้ YAML นี้เพื่อเปรียบเทียบเครื่องมือต่างๆ
แถลงการณ์ข้างต้น
base-valid.yaml
และประกาศอื่น ๆ จากบทความนี้สามารถพบได้ในที่เก็บ Git .
รายการนี้จะอธิบายเว็บแอปพลิเคชันที่มีหน้าที่หลักในการตอบกลับด้วยข้อความ “Hello World” ไปยังพอร์ต 5678 ซึ่งสามารถใช้งานได้ด้วยคำสั่งต่อไปนี้:
kubectl apply -f hello-world.yaml
ดังนั้น - ตรวจสอบงาน:
kubectl port-forward svc/http-echo 8080:5678
ตอนนี้ไปที่
1. คูเบวัล
ตรงส่วนฐาน
ในขณะที่เขียนบทความต้นฉบับ เวอร์ชัน 0.15.0 ก็พร้อมใช้งาน
เมื่อติดตั้งแล้ว ให้ป้อนรายการด้านบนนี้:
$ kubeval base-valid.yaml
PASS - base-valid.yaml contains a valid Deployment (http-echo)
PASS - base-valid.yaml contains a valid Service (http-echo)
หากสำเร็จ kubeval จะออกด้วยรหัสทางออก 0 คุณสามารถตรวจสอบได้ดังนี้:
$ echo $?
0
ตอนนี้เรามาลองใช้ kubeval ด้วย manifest อื่น:
apiVersion: apps/v1
kind: Deployment
metadata:
name: http-echo
spec:
replicas: 2
template:
metadata:
labels:
app: http-echo
spec:
containers:
- name: http-echo
image: hashicorp/http-echo
args: ["-text", "hello-world"]
ports:
- containerPort: 5678
---
apiVersion: v1
kind: Service
metadata:
name: http-echo
spec:
ports:
- port: 5678
protocol: TCP
targetPort: 5678
selector:
app: http-echo
(kubeval-invalid.yaml
)
คุณสามารถมองเห็นปัญหาด้วยสายตาได้หรือไม่? มาเปิดตัวกัน:
$ kubeval kubeval-invalid.yaml
WARN - kubeval-invalid.yaml contains an invalid Deployment (http-echo) - selector: selector is required
PASS - kubeval-invalid.yaml contains a valid Service (http-echo)
# проверим код возврата
$ echo $?
1
ทรัพยากรไม่ได้รับการตรวจสอบ
การปรับใช้โดยใช้เวอร์ชัน API apps/v1
ต้องมีตัวเลือกที่ตรงกับป้ายกำกับของพ็อด ไฟล์ Manifest ด้านบนไม่รวมตัวเลือก ดังนั้น kubeval จึงรายงานข้อผิดพลาดและออกด้วยรหัสที่ไม่ใช่ศูนย์
ฉันสงสัยว่าจะเกิดอะไรขึ้นถ้าฉันทำ kubectl apply -f
ด้วยแถลงการณ์นี้?
เรามาลองกัน:
$ kubectl apply -f kubeval-invalid.yaml
error: error validating "kubeval-invalid.yaml": error validating data: ValidationError(Deployment.spec):
missing required field "selector" in io.k8s.api.apps.v1.DeploymentSpec; if you choose to ignore these errors,
turn validation off with --validate=false
นี่เป็นข้อผิดพลาดที่ kubeval เตือนอย่างแน่นอน คุณสามารถแก้ไขได้โดยการเพิ่มตัวเลือก:
apiVersion: apps/v1
kind: Deployment
metadata:
name: http-echo
spec:
replicas: 2
selector: # !!!
matchLabels: # !!!
app: http-echo # !!!
template:
metadata:
labels:
app: http-echo
spec:
containers:
- name: http-echo
image: hashicorp/http-echo
args: ["-text", "hello-world"]
ports:
- containerPort: 5678
---
apiVersion: v1
kind: Service
metadata:
name: http-echo
spec:
ports:
- port: 5678
protocol: TCP
targetPort: 5678
selector:
app: http-echo
(base-valid.yaml
)
ข้อดีของเครื่องมืออย่าง kubeval ก็คือข้อผิดพลาดเช่นนี้สามารถตรวจพบได้ตั้งแต่เนิ่นๆ ในรอบการปรับใช้
นอกจากนี้ การตรวจสอบเหล่านี้ไม่จำเป็นต้องเข้าถึงคลัสเตอร์ แต่สามารถดำเนินการแบบออฟไลน์ได้
ตามค่าเริ่มต้น kubeval จะตรวจสอบทรัพยากรกับสคีมา Kubernetes API ล่าสุด อย่างไรก็ตาม ในกรณีส่วนใหญ่ คุณอาจต้องตรวจสอบกับรุ่น Kubernetes รุ่นใดรุ่นหนึ่ง ซึ่งสามารถทำได้โดยใช้ธง --kubernetes-version
:
$ kubeval --kubernetes-version 1.16.1 base-valid.yaml
โปรดทราบว่าจะต้องระบุเวอร์ชันในรูปแบบ Major.Minor.Patch
.
สำหรับรายการเวอร์ชันที่รองรับการตรวจสอบ โปรดดูที่ --schema-location
.
นอกจากไฟล์ YAML แต่ละไฟล์แล้ว kubeval ยังสามารถทำงานกับไดเร็กทอรีและ stdin ได้อีกด้วย
นอกจากนี้ Kubeval ยังรวมเข้ากับไปป์ไลน์ CI ได้อย่างง่ายดาย ผู้ที่ต้องการเรียกใช้การทดสอบก่อนที่จะส่งรายการไปยังคลัสเตอร์จะต้องทราบว่า kubeval รองรับรูปแบบเอาต์พุตสามรูปแบบ:
- ข้อความธรรมดา;
- เจสัน;
- ทดสอบโปรโตคอลอะไรก็ได้ (TAP)
และสามารถใช้รูปแบบใดก็ได้ในการแยกวิเคราะห์ผลลัพธ์เพิ่มเติมเพื่อสร้างการสรุปผลลัพธ์ประเภทที่ต้องการ
ข้อเสียประการหนึ่งของ kubeval คือขณะนี้ไม่สามารถตรวจสอบการปฏิบัติตามข้อกำหนดทรัพยากรที่กำหนดเอง (CRD) ได้ อย่างไรก็ตาม คุณสามารถกำหนดค่า kubeval ได้
Kubeval เป็นเครื่องมือที่ยอดเยี่ยมสำหรับการตรวจสอบและประเมินทรัพยากร อย่างไรก็ตาม ควรเน้นย้ำว่าการผ่านการทดสอบไม่ได้รับประกันว่าทรัพยากรจะเป็นไปตามแนวทางปฏิบัติที่ดีที่สุด
เช่น การใช้แท็ก latest
ในคอนเทนเนอร์ไม่ปฏิบัติตามแนวทางปฏิบัติที่ดีที่สุด อย่างไรก็ตาม kubeval ไม่ถือว่านี่เป็นข้อผิดพลาดและไม่ได้รายงาน นั่นคือการตรวจสอบ YAML ดังกล่าวจะเสร็จสิ้นโดยไม่มีคำเตือน
แต่ถ้าคุณต้องการประเมิน YAML และระบุการละเมิดเช่นแท็กล่ะ latest
? ฉันจะตรวจสอบไฟล์ YAML กับแนวทางปฏิบัติที่ดีที่สุดได้อย่างไร
2. Kube-คะแนน
- การรันคอนเทนเนอร์ไม่ใช่ในฐานะรูท
- ความพร้อมใช้งานของการตรวจสุขภาพพ็อด
- การตั้งค่าคำขอและขีดจำกัดสำหรับทรัพยากร
จากผลการทดสอบจะได้รับผลลัพธ์สามประการ: OK, คำเตือน и มีวิจารณญาณ.
คุณสามารถลองใช้ Kube-score ออนไลน์หรือติดตั้งในเครื่องได้
ในขณะที่เขียนบทความต้นฉบับ kube-score เวอร์ชันล่าสุดคือ 1.7.0
มาลองใช้ในรายการของเรากันดีกว่า base-valid.yaml
:
$ kube-score score base-valid.yaml
apps/v1/Deployment http-echo
[CRITICAL] Container Image Tag
· http-echo -> Image with latest tag
Using a fixed tag is recommended to avoid accidental upgrades
[CRITICAL] Pod NetworkPolicy
· The pod does not have a matching network policy
Create a NetworkPolicy that targets this pod
[CRITICAL] Pod Probes
· Container is missing a readinessProbe
A readinessProbe should be used to indicate when the service is ready to receive traffic.
Without it, the Pod is risking to receive traffic before it has booted. It is also used during
rollouts, and can prevent downtime if a new version of the application is failing.
More information: https://github.com/zegl/kube-score/blob/master/README_PROBES.md
[CRITICAL] Container Security Context
· http-echo -> Container has no configured security context
Set securityContext to run the container in a more secure context.
[CRITICAL] Container Resources
· http-echo -> CPU limit is not set
Resource limits are recommended to avoid resource DDOS. Set resources.limits.cpu
· http-echo -> Memory limit is not set
Resource limits are recommended to avoid resource DDOS. Set resources.limits.memory
· http-echo -> CPU request is not set
Resource requests are recommended to make sure that the application can start and run without
crashing. Set resources.requests.cpu
· http-echo -> Memory request is not set
Resource requests are recommended to make sure that the application can start and run without crashing.
Set resources.requests.memory
[CRITICAL] Deployment has PodDisruptionBudget
· No matching PodDisruptionBudget was found
It is recommended to define a PodDisruptionBudget to avoid unexpected downtime during Kubernetes
maintenance operations, such as when draining a node.
[WARNING] Deployment has host PodAntiAffinity
· Deployment does not have a host podAntiAffinity set
It is recommended to set a podAntiAffinity that stops multiple pods from a deployment from
being scheduled on the same node. This increases availability in case the node becomes unavailable.
YAML ผ่านการทดสอบ kubeval ในขณะที่คะแนน kube ชี้ไปที่ข้อบกพร่องต่อไปนี้:
- ไม่ได้กำหนดค่าการตรวจสอบความพร้อม
- ไม่มีการร้องขอหรือข้อจำกัดสำหรับทรัพยากร CPU และหน่วยความจำ
- ไม่ได้ระบุงบประมาณการหยุดชะงักของพ็อด
- ไม่มีกฎเกณฑ์ในการแยกจากกัน (ต่อต้านความสัมพันธ์) เพื่อเพิ่มความพร้อมให้สูงสุด
- คอนเทนเนอร์ทำงานเป็นรูท
สิ่งเหล่านี้ล้วนเป็นจุดที่ถูกต้องเกี่ยวกับข้อบกพร่องที่ต้องแก้ไขเพื่อทำให้การปรับใช้มีประสิทธิภาพและเชื่อถือได้มากขึ้น
ทีม kube-score
แสดงข้อมูลในรูปแบบที่มนุษย์สามารถอ่านได้ รวมถึงการละเมิดทุกประเภท คำเตือน и มีวิจารณญาณซึ่งช่วยได้มากในระหว่างการพัฒนา
ผู้ที่ต้องการใช้เครื่องมือนี้ภายในไปป์ไลน์ CI สามารถเปิดใช้งานเอาต์พุตที่ถูกบีบอัดได้มากขึ้นโดยใช้แฟล็ก --output-format ci
(ในกรณีนี้ การทดสอบพร้อมผลลัพธ์จะปรากฏขึ้นด้วย OK):
$ kube-score score base-valid.yaml --output-format ci
[OK] http-echo apps/v1/Deployment
[OK] http-echo apps/v1/Deployment
[CRITICAL] http-echo apps/v1/Deployment: (http-echo) CPU limit is not set
[CRITICAL] http-echo apps/v1/Deployment: (http-echo) Memory limit is not set
[CRITICAL] http-echo apps/v1/Deployment: (http-echo) CPU request is not set
[CRITICAL] http-echo apps/v1/Deployment: (http-echo) Memory request is not set
[CRITICAL] http-echo apps/v1/Deployment: (http-echo) Image with latest tag
[OK] http-echo apps/v1/Deployment
[CRITICAL] http-echo apps/v1/Deployment: The pod does not have a matching network policy
[CRITICAL] http-echo apps/v1/Deployment: Container is missing a readinessProbe
[CRITICAL] http-echo apps/v1/Deployment: (http-echo) Container has no configured security context
[CRITICAL] http-echo apps/v1/Deployment: No matching PodDisruptionBudget was found
[WARNING] http-echo apps/v1/Deployment: Deployment does not have a host podAntiAffinity set
[OK] http-echo v1/Service
[OK] http-echo v1/Service
[OK] http-echo v1/Service
[OK] http-echo v1/Service
เช่นเดียวกับ kubeval kube-score จะส่งคืนโค้ดทางออกที่ไม่เป็นศูนย์เมื่อมีการทดสอบที่ล้มเหลว มีวิจารณญาณ. คุณยังสามารถเปิดใช้งานการประมวลผลที่คล้ายกันได้ คำเตือน.
นอกจากนี้ยังสามารถตรวจสอบทรัพยากรว่าสอดคล้องกับเวอร์ชัน API ต่างๆ ได้หรือไม่ (เช่นใน kubeval) อย่างไรก็ตาม ข้อมูลนี้ได้รับการฮาร์ดโค้ดไว้ในคะแนน kube เอง: คุณไม่สามารถเลือก Kubernetes เวอร์ชันอื่นได้ ข้อจำกัดนี้อาจเป็นปัญหาใหญ่ได้หากคุณต้องการอัปเกรดคลัสเตอร์ของคุณ หรือหากคุณมีหลายคลัสเตอร์ที่มี K8 เวอร์ชันต่างกัน
โปรดทราบว่า
มีปัญหาอยู่แล้ว โดยมีข้อเสนอให้ตระหนักถึงโอกาสนี้
ข้อมูลเพิ่มเติมเกี่ยวกับ kube-score สามารถดูได้ที่
การทดสอบคะแนน Kube เป็นเครื่องมือที่ยอดเยี่ยมสำหรับการนำแนวทางปฏิบัติที่ดีที่สุดไปใช้ แต่ถ้าคุณจำเป็นต้องเปลี่ยนแปลงการทดสอบหรือเพิ่มกฎของคุณเองล่ะ อนิจจาสิ่งนี้ไม่สามารถทำได้
คะแนน Kube ไม่สามารถขยายได้: คุณไม่สามารถเพิ่มนโยบายหรือปรับเปลี่ยนนโยบายได้
หากคุณต้องการเขียนการทดสอบแบบกำหนดเองเพื่อตรวจสอบการปฏิบัติตามนโยบายของบริษัท คุณสามารถใช้หนึ่งในสี่เครื่องมือต่อไปนี้: config-lint, copper, conftest หรือ polaris
3.กำหนดค่า-ผ้าสำลี
Config-lint เป็นเครื่องมือสำหรับตรวจสอบความถูกต้องของไฟล์การกำหนดค่า YAML, JSON, Terraform, CSV และไฟล์ Manifest ของ Kubernetes
คุณสามารถติดตั้งโดยใช้
รุ่นปัจจุบัน ณ เวลาที่เขียนบทความต้นฉบับคือ 1.5.0
Config-lint ไม่มีการทดสอบในตัวสำหรับการตรวจสอบความถูกต้องของไฟล์ Manifest ของ Kubernetes
หากต้องการดำเนินการทดสอบ คุณต้องสร้างกฎที่เหมาะสม เขียนเป็นไฟล์ YAML ที่เรียกว่า "ชุดกฎ" (กฎ)และมีโครงสร้างดังนี้
version: 1
description: Rules for Kubernetes spec files
type: Kubernetes
files:
- "*.yaml"
rules:
# список правил
(rule.yaml
)
มาศึกษาให้ละเอียดยิ่งขึ้น:
- สนาม
type
ระบุประเภทของการกำหนดค่า config-lint ที่จะใช้ สำหรับรายการ K8s นี่คือ เสมอKubernetes
. - ใน
files
นอกจากตัวไฟล์แล้ว คุณยังสามารถระบุไดเร็กทอรีได้ด้วย - สนาม
rules
มีไว้สำหรับการตั้งค่าการทดสอบผู้ใช้
สมมติว่าคุณต้องการให้แน่ใจว่าอิมเมจในการปรับใช้จะถูกดาวน์โหลดจากพื้นที่เก็บข้อมูลที่เชื่อถือได้เช่นเสมอ my-company.com/myapp:1.0
. กฎ config-lint ที่ดำเนินการตรวจสอบดังกล่าวจะมีลักษณะดังนี้:
- id: MY_DEPLOYMENT_IMAGE_TAG
severity: FAILURE
message: Deployment must use a valid image tag
resource: Deployment
assertions:
- every:
key: spec.template.spec.containers
expressions:
- key: image
op: starts-with
value: "my-company.com/"
(rule-trusted-repo.yaml
)
แต่ละกฎจะต้องมีคุณลักษณะดังต่อไปนี้:
id
— ตัวระบุเฉพาะของกฎseverity
- อาจจะ ความล้มเหลว, คำเตือน и ไม่เป็นไปตามข้อกำหนด;message
— หากมีการละเมิดกฎ เนื้อหาของบรรทัดนี้จะปรากฏขึ้นresource
— ประเภทของทรัพยากรที่กฎนี้ใช้assertions
— รายการเงื่อนไขที่จะได้รับการประเมินที่เกี่ยวข้องกับทรัพยากรนี้
ในกฎเกณฑ์ข้างต้น assertion
ที่เรียกว่า every
key: spec.templates.spec.containers
) ใช้รูปภาพที่เชื่อถือได้ (เช่น เริ่มต้นด้วย my-company.com/
).
ชุดกฎที่สมบูรณ์มีลักษณะดังนี้:
version: 1
description: Rules for Kubernetes spec files
type: Kubernetes
files:
- "*.yaml"
rules:
- id: DEPLOYMENT_IMAGE_REPOSITORY # !!!
severity: FAILURE
message: Deployment must use a valid image repository
resource: Deployment
assertions:
- every:
key: spec.template.spec.containers
expressions:
- key: image
op: starts-with
value: "my-company.com/"
(ruleset.yaml
)
หากต้องการลองทดสอบ ให้บันทึกเป็น check_image_repo.yaml
. มาทำการตรวจสอบไฟล์กันดีกว่า base-valid.yaml
:
$ config-lint -rules check_image_repo.yaml base-valid.yaml
[
{
"AssertionMessage": "Every expression fails: And expression fails: image does not start with my-company.com/",
"Category": "",
"CreatedAt": "2020-06-04T01:29:25Z",
"Filename": "test-data/base-valid.yaml",
"LineNumber": 0,
"ResourceID": "http-echo",
"ResourceType": "Deployment",
"RuleID": "DEPLOYMENT_IMAGE_REPOSITORY",
"RuleMessage": "Deployment must use a valid image repository",
"Status": "FAILURE"
}
]
การตรวจสอบล้มเหลว ตอนนี้เรามาดูรายการต่อไปนี้พร้อมกับที่เก็บรูปภาพที่ถูกต้อง:
apiVersion: apps/v1
kind: Deployment
metadata:
name: http-echo
spec:
replicas: 2
selector:
matchLabels:
app: http-echo
template:
metadata:
labels:
app: http-echo
spec:
containers:
- name: http-echo
image: my-company.com/http-echo:1.0 # !!!
args: ["-text", "hello-world"]
ports:
- containerPort: 5678
(image-valid-mycompany.yaml
)
เราทำการทดสอบเดียวกันกับรายการข้างต้น ไม่พบปัญหา:
$ config-lint -rules check_image_repo.yaml image-valid-mycompany.yaml
[]
Config-lint เป็นเฟรมเวิร์กที่น่าหวังที่ช่วยให้คุณสร้างการทดสอบของคุณเองเพื่อตรวจสอบความถูกต้องของรายการ Kubernetes YAML โดยใช้ YAML DSL
แต่ถ้าคุณต้องการตรรกะและการทดสอบที่ซับซ้อนกว่านี้ล่ะ? YAML ไม่ได้จำกัดเกินไปสำหรับเรื่องนี้ใช่ไหม จะเป็นอย่างไรหากคุณสามารถสร้างการทดสอบในภาษาโปรแกรมเต็มรูปแบบได้
4. ทองแดง
อย่างไรก็ตาม มันแตกต่างจากอย่างหลังตรงที่ไม่ใช้ YAML เพื่ออธิบายการทดสอบ การทดสอบสามารถเขียนเป็น JavaScript แทนได้ Copper มีไลบรารีพร้อมเครื่องมือพื้นฐานหลายอย่างซึ่งช่วยให้คุณอ่านข้อมูลเกี่ยวกับออบเจ็กต์ Kubernetes และรายงานข้อผิดพลาด
ขั้นตอนการติดตั้ง Copper สามารถดูได้ที่
2.0.1 เป็นยูทิลิตี้รุ่นล่าสุด ณ เวลาที่เขียนบทความต้นฉบับ
เช่นเดียวกับ config-lint Copper ไม่มีการทดสอบในตัว มาเขียนกัน ปล่อยให้ตรวจสอบว่าการปรับใช้ใช้คอนเทนเนอร์อิมเมจจากแหล่งเก็บข้อมูลที่เชื่อถือได้เช่น my-company.com
.
สร้างไฟล์ check_image_repo.js
โดยมีเนื้อหาดังนี้
$$.forEach(function($){
if ($.kind === 'Deployment') {
$.spec.template.spec.containers.forEach(function(container) {
var image = new DockerImage(container.image);
if (image.registry.lastIndexOf('my-company.com/') != 0) {
errors.add_error('no_company_repo',"Image " + $.metadata.name + " is not from my-company.com repo", 1)
}
});
}
});
ตอนนี้เพื่อทดสอบรายการของเรา base-valid.yaml
ให้ใช้คำสั่ง copper validate
:
$ copper validate --in=base-valid.yaml --validator=check_image_tag.js
Check no_company_repo failed with severity 1 due to Image http-echo is not from my-company.com repo
Validation failed
เป็นที่ชัดเจนว่าด้วยความช่วยเหลือของ Copper คุณสามารถทำการทดสอบที่ซับซ้อนมากขึ้นได้ ตัวอย่างเช่น การตรวจสอบชื่อโดเมนในรายการ Ingress หรือการปฏิเสธพ็อดที่ทำงานในโหมดสิทธิพิเศษ
Copper มีฟังก์ชั่นอรรถประโยชน์มากมายในตัว:
DockerImage
อ่านไฟล์อินพุตที่ระบุและสร้างวัตถุที่มีคุณสมบัติดังต่อไปนี้:name
- ชื่อของภาพtag
- แท็กรูปภาพregistry
- รีจิสทรีรูปภาพregistry_url
- มาตรการ (https://
) และรีจิสตรีรูปภาพfqin
- ตำแหน่งเต็มของภาพ
- ฟังก์ชัน
findByName
ช่วยในการค้นหาทรัพยากรตามประเภทที่กำหนด (kind
) และชื่อ (name
) จากไฟล์อินพุต - ฟังก์ชัน
findByLabels
ช่วยในการค้นหาทรัพยากรตามประเภทที่ระบุ (kind
) และป้ายกำกับ (labels
).
คุณสามารถดูฟังก์ชันบริการที่มีอยู่ทั้งหมดได้
ตามค่าเริ่มต้น มันจะโหลดไฟล์ YAML อินพุตทั้งหมดลงในตัวแปร $$
และทำให้มันพร้อมใช้งานสำหรับการเขียนสคริปต์ (เทคนิคที่คุ้นเคยสำหรับผู้ที่มีประสบการณ์ jQuery)
ข้อได้เปรียบหลักของ Copper นั้นชัดเจน: คุณไม่จำเป็นต้องเชี่ยวชาญภาษาพิเศษ และคุณสามารถใช้ฟีเจอร์ JavaScript ต่างๆ เพื่อสร้างการทดสอบของคุณเองได้ เช่น การแก้ไขสตริง ฟังก์ชัน ฯลฯ
ควรสังเกตว่า Copper เวอร์ชันปัจจุบันใช้งานได้กับเอ็นจิ้น JavaScript เวอร์ชัน ES5 ไม่ใช่ ES6
รายละเอียดดูได้ที่
อย่างไรก็ตาม หากคุณไม่ชอบ JavaScript มากนัก และชอบภาษาที่ออกแบบมาเพื่อการสร้างข้อความค้นหาและอธิบายนโยบายโดยเฉพาะ คุณควรให้ความสนใจกับ Conftest
5.งานประกวด
Conftest เป็นเฟรมเวิร์กสำหรับทดสอบข้อมูลการกำหนดค่า ยังเหมาะสำหรับการทดสอบ/ตรวจสอบไฟล์ Manifest ของ Kubernetes ด้วย การทดสอบอธิบายโดยใช้ภาษาคิวรีเฉพาะ
คุณสามารถติดตั้ง conftest โดยใช้
ในขณะที่เขียนบทความต้นฉบับ เวอร์ชันล่าสุดคือ 0.18.2
เช่นเดียวกับ config-lint และ copper conftest มาโดยไม่มีการทดสอบในตัว มาลองใช้และเขียนนโยบายของเราเองกัน เช่นเดียวกับในตัวอย่างก่อนหน้านี้ เราจะตรวจสอบว่าอิมเมจคอนเทนเนอร์ถูกนำมาจากแหล่งที่เชื่อถือได้หรือไม่
สร้างไดเร็กทอรี conftest-checks
และในนั้นมีไฟล์ชื่อ check_image_registry.rego
โดยมีเนื้อหาดังนี้
package main
deny[msg] {
input.kind == "Deployment"
image := input.spec.template.spec.containers[_].image
not startswith(image, "my-company.com/")
msg := sprintf("image '%v' doesn't come from my-company.com repository", [image])
}
ตอนนี้เรามาทดสอบกัน base-valid.yaml
ตลอด conftest
:
$ conftest test --policy ./conftest-checks base-valid.yaml
FAIL - base-valid.yaml - image 'hashicorp/http-echo' doesn't come from my-company.com repository
1 tests, 1 passed, 0 warnings, 1 failure
การทดสอบล้มเหลวอย่างคาดการณ์ได้เนื่องจากรูปภาพมาจากแหล่งที่ไม่น่าเชื่อถือ
ในไฟล์ Rego เรากำหนดบล็อก deny
. ความจริงถือเป็นการละเมิด ถ้าบล็อก deny
หลายครั้ง ตรวจสอบโดย conftest โดยแยกจากกัน และความจริงของการบล็อกใด ๆ ถือเป็นการละเมิด
นอกเหนือจากเอาต์พุตเริ่มต้นแล้ว Conftest ยังรองรับรูปแบบ JSON, TAP และตาราง ซึ่งเป็นคุณสมบัติที่มีประโยชน์อย่างยิ่งหากคุณต้องการฝังรายงานลงในไปป์ไลน์ CI ที่มีอยู่ คุณสามารถกำหนดรูปแบบที่ต้องการได้โดยใช้แฟล็ก --output
.
เพื่อให้ง่ายต่อการแก้ไขนโยบาย conftest มีการตั้งค่าสถานะ --trace
. โดยจะแสดงผลการติดตามวิธีที่ conftest แยกวิเคราะห์ไฟล์นโยบายที่ระบุ
นโยบายการแข่งขันสามารถเผยแพร่และแชร์ในการลงทะเบียน OCI (Open Container Initiative) ในรูปแบบอาร์ติแฟกต์ได้
Команды push
и pull
อนุญาตให้คุณเผยแพร่สิ่งประดิษฐ์หรือเรียกค้นสิ่งประดิษฐ์ที่มีอยู่จากรีจิสตรีระยะไกล มาลองเผยแพร่นโยบายที่เราสร้างไปยังรีจิสทรี Docker ในเครื่องโดยใช้ conftest push
.
เริ่มรีจิสทรี Docker ในพื้นที่ของคุณ:
$ docker run -it --rm -p 5000:5000 registry
ในเทอร์มินัลอื่น ให้ไปที่ไดเร็กทอรีที่คุณสร้างไว้ก่อนหน้านี้ conftest-checks
และรันคำสั่งต่อไปนี้:
$ conftest push 127.0.0.1:5000/amitsaha/opa-bundle-example:latest
หากคำสั่งสำเร็จ คุณจะเห็นข้อความดังนี้:
2020/06/10 14:25:43 pushed bundle with digest: sha256:e9765f201364c1a8a182ca637bc88201db3417bacc091e7ef8211f6c2fd2609c
ตอนนี้สร้างไดเร็กทอรีชั่วคราวและรันคำสั่งในนั้น conftest pull
. มันจะดาวน์โหลดแพ็คเกจที่สร้างโดยคำสั่งก่อนหน้า:
$ cd $(mktemp -d)
$ conftest pull 127.0.0.1:5000/amitsaha/opa-bundle-example:latest
ไดเร็กทอรีย่อยจะปรากฏในไดเร็กทอรีชั่วคราว policy
ที่มีไฟล์นโยบายของเรา:
$ tree
.
└── policy
└── check_image_registry.rego
การทดสอบสามารถดำเนินการได้โดยตรงจากพื้นที่เก็บข้อมูล:
$ conftest test --update 127.0.0.1:5000/amitsaha/opa-bundle-example:latest base-valid.yaml
..
FAIL - base-valid.yaml - image 'hashicorp/http-echo' doesn't come from my-company.com repository
2 tests, 1 passed, 0 warnings, 1 failure
ขออภัย DockerHub ยังไม่รองรับ ดังนั้นถือว่าตัวเองโชคดีถ้าคุณใช้
รูปแบบสิ่งประดิษฐ์จะเหมือนกับ
คุณสามารถเรียนรู้เพิ่มเติมเกี่ยวกับการแชร์นโยบายและคุณสมบัติอื่น ๆ ของ Conftest ได้ที่
6 นักษัตรเนมี
เครื่องมือสุดท้ายที่จะกล่าวถึงในบทความนี้คือ
Polaris สามารถติดตั้งในคลัสเตอร์หรือใช้ในโหมดบรรทัดคำสั่ง ตามที่คุณอาจเดาได้ ช่วยให้คุณสามารถวิเคราะห์รายการ Kubernetes แบบคงที่ได้
เมื่อทำงานในโหมดบรรทัดคำสั่ง การทดสอบในตัวจะพร้อมใช้งานครอบคลุมด้านต่างๆ เช่น ความปลอดภัยและแนวทางปฏิบัติที่ดีที่สุด (คล้ายกับคะแนน kube) นอกจากนี้ คุณสามารถสร้างการทดสอบของคุณเองได้ (เช่นใน config-lint, copper และ conftest)
กล่าวอีกนัยหนึ่ง Polaris ผสมผสานประโยชน์ของเครื่องมือทั้งสองประเภทเข้าด้วยกัน: ด้วยการทดสอบในตัวและการทดสอบแบบกำหนดเอง
หากต้องการติดตั้ง Polaris ในโหมดบรรทัดคำสั่งให้ใช้
ในขณะที่เขียนบทความต้นฉบับ เวอร์ชัน 1.0.3 จะพร้อมใช้งาน
เมื่อการติดตั้งเสร็จสมบูรณ์ คุณสามารถเรียกใช้ Polaris บนไฟล์ Manifest ได้ base-valid.yaml
ด้วยคำสั่งต่อไปนี้:
$ polaris audit --audit-path base-valid.yaml
โดยจะส่งออกสตริงในรูปแบบ JSON พร้อมคำอธิบายโดยละเอียดของการทดสอบที่ดำเนินการและผลลัพธ์ ผลลัพธ์จะมีโครงสร้างดังต่อไปนี้:
{
"PolarisOutputVersion": "1.0",
"AuditTime": "0001-01-01T00:00:00Z",
"SourceType": "Path",
"SourceName": "test-data/base-valid.yaml",
"DisplayName": "test-data/base-valid.yaml",
"ClusterInfo": {
"Version": "unknown",
"Nodes": 0,
"Pods": 2,
"Namespaces": 0,
"Controllers": 2
},
"Results": [
/* длинный список */
]
}
มีเอาต์พุตเต็มรูปแบบ
เช่นเดียวกับ kube-score Polaris ระบุปัญหาในพื้นที่ที่รายการไม่เป็นไปตามแนวทางปฏิบัติที่ดีที่สุด:
- ไม่มีการตรวจสุขภาพสำหรับพ็อด
- ไม่ได้ระบุแท็กสำหรับอิมเมจคอนเทนเนอร์
- คอนเทนเนอร์ทำงานเป็นรูท
- ไม่ได้ระบุคำขอและขีดจำกัดสำหรับหน่วยความจำและ CPU
การทดสอบแต่ละครั้งได้รับการกำหนดระดับวิกฤต ขึ้นอยู่กับผลลัพธ์: คำเตือน หรือ อันตราย. หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับการทดสอบในตัวที่มีอยู่ โปรดดูที่
หากไม่ต้องการรายละเอียด คุณสามารถระบุแฟล็กได้ --format score
. ในกรณีนี้ Polaris จะส่งออกตัวเลขตั้งแต่ 1 ถึง 100 − คะแนน (เช่น การประเมิน):
$ polaris audit --audit-path test-data/base-valid.yaml --format score
68
ยิ่งคะแนนใกล้ 100 มากเท่าใด ระดับของข้อตกลงก็จะยิ่งสูงขึ้นเท่านั้น หากคุณตรวจสอบรหัสทางออกของคำสั่ง polaris audit
ปรากฎว่ามันเท่ากับ 0
บังคับ polaris audit
คุณสามารถยุติการทำงานด้วยโค้ดที่ไม่ใช่ศูนย์ได้โดยใช้สองแฟล็ก:
- ธง
--set-exit-code-below-score
ใช้เป็นอาร์กิวเมนต์ค่าเกณฑ์ในช่วง 1-100 ในกรณีนี้ คำสั่งจะออกด้วยรหัสทางออก 4 หากคะแนนต่ำกว่าเกณฑ์ สิ่งนี้มีประโยชน์มากเมื่อคุณมีค่าเกณฑ์ที่แน่นอน (เช่น 75) และคุณต้องได้รับการแจ้งเตือนหากคะแนนต่ำกว่า - ธง
--set-exit-code-on-danger
จะทำให้คำสั่งล้มเหลวด้วยรหัส 3 หากการทดสอบอันตรายอย่างใดอย่างหนึ่งล้มเหลว
ตอนนี้เรามาลองสร้างการทดสอบแบบกำหนดเองเพื่อตรวจสอบว่ารูปภาพนั้นนำมาจากพื้นที่เก็บข้อมูลที่เชื่อถือได้หรือไม่ การทดสอบแบบกำหนดเองได้รับการระบุในรูปแบบ YAML และการทดสอบนั้นอธิบายไว้โดยใช้ JSON Schema
ข้อมูลโค้ด YAML ต่อไปนี้อธิบายการทดสอบใหม่ที่เรียกว่า checkImageRepo
:
checkImageRepo:
successMessage: Image registry is valid
failureMessage: Image registry is not valid
category: Images
target: Container
schema:
'$schema': http://json-schema.org/draft-07/schema
type: object
properties:
image:
type: string
pattern: ^my-company.com/.+$
มาดูกันดีกว่า:
successMessage
— บรรทัดนี้จะถูกพิมพ์หากการทดสอบเสร็จสมบูรณ์failureMessage
— ข้อความนี้จะแสดงในกรณีที่เกิดความล้มเหลวcategory
— ระบุหนึ่งในหมวดหมู่:Images
,Health Checks
,Security
,Networking
иResources
;target
--- กำหนดประเภทของวัตถุ (spec
) ทดสอบแล้ว ค่าที่เป็นไปได้:Container
,Pod
หรือController
;- การทดสอบนั้นระบุไว้ในออบเจ็กต์
schema
ใช้สคีมา JSON คำสำคัญในการทดสอบนี้คือpattern
ใช้เพื่อเปรียบเทียบแหล่งที่มาของภาพกับแหล่งที่ต้องการ
หากต้องการรันการทดสอบข้างต้น คุณต้องสร้างการกำหนดค่า Polaris ต่อไปนี้:
checks:
checkImageRepo: danger
customChecks:
checkImageRepo:
successMessage: Image registry is valid
failureMessage: Image registry is not valid
category: Images
target: Container
schema:
'$schema': http://json-schema.org/draft-07/schema
type: object
properties:
image:
type: string
pattern: ^my-company.com/.+$
(polaris-conf.yaml
)
มาแยกวิเคราะห์ไฟล์กัน:
- ใน
checks
มีการกำหนดการทดสอบและระดับวิกฤต เนื่องจากเป็นการดีที่จะได้รับคำเตือนเมื่อรูปภาพถูกนำมาจากแหล่งที่ไม่น่าเชื่อถือ เราจึงกำหนดระดับไว้ที่นี่danger
. - การทดสอบนั้นเอง
checkImageRepo
แล้วลงทะเบียนในวัตถุcustomChecks
.
บันทึกไฟล์เป็น custom_check.yaml
. ตอนนี้คุณสามารถวิ่งได้แล้ว polaris audit
ด้วยไฟล์ Manifest YAML ที่ต้องมีการยืนยัน
มาทดสอบแถลงการณ์ของเรากัน base-valid.yaml
:
$ polaris audit --config custom_check.yaml --audit-path base-valid.yaml
ทีม polaris audit
รันเฉพาะการทดสอบผู้ใช้ที่ระบุข้างต้นและล้มเหลว
หากคุณแก้ไขภาพให้เป็น my-company.com/http-echo:1.0
,โพลาริสจะเสร็จสมบูรณ์ได้สำเร็จ แถลงการณ์ที่มีการเปลี่ยนแปลงมีอยู่แล้ว image-valid-mycompany.yaml
.
ตอนนี้คำถามเกิดขึ้น: จะทำการทดสอบในตัวร่วมกับการทดสอบแบบกำหนดเองได้อย่างไร อย่างง่ายดาย! คุณเพียงแค่ต้องเพิ่มตัวระบุการทดสอบในตัวลงในไฟล์การกำหนดค่า โดยจะมีลักษณะดังนี้:
checks:
cpuRequestsMissing: warning
cpuLimitsMissing: warning
# Other inbuilt checks..
# ..
# custom checks
checkImageRepo: danger # !!!
customChecks:
checkImageRepo: # !!!
successMessage: Image registry is valid
failureMessage: Image registry is not valid
category: Images
target: Container
schema:
'$schema': http://json-schema.org/draft-07/schema
type: object
properties:
image:
type: string
pattern: ^my-company.com/.+$
(config_with_custom_check.yaml
)
มีตัวอย่างของไฟล์การกำหนดค่าที่สมบูรณ์
ตรวจสอบรายการ base-valid.yaml
โดยใช้การทดสอบในตัวและแบบกำหนดเอง คุณสามารถใช้คำสั่ง:
$ polaris audit --config config_with_custom_check.yaml --audit-path base-valid.yaml
Polaris เสริมการทดสอบในตัวด้วยการทดสอบแบบกำหนดเอง จึงเป็นการผสมผสานสิ่งที่ดีที่สุดของทั้งสองโลกเข้าด้วยกัน
ในทางกลับกัน การไม่สามารถใช้ภาษาที่มีประสิทธิภาพมากขึ้น เช่น Rego หรือ JavaScript อาจเป็นปัจจัยจำกัดที่ทำให้ไม่สามารถสร้างการทดสอบที่ซับซ้อนมากขึ้นได้
ข้อมูลเพิ่มเติมเกี่ยวกับโพลาริสสามารถดูได้ที่
สรุป
แม้ว่าจะมีเครื่องมือมากมายสำหรับตรวจสอบและประเมินไฟล์ Kubernetes YAML สิ่งสำคัญคือต้องมีความเข้าใจที่ชัดเจนว่าการทดสอบจะได้รับการออกแบบและดำเนินการอย่างไร.
ตัวอย่างเช่น หากคุณใช้รายการ Kubernetes ผ่านไปป์ไลน์ kubeval อาจเป็นขั้นตอนแรกในไปป์ไลน์ดังกล่าว. มันจะตรวจสอบว่าคำจำกัดความของวัตถุสอดคล้องกับสคีมา Kubernetes API หรือไม่
เมื่อการตรวจสอบดังกล่าวเสร็จสิ้น ก็สามารถดำเนินการทดสอบที่ซับซ้อนมากขึ้นได้ เช่น การปฏิบัติตามแนวทางปฏิบัติที่ดีที่สุดมาตรฐานและนโยบายเฉพาะ นี่คือจุดที่ kube-score และ Polaris จะมีประโยชน์
สำหรับผู้ที่มีข้อกำหนดที่ซับซ้อนและจำเป็นต้องปรับแต่งการทดสอบโดยละเอียด Copper, config-lint และ conftest น่าจะเหมาะสม.
Conftest และ config-lint ใช้ YAML เพื่อกำหนดการทดสอบแบบกำหนดเอง และ copper ช่วยให้คุณเข้าถึงภาษาการเขียนโปรแกรมเต็มรูปแบบ ทำให้เป็นตัวเลือกที่น่าสนใจทีเดียว
ในทางกลับกัน มันคุ้มค่าที่จะใช้หนึ่งในเครื่องมือเหล่านี้หรือไม่ ดังนั้น ควรสร้างการทดสอบทั้งหมดด้วยตนเอง หรือชอบ Polaris และเพิ่มเฉพาะสิ่งที่จำเป็นเท่านั้น ไม่มีคำตอบที่ชัดเจนสำหรับคำถามนี้.
ตารางด้านล่างแสดงคำอธิบายโดยย่อของแต่ละเครื่องมือ:
เครื่องมือ
โชคชะตา
ข้อ จำกัด
การทดสอบผู้ใช้
คูเบวาล
ตรวจสอบความถูกต้องของ YAML กับเวอร์ชันเฉพาะของสคีมา API
ไม่สามารถทำงานร่วมกับ CRD
ไม่
คะแนน kube
วิเคราะห์รายการ YAML เทียบกับแนวทางปฏิบัติที่ดีที่สุด
เลือกเวอร์ชัน Kubernetes API เพื่อตรวจสอบทรัพยากรไม่ได้
ไม่
ทองแดง
เฟรมเวิร์กทั่วไปสำหรับการสร้างการทดสอบ JavaScript แบบกำหนดเองสำหรับรายการ YAML
ไม่มีการทดสอบในตัว เอกสารไม่ดี
มี
config-lint.php
เฟรมเวิร์กทั่วไปสำหรับการสร้างการทดสอบในภาษาเฉพาะโดเมนที่ฝังอยู่ใน YAML รองรับรูปแบบการกำหนดค่าที่หลากหลาย (เช่น Terraform)
ไม่มีการทดสอบสำเร็จรูป การยืนยันและฟังก์ชันในตัวอาจไม่เพียงพอ
มี
คอนเฟิร์มที่สุด
เฟรมเวิร์กสำหรับการสร้างการทดสอบของคุณเองโดยใช้ Rego (ภาษาคิวรีเฉพาะ) อนุญาตให้แชร์นโยบายผ่านชุด OCI
ไม่มีการทดสอบในตัว ฉันต้องเรียนเรโก้ ไม่รองรับ Docker Hub เมื่อเผยแพร่นโยบาย
มี
นักษัตรเนมี
บทวิจารณ์ YAML ขัดต่อแนวทางปฏิบัติที่ดีที่สุดมาตรฐาน ช่วยให้คุณสร้างการทดสอบของคุณเองโดยใช้ JSON Schema
ความสามารถในการทดสอบตาม JSON Schema อาจไม่เพียงพอ
มี
เนื่องจากเครื่องมือเหล่านี้ไม่ต้องอาศัยการเข้าถึงคลัสเตอร์ Kubernetes จึงติดตั้งง่าย ช่วยให้คุณสามารถกรองไฟล์ต้นฉบับและให้ข้อเสนอแนะอย่างรวดเร็วแก่ผู้เขียนคำขอดึงในโครงการ
ปล.จากผู้แปล
อ่านเพิ่มเติมในบล็อกของเรา:
- «
Polaris นำมาใช้เพื่อรักษาคลัสเตอร์ Kubernetes ให้แข็งแรง "; - «
เป็นกลุ่มพร้อมการสนับสนุน YAML สำหรับ Kubernetes "; - «
7 แนวทางปฏิบัติที่ดีที่สุดสำหรับการใช้คอนเทนเนอร์ตาม Google '
ที่มา: will.com