Blog Chia SẻBlog Chia Sẻ

Kubernetes CICD – triển khai ứng dụng trên Kubernetes với Argo CD

0

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.

  • 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')
Chạy python hello-k8s.py để xem kết quả
Tiếp theo tạo một Dockerfile. Dockerfile này để build image cơ bản nội dung file hello-k8s.py ở trên.
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" ]
Chạy lệnh sau để build
docker build -t hello-k8s:1.0 .
Và lệnh sau để chạy test thử
docker run -p 5000:5000 -d hello-k8s:1.0
Kiểm tra vào localhost:5000 thấy xuất hiện hello-k8s! là ok rồi đó
Sau đó các bạn push image này lên docker hub của các bạn. Nhớ gắn tag user và login bằng user docker login các bạn trước nhé. Như user của mình là tonykien2012
docker push tonykien2012/hello-k8s:1.0

3. Cài đặt GitHub để chạy continuous integration (CI)

Các bạn tạo file CI hello-k8s-dockerhub.yml trong thư mục .github/workflows trên repo code của mình.
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
Khai báo Docker Hub username và token GitHub Repository secrets bằng cách vào repository → Settings → Secrets → Actions.
  • DOCKERHUB_USERNAME —  Docker Hub username
  • DOCKERHUB_TOKEN —  Docker Hub token
Sau khi khai báo xong các bạn push code mà chạy như này thì ok.

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
File ingress.yaml để khai báo domain public ra bên ngoài
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âu hỏi/câu trả lời này có giải quyết được sự cố của bạn không?

Đánh giá

Ý kiến ​​(không bắt buộc)

0Nó rất hữu ích cho mọi người.

Tìm kiếm

Xem các câu hỏi liên quan