Hello các bạn,
Có nhiều cách triển khai ứng dụng trên K8s. Trong bào viết này mình chia sẻ các bạn 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.
Nội dung:
- Mô hình
- 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
1.Mô hình
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…)
2. 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
File này quá quen. thuộc với mọi ngưởi rồi phải không? thì mình không giải thích gì thêm nữa. Các bạn quên thì xem lại video này của mình
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
3.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
3.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…
Bạn nào chưa biết tham khảo video này của mình
4.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://<external-ip>:80

kubectl -n argocd get secret argocd-secret -o jsonpath="{.data.clearPassword}" | base64 -d
5. 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
6.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 "gitlab@gitlab.com" - 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 "gitlab@gitlab.com" - 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
7. Tổng kết
Như vậy qua bài viết này mình chia sẻ các bạn cách triển khai một ứng dụng trên K8s dùng Gitops.
Chúc các bạn thành công!
Cảm ơn bạn đã trả lời.