Використання змінних середовища для передачі контейнерам інформації про Pod
Ця сторінка показує, як Pod може використовувати змінні середовища для передачі інформації про себе контейнерам, які працюють в Pod, використовуючи downward API. Ви можете використовувати змінні середовища для експозиції полів Pod, полів контейнера або обох.
У Kubernetes є два способи експозиції полів Pod та контейнера для запущеного контейнера:
- Змінні середовища, як пояснено в цьому завданні
- Файли томів
Разом ці два способи експозиції полів Pod та контейнера називаються downward API.
Оскільки Service є основним засобом взаємодії між контейнеризованими застосунками, якими керує Kubernetes, корисно мати можливість виявляти їх під час виконання.
Дізнайтеся більше про доступ до Сервісів тут.
Перш ніж ви розпочнете
Вам треба мати кластер Kubernetes, а також інструмент командного рядка kubectl має бути налаштований для роботи з вашим кластером. Рекомендується виконувати ці настанови у кластері, що має щонайменше два вузли, які не виконують роль вузлів управління. Якщо у вас немає кластера, ви можете створити його, за допомогою minikube або використовувати одну з цих пісочниць:
Використання полів Pod як значень для змінних середовища
У цій частині завдання ви створюєте Pod з одним контейнером, і ви спроєцюєте поля рівня Pod у працюючий контейнер у вигляді змінних середовища.
apiVersion: v1
kind: Pod
metadata:
name: dapi-envars-fieldref
spec:
containers:
- name: test-container
image: registry.k8s.io/busybox
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
є масивом визначень змінних середовища. Перший елемент у масиві вказує, що змінна середовища MY_NODE_NAME
отримує своє значення з поля spec.nodeName
Pod. Аналогічно, інші змінні середовища отримують свої назви з полів Pod.
Примітка:
Поля в цьому прикладі є полями Pod. Вони не є полями контейнера в Pod.Створіть Pod:
kubectl apply -f https://k8s.io/examples/pods/inject/dapi-envars-pod.yaml
Перевірте, що контейнер в Pod працює:
# Якщо новий Pod ще не став доступним, кілька разів перезапустіть цю команду.
kubectl get pods
Перегляньте лог контейнера:
kubectl logs dapi-envars-fieldref
Вивід показує значення вибраних змінних середовища:
minikube
dapi-envars-fieldref
default
172.17.0.4
default
Щоб побачити, чому ці значення є в лозі, подивіться на поля command
та args
у файлі конфігурації. При запуску контейнера він записує значення пʼяти змінних середовища у stdout. Він повторює це кожні десять секунд.
Далі, отримайте оболонку в контейнер, який працює в вашому Pod:
kubectl exec -it dapi-envars-fieldref -- sh
У вашій оболонці перегляньте змінні середовища:
# Виконайте це в оболонці всередині контейнера
printenv
Вивід показує, що деякі змінні середовища мають призначені значення полів Pod:
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
Використання полів контейнера як значень для змінних середовища
У попередньому завданні ви використовували інформацію з полів рівня Pod як значення для змінних середовища. У наступному завданні ви плануєте передати поля, які є частиною визначення Pod, але взяті з конкретного контейнера замість всього Pod загалом.
Ось маніфест для іншого Pod, який знову має лише один контейнер:
apiVersion: v1
kind: Pod
metadata:
name: dapi-envars-resourcefieldref
spec:
containers:
- name: test-container
image: registry.k8s.io/busybox:1.24
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
отримує своє значення з поля requests.cpu
контейнера з іменем test-container
. Аналогічно, інші змінні середовища отримують свої значення з полів, що є специфічними для цього контейнера.
Створіть Pod:
kubectl apply -f https://k8s.io/examples/pods/inject/dapi-envars-container.yaml
Перевірте, що контейнер в Pod працює:
# Якщо новий Pod ще не став доступним, кілька разів перезапустіть цю команду.
kubectl get pods
Перегляньте лог контейнера:
kubectl logs dapi-envars-resourcefieldref
Вивід показує значення вибраних змінних середовища:
1
1
33554432
67108864
Що далі
- Прочитайте Визначення змінних середовища для контейнера
- Прочитайте API-визначення
spec
для Pod. Специфікація включає визначення Контейнера (частина Pod). - Ознайомтесь зі списком доступних полів, які можна викрити за допомогою downward API.
Дізнайтеся про Pod, контейнери та змінні середовища в легасі довідці API: