В сегодняшней статье мы рассмотрим, как можно клонировать код приложения в контейнер, запущенный на контейнерной платформе Kubernetes.
Это идеальное решение, если вы храните код приложения в системе контроля версий Git и хотите извлекать свежий код во время развертывания без перестройки образа контейнера.
Функция kubernetes, которая позволяет нам выполнить эту операцию, – Init контейнеры.
Init контейнеры- это специализированный тип контейнеров, которые запускаются перед контейнерами приложений в Pod.
Эти контейнеры могут содержать утилиты или скрипты настройки, отсутствующие в образе приложения.
В Init-контейнерах нет ничего уникального, поскольку их можно указать в спецификации пода наряду с массивом контейнеров.
В нашем примере мы развернем контейнер nginx, данные веб-приложения которого будут взяты из репозитория Git с помощью контейнера Init.
Обратите внимание, что в Pod может быть несколько контейнеров, выполняющих приложения, но также может быть один или несколько init-контейнеров.
Требования к настройкам
Вот образы контейнеров, которые будут использоваться в этом примере:
- alpine/git : Запускается как начальный контейнер для операции git pull
- nginx: Запускает веб-сервер Nginx
Мы создадим демо-пространство имен для этого теста:
$ kubectl create ns helloworld
namespace/helloworld created
Создание манифеста развертывания Kubernetes Pod
Мы создадим шаблон и изменим его, чтобы добавить контейнер Init.
kubectl run nginx-helloworld --image nginx --restart=Never --dry-run=client -o yaml >nginx-helloworld-pod.yml
Если вы хотите получить файл Kubernetes Deployment YAML, запустите его:
kubectl run nginx-helloworld --image nginx --dry-run=client -o yaml >nginx-helloworld-deploy.yml
Вот файл развертывания пода
$ cat nginx-helloworld-pod.yml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: nginx-helloworld
name: nginx-helloworld
spec:
containers:
- image: nginx
name: nginx-helloworld
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Never
status: {}
Мы обновим содержимое файла манифеста, чтобы оно выглядело так, как показано ниже.
---
apiVersion: v1
kind: Pod
metadata:
labels:
run: nginx-helloworld
name: nginx-helloworld
spec:
containers:
- image: nginx
name: nginx-helloworld
ports:
- containerPort: 80
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: www-data
initContainers:
- name: git-cloner
image: alpine/git
args:
- clone
- --single-branch
- --
- https://github.com/jmutai/hello-world-nginx.git
- /data
volumeMounts:
- mountPath: /data
name: www-data
volumes:
- name: www-data
emptyDir: {}
Обратите внимание, что мы выполняем следующее:
- Использование контейнера init под названием git-cloner для клонирования git-репозитория в /data
- /data – это монтирование тома с именем www-data. Это обеспечивает совместное использование контейнеров
- Том www-data смонтирован в /usr/share/nginx/html в контейнере nginx. Веб-данные, которые мы клонировали, будут находиться в корневом каталоге по умолчанию.
Применим файл для создания ресурсов Kubernetes.
$ kubectl apply -f nginx-helloworld-pod.yml -n helloworld
pod/nginx-helloworld created
Убедитесь, что поды созданы.
Первый запуск
$ kubectl get pods -n helloworld
NAME READY STATUS RESTARTS AGE
nginx-helloworld 0/1 Init:0/1 0 7s
Второй запуск
$ kubectl get pods -n helloworld
NAME READY STATUS RESTARTS AGE
nginx-helloworld 0/1 PodInitializing 0 26s
Третий запуск
$ kubectl get pods -n helloworld
NAME READY STATUS RESTARTS AGE
nginx-helloworld 1/1 Running 0 34s
При использовании PVC вы обновите раздел “volumes” так, как показано ниже.
volumes:
- name: my-pv-storage
persistentVolumeClaim:
claimName: mypv-claim
Удаление:
kubectl delete all --all -n helloworld
kubectl delete ns helloworld
см. также:
- 🐧 Скрипт bash для создания кластера Minikube K8s на Ubuntu
- ☸️ Как составить список контейнеров в поде
- ☸️ Разница между подами и контейнерами в Kubernetes
- ☸️ Как показать образа подов Kubernetes
- ☸️ Как определить, когда был создан объект Kubernetes