Kubnernetes 部署 Kiali

随着微服务架构的流行,服务网格技术获得了业界的广泛关注,作为实现云原生的重要积木,各大厂商也纷纷开始布局,Amazon在2019年4月份推出了App Mesh;Google、IBM、Lyft联合开发了Istio。

Istio作为下一代服务网格的整体解决方案,得到了业界的普遍认可,站在kubernetes巨人的肩膀上,极大地提高了分布式应用的研发和运维效率。

2020是云原生普及的一年,如何部署、使用、运维Istio又是必须要学习知识,本篇希望带给大家一个完美的入门体验。

一、安装环境

  • 本地环境:Linux ubuntu
  • kubernetes版本:1.15.2

二、准备工作

1、下载最新版本

从Istio最新发布列表下载最新发布版本1.4.3压缩包,及其命令行工具(Istioctl),如下:

# 创建工作目录
mkdir -p /root/service-mesh/istio && cd /root/service-mesh/istio;
# 下载
wget https://github.com/istio/istio/releases/download/1.4.3/istioctl-1.4.3-linux.tar.gz;
## istio也可以演示的时候在下载
wget https://github.com/istio/istio/releases/download/1.4.3/istio-1.4.3-linux.tar.gz;

话外音:请下载相同版本的Istioctl和Istio,避免无法预料的问题。

2、安装命令行工具

tar -vxzf istioctl-1.4.3-linux.tar.gz && cp istioctl /usr/local/bin;

三、安装Istio

为了满足不同的安装需求,Istio内置了一系列的安装配置文件,生产环境建议以default安装配置文件为起点。

话外音:可以使用istioctl profile list命令查看内置配置文件列表,然后使用istioctl profile dump [配置文件名称]打印配置文件内容。

# 安装 default
# istioctl manifest apply --set profile=default
- Applying manifest for component Base...
 Finished applying manifest for component Base.
- Applying manifest for component Galley...
- Applying manifest for component IngressGateway...
- Applying manifest for component Citadel...
- Applying manifest for component Kiali...
- Applying manifest for component Prometheus...
- Applying manifest for component Policy...
- Applying manifest for component Pilot...
- Applying manifest for component Injector...
- Applying manifest for component Telemetry...
 Finished applying manifest for component IngressGateway.
 Finished applying manifest for component Citadel.
 Finished applying manifest for component Prometheus.
 Finished applying manifest for component Policy.
 Finished applying manifest for component Galley.
 Finished applying manifest for component Injector.
 Finished applying manifest for component Pilot.
- Finished applying manifest for component Kiali.
 Finished applying manifest for component Telemetry.
# 验证
# kubectl get pod -n istio-system
NAME                                      READY   STATUS    RESTARTS   AGE
istio-citadel-7c959c8d59-hssf4            1/1     Running   0          100m
istio-galley-5479df66b5-tr5hf             2/2     Running   0          100m
istio-ingressgateway-7c95796d59-s5sc2     1/1     Running   0          100m
istio-pilot-656556b575-7zzht              2/2     Running   0          100m
istio-policy-5b9b9f5cd9-788rg             2/2     Running   6          100m
istio-sidecar-injector-7dbcc9fc89-554vg   1/1     Running   0          100m
istio-telemetry-7d5b5947db-tgbmg          2/2     Running   6          100m
prometheus-685585888b-5f77l               1/1     Running   0          100m

等待几分钟,当所有的组件状态都为Running时,表示安装成功。

四、安装kiali

通过将基础设施转移到Istio,使得应用开发者无需重复建设基础设施,只需专注于业务逻辑。Istio负责管理整个应用服务集合,这些服务集合组成的网络拓扑就叫服务网格,Istio提供了kiali来可视化整个服务网格。

1、创建登录凭证

# KIALI_USERNAME=$(read -p 'Kiali Username: ' uval && echo -n $uval | base64);
Kiali Username: 用户名
# KIALI_PASSPHRASE=$(read -sp 'Kiali Passphrase: ' pval && echo -n $pval | base64);
Kiali Passphrase: 密码
# cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
  name: kiali
  namespace: istio-system
  labels:
    app: kiali
type: Opaque
data:
  username: $KIALI_USERNAME
  passphrase: $KIALI_PASSPHRASE
EOF

2、使用Istioctl安装

# istioctl manifest apply --set values.kiali.enabled=true
[...]
 Finished applying manifest for component Kiali.
[...]

3、联网

使用NodePort方式暴露kiali服务到互联网,如下:

话外音:应该根据k8s环境选择不同联网方式,生产环境建议暴露为LoadLalancer

# kubectl -n istio-system edit svc kiali
[...]
spec:
  ports:
  - name: http-kiali
    [...]
    nodePort: 9527
  type: NodePort
[...]

4、访问

浏览器键入地址http://[ip]:9527/kiali,键入上面创建的凭证,登录成功,如下:

img

五、演示

本节将部署一个多语言异构化的微服务示例(Bookinfo),让大家对服务网格有一个清晰的认识。

Bookinfo - 在线图书商店

  • productpage微服务 调用detailsreviews微服务,提供图书单品完整信息。
  • details微服务 提供图书详细信息。
  • reviews微服务 提供图书评论信息。 一共有三个版本。v1版本不会调用ratings微服务;v2版本调用ratings服务,并将每个等级显示为1到5个黑色星号;v3版本调用ratings服务,并将每个等级显示为1到5个红色星号。
  • ratings微服务 提供图书排行榜信息。

一图胜千言,整体架构如下:

img

部署Bookinfo到Istio

将Bookinfo部署到k8s默认命名空间,即default。

1、启动边车自动注入

kubectl label namespace default istio-injection=enabled

2、部署到k8s

# 进入工作目录解压刚刚下载的Istio
root@just: cd /root/service-mesh/istio && tar -vxzf istio-1.4.3-linux.tar.gz 
# 使用kubectl部署到k8s
root@just: kubectl apply -f istio-1.4.3/samples/bookinfo/platform/kube/bookinfo.yaml
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

3、联网

# 为Bookinfo部署入口网关
root@just: kubectl apply -f istio-1.4.3/samples/bookinfo/networking/bookinfo-gateway.yaml
gateway.networking.istio.io/bookinfo-gateway created
virtualservice.networking.istio.io/bookinfo created
# 获取网关地址
root@just: export INGRESS_HOST=$(kubectl get po -l istio=ingressgateway -n istio-system -o jsonpath='{.items[0].status.hostIP}'
root@just: export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')
root@just: export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT
# 获取图书单品页地址
echo http://${GATEWAY_URL}/productpage

4、访问

img

5、查看服务网格

不停地刷新图书单品页,kiali会实时地绘制服务网格,如下:

img

基于权重流量的实时控制,如下:

img

对于服务的可观察性,kiali还提供了很多其他的功能,这也是Istio相较于其他服务网格框架的优势,这里就不展示了。

六、总结

本篇使用Istioctl搭建了一套完整的Istio系统,先从战略上鸟瞰Istio,进一步从战术上学习Istio将更加容易,作为一个完整解决方案,后面系列将一步步学习如何运用Istio的连接、安全、控制、可观察性全面地治理分布式应用。

七、参考

https://github.com/istio/istio/releases

https://istio.io/docs/setup/additional-setup/config-profiles

https://istio.io/docs/setup/getting-started

https://istio.io/docs/setup/install/istioctl/#customizing-the-configuration

https://istio.io/docs/reference/commands/istioctl

https://istio.io/docs/ops/diagnostic-tools/istioctl

https://istio.io/news/releases/1.4.x/announcing-1.4.3

https://istio.io/docs/examples/bookinfo

https://istio.io/docs/tasks/traffic-management/ingress/ingress-control/#determining-the-ingress-ip-and-ports

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

这些信息有用吗?
Do you have any suggestions for improvement?

Thanks for your feedback!