☸️ Как выполнить клонирование Git в развертывании Kubernetes пода

GIt clone в Kubernetes

by itisgood

В сегодняшней статье мы рассмотрим, как можно клонировать код приложения в контейнер, запущенный на контейнерной платформе 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

см. также:

 

Loading

You may also like

Leave a Comment