В данной статье рассмотрим какие ресурсы и переменные окружения доступны контейнерам и как переопределять переменные окружения для контейнера при запуске пода (Pod
) в кластере Kubernetes
.
В Kubernetes
запущенному контейнеру доступны несколько важных ресурсов:
- файловая система, представляющая собой комбинацию docker-образа (слои) и одного или нескольких томов;
- информация о самом контейнере;
- информация о других объектах в кластере.
Информация о самом контейнере обычно включает в себя:
- имя хоста (hostname) - это имя пода (
Pod
), в котором работает контейнер. Доступно через командуhostname
или вызов функцииgethostname
; - пространство имен пода (
Pod
) - доступно как переменные окружения; - пользовательские переменные окружения из манифеста (описания) пода (
Pod
) - поговорим о них позже; - переменные окружения, указанные статически в docker-образе (например, при сборке).
Информация о других объектах в кластере Kubernetes
доступна контейнеру тоже в качестве переменных среды. Например, служба с именем foo
, внутри контейнера с именем bar
будет отображаться в переменных окружения так:
1 2 3 |
FOO_SERVICE_HOST=<the host the service is running on> FOO_SERVICE_PORT=<the port the service is running on> |
При создании пода (Pod
), можно установить переменные окружения для контейнеров, которые работают в данном поде. Для этого нужно добавить в файл конфигурации (манифест) поле env
или envFrom
, например так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
apiVersion: v1 kind: Pod metadata: name: envar-demo labels: purpose: demonstrate-envars spec: containers: - name: envar-demo-container image: <a class="vglnk" href="http://gcr.io/google-samples/node-hello" rel="nofollow">gcr.io/google-samples/node-hello</a>:1.0 env: - name: DEMO_GREETING value: "Hello from the environment" - name: DEMO_FAREWELL value: "Such a sweet sorrow" |
Сохраним предложенный манифест в файле envars.yaml
и запустим под в кластере Kubernetes
:
1 2 |
kubectl create <span class="hljs-_">-f</span> envars.yaml |
Проверим список запущенных подов:
1 2 |
kubectl get pods <span class="hljs-_">-l</span> purpose=demonstrate-envars |
Результат предыдущей команды будет примерно таким:
1 2 3 |
NAME READY STATUS RESTARTS AGE envar-demo 1/1 Running 0 9s |
Подключаемся к запущенному контейнеру:
1 2 |
kubectl <span class="hljs-built_in">exec</span> -it envar-demo -- /bin/bash |
Выводим на экран переменные окружения с помощью команды printenv
(вывод сокращен):
1 2 3 4 5 6 7 8 9 |
root@envar-demo:/<span class="hljs-comment"># printenv</span> NODE_VERSION=4.4.2 EXAMPLE_SERVICE_PORT_8080_TCP_ADDR=10.3.245.237 HOSTNAME=envar-demo ... DEMO_GREETING=Hello from the environment DEMO_FAREWELL=Such a sweet sorrow |
Примечание. Стоит помнить, что переменные, установленные с помощью env
или envFrom
переопределяют значения переменных установленных в docker-образе.
Чуть больше информации о переменных окружения можно получить здесь. Кроме того, в отдельных статьях мы также рассмотрим использование секретов (Secrets
) и конфигмапов (ConfigMaps
) - как частных случаев установки переменных окружения внутри docker-контейнеров.