返回列表 发新帖

智汇华云 | Istio中双向TLS认证功能详解

2.3k 0
忐忑的自行车 发表于 2020-11-3 10:37:53|山西 | 查看全部 阅读模式

1 E6 T: G* r2 u! _                               
登录/注册后可看大图
# V& B* t' j1 M  s8 M" z
$ E3 \; r( x, i& p% D
一、概述
1 k  ~7 F$ H* I/ K8 W
& n% V4 T5 e. uIstio中实现了从客户端到服务器端的全链路加密功能,首先从外部的客户端发起请求,到达Istio的Ingress Proxy,后者作为整个集群的边界网关,会再将请求转发到集群内部的微服务,在集群内部,一般会涉及到多个微服务之间的交互,形成一个调用链。
2 l8 v% |9 O; p9 ?5 e; I% J" ~5 t" W8 L0 S: C" K( c" y" r, w) P
在很多架构模型中,集群内部会被认为是天然安全的,微服务之间的流量也是明文传输的。这种模型现在受到越来越多的质疑,因此诸如很多公有云都实现了"零信任"网络,全链路加密的功能。
$ j/ q+ @  T; U* q
- V) m% g- x0 y' Y6 n$ t本文会详细分析在一个集群内部,如何通过Istio实现服务之间通信数据的加密。Istio中的加密方式是双向tls的认证,具体是指两个Envoy Proxy之间的首先进行双向tls认证,认证通过后将后续的数据流进行加密传输。% Z/ H6 N" E; @/ ?  H$ i7 T6 \

/ R  P+ X# D) D' C9 d例如:Pod A需要访问Pod B,在Istio中,请求都是由Envoy进行代理的,因此完整的流程是Pod A发出到Pod B的请求,然后请求会被Envoy Proxy A劫持,接着Envoy Proxy A会与Envoy Proxy B进行点对点的认证,认证通过后,数据会进行加密传输,请求会由Envoy Proxy A发送给Envoy Proxy B,最后再由Envoy Proxy B将请求转发给Pod B。9 _: d" v6 e/ ]
4 Y+ ~: @# A, r9 y- N3 @+ S( |9 \) l
' U  l0 v. n6 p9 V  j
                               
登录/注册后可看大图

! t2 N3 y2 u1 m/ {& h3 j/ U8 p
& I) X1 C$ @) M* S在Envoy Proxy A与Envoy Proxy B之间认证的过程对于Pod A或者Pod B而言都是无感知的。# [4 [1 R7 ~7 }) \+ X$ G# T$ d4 T
' i5 X  p1 ^; Y  R
Istio中双向tls认证的基本对象是# k* a) X# q: n6 g6 Q. o

: h" x" P7 y* r5 X& JapiVersion: security.istio.io/v1beta1
0 _/ |5 b$ v, I0 H% Q& `kind: PeerAuthentication. {$ @2 Z6 q- C: N
4 J0 ?; G' R3 U" p2 v# w9 M5 d
二、认证配置的策略类型
, y: Q3 p5 c, v- B在具体进行配置的时候,有四种基本的策略9 u/ n5 B- U4 r' [2 s+ o

/ u" d2 z% x5 h0 K; X●DISABLE
) r5 @9 V; J  o2 }- D) L/ N" p! x* l/ s% Y
即禁用双向tls认证,这种情况下源Envoy与目的Envoy之间没有对对方进行身份的安全确认,它们之间发送的都是明文数据
  s% b/ V1 E. T  }
" O$ Q7 ^: e0 N3 h1 O●STRICT
3 b& w. }2 t+ k! s9 C; ?- ?8 J" D9 L8 P! g  e' c
即严格的双向tls认证模式。源Envoy与目的Envoy之间必须对对方进行身份的安全确认,它们之间发送的都是加密后的数据。
* _/ U( P1 M7 r0 e/ N4 y
' g8 E9 g# R8 w2 }" X- {* V) J8 i●PERMISSIVE
& R) M9 s$ c5 b* v
7 q1 G- c) C% Y% n5 ?5 e9 F可以进行双向tls认证、也可以不进行认证从而发送明文数据。
; ?9 t" y1 [! X" s% X, ?! o) }. S! F/ f7 k
●UNSET
' A2 m1 x. l8 M
) K0 r5 @8 p1 z即没有进行设置,这种情况下会继承上级策略,比如当前namespace的或者整个系统的。如果上级策略都为空,则会默认设置为PERMISSIVE
' g" _9 z" q7 h) ~7 S4 K5 q/ D2 ~
" e8 q1 E& Z' n  k' G三、认证配置的范围' ]7 Y6 G2 f2 u" [/ S- L* G: X
Istio中对双向tls认证进行配置的时候,可以有几种不同的范围,范围越小优先级越高:
0 }4 p% x. S0 u$ ~$ C6 K$ e6 m: i5 A9 T. R! J
●全局4 k$ \/ E9 G1 i( R: x, f4 l
  apiVersion: security.istio.io/v1beta14 I. x' v0 g  e
  kind: PeerAuthentication" d8 z. Z5 O( G: X: C3 Y( V  U
  metadata:" B6 w! Z5 c; {
    name: default6 e6 @- [; @: _" t0 g0 Z
    namespace: istio-system1 N/ t+ D. g! i6 c! c; {  g
  spec:
$ s9 K# N! _6 g  j7 o- v3 ]    mtls:$ f4 E9 \( |0 O0 o; V. }' Y
      mode: STRICT$ ^  ~* r! z0 g6 A- w) A
( t  [( a6 a+ G: L8 a6 l
注意,全局的安全策略名称只能是default,namespace则是istio所在的系统namespace,这里是istio-system$ z( M( g8 c0 f* u
+ X4 j# P8 G5 w- e. H9 d6 q) B
●namespace级别,即某个namespace中所有服务
3 ~4 m! v1 J( |
$ H7 _* D* S. Z/ a. N  apiVersion: security.istio.io/v1beta17 F- g; I- e5 X' y/ [
  kind: PeerAuthentication
, K  y! N. Y5 \2 @3 l5 w0 u" e  metadata:/ b: Q8 Q4 C9 Q
    name: default! S7 u  N% Y4 m( c. C$ N$ `! l
    namespace: foo
" a0 b' x# x) Z0 F  spec:/ U+ f8 n5 l9 c0 X! e0 o; ^
    mtls:2 y; r+ I4 W& K, @0 u
      mode: PERMISSIVE  i6 X! U4 O3 A# Y
6 i4 R, Z0 `/ D; J
●负载级别,即某个namespace中某些具体的Pod2 @& e6 S% `4 M. t. X: e

% x7 B4 t2 d2 w1 k1 N. ?; O7 [- ~  apiVersion: security.istio.io/v1beta1
6 e7 |# j" C- e  kind: PeerAuthentication5 C  f+ ]$ t. g* w6 ^  {
  metadata:- n4 V; U2 V; @5 I5 ~2 |( w! h
    name: default- s% Y' |' K$ s/ H) U& G% [
    namespace: foo5 s+ `: f* Z8 C
  spec:0 z8 M1 X8 A) u" R5 n
    selector:$ R  G2 R8 O$ _+ ~- G2 @. `. N
      matchLabels:$ a, l# ?: f9 {) V/ Q
        app: finance
- {" w' f2 u8 X/ C! S" V2 Y' T    mtls:5 b# }3 I1 u2 k) Q9 q% A4 Q
      mode: STRICT
' H$ U' j  \- e. P& \) K" ^  F" L! g' G& ~/ \/ U
会将带有"app: finance"label的Pod所在的Envoy实行STRICT模式。
- n7 I! K# i$ g$ x. S' t( [: |1 f+ y, D8 D8 j; T) _# B! A
●端口级别
  y# _6 U5 r- e0 y  apiVersion: security.istio.io/v1beta1" M( P- H& k" {2 R1 T8 U
  kind: PeerAuthentication# t* T7 M3 I/ C3 c$ s
  metadata:  k7 \  A( W3 g) B. K4 I
    name: default5 J7 u  c6 H" D2 m1 ^' ]! s
    namespace: foo
- k1 E% N( ~( j$ j( U, X. Q5 g  spec:( ?1 T1 {: i  x
    selector:
/ F; ~3 d. l4 P. m' N2 f/ J  l      matchLabels:0 u1 y7 n$ W1 J; F2 G" k
        app: finance
" b# O5 c8 h  }. v) M. x( p& S    mtls:
4 J$ X! @1 X( ?$ L' E      mode: STRICT- c! @4 L9 E3 ~) i/ N" w
    portLevelMtls:1 q" d. @7 j/ I/ X9 z8 F% V# p
      8080:
) I$ u( C+ [9 h        mode: DISABLE
& J. m, ], j  a# j# o# {) D4 p
6 ?2 j: Y  D/ f会将带有"app: finance"label的Pod所在的Envoy实行STRICT模式,但是会将其中的8080端口使用DISABLE模式。! Y1 f: [" z+ U2 w1 z. I, m
四、认证配置的具体方法
3 Z& }0 a+ D' |9 e在Istio中进行双向tls认证配置,需要注意的是客户端和服务器端配置方法是不一样的。例如在namespace foo中有两组服务A和B,每组都有一些Pod,假设服务A的Pod对应的label为"app: A",而服务B的Pod对应的label为"app: B"。这时在服务A所在的Pod中访问服务B,要将这一请求设置为STRICT模式,需要配置两处
! B- N2 O$ c- c+ Y+ V8 p( j- M, w  v# P9 h
1.服务器端配置,给服务B对应的负载配置PeerAuthentication策略,这里配置的是服务B所有关联Pod对应的Envoy Proxy。
7 v3 ]; n7 e& R3 f& v' S0 f) {2 S# x; V, S# C- X
   apiVersion: security.istio.io/v1beta1$ \  Q+ [) P4 G. _6 ~/ i7 x
   kind: PeerAuthentication- [) t: {/ N) ~% U' C8 j
   metadata:
! G/ j  e* u, _* z: A     name: default
# F8 ^; X; `3 V0 C6 m' d! Q) d& l     namespace: foo- Z) D2 ^, }9 A$ _, m
   spec:
  H5 E2 C4 B& g5 ]) _     selector:7 f- s% [* I9 D2 s5 p4 B2 \
       matchLabels:0 \$ n: v9 D- E9 i( y3 p) q7 _+ b
         app: B
% F$ y! ~  q  Q" f     mtls:* N* f$ ?6 ?6 h4 g$ r2 Q
       mode: STRICT9 P1 ~6 N+ [0 v- `: K: X! S4 W

1 w' d2 G) b' L2. 客户端配置,给服务B配置DestinationRule策略。这里配置的是所有访问服务B的Pod对应的Envoy Proxy。7 v  P/ L/ A- ?' k* j! {
; ?% F) x  Z- A2 L, z8 u
   cat <<EOF | kubectl apply -n foo -f -
8 E7 p9 o0 f- i+ o+ O& Z, @1 [4 _   apiVersion: "networking.istio.io/v1alpha3"
' A, g7 Q" `$ i+ e0 @   kind: "DestinationRule"
. _7 w/ c- D& I: }1 E1 C: N6 I   metadata:
5 S2 @9 t" X! P     name: "B"
' ?; [' a. @9 w, \+ k' ~   spec:
* B& ^, y/ m% D/ J. S     host: "B.foo.svc.cluster.local"3 C& G4 f8 r/ y- P* T
     trafficPolicy:
, F; a7 Z" s& a8 S& _; i% A       tls:3 m+ y" x4 Z7 Q- w4 D5 L% v
         mode: ISTIO_MUTUAL
# F! h0 [0 U. Z; e4 o; }   EOF% H# G1 r; a  ^8 A# ~: }

( I( U" ^* k; |9 h' I( J也就是说客户端配置的时候需要配置目的服务的DestinationRule对象,而服务器端配置的时候需要配置服务器端对应负载的PeerAuthentication对象。
/ Z' {9 G* h3 o* ], e五、测试case1:默认配置
0 e% {0 `. W+ U' Ukubectl create ns foo# d, f% h% c7 v: n
kubectl apply -f <(istioctl kube-inject -f samples/httpbin/httpbin.yaml) -n foo5 M+ y2 ?( n' W) j
kubectl apply -f <(istioctl kube-inject -f samples/sleep/sleep.yaml) -n foo
* g7 {% N1 a, c7 J  @2 O, r$ @kubectl create ns bar  M% U9 v  U1 k" Z* L& [
kubectl apply -f <(istioctl kube-inject -f samples/httpbin/httpbin.yaml) -n bar
/ B# O3 J) H  s5 t! Fkubectl apply -f <(istioctl kube-inject -f samples/sleep/sleep.yaml) -n bar
& j$ Q7 h' j! Gkubectl create ns legacy
* \. Q/ c+ d7 v! ^kubectl apply -f samples/httpbin/httpbin.yaml -n legacy% B  E/ j- v0 W
kubectl apply -f samples/sleep/sleep.yaml -n legacy# ~+ s. {/ ?) c
9 t: b, ]/ U! i5 N# F
创建了3个namespace:foo, bar和legacy,每个namespace分别创建了sleep和httpbin两种应用,作为客户端和服务器端。在foo和bar中的Pod有对应的Envoy Proxy,而在legacy中则没有。下面是创建成功后的Pod情况
/ k3 L$ m4 D- c4 h2 [[root@master1 istio-1.6.0]# kubectl get pod --all-namespaces
' R% p$ B# W" c% {) W1 f( ]( P9 Q8 zNAMESPACE      NAME                                    READY   STATUS    RESTARTS   AGE
; H) q" Q5 J5 b: R: Cbar            httpbin-67576779c-tjl4m                 2/2     Running   0          31m2 g: T' c# P7 M4 p* _+ y
bar            sleep-7dc44b8d45-rfhpl                  2/2     Running   0          31m
6 Q1 w) Z! p( w2 @5 zfoo            httpbin-67576779c-tw6kl                 2/2     Running   0          31m
: R0 H  w  {1 t+ z& K, yfoo            sleep-7dc44b8d45-87x2p                  2/2     Running   0          31m
; j- x  n8 o( Flegacy         httpbin-779c54bf49-h5wrw                1/1     Running   0          31m
( A2 q( k- }1 Z6 n/ V9 `legacy         sleep-f8cbf5b76-b8xgd                   1/1     Running   0          31m
0 e) k% |+ i- w* }
# O; D) ]% g$ E( z! y! X! Y0 B7 L7 @3 `9 |" X- Z% r
在使用默认的default配置部署Istio的情况下,如果没有设置任何安全策略,默认是PERMISSIVE,即同时允许双向tls认证和不进行任何认证的明文传输两种方式。注意这只针对有Envoy Proxy的情况,因为这些策略最终的执行者是Envoy,而对于那些没有Envoy Proxy的Pod,例如legacy中的Pod,则只能使用明文方式进行收发数据。下面来验证这一点& u8 d$ T3 L) [' b! D$ e
" _5 j! X" s$ i
[root@master1 istio-1.6.0]# for from in "foo" "bar" "legacy"; do for to in "foo" "bar" "legacy"; do kubectl exec $(kubectl get pod -l app=sleep -n ${from} -o jsonpath={.items..metadata.name}) -c sleep -n ${from} -- curl "http://httpbin.${to}:8000/ip" -s -o /dev/null -w "sleep.${from} to httpbin.${to}: %{http_code}\n"; done; done8 z* U4 h& `* A8 n
sleep.foo to httpbin.foo: 200
; O  J+ Z3 k" F" z: Y5 P' \7 \5 X0 Tsleep.foo to httpbin.bar: 2005 }+ {& r" d; [- n
sleep.foo to httpbin.legacy: 200
& K  b7 b' }  Osleep.bar to httpbin.foo: 200: n6 b& s- d. q* f
sleep.bar to httpbin.bar: 2005 l( H5 }+ Q6 f7 ?
sleep.bar to httpbin.legacy: 2002 A+ ]9 I" U3 c; {4 K8 j; b
sleep.legacy to httpbin.foo: 200
' g6 K# s8 G' u3 V: fsleep.legacy to httpbin.bar: 200" j2 @! x8 O- ^( ]6 q+ [
sleep.legacy to httpbin.legacy: 200
+ O! L7 ]5 o3 q* \" t; M/ S9 G
, r9 y3 t8 Q! J+ N2 k; g9 J可以看到任何两个sleep与httpbin之间都是可以连通的。但是如果进一步观察,发现这些认证方式其实是不同的
: F- }: ~5 o! o2 p, D[root@master1 istio-1.6.0]# kubectl exec $(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name}) -c sleep -n foo -- curl http://httpbin.foo:8000/headers -s | grep X-Forwarded-Client-Cert
5 ?0 u9 O: @" q# X/ K    "X-Forwarded-Client-Cert": "By=spiffe://cluster.local/ns/foo/sa/httpbin;Hash=41eb8aa0a91782fc1a09df8da85b586c5eaabbca3117f645cdb9df8d998b55f2;Subject=\"\";URI=spiffe://cluster.local/ns/foo/sa/sleep". A7 a; ^6 ~- A* }9 [
- \/ k  o3 e0 @4 V! l* O1 K
从foo中的sleep访问foo中的httpbin,header中带有"X-Forwarded-Client-Cert"表明使用了双向tls认证。
- [* E1 M; v$ n0 u# a3 V[root@master1 istio-1.6.0]# kubectl exec $(kubectl get pod -l app=sleep -n legacy -o jsonpath={.items..metadata.name}) -c sleep -n legacy -- curl http://httpbin.foo:8000/headers -s | grep X-Forwarded-Client-Cert7 p- N4 p0 l4 i
[root@master1 istio-1.6.0]#
) N9 E/ A1 E* }; J
# ~  h, }# [0 Z; [9 Q( x  c而从legacy中的sleep访问legacy中的httpbin,header中则不会带有"X-Forwarded-Client-Cert",因为客户端和服务器端都没有Envoy Proxy,只能进行没有任何加密的明文传输。
2 _0 [6 N, k3 f5 h; O# g7 F% N' w5 P3 |7 `$ j$ O3 g
另外,还可以看出sleep.legacy发出去的请求都是明文数据,而sleep.httpbin收到的请求也都是明文数据。而foo和bar里面的Pod发送请求时则会优先使用双向tls认证方式(即下面四种),这些可以自行测试验证。
6 d! N$ n. V: ssleep.foo to httpbin.foo: 200
: M, W0 L$ J! x3 d" c& V  Zsleep.foo to httpbin.bar: 2002 ~8 X0 f! ~( N. ?
sleep.bar to httpbin.foo: 200: k: o* Y% G8 ~* D" m3 x' f
sleep.bar to httpbin.bar: 200
4 {2 F7 {4 l0 j9 t. ~2 ^) H0 Y1 ^5 N4 K. v: T5 \' k1 [  h2 C  {8 ]
清理命令
/ w) ^+ w; G& q8 Ekubectl delete -f <(istioctl kube-inject -f samples/httpbin/httpbin.yaml) -n foo& D+ q3 V2 n; i, B4 ?0 Z
kubectl delete -f <(istioctl kube-inject -f samples/sleep/sleep.yaml) -n foo; o2 A1 Y9 g6 h; A1 A$ Z
kubectl delete -f samples/httpbin/httpbin.yaml -n legacy: `7 S+ N) S* P7 F( P* e
kubectl delete -f samples/sleep/sleep.yaml -n legacy) |/ t: a. D, K/ n% L  Y
kubectl delete -f <(istioctl kube-inject -f samples/httpbin/httpbin.yaml) -n bar/ u+ q* }; Q7 n! W
kubectl delete -f <(istioctl kube-inject -f samples/sleep/sleep.yaml) -n bar9 D8 |1 U8 U  L" @% _0 u
kubectl delete ns foo
* Q* K6 e3 B4 U; {  `kubectl delete ns legacy! {+ U1 k+ o( C, I7 O: v% V1 u
kubectl delete ns bar; z5 H8 p4 m: k0 d
7 D+ `9 W3 C: R2 R1 x& Y& c2 {# \
六、测试case2:针对特定服务的配置1 q; G7 T3 _  W* N) J
首先,创建一个全局的安全策略,禁用所有的双向tls认证。2 s' ~" g0 ]! G+ ~! Z
kubectl apply -f - <<EOF
6 v6 F, Y, o, c9 zapiVersion: "security.istio.io/v1beta1"8 B1 i( W0 j. s; Z! ~3 \
kind: "PeerAuthentication") C$ ~) X& o9 Q) f2 @
metadata:
1 F4 q0 G+ ~8 W" I, h" a9 s" W8 D  name: "default"
+ V6 J4 X, l  G+ ?  namespace: "istio-system"( w+ K. L: t8 M
spec:: N( G( Y( Q0 h% B
  mtls:
6 ^2 r! d% K5 D, \% A4 K    mode: DISABLE% i% Z+ i4 |$ t. o1 r
EOF$ ]3 L! j& h) n# M

$ ^. E" N5 u# e# w' f0 B9 Q然后创建一个foo namespace,并在其中创建带有Envoy Proxy的sleep和httpbin, O# }7 n  t) }! @" M  z# y& h1 j5 M
kubectl create ns foo
$ ^) y/ Q; b: G+ E2 i, g) f! q/ ^kubectl apply -f <(istioctl kube-inject -f samples/httpbin/httpbin.yaml) -n foo5 d2 w( v" }2 A1 C# A' @" t
kubectl apply -f <(istioctl kube-inject -f samples/sleep/sleep.yaml) -n foo
; J$ J( _3 I3 N+ z: q2 g
0 T7 p/ j2 I" B$ d3 Z这时进行测试,会发现他们之间可以正常访问,但没有使用双向tls认证,这符合预期,说明全局策略生效。& y( j- X% X1 [" n& o
[root@master1 istio-1.6.0]# kubectl exec $(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name}) -c sleep -n foo -- curl "http://httpbin.foo:8000/ip" -s -o /dev/null -w "sleep.foo to httpbin.foo: %{http_code}\n"
8 V3 i9 K7 w+ esleep.foo to httpbin.foo: 200( a2 |. {  O9 h* U
[root@master1 istio-1.6.0]# kubectl exec $(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name}) -c sleep -n foo -- curl http://httpbin.foo:8000/headers -s | grep X-Forwarded-Client-Cert
: O3 Y  `2 N- ^- e$ {[root@master1 istio-1.6.0]#- a* ~0 f& b) ~% M" T+ z

4 `  H2 x. O& G6 M7 _: c1 y接下来为服务器端配置PeerAuthentication策略,让其强制执行双向tls认证
, |3 z7 Y7 g+ j; ]cat <<EOF | kubectl apply -n foo -f -  b& O8 ], p$ o1 U4 Q
apiVersion: "security.istio.io/v1beta1"+ g4 J/ |4 m$ g' R3 y( N
kind: "PeerAuthentication"
  }+ g: ^: k/ ?& Q6 d' A) Xmetadata:
7 X# c  O; E9 P+ u/ D  h  name: "httpbin"
  X- i, P7 l# q4 I  namespace: "foo"$ C" {+ v" P' ~6 G
spec:
3 U8 s- B9 S  v5 @; e3 M; Q  selector:% l6 L5 d9 b4 {
    matchLabels:8 b& I; {  U# E3 ~5 L4 n# d, W
      app: httpbin" H5 {+ Y! I. `0 r  P1 s
  mtls:
; ^7 l/ q: E" A# @- ]    mode: STRICT# L! K0 n' n- v" e" T) ?1 ^& g
EOF) G! P( a4 V6 m& H" j

. q6 G  |! d3 [$ e) n这时再次进行测试
% }4 I$ \- K  S[root@master1 istio-1.6.0]# kubectl exec $(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name}) -c sleep -n foo -- curl "http://httpbin.foo:8000/ip" -s -o /dev/null -w "sleep.foo to httpbin.foo: %{http_code}\n"8 U! Z# N, C7 J+ U4 O
sleep.foo to httpbin.foo: 503
: f; _; z, V9 a% `5 [[root@master1 istio-1.6.0]#2 }: [/ ~; H# I2 u+ Q6 N- ?# p
" [+ }7 q( c/ l0 R( m
出现了503错误,这其实是一个tls冲突,因为截至目前为止我们为服务器端设置了强制使用双向tls认证,但是客户端还未设置。
1 y; u6 Y! T. ]. A' d* M, M! z' g, ]& t( x0 A9 `6 x% S4 X
接下来设置客户端。3 w& U% z1 r3 ]8 H
cat <<EOF | kubectl apply -n foo -f -# e+ `& q3 m& f; k, e; _* V& F8 I; P
apiVersion: "networking.istio.io/v1alpha3"
0 |- s3 S# l- l+ C, ]+ z& Ykind: "DestinationRule"6 F2 D% L) f5 q/ F+ ?$ j7 J
metadata:
" h. `' h* s" {2 N  name: "httpbin"
) V* m- W/ ^# W- L. Aspec:# \2 i! r1 _3 i. K/ s! o0 W  s
  host: "httpbin.foo.svc.cluster.local"
, ~% E0 X4 O" {  trafficPolicy:
% y' S$ w, {. ^3 T0 C  g, M6 M1 h    tls:; e0 h, e9 n$ Z" r4 F! H! A
      mode: ISTIO_MUTUAL! f# {- Q: x. X0 Q
EOF3 A. X4 [  ~7 z1 q

# l2 _0 ?* X; m, _: ]7 W6 e然后进行测试,发现现在已经可以正常访问,且使用了双向tls认证,符合预期。' w0 i# V8 B( a0 u( L: Y
[root@master1 istio-1.6.0]# kubectl exec $(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name}) -c sleep -n foo -- curl "http://httpbin.foo:8000/ip" -s -o /dev/null -w "sleep.foo to httpbin.foo: %{http_code}\n"
* e$ [1 J, g0 W  p- P- a% Lsleep.foo to httpbin.foo: 200) k) b5 y: [$ c  _1 p
[root@master1 istio-1.6.0]# kubectl exec $(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name}) -c sleep -n foo -- curl http://httpbin.foo:8000/headers -s | grep X-Forwarded-Client-Cert! v6 g$ S9 M5 V$ H% b  J# X, u; w, p' ^
    "X-Forwarded-Client-Cert": "By=spiffe://cluster.local/ns/foo/sa/httpbin;Hash=b8a73b2655b270e23eda820e49c56cc9b16521d98cb6c1896eff41c58cc32d56;Subject=\"\";URI=spiffe://cluster.local/ns/foo/sa/sleep"
0 L' Z0 k6 A. U[root@master1 istio-1.6.0]#" ]% ~& b6 Z( P3 ]! \$ V
, r/ m0 l# c: T' A
清理命令) C( F+ L& l! S! @& A
- J# b" g/ T( X" K
kubectl delete PeerAuthentication httpbin -n foo" C) t+ [% z( N9 [
kubectl delete DestinationRule httpbin -n foo$ C; H* Z% }) J! ~! ^% [
kubectl delete -f <(istioctl kube-inject -f samples/httpbin/httpbin.yaml) -n foo
0 K! [# x0 q% Pkubectl delete -f <(istioctl kube-inject -f samples/sleep/sleep.yaml) -n foo
3 r2 s# Y, ~) f; y" I% Pkubectl delete ns foo
6 K3 R! v9 P1 J: x) M9 a* s  A7 ^  z/ l- V( p/ K

' ?+ V& G! B+ L, K

回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

得知互动是一个融创意、设计、开发、营销、生活、互联网于一体的专业交流分享平台。
Copyright © 2026 得知互动-专注Ai与站长技术交流社区-Ai交流平台 版权所有 All Rights Reserved. Powered by Discuz! X5.0 鄂ICP备15006301号-5|鄂公网安备 42018502006730号
关灯 在本版发帖 扫一扫添加QQ客服 返回顶部
快速回复 返回顶部 返回列表