Việc triển khai ứng dụng trên Kubernetes có nhiều cách khác nhau. Để đơn giản hoá trong việc triển khai hôm nay mình chia sẻ các bạn một tool Gitops đó là Argo CD.
Tóm tắt các bước trong bài lab này:
- Cài Argo CD trên K8S
- Một image python Flask App
- Cài đặt GitHub để chạy continuous integration (CI)
- Triển khai một ứng dụng Argo CD và đồng bộ trên K8S

Kubernetes CI/CD
1. Cài Argo CD trên K8S
Các bạn chuẩn bị một môi trường lab dùng minikube, kubernetes digital ocean, gke, eks, aks… Nếu chưa biết cách đăng kí thì xem lại video này của mình. Sau khi có cluster kubernetes rồi chúng ta bắt đầu thôi
1.1 Cài một cert-manager
Mục đích cài cert-manager là để tạo chứng chỉ ssl cho domain.
helm repo add jetstack https://charts.jetstack.io helm repo update kubectl create namespace cert-manager kubectl get namespaces kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.9.1/cert-manager.crds.yaml helm install my-release --namespace cert-manager --version v1.9.1 jetstack/cert-manager
2.2 Cài Nginx Ingress Controller
Nginx Ingress Controller để quản lí việc external IP loadbalacer ra bên ngoài
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx helm repo update helm install nginx-ingress ingress-nginx/ingress-nginx --set controller.publishService.enabled=true kubectl --namespace default get services -o wide -w nginx-ingress-ingress-nginx-controller
2.3 Cài Argo CD
Tạo một namspace argocd
kubectl create namespace argocd
Các bạn có thể cài bằng lệnh bên dưới hoặc bằng helm chart
- Bằng lệnh
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
- Bằng helm chart
Tạo file chart Chart.yaml
apiVersion: v2 name: argocd version: 5.20.3 dependencies: - name: argo-cd version: 5.20.3 appVersion: v2.6.1 repository: https://argoproj.github.io/argo-helm
Tạo file value chart values.yaml
argo-cd: crds: # -- Install and upgrade CRDs install: true # -- Keep CRDs on chart uninstall keep: true controller: replicas: 1 args: # -- define the application controller `--app-resync` appResyncPeriod: "30" # -- define the application controller `--status-processors` statusProcessors: "20" # -- define the application controller `--operation-processors` operationProcessors: "10" # -- define the application controller `--self-heal-timeout-seconds` selfHealTimeout: "3" # -- define the application controller `--repo-server-timeout-seconds` repoServerTimeoutSeconds: "60" server: extraArgs: - --insecure replicas: 1 ingress: enabled: true annotations: kubernetes.io/ingress.class: "nginx" cert-manager.io/cluster-issuer: letsencrypt-prod-argocd kubernetes.io/tls-acme: "true" nginx.ingress.kubernetes.io/ssl-passthrough: "true" hosts: - argocd.vuihoctech.com paths: - / tls: - secretName: argocd5-tls-certificate hosts: - argocd.vuihoctech.com configEnabled: true config: url: https://argocd.vuihoctech.com exec.enabled: "true" accounts.user: apiKey, login repositories: | - name: main-repo type: git url: https://gitlab.com/tonykien2012/agocd5-helm.git usernameSecret: name: git-creds key: username passwordSecret: name: git-creds key: password # - name: acr-charts # type: helm # enableOci: true # url: registry.gitlab.com/tonykien2012/app-demo-helmchart # username: argocd-gitlab # password: x5dtUqgitoBZQ75qicP5 rbacConfig: policy.csv: | p, role:dev, applications, sync, */*, allow p, role:dev, applications, get, */*, allow p, role:dev, certificates, get, *, allow p, role:dev, clusters, get, *, allow p, role:dev, repositories, get, *, allow p, role:dev, projects, get, *, allow p, role:dev, accounts, get, *, allow p, role:dev, gpgkeys, get, */*, allow g, user, role:dev
Chạy lệnh sau để cài đặt argo cd bằng helm chart. Lưu ý máy tính các bạn đã cài tool helm chart rồi nhé. Nếu chưa thì xem ở đây.
helm install argocd argocd -f argocd/values.yaml --namespace=argocd
Với cách bằng dòng lệnh các bạn phải forward ra ngoài để try cập bằng giao diện UI còn đối với cách bằng helm thì các bạn thêm domain rồi thì vào bằng domain
kubectl port-forward svc/argocd-server -n argocd 8080:443
Đăng nhập localhost:8080 hoặc https://argocd.domain.com với user là admin và lấy mật khẩu bằng câu lệnh sau
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d; echo

Đến đây các bạn hoàn thành việc cài xong Argo CD rồi đó.
2. Tạo một ứng dụng python Flask App đơn giản
Trước tiên ta tạo một app python đơn giản hello-k8s.py
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello k8s 3.0!"
if __name__ == "__main__":
app.run(host='0.0.0.0')
FROM python:3.8 LABEL maintainer="KienLe TV" COPY . /app WORKDIR /app RUN pip install flask werkzeug # command to run on container start CMD [ "python", "hello-k8s.py" ]
docker build -t hello-k8s:1.0 .
docker run -p 5000:5000 -d hello-k8s:1.0
docker push tonykien2012/hello-k8s:1.0
3. Cài đặt GitHub để chạy continuous integration (CI)
name: hello-k8s - Package with Docker
# Controls when the action will run. Triggers the workflow on push or pull request
# events but only for the main branch
on:
push:
branches: [main]
jobs:
# This workflow contains a single job called "build"
build:
# The type of runner that the job will run on
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3.0.2
- name: Set up QEMU
uses: docker/setup-qemu-action@v2.0.0
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2.0.0
- name: Login to DockerHub
uses: docker/login-action@v2.0.0
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build and push Docker images
uses: docker/build-push-action@v3.1.1
with:
context: ./project/.
file: ./project/Dockerfile
platforms: linux/amd64
push: true
tags: tonykien2012/hello-k8s:1.0
- DOCKERHUB_USERNAME — Docker Hub username
- DOCKERHUB_TOKEN — Docker Hub token

3. Triển khai một ứng dụng Argo CD và đồng bộ trên K8S
Bạn có thể tạo qua ứng dụng UI của Argo CD hoặc file yaml
Ở đây mình tạo một file hello-k8s-application.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: hello-k8s
namespace: argocd
spec:
destination:
namespace: default
server: https://kubernetes.default.svc
project: default
source:
path: argocd/hello-k8s-manifest
repoURL: https://github.com/kienle1819/K8s-CICD
targetRevision: HEAD
syncPolicy: {}
Ở đây các bạn khai báo:
- name: tên ứng dụng
- namespace
- path: đường dẫn chứa file deployment
- repoURL : repo code triển khai
Tiếp theo các bạn tạo các file để triển khai app trong đường dẫn argocd/hello-k8s-manifest:
File deployment hello-k8s-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: hello-k8s
name: hello-k8s
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: hello-k8s
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
labels:
app: hello-k8s
spec:
containers:
- image: kienle1819/hello-k8s:1.0
imagePullPolicy: Always
name: hello-k8s
resources:
requests:
cpu: 50m
memory: 256Mi
File service.yaml để tạo svc với deployment
apiVersion: v1
kind: Service
metadata:
name: hello-k8s
spec:
ports:
- port: 5000
targetPort: 5000
selector:
app: hello-k8s
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: hello-k8s-ingress
annotations:
cert-manager.io/cluster-issuer: "letsencrypt-prod-argocd"
kubernetes.io/ingress.class: "nginx"
spec:
tls:
- hosts:
- hello-k8s.vuihoctech.com
secretName: hello-k8s-tls
rules:
- host: hello-k8s.vuihoctech.com
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: hello-k8s
port:
number: 5000
Sau khi tạo xong các bạn chạy lệnh sau để deploy
kubectl apply -f hello-k8s-application.yaml
Bạn sẽ thấy app được tạo qua UI của Argo CD

Các bạn bấm sync để đổng bộ.

Bạn try cập vào domain để xem kết quả

Để việc triển khai các bạn thêm option sau và file hello-k8s-application.yaml
spec:
syncPolicy:
automated: {}
Sau đó các bạn apply lại.
kubectl apply -f hello-k8s-application.yaml
Như vậy chúng ta hoàn thành được việc triển khai một app thông qua Argo CD hoàn toàn tự động. Các bạn thử sửa một file nào đó trong repo và push lại sẽ thấy kết quả
Trong phần này có một lưu ý là các bạn thấy domain ở trên mình dùng ssl. Nó ở đâu ra vậy thì các bạn nhờ ở đầu mình có cài cert-manager thằng này nó giúp tạo cert và các bạn chạy thêm file bên dưới để tạo được ssl miễn phí letsencrypt-prod.yaml
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod-argocd
spec:
acme:
# Email address used for ACME registration
email: kienle1819@gmail.com
server: https://acme-v02.api.letsencrypt.org/directory
privateKeySecretRef:
# Name of a secret used to store the ACME account private key
name: letsencrypt-prod-private-key
# Add a single challenge solver, HTTP01 using nginx
solvers:
- http01:
ingress:
class: nginx
Sau đó chạy lệnh sau để tạo
kubectl apply -f letsencrypt-prod.yaml
4. Tổng kết
Đến đây bài viết cũng dài rồi mình tái búi tại đây. Qua bài này các bạn biết được cách triển khai một ứng dụng trên Kubernetes thông qua một tool gitops là Argo CD thay vì các bạn chạy file yaml cơ bản như trước đây. Ở bài viết tiếp theo mình chia sẻ các bạn cách triển khai một ứng dụng trên Kubernetes dùng Helm chart.
Chúc các bạn thành công!

Cảm ơn bạn đã trả lời.