Thứ năm, 13/06/2019 | 00:00 GMT+7

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 GatewayDị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 :

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.

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:

Output
REPOSITORY 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ổng 80 trê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:

Output
CONTAINER 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:

Trang đích ứng dụng

Đế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
Output
CONTAINER 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ê:

Output
NAME 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
Output
NAME: 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
Output
NAME: 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-telemetryprometheus . 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:

Output
NAME 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:

Output
NAME 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ôngtiê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:

Output
AME 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 :

~ / istio_project / node-app.yaml
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 :

~ / istio_project / node-app.yaml
... --- 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: nodejs cho các Group do Triển khai quản lý. Istio khuyên bạn nên thêm nhãn app và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ãn app , Istio khuyên bạn nên bao gồm nhãn version để 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 name containers 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ình containerPort để 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ênBộ đ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:

~ / istio_project / node-isto.yaml
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 selector sẽ 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 servers chỉ định port để hiển thị khi xâm nhập và các hosts được Cổng tiếp xúc. Trong trường hợp này, ta đang chỉ định tất cả các hosts có 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:

~ / istio_project / node-istio.yaml
... --- 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 hosts chỉ đị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 gateways chỉ đị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ổng nodejs-gateway của ta .
  • Trường http chỉ định cách định tuyến truy cập HTTP .
  • Trường destination cho 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ường nodejs.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:

~ / istio_project / node-grafana.yaml
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ổng 15031 ) và nó sẽ chạy trên cổng 3000 trên server .
  • Gateway và Virtual Service đều được định nghĩa trong không gian tên istio-system .
  • Máy host trong Dịch vụ ảo này là Dịch vụ grafana trong không gian tên istio-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 ý: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:

Output
NAME 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
Output
NAME 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
Output
NAME 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
Output
Name: 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
Output
NAME AGE nodejs-gateway 7s

Và Dịch vụ ảo:

  • kubectl get virtualservice
Output
NAME 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:

Output
NAME 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:

Trang đích ứng dụng

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:

Trang chủ Grafana Dash

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 :

Menu thả xuống Istio Dash Options

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:

Dịch vụ thả xuống trong Istio Service Dash

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ụ đó:

Dấu gạch ngang dịch vụ Nodejs

Đế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ýkhoảng theo dõi .


Tags:

Các tin liên quan