返回列表 发新帖

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

2.3k 0
忐忑的自行车 发表于 2020-11-3 10:37:53|山西 | 查看全部 阅读模式
6 v6 {; c* g. X9 i  u7 G
                               
登录/注册后可看大图

/ k7 t" q! Y8 m8 f! `% {# p/ q9 s0 h5 D9 p9 O4 ]+ {5 k) n
一、概述
7 t+ s3 O7 o; n, y( ~/ b7 P
  |$ r7 p+ F4 A& _Istio中实现了从客户端到服务器端的全链路加密功能,首先从外部的客户端发起请求,到达Istio的Ingress Proxy,后者作为整个集群的边界网关,会再将请求转发到集群内部的微服务,在集群内部,一般会涉及到多个微服务之间的交互,形成一个调用链。
6 y/ W4 R6 R. Z. r& J0 Z7 e& u) e  s7 [5 I5 Y6 c6 d& ~, K: Y8 g* N
在很多架构模型中,集群内部会被认为是天然安全的,微服务之间的流量也是明文传输的。这种模型现在受到越来越多的质疑,因此诸如很多公有云都实现了"零信任"网络,全链路加密的功能。
, E) r9 ^$ Z) L8 g; V1 h( X: z! x& {  ?$ {: I! d* r
本文会详细分析在一个集群内部,如何通过Istio实现服务之间通信数据的加密。Istio中的加密方式是双向tls的认证,具体是指两个Envoy Proxy之间的首先进行双向tls认证,认证通过后将后续的数据流进行加密传输。
5 W9 }& @& D; \4 L6 P( L
4 @: z+ z" F* ?6 N, n例如: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。& P  Q8 r. I: V

- _( e4 c- ?9 f* |5 @- j5 X- p

- j9 ^9 E7 J+ p6 G6 ~                               
登录/注册后可看大图

& M& h: k) @* o: j0 N) B6 A9 D3 W, i
在Envoy Proxy A与Envoy Proxy B之间认证的过程对于Pod A或者Pod B而言都是无感知的。* R" z5 w0 K5 S; p) |

0 k$ s& I9 C2 HIstio中双向tls认证的基本对象是
+ ?5 J4 V" o4 _( ~+ ]; |8 w) `+ |7 S  \; {- h
apiVersion: security.istio.io/v1beta1
3 i0 g2 k  f& V  m6 R( u7 n; kkind: PeerAuthentication2 d; `- \( e* u, e

. E3 M; |1 X9 R1 S+ s1 N) [% j二、认证配置的策略类型
0 r9 c: {% `" M. U3 u在具体进行配置的时候,有四种基本的策略
% t- F( d3 c  u4 _$ O; m0 e0 Y2 @. Y- @. M2 [
●DISABLE# ~9 [" _" J: M7 y# p+ Y) k

& k; j5 D, ?1 `- `即禁用双向tls认证,这种情况下源Envoy与目的Envoy之间没有对对方进行身份的安全确认,它们之间发送的都是明文数据
% o3 U$ O0 C  [: r% T) Q
1 R6 \& D7 t' _6 m' ?# o! L●STRICT
4 L% r% r$ Z5 T7 z  O# w' M6 E3 d: J9 v5 N8 O' G! b: |
即严格的双向tls认证模式。源Envoy与目的Envoy之间必须对对方进行身份的安全确认,它们之间发送的都是加密后的数据。
# M- P+ K% T( Q5 Z" v! l; c) b5 a9 \- I( `$ U
●PERMISSIVE
( N, k8 D' E/ ]  Z: c; q$ e% t, S! Q* e1 x2 p9 E. b  c7 N+ ]
可以进行双向tls认证、也可以不进行认证从而发送明文数据。) g5 _# ?8 ]! f  O' a

) `) @3 p* R: K$ u: `●UNSET0 l- s8 S* e# N# n

; S; S  G9 x; t即没有进行设置,这种情况下会继承上级策略,比如当前namespace的或者整个系统的。如果上级策略都为空,则会默认设置为PERMISSIVE0 Q- o2 ?; j7 ]- B1 M; _

) Q' R4 D1 z, P7 J& F3 m三、认证配置的范围
' m3 y* |6 |6 [7 xIstio中对双向tls认证进行配置的时候,可以有几种不同的范围,范围越小优先级越高:
2 D% `) q, N- l9 O' R1 A9 @& Z5 u- G) w4 x( X; P7 W
●全局1 L+ D  D$ \+ g! o
  apiVersion: security.istio.io/v1beta1
+ |8 ]/ I* Y; x; G' H1 T, o  kind: PeerAuthentication
* C/ N, H. b8 i, j7 W* o9 T" j  metadata:
1 W& d5 u8 j. p+ M! B% D    name: default$ Y4 k* k8 l  v) j- E& I
    namespace: istio-system
4 b6 t8 ?5 \5 Q4 ]  spec:
  z8 ?+ m( @. w# ?! P( s    mtls:( v5 G! G; P" o
      mode: STRICT
: k0 T9 h; Z% s) s  N& @7 d: y) I8 b3 v
注意,全局的安全策略名称只能是default,namespace则是istio所在的系统namespace,这里是istio-system
2 |2 w" G+ S, B/ h
0 P7 u3 @7 k3 G" V4 x/ Y: G●namespace级别,即某个namespace中所有服务
$ A. i9 }/ D$ p, p/ f1 h1 ~6 B" v8 I7 ?8 ~) p$ ?& J5 ^# L6 _5 n
  apiVersion: security.istio.io/v1beta1
( n  y; p1 R6 A/ ?8 G# X3 J  kind: PeerAuthentication
% q+ L) b7 X* g4 R  metadata:
1 W. C2 ?8 N5 l    name: default# @+ y3 _& Z- A1 g# v
    namespace: foo
/ m5 M' \6 ?/ B2 x: j$ R  spec:/ ?* @9 i1 N- _- U
    mtls:
( y  b! Y/ C* O: ~: ]      mode: PERMISSIVE
! s! l3 J6 D- M7 \, K9 s7 C8 u, k# L4 W2 N+ B4 Y2 [! d
●负载级别,即某个namespace中某些具体的Pod  r! ]8 k* b0 q* O+ V2 c
9 H" |. ]1 @  i1 p: q, L
  apiVersion: security.istio.io/v1beta1+ e0 x2 `: D+ j2 W( a
  kind: PeerAuthentication
5 ~# Z8 W& Y2 C+ \/ S  metadata:) S( T) i; r9 J3 V; J
    name: default8 T  b* \6 y3 n$ T% w& L
    namespace: foo! x7 ^+ @) F( C/ V5 F' f0 g2 [4 X
  spec:
5 [# c8 F3 z% Q    selector:& T7 |, ^( Q2 W9 r7 R
      matchLabels:( ]. ], A1 e0 H( T
        app: finance
$ V1 U# y% f6 |3 Q    mtls:2 h4 F. |5 K# P' O) J# n: j8 i
      mode: STRICT
7 _1 T, I5 {  N( u0 [  ^: ?! ?% n& v: M* H  o7 F) \
会将带有"app: finance"label的Pod所在的Envoy实行STRICT模式。
2 C& ?$ h% f# @. J3 J/ S8 @
0 F' L1 {' ~0 W" @●端口级别, _2 k- v0 @: `4 [
  apiVersion: security.istio.io/v1beta1
7 u' Z- ^) b5 c  kind: PeerAuthentication7 c! C6 X2 Z. E% o4 d9 K0 ?
  metadata:
" |- _: q2 t& h    name: default/ _) @+ Z. E0 S" V" u) }
    namespace: foo+ N$ @% y( G4 Z- P( f) L) w
  spec:3 V( P5 q. i0 Q( ~$ |/ |/ T
    selector:
6 `- e( D( Z- k/ C6 V  F      matchLabels:; R0 L$ h! L# Z- g
        app: finance
3 u) ]. C" f3 S% t# I9 i+ X9 C    mtls:! v9 f8 D& q, n' @6 n
      mode: STRICT$ p& k, e9 p' p5 V
    portLevelMtls:
& S2 k1 f' E& R: q( g% c4 N4 Z      8080:% O5 z5 T* Q2 t! r& ^- d
        mode: DISABLE  G1 Q4 K0 X& G! C  G2 k* l

' O" L/ s% `* g  I* @4 z会将带有"app: finance"label的Pod所在的Envoy实行STRICT模式,但是会将其中的8080端口使用DISABLE模式。4 u7 K3 T1 Q8 f0 w; m& x7 x
四、认证配置的具体方法
" @9 K" V; h  x5 d- S在Istio中进行双向tls认证配置,需要注意的是客户端和服务器端配置方法是不一样的。例如在namespace foo中有两组服务A和B,每组都有一些Pod,假设服务A的Pod对应的label为"app: A",而服务B的Pod对应的label为"app: B"。这时在服务A所在的Pod中访问服务B,要将这一请求设置为STRICT模式,需要配置两处
/ D; O% V: o6 f& s0 K6 t3 C9 ^* p9 q# p1 u* B: b  g- t
1.服务器端配置,给服务B对应的负载配置PeerAuthentication策略,这里配置的是服务B所有关联Pod对应的Envoy Proxy。, a, C& H9 F3 a% c+ j

+ l9 Q$ `; F1 V- g8 l   apiVersion: security.istio.io/v1beta10 f: ^9 m, p/ j/ a; N; G8 [
   kind: PeerAuthentication9 G0 h8 O8 H& \! {0 Y/ Z" C2 |
   metadata:% y$ ~0 B! _6 u: v4 N) b, ^
     name: default. W; u& f( V+ R" Y# K
     namespace: foo. B4 M9 K3 H+ M8 V
   spec:0 L' L8 o" b7 P$ k0 t8 Z6 ?
     selector:
- ^" n1 Y9 H2 L9 g+ G       matchLabels:9 ?- {) P2 V) {. ?: P2 W* q) h: W
         app: B
0 p. a' H, g$ `" G. n4 X     mtls:0 ~5 x( P; C2 l* k/ P
       mode: STRICT
( \2 a8 R8 T. `. _/ S6 t9 b1 Q5 }' B! m
2. 客户端配置,给服务B配置DestinationRule策略。这里配置的是所有访问服务B的Pod对应的Envoy Proxy。
6 I: q! i1 ?/ \0 r# _/ O6 h: |( \: y9 n# x0 t
   cat <<EOF | kubectl apply -n foo -f -
5 x& N6 ]8 m% H- t   apiVersion: "networking.istio.io/v1alpha3"5 L; L$ }8 w+ B5 i  C; f
   kind: "DestinationRule"
; i/ h& _( z7 D: T' F3 `1 `3 v* {   metadata:* K/ `; i8 ]5 k" v
     name: "B"
% j) v3 ]7 y( S! M6 A* ]   spec:4 _4 \) J7 A- G4 T1 _
     host: "B.foo.svc.cluster.local"
. L4 o6 f2 x+ A2 p1 t2 z- K4 r     trafficPolicy:+ J/ c8 W! U" F7 ^/ p7 x  g+ z
       tls:; u* I/ @8 f3 p6 ^+ M
         mode: ISTIO_MUTUAL
5 ~$ y+ q2 ]" E6 O% i   EOF
' G, u2 o/ E4 D- z4 m
: R- k8 z$ M6 {8 [' H$ g+ V也就是说客户端配置的时候需要配置目的服务的DestinationRule对象,而服务器端配置的时候需要配置服务器端对应负载的PeerAuthentication对象。% V& U4 R5 a: A% p" X
五、测试case1:默认配置5 L/ P2 d/ L$ }4 \' z5 }. V$ _
kubectl create ns foo
! A+ E) b8 s; T. ?  Ikubectl apply -f <(istioctl kube-inject -f samples/httpbin/httpbin.yaml) -n foo2 i2 i1 e4 _: a2 A9 z, ^
kubectl apply -f <(istioctl kube-inject -f samples/sleep/sleep.yaml) -n foo
: j6 @9 [0 _8 @. O8 q7 @) Xkubectl create ns bar& K- L& i) x" O( b* T/ c& Q
kubectl apply -f <(istioctl kube-inject -f samples/httpbin/httpbin.yaml) -n bar
* f' r# w% f: B: j* bkubectl apply -f <(istioctl kube-inject -f samples/sleep/sleep.yaml) -n bar
) S' U# G+ o+ e! _. wkubectl create ns legacy9 Y1 F" P! ]2 R" N4 w' I
kubectl apply -f samples/httpbin/httpbin.yaml -n legacy
$ h" j6 {9 E6 ]+ ^kubectl apply -f samples/sleep/sleep.yaml -n legacy
! E7 b8 |, v( D9 {2 x) x( s; {' J' e/ l9 J# \0 \0 D, ^9 M
创建了3个namespace:foo, bar和legacy,每个namespace分别创建了sleep和httpbin两种应用,作为客户端和服务器端。在foo和bar中的Pod有对应的Envoy Proxy,而在legacy中则没有。下面是创建成功后的Pod情况* s, ^! r! X3 p  S, Z# X
[root@master1 istio-1.6.0]# kubectl get pod --all-namespaces7 w4 ]8 I' e3 z7 |- F0 P
NAMESPACE      NAME                                    READY   STATUS    RESTARTS   AGE( o) k5 h! D2 `& v( q, ]+ H
bar            httpbin-67576779c-tjl4m                 2/2     Running   0          31m
5 f" G% M# c+ s. p* D$ Bbar            sleep-7dc44b8d45-rfhpl                  2/2     Running   0          31m/ ?! ?# l+ ^, b, Z+ ]
foo            httpbin-67576779c-tw6kl                 2/2     Running   0          31m; `- _: h4 ]5 Z  v1 u
foo            sleep-7dc44b8d45-87x2p                  2/2     Running   0          31m
  u5 z. ?6 u; h7 }legacy         httpbin-779c54bf49-h5wrw                1/1     Running   0          31m
) s+ Q. h! ?+ l9 R8 E/ X$ S. Ilegacy         sleep-f8cbf5b76-b8xgd                   1/1     Running   0          31m" n! U; `: j8 n, W

: X) W( J) H# o' b" L
8 P5 X3 X* ?" Y% ^" X# n. d在使用默认的default配置部署Istio的情况下,如果没有设置任何安全策略,默认是PERMISSIVE,即同时允许双向tls认证和不进行任何认证的明文传输两种方式。注意这只针对有Envoy Proxy的情况,因为这些策略最终的执行者是Envoy,而对于那些没有Envoy Proxy的Pod,例如legacy中的Pod,则只能使用明文方式进行收发数据。下面来验证这一点
8 u5 R6 i, ]% v( I
6 t" g3 ]" o; v$ x: X( p  u[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
" x* s! {5 A8 t+ P4 T5 hsleep.foo to httpbin.foo: 200
; o7 ]2 \( |$ Dsleep.foo to httpbin.bar: 200
' t7 \% V# }8 l6 F1 Csleep.foo to httpbin.legacy: 2009 @* g* r1 F+ ~1 c0 d. `* a5 G
sleep.bar to httpbin.foo: 200
1 p! I/ Q$ b; {sleep.bar to httpbin.bar: 200' ~3 v8 V8 d! O; X( h* ?8 ?' e
sleep.bar to httpbin.legacy: 200. V/ e  F' H$ I! F. |& [) b0 R
sleep.legacy to httpbin.foo: 200, S; x3 N6 X! ]
sleep.legacy to httpbin.bar: 200
1 }0 e& F0 v' zsleep.legacy to httpbin.legacy: 200( m6 l& `+ g) d9 ~  j
: r8 j1 i: e/ ^: y/ c) \+ \
可以看到任何两个sleep与httpbin之间都是可以连通的。但是如果进一步观察,发现这些认证方式其实是不同的
/ L% b( i+ [$ L5 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/headers -s | grep X-Forwarded-Client-Cert
. `3 e, h! u, i8 P. K    "X-Forwarded-Client-Cert": "By=spiffe://cluster.local/ns/foo/sa/httpbin;Hash=41eb8aa0a91782fc1a09df8da85b586c5eaabbca3117f645cdb9df8d998b55f2;Subject=\"\";URI=spiffe://cluster.local/ns/foo/sa/sleep"; M& R; H0 Q/ h+ |# }  n
6 O1 P* N: {7 ^" k5 D# K
从foo中的sleep访问foo中的httpbin,header中带有"X-Forwarded-Client-Cert"表明使用了双向tls认证。1 \& h& U$ `2 p
[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-Cert3 C* \* T: @' s
[root@master1 istio-1.6.0]#
* Y  o" U: t6 T& e' [: J
, I* r7 d( r8 [7 x而从legacy中的sleep访问legacy中的httpbin,header中则不会带有"X-Forwarded-Client-Cert",因为客户端和服务器端都没有Envoy Proxy,只能进行没有任何加密的明文传输。& l. o; ]; T5 R
( g7 q, S; P  H4 K5 S
另外,还可以看出sleep.legacy发出去的请求都是明文数据,而sleep.httpbin收到的请求也都是明文数据。而foo和bar里面的Pod发送请求时则会优先使用双向tls认证方式(即下面四种),这些可以自行测试验证。
) v) Y2 c+ v# i. hsleep.foo to httpbin.foo: 200: r" m: l! v! D( l" r# D" ~1 B
sleep.foo to httpbin.bar: 200) e' ~% V0 @, @" I$ }3 `2 j2 O7 X
sleep.bar to httpbin.foo: 2001 y6 _  q, F6 B7 m
sleep.bar to httpbin.bar: 200( n. i# J: x, C/ f- j$ a$ L* d% _

9 |( F: N) |4 n7 X9 G! k* ]  U清理命令8 \& n. B  K  D+ B2 }$ c6 g* T
kubectl delete -f <(istioctl kube-inject -f samples/httpbin/httpbin.yaml) -n foo. b$ l1 w+ G2 P$ R
kubectl delete -f <(istioctl kube-inject -f samples/sleep/sleep.yaml) -n foo, _" V0 w, v2 y/ {
kubectl delete -f samples/httpbin/httpbin.yaml -n legacy
$ _( X' s4 k$ W5 p4 f+ jkubectl delete -f samples/sleep/sleep.yaml -n legacy
+ s% X) W- D3 ^. Xkubectl delete -f <(istioctl kube-inject -f samples/httpbin/httpbin.yaml) -n bar
, W! `' G) ?8 J) y) jkubectl delete -f <(istioctl kube-inject -f samples/sleep/sleep.yaml) -n bar% `2 s- K+ b! A0 w
kubectl delete ns foo* Y7 e& _5 Y$ O; O9 W/ ]
kubectl delete ns legacy
# c8 G/ h3 o, ?; d/ j. H$ G& N3 Ikubectl delete ns bar0 z: Y+ \6 c/ P* J

6 N' v- V8 ?9 k# K  H! j+ [9 \7 L六、测试case2:针对特定服务的配置
) _# B6 x6 D; F8 M9 k首先,创建一个全局的安全策略,禁用所有的双向tls认证。* U# \! I* k! n/ U+ r/ h, b0 {# g
kubectl apply -f - <<EOF
$ ]4 L5 y; e* C5 v' @apiVersion: "security.istio.io/v1beta1"
& V4 t: F5 ^, u+ r1 {, P$ W  jkind: "PeerAuthentication"8 Z8 w* S3 V: R$ t4 @9 Q/ g
metadata:
! Y0 u" Q) U; a+ t( n  H) j$ p( C  name: "default"
7 I! U  U' C8 F- c" m  namespace: "istio-system"# R1 U, |1 _6 B( U
spec:! _! I/ Q' H8 P* P9 f2 [/ G# L# q; ]
  mtls:8 ^  C( j) w1 U
    mode: DISABLE. W" C0 y* Z7 r) }& g( O
EOF1 R2 |% K& p0 \$ E4 R

: P& j2 k" l9 x# T: m& k, R( q然后创建一个foo namespace,并在其中创建带有Envoy Proxy的sleep和httpbin  C) C) T( L( R4 e' Z& A
kubectl create ns foo7 E, L; o. f# N( i$ v
kubectl apply -f <(istioctl kube-inject -f samples/httpbin/httpbin.yaml) -n foo2 f4 X4 v( m( f
kubectl apply -f <(istioctl kube-inject -f samples/sleep/sleep.yaml) -n foo/ }# P# Y. O5 D& v
/ r+ W5 Y4 A6 z, o) z
这时进行测试,会发现他们之间可以正常访问,但没有使用双向tls认证,这符合预期,说明全局策略生效。" x! G" W% X; b9 J7 d2 A7 ^
[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"
; x- g# o. e0 Q  e# R5 U$ {sleep.foo to httpbin.foo: 200
+ [, N" J. {& m, @# t: g$ Q[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
& a5 B. ^1 _9 G[root@master1 istio-1.6.0]#
4 s* u) x$ W: u4 B% Y! }, U  ~# [( l6 ^9 c
接下来为服务器端配置PeerAuthentication策略,让其强制执行双向tls认证
( N$ w( @' b  ]& c2 A/ qcat <<EOF | kubectl apply -n foo -f -
3 ]- k3 z/ ]8 aapiVersion: "security.istio.io/v1beta1"
& r  e: o( v" |( f6 p5 D2 rkind: "PeerAuthentication"
+ z, j; `  O. Z4 _( o) ?  y( `metadata:
! c1 p! g/ u$ K: _* S  name: "httpbin"1 \0 |/ T4 D0 c7 j: z) H
  namespace: "foo"& V& P" O8 u' `5 S
spec:6 Z3 L6 k1 z% B5 O* f' b
  selector:: D9 N9 s- F" W1 S" D
    matchLabels:' k5 ?6 ]; g7 D4 }4 F- d
      app: httpbin
  y7 M7 z6 g" c3 K) X  mtls:
0 ^6 Y* Z8 Q, S' Q6 H    mode: STRICT
6 o+ ^. @) u) A8 i+ S( [" jEOF
; E' v3 g1 A# n) ~; m* w3 o! D/ j! A1 u( ~! |6 }
这时再次进行测试
, t2 ?3 u8 ]# N: n' I3 j9 J[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"& L* r4 S0 u. \+ e8 Q
sleep.foo to httpbin.foo: 503
- P. L( t! m% y[root@master1 istio-1.6.0]#1 q& a* B4 M* I
" \& {3 @! R0 A# J
出现了503错误,这其实是一个tls冲突,因为截至目前为止我们为服务器端设置了强制使用双向tls认证,但是客户端还未设置。# U8 p5 x( }+ J/ E( S' b, ~, P; c

* D% U/ i7 `% ~6 c; t接下来设置客户端。
$ L$ ]) u( x  k/ N  `! vcat <<EOF | kubectl apply -n foo -f -
# O2 J1 k' O" OapiVersion: "networking.istio.io/v1alpha3"
) s7 Q6 ^8 x5 X+ r- M. Akind: "DestinationRule"
! ^, n( A& K. W/ gmetadata:/ u2 A7 W/ V9 ^! r  s& g( h
  name: "httpbin"3 f( }1 |3 M; f
spec:( W/ o, ?. n# m0 B8 P. V
  host: "httpbin.foo.svc.cluster.local"
' h/ t# a# ]! V  trafficPolicy:" J1 r% G9 v0 i% m9 W2 e7 x
    tls:: e# y: A1 @% X4 l0 g8 b
      mode: ISTIO_MUTUAL, O) L& W& o3 _3 U/ z8 _
EOF
6 `2 _% f8 V- W) n
3 O0 @* q' e6 B3 L/ h, ?3 N然后进行测试,发现现在已经可以正常访问,且使用了双向tls认证,符合预期。
1 D/ \) {' e* `$ [4 s! l/ _0 i; m[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". |9 q! B, F. t% R
sleep.foo to httpbin.foo: 2009 K1 K' H; k. Q) 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/headers -s | grep X-Forwarded-Client-Cert
+ \4 K7 Z2 G/ l5 m# z' Q! C; _    "X-Forwarded-Client-Cert": "By=spiffe://cluster.local/ns/foo/sa/httpbin;Hash=b8a73b2655b270e23eda820e49c56cc9b16521d98cb6c1896eff41c58cc32d56;Subject=\"\";URI=spiffe://cluster.local/ns/foo/sa/sleep"0 j. r/ x' K% R; G( F
[root@master1 istio-1.6.0]#, e- s' n. S/ X) X6 H9 J! o2 Z, }

! N* d% c, Q! }: k2 M清理命令
0 n4 t" M& q$ X( _/ n* V6 {! @4 d" w7 F8 R2 i
kubectl delete PeerAuthentication httpbin -n foo
# L/ I" b9 P; Q3 J, K5 \% S/ ]( j4 Rkubectl delete DestinationRule httpbin -n foo, V) b2 h/ V! d, J5 n0 x* U) d
kubectl delete -f <(istioctl kube-inject -f samples/httpbin/httpbin.yaml) -n foo
9 h$ T/ a  Q- R5 }8 F5 gkubectl delete -f <(istioctl kube-inject -f samples/sleep/sleep.yaml) -n foo; q3 ~% V% Q% ^$ u8 e4 s
kubectl delete ns foo' [* R; y4 f( R9 c# o  j& D

4 J4 p6 a$ S2 F3 C
: i  P* h2 g* e3 `+ b5 |

回复

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

本版积分规则

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