Nhảy đến nội dung chính

Triển khai ứng dụng trên Kubernetes dùng GitOps (ArgoCD (GitOps) + K8s + CI/CD)

Có nhiều cách triển khai ứng dụng trên K8s. Trong bào viết này chúng ta cùng tiìm hiểu cách triển khai ứng dụng trên Kubernetes dùng GitOps (ArgoCD (GitOps) + K8s + CI/CD).

GitOps là được hiểu nôn na là dùng Git để lưu trữ cấu hình toàn bộ cơ sở hạ tầng triển khai hoàn chỉnh cho một ứng dụng. Một tập hợp các file, sử dụng IaC, được sử dụng để phân bổ các tài nguyên cơ sở hạ tầng cần thiết, để cấu hình việc triển khai ứng dụng.

Mô hình gồm có:

  • Repo lưu trữ code ứng dụng

  • Repo lưu trữ GitOps

  • Môi trường triển Kubernetes cluster(AKS, EKS, GCP...)

  • Cài đặt ArgoCD

  • Cài đặt GitOps

  • Trigger

Khi bạn Deveopers commit code lên source code gitlab hệ thống sẽ build và push image lên gitlab container registry. Sau đó Agrocd sẽ trigger source code Gitops và tiến hành deploy ứng dụng hoàn toàn tự động trên K8s (AKS,EKS,GKE...)

Repo lưu trữ code ứng dụng

Ở đây mình lấy một ứng dụng cơ bản dùng nodejs

Source code tại đây

Đầu tiên các bạn pull source code về

Tạo một file .gitlab-ci.yml để build và push image lên gitlab container registry

stages:
- build-push

image: docker:19.03.12

variables:
DOCKER_HOST: tcp://docker:2375/
DOCKER_TLS_CERTDIR: ""

services:
- docker:19.03.12-dind

build:
stage: build-push
variables:
IMAGE_TAG: $CI_REGISTRY_IMAGE:latest
script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- docker build -t $IMAGE_TAG .
- docker push $IMAGE_TAG

Sau khi bạn tạo và push xong vào “Gitlab Repo” >> “CI/CD” >> “Pipelines” thấy kết quả

Sau khi thấy passed rồi các bạn kiểm tra xem có image được tạo chưa trong GitLab Repo” >> “Packages and registries” >> “Container Registry”.

Như vậy là xong phần chuẩn bị trên Source code ứng dụng

Tạo một repo lưu trữ source code Gitops

Các bạn tạo một repo tên Gitops để chứa code IaC mà các bạn muốn triển khai ứng dụng trên K8s.

Trong repo các bạn tạo 2 folders envs và base

Base folder: sẽ chứa các file manifest triển khai chung và kustomization.yaml.

deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
name: example-deployment
spec:
replicas: 1
selector:
matchLabels:
app: nodejs
template:
metadata:
labels:
app: nodejs
spec:
containers:
- name: application-container
image: registry.gitlab.com/tonykien2012/node-js-apps:f54f583a
ports:
- containerPort: 80
imagePullSecrets: 
- name: gitlab-creds-secret

service.yaml

apiVersion: v1
kind: Service
metadata:
name: test
spec:
type: LoadBalancer
selector:
app: nodejs
ports:
- protocol: TCP
port: 80
targetPort: 3000

kustomization.yaml

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ./deployment.yaml
- ./service.yaml

ENVS Folder:sẽ chứa các file manifest môi trường triển khai dev, prod...

Bên trong envs tạo thêm 2 folder dev, prod và các file manifest

envs/dev

replicas.yml: Define replicas

apiVersion: apps/v1
kind: Deployment
metadata:
name: example-deployment
spec:
replicas: 1

version.yml: Define image

apiVersion: apps/v1
kind: Deployment
metadata:
name: example-deployment
spec:
template:
spec:
containers:
- name: application-container
image: registry.gitlab.com/<GITLAB-PROJECT>/<IMAGE>-dev:latest

kustomization.yml

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

namespace: example-dev
namePrefix: dev-

resources:
- ../../base

#components:
# - ../../variants/prod
# - ../../variants/asia

patchesStrategicMerge:
- replicas.yml
- version.yml

envs/prod

replicas.yml: Define replicas

apiVersion: apps/v1
kind: Deployment
metadata:
   name: example-deployment
spec:
   replicas: 2

version.yml: Define image

apiVersion: apps/v1
kind: Deployment
metadata:
   name: example-deployment
spec:
   template:
      spec:
         containers:
            - name: application-container
              image: registry.gitlab.com/devops-demo7/node-js-app:latest

kustomization.yml:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

namespace: example-prod
namePrefix: prod-

resources:
- ../../base

#components:
#  - ../../variants/prod
#  - ../../variants/asia

patchesStrategicMerge:
- replicas.yml
- version.yml

OK như vậy xong phần chuẩn bị repo code cho gitops

Môi trường triển Kubernetes cluster(AKS, EKS, GCP...)

Tiếp đến các bạn chuẩn bị một môi trường K8s để triển khai có thể AKS, EKS, GKE...

Cài đặt ArgoCD

Sau khi có môi trường rồi, bây giờ chúng ta đi cài đặt Argocd bằng cách lệnh sau trên K8s

kubectl create namespace argocd
helm repo add argo https://argoproj.github.io/argo-helm
helm install argocd -n argocd argo/argocd - values values.yaml

Bạn có thể tuỳ chỉnh lại các value qua repo

Bạn tạo ingress để public argocd bằng cách chỉnh argocd service sang “LoadBalancer”. Chỉnh serivce named “argocd-server” với “LoadBalancer”.

Truy cập lại bằng external-IP hoặc domain nếu cài ingess. Đường dẫn UI http://:80

User đăng nhập là admin. Lấy mật khẩu qua lệnh sau

kubectl -n argocd get secret argocd-secret -o jsonpath="{.data.clearPassword}" | base64 -d

Cài Gitops

Trước tiên các bạn tạo một K8s Secret để K8s pull image từ Container Registry

kubectl create -n example-dev secret docker-registry gitlab-creds-secret \
--docker-server=https://registry.gitlab.com \
--docker-username=<username> \
--docker-password=<password>

username: username gitlab

password: access token user gitlab

Sau khi cài xong argocd bây giờ chúng ta tạo ứng dụng trên argocd. Các bạn có thể tạo trên UI của argocd hoặc tạo các file manifest trên repo gitops

Tạo folder argocd-apps

example-dev-apps.yml

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: example-dev-apps
namespace: argocd
spec:
project: default
source: 
repoURL: https://gitlab.com/devops-demo7/gitops.git
targetRevision: HEAD
path: envs/dev
destination:
server: https://kubernetes.default.svc
namespace: dexample-dev
syncPolicy:
automated:
prune: true
example-prod-apps.yml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: example-prod-apps
namespace: argocd
spec:
project: default
source: 
repoURL: https://gitlab.com/devops-demo7/gitops.git
targetRevision: HEAD
path: envs/prod
destination:
server: https://kubernetes.default.svc
namespace: example-prod
syncPolicy:
automated:
prune: true

Sau đó chạy lệnh apply

kubectl apply -f example-dev-apps.yml
kubectl apply -f example-prod-apps.yml

Kiểm tra qua UI hoặc lệnh sau để thấy pod,svc ứng dụng được tạo

kubectl get pods -n example-dev
kubectl get svc -n example-dev

OK như vậy ta đã triển khai thành công ứng dụng qua argocd. Nếu báo lỗi các bạn Argocd” >> “Settings” >> “Repositories” Edit nhập username và password Secret ở trên

Trigger

Để ứng dụng tự động triển khai khi có commit code từ source code ứng dụng các bạn bổ sung thêm state trong gitlab-ci.yml bên soucre code ứng dụng

Trên dev

deploy-dev:
stage: deploy-dev
image: alpine:3.8
before_script:
- apk add --no-cache git curl bash
- curl -s "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh" | bash
- mv kustomize /usr/local/bin/
- git clone https://${CI_USERNAME}:${CI_PUSH_TOKEN}@gitlab.com/<USERS>/gitops.git
- git config --global user.email "[email protected]"
- git config --global user.name "GitLab CI/CD"
script:
- git checkout master
- cd envs/dev
- kustomize edit set image $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
- cat kustomization.yml
- git commit -am '[skip ci] DEV image update'
- git push origin master
only:
- master

Trên prod

deploy-prod:
stage: deploy-prod
image: alpine:3.8
before_script:
- apk add --no-cache git curl bash
- curl -s "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh" | bash
- mv kustomize /usr/local/bin/
- git clone https://${CI_USERNAME}:${CI_PUSH_TOKEN}@gitlab.com/andrew.kaczynski/gitops.git
- git config --global user.email "[email protected]"
- git config --global user.name "GitLab CI/CD"
script:
- git checkout master
- git pull origin master
- cd gitops/envs/prod
- kustomize edit set image $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
- cat kustomization.yml
- git commit -am '[skip ci] PROD image update'
- git push origin master
only:
- master
when: manual

Mời cà phê

Nếu cảm thấy blog mang đến những thông tin hữu ích cho công việc, cuộc sống, đam mê của bạn, đừng ngại ủng hộ một ly cà phê để mình có thêm động lực chia sẻ thêm nhiều kinh nghiệm, kiến thức nhé.

Bạn có thể ủng hộ mình qua:

Ví MoMo

image.png

Ví MoMo

Paypal

Hỗ trợ qua Paypal

Cám ơn mọi người!