Важным шагом любого конвейера 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 clusterkubectl 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 kubectlADD https://storage.googleapis.com/kubernetes-release/release/v1.6.4/bin/linux/amd64/kubectl /usr/local/bin/kubectlENV HOME=/configRUN chmod +x /usr/local/bin/kubectlRUN export PATH=$PATH:/usr/local/bin# install rplRUN apt-get updateRUN apt-get install rpl -y# copy into container k8s configuration file with access to all K8s clustersCOPY kubeconfig kubeconfig# copy into container yaml file template with IMAGE_NAME placeholder# and an instruction on how to deploy the container to K8s clusterCOPY k8s-deployment.yaml k8s-deployment.yaml# copy into container a shell script performing the deploymentCOPY deploy.sh /usr/local/bin/deploy.shRUN chmod +x /usr/local/bin/deploy.shENTRYPOINT ["xargs","/usr/local/bin/deploy.sh"] |
Стоит посмотреть файл k8s-deploy.yaml. Он содержит заполнитель IMAGE_NAME, который будет заменен точным именем образа Docker при развертывании:
|
01
02
03
04
05
06
07
08
09
10
|
apiVersion: extensions/v1beta1kind: 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.yamlexport KUBECONFIG=kubeconfig# switch to K8s context specified in the second shell parameterkubectl config use-context $2# deploy to K8s clusterkubectl 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, являются их собственными. |