在EKS Kubernetes集群上安裝Istio Service Mesh

這是續集。
您可以通過以下鏈接以PDF格式下載本文來支持我們。

以PDF格式下載指南


這是續集。

這是續集。
這是續集。

Istio服務網格的功能是為Kubernetes集群服務提供訪問控制,流量監視,安全性,檢測,負載平衡和許多其他有用的功能。使用這些服務的代碼沒有任何更改。 Istio做所有事情。本指南介紹了如何在EKT Kubernetes群集上安裝Istio Service Mesh。

簡而言之,Istio是代理( 邊車)緊接在作為網格一部分的名稱空間中部署的每個服務旁邊。用於該服務的流量必須通過Sidecar代理進行。然後使用Istio策略將流量路由到服務。 Istio還簡化了DevOps技術,例如斷路器,金絲雀部署和故障注入。

這就是Istio中的流量。

在EKS Kubernetes集群上安裝Istio Service Mesh

對於此安裝,您幾乎不需要這些項目。

  • 在AWS上部署的有效的EKS Kubernetes集群
  • 以具有管理員權限的用戶身份訪問群集
  • 如果您在域名中使用網關和虛擬服務,則使用Route53託管區域

步驟1:在本地計算機/堡壘上安裝istioctl

這取決於kubectl的安裝位置以及在同一台機器上的工作位置。如果您的計算機可以訪問API服務器,則這將是您的本地工作站計算機。對於在AWS上部署的私有EKS群集,這將是堡壘服務器。

下載並解壓縮istioctl –在Linux和macOS上運行。安裝版本 1.6.8

cd ~/
curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.6.8 sh -

為工作站配置istioctl客戶端工具。

sudo cp istio-1.6.8/bin/istioctl /usr/local/bin/
sudo chmod +x /usr/local/bin/istioctl

檢查istioctl的版本。

$ istioctl version
1.6.8

啟用Bash的istioctl完成

--- Bash ---
mkdir -p ~/completions && istioctl collateral --bash -o ~/completions
source ~/completions/istioctl.bash
echo "source ~/completions/istioctl.bash" >> ~/.bashrc

--- Zsh ---
mkdir -p ~/completions && istioctl collateral --zsh -o ~/completions
source ~/completions/_istioctl
echo "source ~/completions/_istioctl" >>~/.zshrc

檢查自動完成。

$ istioctl 
analyze          dashboard        install          operator         proxy-status     validate
authz            deregister       kube-inject      profile          register         verify-install
convert-ingress  experimental     manifest         proxy-config     upgrade          version

步驟2:創建Istio名稱空間

創建一個將部署所有與istio相關的服務的名稱空間。

$ kubectl create namespace istio-system
namespace/istio-system created

步驟3:建立所需的機密

安裝 格拉法納Chiari積家 作為Istio安裝的一部分。我們的設置需要每個組件的憑據。 秘密..

讓我們在istio-system名稱空間中創建這些秘密。

創建Grafana秘密

GRAFANA_USERNAME=$(echo -n "grafana" | base64)
GRAFANA_PASSPHRASE=$(echo -n "[email protected]" | base64) # Replace [email protected] with your password

cat <

創建Kiali秘密

KIALI_USERNAME=$(echo -n "kiali" | base64)
KIALI_PASSPHRASE=$(echo -n "[email protected]" | base64) # Replace [email protected] with your password

cat <

創建一個Jaeger機密。

JAEGER_USERNAME=$(echo -n "jaeger" | base64)
JAEGER_PASSPHRASE=$(echo -n "[email protected]" | base64) # Replace [email protected] with your password

cat <

列出創建的機密。

$ kubectl get secret -n istio-system
NAME                  TYPE                                  DATA   AGE
default-token-kwrcj   kubernetes.io/service-account-token   3      16m
grafana               Opaque                                2      4m59s
jaeger                Opaque                                2      47s
kiali                 Opaque                                2      3m7s

步驟4:創建Istio控制平面配置

現在,您已經成功創建了必需的機密,您可以創建Istio控制平面配置文件。

命名文件 istio-control-plane-eks.yml..在這個檔案中 Istio控制平面規格 Istio配置詳細信息。

$ vim istio-control-plane-eks.yml

內容。 –參考 全局網格選項

apiVersion: install.istio.io/v1alpha2
kind: IstioControlPlane
spec:
  profile: default
  values:
    meshConfig:
      disablePolicyChecks: false
      # File address for the proxy access log (e.g. /dev/stdout).
      accessLogFile: "/dev/stdout"
      # Set the default behavior of the sidecar for handling outbound traffic from the application
      outboundTrafficPolicy:
        mode: "ALLOW_ANY"
      # Enable mutual TLS automatically for service to service communication within the mesh
      enableAutoMtls: false
      disablePolicyChecks: false
    gateways:
      # Enable egress gateway
      istio-egressgateway:
        enabled: true
        autoscaleEnabled: true
      # Enable Ingress gateway
      istio-ingressgateway:
        enabled: true
        autoscaleEnabled: true
    global:
      # Ensure that the Istio pods are only scheduled to run on Linux nodes
      defaultNodeSelector:
        beta.kubernetes.io/os: linux
      # Enable mutual TLS for the control plane
      controlPlaneSecurityEnabled: true
    grafana:
      # Enable Grafana deployment for analytics and monitoring dashboards
      enabled: true
      security:
        # Enable authentication for Grafana
        enabled: true
    kiali:
      # Enable the Kiali deployment for a service mesh observability dashboard
      enabled: true
    tracing:
      # Enable the Jaeger deployment for tracing
      enabled: true
      provider: jaeger # zipkin / jaeger

空運行以驗證您的配置。

$ istioctl manifest apply -f istio-control-plane-eks.yml --dry-run
✔ Istio core installed
✔ Istiod installed
✔ Ingress gateways installed
✔ Addons installed
- Pruning removed resources
......

使用以下命令安裝istio:

$ istioctl manifest apply -f istio-control-plane-eks.yml
✔ Istio core installed
✔ Istiod installed
✔ Ingress gateways installed
✔ Addons installed
✔ Installation complete

檢查已部署的Pod,以確保它們處於運行狀態。

$ kubectl get pods -n istio-system
NAME                                    READY   STATUS    RESTARTS   AGE
grafana-86897cb4f5-wg29n                1/1     Running   0          3h34m
istio-egressgateway-8667d76d75-2t96d    1/1     Running   0          51s
istio-ingressgateway-5d78f74886-8xpx5   1/1     Running   0          3h35m
istio-tracing-57d7cfd779-xbtd8          1/1     Running   0          3h34m
istiod-58f84ffddc-khncg                 1/1     Running   0          3h35m
kiali-7c974669b4-ckfh4                  1/1     Running   0          3h34m
prometheus-6946fd87b4-ldzt2             2/2     Running   0          3h34m

您可以通過以下方式列出服務端點:

$ kubectl get svc -n istio-system

向Ingress服務添加註釋以獲取AWS負載均衡器。要添加的注釋是:

service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
service.beta.kubernetes.io/aws-load-balancer-internal: "0.0.0.0/0"

使用kubectl命令添加註釋。

kubectl annotate svc istio-ingressgateway service.beta.kubernetes.io/aws-load-balancer-type="nlb" -n istio-system
kubectl annotate svc istio-ingressgateway service.beta.kubernetes.io/aws-load-balancer-internal="0.0.0.0/0" -n istio-system

確認已創建LB。

$ kubectl get svc istio-ingressgateway  -n istio-system
NAME                   TYPE           CLUSTER-IP     EXTERNAL-IP                                                                     PORT(S)                                                      AGE
istio-ingressgateway   LoadBalancer   10.100.49.28   a75fa02249f79436290b35e8a00a00b5-8e63bc91906eba93.elb.eu-west-1.amazonaws.com   15021:31022/TCP,80:32766/TCP,443:32512/TCP,15443:31919/TCP   3h31m

訪問儀錶板:

# Grafana
$ istioctl dashboard grafana

# Kiali
$ istioctl dashboard kiali

# Jaeger
$ istioctl dashboard jaeger

# Prometheus
$ istioctl dashboard prometheus

# Zipkin
$ istioctl dashboard zipkin

# Envoy
$ istioctl dashboard envoy .

步驟5:配置Route53 DNS

委託子域 cloud.hirebestengineers.com 到Istio網關使用的AWS Route 53。

訪問 Route53控制台 如果您沒有託管區域,請創建一個。

在EKS Kubernetes集群上安裝Istio Service Mesh

單擊創建託管區域,將域添加到Route53。

在EKS Kubernetes集群上安裝Istio Service Mesh

路由53提供了DNS服務器條目,您可以通過註冊服務商對其進行更新,以解析和管理域DNS條目。

我使用Cloudflare來管理我的DNS,因此我將通過管理控制台相應地更新設置。請注意,Route53使用子域而不是實際域名。

在EKS Kubernetes集群上安裝Istio Service Mesh

要添加的記錄類型為NS。添加所有內容後,它看起來像這樣:

在EKS Kubernetes集群上安裝Istio Service Mesh

更新後檢查DNS傳播。對於某些註冊表,最多可能需要24小時才能推送更新。

$ dig NS cloud.hirebestengineers.com +short
ns-1335.awsdns-38.org.
ns-1879.awsdns-42.co.uk.
ns-454.awsdns-56.com.
ns-643.awsdns-16.net.

在Route 53中創建一條指向Istio Ingress使用的負載均衡器的記錄。我的記錄是 * .cloud.hirebestengineers.com

點擊 創建記錄>簡單路由>簡單記錄定義 並設置:

  • 記錄名稱
  • 流量值/路由:選擇“網絡負載均衡器”並設置“區域和負載均衡器ID”
  • 記錄類型:A

不要單擊“定義簡單記錄”按鈕。

在EKS Kubernetes集群上安裝Istio Service Mesh

檢查詳細信息,然後單擊建立記錄

在EKS Kubernetes集群上安裝Istio Service Mesh

步驟6:為您的名稱空間啟用自動Sidecar注入

可以將Sidecar自動添加到適當的Kubernetes容器中。 更改Webhook接納控制器 由Istio提供。

為此項目創建一個演示名稱空間。

$ kubectl create ns demo
namespace/demo created

添加並啟用自動邊車注入 istio-injection =啟用 命名空間標籤:

$ kubectl label namespace demo istio-injection=enabled
namespace/demo labeled

確認標籤已添加到名稱空間。

$ kubectl get namespace demo -L istio-injection
NAME   STATUS   AGE     ISTIO-INJECTION
demo   Active   2m20s   enabled

步驟7:使用Istio網關部署測試應用程序

使用Istio網站上的Bookinfo應用程序示例。本示例部署了一個示例應用程序,該應用程序由四個單獨的微服務組成,用於演示各種Istio功能。

下載應用程序清單文件。

wget https://raw.githubusercontent.com/istio/istio/master/samples/bookinfo/platform/kube/bookinfo.yaml

使用kubectl命令部署應用程序。

$ kubectl apply -f bookinfo.yaml -n demo

service/details created
serviceaccount/bookinfo-details created
deployment.apps/details-v1 created
service/ratings created
serviceaccount/bookinfo-ratings created
deployment.apps/ratings-v1 created
service/reviews created
serviceaccount/bookinfo-reviews created
deployment.apps/reviews-v1 created
deployment.apps/reviews-v2 created
deployment.apps/reviews-v3 created
service/productpage created
serviceaccount/bookinfo-productpage created
deployment.apps/productpage-v1 created

確保Pod正在運行。

$ kubectl get pods -n demo
NAME                              READY   STATUS    RESTARTS   AGE
details-v1-5974b67c8-tqsj9        2/2     Running   0          86s
productpage-v1-64794f5db4-hg7n6   2/2     Running   0          76s
ratings-v1-c6cdf8d98-4dl8h        2/2     Running   0          84s
reviews-v1-7f6558b974-64wrw       2/2     Running   0          81s
reviews-v2-6cb6ccd848-fp2tl       2/2     Running   0          80s
reviews-v3-cc56b578-dpgh2         2/2     Running   0          79s

確保正確定義了所有服務。

$ kubectl get svc -n demo
kubectl get svc -n demo
NAME          TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
details       ClusterIP   10.100.229.76            9080/TCP   4m28s
productpage   ClusterIP   10.100.23.164            9080/TCP   4m18s
ratings       ClusterIP   10.100.172.229           9080/TCP   4m26s
reviews       ClusterIP   10.100.18.183            9080/TCP   4m23s

要驗證Bookinfo應用程序正在運行,請使用pod中的curl命令(例如Ratings)發出請求。

kubectl -n demo exec "$(kubectl get pod  -n demo -l app=ratings -o jsonpath='{.items[0].metadata.name}')" -c ratings -- curl productpage:9080/productpage | grep -o ".*"

預期的命令輸出:

Simple Bookstore App

下載網關文件。

wget https://raw.githubusercontent.com/istio/istio/master/samples/bookinfo/networking/bookinfo-gateway.yaml

編輯此設置主機值。

$ vim bookinfo-gateway.yaml
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: bookinfo-gateway
spec:
  selector:
    istio: ingressgateway # use istio default controller
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "bookinfo.cloud.hirebestengineers.com"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: bookinfo
spec:
  hosts:
  - "bookinfo.cloud.hirebestengineers.com"
  gateways:
  - bookinfo-gateway
  http:
  - match:
    - uri:
        exact: /productpage
    - uri:
        prefix: /static
    - uri:
        exact: /login
    - uri:
        exact: /logout
    - uri:
        prefix: /api/v1/products
    route:
    - destination:
        host: productpage
        port:
          number: 9080

為您的應用程序定義輸入網關。

$ kubectl apply -f ./bookinfo-gateway.yaml -n demo

gateway.networking.istio.io/bookinfo-gateway created
virtualservice.networking.istio.io/bookinfo created

使用curl或網絡瀏覽器測試對您的應用程序的訪問。

捲曲:

$ curl -s http://bookinfo.cloud.hirebestengineers.com/productpage  |  grep -o ".*"
Simple Bookstore App

通過網絡瀏覽器。

在EKS Kubernetes集群上安裝Istio Service Mesh

您可以使用此示例應用程序嘗試Istio功能,例如流量路由,故障注入和速率限制。還有 Istio任務 您可以了解更多。如果您是初學者 請求路由配置 這也是一個不錯的起點。

清潔Bookinfo應用程序。

$ kubectl delete -f ./bookinfo-gateway.yaml -n demo
gateway.networking.istio.io "bookinfo-gateway" deleted
virtualservice.networking.istio.io "bookinfo" deleted

$ kubectl delete -f ./bookinfo.yaml -n demo
service "details" deleted
serviceaccount "bookinfo-details" deleted
deployment.apps "details-v1" deleted
service "ratings" deleted
serviceaccount "bookinfo-ratings" deleted
deployment.apps "ratings-v1" deleted
service "reviews" deleted
serviceaccount "bookinfo-reviews" deleted
deployment.apps "reviews-v1" deleted
deployment.apps "reviews-v2" deleted
deployment.apps "reviews-v3" deleted
service "productpage" deleted
serviceaccount "bookinfo-productpage" deleted
deployment.apps "productpage-v1" deleted

$ kubectl get all -n demo
No resources found in demo namespace.

$ kubectl delete ns demo
namespace "demo" deleted

相關指南:

如何在OpenShift 4.x上安裝Istio Service Mesh

在EKS上安裝CloudWatch Container Insights | Kubernetes

這是續集。
您可以通過以下鏈接以PDF格式下載本文來支持我們。

以PDF格式下載指南


這是續集。

這是續集。
這是續集。

Sidebar