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.