当前位置: 首页 > news >正文

k8s-服务网格实战-入门Istio

be27d89c8fcf96b679bbdb0b06e5b9d5.png

istio-01.png

背景

终于进入大家都比较感兴趣的服务网格系列了,在前面已经讲解了:

  • 如何部署应用到 kubernetes

  • 服务之间如何调用

  • 如何通过域名访问我们的服务

  • 如何使用 kubernetes 自带的配置 ConfigMap

基本上已经够我们开发一般规模的 web 应用了;但在企业中往往有着复杂的应用调用关系,应用与应用之间的请求也需要进行管理。比如常见的限流、降级、trace、监控、负载均衡等功能。

在我们使用 kubernetes 之前往往都是由微服务框架来解决这些问题,比如 Dubbo、SpringCloud 都有对应的功能。

但当我们上了 kubernetes 之后这些事情就应该交给一个专门的云原生组件来解决,也就是本次会讲到的 Istio,它是目前使用最为广泛的服务网格解决方案。

521ec8649cb23fa08d191310228afc14.png官方对于 Istio 的解释比较简洁,落到具体的功能点也就是刚才提到的:

  • 限流降级

  • 路由转发、负载均衡

  • 入口网关、TLS安全认证

  • 灰度发布等

915a5554699da2203d6b2e508a0403ac.png
image.png

再结合官方的架构图可知:Istio 分为控制面 control plane 和数据面 data plane

控制面可以理解为 Istio 自身的管理功能:

  • 比如服务注册发现

  • 管理配置数据面所需要的网络规则等

而数据面可以简单的把他理解为由 Envoy 代理的我们的业务应用,我们应用中所有的流量进出都会经过 Envoy 代理。

所以它可以实现负载均衡、熔断保护、认证授权等功能。

安装

首先安装 Istio 命令行工具

这里的前提是有一个 kubernetes 运行环境

Linux 使用:

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

Mac 可以使用 brew:

brew install istioctl

其他环境可以下载 Istio 后配置环境变量:

export PATH=$PWD/bin:$PATH

之后我们可以使用 install 命令安装控制面。

这里默认使用的是 kubectl 所配置的 kubernetes 集群

istioctl install --set profile=demo -y

f25ddf4f9bd04c631f4f32a80d8a6766.png这个的 profile 还有以下不同的值,为了演示我们使用 demo 即可。36f26dd8b2a08f1c14c12263932bf95e.png

使用

# 开启 default 命名空间自动注入
$ k label namespace default istio-injection=enabled$ k describe ns default
Name:         default
Labels:       istio-injection=enabledkubernetes.io/metadata.name=default
Annotations:  <none>
Status:       Active
No resource quota.
No LimitRange resource.

之后我们为 namespace 打上 label,使得 Istio 控制面知道哪个 namespace 下的 Pod 会自动注入 sidecar

这里我们为 default 这个命名空间打开自动注入 sidecar,然后在这里部署我们之前使用到的 deployment-istio.yaml

$ k apply -f deployment/deployment-istio.yaml$ k get pod
NAME                                  READY   STATUS    RESTARTS
k8s-combat-service-5bfd78856f-8zjjf   2/2     Running   0          
k8s-combat-service-5bfd78856f-mblqd   2/2     Running   0          
k8s-combat-service-5bfd78856f-wlc8z   2/2     Running   0

此时会看到每个Pod 有两个 container(其中一个就是 istio-proxy sidecar),也就是之前做 gRPC 负载均衡测试时的代码。

a9eb87bf31359e128ef402495c2406e6.png还是进行负载均衡测试,效果是一样的,说明 Istio 起作用了。

此时我们再观察 sidecar 的日志时,会看到刚才我们所发出和接受到的流量:

$ k logs -f k8s-combat-service-5bfd78856f-wlc8z -c istio-proxy[2023-10-31T14:52:14.279Z] "POST /helloworld.Greeter/SayHello HTTP/2" 200 - via_upstream - "-" 12 61 14 9 "-" "grpc-go/1.58.3" "6d293d32-af96-9f87-a8e4-6665632f7236" "k8s-combat-service:50051" "172.17.0.9:50051" inbound|50051|| 127.0.0.6:42051 172.17.0.9:50051 172.17.0.9:40804 outbound_.50051_._.k8s-combat-service.default.svc.cluster.local default
[2023-10-31T14:52:14.246Z] "POST /helloworld.Greeter/SayHello HTTP/2" 200 - via_upstream - "-" 12 61 58 39 "-" "grpc-go/1.58.3" "6d293d32-af96-9f87-a8e4-6665632f7236" "k8s-combat-service:50051" "172.17.0.9:50051" outbound|50051||k8s-combat-service.default.svc.cluster.local 172.17.0.9:40804 10.101.204.13:50051 172.17.0.9:54012 - default
[2023-10-31T14:52:15.659Z] "POST /helloworld.Greeter/SayHello HTTP/2" 200 - via_upstream - "-" 12 61 35 34 "-" "grpc-go/1.58.3" "ed8ab4f2-384d-98da-81b7-d4466eaf0207" "k8s-combat-service:50051" "172.17.0.10:50051" outbound|50051||k8s-combat-service.default.svc.cluster.local 172.17.0.9:39800 10.101.204.13:50051 172.17.0.9:54012 - default
[2023-10-31T14:52:16.524Z] "POST /helloworld.Greeter/SayHello HTTP/2" 200 - via_upstream - "-" 12 61 28 26 "-" "grpc-go/1.58.3" "67a22028-dfb3-92ca-aa23-573660b30dd4" "k8s-combat-service:50051" "172.17.0.8:50051" outbound|50051||k8s-combat-service.default.svc.cluster.local 172.17.0.9:44580 10.101.204.13:50051 172.17.0.9:54012 - default
[2023-10-31T14:52:16.680Z] "POST /helloworld.Greeter/SayHello HTTP/2" 200 - via_upstream - "-" 12 61 2 2 "-" "grpc-go/1.58.3" "b4761d9f-7e4c-9f2c-b06f-64a028faa5bc" "k8s-combat-service:50051" "172.17.0.10:50051" outbound|50051||k8s-combat-service.default.svc.cluster.local 172.17.0.9:39800 10.101.204.13:50051 172.17.0.9:54012 - default

总结

本期的内容比较简单,主要和安装配置相关,下一期更新如何配置内部服务调用的超时、限流等功能。

其实目前大部分操作都是偏运维的,即便是后续的超时配置等功能都只是编写 yaml 资源。

但在生产使用时,我们会给开发者提供一个管理台的可视化页面,可供他们自己灵活配置这些原本需要在 yaml 中配置的功能。

f4cf4afbe7302d029282abb3dc6ab91e.png其实各大云平台厂商都有提供类似的能力,比如阿里云的 EDAS 等。

本文的所有源码在这里可以访问:https://github.com/crossoverJie/k8s-combat

往期推荐

如何优雅重启 kubernetes 的 Pod

在 kubernetes 环境中实现 gRPC 负载均衡

五分钟k8s入门到实战-应用配置

五分钟k8s实战-使用Ingress

k8s入门到实战--跨服务调用

e433d02d400ba13096ee1a893da18f65.gif

点分享

0c7a03597a1b38f0406c69a3b8581bbf.gif

点收藏

17be4d499be0d22b6f3882c05458c1f3.gif

点点赞

4f1cafad2ad797728a4038af171e1acc.gif

点在看

http://www.lryc.cn/news/216344.html

相关文章:

  • 金属压铸件自动化3D全尺寸测量设备自动外观检测三维检测-CASAIM
  • Android笔记(十):结合Navigation组件实现Compose界面的导航
  • linux内核tcp配置--断网后连接卡住
  • Apache Pulsar 在腾讯云上的最佳实践
  • VMware 虚拟机安装 CentOS 7
  • UnityAI——个体AI角色的操控行为脚本
  • ssh登录界面变成vim提示,进不去系统
  • 虹科示波器 | 汽车免拆检修 | 2012 款上汽大众帕萨特车 发动机偶尔无法起动
  • UE5.0.3版本 像素流送 Pixel Streaming
  • BetterDisplay Pro v1.4.15(显示器管理管理软件)
  • 蓝桥等考C++组别四级006
  • app开发之后需要做什么
  • 某汽车金融企业:搭建SDLC安全体系,打造智慧金融服务样本
  • iOS GCD(Grand Central Dispatch)
  • Cross-Entropy Loss(多分类损失函数)
  • TP858 3BSE018138R1 具有高性能CPU的工业PC技术
  • Observability:使用 OpenTelemetry 手动检测 .NET 应用程序
  • 生产事故:redis主从的坑
  • maven本地仓库有依赖包,还会远程下载的问题
  • 动作捕捉系统处理单点多点丢点问题
  • FIFO 位宽转换
  • 瑞明达:聚“追梦”之力,共圆“经济梦”
  • UE5数字孪生制作(一) - QGIS 学习笔记
  • STM32 使用HAL库,HAL_Delay()会卡死, 程序一直卡在 HAL_GetTick( ) 函数中(已解决)
  • Maven Repository使用
  • 智安网络|保护您的应用程序免受攻击:重要的安全强化措施
  • python3.8 use async getting invalid sysntax
  • Mac 解决 APP 快捷键冲突
  • mysql之事务
  • 组件化npm包打包和使用