$ ~ D8 R- d# Y7 o& [0 R8 b+ ~/ E& _
一、概述
% a6 P6 c3 D, p, k; g8 L, _+ ]7 k( @6 W
Istio中实现了从客户端到服务器端的全链路加密功能,首先从外部的客户端发起请求,到达Istio的Ingress Proxy,后者作为整个集群的边界网关,会再将请求转发到集群内部的微服务,在集群内部,一般会涉及到多个微服务之间的交互,形成一个调用链。
: ]( u: K+ M- ?$ B% ^2 M4 |" J' O4 j" N" K' A9 i& u
在很多架构模型中,集群内部会被认为是天然安全的,微服务之间的流量也是明文传输的。这种模型现在受到越来越多的质疑,因此诸如很多公有云都实现了"零信任"网络,全链路加密的功能。
+ d2 z0 Y* T% k2 N E+ _* G
# G( s. s' e- G, y W; a本文会详细分析在一个集群内部,如何通过Istio实现服务之间通信数据的加密。Istio中的加密方式是双向tls的认证,具体是指两个Envoy Proxy之间的首先进行双向tls认证,认证通过后将后续的数据流进行加密传输。9 ?8 _4 h" O3 I8 g6 [
& A# e4 W- _0 G: C# b
例如: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。
+ Y, ^2 J9 B* x# C$ }. ]; e7 i# V1 y! k
9 I( i' s k/ o9 g; l) u( E) Y; t$ v& }1 P5 g# d9 E. Q
在Envoy Proxy A与Envoy Proxy B之间认证的过程对于Pod A或者Pod B而言都是无感知的。
7 T: v' x7 {% ]# |% K
: c& B& k9 ^: W+ V) ~( [Istio中双向tls认证的基本对象是/ `; F1 _6 I2 b% a; G
+ e; v) t) k& S5 B% W% o
apiVersion: security.istio.io/v1beta1
; h2 {4 x8 \# E7 [0 Z8 Bkind: PeerAuthentication
) f) ^" ?9 j7 k7 R5 N8 G
. |9 X z: G( R7 F% J5 d! O二、认证配置的策略类型4 Y l) l! t- h8 s+ @4 t
在具体进行配置的时候,有四种基本的策略& Q" s0 ?5 d9 l: C6 `6 f
) D: k8 t! t7 j" S2 q●DISABLE: |! i( Z* d8 L& ], ?
! Y* e0 o$ p9 p( R( T3 Z5 `; a+ A即禁用双向tls认证,这种情况下源Envoy与目的Envoy之间没有对对方进行身份的安全确认,它们之间发送的都是明文数据4 w6 G! R' r1 x* y& \0 d
* P! G* W+ a: q●STRICT
- y! ^- T0 ^/ R0 n9 b0 {" G/ d. I* [: @' ]
即严格的双向tls认证模式。源Envoy与目的Envoy之间必须对对方进行身份的安全确认,它们之间发送的都是加密后的数据。0 s1 r ]# s8 @9 B8 Z; V5 E
% o- u% d& q, a. h# p& n●PERMISSIVE
@' B/ ] W3 h7 Q0 @
X( u% _2 ]/ T% V可以进行双向tls认证、也可以不进行认证从而发送明文数据。
1 ?! n) f& \4 y4 g; B& A' @ s6 w. Y- [& v# l
●UNSET
$ c+ L6 B& \- O; _# j. [0 c* e; ?
即没有进行设置,这种情况下会继承上级策略,比如当前namespace的或者整个系统的。如果上级策略都为空,则会默认设置为PERMISSIVE
8 H$ D! Q" h' q" _3 P- M+ D' w4 h, S. q t8 N- s
三、认证配置的范围
: e/ F1 E( [3 V) I$ r. P3 HIstio中对双向tls认证进行配置的时候,可以有几种不同的范围,范围越小优先级越高:
% |8 {. h- B0 k( P% O. o+ Z/ Y4 i; |
2 u% j0 P7 b! ^5 ~$ w. ~3 J●全局( C! q4 n7 E6 s3 F
apiVersion: security.istio.io/v1beta1
. _# B2 o: ]' w kind: PeerAuthentication/ ^: P8 R T1 K0 [% w
metadata:! }2 `/ w- T% ^' r6 @% m" h* E
name: default& V4 }( u( Y7 N% V* t* Q* h
namespace: istio-system
. I( [1 Q" Y ^! L spec:* s* E) r% z. v
mtls:/ c. U, Z+ r: q w3 D# S
mode: STRICT I [3 h0 P8 t3 K) J6 b5 }
$ B3 A% {7 |& T; S$ C注意,全局的安全策略名称只能是default,namespace则是istio所在的系统namespace,这里是istio-system
# D( k" h! A b0 X( d% G$ t# m" }0 Y; F4 {
●namespace级别,即某个namespace中所有服务
. r4 F- n: c; d9 M
. L* [" W, a3 `$ O! A, N apiVersion: security.istio.io/v1beta1! Q/ C9 C, |0 Y. H0 X0 s( \1 i
kind: PeerAuthentication2 l" z" h8 |5 x1 {
metadata:
/ ~( ^% j$ Q' t4 m# D, Z name: default: i9 i$ F3 ]; x- j+ D
namespace: foo
' f/ w! ^+ d1 J: R3 I6 A spec:
( z7 ]4 T% k+ O2 G E mtls:7 j" L' ~2 I# J! w3 [, g5 b
mode: PERMISSIVE5 D7 }5 ?$ o$ t; l: o5 z
1 S5 F; t' {. b; i●负载级别,即某个namespace中某些具体的Pod% h0 g+ k' U; x ~* w
1 |/ v5 n* C+ M6 q' `3 |; {% J
apiVersion: security.istio.io/v1beta1
5 p) Y" h% N+ e7 k kind: PeerAuthentication
9 Z ~0 Y$ d# F _9 ^0 l# _ metadata:* J) d2 K: Q Y3 O7 H
name: default
( B: I% \ l) ^% H9 R+ h namespace: foo
3 E" s9 F* N1 p# E: S0 J spec:: ]$ g. K. x& a J
selector:
" y; i9 p# G; [0 B0 R: e matchLabels:
0 m) }; w9 G4 b. F' c app: finance5 g. w/ _( u# b0 @0 s+ b
mtls:
3 c* X( u, V; ]' w+ Q, J" L. e mode: STRICT* b# W( F' r5 F. k
: C" _* ] I( C5 `
会将带有"app: finance"label的Pod所在的Envoy实行STRICT模式。
6 o; j3 G6 }* @) F* w- Q: t& r' l' K7 Q9 q+ S
●端口级别
- l+ j |) p H1 V7 v apiVersion: security.istio.io/v1beta1
}( t5 W/ [; J' g0 r kind: PeerAuthentication- H6 D' x8 W, J4 |3 H; w) J' D
metadata:
! e# M/ x& O, H# a/ \5 x name: default5 N% r' j8 s- F4 N$ ~ d& z
namespace: foo
/ N4 u- o9 {4 C( m5 O" P( t1 u spec:
, \, _4 ]; Q; s9 y. R selector:, B v$ ^2 X3 Q5 ], i- E$ v
matchLabels:
& ~: ~. a- z+ F: R app: finance5 O8 H1 g$ L3 s, D( T
mtls:
^- \) o7 _3 a& }# ^ mode: STRICT
) ~0 z' c% N' E W0 ? portLevelMtls:
' p0 R8 W5 f7 x3 B4 I1 G8 x 8080:7 \( w1 l7 F' U$ [; v
mode: DISABLE
3 e. J2 f( C; ]
( k: P* b* V3 n, @会将带有"app: finance"label的Pod所在的Envoy实行STRICT模式,但是会将其中的8080端口使用DISABLE模式。
) g( C* y, h. r9 h四、认证配置的具体方法" e% C# }, t2 ~* H% G3 R
在Istio中进行双向tls认证配置,需要注意的是客户端和服务器端配置方法是不一样的。例如在namespace foo中有两组服务A和B,每组都有一些Pod,假设服务A的Pod对应的label为"app: A",而服务B的Pod对应的label为"app: B"。这时在服务A所在的Pod中访问服务B,要将这一请求设置为STRICT模式,需要配置两处
9 W5 g0 Y" D, V( b, G. g3 E) `( c0 n' V9 E( s
1.服务器端配置,给服务B对应的负载配置PeerAuthentication策略,这里配置的是服务B所有关联Pod对应的Envoy Proxy。
# X0 a# L) X' \8 ]% h2 P+ n& a; u$ w. a! x4 }, c/ R# w
apiVersion: security.istio.io/v1beta1
; h) m6 E7 \' l" o9 n' _/ g/ ~) P8 _: Z kind: PeerAuthentication
6 S4 J( O' j2 `& K: n% G0 j metadata: l0 r6 U) O4 a8 B9 Z
name: default$ L$ I( u" @ c0 m# _
namespace: foo
' F' |0 u7 O/ S, k) ^1 M: p. A spec:: c% D3 _! t5 p3 v+ _4 F/ i( G
selector:
6 Z, @7 {" Z, V* D2 i4 a2 [# N6 B matchLabels:3 I7 L; Y; @- i9 }
app: B
; ~+ _2 C7 F, _' ?" a! P mtls:
% W* o5 P9 Y+ x mode: STRICT; d+ U6 d) W7 F& U: B, p: q
# z2 X# i4 P+ |2. 客户端配置,给服务B配置DestinationRule策略。这里配置的是所有访问服务B的Pod对应的Envoy Proxy。
R6 x3 R, e$ m7 L- h; M, x, N9 i
cat <<EOF | kubectl apply -n foo -f -
! x0 m' q3 {$ a6 D- B- g apiVersion: "networking.istio.io/v1alpha3"2 K$ B. `2 w& B+ F6 h' B. f; E
kind: "DestinationRule"7 u, v0 ~0 t& @- N7 N0 F) \
metadata:1 M3 r3 i- t4 s$ l) o8 n
name: "B"3 N6 J- A% f- [+ I, }' \
spec:: @" w; f! O, ~8 w
host: "B.foo.svc.cluster.local"1 B3 [) ~- j# G
trafficPolicy:
9 K' k, h6 J$ ^+ D# v1 t tls:
, c, R0 o1 m8 u4 ?4 I4 w mode: ISTIO_MUTUAL, X1 i3 A% `: K9 {2 Q4 h2 b
EOF. K1 S& T4 k$ @3 t
1 d) R: Y9 R- D, S/ o7 c* I& p也就是说客户端配置的时候需要配置目的服务的DestinationRule对象,而服务器端配置的时候需要配置服务器端对应负载的PeerAuthentication对象。
$ Y7 B9 _9 N2 L五、测试case1:默认配置% U, c% S1 x+ ^6 G& Y/ h
kubectl create ns foo
4 R$ l2 ~ i2 l6 |kubectl apply -f <(istioctl kube-inject -f samples/httpbin/httpbin.yaml) -n foo
, J1 q' q6 C, a" `, ^% [. Zkubectl apply -f <(istioctl kube-inject -f samples/sleep/sleep.yaml) -n foo/ Z4 `8 v7 b4 Z
kubectl create ns bar
* P a! X; e5 n" ~. y! w- Nkubectl apply -f <(istioctl kube-inject -f samples/httpbin/httpbin.yaml) -n bar: p5 a4 W1 R; A+ Y
kubectl apply -f <(istioctl kube-inject -f samples/sleep/sleep.yaml) -n bar ~3 y% x8 ?: N% R9 V/ F. b% J+ t" m Q
kubectl create ns legacy
* R9 G/ `. F _' @: hkubectl apply -f samples/httpbin/httpbin.yaml -n legacy
1 {5 @; `# L: Z( ]kubectl apply -f samples/sleep/sleep.yaml -n legacy
% r: C6 M9 T8 v% ^" _8 D- C8 l# |$ }
创建了3个namespace:foo, bar和legacy,每个namespace分别创建了sleep和httpbin两种应用,作为客户端和服务器端。在foo和bar中的Pod有对应的Envoy Proxy,而在legacy中则没有。下面是创建成功后的Pod情况, g. }3 ~# k7 v$ S8 D5 i
[root@master1 istio-1.6.0]# kubectl get pod --all-namespaces0 G4 @. o+ w# L! X9 _; @5 m
NAMESPACE NAME READY STATUS RESTARTS AGE% r+ X! r$ G# Q( b
bar httpbin-67576779c-tjl4m 2/2 Running 0 31m1 b/ Z- }: w2 V! p. `- M. ? C
bar sleep-7dc44b8d45-rfhpl 2/2 Running 0 31m
' T. v/ r5 q$ F% }foo httpbin-67576779c-tw6kl 2/2 Running 0 31m9 m6 d) @+ ~# B# L% s
foo sleep-7dc44b8d45-87x2p 2/2 Running 0 31m
6 w! N2 O9 ?! p. Olegacy httpbin-779c54bf49-h5wrw 1/1 Running 0 31m! g6 ]5 K; Q& [% t. y3 n
legacy sleep-f8cbf5b76-b8xgd 1/1 Running 0 31m
$ B# U C5 Q" D& z) S. _) |
2 V" W) k, y6 u" D4 J5 x- R9 P i5 _' i, ^
在使用默认的default配置部署Istio的情况下,如果没有设置任何安全策略,默认是PERMISSIVE,即同时允许双向tls认证和不进行任何认证的明文传输两种方式。注意这只针对有Envoy Proxy的情况,因为这些策略最终的执行者是Envoy,而对于那些没有Envoy Proxy的Pod,例如legacy中的Pod,则只能使用明文方式进行收发数据。下面来验证这一点. B& ^3 j9 \# C' o, K h
" r# N% {; f, S6 T+ k
[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; done
% D/ T( f5 @7 c- {4 \% Q( Ksleep.foo to httpbin.foo: 200
- T6 I' j- T* u3 a1 l: Msleep.foo to httpbin.bar: 200$ V G1 f: ], A6 t! }. M7 o/ l
sleep.foo to httpbin.legacy: 2008 d: V. a0 T8 v4 C& ?
sleep.bar to httpbin.foo: 2008 [" Q; T+ S/ Z& {0 S' z$ X
sleep.bar to httpbin.bar: 200. [ _% A. t2 ]
sleep.bar to httpbin.legacy: 2004 f0 P6 N. a) M$ Y& A3 }8 e) }# J
sleep.legacy to httpbin.foo: 200, k: {* V0 j% T. s- Y3 j; C& C! w
sleep.legacy to httpbin.bar: 200( i2 V: j" F) K; c# @
sleep.legacy to httpbin.legacy: 200" l& R( h' g0 o* }! P( p
; B) A& }- ^; D/ o1 v& `可以看到任何两个sleep与httpbin之间都是可以连通的。但是如果进一步观察,发现这些认证方式其实是不同的
1 P+ a, j: C3 c( r0 D: k$ \- t[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
- T4 z& v% c# ]9 t9 f1 e: v% D "X-Forwarded-Client-Cert": "By=spiffe://cluster.local/ns/foo/sa/httpbin;Hash=41eb8aa0a91782fc1a09df8da85b586c5eaabbca3117f645cdb9df8d998b55f2;Subject=\"\";URI=spiffe://cluster.local/ns/foo/sa/sleep"
+ v0 [ h& o# a1 ~+ [
: d4 ?4 X! w6 m3 L* ^% V从foo中的sleep访问foo中的httpbin,header中带有"X-Forwarded-Client-Cert"表明使用了双向tls认证。
( X* y( P& u+ a2 y[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-Cert
6 F) ]9 F: g5 Y1 X[root@master1 istio-1.6.0]#* @! p* F) d! E0 D( j- c4 l
# Y c0 c! K5 _/ i4 z, J5 D
而从legacy中的sleep访问legacy中的httpbin,header中则不会带有"X-Forwarded-Client-Cert",因为客户端和服务器端都没有Envoy Proxy,只能进行没有任何加密的明文传输。7 }: Q: x3 o8 m8 F, S: }
) Z" f5 F' k$ p3 h1 {$ K另外,还可以看出sleep.legacy发出去的请求都是明文数据,而sleep.httpbin收到的请求也都是明文数据。而foo和bar里面的Pod发送请求时则会优先使用双向tls认证方式(即下面四种),这些可以自行测试验证。7 F: k8 G p/ c/ R1 s% ]
sleep.foo to httpbin.foo: 200
- \& } K% @4 F4 vsleep.foo to httpbin.bar: 200
$ G9 {5 o) _4 T5 w, \1 a+ ?9 ^sleep.bar to httpbin.foo: 200" i7 Y/ w: t6 K, R: z/ U, i. B
sleep.bar to httpbin.bar: 200
3 d: e5 @& W; \0 Z; u0 @7 a( }: N5 x, T% E
清理命令
7 }$ C9 o% C9 c* t+ w* G. skubectl delete -f <(istioctl kube-inject -f samples/httpbin/httpbin.yaml) -n foo
! O) _8 |3 k5 \5 X6 j. E1 q5 \kubectl delete -f <(istioctl kube-inject -f samples/sleep/sleep.yaml) -n foo
* r1 f( G+ n, Gkubectl delete -f samples/httpbin/httpbin.yaml -n legacy% l& V( n! V9 f/ {7 q6 S0 ?
kubectl delete -f samples/sleep/sleep.yaml -n legacy
+ V N4 S; Q# N2 a# ikubectl delete -f <(istioctl kube-inject -f samples/httpbin/httpbin.yaml) -n bar" Q5 v+ \- l6 M" R
kubectl delete -f <(istioctl kube-inject -f samples/sleep/sleep.yaml) -n bar
( N, s5 p8 d8 P2 ?9 lkubectl delete ns foo
+ ~ M1 ?+ N% p$ [8 Rkubectl delete ns legacy5 S* B1 H" J2 m9 e; T
kubectl delete ns bar i# }' M* U& C( D" Q5 h
% v9 l( W- q! J; X六、测试case2:针对特定服务的配置
1 `. l9 y6 P( O9 l6 [首先,创建一个全局的安全策略,禁用所有的双向tls认证。
5 ]" j( a! S: E$ p6 _+ O' vkubectl apply -f - <<EOF& K) w/ g7 ^) q+ q$ i" p/ B
apiVersion: "security.istio.io/v1beta1"
* b" H6 F& f5 ?/ y: F) p$ ~kind: "PeerAuthentication"
. ^8 ~. Y" o8 c- {* X8 {metadata:9 `* B, ]6 |1 S8 [0 _& H/ E: P
name: "default"
! R* S" X. M& ]) W9 @2 E4 | namespace: "istio-system"
, q" L% S: |9 x# R/ Gspec:; A" y; }+ t& u2 g1 u
mtls:
5 W `; ^' |0 p9 E x W/ E% J+ h mode: DISABLE: y( p8 A3 P$ }' H6 _, G
EOF
# f2 U) z3 {9 _
0 G9 K3 N- i. Z& Z. Z) C6 L9 R然后创建一个foo namespace,并在其中创建带有Envoy Proxy的sleep和httpbin
, c+ A! [% b2 V0 Mkubectl create ns foo
3 e7 R" j. G1 L, r6 B5 }2 f5 @kubectl apply -f <(istioctl kube-inject -f samples/httpbin/httpbin.yaml) -n foo: P( `, S+ |- n
kubectl apply -f <(istioctl kube-inject -f samples/sleep/sleep.yaml) -n foo
9 X; h8 |8 l8 E; n: r9 K2 \2 c* _4 W, C0 p- r
这时进行测试,会发现他们之间可以正常访问,但没有使用双向tls认证,这符合预期,说明全局策略生效。. m' @( f# V& S$ r7 n6 f
[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"$ Y- |+ Q( Z3 _, M7 S
sleep.foo to httpbin.foo: 200, [0 U+ T4 M8 r2 i" L- ~+ {
[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
& X9 [+ _! d# V[root@master1 istio-1.6.0]#
5 s9 U, I" U! ?# _2 B
, h5 i* [4 A' B6 @8 P接下来为服务器端配置PeerAuthentication策略,让其强制执行双向tls认证
% X# Q8 S6 t+ {0 t' Ccat <<EOF | kubectl apply -n foo -f -; O9 K" M+ a& R
apiVersion: "security.istio.io/v1beta1"( n: t/ {8 F. f$ p" X8 l6 e c
kind: "PeerAuthentication": X) _/ S9 b6 f3 v- U
metadata:5 S3 r/ a. `, d) }+ i
name: "httpbin"1 M- X8 a, _1 x, W& [: ]
namespace: "foo"+ h9 a3 b. A! V$ W, s, p
spec:
$ \- D" N- Y1 e) [8 n selector:5 |" L+ P. N& U+ W- R
matchLabels:
. H/ H9 G$ x$ s) Q. ? app: httpbin
0 J# ~7 b8 A9 C3 ~ mtls:
% Q# F* V+ h& b& A z" q0 z' r mode: STRICT: X. C$ b5 E$ _
EOF6 o. b: X z2 f% @4 j
4 x1 v' b4 v1 a. {8 k
这时再次进行测试
% y5 x. A5 i M% ~% b. s, 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/ip" -s -o /dev/null -w "sleep.foo to httpbin.foo: %{http_code}\n"
J$ A5 X9 h& Lsleep.foo to httpbin.foo: 503
D' _3 L% g; ~$ V. A[root@master1 istio-1.6.0]#
4 S7 G$ c7 }* X& X8 V8 T( g
9 \9 p0 f+ a* ]) ~) ]2 s! `4 u1 v% ^出现了503错误,这其实是一个tls冲突,因为截至目前为止我们为服务器端设置了强制使用双向tls认证,但是客户端还未设置。
( `. e% R+ `7 O% F% N1 {/ L m4 O5 i5 z2 b+ w& v' M, n
接下来设置客户端。2 s7 T$ ], p/ x0 W5 m! ^ | I0 ` p
cat <<EOF | kubectl apply -n foo -f -& Y q! Y t6 q* j+ x, x0 M& t/ e
apiVersion: "networking.istio.io/v1alpha3"
: ^) ]9 K- T* z1 hkind: "DestinationRule"
% q% n7 o/ p! R3 A# o9 Wmetadata:( f) [9 N% f3 D; w/ e- d
name: "httpbin"$ V- A1 {9 I" q y9 f* ? H
spec:* n& o4 {7 R$ ^5 C
host: "httpbin.foo.svc.cluster.local"
! A" Z5 W4 t% y( ~ trafficPolicy:6 [ M- w/ V; f1 F; H
tls:6 A% ]# i* O; z% M' Y( `
mode: ISTIO_MUTUAL9 a, [3 B3 F( o* b0 U
EOF
2 x! W' s* ^- E+ y# Q& L+ `, |" M1 l6 i1 r) I% ?( Z
然后进行测试,发现现在已经可以正常访问,且使用了双向tls认证,符合预期。% M4 ]3 n( `- r1 m% 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"
$ n- g5 d, S4 o/ nsleep.foo to httpbin.foo: 200$ j8 ?/ h; w, r
[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
6 \2 Z3 ~ q9 w+ m "X-Forwarded-Client-Cert": "By=spiffe://cluster.local/ns/foo/sa/httpbin;Hash=b8a73b2655b270e23eda820e49c56cc9b16521d98cb6c1896eff41c58cc32d56;Subject=\"\";URI=spiffe://cluster.local/ns/foo/sa/sleep"$ Z% K$ u1 \. D5 H% o, m1 z
[root@master1 istio-1.6.0]#
8 K4 L& N& T" L `: t- y4 f5 { K7 Q# u4 H: ^, c
清理命令
+ F" w$ |" |2 H% `0 {, ~$ m( v2 v% C/ R) p
kubectl delete PeerAuthentication httpbin -n foo
; ]- k l5 B' a6 _kubectl delete DestinationRule httpbin -n foo) f0 T- T0 V& l, {
kubectl delete -f <(istioctl kube-inject -f samples/httpbin/httpbin.yaml) -n foo9 m' j$ X: j9 l) }$ C
kubectl delete -f <(istioctl kube-inject -f samples/sleep/sleep.yaml) -n foo
9 h9 x; S' P' U. x' S* H! o$ bkubectl delete ns foo) Q0 a; H$ C) i7 c9 j, c
; Y( Z+ U$ H4 T( j. Z/ O8 |$ o# N7 D
|