How can I deploy something to a k8s cluster via a k8s gitlab-ci runner?

4/12/2018

cat /etc/redhat-release:

CentOS Linux release 7.2.1511 (Core)

docker version:

Client:
 Version:         1.13.1
 API version:     1.26
 Package version: <unknown>
 Go version:      go1.8.3
 Git commit:      774336d/1.13.1
 Built:           Wed Mar  7 17:06:16 2018
 OS/Arch:         linux/amd64

Server:
 Version:         1.13.1
 API version:     1.26 (minimum version 1.12)
 Package version: <unknown>
 Go version:      go1.8.3
 Git commit:      774336d/1.13.1
 Built:           Wed Mar  7 17:06:16 2018
 OS/Arch:         linux/amd64
 Experimental:    false

kubectl version:

Client Version: version.Info{Major:"1", Minor:"9", GitVersion:"v1.9.5", GitCommit:"f01a2bf98249a4db383560443a59bed0c13575df", GitTreeState:"clean", BuildDate:"2018-03-19T15:59:24Z", GoVersion:"go1.9.3", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"9", GitVersion:"v1.9.0", GitCommit:"925c127ec6b946659ad0fd596fa959be43f0cc05", GitTreeState:"clean", BuildDate:"2017-12-15T20:55:30Z", GoVersion:"go1.9.2", Compiler:"gc", Platform:"linux/amd64"}

gitlab version: 10.6-ce

gitlab runner image: gitlab/gitlab-runner:alpine-v10.3.0

I just integrated a kubernetes cluster (not GKE, just a k8s cluster deployed by myself) to a gitlab project, and then installed a gitlab-runner on which.

All of this, followed Adding an existing Kubernetes cluster.

After that, I added a .gitlab-ci.yml with a single stage, and pushed it to the repo. Here is the contents:

build-img:
  stage: docker-build
  script:
#    - docker build -t $CONTAINER_RELEASE_IMAGE .
#    - docker tag $CONTAINER_RELEASE_IMAGE $CONTAINER_LATEST_IMAGE
#    - docker push $CONTAINER_IMAGE
    - env | grep KUBE
    - kubectl --help
  tags:
    - kubernetes
  only:
    - develop

Then I got this:

$ env | grep KUBE
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_SERVICE_PORT=443
KUBERNETES_SERVICE_HOST=10.96.0.1
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
$ kubectl --help
/bin/bash: line 62: kubectl: command not found
ERROR: Job failed: error executing remote command: command terminated with non-zero exit code: Error executing in Docker Container: 1

The kubectl was not installed in the runner yet, and some env vars like KUBE_TOKEN, KUBE_CA_PEM_FILE or KUBECONFIG are not found, neither(see Deployment variables).

Searched the official docs of gitlab, got nothing.

So, how could I deploy a project via this runner?

-- leaf4monkey
deployment
gitlab-ci-runner
kubernetes

1 Answer

9/15/2018

The gitlab-runner has no build-in commands, it spin's of a container with a predefined image and then remotely executes the commands from your script, in that container.

You have not defined an image, so the default image will be used as defined in the setup of the gitlab-runner.

So, You could Install kubectl binary using curl before you use it in your script:, or before_script:

build-img:
  stage: docker-build
  before_script:
   - curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl 
   - chmod +x ./kubectl
  script:
   - ...
   - ./kubectl --version 

Or create a seperate deployment stage, with an image that has kubectl, e.g. roffe/kubectl :

stages:
- docker-build
- deploy

build-img:
  stage: docker-build
  script:
   - docker build -t $CONTAINER_RELEASE_IMAGE .
   - docker tag $CONTAINER_RELEASE_IMAGE $CONTAINER_LATEST_IMAGE
   - docker push $CONTAINER_IMAGE
  tags:
   - kubernetes

deploy:dev:
  stage: deploy 
  image: roffe/kubectl
  script:
   - kubectl .....
  tags:
   - kubernetes
-- Danny
Source: StackOverflow