让我们使用Amazon EKS来尝试使用Istio、Kiali、Grafana和Jaeger!

服务网格对于微服务来说是必不可少的吗?光听说这个概念还是不太理解,所以决定亲自体验一下最著名的开源软件Istio。

顺便试用一下与示例应用程序捆绑的云原生系列监控OSS。

準備所需之物品

    • ハンズオン用PC(本記事ではM1 Mac)

 

    • CLIツール(本記事ではMac標準ターミナル)

 

    AWSアカウント

Istio&Kiali实践课程

安装必要的工具

安装AWS CLI。

 

执行AWS CLI的初始设置,并将其绑定到您的AWS帐户中。

 

在Mac终端执行以下操作。

$ aws configure
AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Default region name [None]: ap-northeast-1
Default output format [None]: json
スクリーンショット 2022-06-11 22.10.10.png

使用Homebrew很方便地在电脑上安装eksctl和kubectl两个工具。

 

创建EKS集群

在Mac的终端上执行EKS集群创建命令。

$ eksctl create cluster --name お好きなクラスター名

大约等待20分钟,集群创建完成。试着获取节点列表。

$ kubectl get node
NAME                                                STATUS   ROLES    AGE   VERSION
ip-192-168-26-107.ap-northeast-1.compute.internal   Ready    <none>   13m   v1.22.6-eks-7d68063
ip-192-168-73-174.ap-northeast-1.compute.internal   Ready    <none>   13m   v1.22.6-eks-7d68063

安装 Istio

从这里开始利用官方网页的入门指南。

 

下载最新版本的Istio(本次为1.14.1版本)。

$ curl -L https://istio.io/downloadIstio | sh -

进入下载的Istio目录。

$ cd istio-1.14.1

在Mac上添加用于Istio的环境变量。

$ export PATH=$PWD/bin:$PATH

安装istioctl。

$ istioctl install --set profile=demo -y

请查看Istio的版本。

$ istioctl version
client version: 1.14.1
control plane version: 1.14.1
data plane version: 1.14.1 (2 proxies)

启用用于 Istio 的命名空间设置到 EKS 集群。

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

将示例应用部署到EKS上。

在我的EKS集群上部署Istio测试用的示例应用程序”boolinfo”。

$ kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml

确认已经部署的服务。

$ kubectl get services

NAME          TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
details       ClusterIP   10.100.124.27    <none>        9080/TCP   4m14s
kubernetes    ClusterIP   10.100.0.1       <none>        443/TCP    49m
productpage   ClusterIP   10.100.251.75    <none>        9080/TCP   4m13s
ratings       ClusterIP   10.100.54.25     <none>        9080/TCP   4m14s
reviews       ClusterIP   10.100.249.201   <none>        9080/TCP   4m13s

等一下,再检查一下Pod是否已经启动了。

$ kubectl get pods

NAME                              READY   STATUS    RESTARTS   AGE
details-v1-7d88846999-j97r2       2/2     Running   0          98s
productpage-v1-7795568889-vzg9j   2/2     Running   0          98s
ratings-v1-754f9c4975-btfk9       2/2     Running   0          98s
reviews-v1-55b668fc65-rg2ft       2/2     Running   0          98s
reviews-v2-858f99c99-dkmmk        2/2     Running   0          98s
reviews-v3-7886dd86b9-m9xqh       2/2     Running   0          98s

在已部署的”ratings”应用程序的Pod上执行确认动作命令。
如果返回了HTML页面的标题部分,则表示正常。

$ kubectl exec "$(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}')" -c ratings -- curl -sS productpage:9080/productpage | grep -o "<title>.*</title>"
<title>Simple Bookstore App</title>

使外部能够访问样例应用

部署Ingress Gateway到EKS集群中。

$ kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml

确认服务网格上是否存在问题。

$ istioctl analyze
✔ No validation issues found when analyzing namespace: default.

验证 Ingress Gateway 服务的外部 IP。
对于使用 eksctl 默认设置创建的 EKS 集群来说,可以将 ELB 的公共 DNS 名称直接用作 Ingress Gateway。

$ kubectl get svc istio-ingressgateway -n istio-system
NAME                   TYPE           CLUSTER-IP     EXTERNAL-IP                                                                    PORT(S)                                                                      AGE
istio-ingressgateway   LoadBalancer   10.100.8.158   ********.ap-northeast-1.elb.amazonaws.com   15021:32244/TCP,80:31172/TCP,443:32028/TCP,31400:32681/TCP,15443:30730/TCP   29m

设置Ingress的环境变量。

$ export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')
$ export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')
$ export SECURE_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="https")].port}')
$ export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT

确认外部公开使用的主机和端口组合是否正确配置。

$ echo "$GATEWAY_URL"
********.ap-northeast-1.elb.amazonaws.com:80

实际尝试进行外部访问。

$ open http://$GATEWAY_URL/productpage
スクリーンショット 2022-06-12 0.04.34.png

尝试在仪表盘上将服务网格可视化。

部署监控类插件工具,如Kiali和Grafana。

$ kubectl apply -f samples/addons

执行以下命令并等待Kiali成功部署。

$ kubectl rollout status deployment/kiali -n istio-systemWaiting for deployment "kiali" rollout to finish: 0 of 1 updated replicas are available...
deployment "kiali" successfully rolled out

然后尝试启动Kiali。

$ istioctl dashboard kiali
スクリーンショット 2022-06-12 0.05.00.png
スクリーンショット 2022-06-12 0.12.40.png

当图表不够鲜明时,可以尝试操作或重新加载bookinfo应用程序。您可以从右上角的登录按钮,使用ID/密码为“admin”进行登录操作。

Grafana&Jaeger手把手实操

实际上,在安装Kiali时,samples/addons文件夹中包含了一些著名的云原生监控工具。

    • Prometheus

 

    • Grafana

 

    • Jaeger

 

    Zipkin

由于已经与Kiali一起部署完成,所以试着启动一下。

我尝试使用Grafana。

首先启动监控仪表盘开源软件Grafana。

$ istioctl dashboard grafana
スクリーンショット 2022-06-12 14.27.50.png

我也试试触摸Jaeger。

首先我们尝试启动用于分布式追踪的开源软件Jaeger。
首先需要启用追踪功能。

istioctl install --set meshConfig.enableTracing=true
This will install the Istio 1.14.1 default profile with ["Istio core" "Istiod" "Ingress gateways"] components into the cluster. Proceed? (y/N) y

启动Jaeger。

$ istioctl dashboard jaeger
スクリーンショット 2022-06-12 14.37.14.png
スクリーンショット 2022-06-12 14.38.18.png

最後

我想尝试一下Istio官方的”下一步”,接下来是获取入门。
如果对监控类开源软件感兴趣,还可以尝试一下Prometheus、Zipkin等。

如果暂时结束了Hands-on体验的话,以下是清洁工作。

    EKSクラスターの削除
$ eksctl delete cluster --name 自分のクラスター名
    環境変数のクリア
$ unset INGRESS_HOST
$ unset INGRESS_PORT
$ unset SECURE_INGRESS_PORT
$ unset GATEWAY_URL
广告
将在 10 秒后关闭
bannerAds