Istio开启mtls请求503问题分析
背景
为测试Istio流量管理,将两个服务sleep、flaskapp的两个版本v1、v2(部署文件见参考链接)部署到Istio环境中,通过sleep-v1向flaskapp发起调用http://flaskapp/env/version,正常结果会交替打印出结果v1和v2,然而在调用过程中报错503 reset reason: connection failure,故将问题的步骤、现象、分析、验证整理于此。
步骤
部署sleep、flaskapp应用,同时Istio平台开启mTls,命名空间kangxzh开启自动注入,部署如下图所示:
kubectl apply -f sleep.istio.yaml -n kangxzh
kubectl apply -f flask.isito.yaml -n kangxzh #查看pod创建情况
kubectl -n kangxzh get pod -w flaskapp-v1-775dbb9b79-z54fj / Running 13s
flaskapp-v2-d454cdd47-mdb8s / Running 14s
sleep-v1-7f45c6cf94-zgdsf / Running 19h
sleep-v2-58dff94b49-fz6sj / Running 19h
现象
在sleep应用中发起http请求,调用flaskapp,curl http://flaskapp/env/version,如下所示:
#
export SOURCE_POD=$(kubectl get pod -l app=sleep,version=v1 -o jsonpath={.items..metadata.name})
# 进入sleep发起http请求
kubectl -n kangxzh exec -it -c sleep $SOURCE_POD bash
bash-4.4# curl http://flaskapp/env/version
# 响应
upstream connect error or disconnect/reset before headers. reset reason: connection failure
背景
1.检测flaskapp tls 配置,如下:
[root@kubernetes-master flaskapp]# istioctl authn tls-check flaskapp-v1-775dbb9b79-z54fj flaskapp.kangxzh.svc.cluster.local
HOST:PORT STATUS SERVER CLIENT AUTHN POLICY DESTINATION RULE
flaskapp.kangxzh.svc.cluster.local: OK mTLS mTLS default/ default/istio-system
STATUS OK 证明flaskapp tls配置正确。
进入sleep istio-proxy向flaskapp发起http请求:
kubectl -n kangxzh exec -it -c istio-proxy $SOURCE_POD bash
# 发起请求
curl http://flaskapp/env/version
# 响应
v1
2.发现通过istio-proxy可以得到相应,因为开启了mtls,通过istio-proxy直接请求是需要添加istio相关证书的,此时没有加入证书也可请求,所以想到检查flaskapp iptables配置,如下所示:
# 获取进程号
PID=$(docker inspect --format {{.State.Pid}} $(docker ps | grep flaskapp-v1 | awk '{print $1}' | head -n ))
# 查看iptables 规则
nsenter -t ${PID} -n iptables -t nat -L -n -v
# 输出
Chain PREROUTING (policy ACCEPT packets, bytes)
pkts bytes target prot opt in out source destination
ISTIO_INBOUND tcp -- * * 0.0.0.0/ 0.0.0.0/ Chain INPUT (policy ACCEPT packets, bytes)
pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT packets, bytes)
pkts bytes target prot opt in out source destination
ISTIO_OUTPUT tcp -- * * 0.0.0.0/ 0.0.0.0/ Chain POSTROUTING (policy ACCEPT packets, bytes)
pkts bytes target prot opt in out source destination Chain ISTIO_INBOUND ( references)
pkts bytes target prot opt in out source destination
ISTIO_IN_REDIRECT tcp -- * * 0.0.0.0/ 0.0.0.0/ tcp dpt: #是没有的,修改后增加 Chain ISTIO_IN_REDIRECT ( references)
pkts bytes target prot opt in out source destination
REDIRECT tcp -- * * 0.0.0.0/ 0.0.0.0/ redir ports Chain ISTIO_OUTPUT ( references)
pkts bytes target prot opt in out source destination
ISTIO_REDIRECT all -- * lo 0.0.0.0/ !127.0.0.1
RETURN all -- * * 0.0.0.0/ 0.0.0.0/ owner UID match
RETURN all -- * * 0.0.0.0/ 0.0.0.0/ owner GID match
RETURN all -- * * 0.0.0.0/ 127.0.0.1
ISTIO_REDIRECT all -- * * 0.0.0.0/ 0.0.0.0/ Chain ISTIO_REDIRECT ( references)
pkts bytes target prot opt in out source destination
REDIRECT tcp -- * * 0.0.0.0/ 0.0.0.0/ redir ports
证明envoy没有劫持到flaskapp 80的流量,也就是说上述第2步是sleep-istio-proxy直接请求flaskapp,没有经过flaskapp-istio-proxy 转发。
3. 此时才检查flaskapp deployment,如下所示:
...
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: flaskapp-v1
spec:
replicas:
template:
metadata:
labels:
app: flaskapp
version: v1
spec:
containers:
- name: flaskapp
image: dustise/flaskapp
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: #缺少containerPort
env:
- name: version
value: v1
...
官网说明https://istio.io/docs/setup/kubernetes/additional-setup/requirements/中:
Pod ports: Pods must include an explicit list of the ports each container listens on. Use a containerPort configuration in the container specification for each port. Any unlisted ports bypass the Istio proxy.
# 未列出来来的端口都会绕过istio proxy
同时describe flaskapp pod 如下所示:
kubectl describe pod flaskapp-v1-6df8d69fb8-fb5mr -n kangxzh
#
istio-proxy:
... 省略若干
Args:
...
--concurrency --controlPlaneAuthPolicy
MUTUAL_TLS
--statusPort --applicationPorts
"" #为空
在deployment中增加containerPort: 80后,如下所示:
istio-proxy:
... 省略若干
Args:
...
--concurrency --controlPlaneAuthPolicy
MUTUAL_TLS
--statusPort --applicationPorts
注意:在Istio1.2版本以后也可通过设置Pod annotation 中 traffic.sidecar.istio.io/includeInboundPorts来达到同样的目的,缺省值为Pod的containerPorts列表,逗号分隔的监听端口列表,这些流量会被重定向到 Sidecar,* 会重定向所有端口,具体详情参见官网1.2新特性(见参考链接)
验证
sleep 发起请求:
[root@kubernetes-master flaskapp]# kubectl -n kangxzh exec -it -c sleep $SOURCE_POD bash
bash-4.4# curl http://flaskapp/env/version
#响应
v1
sleep-istio-proxy 未携带证书,发起请求:
kubectl -n kangxzh exec -it -c istio-proxy $SOURCE_POD bash
istio-proxy@sleep-v1-7f45c6cf94-zgdsf:/$ curl http://flaskapp/env/version
#响应
curl: () Recv failure: Connection reset by peer
sleep-istio-proxy 携带证书,发起请求
istio-proxy@sleep-v1-7f45c6cf94-zgdsf:/$ curl https://flaskapp:80/env/version --key /etc/certs/key.pem --cert /etc/certs/cert-chain.pem --cacert /etc/certs/root-cert.pem -k
#响应
v1
参考链接
https://github.com/fleeto/sleep
https://github.com/fleeto/flaskapp
https://istio.io/docs/setup/kubernetes/additional-setup/requirements/
https://preliminary.istio.io/about/notes/1.2/
Istio开启mtls请求503问题分析的更多相关文章
- Tomcat处理HTTP请求源码分析(下)
转载:http://www.infoq.com/cn/articles/zh-tomcat-http-request-2 很多开源应用服务器都是集成tomcat作为web container的,而且对 ...
- 一次http完整的请求tcp报文分析
一次http请求的报文分析 数据包如下: 第一个包113.31的主机(下边称之为客户端)给114.80的主机(下边称之为服务器)发送一个syn包请求建立连接 第二个包服务器回复客户端syn+ack表示 ...
- Go语言之进阶篇请求报文格式分析
1. 请求报文格式分析 示例: package main import ( "fmt" "net" ) func main() { //监听 listener, ...
- SharePoint 2013 开启访问请求 链接丢失
关于SharePoint 2013 开启访问请求的做法其实很简单,比如http://www.cnblogs.com/jianyus/archive/2014/06/21/3799386.html 这篇 ...
- Tomcat处理HTTP请求源码分析(上)
Tomcat处理HTTP请求源码分析(上) 作者 张华 发布于 2011年12月8日 | 8 讨论 分享到: 微博 微信 Facebook Twitter 有道云笔记 邮件分享 稍后阅读 我的阅读清单 ...
- # Volley源码解析(二) 没有缓存的情况下直接走网络请求源码分析#
Volley源码解析(二) 没有缓存的情况下直接走网络请求源码分析 Volley源码一共40多个类和接口.除去一些工具类的实现,核心代码只有20多个类.所以相对来说分析起来没有那么吃力.但是要想分析透 ...
- struts2请求过程源代码分析
struts2请求过程源代码分析 Struts2是Struts社区和WebWork社区的共同成果.我们甚至能够说,Struts2是WebWork的升级版.他採用的正是WebWork的核心,所以.Str ...
- Django(35)Django请求生命周期分析(超详细)
Django请求生命周期分析 1.客户端发送请求 在浏览器输入url地址,例如www.baidu.com,浏览器会自动补全协议(http),变为http://www.baidu.com,现在部分网站都 ...
- Django(47)drf请求生命周期分析
前言 一般我们写完序列化以后,我们就会开始写视图了,drf中我们一般使用CBV的方式,也就是类视图的方式,最基础的我们会使用from rest_framework.views import API ...
随机推荐
- ASP.NET list<object> OBJECT.clean()会清空session['OBJECT']的值的问题
public partial class 测试 : System.Web.UI.Page { static List<Item> allAnswer= new List<Item&g ...
- i春秋四周年中奖名单出炉丨确认过眼神,你是中奖人
i春秋四周年任性狂欢倒计时最后2天! 优享会员.精品课程.CTF经典赛题实战班.Web安全线上提高班.渗透测试工程师线下就业班.CISAW-Web安全认证......全部史上最低折扣,还有8888元现 ...
- 那些年我们走过的坑,对Fortify的漏洞进行总结
1.修复方案,过滤引起Log Forging漏洞的敏感字符的公共方法 /** * Log Forging漏洞校验 * @param logs * @return */ public static St ...
- 搞NDK开发
1.哪些场景下要用到NDK开发? 跨平台的库,如FFmpeg, skip,weex, 加固,防逆向 签名校验 图片压缩 音视频解码 OpenGL ES 高级特效 热修复 andfix 人脸识别 fac ...
- 深入理解JVM虚拟机(一):JVM运行时数据区
概述: JVM将内存的管理进行封装,使得开发人员不必关心内存申请.释放操作.但是在高级程序开发.复杂业务场景开发的时候,如果出现内存溢出的情况,对于开发人员而言就很难去分析出原因.所以还是很有必要去了 ...
- odoo10学习笔记十一:视图综述
转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/11189322.html 一:视图标签等公共结构 name (必选) 用于通过名字查找标签 model: 与v ...
- ES6的相关语法
1.ES6的兼容性 常用的是babel(也叫做browser.js); 用法: 直接在script中引用,把相应的script里面的type设置为text/babel 2.箭头函数 注意:1.如果只有 ...
- 2.4 Scala函数式编程
一.函数定义与使用 1.函数的定义 2.匿名函数 举例: Scala自动推断变量类型,不用声明: 一个下划线只能表示这一个参数的一次出现 二.高阶函数 定义:函数定义的括号里仍然是个函数的函数,叫作高 ...
- 编译一个支持django及mysqlclient连接的alpine镜像
一切都不难,难的就是在alpine镜像里. 最后,使用了网上编译好mysqlclient的镜像,才搞定. 记录一下. 一,基础镜像Dockerfile https://github.com/tnir/ ...
- src和href 如何做好seo 前端页面有那三层 AMD和CMD 规范的区别 渐进增强
1==>简述一下src与href的区别 src用于替换当前元素: href用于在当前文档和引用资源之间确立联系 2==>.谈谈以前端角度出发做好SEO需要考虑什么? a. 了解搜索引擎如何 ...