- Đăng vào
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.
![](/_next/image?url=%2Fstatic%2Fimages%2Ftrien-khai-istio-tren-kubernetes-bang-argocd%2Flandscape-service-mesh.png&w=3840&q=75)
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.
![](/_next/image?url=%2Fstatic%2Fimages%2Ftrien-khai-istio-tren-kubernetes-bang-argocd%2Fistio-arch.jpg&w=3840&q=75)
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.
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