Gitlab-runnerにてCIのテストにkubernetes(Kindを用いたテスト、及びKubernetes clusterにdeploy)


Gitlab-Ruunerとは

gitlabと連携をして、CI/CDを行うためのツール。

環境

dockerホスト(gitlab-runnerコンテナがのっている)
kubernetes cluster × 1

Step1 Kindのdeploy

https://qiita.com/ryojsb/items/e2146ad41005f536cf74
ここにまとめましたので、参照ください。

こちらは、docker host及びgitlab-runnerの両方にします。

gitlab-runnerコンテナに関して

gitlab-runnerコンテナに関しては、kindのコマンドを打てるようにするとことまでで大丈夫です。

その際、以下を実行しその下にgoディレクトリを配置します。

# mkdir /home/gitlab-runner/lib/

そしてこの状態にしてください。

# ls -ltr
total 70248
-rwxr-xr-x 1 gitlab-runner gitlab-runner  3525802 Aug 15 18:50 gofmt
-rwxr-xr-x 1 gitlab-runner gitlab-runner 14613596 Aug 15 18:50 go
-rwxr-xr-x 1 gitlab-runner gitlab-runner 17422189 Aug 15 18:51 godoc
drwxr-xr-x 3 gitlab-runner gitlab-runner       17 Aug 28 06:34 pkg
-rwxr-xr-x 1 gitlab-runner gitlab-runner 36367031 Aug 28 07:01 kind

gitlab-runnerコンテナ内では、gitlab-runnerユーザに権限を与えてあげてください。

# chmod 777 /home/gitlab-runner/.docker
# chmod 777 /home/gitlab-runner/.docker/*
# chown gitlab-runner:gitlab-runner /home/gitlab-runner/.docker
# chown gitlab-runner:gitlab-runner /home/gitlab-runner/.docker/*

Step2 docker buildテストのためにdockerのインストール

まず、gitlab-runnerコンテナにdockerをインストールして行きます。

# apt-get update

# apt-get install -y \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common

# curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -

# add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

# apt-get update

# apt-get install -y docker-ce

その後、kubectlを使えるように、セットアップをしてください。

Step3 gitlab-runnerコンテナからKind及びkubernetes clusterの対してkubectlを実行

gitlab-runnerからkindとkubernetes clusterそれぞれにkubernetesを使えるようにしていきます。

kubernetesは.kube/configという,ファイルを参照して、kubectlを投げる先を特定しています。
つまり、これを持ってきて、KUBECONFIGにそのpathを指定してexportしてあげれば投げられるというわけです。

kindの.kube/config

gitlab-runnerコンテナの載っているdockerホストにて、以下を実施します。

# ls /root/.kube/
cache  http-cache  kind-config-kind

kindに関しては、kind-config-kindという名前でconfigファイルが入っています。

ここで、kindのマスターのcontainerに割り振られたIPフォワーディングしているportを確認しておきます。

# docker ps
CONTAINER ID        IMAGE                         COMMAND                  CREATED             STATUS              PORTS                                  NAMES
682857797af4        kindest/node:v1.15.0          "/usr/local/bin/entr…"   58 minutes ago      Up About an hour                                           kind-worker3
72b67c81ce82        kindest/node:v1.15.0          "/usr/local/bin/entr…"   58 minutes ago      Up About an hour    36996/tcp, 127.0.0.1:36996->6443/tcp   kind-control-plane
834a76c4bdb4        kindest/node:v1.15.0          "/usr/local/bin/entr…"   58 minutes ago      Up About an hour                                           kind-worker
143cf9312cf0        kindest/node:v1.15.0          "/usr/local/bin/entr…"   58 minutes ago      Up About an hour                                           kind-worker2

portは6443です。

# docker inspect kind-control-plane
(省略)
            "Gateway": "172.17.0.1",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "172.17.0.7",
            "IPPrefixLen": 16,
            "IPv6Gateway": "",
            "MacAddress": "02:42:ac:11:00:07",
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "d57ec14a533f41659ffcb098ff46a9171f150845cbd52a67db3688f54e381a0b",
                    "EndpointID": "4d8aecd914a42e67c59554c441de1d3cf288e3ffd70ab02759bbb6af9a5da6c9",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.7",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:07",
                    "DriverOpts": null
                }
            }
        }
    }
]

IPは、172.17.0.7です。

ではconfigファイルの内容をコピーしてください。

gitlab-runnerコンテナに入り、 /home/gitlab-runner下で.kube/kind-config-kindを作ります。

# mkdir /root/.kube

# vi /root/.kube/kind-config-kind

// コピーしたものをペーストする。「その際、server: の部分は先ほど調べたものに変える。」

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: dummy-key
    server: https://172.17.0.7:6443
  name: kind
contexts:
(省略)

user:groupをchowngitlab-runnerにすることや,
chmodによる権限の変更をします。

そうしたら、gitlab-runnerユーザkubectlが通るか確認する。

# export KUBECONFIG=/home/gitlab-runner/.kube/kind-config-kind

# kubectl get nodes
NAME                 STATUS   ROLES    AGE   VERSION
kind-control-plane   Ready    master   62m   v1.15.0
kind-worker          Ready    <none>   61m   v1.15.0
kind-worker2         Ready    <none>   61m   v1.15.0
kind-worker3         Ready    <none>   61m   v1.15.0

kubernetes clusterの.kube/config

同様に、kubernetes clusterのmasterノードに入り、情報をコピーし、
gitlab-runnerコンテナの/root/.kube/下に新しくファイルを作成し、ペーストをする。
例としては、ファイル名をverify-kube-configとします。

同様に、user:groupをchowngitlab-runnerにすることや,
chmodによる権限の変更をします。

そうしたら、gitlab-runnerユーザでkubectlが通るか、確認してください。

# export KUBECONFIG=/home/gitlab-runner/.kube/verify-kube-config

# kubectl get nodes
NAME                      STATUS   ROLES    AGE   VERSION
kubemaster1.mydom.local   Ready    master   46d   v1.15.0
kubeworker1.mydom.local   Ready    <none>   46d   v1.15.0
kubeworker2.mydom.local   Ready    <none>   46d   v1.15.0

Step4 gitlab-runnerを動かしてみる。

下準備をします。

# mkdir -p /home/gitlab-runner/config/manifest

この下に、manifestを用意します。
manifestはkustomizeで管理します。

kustomizeに関しては、以下に簡単な使い方を書いていますので、参照ください。
https://qiita.com/ryojsb/items/66fb5155cb3f908ffd07

構成としては、

manifest---------- base
             |
             |---- verification
             |
             |---- production

gitlab-runnerを動かす、ymlファイルは以下です。
最小限のコマンドしか書いてません。

gitlab-ci.yml
stages:
  - build
  - test
  - deploy

docker-build:
  stage: build
  before_script:
    - sudo docker login -u $Registory_user -p $Registory_password <registry IP>
    - export GOROOT=/home/gitlab-runner/lib/go
    - export GOPATH=/home/gitlab-runner/lib/go/bin
    - export PATH=$PATH:$GOROOT/bin
  script:
    - sudo docker build -t <image 名> . --no-cache=true --force-rm=true
    - sudo docker push <image 名>
    - sudo /home/gitlab-runner/lib/go/bin/kind load docker-image <image 名>
    - sudo docker images

k8s-kind-test:
  stage: test
  before_script:
    - export KUBECONFIG=/home/gitlab-runner/.kube/kind-config-kind
  script:
    - cd /home/gitlab-runner/config/manifest
    - kubectl kustomize verification | kubectl apply -f -
    - sleep 1m
    - kubectl get pods
    - curl -I <application URL>

k8s-deploy:
  stage: deploy
  before_script:
    - export KUBECONFIG=/home/gitlab-runner/.kube/verify-kube-config
  script:
    - cd /home/gitlab-runner/config/manifest
    - kubectl kustomize production | kubectl apply -f -
    - sleep 1m
    - kubectl get pods

ここで、kind上にデプロイしたアプリケーションにcurlする際は、
IPの部分をcontainerのIPにすることに注意してください。

あとは、git pushをするのみです。

最後に

kubernetes meetup tokyo #22に参加してみて、最近よく聞くArgo CDをそろそろ使ってみなければという感じになりました。