Published on

Triển khai Istio trên Kubernetes bằng Argo CD

Giới thiệu

Trong các bài viết trước, mình đã giới thiệu nhiều về Kubernetes, cách deploy các công cụ phổ biến phục vụ các tác vụ: monitoring, CI/CD, GitOps, ...

Lần này, mình sẽ trình bày về Service mesh trên Kubernetes. Như chúng ta đã biết, service mesh trên Kubernetes là một tầng cơ sở hạ tầng đặc biệt được thiết kế để quản lý, quan sát và kiểm soát giao tiếp giữa các microservices trong một cụm Kubernetes.

Để hiểu rõ hơn, hãy xem xét các điểm sau:

Microservices là gì

Microservices là một kiến trúc phát triển ứng dụng phân tán, trong đó ứng dụng được chia thành các phần nhỏ gọi là microservices. Mỗi microservice thực hiện một chức năng cụ thể và có thể chạy độc lập.

Service Mesh là gì?

Service mesh là một tầng mạng riêng biệt mà bạn có thể thêm vào ứng dụng của mình. Nó giúp quản lý giao tiếp giữa các microservices. Service mesh giải quyết các thách thức như xác thực, ủy quyền, định tuyến giữa các phiên bản và dịch vụ khác nhau, mã hóa và cân bằng tải.

Service Mesh trên Kubernetes

Service mesh trên Kubernetes thường được triển khai dưới dạng một tập hợp các proxy Layer 7. Những proxy này được triển khai cùng với mã ứng dụng và quản lý giao tiếp giữa các microservices. Service mesh giúp trừu tượng hóa việc quản lý giao tiếp giữa các microservices, giống như cách containers trừu tượng hóa hệ điều hành khỏi ứng dụng.

Lợi ích của Service Mesh trên Kubernetes:

  • Quản lý: Service mesh giúp quản lý giao tiếp giữa các microservices một cách dễ dàng và có thể mở rộng.
  • Quan sát: Nó cung cấp khả năng theo dõi và ghi nhận thông tin về lưu lượng giao tiếp.
  • Bảo mật: Service mesh hỗ trợ xác thực, mã hóa và kiểm soát truy cập.

Service mesh trên Kubernetes giúp đơn giản hóa việc quản lý giao tiếp giữa các microservices và đảm bảo tính đáng tin cậy của ứng dụng.

Nếu như chúng ta nhìn vào Cloud Native Landscape thì có thể thấy rằng có khá nhiều công cụ hỗ trợ triển khai Services mesh trên Kubernetes.

Trong bài viết này, mình sẽ sử dụng Argo CD để cài đặt và cấu hình Istio, đây là 1 trong 2 dự án đã "GRADUATED".

Istio

Quá trình phát triển

Istio được phát triển bởi Google, IBM và Lyft từ năm 2016 với mục tiêu ban đầu của Istio là giải quyết các vấn đề quản lý microservice trên Kubernetes.

Sau đó 1 năm, Istio được công bố lần đầu tiên tại KubeCon + CloudNativeCon NA 2017 và tiếp sau đó nó được CNCF (Cloud Native Computing Foundation) tiếp nhận vào năm 2018.

Hiện tại nó vẫn liên tục được phát triển cải tiến.

Kiến trúc

Istio bao gồm các thành phần chính sau:

  • Proxy: Proxy là một sidecar được triển khai cùng với mỗi microservice. Proxy chịu trách nhiệm xử lý tất cả lưu lượng truy cập đến và đi từ microservice.
  • Control plane: Control plane là tập hợp các thành phần quản lý proxy và cấu hình service mesh.
  • Data plane: Data plane là tập hợp các proxy xử lý lưu lượng truy cập giữa các microservice.

Cài đặt trên Kuberentes

Có ba cách để cài đặt Istio:

  • Dùng công cụ istioctl: Dành cho việc thử nghiệm và tìm hiểu.
  • Dùng istio-operator: Dành cho triển khai sản phẩm hoặc đánh giá hiệu suất.
  • Dùng Helm: Dành cho cài đặt Istio Helm Chart.

Mình sẽ sử dụng cách thứ 3 và sử dụng Argo CD để triển khai các Helm chart của istio.

istio-application.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: istio-system
  namespace: argocd
  finalizers:
    - resources-finalizer.argocd.argoproj.io
spec:
  syncPolicy:
    automated:
      selfHeal: true
      prune: true
      allowEmpty: false
    syncOptions:
      - Validate=false
      - CreateNamespace=true
      - PrunePropagationPolicy=foreground
      - PruneLast=true
      - RespectIgnoreDifferences=true
      - Replace=true
  project: default
  sources:
    - chart: base
      repoURL: https://istio-release.storage.googleapis.com/charts
      targetRevision: 1.*
      helm:
        releaseName: istio-base
        passCredentials: false
    - chart: istiod
      repoURL: https://istio-release.storage.googleapis.com/charts
      targetRevision: 1.*
      helm:
        releaseName: istiod
        passCredentials: false
        parameters:
          - name: "pilot.cni.enabled"
            value: "true"
  destination:
    server: "https://kubernetes.default.svc"
    namespace: istio-system
  revisionHistoryLimit: 3
  ignoreDifferences:
    - group: admissionregistration.k8s.io
      kind: ValidatingWebhookConfiguration
      name: istiod-default-validator
      jsonPointers:
        - /webhooks/0/failurePolicy

Sau đó lưu lại file và chúng ta chỉ cần dùng kubectl apply -f istio-application.yaml để cài đặt trên cluster.

Chúng ta có thể chạy kubectl -n istio-system get all để kiểm tra trạng thái:

kubectl -n istio-system get all
NAME                         READY   STATUS    RESTARTS   AGE
pod/istiod-bc4584967-bm52w   1/1     Running   0          7d23h

NAME             TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)                                 AGE
service/istiod   ClusterIP   10.97.24.18   <none>        15010/TCP,15012/TCP,443/TCP,15014/TCP   7d23h

NAME                     READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/istiod   1/1     1            1           7d23h

NAME                               DESIRED   CURRENT   READY   AGE
replicaset.apps/istiod-bc4584967   1         1         1       7d23h

NAME                                         REFERENCE           TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
horizontalpodautoscaler.autoscaling/istiod   Deployment/istiod   0%/80%    1         5         1          7d23h

Như vậy mình đã giới thiệu xong cách cài đặt Helm chart istio bằng Argo CD trên Kubernetes.

Bài viết sau mình sẽ hướng dẫn tạo 1 Gateway và HTTPRoute để trỏ đến ứng dụng httpbin.

Chúc thành công,

ANH NGUYỄN