在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