Gitlab-runner에서 CI 테스트에 kubernetes (Kind를 사용한 테스트 및 Kubernetes cluster에 deploy)

Gitlab Runner란?





gitlab과 협력하여 CI/CD를 수행하기 위한 도구.

환경



docker 호스트 (gitlab-runner 컨테이너가 있음)
kubernetes cluster × 1

Step1 Kind의 deploy



htps : // 코 m / 료 jsb / ms / 에 2146 d41005f536cf74
여기에 정리했으므로 참조하십시오.

여기는 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

포트는 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을 chown에서 gitlab-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을 chown에서 gitlab-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는 kustomize로 관리합니다.

kustomize에 관해서는, 이하에 간단한 사용법을 쓰고 있으므로, 참조해 주세요.
htps : // 코 m / 료 jsb / ms / 66fb5155cb3f908 ~ fd07

구성으로는
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을 이제 사용해 보지 않으면 하는 느낌이 들었습니다.

좋은 웹페이지 즐겨찾기