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

Istio Sidecar启动顺序 - 导致的应用容器网络不通

目录

    • 一、问题
    • 二、Istio 1.7及其之后版本的解决方案
      • 2.1 方式1:安装Istio时全局设置
      • 2.2 方式2:在应用Deployment通过annotation设置
      • 2.3 holdApplicationUntilProxyStarts启用效果
    • 三、Istio 1.7之前的解决方案

一、问题

线上应用集成了Spring Cloud K8S Config模块,在应用启动时会读取K8S ConfigMap作为配置,最近观察到线上应用在启动时报如下异常日志(偶发,并不是一直出现),提示应用无法获取K8S ConfigMap配置,并且K8s ConfigMap中的配置也没有实际生效。

2023-02-28 11:18:16.950+0800 [main] WARN  o.s.c.k.f.c.Fabric8ConfigMapPropertySource - 
`Can't read configMap with name: [my-app] in namespace: [my-app-ns]. Ignoring.`
io.fabric8.kubernetes.client.KubernetesClientException: 
`Operation: [get]  for kind: [ConfigMap]  with name: [my-app]  in namespace: [my-app-ns]  failed`.
...
Caused by: java.net.ConnectException: `Failed to connect to /10.96.0.1:443`at okhttp3.internal.connection.RealConnection.connectSocket(RealConnection.kt:297)
...
Caused by: java.net.ConnectException: `Connection refused (Connection refused)`at java.base/java.net.PlainSocketImpl.socketConnect(Native Method)at java.base/java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)	
...

在排除了K8S RBAC权限配置问题、K8S集群网络问题后,最终注意到该后端应用部署时集成了Istio,也即自动注入了Istio Sidecar。
由于pod内容器按照spec.containers中的声明顺序依次启动,而initContainers会在所有容器启动前执行,故容器的启动顺序如下:

istio-init
app
istio-proxy

即istio-init修改pod内iptables令istio-proxy接管pod内所有流量(令app内的所有网络请求都需要经过istio-proxy),而app启动的过程中若发起网络请求,此时istio-proxy有可能还没有启动完成,导致网络异常。
也即是应用读取K8S ConfigMap时,istio-proxy还没启动完成导致网络连接被拒绝。
以上问题的解决方案就是使应用容器在istio-proxy启动成功后再启动,如此便可避免网络异常问题。

二、Istio 1.7及其之后版本的解决方案

在istio 1.7的change notes中宣布支持values.global.proxy.holdApplicationUntilProxyStarts配置选项以支持设置sidecar优先启动,
values.global.proxy.holdApplicationUntilProxyStarts默认关闭,可通过如下设置开启:

--set values.global.proxy.holdApplicationUntilProxyStarts=true

2.1 方式1:安装Istio时全局设置

# 默认使用default profile(可通过--set profile=default|demo|...调整)
istioctl install
# 设置sidecar优先启动(且sidecar启动成功后再启动其他应用容器) - 1.7新特性
--set values.global.proxy.holdApplicationUntilProxyStarts=true

2.2 方式2:在应用Deployment通过annotation设置

注:
此种方式暂未实际测试,暂无Istio 1.7+环境,根据Istio官方文档整理而来,
具体Istio官方文档说明参见:
https://istio.io/latest/docs/reference/config/istio.mesh.v1alpha1/#ProxyConfig

核心annotations如下:

annotations:# 重点:配置proxy - 设置proxy启动成功后再启动其他应用proxy.istio.io/config: |holdApplicationUntilProxyStarts: true

具体设置如下:

apiVersion: apps/v1
kind: Deployment
metadata:name: my-applabels:app: my-appversion: v1
spec:selector:matchLabels:app: my-appversion: v1replicas: 1template:metadata:labels:app: my-appversion: v1annotations:# 开启Istio Sidecar自动注入sidecar.istio.io/inject: true# 重点:配置proxy - 设置proxy启动成功后再启动其他应用proxy.istio.io/config: |holdApplicationUntilProxyStarts: truespec:containers:- name: appimage: registry/app:latestports:- name: http-portcontainerPort: 8080protocol: TCP       

2.3 holdApplicationUntilProxyStarts启用效果

启用holdApplicationUntilProxyStarts为true,实际效果如下:
(1)将sidecar istio-proxy容器放到pod containers中的第一位(即最先启动);
在这里插入图片描述

(2)设置istio-proxy lifecycle已保证sidecar容器启动成功前一直阻塞(阻塞pod内其他容器启动);
在这里插入图片描述

三、Istio 1.7之前的解决方案

Istio 1.7之前的版本并未提供holdApplicationUntilProxyStarts配置,可结合K8S lifecycle达到同样目的,
即阻塞应用容器,使应用容器监听istio-proxy启动端口,若监听istio-proxy启动端口不通,则重启应用容器(直到istio-proxy启动就绪)。
具体说明可参见:https://github.com/istio/istio/issues/11130#issuecomment-506659562
在这里插入图片描述
核心配置如下:

# 注:此处配置需结合Istio Sidecar注入一起使用,若未开启Istio Sidecar,则移除此配置
lifecycle:postStart:httpGet:path: /healthz/readyport: 15020scheme: HTTP

具体设置如下:

apiVersion: apps/v1
kind: Deployment
metadata:name: my-applabels:app: my-appversion: v1
spec:selector:matchLabels:app: my-appversion: v1replicas: 1template:metadata:labels:app: my-appversion: v1annotations:# 开启Istio Sidecar自动注入sidecar.istio.io/inject: truespec:containers:- name: appimage: registry/app:latestports:- name: http-portcontainerPort: 8080protocol: TCP# 阻塞app容器,使app容器监听sidecar启动端口,若监听sidecar启动端口不通,则重启app容器(直到sidecar启动就绪)lifecycle:postStart:httpGet:path: /healthz/readyport: 15020

实际部署时,可以观察到之前无法读取K8S ConfigMap的日志也会出现,出现此日志则说明Istio Sidecar还未启动成功(网络不通),之后K8S会重启应用容器,再次观察日志则读取K8S ConfigMap成功(无报错日志)。如此通过让应用容器监听Istio Sidecar Readiness Probe,以迫使应用容器在Istio Sidecar未启动成功前反复重启应用容器自身,以保证最终应用容器启动后Istio Sidecar已经启动完成。


参考:
控制pod内container执行顺序的几种姿势
Istio 1.7 是如何保证sidecar的启动顺序的
Github - issues - App container unable to connect to network before sidecar is fully running #11130

相关文章:

Istio Sidecar启动顺序 - 导致的应用容器网络不通

目录一、问题二、Istio 1.7及其之后版本的解决方案2.1 方式1:安装Istio时全局设置2.2 方式2:在应用Deployment通过annotation设置2.3 holdApplicationUntilProxyStarts启用效果三、Istio 1.7之前的解决方案一、问题 线上应用集成了Spring Cloud K8S Con…...

3696. 构造有向无环图

Powered by:NEFU AB-IN Link 文章目录3696. 构造有向无环图题意思路代码3696. 构造有向无环图 题意 Codeforces Round 656 (Div. 3) E 给定一个由 n个点和 m条边构成的图。 不保证给定的图是连通的。 图中的一部分边的方向已经确定,你不能改变它们的方向。 剩下的边…...

RuoYi-Flowable-Plus(代码生成)

RuoYi-Flowable-Plus搭建 若依所有扩展项目的代码生成功能都是一样的&#xff0c;RuoYi-Flowable-Plus为例来演示。 模块创建 1.创建新模块ruoyi-student2.编辑RuoYi-Flowable-Plus\pom.xml <dependency><groupId>com.ruoyi</groupId><artifactId>ruoy…...

训练CV模型常用的方法与技巧

最近参加一个CV比赛&#xff0c;看到有参赛者分享了自己训练图像识别模型时常用到的小技巧&#xff0c;故对其进行记录、整理&#xff0c;方便未来继续学习。整理了很多&#xff0c;它们不一定每次有用&#xff0c;但请记在心中&#xff0c;说不定未来某个任务它们就发挥了作用…...

[Java·算法·中等]LeetCode22. 括号生成

每天一题&#xff0c;防止痴呆题目示例分析思路1题解1分析思路2题解2分析思路3题解3&#x1f449;️ 力扣原文 题目 数字 n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组合。 示例 输入&#xff1a;n 3 输出&…...

Git项目合并实践

Git项目合并实践 一、前言 环境 操作系统&#xff1a;Windows 10 专业版 代码托管平台&#xff1a;Gitee 场景 同一个项目&#xff0c;在某一个时间点&#xff0c;被另外一个团队拷贝和修改&#xff0c;并且代码不在同一个仓库&#xff0c;最后需要合并项目 不是同一个项…...

C++实战md5、base64算法实现(附源码)

C++常用功能源码系列 文章目录 C++常用功能源码系列前言一、常用加密算法1. md5是什么二、源码1. md52. base64、decode总结前言 本文是C/C++常用功能代码封装专栏的导航贴。部分来源于实战项目中的部分功能提炼,希望能够达到你在自己的项目中拿来就用的效果,这样更好的服务…...

P6专题:P6 EPPM和PPM基本概念

目录 引言 Oracles Primavera P6 Enterprise Project Portfolio Management&#xff08;P6 EPPM&#xff09; Oracles Primavera P6 Professional Project Management 引言 Oracle Primavera系列软件专注于项目密集型企业&#xff0c;其整个项目生命周期内所有项目的组合管…...

【为什么事务@Transactional会失效】

在Spring框架中&#xff0c;Transactional注解用于声明一个方法需要被包含在事务中&#xff0c;以确保数据库操作的一致性和完整性。Transactional注解通常用于Service层或DAO层的方法上。 Transactional注解失效可能是由以下原因引起的&#xff1a; 注解未被正确声明或配置&a…...

NLP中的对话机器人——模型的评估

引言 本文是七月在线《NLP中的对话机器人》的视频笔记&#xff0c;主要介绍FAQ问答型聊天机器人的实现。 模型的评估 我们如何评估模型的好坏&#xff1f;由于我们的数据集没有提供测试数据&#xff0c;所以我们很难评估模型的好 坏。如果我们要做非常严谨的评估&#xff0c…...

数据挖掘知识规整与心得体会

一.大数据的特点&#xff1a; 数据多&#xff0c;类型多&#xff0c;更新快&#xff0c;更新内容多。 二.分类&#xff08;classification&#xff09;与混淆矩阵&#xff08;confusion matrix&#xff09; 这里的分类说的是二分类问题&#xff0c;比如说把人分为好人和坏人&a…...

修正一些formdesigner的一些bug与操作

之前集成了formdesigner表单设计器&#xff0c;但还是有些问题&#xff0c;所以进行一些bug修复与功能修正 一、之前组件布局的图标不见了 在main.js里增加下面一行 import /components/formdesigner/assets/iconfont/iconfont.js 效果如下&#xff1a; 二、选择列表没有数…...

前端网络安全

什么是同源策略同源指的是&#xff1a;协议、端口号、域名必须一致。他是浏览器的一个用于隔离潜在恶意文件的重要安全机制。限制了从同一个源加载的文档或脚本&#xff0c;与另一个源的资源进行交互。同源策略主要限制了三个方面&#xff1a;当前域下的js脚本不能够访问其他域…...

docker内存统计

在docker里top和在docker外top看内存都是没有变化的&#xff0c;但是用docker stats看mem uasge就一直在涨top命令和docker stats命令采集内存使用的方式不同所致。top命令采集的是当前进程的内存使用情况&#xff0c;而docker stats命令采集的是整个Docker容器的内存使用情况。…...

【IDEA】IDEA使用有道翻译引擎—详细配置步骤

目录 前言 步骤一&#xff1a;下载翻译工具Translate 步骤二&#xff1a;注册登录有道云平台 步骤三&#xff1a;配置有道翻译 前言 2022年10月 谷歌翻译已经不在中国了&#xff0c;所以IDEA配置谷歌翻译会出错。 步骤一&#xff1a;下载翻译工具Translate 打开idea设置set…...

js求解《初级算法》56.最长公共前缀

一、题目描述 编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀&#xff0c;返回空字符串 ""。 输入&#xff1a;strs ["flower","flow","flight"] 输出&#xff1a;"fl" 输入&#xff1a;strs ["…...

嵌入式Linux(二十四)系统烧写

将uboot&#xff0c;linux kernel&#xff0c;.dtb&#xff0c;rootfs烧写到板子上的EMMC上&#xff0c;避免断网导致不能运行。 1. MfgTool工具介绍 一路解压之后&#xff0c;得到以下两项&#xff1a; ①Profiles文件夹&#xff1a;后续烧写文件放到这个文件夹。  其中关注…...

【ECNU】3496. 贪吃的 xjj 和贪心的 oxx(C++)

目录 题目 输入格式 输出格式 样例 提示 思路 代码 题目 单点时限: 2.0 sec 内存限制: 256 MB oxx 与 xjj 终于到了 Xiamen&#xff0c;他们第一件事就是去吃当地著名的特产椰子饼。 他们共买了 n 盒礼盒&#xff0c;第 i 盒含 ai 块椰子饼。oxx 与 xjj 约定让 oxx …...

【iOS】设置背景渐变色

drawRect函数 主要负责iOS的绘图操作&#xff0c;程序会自动调用此方法进行绘图。我在这个函数中绘制渐变背景色。 方法定义&#xff1a; -(void)drawRect:(CGRect)rect; 重写此方法&#xff0c;执行重绘任务-(void)setNeedsDisplay; 标记为需要重绘&#xff0c;异步调用dra…...

Scrapy框架(高效爬虫)

文章目录一、环境配置二、创建项目三、scrapy数据解析四、基于终端指令的持久化存储1、基于终端指令2、基于管道3、数据同时保存至本地及数据库4、基于spider爬取某网站各页面数据5、爬取本页和详情页信息&#xff08;请求传参&#xff09;6、图片数据爬取ImagesPipeline五、中…...

VideoAgentTrek Screen Filter作品集:处理前后对比展示多行业应用效果

VideoAgentTrek Screen Filter作品集&#xff1a;处理前后对比展示多行业应用效果 最近在整理一些屏幕录像素材时&#xff0c;我发现了一个挺有意思的工具——VideoAgentTrek Screen Filter。它不是什么复杂的视频编辑软件&#xff0c;核心功能很聚焦&#xff1a;自动识别并处…...

Cursor AI终极破解:免费解锁Pro功能的完整实战指南

Cursor AI终极破解&#xff1a;免费解锁Pro功能的完整实战指南 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reached your trial …...

OpenClaw资源监控方案:Qwen3.5-9B运行时性能调优

OpenClaw资源监控方案&#xff1a;Qwen3.5-9B运行时性能调优 1. 为什么需要关注资源监控&#xff1f; 去年冬天&#xff0c;我第一次在本地MacBook Pro上部署Qwen3.5-9B模型时&#xff0c;系统突然卡死的经历让我记忆犹新。当时我正在运行一个简单的文档摘要任务&#xff0c;…...

OpenClaw本地部署指南:千问3.5-9B接口配置与调试技巧

OpenClaw本地部署指南&#xff1a;千问3.5-9B接口配置与调试技巧 1. 为什么选择OpenClaw千问3.5-9B组合 去年我在尝试自动化处理日常工作报告时&#xff0c;发现市面上的RPA工具要么功能臃肿&#xff0c;要么需要将数据上传到云端处理。直到遇到OpenClaw这个开源框架&#xf…...

抖音直播回放下载工具全解析:技术原理与跨领域应用指南

抖音直播回放下载工具全解析&#xff1a;技术原理与跨领域应用指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback supp…...

3个创新点让游戏优化工具实现高效资源管理

3个创新点让游戏优化工具实现高效资源管理 【免费下载链接】sguard_limit 限制ACE-Guard Client EXE占用系统资源&#xff0c;支持各种腾讯游戏 项目地址: https://gitcode.com/gh_mirrors/sg/sguard_limit 你是否曾遇到这样的场景&#xff1a;激战正酣时画面突然定格&a…...

终极指南:5分钟掌握Awoo Installer,轻松搞定Switch游戏安装

终极指南&#xff1a;5分钟掌握Awoo Installer&#xff0c;轻松搞定Switch游戏安装 【免费下载链接】Awoo-Installer A No-Bullshit NSP, NSZ, XCI, and XCZ Installer for Nintendo Switch 项目地址: https://gitcode.com/gh_mirrors/aw/Awoo-Installer 还在为Switch游…...

PyTorch Playground量化评估报告:不同bit宽度的精度损失分析

PyTorch Playground量化评估报告&#xff1a;不同bit宽度的精度损失分析 【免费下载链接】pytorch-playground Base pretrained models and datasets in pytorch (MNIST, SVHN, CIFAR10, CIFAR100, STL10, AlexNet, VGG16, VGG19, ResNet, Inception, SqueezeNet) 项目地址: …...

DAMO-YOLO模型微调指南:自定义数据集训练

DAMO-YOLO模型微调指南&#xff1a;自定义数据集训练 1. 引言 目标检测是计算机视觉领域的核心任务之一&#xff0c;而DAMO-YOLO作为阿里巴巴达摩院推出的高效检测框架&#xff0c;在精度和速度方面都表现出色。但预训练模型往往无法直接满足特定场景的需求&#xff0c;这时候…...

Jimeng LoRA动态热切换实战:避免显存爆炸,轻松测试多训练阶段模型

Jimeng LoRA动态热切换实战&#xff1a;避免显存爆炸&#xff0c;轻松测试多训练阶段模型 1. 项目背景与核心价值 你是否遇到过这样的困扰&#xff1a;在测试不同训练阶段的LoRA模型时&#xff0c;每次切换版本都需要重新加载底座模型&#xff0c;不仅耗时耗力&#xff0c;还…...