Статьи

Развертывание на кластере K8s с функцией Fn

Важным шагом любого конвейера 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
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, являются их собственными.