Важным шагом любого конвейера CI / CD является развертывание. Если конвейер работает с контейнерами Docker и развертывается в кластерах K8s, то целью этапа развертывания является развертывание определенного образа Docker (хранящегося в реестре некоторых контейнеров) в конкретный кластер K8s. Допустим, есть виртуальная машина, на которой выполняется этот шаг развертывания. С этой виртуальной машиной нужно сделать несколько вещей, прежде чем ее можно будет использовать в качестве машины для развертывания в kuberenetes:
- установить kubectl (K8s CLI)
- настроить доступ к кластерам K8s, где мы собираемся развернуть
После настройки виртуальной машины шаг развертывания выполняет следующие действия:
01
02
03
04
05
06
07
08
09
10
11
|
# kubeconfig file contains access configuration to all K8s clusters we need # each configuration is called "context" export KUBECONFIG=kubeconfig # switch to "google-cloud-k8s-dev" context (K8s cluster on Google Cloud for Dev) # so all subsequent kubectl commands are applied to that K8s cluster kubectl config use-context google-cloud-k8s-dev # actually deploy by applying k8s-deployment.yaml file # containing instructions on what image should be deployed and how kubectl apply -f k8s-deployment.yaml |
В этом посте я собираюсь показать, как мы можем создать предварительно сконфигурированный контейнер Docker, способный развертывать образ Docker в кластере K8s. Так что, в основном, он будет работать как функция с двумя параметрами: образ докера, контекст K8s. Поэтому мы собираемся создать функцию в Fn Project на основе этого контейнера «deployer» и развернуть ее на K8, просто вызвав функцию через http.
Контейнер развертывания собирается из файла Docker со следующим содержимым:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
FROM ubuntu # install kubectl ADD https://storage.googleapis.com/kubernetes-release/release/v1.6.4/bin/linux/amd64/kubectl /usr/ local /bin/kubectl ENV HOME=/config RUN chmod +x /usr/ local /bin/kubectl RUN export PATH=$PATH:/usr/ local /bin # install rpl RUN apt-get update RUN apt-get install rpl -y # copy into container k8s configuration file with access to all K8s clusters COPY kubeconfig kubeconfig # copy into container yaml file template with IMAGE_NAME placeholder # and an instruction on how to deploy the container to K8s cluster COPY k8s-deployment.yaml k8s-deployment.yaml # copy into container a shell script performing the deployment COPY deploy.sh /usr/ local /bin/deploy.sh RUN chmod +x /usr/ local /bin/deploy.sh ENTRYPOINT [ "xargs" , "/usr/local/bin/deploy.sh" ] |
Стоит посмотреть файл k8s-deploy.yaml. Он содержит заполнитель IMAGE_NAME, который будет заменен точным именем образа Docker при развертывании:
01
02
03
04
05
06
07
08
09
10
|
apiVersion: extensions/v1beta1 kind: Deployment ... spec: containers: - image: IMAGE_NAME imagePullPolicy: Always ... |
Сценарий deploy.sh, который вызывается после запуска контейнера, имеет следующее содержимое:
1
2
3
|
#!/bin/bash # replace IMAGE_NAME placeholder in yaml file with the first shell parameter |
1
2
3
4
5
6
7
8
9
|
rpl IMAGE_NAME $ 1 k8s-deployment.yaml export KUBECONFIG=kubeconfig # switch to K8s context specified in the second shell parameter kubectl config use-context $ 2 # deploy to K8s cluster kubectl apply -f k8s-deployment.yaml |
Итак, мы собираемся создать образ Docker из Dockerfile, вызвав эту команду Docker:
1
|
docker build -t efedorenko/k8sdeployer: 1.0 . |
Предполагая, что проект Fn запущен и работает где-то (например, на кластере K8s, как описано в этом посте ), мы можем создать приложение Fn:
1
|
fn apps create k8sdeployerapp |
Затем создайте маршрут к контейнеру k8sdeployer:
1
|
fn routes create k8sdeployerapp /deploy efedorenko/k8sdeployer: 1.0 |
Мы создали функцию развертывания образа Docker в кластер K8s. Эта функция может быть вызвана через http следующим образом:
1
|
curl http: //35.225.120.28:80/r/k8sdeployer -d "google-cloud-k8s-dev efedorenko/happyeaster:latest" |
Этот вызов развернет efedorenko / happyeaster: последний образ Docker в кластере K8s на Google Cloud Platform.
Это оно!
Опубликовано на Java Code Geeks с разрешения Евгения Федоренко, партнера нашей программы JCG . Смотрите оригинальную статью здесь: Развертывание на кластере K8s с функцией Fn
Мнения, высказанные участниками Java Code Geeks, являются их собственными. |