当前位置:   article > 正文

Istio开启mtls请求503问题分析

istio 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开启自动注入,部署如下图所示:


  1. kubectl apply -f sleep.istio.yaml -n kangxzh
  2. kubectl apply -f flask.isito.yaml -n kangxzh
  3. #查看pod创建情况
  4. kubectl -n kangxzh get pod -w
  5. flaskapp-v1
  6. -775d
  7. bb9b79-z54fj   
  8. 2
  9. /
  10. 2
  11.      Running           
  12.           
  13. 13s
  14. flaskapp-v2-d454cdd47-mdb8s    
  15. 2
  16. /
  17. 2
  18.      Running           
  19.           
  20. 14s
  21. sleep-v1
  22. -7f
  23. 45c6cf94-zgdsf      
  24. 2
  25. /
  26. 2
  27.      Running           
  28.           
  29. 19
  30. h
  31. sleep-v2
  32. -58d
  33. ff94b49-fz6sj      
  34. 2
  35. /
  36. 2
  37.      Running           
  38.           
  39. 19


现象


在sleep应用中发起http请求,调用flaskapp,curl http://flaskapp/env/version,如下所示:


  1. #
  2. export SOURCE_POD=$(kubectl get pod -l app=
  3. sleep
  4. ,version=v1 -o jsonpath={.items..metadata.name})
  5. # 进入sleep发起http请求
  6. kubectl -n kangxzh 
  7. exec
  8.  -it -c 
  9. sleep
  10.  $SOURCE_POD bash
  11. bash-
  12. 4.4
  13. # curl http://flaskapp/env/version
  14. # 响应
  15. upstream 
  16. connect
  17.  error 
  18. or
  19.  disconnect/
  20. reset
  21.  before headers. 
  22. reset
  23.  reason: connection failure 


背景


1.检测flaskapp tls 配置,如下:


  1. [root@kubernetes-master flaskapp]
  2. # istioctl authn tls-check flaskapp-v1-775dbb9b79-z54fj flaskapp.kangxzh.svc.cluster.local
  3. HOST:PORT                                 STATUS     SERVER     CLIENT     AUTHN POLICY     DESTINATION RULE
  4. flaskapp.kangxzh.svc.cluster.local:
  5. 80
  6.      OK         mTLS       mTLS       
  7. default
  8. /         
  9. default
  10. /istio-system 


STATUS OK 证明flaskapp tls配置正确。


进入sleep istio-proxy向flaskapp发起http请求:


  1. kubectl
  2.  -n kangxzh exec -it -c istio-proxy 
  3. $SOURCE_POD
  4.  bash
  5. # 发起请求
  6. curl http://flaskapp/env/version
  7. # 响应
  8. v1 


2.发现通过istio-proxy可以得到相应,因为开启了mtls,通过istio-proxy直接请求是需要添加istio相关证书的,此时没有加入证书也可请求,所以想到检查flaskapp iptables配置,如下所示:


  1. # 获取进程号
  2. PID=$(docker inspect --format {{.State.Pid}} $(docker ps | grep flaskapp-v1 | awk 
  3. '{print $1}'
  4.  | head -n 1))
  5. # 查看iptables 规则
  6. nsenter -t 
  7. ${PID}
  8.  -n iptables -t nat -L -n -v
  9. # 输出
  10. Chain PREROUTING (policy ACCEPT 477 packets, 28620 bytes)
  11.  pkts bytes target     prot opt 
  12. in
  13.      out     
  14. source
  15.                destination
  16.   487 29220 ISTIO_INBOUND  tcp  --  *      *       0.0.0.0/0            0.0.0.0/0
  17. Chain INPUT (policy ACCEPT 487 packets, 29220 bytes)
  18.  pkts bytes target     prot opt 
  19. in
  20.      out     
  21. source
  22.                destination
  23. Chain OUTPUT (policy ACCEPT 220 packets, 20367 bytes)
  24.  pkts bytes target     prot opt 
  25. in
  26.      out     
  27. source
  28.                destination
  29.     0   480 ISTIO_OUTPUT  tcp  --  *      *       0.0.0.0/0            0.0.0.0/0
  30. Chain POSTROUTING (policy ACCEPT 220 packets, 20367 bytes)
  31.  pkts bytes target     prot opt 
  32. in
  33.      out     
  34. source
  35.                destination
  36. Chain ISTIO_INBOUND (1 references)
  37.  pkts bytes target     prot opt 
  38. in
  39.      out     
  40. source
  41.                destination
  42.    10   600 ISTIO_IN_REDIRECT  tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80    
  43. #是没有的,修改后增加
  44. Chain ISTIO_IN_REDIRECT (1 references)
  45.  pkts bytes target     prot opt 
  46. in
  47.      out     
  48. source
  49.                destination
  50.    10   600 REDIRECT   tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            redir ports 15001
  51. Chain ISTIO_OUTPUT (1 references)
  52.  pkts bytes target     prot opt 
  53. in
  54.      out     
  55. source
  56.                destination
  57.     0     0 ISTIO_REDIRECT  all  --  *      lo      0.0.0.0/0           !127.0.0.1
  58.     8   480 RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0            owner UID match 1337
  59.     0     0 RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0            owner GID match 1337
  60.     0     0 RETURN     all  --  *      *       0.0.0.0/0            127.0.0.1
  61.     0     0 ISTIO_REDIRECT  all  --  *      *       0.0.0.0/0            0.0.0.0/0
  62. Chain ISTIO_REDIRECT (2 references)
  63.  pkts bytes target     prot opt 
  64. in
  65.      out     
  66. source
  67.                destination
  68.     0     0 REDIRECT   tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            redir ports 15001 


证明envoy没有劫持到flaskapp 80的流量,也就是说上述第2步是sleep-istio-proxy直接请求flaskapp,没有经过flaskapp-istio-proxy 转发。


3. 此时才检查flaskapp deployment,如下所示:


  1. ...
  2. ---
  3. apiVersion: extensions/v1beta1
  4. kind: Deployment
  5. metadata:
  6.   name: flaskapp-v1
  7. spec:
  8.   replicas: 1
  9.   template:
  10.     metadata:
  11.       labels:
  12.         app: flaskapp
  13.         version: v1
  14.     spec:
  15.       containers:
  16.       - name: flaskapp
  17.         image: dustise/flaskapp
  18.         imagePullPolicy: IfNotPresent
  19.         ports:
  20.           - name: http
  21.             containerPort: 80  
  22. #缺少containerPort
  23.         env:
  24.         - name: version
  25.           value: v1
  26. ... 


官网说明https://istio.io/docs/setup/kubernetes/additional-setup/requirements/中:


  1. Pod ports: Pods must include an 
  2. explicit
  3.  list 
  4. of
  5.  the ports 
  6. each
  7.  container listens 
  8. on
  9. . Use a containerPort configuration 
  10. in
  11.  the container specification 
  12. for
  13.  
  14. each
  15.  port. Any unlisted ports bypass the Istio proxy.
  16. # 未列出来来的端口都会绕过istio proxy 


同时describe flaskapp pod 如下所示:


  1. kubectl 
  2. describe
  3.  pod flaskapp-v1
  4. -6
  5. df8d69fb8-fb5mr -n kangxzh
  6. #
  7. istio-proxy:
  8.     ... 省略若干
  9.     Args:
  10.       ...
  11.       
  12. --concurrency
  13.       
  14. 2
  15.       
  16. --controlPlaneAuthPolicy
  17.       MUTUAL_TLS
  18.       
  19. --statusPort
  20.       
  21. 15020
  22.       
  23. --applicationPorts
  24.       
  25. ""
  26.  
  27. #为空 


在deployment中增加containerPort: 80后,如下所示:


  1. istio-proxy:
  2.     ... 省略若干
  3.     Args:
  4.       ...
  5.       
  6. --concurrency
  7.       2
  8.       
  9. --controlPlaneAuthPolicy
  10.       MUTUAL_TLS
  11.       
  12. --statusPort
  13.       15020
  14.       
  15. --applicationPorts
  16.       80 

注意:在Istio1.2版本以后也可通过设置Pod annotation 中 traffic.sidecar.istio.io/includeInboundPorts来达到同样的目的,缺省值为Pod的containerPorts列表,逗号分隔的监听端口列表,这些流量会被重定向到 Sidecar,* 会重定向所有端口,具体详情参见官网1.2新特性(见参考链接)


验证


sleep 发起请求:


  1. [root@kubernetes-master flaskapp]
  2. # kubectl -n kangxzh exec -it -c sleep $SOURCE_POD bash
  3. bash
  4. -4.4
  5. # curl http://flaskapp/env/version
  6. #响应
  7. v1 


sleep-istio-proxy 未携带证书,发起请求:


  1. kubectl
  2.  -n kangxzh exec -it -c istio-proxy 
  3. $SOURCE_POD
  4.  bash
  5. istio-proxy
  6. @sleep
  7. -v1-7f45c6cf94-zgdsf:/$ curl http://flaskapp/env/version
  8. #响应
  9. curl: (
  10. 56
  11. ) Recv failure: Connection reset by peer 
  12. sleep-istio-proxy 携带证书,发起请求
  13. istio-proxy
  14. @sleep
  15. -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
  16. #响应
  17. 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/


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/69923336/viewspace-2649191/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/69923336/viewspace-2649191/

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号