การใช้ตัวแปรสภาวะแวดล้อมในข้อมูลจำเพาะการปรับใช้ Kubernetes


18

ขณะนี้ฉันใช้ข้อมูลจำเพาะของ Kubernetes Deployment.yamlสำหรับการปรับใช้บริการ ข้อมูลจำเพาะรวมการอ้างอิงคำต่อคำไปยังที่อยู่ IP เฉพาะ (ทำเครื่องหมาย<static-ip-address>ด้านล่าง):

spec:
  type: LoadBalancer
  loadBalancerIP: <static-ip-address>

ฉันกังวลเกี่ยวกับการผลักดันข้อมูลเช่นรหัสผ่านหรือที่อยู่ IP ไปยังที่เก็บ Git ระยะไกล ฉันสามารถหลีกเลี่ยงสิ่งนี้ได้เช่นโดยการใช้ตัวแปรสภาพแวดล้อมเช่นกับข้อกำหนดการปรับใช้และการปรับใช้จริงโดยประมาณดังนี้:

spec:
   type: LoadBalancer
   loadBalancerIP: ${SERVICE_ADDRESS}

และ

export SERVICE_ADDRESS=<static-ip-address>
kubectl create -f Deployment.yaml

เห็นได้ชัดว่าไวยากรณ์เฉพาะนี้ยังใช้งานไม่ได้ แต่บางอย่างเช่นนี้เป็นไปได้และถ้าเป็นเช่นนั้นได้อย่างไร

ฉันไม่ต้องการพึ่งพาแยกเครื่องมือการจัดเตรียม ความลับและConfigMapดูเหมือนว่าจะมีแนวโน้ม แต่ดูเหมือนว่าพวกเขาไม่สามารถบริโภคในวิธีที่เหมาะสมกับวัตถุประสงค์นี้ หากฉันสามารถอ้างอิงที่อยู่ IP แบบคงที่โดยตรงซึ่งกำหนดไว้ด้วยgcloud compute addresses create service-addressจะดีที่สุด

คำตอบ:


27

ทางออกที่ง่ายกว่า / สะอาดกว่ามาก: envsubst

ใน deploy.yml:

LoadbalancerIP: $LBIP

จากนั้นเพียงแค่สร้าง env var ของคุณแล้วเปิด kubectl ดังนี้:

export LBIP="1.2.3.4"
envsubst < deploy.yml | kubectl apply -f -

คุณเพิ่งใส่ตัวแปร Bash ปกติลงในไฟล์ใดก็ได้ที่คุณต้องการใช้ในกรณีนี้รายการ YAML และให้อ่านไฟล์นั้น มันจะส่งออกไฟล์ที่มี vars env แทนที่ด้วยค่าของพวกเขา คุณสามารถใช้มันเพื่อสร้างไฟล์ใหม่เช่นนี้:

envsubst < input.yml > output.yml

envsubstมีให้ในgettextแพ็คเกจเช่น Ubuntu / Debian


2
+1 envsubstสำหรับ ไม่ทราบเกี่ยวกับสิ่งนี้จนถึงตอนนี้
user1129682

1
ไม่ใช่เรื่องง่าย / สะอาดกว่าเนื่องจากต้องใช้เครื่องมือแยกต่างหากซึ่งไม่ใช่ค่าเริ่มต้นที่ติดตั้งไว้ในทุกระบบ (เช่น Mac)
Ivan

@Ivan คำถามของเขาคือ "แต่มีบางอย่างที่เป็นไปได้และถ้าเป็นเช่นนั้นได้อย่างไร" และนั่นคือคำตอบสำหรับคำถามของเขา คำถามไม่ได้ "ฉันจะทำเช่นนี้กับเครื่องมือที่มีอยู่ในทุกระบบปฏิบัติการโดยค่าเริ่มต้น?" และใช่มันคือ 1) ได้ง่ายขึ้นและ 2) sedทำความสะอาดกว่าการใช้ ตามคำนิยามของคุณโซลูชันที่นำเสนอด้วยsedจะไม่ง่ายกว่า / สะอาดกว่าเนื่องจากไม่มีการsedติดตั้งบนเครื่อง Windows เป็นค่าเริ่มต้น
Jan Grewe

ไม่ชัดเจนเลยว่าคุณเปรียบเทียบกับตัวเลือก "sed"
Ivan

2

มีอีกวิธีที่ง่ายใจคือ: ฉันมี Google Compute ที่อยู่ที่กำหนดไว้และผมก็เห็นได้ชัดว่าสามารถใช้งานได้ในสเปคบริการเช่นดังนั้น:my-addressloadBalancerIP: my-address

ด้วยสิ่งนี้เป็นแหล่ง "ภายนอก" สำหรับที่อยู่ IP และความลับสำหรับรหัสผ่านจึงไม่จำเป็นต้องมีเครื่องมือการจัดเตรียม (หรือแม่แบบ) อีกต่อไปสำหรับกรณีการใช้งานง่าย ๆ ของฉัน (ภายในสภาพแวดล้อม GKE)

OBSOLETE ทันที:ฉันได้ตัดสินใจใช้เครื่องมือการจัดเตรียมประเภทต่าง ๆ คือ "มีอยู่แล้ว" sedหลังจากทั้งหมด

Deployment.yamlตอนนี้ฉันมี "ตัวแปรแม่แบบ" เช่นใน

loadBalancerIP: $$EXTERNAL_IP

และฉันปรับใช้บริการด้วยพูด 1.2.3.4 เป็นที่อยู่ IP ภายนอกด้วย

cat Deployment.yaml | sed s/\$\$EXTERNAL_IP/1.2.3.4/ | kubectl create -f -

1
วิธีการของ Jan Grewe นั้นกว้างกว่าและสามารถนำไปใช้กับตัวแปรจำนวนเท่าใดก็ได้ ฉันขอแนะนำให้ยอมรับคำตอบของเขาแทนที่จะยอมรับตัวคุณเองที่ไม่ธรรมดาและจำเป็นต้องปรับเปลี่ยนสำหรับตัวแปรเพิ่มเติมทุกตัว
TekTimmy

0

คุณสามารถเขียนตัวประมวลผลล่วงหน้าอย่างง่ายเพื่อทำการทดแทนตัวแปรในไฟล์ yaml ของคุณ (หรือคุณสามารถใช้jsonnetเพื่อทำสิ่งเดียวกันบนไฟล์การกำหนดค่า json)

มีการอภิปรายเกี่ยวกับการเพิ่มเทมเพลตลงในการกำหนดค่า Kubernetes โดยตรงแต่ยังไม่ได้ใช้งานหรือพร้อมใช้งาน


ใช่ แต่ jsonnet เป็นเครื่องมือสำรองตามที่กล่าวไว้ในคำถาม
Drux

1
หากคุณกำลังมองหาบางอย่างในตัวการติดตามปัญหาที่ฉันเชื่อมโยงไปนี้เป็นทางออกที่ดีที่สุดของคุณในตอนนี้
Robert Bailey

0

จนกระทั่งแม่แบบที่มีวิธีที่ง่ายที่สุดที่จะทำคือการใช้งานที่ใช้ Kubernetes APIเพื่ออัปเดตบริการ สคริปต์เชลล์แบบสั้นในรูปภาพที่ใช้อัลไพน์ประกอบกับความลับ (ที่มีที่อยู่ IP) และ configmap (ที่มีแม่แบบ) ควรจะง่ายพอ บิตที่ยากอยู่อย่างถูกต้องโดยใช้คุณสมบัติการรับรองความถูกต้องและการอนุญาตของ apiserver

/programming/30690186/how-do-i-access-the-kubernetes-api-from-within-a-pod-containerให้ตัวอย่างของการเข้าถึง API เห็นได้ชัดว่าคุณต้องการ POST ไปยัง/ api / v1 / namespaces / default / servicesแทน GET ในตัวอย่างนั้น


ฟังดูน่าสนใจ แต่คุณช่วยอธิบายเพิ่มเติมอีกหน่อยได้ไหม คุณสามารถให้หรือชี้ไปที่ตัวอย่างของเชลล์สคริปต์ที่เหมาะสม
Drux
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.