फ़ाइलों के माध्यम से कंटेनरों को पॉड जानकारी प्रकट करें

यह पेज दिखाता है कि एक पॉड कैसे एक downwardAPI वॉल्यूम का उपयोग करके, अपने बारे में जानकारी उस पॉड में चल रहे कंटेनरों को प्रदान कर सकता है। एक downwardAPI वॉल्यूम पॉड फ़ील्ड्स और कंटेनर फ़ील्ड्स को प्रकट कर सकता है।

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

इन दोनों तरीकों को मिलाकर डाउनवर्ड API कहा जाता है।

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

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

पॉड फ़ील्ड संग्रहीत करें

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

apiVersion: v1
kind: Pod
metadata:
  name: kubernetes-downwardapi-volume-example
  labels:
    zone: us-est-coast
    cluster: test-cluster1
    rack: rack-22
  annotations:
    build: two
    builder: john-doe
spec:
  containers:
    - name: client-container
      image: registry.k8s.io/busybox:1.27.2
      command: ["sh", "-c"]
      args:
      - while true; do
          if [[ -e /etc/podinfo/labels ]]; then
            echo -en '\n\n'; cat /etc/podinfo/labels; fi;
          if [[ -e /etc/podinfo/annotations ]]; then
            echo -en '\n\n'; cat /etc/podinfo/annotations; fi;
          sleep 5;
        done;
      volumeMounts:
        - name: podinfo
          mountPath: /etc/podinfo
  volumes:
    - name: podinfo
      downwardAPI:
        items:
          - path: "labels"
            fieldRef:
              fieldPath: metadata.labels
          - path: "annotations"
            fieldRef:
              fieldPath: metadata.annotations

मैनिफ़ेस्ट में, आप देख सकते हैं कि पॉड में एक downwardAPI वॉल्यूम है, और कंटेनर उस वॉल्यूम को /etc/podinfo पर माउंट करता है।

downwardAPI के अंतर्गत items ऐरे को देखें। इस ऐरे का प्रत्येक तत्व एक downwardAPI वॉल्यूम को परिभाषित करता है। पहला तत्व निर्दिष्ट करता है कि पॉड के metadata.labels फ़ील्ड का मान labels नाम की फ़ाइल में संग्रहीत किया जाना चाहिए। दूसरा तत्व निर्दिष्ट करता है कि पॉड के annotations फ़ील्ड का मान annotations नाम की फ़ाइल में संग्रहीत किया जाना चाहिए।

पॉड बनाएँ:

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

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

kubectl get pods

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

kubectl logs kubernetes-downwardapi-volume-example

आउटपुट में labels फ़ाइल और annotations फ़ाइल की सामग्री दिखाई देगी:

cluster="test-cluster1"
rack="rack-22"
zone="us-est-coast"

build="two"
builder="john-doe"

पॉड में चल रहे कंटेनर में एक शेल प्राप्त करें:

kubectl exec -it kubernetes-downwardapi-volume-example -- sh

अपने शेल में, labels फ़ाइल देखें:

/# cat /etc/podinfo/labels

आउटपुट दिखाता है कि सभी पॉड के लेबल labels फ़ाइल में लिखे गए हैं:

cluster="test-cluster1"
rack="rack-22"
zone="us-est-coast"

इसी तरह, annotations फ़ाइल देखें:

/# cat /etc/podinfo/annotations

/etc/podinfo डायरेक्टरी में फ़ाइलें देखें:

/# ls -laR /etc/podinfo

आउटपुट में, आप देख सकते हैं कि labels और annotations फ़ाइलें एक अस्थायी सबडायरेक्टरी में हैं: इस उदाहरण में, ..2982_06_02_21_47_53.299460680/etc/podinfo डायरेक्टरी में, ..data एक सिम्बोलिक लिंक है जो उस अस्थायी सबडायरेक्टरी की ओर इशारा करता है। साथ ही /etc/podinfo डायरेक्टरी में labels और annotations भी सिम्बोलिक लिंक्‍स हैं।

drwxr-xr-x  ... Feb 6 21:47 ..2982_06_02_21_47_53.299460680
lrwxrwxrwx  ... Feb 6 21:47 ..data -> ..2982_06_02_21_47_53.299460680
lrwxrwxrwx  ... Feb 6 21:47 annotations -> ..data/annotations
lrwxrwxrwx  ... Feb 6 21:47 labels -> ..data/labels

/etc/..2982_06_02_21_47_53.299460680:
total 8
-rw-r--r--  ... Feb  6 21:47 annotations
-rw-r--r--  ... Feb  6 21:47 labels

सिम्बोलिक लिंक्‍स का उपयोग मेटाडेटा का डायनामिक और एटॉमिक रीफ्रेश सक्षम करता है;
अपडेट्स एक नई अस्थायी डायरेक्टरी में लिखे जाते हैं, और ..data सिम्बोलिक लिंक को
rename(2) का उपयोग करके एटॉमिक रूप से अपडेट किया जाता है।

शेल से बाहर निकलें:

/# exit

कंटेनर फ़ील्ड्स को संग्रहित करें

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

apiVersion: v1
kind: Pod
metadata:
  name: kubernetes-downwardapi-volume-example-2
spec:
  containers:
    - name: client-container
      image: registry.k8s.io/busybox:1.27.2
      command: ["sh", "-c"]
      args:
      - while true; do
          echo -en '\n';
          if [[ -e /etc/podinfo/cpu_limit ]]; then
            echo -en '\n'; cat /etc/podinfo/cpu_limit; fi;
          if [[ -e /etc/podinfo/cpu_request ]]; then
            echo -en '\n'; cat /etc/podinfo/cpu_request; fi;
          if [[ -e /etc/podinfo/mem_limit ]]; then
            echo -en '\n'; cat /etc/podinfo/mem_limit; fi;
          if [[ -e /etc/podinfo/mem_request ]]; then
            echo -en '\n'; cat /etc/podinfo/mem_request; fi;
          sleep 5;
        done;
      resources:
        requests:
          memory: "32Mi"
          cpu: "125m"
        limits:
          memory: "64Mi"
          cpu: "250m"
      volumeMounts:
        - name: podinfo
          mountPath: /etc/podinfo
  volumes:
    - name: podinfo
      downwardAPI:
        items:
          - path: "cpu_limit"
            resourceFieldRef:
              containerName: client-container
              resource: limits.cpu
              divisor: 1m
          - path: "cpu_request"
            resourceFieldRef:
              containerName: client-container
              resource: requests.cpu
              divisor: 1m
          - path: "mem_limit"
            resourceFieldRef:
              containerName: client-container
              resource: limits.memory
              divisor: 1Mi
          - path: "mem_request"
            resourceFieldRef:
              containerName: client-container
              resource: requests.memory
              divisor: 1Mi

मैनिफ़ेस्ट में, आप देख सकते हैं कि इस पॉड में एक
downwardAPI वॉल्यूम है,
और उस पॉड में जो एकमात्र कंटेनर है वह उस वॉल्यूम को /etc/podinfo पर माउंट करता है।

downwardAPI के अंतर्गत items ऐरे को देखें। इस ऐरे का प्रत्येक एलिमेंट डाउनवर्ड API वॉल्यूम में एक फ़ाइल को परिभाषित करता है।

पहला एलिमेंट निर्दिष्ट करता है कि client-container नामक कंटेनर में,
limits.cpu फ़ील्ड का मान, जो 1m स्वरूप में है,
cpu_limit नाम की फ़ाइल के रूप में प्रकाशित किया जाना चाहिए।
divisor फ़ील्ड वैकल्पिक है और इसका डिफ़ॉल्ट मान 1 है।
cpu संसाधनों के लिए डिवाइज़र 1 का अर्थ है कोर,
और memory संसाधनों के लिए इसका अर्थ है बाइट्स।

पॉड बनाएँ:

kubectl apply -f https://k8s.io/examples/pods/inject/dapi-volume-resources.yaml

अपने पॉड में चल रहे कंटेनर में एक शेल प्राप्त करें:

kubectl exec -it kubernetes-downwardapi-volume-example-2 -- sh

अपने शेल में, cpu_limit फ़ाइल देखें:

cat /etc/podinfo/cpu_limit

आप समान कमांड का उपयोग करके cpu_request, mem_limit, और mem_request फ़ाइलों को भी देख सकते हैं।

कुंजियों को विशिष्ट पथों और फ़ाइल अनुमतियों पर प्रोजेक्ट करें

आप प्रत्येक फ़ाइल के आधार पर कुंजियों को विशिष्ट पथों और विशिष्ट अनुमतियों के साथ प्रोजेक्ट कर सकते हैं। अधिक जानकारी के लिए देखें:सीक्रेट

आगे क्या है

  • spec API परिभाषा पढ़ें जो पॉड को परिभाषित करती है। इसमें कंटेनर की परिभाषा भी शामिल है (जो पॉड का हिस्सा है)।
  • उन उपलब्ध फ़ील्ड्स की सूची पढ़ें अवेलेबल फील्ड्स, जिन्हें आप डाउनवर्ड API का उपयोग करके एक्सपोज़ कर सकते हैं।

पुरानी API संदर्भ में वॉल्यूम्स के बारे में पढ़ें:

  • Volume API परिभाषा देखें जो पॉड में कंटेनरों द्वारा एक्सेस किए जाने वाले सामान्य वॉल्यूम को परिभाषित करती है।

  • DownwardAPIVolumeSource API परिभाषा देखें जो डाउनवर्ड API जानकारी वाले वॉल्यूम को परिभाषित करती है।

  • DownwardAPIVolumeFile API परिभाषा देखें जो फ़ाइलों को आबाद करने के लिए ऑब्जेक्ट या रिसोर्स फ़ील्ड्स का संदर्भ रखती है।

  • ResourceFieldSelector API परिभाषा देखें जो कंटेनर संसाधनों और उनके आउटपुट फ़ॉर्मेट को निर्दिष्ट करती है।