返回列表 发新帖

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

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

! S* K/ ?% F: T  n$ i                               
登录/注册后可看大图

$ ~  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

. u; X$ C( Q% p4 q) J" @9 h. B                               
登录/注册后可看大图

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

回复

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

本版积分规则

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