Cách cài đặt và sử dụng Istio Với Kubernetes
Lưới dịch vụ là một lớp cơ sở hạ tầng cho phép bạn quản lý giao tiếp giữa các dịch vụ nhỏ của ứng dụng. Khi nhiều nhà phát triển làm việc với microservices, các lưới dịch vụ đã phát triển để làm cho công việc đó dễ dàng và hiệu quả hơn bằng cách hợp nhất các việc quản lý và quản trị chung trong một cài đặt phân tán.Sử dụng lưới dịch vụ như Istio có thể đơn giản hóa các việc như khám phá dịch vụ, định tuyến và cấu hình lưu lượng, mã hóa và xác thực / ủy quyền, giám sát và đo từ xa. Cụ thể, Istio được thiết kế để hoạt động mà không có những thay đổi lớn đối với mã dịch vụ đã có từ trước. Ví dụ: khi làm việc với Kubernetes , bạn có thể thêm các khả năng của lưới dịch vụ vào các ứng dụng đang chạy trong cụm của bạn bằng cách xây dựng các đối tượng dành riêng cho Istio hoạt động với các tài nguyên ứng dụng hiện có.
Trong hướng dẫn này, bạn sẽ cài đặt Istio bằng trình quản lý gói Helm cho Kubernetes. Sau đó, bạn sẽ sử dụng Istio để hiển thị ứng dụng Node.js demo với lưu lượng bên ngoài bằng cách tạo tài nguyên Gateway và Dịch vụ ảo . Cuối cùng, bạn sẽ truy cập addon đo từ xa Grafana để trực quan hóa dữ liệu lưu lượng ứng dụng của bạn .
Yêu cầu
Để hoàn thành hướng dẫn này, bạn cần :
- Một cụm Kubernetes 1.10+ được bật kiểm soát truy cập dựa trên role (RBAC). Cài đặt này sẽ sử dụng một cụm DigitalOcean Kubernetes với ba nút, nhưng bạn có thể tự do tạo một cụm bằng phương pháp khác .
 
 Lưu ý:  Ta  thực sự khuyên bạn nên sử dụng cụm có ít nhất 8GB bộ nhớ khả dụng và 4vCPU cho  cài đặt  này. Hướng dẫn này sẽ sử dụng ba trong số các  server  4GB / 2vCPU tiêu chuẩn của DigitalOcean làm nút.
-  Công cụ dòng lệnh 
kubectlđược cài đặt trên server phát triển và được cấu hình để kết nối với cụm của bạn. Bạn có thể đọc thêm về cách cài đặtkubectltrong tài liệu chính thức . - Helm được cài đặt trên server phát triển của bạn và Tiller được cài đặt trên cụm của bạn, theo các hướng dẫn được nêu trong Bước 1 và 2 của Cách cài đặt phần mềm trên Kubernetes Cluster bằng Trình quản lý gói Helm .
 -  Docker được cài đặt trên  server  phát triển của bạn. Nếu bạn đang làm việc với Ubuntu 18.04, hãy làm theo Bước 1 và 2 của Cách cài đặt và sử dụng Docker trên Ubuntu 18.04 ; nếu không, hãy làm theo tài liệu chính thức để biết thông tin về cách cài đặt trên các hệ điều hành khác. Đảm bảo thêm  user  không phải root của bạn vào  group  
docker, như được mô tả trong Bước 2 của hướng dẫn được liên kết. - Một account Docker Hub . Để biết tổng quan về cách cài đặt , hãy tham khảo phần giới thiệu về Docker Hub này.
 
Bước 1 - Đóng gói ứng dụng
 Để sử dụng ứng dụng demo của  ta  với Kubernetes,  ta   cần  sao chép mã và đóng gói nó để tác nhân kubelet có thể kéo hình ảnh.
Bước đầu tiên của ta sẽ là sao chép repository nodejs-image-demo từ tài khoản GitHub của Cộng đồng DigitalOcean . Kho lưu trữ này bao gồm mã từ cài đặt được mô tả trong Cách tạo ứng dụng Node.js với Docker , mô tả cách tạo hình ảnh cho ứng dụng Node.js và cách tạo containers bằng hình ảnh này. Bạn có thể tìm thêm thông tin về ứng dụng trong loạt bài Từ containers đến Kubernetes với Node.js.
Để bắt đầu, hãy sao chép repository  nodejs-image-demo vào một folder  có tên istio_project :
- git clone https://github.com/do-community/nodejs-image-demo.git istio_project 
 
Điều hướng đến folder  istio_project :
- cd istio_project 
 
Thư mục này chứa các file và folder cho ứng dụng thông tin cá mập cung cấp cho user thông tin cơ bản về cá mập. Ngoài các file ứng dụng, folder chứa một file Docker với hướng dẫn xây dựng Docker image bằng mã ứng dụng. Để biết thêm thông tin về hướng dẫn trong Dockerfile, hãy xem Bước 3 của Cách tạo ứng dụng Node.js với Docker .
 Để kiểm tra xem mã ứng dụng và Dockerfile có hoạt động như mong đợi hay không, bạn có thể xây dựng và gắn thẻ hình ảnh bằng lệnh docker build , sau đó sử dụng hình ảnh để chạy containers  demo. Sử dụng cờ -t với bản docker build sẽ cho phép bạn gắn thẻ hình ảnh bằng tên  user  Docker Hub  của bạn  để bạn có thể đẩy nó lên Docker Hub sau khi đã thử nghiệm.
Xây dựng hình ảnh bằng lệnh sau:
- docker build -t your_dockerhub_username/node-demo . 
 
Các . trong lệnh chỉ định rằng ngữ cảnh xây dựng là folder  hiện tại.  Ta  đã đặt tên cho bản trình diễn node-demo hình ảnh, nhưng bạn có thể đặt tên khác cho nó.
 Khi quá trình xây dựng hoàn tất, bạn có thể liệt kê hình ảnh  của bạn  với docker images :
- docker images 
 
Bạn sẽ thấy kết quả sau xác nhận việc xây dựng hình ảnh:
OutputREPOSITORY                          TAG                 IMAGE ID            CREATED             SIZE your_dockerhub_username/node-demo   latest              37f1c2939dbf        5 seconds ago       77.6MB node                                10-alpine           9dfa73010b19        2 days ago          75.3MB Tiếp theo, bạn sẽ sử dụng docker run để tạo containers  dựa trên hình ảnh này.  Ta  sẽ bao gồm ba cờ với lệnh này:
-  
-p: Điều này xuất bản cổng trên containers và ánh xạ nó tới một cổng trên server của ta . Ta sẽ sử dụng cổng80trên server lưu trữ, nhưng bạn nên sửa đổi điều này nếu cần nếu bạn có một quy trình khác đang chạy trên cổng đó. Để biết thêm thông tin về cách thức hoạt động, hãy xem thảo luận này trong tài liệu Docker về cổng kết nối . -  
-d: Thao tác này chạy containers trong nền. -  
--name: Điều này cho phép ta đặt tên tùy chỉnh cho containers . 
Chạy lệnh sau để tạo containers :
- docker run --name node-demo -p 80:8080 -d your_dockerhub_username/node-demo 
 
Kiểm tra các containers  đang chạy của bạn bằng docker ps :
- docker ps 
 
Bạn sẽ thấy kết quả xác nhận containers ứng dụng của bạn đang chạy:
OutputCONTAINER ID        IMAGE                               COMMAND                  CREATED             STATUS              PORTS                  NAMES 49a67bafc325        your_dockerhub_username/node-demo   "docker-entrypoint.s…"   8 seconds ago       Up 6 seconds        0.0.0.0:80->8080/tcp   node-demo  Đến đây bạn  có thể truy cập IP  server   của bạn  để kiểm tra  cài đặt   của bạn : http:// your_server_ip . Ứng dụng của bạn sẽ hiển thị trang đích sau: 
  Đến đây bạn  đã kiểm tra ứng dụng, bạn có thể dừng containers  đang chạy. Sử dụng lại docker ps để lấy CONTAINER ID của bạn:
- docker ps 
 
OutputCONTAINER ID        IMAGE                               COMMAND                  CREATED              STATUS              PORTS                  NAMES 49a67bafc325        your_dockerhub_username/node-demo   "docker-entrypoint.s…"   About a minute ago   Up About a minute   0.0.0.0:80->8080/tcp   node-demo Dừng container bằng docker stop . Đảm bảo thay thế CONTAINER ID được liệt kê ở đây bằng CONTAINER ID ứng dụng  của bạn :
- docker stop 49a67bafc325 
 
Đến đây bạn đã kiểm tra hình ảnh, bạn có thể đẩy nó vào Docker Hub. Đầu tiên, đăng nhập vào account Docker Hub mà bạn đã tạo trong yêu cầu :
- docker login -u your_dockerhub_username  
 
Khi  được yêu cầu , hãy nhập password  account  Docker Hub của bạn. Đăng nhập theo cách này sẽ tạo file  ~/.docker/config.json trong folder  chính của  user  không phải root bằng thông tin đăng nhập Docker Hub của bạn.
 Đẩy hình ảnh ứng dụng vào Docker Hub bằng lệnh docker push . Hãy nhớ thay your_dockerhub_username bằng tên  user  Docker Hub  của bạn :
- docker push your_dockerhub_username/node-demo 
 
Đến đây bạn có một hình ảnh ứng dụng mà bạn có thể kéo để chạy ứng dụng của bạn với Kubernetes và Istio. Tiếp theo, bạn có thể chuyển sang cài đặt Istio với Helm.
Bước 2 - Cài đặt Istio với Helm
Mặc dù Istio cung cấp các phương pháp cài đặt khác nhau, tài liệu khuyến nghị sử dụng Helm để tối đa hóa tính linh hoạt trong việc quản lý các tùy chọn cấu hình. Ta sẽ cài đặt Istio bằng Helm và đảm bảo tiện ích bổ sung Grafana được bật để ta có thể trực quan hóa dữ liệu lưu lượng cho ứng dụng của bạn .
Đầu tiên, thêm repository phát hành Istio:
- helm repo add istio.io https://storage.googleapis.com/istio-release/releases/1.1.7/charts/ 
 
Điều này sẽ cho phép bạn sử dụng biểu đồ Helm trong repository để cài đặt Istio.
Kiểm tra xem bạn có repo không:
- helm repo list 
 
Bạn sẽ thấy repo istio.io được liệt kê:
OutputNAME            URL                                                                 stable          https://kubernetes-charts.storage.googleapis.com                    local           http://127.0.0.1:8879/charts                                        istio.io        https://storage.googleapis.com/istio-release/releases/1.1.7/charts/ Tiếp theo, cài đặt Định nghĩa tài nguyên tùy chỉnh (CRD) của istio-init bằng biểu đồ istio-init bằng lệnh helm install :
- helm install --name istio-init --namespace istio-system istio.io/istio-init 
 
OutputNAME:   istio-init LAST DEPLOYED: Fri Jun  7 17:13:32 2019 NAMESPACE: istio-system STATUS: DEPLOYED ... Lệnh này kube-apiserver 53 CRD cho kube-apiserver , làm cho chúng có sẵn để sử dụng trong Istio mesh. Nó cũng tạo ra một không gian tên cho các đối tượng Istio được gọi là istio-system và sử dụng tùy chọn --name để đặt tên cho bản phát hành Helm istio-init . Bản phát hành trong Helm đề cập đến việc triển khai biểu đồ cụ thể với các tùy chọn cấu hình cụ thể được bật.
Để kiểm tra xem tất cả các CRD bắt buộc đã được commit chưa, hãy chạy lệnh sau:
- kubectl get crds | grep 'istio.io\|certmanager.k8s.io' | wc -l 
 
Điều này sẽ xuất ra số 53 .
  Đến đây bạn  có thể cài đặt biểu đồ istio . Để  đảm bảo  addon đo từ xa Grafana được cài đặt với biểu đồ,  ta  sẽ sử dụng tùy chọn cấu hình --set grafana.enabled=true với lệnh helm install của  ta .  Ta  cũng sẽ sử dụng giao thức cài đặt cho cấu hình mong muốn của  ta : cấu hình mặc định. Istio có một số cấu hình để lựa chọn khi cài đặt với Helm cho phép bạn tùy chỉnh mặt phẳng điều khiển Istio và mặt phẳng dữ liệu . Cấu hình mặc định  được khuyến khích  cho triển khai production  và  ta  sẽ sử dụng cấu hình này để tự làm quen với các tùy chọn cấu hình mà  ta  sẽ sử dụng khi chuyển sang production .
 Chạy lệnh helm install sau để cài đặt biểu đồ:
- helm install --name istio --namespace istio-system --set grafana.enabled=true istio.io/istio 
 
OutputNAME:   istio LAST DEPLOYED: Fri Jun  7 17:18:33 2019 NAMESPACE: istio-system STATUS: DEPLOYED ...   ,  ta  đang cài đặt các đối tượng Istio  của bạn  vào không gian tên istio-system và đặt tên cho bản phát hành - trong trường hợp này là istio .
Ta có thể xác minh các đối tượng Dịch vụ mà ta mong đợi cho cấu hình mặc định đã được tạo bằng lệnh sau:
- kubectl get svc -n istio-system 
 
Các Dịch vụ mà  ta  mong đợi sẽ thấy ở đây bao gồm istio-citadel , istio-galley , istio-ingressgateway , istio-pilot , istio-policy , istio-sidecar-injector istio-telemetry , istio-telemetry và prometheus .  Ta  cũng mong đợi được thấy Dịch vụ grafana , vì  ta  đã bật tiện ích này trong khi cài đặt:
OutputNAME                     TYPE           CLUSTER-IP       EXTERNAL-IP       PORT(S)                                                                                                                                      AGE grafana                  ClusterIP      10.245.85.162    <none>            3000/TCP                                                                                                                                     3m26s istio-citadel            ClusterIP      10.245.135.45    <none>            8060/TCP,15014/TCP                                                                                                                           3m25s istio-galley             ClusterIP      10.245.46.245    <none>            443/TCP,15014/TCP,9901/TCP                                                                                                                   3m26s istio-ingressgateway     LoadBalancer   10.245.171.39    174.138.125.110   15020:30707/TCP,80:31380/TCP,443:31390/TCP,31400:31400/TCP,15029:30285/TCP,15030:31668/TCP,15031:32297/TCP,15032:30853/TCP,15443:30406/TCP   3m26s istio-pilot              ClusterIP      10.245.56.97     <none>            15010/TCP,15011/TCP,8080/TCP,15014/TCP                                                                                                       3m26s istio-policy             ClusterIP      10.245.206.189   <none>            9091/TCP,15004/TCP,15014/TCP                                                                                                                 3m26s istio-sidecar-injector   ClusterIP      10.245.223.99    <none>            443/TCP                                                                                                                                      3m25s istio-telemetry          ClusterIP      10.245.5.215     <none>            9091/TCP,15004/TCP,15014/TCP,42422/TCP                                                                                                       3m26s prometheus               ClusterIP      10.245.100.132   <none>            9090/TCP                                                                                                                                     3m26s Ta cũng có thể kiểm tra Istio Pods tương ứng bằng lệnh sau:
- kubectl get pods -n istio-system 
 
Các  group  tương ứng với các dịch vụ này phải có STATUS Running , cho biết rằng các  Group  được liên kết với  các node  và các containers  được liên kết với các  Group  đang chạy:
OutputNAME                                     READY   STATUS      RESTARTS   AGE grafana-67c69bb567-t8qrg                 1/1     Running     0          4m25s istio-citadel-fc966574d-v5rg5            1/1     Running     0          4m25s istio-galley-cf776876f-5wc4x             1/1     Running     0          4m25s istio-ingressgateway-7f497cc68b-c5w64    1/1     Running     0          4m25s istio-init-crd-10-bxglc                  0/1     Completed   0          9m29s istio-init-crd-11-dv5lz                  0/1     Completed   0          9m29s istio-pilot-785694f946-m5wp2             2/2     Running     0          4m25s istio-policy-79cff99c7c-q4z5x            2/2     Running     1          4m25s istio-sidecar-injector-c8ddbb99c-czvwq   1/1     Running     0          4m24s istio-telemetry-578b6f967c-zk56d         2/2     Running     1          4m25s prometheus-d8d46c5b5-k5wmg               1/1     Running     0          4m25s Trường READY cho biết có bao nhiêu containers  trong một Pod đang chạy. Để biết thêm thông tin, vui lòng tham khảo tài liệu về Vòng đời Pod .
 Ghi chú:
 Nếu bạn thấy các pha không mong muốn trong cột STATUS , hãy nhớ rằng bạn có thể khắc phục sự cố  Group   của bạn  bằng các lệnh sau:
- kubectl describe pods your_pod -n pod_namespace 
 - kubectl logs your_pod -n pod_namespace 
 
Bước cuối cùng trong quá trình cài đặt Istio sẽ được tạo điều kiện cho việc tạo ra các Envoy proxy, mà sẽ được triển khai như thùng xe bên cạnh các dịch vụ đang chạy trong lưới.
Sidecars thường được sử dụng để thêm một lớp chức năng bổ sung trong môi trường containers hiện có. Kiến trúc lưới của Istio dựa trên giao tiếp giữa các thanh phụ Envoy, bao gồm mặt phẳng dữ liệu của lưới và các thành phần của mặt phẳng điều khiển. Để lưới hoạt động, ta cần đảm bảo mỗi Pod trong lưới cũng sẽ chạy một sidecar Envoy.
 Có hai cách để đạt được mục tiêu này: tiêm sidecar thủ công và tiêm sidecar tự động .  Ta  sẽ kích hoạt tự động chèn sidecar bằng cách gắn nhãn không gian tên trong đó  ta  sẽ tạo các đối tượng ứng dụng  của bạn  với nhãn istio-injection=enabled . Điều này sẽ  đảm bảo  bộ điều khiển MutatingAdmissionWebhook có thể chặn các yêu cầu tới kube-apiserver và thực hiện một hành động cụ thể - trong trường hợp này,  đảm bảo  tất cả các Pod ứng dụng của  ta  đều bắt đầu bằng một sidecar.
  Ta  sẽ sử dụng không gian tên default để tạo các đối tượng ứng dụng  của bạn , vì vậy  ta  sẽ áp dụng nhãn istio-injection=enabled cho không gian tên đó bằng lệnh sau:
- kubectl label namespace default istio-injection=enabled 
 
Ta có thể xác minh lệnh hoạt động như dự định bằng lệnh:
- kubectl get namespace -L istio-injection 
 
Bạn sẽ thấy kết quả sau:
OutputAME              STATUS   AGE   ISTIO-INJECTION default           Active   47m   enabled istio-system      Active   16m    kube-node-lease   Active   47m    kube-public       Active   47m    kube-system       Active   47m    Với Istio được cài đặt và cấu hình, ta có thể chuyển sang tạo các đối tượng Dịch vụ và Triển khai ứng dụng của bạn .
Bước 3 - Tạo các đối tượng ứng dụng
Với lưới Istio tại chỗ và được cấu hình để đưa các Pod sidecar vào, ta có thể tạo một tệp kê khai ứng dụng với các thông số kỹ thuật cho các đối tượng Dịch vụ và Triển khai của bạn . Các thông số kỹ thuật trong một file kê khai Kubernetes mô tả trạng thái mong muốn của từng đối tượng.
Dịch vụ ứng dụng của ta sẽ đảm bảo các Group đang chạy containers của ta vẫn có thể truy cập được trong môi trường động, khi các Group riêng lẻ được tạo và phá hủy, trong khi Triển khai của ta sẽ mô tả trạng thái mong muốn của các Group của ta .
 Mở file  có tên node-app.yaml bằng nano  hoặc editor bạn quen dùng :
- nano node-app.yaml 
 
Đầu tiên, thêm đoạn mã sau để xác định Dịch vụ ứng dụng nodejs :
apiVersion: v1 kind: Service metadata:   name: nodejs   labels:      app: nodejs spec:   selector:     app: nodejs   ports:   - name: http     port: 8080  Định nghĩa Dịch vụ này bao gồm một selector sẽ khớp Pods với nhãn app: nodejs tương app: nodejs .  Ta  cũng đã chỉ định rằng Dịch vụ sẽ  nhắm đến  đến cổng 8080 trên bất kỳ Pod nào có nhãn phù hợp.
  Ta  cũng đang đặt tên cho cổng Dịch vụ,  tuân theo  các yêu cầu của Istio đối với  Group  và Dịch vụ . Giá trị http là một trong những giá trị mà Istio sẽ chấp nhận cho trường name .
 Tiếp theo, bên dưới Dịch vụ, thêm các thông số kỹ thuật sau cho Triển khai ứng dụng. Đảm bảo thay thế image được liệt kê trong thông số kỹ thuật vùng containers bằng hình ảnh bạn đã tạo và đẩy vào Docker Hub ở Bước 1 :
... --- apiVersion: apps/v1 kind: Deployment metadata:   name: nodejs   labels:     version: v1 spec:   replicas: 1   selector:     matchLabels:       app: nodejs   template:     metadata:       labels:         app: nodejs         version: v1     spec:       containers:       - name: nodejs         image: your_dockerhub_username/node-demo         ports:         - containerPort: 8080 Các thông số kỹ thuật cho Triển khai này bao gồm số lượng replicas (trong trường hợp này là 1), cũng như một selector xác định Pods mà Triển khai sẽ quản lý. Trong trường hợp này, nó sẽ quản lý Pod với nhãn app: nodejs .
 Trường template chứa các giá trị thực hiện như sau:
-  Áp dụng nhãn 
app: nodejscho các Group do Triển khai quản lý. Istio khuyên bạn nên thêm nhãnappvào Thông số kỹ thuật triển khai để cung cấp thông tin theo ngữ cảnh cho các chỉ số và đo từ xa của Istio. -  Áp dụng nhãn 
versionđể chỉ định version của ứng dụng tương ứng với Triển khai này. Như với nhãnapp, Istio khuyên bạn nên bao gồm nhãnversionđể cung cấp thông tin theo ngữ cảnh. -  Xác định thông số kỹ thuật cho các containers  mà Pod sẽ chạy, bao gồm 
namecontainers vàimage.imageở đây là hình ảnh bạn đã tạo ở Bước 1 và được đẩy vào Docker Hub. Các thông số kỹ thuật của containers cũng bao gồm cấu hìnhcontainerPortđể trỏ đến cổng mà mỗi containers sẽ lắng nghe. Nếu các cổng vẫn không được liệt kê ở đây, chúng sẽ bỏ qua proxy Istio. Lưu ý cổng này,8080, tương ứng với cổng được nhắm đến có tên trong định nghĩa Dịch vụ. 
Lưu file khi bạn hoàn tất chỉnh sửa.
Với file này tại chỗ, ta có thể chuyển sang chỉnh sửa file sẽ chứa các định nghĩa cho các đối tượng Gateway và Virtual Service, các đối tượng này kiểm soát cách lưu lượng truy cập vào lưới và cách nó được định tuyến khi đến đó.
Bước 4 - Tạo đối tượng Istio
Để kiểm soát quyền truy cập vào một cụm và định tuyến đến Dịch vụ, Kubernetes sử dụng Tài nguyên và Bộ điều khiển Ingress. Tài nguyên Ingress xác định các luật định tuyến HTTP và HTTPS đến các Dịch vụ cụm, trong khi Bộ điều khiển tải cân bằng lưu lượng đến và định tuyến nó đến các Dịch vụ phù hợp.
Để biết thêm thông tin về cách sử dụng Tài nguyên và Bộ điều khiển Ingress, hãy xem Cách cài đặt Nginx Ingress với Cert-Manager trên DigitalOcean Kubernetes .
Istio sử dụng một tập hợp các đối tượng khác nhau để đạt được những mục đích tương tự, mặc dù có một số khác biệt quan trọng. Thay vì sử dụng Bộ điều khiển để cân bằng tải lưu lượng, lưới Istio sử dụng Cổng , có chức năng như một bộ cân bằng tải xử lý các kết nối HTTP / TCP đến và đi. Gateway sau đó cho phép áp dụng các luật giám sát và định tuyến cho lưu lượng truy cập vào lưới. Cụ thể, cấu hình xác định định tuyến truy cập được định nghĩa là Dịch vụ ảo. Mỗi Dịch vụ ảo bao gồm các luật định tuyến phù hợp với tiêu chí với một giao thức và đích cụ thể.
Mặc dù Kubernetes Ingress Resources / Controllers và Istio Gateways / Virtual Services có một số điểm tương đồng về chức năng, nhưng cấu trúc của lưới có những điểm khác biệt quan trọng. Ví dụ: Kubernetes Ingress Resources and Controllers cung cấp cho người vận hành một số tùy chọn định tuyến, nhưng Cổng và Dịch vụ ảo tạo ra một bộ chức năng mạnh mẽ hơn có sẵn vì chúng cho phép lưu lượng truy cập vào lưới. Nói cách khác, các khả năng giới hạn của lớp ứng dụng mà Kubernetes Ingress Controllers và Resources cung cấp cho các nhà khai thác cụm không bao gồm các chức năng - bao gồm định tuyến, truy tìm và đo từ xa nâng cao - được cung cấp bởi các sidecar trong lưới dịch vụ Istio.
 Để cho phép lưu lượng truy cập bên ngoài vào lưới của  ta  và  cấu hình  định tuyến đến ứng dụng Node của  ta ,  ta   cần  tạo Cổng Istio và Dịch vụ ảo. Mở file  có tên node-istio.yaml cho file  kê khai:
- nano node-istio.yaml 
 
Đầu tiên, thêm định nghĩa cho đối tượng Gateway:
apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata:   name: nodejs-gateway spec:   selector:     istio: ingressgateway    servers:   - port:       number: 80       name: http       protocol: HTTP     hosts:     - "*" Ngoài việc chỉ định name cho Gateway trong trường metadata ,  ta  đã bao gồm các thông số kỹ thuật sau:
-  Một 
selectorsẽ khớp tài nguyên này với bộ điều khiển Istio IngressGateway mặc định đã được bật với cấu hình ta đã chọn khi cài đặt Istio. -  Thông số kỹ thuật 
serverschỉ địnhportđể hiển thị khi xâm nhập và cáchostsđược Cổng tiếp xúc. Trong trường hợp này, ta đang chỉ định tất cả cáchostscó dấu hoa thị (*) vì ta không làm việc với một domain bảo mật cụ thể. 
Bên dưới định nghĩa Gateway, hãy thêm thông số kỹ thuật cho Dịch vụ ảo:
... --- apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata:   name: nodejs spec:   hosts:   - "*"   gateways:   - nodejs-gateway   http:   - route:     - destination:         host: nodejs Ngoài việc cung cấp name cho Dịch vụ ảo này,  ta  cũng bao gồm các thông số kỹ thuật cho tài nguyên này bao gồm:
-  Trường 
hostschỉ định server đích. Trong trường hợp này, ta lại đang sử dụng giá trị ký tự đại diện (*) để cho phép truy cập nhanh vào ứng dụng trong trình duyệt, vì ta không làm việc với domain . -  Trường 
gatewayschỉ định Cổng mà các yêu cầu bên ngoài sẽ được phép. Trong trường hợp này, đó là Cổngnodejs-gatewaycủa ta . -  Trường 
httpchỉ định cách định tuyến truy cập HTTP . -  Trường 
destinationcho biết nơi yêu cầu sẽ được định tuyến. Trong trường hợp này, nó sẽ được chuyển đến dịch vụnodejs, dịch vụ này ngầm mở rộng thành Tên domain đủ điều kiện (FQDN) của dịch vụ trong môi trườngnodejs.default.svc.cluster.local:nodejs.default.svc.cluster.local. Tuy nhiên, điều quan trọng cần lưu ý là FQDN sẽ dựa trên không gian tên nơi luật được xác định, không phải Dịch vụ, vì vậy hãy đảm bảo sử dụng FQDN trong trường này khi Dịch vụ ứng dụng và Dịch vụ ảo của bạn ở các không gian tên khác nhau. Để tìm hiểu tổng quát hơn về Hệ thống domain Kubernetes (DNS), hãy xem Giới thiệu về Dịch vụ DNS Kubernetes . 
Lưu file khi bạn hoàn tất chỉnh sửa.
 Với các file  yaml của bạn tại chỗ, bạn có thể tạo Dịch vụ và Triển khai ứng dụng  của bạn , cũng như các đối tượng Gateway và Dịch vụ ảo sẽ cho phép truy cập vào ứng dụng của bạn.
Bước 5 - Tạo tài nguyên ứng dụng và cho phép truy cập từ xa
Khi bạn đã tạo các đối tượng Dịch vụ và Triển khai ứng dụng của bạn , cùng với Cổng và Dịch vụ ảo, bạn có thể tạo một số yêu cầu cho ứng dụng của bạn và xem dữ liệu liên quan trong console Istio Grafana của bạn. Tuy nhiên, trước tiên, bạn cần phải cấu hình Istio để hiển thị addon Grafana để bạn có thể truy cập trang tổng quan trong trình duyệt của bạn .
Ta sẽ bật quyền truy cập Grafana bằng HTTP , nhưng khi bạn đang làm việc trong production hoặc trong các môi trường nhạy cảm, bạn nên bật quyền truy cập bằng HTTPS .
 Vì  ta  đặt tùy chọn cấu hình --set grafana.enabled=true khi cài đặt Istio ở Bước 2 ,  ta  có Dịch vụ Grafana và Pod trong không gian tên istio-system , mà  ta  đã xác nhận trong Bước đó.
Với những tài nguyên đó đã có, bước tiếp theo của ta sẽ là tạo file kê khai cho Cổng và Dịch vụ ảo để ta có thể hiển thị addon Grafana.
Mở file cho file kê khai:
- nano node-grafana.yaml 
 
Thêm mã sau vào file để tạo Cổng và Dịch vụ ảo để hiển thị và định tuyến lưu lượng truy cập đến Dịch vụ Grafana:
apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata:   name: grafana-gateway   namespace: istio-system spec:   selector:     istio: ingressgateway   servers:   - port:       number: 15031       name: http-grafana       protocol: HTTP     hosts:     - "*" --- apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata:   name: grafana-vs   namespace: istio-system spec:   hosts:   - "*"   gateways:   - grafana-gateway   http:   - match:     - port: 15031     route:     - destination:         host: grafana         port:           number: 3000 Các thông số kỹ thuật của Grafana Gateway và Virtual Service của ta tương tự như những thông số mà ta đã xác định cho ứng dụng Gateway và Virtual Service của ta ở Bước 4 . Tuy nhiên, có một số khác biệt:
-  Grafana sẽ được hiển thị trên cổng có tên 
http-grafana(cổng15031) và nó sẽ chạy trên cổng3000trên server . -  Gateway và Virtual Service đều được định nghĩa trong không gian tên 
istio-system. -  Máy 
hosttrong Dịch vụ ảo này là Dịch vụgrafanatrong không gian tênistio-system. Vì ta đang xác định luật này trong cùng một không gian tên mà Dịch vụ Grafana đang chạy, mở rộng FQDN sẽ lại hoạt động mà không có xung đột. 
 Lưu ý: Vì MeshPolicy hiện tại của  ta  được  cấu hình  để chạy TLS ở chế độ cho phép ,  ta  không cần áp dụng  Luật  đích cho file  kê khai  của bạn . Nếu bạn đã chọn một cấu hình khác với cài đặt Istio  của bạn , thì bạn  cần  thêm  Luật  đích để tắt TLS chung khi cho phép truy cập vào Grafana bằng HTTP. Để biết thêm thông tin về cách thực hiện việc này, bạn có thể tham khảo tài liệu chính thức của Istio về cách cho phép truy cập vào các phần bổ trợ đo từ xa với HTTP.
Lưu file khi bạn hoàn tất chỉnh sửa.
Tạo tài nguyên Grafana của bạn bằng lệnh sau:
- kubectl apply -f node-grafana.yaml 
 
Lệnh kubectl apply cho phép bạn áp dụng một cấu hình cụ thể cho một đối tượng trong quá trình tạo hoặc cập nhật nó. Trong trường hợp của  ta ,  ta  đang áp dụng cấu hình mà  ta  đã chỉ định trong file  node-grafana.yaml cho các đối tượng Gateway và Virtual Service của  ta  trong quá trình tạo chúng.
 Bạn có thể xem Cổng trong không gian tên istio-system bằng lệnh sau:
- kubectl get gateway -n istio-system 
 
Bạn sẽ thấy kết quả sau:
OutputNAME              AGE grafana-gateway   47s Bạn có thể làm điều tương tự đối với Dịch vụ ảo:
- kubectl get virtualservice -n istio-system 
 
OutputNAME         GATEWAYS            HOSTS   AGE grafana-vs   [grafana-gateway]   [*]     74s Với những tài nguyên này được tạo, ta sẽ có thể truy cập trang tổng quan Grafana của bạn trong trình duyệt. Tuy nhiên, trước khi làm điều đó, hãy tạo Dịch vụ và Triển khai ứng dụng, cùng với Cổng ứng dụng và Dịch vụ Ảo của ta , và kiểm tra xem ta có thể truy cập ứng dụng của bạn trong trình duyệt hay không.
Tạo Dịch vụ và Triển khai ứng dụng bằng lệnh sau:
- kubectl apply -f node-app.yaml 
 
Chờ một vài giây, sau đó kiểm tra Pods ứng dụng của bạn bằng lệnh sau:
- kubectl get pods 
 
OutputNAME                      READY   STATUS    RESTARTS   AGE nodejs-7759fb549f-kmb7x   2/2     Running   0          40s Các containers  ứng dụng của bạn đang chạy,  như bạn thấy  trong cột STATUS , nhưng tại sao cột READY liệt kê 2/2 nếu file  kê khai ứng dụng từ Bước 3 chỉ chỉ định 1 bản sao?
 Vùng chứa thứ hai này là sidecar Envoy, bạn có thể kiểm tra bằng lệnh sau. Đảm bảo thay thế  group  được liệt kê ở đây bằng NAME của  Group  nodejs  của bạn :
- kubectl describe pod nodejs-7759fb549f-kmb7x 
 
OutputName:               nodejs-7759fb549f-kmb7x Namespace:          default ... Containers:   nodejs:   ...   istio-proxy:     Container ID:  docker://f840d5a576536164d80911c46f6de41d5bc5af5152890c3aed429a1ee29af10b     Image:         docker.io/istio/proxyv2:1.1.7     Image ID:      docker-pullable://istio/proxyv2@sha256:e6f039115c7d5ef9c8f6b049866fbf9b6f5e2255d3a733bb8756b36927749822      Port:          15090/TCP     Host Port:     0/TCP     Args:     ... Tiếp theo, tạo Cổng ứng dụng và Dịch vụ ảo của bạn:
- kubectl apply -f node-istio.yaml 
 
Bạn có thể kiểm tra Gateway bằng lệnh sau:
- kubectl get gateway 
 
OutputNAME             AGE nodejs-gateway   7s Và Dịch vụ ảo:
- kubectl get virtualservice 
 
OutputNAME     GATEWAYS           HOSTS   AGE nodejs   [nodejs-gateway]   [*]     28s Hiện  ta  đã sẵn sàng để kiểm tra quyền truy cập vào ứng dụng. Để thực hiện việc này,  ta   cần  IP bên ngoài được liên kết với Dịch vụ istio-ingressgateway của  ta , là loại Dịch vụ LoadBalancer .
 Lấy IP bên ngoài cho Dịch vụ istio-ingressgateway bằng lệnh sau:
- kubectl get svc -n istio-system 
 
Bạn sẽ thấy kết quả như sau:
OutputNAME                     TYPE           CLUSTER-IP       EXTERNAL-IP       PORT(S)                                                                                                                                      AGE grafana                  ClusterIP      10.245.85.162    <none>            3000/TCP                                                                                                                                     42m istio-citadel            ClusterIP      10.245.135.45    <none>            8060/TCP,15014/TCP                                                                                                                           42m istio-galley             ClusterIP      10.245.46.245    <none>            443/TCP,15014/TCP,9901/TCP                                                                                                                   42m istio-ingressgateway     LoadBalancer   10.245.171.39    ingressgateway_ip 15020:30707/TCP,80:31380/TCP,443:31390/TCP,31400:31400/TCP,15029:30285/TCP,15030:31668/TCP,15031:32297/TCP,15032:30853/TCP,15443:30406/TCP   42m istio-pilot              ClusterIP      10.245.56.97     <none>            15010/TCP,15011/TCP,8080/TCP,15014/TCP                                                                                                       42m istio-policy             ClusterIP      10.245.206.189   <none>            9091/TCP,15004/TCP,15014/TCP                                                                                                                 42m istio-sidecar-injector   ClusterIP      10.245.223.99    <none>            443/TCP                                                                                                                                      42m istio-telemetry          ClusterIP      10.245.5.215     <none>            9091/TCP,15004/TCP,15014/TCP,42422/TCP                                                                                                       42m prometheus               ClusterIP      10.245.100.132   <none>            9090/TCP                                                                                                                                     42m Đường vào istio-ingressgateway phải là Dịch vụ duy nhất có TYPE LoadBalancer và Dịch vụ duy nhất có IP bên ngoài.
 Điều hướng đến IP bên ngoài này trong trình duyệt của bạn: http:// ingressgateway_ip .
Bạn sẽ thấy trang đích sau:
Tiếp theo, tạo một số tải cho trang web bằng cách nhấp vào làm mới năm hoặc sáu lần.
Đến đây bạn có thể kiểm tra console Grafana để xem dữ liệu giao thông.
 Trong trình duyệt của bạn,  chuyển  đến địa chỉ sau,    sử dụng IP bên ngoài istio-ingressgateway của bạn và cổng bạn đã xác định trong file  kê khai Grafana Gateway: http:// ingressgateway_ip:15031 .
Bạn sẽ thấy trang đích sau:
Nhấp vào Trang chủ ở đầu trang sẽ đưa bạn đến trang có folder istio . Để có danh sách các tùy chọn thả xuống, hãy nhấp vào biểu tượng folder istio :
Từ danh sách các tùy chọn này, hãy nhấp vào Control panel Dịch vụ Istio .
Thao tác này sẽ đưa bạn đến trang đích có menu thả xuống khác:
 Chọn nodejs.default.svc.cluster.local từ danh sách các tùy chọn có sẵn.
Đến đây bạn sẽ có thể xem dữ liệu lưu lượng cho dịch vụ đó:
Đến đây bạn có một ứng dụng Node.js đang hoạt động chạy trong lưới dịch vụ Istio với Grafana được kích hoạt và cấu hình để truy cập bên ngoài.
Kết luận
Trong hướng dẫn này, bạn đã cài đặt Istio bằng trình quản lý gói Helm và sử dụng nó để hiển thị Dịch vụ ứng dụng Node.js sử dụng các đối tượng Gateway và Virtual Service. Bạn cũng đã cấu hình các đối tượng Gateway và Virtual Service để hiển thị addon đo từ xa Grafana, nhằm xem xét dữ liệu lưu lượng cho ứng dụng của bạn.
Khi chuyển sang production , bạn cần thực hiện các bước như bảo mật Cổng ứng dụng của bạn bằng HTTPS và đảm bảo quyền truy cập vào Dịch vụ Grafana của bạn cũng được bảo mật .
Bạn cũng có thể khám phá các tác vụ khác liên quan đến đo từ xa , bao gồm thu thập và xử lý số liệu , nhật ký và khoảng theo dõi .
Các tin liên quan

