Giới thiệu

Chào mọi người, bài viết hôm nay mình sẽ chia sẻ chi tiết cách triển khai một ứng dụng lên K8S với ArgoCD. Trước tiên chúng ta hãy nói về ArgoCD, ArgoCD là một công cụ triển khai liên tục (Continuous Delivery - CD) theo mô hình GitOps dành cho Kubernetes. Nó giúp tự động hóa việc triển khai và quản lý trạng thái của các ứng dụng Kubernetes dựa trên các manifest được lưu trữ trong Git repository.
Nào hãy cùng mình tìm hiểu chi tiết cách triển khai một ứng dụng với ArgoCD.

Chuẩn bị

Trước khi bắt đầu, hãy đảm bảo rằng mọi người đã cài đặt và chuẩn bị những công cụ cần thiết

  • K8S cluster: Mình sẽ sử dụng kind(kubernetes in docker), kind là một công cụ hỗ trợ cho việc setup Kubernetes ở local, và rất dễ dàng cài đặt.
  • kubectl: Cài đặt K8S command-line, kubectl để tương tác trực tiếp với cụm K8S.
  • Git, Github: Github sẽ là nơi mình dùng để lưu trữ manifest cho ứng dụng của mình, cũng là nơi mà ArgoCD pull manifest về để triển khai.

Ở bài viết này, mình chọn Keycloak làm ứng dụng mà sẽ được triển khai bằng ArgoCD. Lý do mình chọn nó là do Keycloak là một giải pháp quản lý danh tính và truy cập mã nguồn mở, cung cấp các tính năng như xác thực, ủy quyền và quản lý người dùng. Vì nó là mã nguồn mở nên được sử dụng rộng rãi ở nhiều tổ chức lớn.

Dưới đây là diagram mô tả về kiến trúc mà chúng ta sẽ triển khai.
diagram-architect

Các bước triển khai ứng dụng

Tạo K8S cluster bằng kind và setup Ingress cho cluster

Tạo 1 file kind-argocd.yaml với cấu hình dưới đây:

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
  kubeadmConfigPatches:
  - |
    kind: InitConfiguration
    nodeRegistration:
      kubeletExtraArgs:
        node-labels: "ingress-ready=true"    
  extraPortMappings:
  - containerPort: 80
    hostPort: 80
    protocol: TCP
  - containerPort: 443
    hostPort: 443
    protocol: TCP

Chạy câu lệnh này để tạo kind cluster có tên bienhnit

kind create cluster --config=kind-argocd.yaml --name bienhnit
create kind cluster
create kind cluster

Để add ingress cho cluster, chúng ta sẽ cài đặt Ingress controller bằng câu lệnh sau đây:

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/kind/deploy.yaml

Cài đặt ArgoCD lên cluster

Để cài đặt ArgoCD lên cluster, chúng ta chạy câu lệnh sau đây:

kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

Để truy cập vào ArgoCD sau này, chúng ta cần setup ingress. Tạo một file ingress-argocd.yaml với cấu hình sau đây

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: argocd-server-ingress
  namespace: argocd
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
    alb.ingress.kubernetes.io/ssl-passthrough: "true"
    nginx.ingress.kubernetes.io/force-ssl-redirect: "false"
spec:
  rules:
  - host: argocd-server-bienhnit.local
    http:
      paths:
      - pathType: Prefix
        path: /
        backend:
          service:
            name: argocd-server
            port:
              number: 443

Sau đó chạy câu lệnh này để cài đặt ingress cho ArgoCD:

kubectl apply -f ingress-argocd.yaml

Kiểm tra xem các pods của ArgoCD đã running chưa:
check ArgoCD pods status

Để login vào ArgoCD, chúng ta cần lấy được mật khẩu của admin:

kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d && echo
get ArgoCD admin password
get ArgoCD admin password

Để có thể truy cập ArgoCD server bằng URL https://argocd-server-bienhnit.local, chúng ta sẽ cần chỉnh sửa file /etc/hosts trên máy của mình.
edit hosts in local machine

Tạo manifest cho ứng dụng Keycloak trên Github

Tạo một repo trên git với cấu trúc dưới đây(tham khảo repo của mìnhargocd-lab)

argocd-lab
    keycloak
        deployment.yaml
        service.yaml

Cấu hình của file deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: keycloak
  namespace: bienhnit-auth
  labels:
    app: keycloak
spec:
  replicas: 1
  selector:
    matchLabels:
      app: keycloak
  template:
    metadata:
      labels:
        app: keycloak
    spec:
      containers:
      - name: keycloak
        image: quay.io/keycloak/keycloak:24.0.5
        args: ["start-dev"]
        ports:
        - name: http
          containerPort: 8080
        env:
        - name: KEYCLOAK_ADMIN
          value: "admin"
        - name: KEYCLOAK_ADMIN_PASSWORD
          value: "admin"
        - name: KC_PROXY
          value: "edge"
        - name: KC_HTTP_PORT
          value: "8080"
        - name: KC_HOSTNAME_STRICT
          value: "false"
        - name: KC_HOSTNAME_STRICT_HTTPS
          value: "false"
        - name: KC_HTTP_ENABLED
          value: "true"
        - name: KC_PROXY_ADDRESS_FORWARDING
          value: "true"
        readinessProbe:
          httpGet:
            path: /realms/master
            port: 8080
          initialDelaySeconds: 30
          periodSeconds: 10
          failureThreshold: 3
        resources:
          limits:
            cpu: "1"
            memory: "1024Mi"
          requests:
            cpu: "500m"
            memory: "512Mi"

Cấu hình của file service.yaml

apiVersion: v1
kind: Service
metadata:
  name: keycloak
  namespace: bienhnit-auth
spec:
  type: NodePort
  ports:
  - port: 8080
    targetPort: 8080
    nodePort: 30008
  selector:
    app: keycloak

Trên cluster, tạo một namespace để triển khai keycloak.

kubectl create namespace bienhnit-auth

Truy cập vào ArgoCD và triển khai ứng dụng Keycloak

Truy cập vào https://argocd-server-bienhnit.local với username là admin và mật khẩu là chuỗi mà mình đã lấy được ở bước trên.

Kết nối ArgoCD với github repo mình đã tạo ở trên.
connect to Github repoconnect to Github repo

Khi kết nối thành công, status sẽ chuyển thành Successful.
connect to the repo successfully

Sau đó, tạo mới một application với cấu hình dưới đây:

configuration-1
configuration-2

Sau khi triển khai thành công, cấu hình của ứng dụng sẽ được hiển thị như thế này.
Keycloak application state

Kiểm tra resource trên cluster.
keycloak pods state

Sau đó chúng ta sẽ thử truy cập vào ứng dụng Keycloak để xem kết quả.

Keycloak login
Keycloak Admin Page

Kể từ bây giờ, nếu chúng ta cần thay đổi bất kỳ cấu hình nào của Keycloak, mình chỉ cần chỉnh sửa code và commit lên repo https://github.com/bienblue/argocd-lab.git thì argocd sẽ tự động sync về và apply những cái thay đổi lên Keycloak application.

Kiểm tra chức năng sync automatically - gitops

Chúng ta hãy thử chỉnh sửa cấu hình hiện tại của keycloak và để xem ArgoCD sẽ xử lý như thế nào nhé.
Hiện tại thì replicas của Keycloak đang là 1, mình sẽ thử chỉnh sửa manifest và tăng số replicas lên thành 2 với commit này: https://github.com/bienblue/argocd-lab/pull/4/commits/76ec33337a15312effa36f36dc3c1a1ff22e7abb

Update Keycloak manifest
Update Keycloak manifest

Và hãy xem Application Keycloak trên ArgoCD nhé, số pod Keycloak đã tăng lên thành 2.
Keycloak Application State 2

Kiểm tra resource trên cluster lại nhé -> số pods của Keyloak đã tăng lên thành 2 pod:
Keycloak Pod state 2

Kết Luận

Như vậy là mình đã cùng mọi người thực hiện triển khai ứng dụng Keycloak lên K8S cluster bằng ArgoCD. Với ArgoCD, việc quản lý và triển khai các ứng dụng Kubernetes trở nên dễ dàng và hiệu quả hơn rất nhiều. Hy vọng bài viết này sẽ giúp các bạn hiểu rõ hơn về cách sử dụng ArgoCD để triển khai các ứng dụng của mình.
Hẹn gặp lại mọi người ở những bài viết tiếp theo.