让我们使用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
使用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
尝试在仪表盘上将服务网格可视化。
部署监控类插件工具,如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
当图表不够鲜明时,可以尝试操作或重新加载bookinfo应用程序。您可以从右上角的登录按钮,使用ID/密码为“admin”进行登录操作。
Grafana&Jaeger手把手实操
实际上,在安装Kiali时,samples/addons文件夹中包含了一些著名的云原生监控工具。
-
- Prometheus
-
- Grafana
-
- Jaeger
- Zipkin
由于已经与Kiali一起部署完成,所以试着启动一下。
我尝试使用Grafana。
首先启动监控仪表盘开源软件Grafana。
$ istioctl dashboard grafana
我也试试触摸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
最後
我想尝试一下Istio官方的”下一步”,接下来是获取入门。
如果对监控类开源软件感兴趣,还可以尝试一下Prometheus、Zipkin等。
如果暂时结束了Hands-on体验的话,以下是清洁工作。
- EKSクラスターの削除
$ eksctl delete cluster --name 自分のクラスター名
- 環境変数のクリア
$ unset INGRESS_HOST
$ unset INGRESS_PORT
$ unset SECURE_INGRESS_PORT
$ unset GATEWAY_URL