कंटेनरों को एनवायरनमेंट वेरिएबल्स के माध्यम से पॉड जानकारी एक्सपोज़ करना

यह पृष्ठ दिखाता है कि एक पॉड कैसे एनवायरनमेंट वेरिएबल्स का उपयोग कर सकता है अपने कंटेनरों को खुद की जानकारी प्रदान करने के लिए, downward API का उपयोग करके। आप एनवायरनमेंट वेरिएबल्स का उपयोग पॉड फ़ील्ड्स, कंटेनर फ़ील्ड्स, या दोनों को एक्सपोज़ करने के लिए कर सकते हैं।

Kubernetes में, एक चल रहे कंटेनर को पॉड और कंटेनर फ़ील्ड्स एक्सपोज़ करने के दो तरीके हैं:

ये दोनों तरीके मिलकर पॉड और कंटेनर फ़ील्ड्स को एक्सपोज़ करने के लिए डाउनवर्ड एपीआई (downward API) कहलाते हैं।

चूँकि सर्विसेज़ Kubernetes द्वारा प्रबंधित कंटेनरयुक्त अनुप्रयोगों के बीच संचार का प्राथमिक तरीका हैं, रनटाइम पर उन्हें खोजने में सक्षम होना उपयोगी है। सर्विसेज़ तक पहुँचने के बारे में अधिक पढ़ें here

शुरू करने से पहले

आपको कुबरनेट्स क्लस्टर की ज़रूरत पड़ेगी और क्यूब सीटीएल कमांड लाइन साधन को समनुरूप करना होगा ताकि वो आपके क्लस्टर के साथ संवाद कर सकें। हमारी सलाह है की इस टुटोरिअल को क्लस्टर में रन करने के लिए कम से कम दो नोड का इस्तेमाल करे जो कि कंट्रोल प्लेन होस्ट के तरह ना एक्ट करे। अगर आपके पास पहले से क्लस्टर नही है, आप minikube की मदद से वह बना सकते है या आप नीचे दिए हुए इन दो कुबरनेट्स प्लेग्राउंड का इस्तेमाल कर सकते हैं:

पॉड फ़ील्ड्स को एनवायरनमेंट वेरिएबल्स के रूप में उपयोग करना

इस अभ्यास में, आप एक ऐसा पॉड बनाएँगे जिसमें एक कंटेनर होगा, और आप पॉड-स्तरीय फ़ील्ड्स को एक चलते कंटेनर में एनवायरनमेंट वेरिएबल्स के रूप में प्रोजेक्ट करेंगे।

apiVersion: v1
kind: Pod
metadata:
  name: dapi-envars-fieldref
spec:
  containers:
    - name: test-container
      image: registry.k8s.io/busybox:1.27.2
      command: [ "sh", "-c"]
      args:
      - while true; do
          echo -en '\n';
          printenv MY_NODE_NAME MY_POD_NAME MY_POD_NAMESPACE;
          printenv MY_POD_IP MY_POD_SERVICE_ACCOUNT;
          sleep 10;
        done;
      env:
        - name: MY_NODE_NAME
          valueFrom:
            fieldRef:
              fieldPath: spec.nodeName
        - name: MY_POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: MY_POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: MY_POD_IP
          valueFrom:
            fieldRef:
              fieldPath: status.podIP
        - name: MY_POD_SERVICE_ACCOUNT
          valueFrom:
            fieldRef:
              fieldPath: spec.serviceAccountName
  restartPolicy: Never

उस मैनिफेस्ट में, आप पाँच एनवायरनमेंट वेरिएबल्स देख सकते हैं। env फ़ील्ड एनवायरनमेंट वेरिएबल परिभाषाओं की एक एरे है। एरे का पहला तत्व (element) निर्दिष्ट करता है कि MY_NODE_NAME एनवायरनमेंट वेरिएबल को उसका मान पॉड के spec.nodeName फ़ील्ड से प्राप्त होता है। इसी तरह, अन्य एनवायरनमेंट वेरिएबल्स अपने नाम पॉड फ़ील्ड्स से प्राप्त करते हैं।

पॉड बनाएँ:

kubectl apply -f https://k8s.io/examples/pods/inject/dapi-envars-pod.yaml

सुनिश्चित करें कि पॉड में कंटेनर चल रहा है:

kubectl get pods

कंटेनर के लॉग देखें:

kubectl logs dapi-envars-fieldref

आउटपुट चयनित एनवायरनमेंट वेरिएबल्स के मान दिखाता है:

minikube
dapi-envars-fieldref
default
172.17.0.4
default

यह देखने के लिए कि ये मान लॉग में क्यों हैं, command और args फ़ील्ड्स को देखें कॉन्फ़िगरेशन फ़ाइल में। जब कंटेनर शुरू होता है, तो यह पाँच एनवायरनमेंट वेरिएबल्स के मान stdout में लिखता है। यह हर दस सेकंड में दोहराता है।

इसके बाद, पॉड में चल रहे कंटेनर में एक शेल प्राप्त करें:

kubectl exec -it dapi-envars-fieldref -- sh

अपने शेल में, एनवायरनमेंट वेरिएबल्स देखें:

printenv

आउटपुट दिखाता है कि कुछ एनवायरनमेंट वेरिएबल्स को पॉड फ़ील्ड्स के मान सौंपे गए हैं:

MY_POD_SERVICE_ACCOUNT=default
...
MY_POD_NAMESPACE=default
MY_POD_IP=172.17.0.4
...
MY_NODE_NAME=minikube
...
MY_POD_NAME=dapi-envars-fieldref

कंटेनर फ़ील्ड्स को एनवायरनमेंट वेरिएबल्स के रूप में उपयोग करना

पिछले अभ्यास में, आपने पॉड-स्तरीय फ़ील्ड्स से जानकारी ली थी एनवायरनमेंट वेरिएबल्स के मान के रूप में। अगले अभ्यास में, आप पॉड परिभाषा का हिस्सा होने वाले लेकिन विशिष्ट कंटेनर से लिए गए फ़ील्ड्स को पास करेंगे न कि पूरे पॉड से।

यह एक मैनिफेस्ट है एक और पॉड के लिए जिसमें फिर से केवल एक कंटेनर है:

apiVersion: v1
kind: Pod
metadata:
  name: dapi-envars-resourcefieldref
spec:
  containers:
    - name: test-container
      image: registry.k8s.io/busybox:1.27.2
      command: [ "sh", "-c"]
      args:
      - while true; do
          echo -en '\n';
          printenv MY_CPU_REQUEST MY_CPU_LIMIT;
          printenv MY_MEM_REQUEST MY_MEM_LIMIT;
          sleep 10;
        done;
      resources:
        requests:
          memory: "32Mi"
          cpu: "125m"
        limits:
          memory: "64Mi"
          cpu: "250m"
      env:
        - name: MY_CPU_REQUEST
          valueFrom:
            resourceFieldRef:
              containerName: test-container
              resource: requests.cpu
        - name: MY_CPU_LIMIT
          valueFrom:
            resourceFieldRef:
              containerName: test-container
              resource: limits.cpu
        - name: MY_MEM_REQUEST
          valueFrom:
            resourceFieldRef:
              containerName: test-container
              resource: requests.memory
        - name: MY_MEM_LIMIT
          valueFrom:
            resourceFieldRef:
              containerName: test-container
              resource: limits.memory
  restartPolicy: Never

इस मैनिफेस्ट में, आप चार एनवायरनमेंट वेरिएबल्स देख सकते हैं। env फ़ील्ड एनवायरनमेंट वेरिएबल परिभाषाओं की एक एरे है। पहला तत्व निर्दिष्ट करता है कि MY_CPU_REQUEST एनवायरनमेंट वेरिएबल को उसका मान कंटेनर test-container के requests.cpu फ़ील्ड से प्राप्त होता है। इसी तरह, अन्य एनवायरनमेंट वेरिएबल्स को मान कंटेनर-विशिष्ट फ़ील्ड्स से प्राप्त होते हैं।

पॉड बनाएँ:

kubectl apply -f https://k8s.io/examples/pods/inject/dapi-envars-container.yaml

सुनिश्चित करें कि पॉड में कंटेनर चल रहा है:

kubectl get pods

कंटेनर के लॉग देखें:

kubectl logs dapi-envars-resourcefieldref

आउटपुट चयनित एनवायरनमेंट वेरिएबल्स के मान दिखाता है:

1
1
33554432
67108864

आगे क्या है

पॉड्स, कंटेनर और एनवायरनमेंट वेरिएबल्स के बारे में पुरानी एपीआई संदर्भ में पढ़ें: