Saturday, December 16, 2017

automasi kubernetes deployment dengan gitlab-ci


pada tutorial kedua kali ini saya akan menjabarkan tutorial bagaimana menggunakan gitlab-ci untuk keperluan automasi deployment kubernetes, ada beberapa hal yang harus disiapkan untuk mengimplementasikan automasi deployment kubernetes dengan gitlab-ci yaitu baik dari sisi gitlab & vm kubernetes master

dari sisi repo gitlab yang harus disiapkan yaitu

  • variable ci/cd yang berisi privkey untuk keperluan scp/ssh ke vm kubernetes
  • file Dockerfile untuk keperluan pembuatan image
  • file .gitlab-ci.yml
dari sisi vm kubernetes yang harus disiapkan yaitu
  • template deployment .yml kubernetes
  • public_key yang terpasang di user root untuk keperluan ssh dari docker runner
contoh isi script .gitlab-ci.yml yang saya buat seperti dibawah

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
image: docker:latest
services:
- docker:dind
- mysql
- registry.gitlab.com/nostra/keycloak:3.1.0.Final

variables:
  MYSQL_ROOT_PASSWORD: root2017
  MYSQL_DATABASE: nostra
  MYSQL_USER: nostra
  MYSQL_PASSWORD: nostra2017
      
stages:
- compile-java
- build-image
- deploy-k8s

compile-java:
  stage: compile-java
  only:
    - master
  image: maven:3.5-jdk-8
  script:
    - 'mvn package -e -X -Dspring.profiles.active=testing'
  artifacts:
    paths:
      - target/*.jar 

build-image:
  stage: build-image
  only:
    - master
  script:
    - mv target/*.jar .
    - docker login registry.gitlab.com -u $username -p $password
    - docker pull openjdk
    - docker build -t registry.gitlab.com/nostra/nostra-service .
    - docker push registry.gitlab.com/nostra/nostra-service

deploy-k8s:
  stage: deploy-k8s
  only:
    - master
  image: ubuntu
  script:
    - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'
    - 'mkdir -p ~/.ssh'
    - 'eval $(ssh-agent -s)'
    - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
    - 'ssh-add <(echo "$PRIVATE_KEY")'
    - 'ssh -p22 root@nostratech.com "kubectl apply -f /root/k8s/nostra-service.yml && kubectl set image deployment/nostra-service nostra-service=registry.gitlab.com/nostra/nostra-service:latest"'

contoh isi file Dockerfile seperti dibawah

1
2
3
4
5
6
FROM openjdk
MAINTAINER nostra
RUN mkdir -p /home/nostra/master-service
COPY ./nostra-1.0.0.jar /home/nostra/master-service
EXPOSE 20003
ENTRYPOINT exec java -DROOT_APP=/home/nostra/master-service -jar -server -XX:MaxNewSize=64m -XX:NewSize=64m -Xms256m -Xmx256m -Dspring.profiles.active=staging /home/nostra/master-service/nostra-1.0.0.jar

fungsi dari file .gitlab-ci.yml sendiri ada sebagai rule/config harus bagaima dan seperti apa ci/cd itu berjalan, dari contoh isi file .gitlab-ci.yml berikut ini definisi dari setiap paramater yg ada di dalam .gitlab-ci.yml
  • image: untuk menentukan image docker utama apa yang akan kita gunakan
  • service: untuk menentukan service image apa yang akan terhubung ke image utama
  • variables: untuk membuat variable  yang mana nanti digunakan untuk keperluan gitlab-ci
  • stages: list jobs/stage ya akan dijalankan di di gitlab-ci
  • only: untuk menetapkan di branch mana saja proses ci ini akan berjalan
  • script: digunakan untuk keperluan menjalankan perintah bash, karena pada dasarnya didalam sebuah docker image kita berada dalam sebuah environment linux yang didalamnya terdapat bash
pada script .gitlab-ci.yml saya membaginya menjadi 3 stages yaitu

compile-java
pada stage ini saya akan menjalankan perintah mvn untuk compile script yg ada di repo gitlab didalam sebuah container dengan image maven, jika sudah jadi hasil compile yg berupa .jar akan saya artifacts untuk ditransfer ke stage berikutnya

build-image
pada stage ini hasil compile-java yang berupa jar akan dibuat menjadi sebuah docker image, untuk metodenya pembuatan imagenya sendiri menggunakan metode Dockerfile, isi dari dockerfile seperti yang tertera diatas, untuk kemudian akan di push ke private registry docker

deploy-k8s
pada stage ini kita akan mengirimkan shell command ke vm kubernetes master dengan metode ssh, yang isinya memberikan perintah agar deployment kubernetes melakukan update ke docker image terbaru yang telah kita buat pada stage build-image

sekian tutorial automasi kubernetes deployment dengan gitlab-ci kali ini, yang perlu diperhatikan tutorial ini sangatlah sederhana dan masih banyak bisa kita rubah-rubah hingga skenario yang lebih rumit, terimakasih

No comments:

Post a Comment