k8s-服务网格实战-入门Istio
背景
终于进入大家都比较感兴趣的服务网格系列了,在前面已经讲解了:
如何部署应用到
kubernetes
服务之间如何调用
如何通过域名访问我们的服务
如何使用
kubernetes
自带的配置ConfigMap
基本上已经够我们开发一般规模的 web 应用了;但在企业中往往有着复杂的应用调用关系,应用与应用之间的请求也需要进行管理。比如常见的限流、降级、trace、监控、负载均衡等功能。
在我们使用 kubernetes
之前往往都是由微服务框架来解决这些问题,比如 Dubbo、SpringCloud 都有对应的功能。
但当我们上了 kubernetes
之后这些事情就应该交给一个专门的云原生组件来解决,也就是本次会讲到的 Istio
,它是目前使用最为广泛的服务网格解决方案。
官方对于 Istio 的解释比较简洁,落到具体的功能点也就是刚才提到的:
限流降级
路由转发、负载均衡
入口网关、
TLS安全认证
灰度发布等

再结合官方的架构图可知: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
这个的
profile
还有以下不同的值,为了演示我们使用 demo
即可。
使用
# 开启 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 负载均衡测试时的代码。
还是进行负载均衡测试,效果是一样的,说明
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
中配置的功能。
其实各大云平台厂商都有提供类似的能力,比如阿里云的 EDAS 等。
本文的所有源码在这里可以访问:https://github.com/crossoverJie/k8s-combat
往期推荐
如何优雅重启 kubernetes 的 Pod
在 kubernetes 环境中实现 gRPC 负载均衡
五分钟k8s入门到实战-应用配置
五分钟k8s实战-使用Ingress
k8s入门到实战--跨服务调用
点分享
点收藏
点点赞
点在看
相关文章:

k8s-服务网格实战-入门Istio
istio-01.png 背景 终于进入大家都比较感兴趣的服务网格系列了,在前面已经讲解了: 如何部署应用到 kubernetes服务之间如何调用如何通过域名访问我们的服务如何使用 kubernetes 自带的配置 ConfigMap 基本上已经够我们开发一般规模的 web 应用了…...

金属压铸件自动化3D全尺寸测量设备自动外观检测三维检测-CASAIM
铸造作为现代装备制造工业的基础共性技术之一,铸件产品既是工业制造产品,也是大型机械的重要组成部分,被广泛运用在航空航天、工业船舶、机械电子和交通运输等行业。 铸件形状复杂,一般的三坐标或者卡尺圆规等工具难以获取多特征…...

Android笔记(十):结合Navigation组件实现Compose界面的导航
在Android笔记(七)搭建Android JetPack Compose组件中Scaffold脚手架 一文中通过定义一个导航的函数来实现不同界面的切换。如果没有传递任何参数,这样的导航处理也是可以接受的,处理方式也非常简单。但是,如果考虑到不…...
linux内核tcp配置--断网后连接卡住
通过隐藏通信应用程序中的临时网络中断,TCP 可以在偶尔不可靠的网络上提供可靠的通信。在通知发件人任何问题之前,您的操作系统将多次重发丢失的消息。大多数 Linux 发行版默认将任何丢失的数据包重传 15 次。重新传输以指数方式回退,因此这 …...

Apache Pulsar 在腾讯云上的最佳实践
导语 由 StreamNative 主办的 Pulsar Meetup Beijing 2023 在2023年10月14日完美落幕,本次活动大咖云集,来自腾讯、滴滴、华为、智联招聘、RisingWave 和 StreamNative 的行业专家们一起,深入探讨 Pulsar 在生产环境中的最佳应用实践&#x…...

VMware 虚拟机安装 CentOS 7
CentOS 7 1. 下载CentOS 7 iso镜像 Index of /centos/7.9.2009/isos/x86_64/ 2. Vmware安装CentOS 7 安装教程: 超详细VMware CentOS7(最小安装)安装教程_虚拟机最小化安装-CSDN博客 【精选】VMware 安装 Centos7 详细过程_vm虚拟机安装centos7_expectation Fu…...
UnityAI——个体AI角色的操控行为脚本
注:本文用到了前文所用的基类UnityAI——操控行为编程的主要基类-CSDN博客 在一些游戏中,可能会遇到想让AI角色追逐或者避开玩家的情况。 如在飞机模拟游戏中,让导弹跟踪和进攻玩家或玩家的飞行器。这种情况下,可以运用本节介绍…...

ssh登录界面变成vim提示,进不去系统
是ubuntu系统 使用远程连接root,进去后发现界面变成vim编辑器的介绍界面了 使用普通用户登录 查询用户的登录shell是不是有问题 sudo vim /etc/passwd 发现用户shell变成了vim编辑器 修改为/bin/bash就可以正常登录了 重新登录测试就正常了...

虹科示波器 | 汽车免拆检修 | 2012 款上汽大众帕萨特车 发动机偶尔无法起动
一、故障现象 一辆2012款上汽大众帕萨特车,搭载CFB发动机,累计行驶里程约为12万km。车主反映,将点火开关置于起动挡,偶尔只能听到“咔哒”一声,起动机没有反应,类似蓄电池亏电时起动发动机的现象。为此&…...

UE5.0.3版本 像素流送 Pixel Streaming
目录 0 引言1 准备工作1.1 下载Node.js1.2 下载 PixelStreaming(非必须) 2 快速入门2.1 打包工程2.2 启动信令服务器2.3 启动工程2.4 打开网页 3 总结 🙋♂️ 作者:海码007📜 专栏:UE虚幻引擎专栏&#x…...

BetterDisplay Pro v1.4.15(显示器管理管理软件)
BetterDisplay Pro是一款屏幕显示优化工具,可用于Windows和Mac操作系统。它可以帮助用户调整屏幕的亮度、对比度、色彩等参数,以获得更好的视觉体验。此外,BetterDisplay Pro还提供了一些额外的功能,如屏幕分割、窗口管理、快捷键…...
蓝桥等考C++组别四级006
第一部分:选择题 1、C L4 (20分) 以下选项中,不是逻辑运算符的选项是( )。 A.! B.|| C.&& D.< 正确答案:D 2、C L4 (20分) …...

app开发之后需要做什么
在完成app的开发之后,还有一系列的工作需要进行,以确保app的顺利上线和用户的良好体验。下面将从原理和详细介绍两个方面来介绍app开发之后需要做的工作。 一、原理介绍 1. 测试与调试:在app开发完成后,需要进行全面的测试与调试…...
某汽车金融企业:搭建SDLC安全体系,打造智慧金融服务样本
某汽车金融企业是国内头部汽车金融公司,已经为超过数百万名客户提供专业的汽车金融服务。该公司通过近几年的数字化创新,在提升客户体验、提高管理效率、降低经营成本等方面已具备很强的服务能力,让客户获得更方便、更快捷、更灵活的金融服务…...
iOS GCD(Grand Central Dispatch)
iOS 常用有三种线程管理方式,分别是 NSThread、GCD 与 NSOperation,现在我们先来了解一下其中的 GCD 串行与并行针对的是任务队列,而同步与异步,针对的则是线程。 Serial Queue Sync 序列执行同步 Serial Queue Async 序列执…...

Cross-Entropy Loss(多分类损失函数)
文章目录 1. 网络输出output:score2. Cross-Entropy Loss(多分类损失函数) 1. 网络输出output:score 2. Cross-Entropy Loss(多分类损失函数) 先用softmax function把score 变成 probabilities。再用交叉熵损失函数来进行Loss的计算...

TP858 3BSE018138R1 具有高性能CPU的工业PC技术
TP858 3BSE018138R1 具有高性能CPU的工业PC技术 为了充分利用新电脑的扩展图形功能,如DirectX,Beckhoff Automation重新设计了TwinCAT automation软件套件中的Scope工具。这为TwinCAT用户在灵活的软件环境中提供了一系列令人印象深刻的测量技术。改进的…...

Observability:使用 OpenTelemetry 手动检测 .NET 应用程序
作者:David Hope 在快节奏的软件开发领域,尤其是在云原生领域,DevOps 和 SRE 团队日益成为应用程序稳定性和增长的重要合作伙伴。 DevOps 工程师不断优化软件交付,而 SRE 团队则充当应用程序可靠性、可扩展性和顶级性能的管理者。…...
生产事故:redis主从的坑
一、问题 昨天生产redis缩容,3主3从模式,重启了服务器,重启了redis; 结果今天发现生产服务报错了,连接不上redis。 排查发现,由于生产后台只配置了一个redis的ip,本来是主redis的ip的&#x…...
maven本地仓库有依赖包,还会远程下载的问题
maven本地仓库有依赖包,还会远程下载的问题 传送门...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...

LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...

【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...

OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...

在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例
目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码:冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...

yaml读取写入常见错误 (‘cannot represent an object‘, 117)
错误一:yaml.representer.RepresenterError: (‘cannot represent an object’, 117) 出现这个问题一直没找到原因,后面把yaml.safe_dump直接替换成yaml.dump,确实能保存,但出现乱码: 放弃yaml.dump,又切…...