3 @1 S8 D8 N( T% g: @) U) ?7 Y4 c
! `7 M5 H+ ^" {1 ]) W- N一、概述+ F- C5 \ p8 x& A. b( w! D
$ Q, F% n9 D8 |4 ]9 k- {
Istio中实现了从客户端到服务器端的全链路加密功能,首先从外部的客户端发起请求,到达Istio的Ingress Proxy,后者作为整个集群的边界网关,会再将请求转发到集群内部的微服务,在集群内部,一般会涉及到多个微服务之间的交互,形成一个调用链。
6 w* ^+ Q7 `' E+ c% j+ G) E7 c) M$ A5 a& }) q5 G$ Z# t8 s/ s# V3 i# K
在很多架构模型中,集群内部会被认为是天然安全的,微服务之间的流量也是明文传输的。这种模型现在受到越来越多的质疑,因此诸如很多公有云都实现了"零信任"网络,全链路加密的功能。
. f$ N8 n/ I( C' s. K' ?; d& A( G" v3 H& v) G) I( {
本文会详细分析在一个集群内部,如何通过Istio实现服务之间通信数据的加密。Istio中的加密方式是双向tls的认证,具体是指两个Envoy Proxy之间的首先进行双向tls认证,认证通过后将后续的数据流进行加密传输。- U6 f9 W! o2 x; S4 B9 @
6 }3 @/ O# c- q0 H- e6 Z `8 M- J8 ~
例如: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。
U, \+ \- Q& u9 H
d2 Q" `' |( T
9 A, l* {/ u2 J" T8 z/ S6 X% o5 _
在Envoy Proxy A与Envoy Proxy B之间认证的过程对于Pod A或者Pod B而言都是无感知的。
# b, X3 _/ z* q' U
0 ^& k' o+ a0 X- u5 H! K6 v! @9 dIstio中双向tls认证的基本对象是 u0 B' j% X1 p$ I+ @7 Z0 A5 H+ S# a
, }/ V$ h+ X+ e0 D
apiVersion: security.istio.io/v1beta1
; N- f& R0 a2 |' K. G6 X9 D1 Rkind: PeerAuthentication
, u' _$ _! ~- O
' q. ]0 ]# k6 K; c9 [7 e2 S# j; H: I二、认证配置的策略类型
+ J8 n5 u8 R' s, {/ Z; W在具体进行配置的时候,有四种基本的策略
( v# g/ J5 d+ s7 y
6 C2 a3 m, `. [, k' _9 X" p) F3 K/ A3 `●DISABLE) I+ y8 c2 \0 t k1 a4 l8 J* Y
+ n( s8 J: p8 x# @, w0 Z! E6 v
即禁用双向tls认证,这种情况下源Envoy与目的Envoy之间没有对对方进行身份的安全确认,它们之间发送的都是明文数据7 }( M% w$ F& g6 }5 [
% b- q9 l% ?* g2 Y) v
●STRICT1 }( }4 k8 ]1 p8 a1 U
& ^+ H( \- Z3 r2 o
即严格的双向tls认证模式。源Envoy与目的Envoy之间必须对对方进行身份的安全确认,它们之间发送的都是加密后的数据。
: I. ^, r3 | c/ m
4 J7 q4 |5 v8 h' y●PERMISSIVE
6 j* N6 M1 w a3 e" u& V! G2 e& |5 n4 F0 l, Q9 U; N j
可以进行双向tls认证、也可以不进行认证从而发送明文数据。
6 ^& d+ }8 |4 {' J- R8 ?8 c
5 t; |# c% M2 a" r7 O- Y$ b$ z●UNSET% p E9 \ `( m6 Q% I
+ m8 o. K$ b( x$ z+ q+ w即没有进行设置,这种情况下会继承上级策略,比如当前namespace的或者整个系统的。如果上级策略都为空,则会默认设置为PERMISSIVE
6 p) K% c% {/ s$ `: x
7 Z& N: J+ }6 E. d7 r4 s3 f) ~三、认证配置的范围
3 R" K$ e5 r. ?( {$ SIstio中对双向tls认证进行配置的时候,可以有几种不同的范围,范围越小优先级越高:
2 _$ U' M* ?4 P9 G6 h& T( X( K) m6 M/ U0 {( Z( H4 U" R
●全局3 [7 G" L! ?! A& O* ^
apiVersion: security.istio.io/v1beta1
* e' i( h' Z% ~4 k2 F. S kind: PeerAuthentication& M/ K5 A& F4 c* n
metadata:
# e5 s( q% ?! W( h name: default
( ^/ j ^3 P8 f, o# n# c" u1 P namespace: istio-system
5 x( E5 X0 E5 M8 ]5 R spec:
. Y6 S: t. |1 F" A mtls:
" w1 @3 v& q! K: a: g mode: STRICT, T7 Z0 u B4 K+ I6 f
0 M r2 t$ r4 ^
注意,全局的安全策略名称只能是default,namespace则是istio所在的系统namespace,这里是istio-system
E, i" I; i7 {3 n
h. d) B, V1 w/ Y●namespace级别,即某个namespace中所有服务
" n/ g5 f1 E& E) ~; X/ c$ {* B/ A4 Z0 W; n0 I
apiVersion: security.istio.io/v1beta17 i4 P2 c0 O! I1 d9 u; e
kind: PeerAuthentication" G! u8 D; [' n e( ?$ i( B
metadata:- r+ k( O5 t/ m# G( L N2 R
name: default; {$ n; N+ b: j* I3 U8 Q
namespace: foo5 \2 @& E, n# {( K
spec:) D1 j- v) J; M% P8 d: }9 D1 `
mtls:$ H1 z1 {' {6 p
mode: PERMISSIVE
( w" A* v0 P: {
4 j! l9 S; S, B% C0 ]. k●负载级别,即某个namespace中某些具体的Pod
; o- I4 e: I) Q' w- v9 {0 I0 c
* i, p' E4 j$ O" b+ y apiVersion: security.istio.io/v1beta1& b# D- E( y/ q! {: T; F& z% E3 i
kind: PeerAuthentication) U8 l; L1 w& Y7 ^- h! m* B2 l
metadata:, q. A. j3 H" f# [; C* @6 l
name: default: [( l0 u+ N4 k- L; s( V
namespace: foo' ^8 ?8 K$ P8 B3 X2 _$ b/ U
spec:
H, j* {$ v( _0 R1 |! q selector:8 `% T4 N a: A4 t/ M/ ~9 m% O
matchLabels:6 X1 ]9 b! b2 X3 G0 q# ?4 Z* R8 {+ H
app: finance; C1 j- I8 {8 M. G
mtls:
0 g$ U7 {. `! g" Y" f mode: STRICT
, q* C0 i7 t6 M1 n+ x7 m
* N- L) B' X" S$ N- u+ `会将带有"app: finance"label的Pod所在的Envoy实行STRICT模式。8 F$ q/ U2 X, _4 L7 }
% Q3 r2 K" c& [0 `
●端口级别% J6 {7 s# q' p: e" F
apiVersion: security.istio.io/v1beta1
! K/ i. C& z; {: H kind: PeerAuthentication
9 S* R! l% G6 c) V( F Z' f- t metadata:- p' _$ A$ t0 R+ _% f, I+ W
name: default
9 \" Y2 H0 \9 u# d2 ?$ T namespace: foo( B( S. h" B% @. I4 H3 O
spec:: w8 a8 e2 J4 N' E* J6 P
selector:
& S. a0 m8 Z) J1 W3 F+ [1 } matchLabels:; Z1 v% _* Q% o5 |4 @
app: finance' U7 y+ @" F0 j# B8 k/ Y. h
mtls:/ ~' G, {( B' P
mode: STRICT% k4 L d$ y: k% U
portLevelMtls:
: _/ ]+ a9 ~$ r( [ b9 P8 k" a* q 8080:% V7 e' t Z8 A& @$ q$ y" z, \6 b
mode: DISABLE r; v, \5 j) b+ Q% ?
7 C' i; j# l" X- U( ?会将带有"app: finance"label的Pod所在的Envoy实行STRICT模式,但是会将其中的8080端口使用DISABLE模式。/ [$ b) i2 @" m
四、认证配置的具体方法
6 c7 h1 g# Z) ?) i0 }3 k9 R ?在Istio中进行双向tls认证配置,需要注意的是客户端和服务器端配置方法是不一样的。例如在namespace foo中有两组服务A和B,每组都有一些Pod,假设服务A的Pod对应的label为"app: A",而服务B的Pod对应的label为"app: B"。这时在服务A所在的Pod中访问服务B,要将这一请求设置为STRICT模式,需要配置两处
) o W: m- {1 V: z5 {- n) I0 N3 h0 e9 H+ T$ e
1.服务器端配置,给服务B对应的负载配置PeerAuthentication策略,这里配置的是服务B所有关联Pod对应的Envoy Proxy。
) D, Z/ G8 D5 x. r/ V" G6 j# h" i0 L" Q+ k+ X9 }
apiVersion: security.istio.io/v1beta1
! s' q' q9 [$ u/ r7 ?2 Y kind: PeerAuthentication
* K: t! n9 ~3 \( p0 R: m4 x2 v metadata:( e( `) o8 J' P! f. r/ o; m
name: default4 \) b) X3 R- Z% }
namespace: foo
* B: k, \+ U9 m1 }. d1 Y spec:
) T0 ]2 l% r- d( E" ~ selector:
) T" A+ I$ a9 q6 o3 M matchLabels:9 K3 n2 {# r8 O
app: B: Y( G2 [1 _6 I
mtls:, ^. ~' ]5 i& ~2 A" H0 `
mode: STRICT
. ]+ N+ b3 \7 C6 d# B5 x9 h+ U+ y. L# f A
2. 客户端配置,给服务B配置DestinationRule策略。这里配置的是所有访问服务B的Pod对应的Envoy Proxy。2 N1 M- Q+ ? h0 D
4 }: m* t4 f' s1 i0 }( r cat <<EOF | kubectl apply -n foo -f -
. Q/ {. e: ^ i apiVersion: "networking.istio.io/v1alpha3"
\) @& G( m# U8 ]2 } g6 } kind: "DestinationRule"( f( M+ l2 x* c; R$ ~6 V% `: y6 _
metadata:# _6 m L# t# b0 }, }, N
name: "B"6 a3 d+ T& l/ a0 i! d
spec:
3 I" t1 S3 g" u \; s host: "B.foo.svc.cluster.local"
% V p& _, D+ N+ u2 I# _" p8 [ trafficPolicy:( B2 F5 K, A% P; q9 x+ f- K
tls:
9 k9 q+ P* W" h4 Q mode: ISTIO_MUTUAL
. _- I1 x& J2 T; P6 V) ]# p/ s EOF
* N" m; }% F: f) v7 P: v; j/ U* A% w- v
也就是说客户端配置的时候需要配置目的服务的DestinationRule对象,而服务器端配置的时候需要配置服务器端对应负载的PeerAuthentication对象。; n% P7 G- ~9 S" d8 r' f. o
五、测试case1:默认配置
2 i) K/ i# j$ i: ` L5 W* X) fkubectl create ns foo
8 E! N X- Y+ _( zkubectl apply -f <(istioctl kube-inject -f samples/httpbin/httpbin.yaml) -n foo
0 I- j$ ~! H$ \kubectl apply -f <(istioctl kube-inject -f samples/sleep/sleep.yaml) -n foo p- m, ]( d% @7 c) U; s
kubectl create ns bar9 h' r6 _( Z% _8 E! \5 K: H1 k# a2 z
kubectl apply -f <(istioctl kube-inject -f samples/httpbin/httpbin.yaml) -n bar4 o+ p( ], C" T: G7 r% M
kubectl apply -f <(istioctl kube-inject -f samples/sleep/sleep.yaml) -n bar/ m( @! u) r% `' T" u6 z
kubectl create ns legacy
! y6 l7 H2 k4 l: |9 R z$ v5 z$ a6 \1 Wkubectl apply -f samples/httpbin/httpbin.yaml -n legacy2 {* |1 B! k0 W& y
kubectl apply -f samples/sleep/sleep.yaml -n legacy
6 C1 b. x7 `' ~$ I# u) n# X4 j/ {! S8 M! L5 ?
创建了3个namespace:foo, bar和legacy,每个namespace分别创建了sleep和httpbin两种应用,作为客户端和服务器端。在foo和bar中的Pod有对应的Envoy Proxy,而在legacy中则没有。下面是创建成功后的Pod情况' P$ B$ c! G/ R i: @ u$ I0 j5 d8 ]0 N
[root@master1 istio-1.6.0]# kubectl get pod --all-namespaces
# G' @; u( _" q2 T8 @: M9 b% q4 G8 }NAMESPACE NAME READY STATUS RESTARTS AGE4 O, Y" z0 T1 s5 ]# U' s
bar httpbin-67576779c-tjl4m 2/2 Running 0 31m7 o+ Q" r3 V) w& ^4 Q
bar sleep-7dc44b8d45-rfhpl 2/2 Running 0 31m
$ X! `! a0 `; u" ^/ D8 qfoo httpbin-67576779c-tw6kl 2/2 Running 0 31m
8 q7 Q8 H4 G' k/ `, U- `foo sleep-7dc44b8d45-87x2p 2/2 Running 0 31m0 R# H$ z% E2 R0 i$ a
legacy httpbin-779c54bf49-h5wrw 1/1 Running 0 31m1 x9 Q: h; k1 q$ z# L2 H& q3 f1 _( F
legacy sleep-f8cbf5b76-b8xgd 1/1 Running 0 31m
. E+ {! B$ K4 d
8 ~1 k" S1 E4 b8 f6 Q; i9 D5 c5 l$ B, ^! ~7 r
在使用默认的default配置部署Istio的情况下,如果没有设置任何安全策略,默认是PERMISSIVE,即同时允许双向tls认证和不进行任何认证的明文传输两种方式。注意这只针对有Envoy Proxy的情况,因为这些策略最终的执行者是Envoy,而对于那些没有Envoy Proxy的Pod,例如legacy中的Pod,则只能使用明文方式进行收发数据。下面来验证这一点) Q' i. z3 i# h( F' W9 R
5 Q+ V+ ^5 I- s( H, a
[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 L$ W# E* l {/ ? a& s0 j
sleep.foo to httpbin.foo: 200
) x- t9 T. z% _7 Bsleep.foo to httpbin.bar: 200
0 h8 N$ s o% r- L! ^sleep.foo to httpbin.legacy: 200
; z! {7 u1 ^, @! H. o/ k2 Usleep.bar to httpbin.foo: 200; h% f. X6 O. @, w& a. C( f8 E$ B
sleep.bar to httpbin.bar: 200
# K* M5 z4 r$ k0 h% R! l* K! wsleep.bar to httpbin.legacy: 200& D* q+ {6 W% G: q- @$ Z
sleep.legacy to httpbin.foo: 200
- K& I) H; [9 vsleep.legacy to httpbin.bar: 200
; u+ B0 {$ B! O. b* X8 }9 esleep.legacy to httpbin.legacy: 2004 p4 H0 Z2 f% ], M' T* [* N. ^- A
/ w4 {% S0 D2 Q6 B: J* [; K1 d
可以看到任何两个sleep与httpbin之间都是可以连通的。但是如果进一步观察,发现这些认证方式其实是不同的
# N6 g1 \2 `% W[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 k8 f* e5 ^- g& H6 |3 L "X-Forwarded-Client-Cert": "By=spiffe://cluster.local/ns/foo/sa/httpbin;Hash=41eb8aa0a91782fc1a09df8da85b586c5eaabbca3117f645cdb9df8d998b55f2;Subject=\"\";URI=spiffe://cluster.local/ns/foo/sa/sleep" z6 N; r* ?/ J8 J! j. _1 {6 `" x
r$ Q9 x O& I" |从foo中的sleep访问foo中的httpbin,header中带有"X-Forwarded-Client-Cert"表明使用了双向tls认证。) t& m" T4 Y% X2 _% ]4 _
[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/ p. n9 K ^9 s# @- v0 m
[root@master1 istio-1.6.0]#) E3 V1 q+ @1 p r5 I
9 _6 ?# y: }& I9 p而从legacy中的sleep访问legacy中的httpbin,header中则不会带有"X-Forwarded-Client-Cert",因为客户端和服务器端都没有Envoy Proxy,只能进行没有任何加密的明文传输。
6 b' v6 p; X* h
+ W4 q7 {3 R8 P% L6 {4 B( V) ~5 Y& r另外,还可以看出sleep.legacy发出去的请求都是明文数据,而sleep.httpbin收到的请求也都是明文数据。而foo和bar里面的Pod发送请求时则会优先使用双向tls认证方式(即下面四种),这些可以自行测试验证。
- r. C8 k8 _* n8 Gsleep.foo to httpbin.foo: 200
' k! [# ?3 {/ e/ _3 X- N6 fsleep.foo to httpbin.bar: 200* T1 k( W- p; b2 Q: P" }( w3 c
sleep.bar to httpbin.foo: 200" i' Q/ K; K2 z9 N9 L$ c
sleep.bar to httpbin.bar: 200" {7 o9 }4 k: C: W
+ c: H! g7 R7 q" L0 f* t; u2 o清理命令
: E2 p7 N6 H3 @* j# W; ykubectl delete -f <(istioctl kube-inject -f samples/httpbin/httpbin.yaml) -n foo, T+ z$ K) S1 K" _$ n
kubectl delete -f <(istioctl kube-inject -f samples/sleep/sleep.yaml) -n foo8 o5 C8 s: a2 u$ M, s P
kubectl delete -f samples/httpbin/httpbin.yaml -n legacy
, p1 P' y) t* j& g% X0 N, f% Gkubectl delete -f samples/sleep/sleep.yaml -n legacy
7 b4 E6 h# W! I4 H- {4 jkubectl delete -f <(istioctl kube-inject -f samples/httpbin/httpbin.yaml) -n bar
* Z5 j9 _, Q# t1 H7 V S+ ikubectl delete -f <(istioctl kube-inject -f samples/sleep/sleep.yaml) -n bar
0 K4 S) b/ a" `* ~ Z9 }9 Kkubectl delete ns foo
5 `! i6 \' z" R# y; g' A, D$ h ~6 okubectl delete ns legacy
0 @; k8 W" v2 v2 U |6 d8 u2 Wkubectl delete ns bar c. j" b$ N, I+ T8 q
3 x, W( _ ]5 ^4 y" t3 o
六、测试case2:针对特定服务的配置: O9 H3 ~5 V" Y+ Y4 T8 S
首先,创建一个全局的安全策略,禁用所有的双向tls认证。
' G; C' t. G* E, qkubectl apply -f - <<EOF
/ e. F6 t! [* f& n4 ^. fapiVersion: "security.istio.io/v1beta1"/ h7 L8 y0 A( T9 Z
kind: "PeerAuthentication"; O/ |4 h, |3 @- S+ w& d
metadata:
# C3 _. v; Z5 d; J" l! `& S$ f name: "default"
) n1 Q% E, {) C* @) t, n namespace: "istio-system"& o+ q% ]* ~) G& e& m/ T
spec:
- O6 [* |$ p6 q2 |, \" @" d" C mtls:
; u5 q( A! Q4 h+ W, O- E mode: DISABLE# |- d' P/ Q& f2 g, G& P b R; f
EOF
6 n9 z$ ^% n1 p* p7 s2 y6 J! M. K4 f2 a
然后创建一个foo namespace,并在其中创建带有Envoy Proxy的sleep和httpbin* V, h+ ^: H1 ~& p
kubectl create ns foo
" ]& V; J# S- \# F J1 f3 Dkubectl apply -f <(istioctl kube-inject -f samples/httpbin/httpbin.yaml) -n foo
2 _- R" W& z ]; p, I- Pkubectl apply -f <(istioctl kube-inject -f samples/sleep/sleep.yaml) -n foo% s# f/ q \' n# H3 E- h
; x. R+ a) y( D1 Z9 y8 `这时进行测试,会发现他们之间可以正常访问,但没有使用双向tls认证,这符合预期,说明全局策略生效。
* L0 g& c2 ?9 E, V: T6 p' g[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"
$ O- R# S- n0 E7 F: _- }sleep.foo to httpbin.foo: 200
& C9 a& K3 h. e[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# E0 h9 C! K; ^, f5 X! F( O
[root@master1 istio-1.6.0]#
s5 p5 |% A5 K/ O$ X% [& O) ?; Z$ l1 |0 |% h" ? p
接下来为服务器端配置PeerAuthentication策略,让其强制执行双向tls认证$ e% k2 j1 x3 G
cat <<EOF | kubectl apply -n foo -f -
% t. n! F( i2 v# v, wapiVersion: "security.istio.io/v1beta1"9 h+ H1 {* W# a! Y# Q
kind: "PeerAuthentication"
3 z* n+ l, ~0 d, r7 ]metadata:
: @! C7 T+ N i+ @6 n! z2 t a9 R* v name: "httpbin"
/ d9 G$ s. U& h2 b7 Y namespace: "foo"
: y H$ s E! y" p1 T. Lspec:
1 U" ]" J# E, M T! S" @0 u selector:
7 A0 s9 l9 I; }/ r g matchLabels:, r6 [$ s$ G" B
app: httpbin: N. u$ q5 ~( I9 D, j( [" i1 Y
mtls:
9 d4 ~; |* M# R mode: STRICT* K. a* D0 Y( c- C; Q U% ^# P
EOF
% r$ Y: D6 j, }9 j
7 Y, n, x! L" I这时再次进行测试& k9 W/ N" ^% _& j+ t W- 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"
2 \+ H- L5 R3 {" b* g( Xsleep.foo to httpbin.foo: 503
9 _+ Q1 A3 h3 d1 A+ f% e[root@master1 istio-1.6.0]#
; \. a2 c5 M4 W1 j' t6 f/ |7 }# r7 y- H" k
出现了503错误,这其实是一个tls冲突,因为截至目前为止我们为服务器端设置了强制使用双向tls认证,但是客户端还未设置。
# s: K6 x7 Z L8 Q) U/ j" J9 f4 @
- d( Z$ C2 [8 e( }- `, k5 _" v5 ~. W4 T接下来设置客户端。: d% I, b3 _* d/ M( p
cat <<EOF | kubectl apply -n foo -f -; K3 u9 L. U5 i# I* H
apiVersion: "networking.istio.io/v1alpha3"5 k. U7 ?- h9 ~- R: v
kind: "DestinationRule"
4 e. G* d; Z+ C$ ?/ q U0 _+ w$ Smetadata:
, W0 L' a+ `1 W( l: R/ ~7 q name: "httpbin"2 B/ [$ J) e: \' \" n
spec:/ m' I; Q( z3 G. {) Q0 ]4 B
host: "httpbin.foo.svc.cluster.local"
3 i- H6 x2 W* s trafficPolicy:
. e# R: t8 J6 |! G tls:8 Q3 V9 h& P2 t! H* K* G( p2 G
mode: ISTIO_MUTUAL E4 [8 t5 W. P9 `
EOF9 ]' m! J$ a" l; j2 ^
; F. D$ D5 @8 y
然后进行测试,发现现在已经可以正常访问,且使用了双向tls认证,符合预期。
* c/ k9 x- d- v' a" V[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: s3 E @3 R* W7 f$ q
sleep.foo to httpbin.foo: 200
, d0 Y5 d5 y% f( r0 O& { t! 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* B" P& p6 _; H% k, t) E7 T x
"X-Forwarded-Client-Cert": "By=spiffe://cluster.local/ns/foo/sa/httpbin;Hash=b8a73b2655b270e23eda820e49c56cc9b16521d98cb6c1896eff41c58cc32d56;Subject=\"\";URI=spiffe://cluster.local/ns/foo/sa/sleep"
0 B1 g. K( Y% j( r& [' E- G[root@master1 istio-1.6.0]#
3 U4 q+ N+ x! l0 J
" `1 c% }6 J' g; P3 k清理命令
, Q/ |9 B/ h" n4 i! u1 O9 }
1 J3 I* }+ p: }9 b3 Skubectl delete PeerAuthentication httpbin -n foo
5 T- C4 U6 [- t+ qkubectl delete DestinationRule httpbin -n foo
. ]! v' Z6 C4 ^9 mkubectl delete -f <(istioctl kube-inject -f samples/httpbin/httpbin.yaml) -n foo" Z8 p, y" }4 n/ E; D% P4 X! [
kubectl delete -f <(istioctl kube-inject -f samples/sleep/sleep.yaml) -n foo0 k6 J1 |8 y+ u4 U
kubectl delete ns foo4 m g% R5 H e3 N* J2 [
& `) j& l; E/ g* M5 Q1 z$ M3 r
* [$ T3 R5 I) }: ~ |