返回列表 发新帖

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

2.3k 0
忐忑的自行车 发表于 2020-11-3 10:37:53|山西 | 查看全部 阅读模式
2 e# D& y- F0 U  U( Q! x
                               
登录/注册后可看大图
+ b$ e; o  a4 Q! p- g$ s. N6 y  k

. F. F0 S1 [4 L& w9 j( v  f一、概述
0 u! w6 I" n( A- D7 I! G+ y2 {" C6 ?
+ U- T! L; B) f/ H0 P& G* CIstio中实现了从客户端到服务器端的全链路加密功能,首先从外部的客户端发起请求,到达Istio的Ingress Proxy,后者作为整个集群的边界网关,会再将请求转发到集群内部的微服务,在集群内部,一般会涉及到多个微服务之间的交互,形成一个调用链。  z. K9 l  o, l: X

8 h# ?& {" p! n" D在很多架构模型中,集群内部会被认为是天然安全的,微服务之间的流量也是明文传输的。这种模型现在受到越来越多的质疑,因此诸如很多公有云都实现了"零信任"网络,全链路加密的功能。
& e# `# f! z) I
; u' M$ u$ h; Z本文会详细分析在一个集群内部,如何通过Istio实现服务之间通信数据的加密。Istio中的加密方式是双向tls的认证,具体是指两个Envoy Proxy之间的首先进行双向tls认证,认证通过后将后续的数据流进行加密传输。9 a8 l/ U! F) ]1 @8 v
( L" y. J; S0 d" f! q6 S
例如: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。
7 v" p6 \2 z* O5 _  G) O1 y5 R& X$ a* s* ]9 W! C

# Q4 O' ?5 Z1 X7 Z1 C5 X                               
登录/注册后可看大图
  S( e( h& u2 L% C0 s5 U& J

8 G( F' E7 R- K# Q在Envoy Proxy A与Envoy Proxy B之间认证的过程对于Pod A或者Pod B而言都是无感知的。
* O- s6 W$ \- R& R* |) d- H) J% M8 O2 B7 C' a2 r6 d# Z1 Q' Q) T4 _8 F
Istio中双向tls认证的基本对象是1 g5 Z; |. a; h9 ~1 d! S
. K/ E5 L; J( P4 l9 U: x5 r
apiVersion: security.istio.io/v1beta1
" N8 f" |8 |: t- }5 Wkind: PeerAuthentication7 R1 [% H2 v& x  g5 M/ E- f1 m
: z; V! c! T" o: n
二、认证配置的策略类型  r6 T/ R8 H( P) T
在具体进行配置的时候,有四种基本的策略& a; V5 @7 `  e2 d9 L

$ c2 Q7 y- F! h, m●DISABLE
* Y; I3 f6 h  E0 H3 l# ^8 q% m4 d% x+ y+ P' M
即禁用双向tls认证,这种情况下源Envoy与目的Envoy之间没有对对方进行身份的安全确认,它们之间发送的都是明文数据* e. s6 N4 i8 w  q9 L

6 L, }0 K4 m. X2 J●STRICT* T' [0 @2 S. i. f- Y2 ^
% [6 Q! T- z  k! Y$ g" z9 ^! v( J
即严格的双向tls认证模式。源Envoy与目的Envoy之间必须对对方进行身份的安全确认,它们之间发送的都是加密后的数据。
6 S% V) t5 U2 l1 A# P; Q  `( L) ~) A- ]& P
●PERMISSIVE" ?, {6 z5 a. Q, m4 T% P, ~
7 ~$ G4 b. S' ?2 T
可以进行双向tls认证、也可以不进行认证从而发送明文数据。
2 I+ [. P3 N0 G# j, Z$ W8 @7 j% {; C% s9 O  ]; ]) L
●UNSET, X1 T8 w- K& V! x5 Q! e

4 ~$ \1 t4 t5 p) @% N' @即没有进行设置,这种情况下会继承上级策略,比如当前namespace的或者整个系统的。如果上级策略都为空,则会默认设置为PERMISSIVE
0 u# D9 @: _% ~0 p# W* [
( j* G2 x# n: O- c( [三、认证配置的范围6 K8 `. F7 Q0 G' o2 p
Istio中对双向tls认证进行配置的时候,可以有几种不同的范围,范围越小优先级越高:
5 x1 m  c  D2 C. L  b* l1 S
: w0 z8 W- N& n" G6 z2 X% G7 h8 n●全局3 [/ e8 ^) `) x; Y( V8 e0 {, d
  apiVersion: security.istio.io/v1beta1
$ j" j4 x- u4 `- I- [. {$ {1 b  kind: PeerAuthentication
! g5 e" C+ S- ~  metadata:
' I) A) Z- V4 d) G4 k    name: default
- R& B, |# Y) E+ r/ {  K    namespace: istio-system3 r; a8 U; g2 I4 U! i: a2 c
  spec:
( w2 \8 u3 {5 ~6 w- ^    mtls:6 o. }0 L! A/ [; p
      mode: STRICT* u6 E8 u; O- s  Z

# ?) W: }# R; G5 @6 p% Z6 K. o9 T注意,全局的安全策略名称只能是default,namespace则是istio所在的系统namespace,这里是istio-system
0 }6 f( g( F2 O0 |. g+ j( u5 F$ h4 c4 }$ @; D/ a
●namespace级别,即某个namespace中所有服务  z  Q, G/ a9 g( N0 B: J1 v  N

$ U$ p- {5 g9 V6 @9 K+ t5 c  apiVersion: security.istio.io/v1beta1& j. [6 q) s0 w" J
  kind: PeerAuthentication
* |. E* Q5 C4 j% e; B  metadata:2 q! T! f3 A, ~7 j
    name: default3 S- _$ N5 ?: ]0 k' q& j
    namespace: foo' x; E: o% v9 @' S1 o0 ]
  spec:' |* `* Y3 D. z8 x, i- ?
    mtls:
% a' U  K# V1 p8 x) B$ H      mode: PERMISSIVE3 w0 E1 q6 P. R* z* o( s2 U

: B0 X. L9 o( r- G% N8 X  n●负载级别,即某个namespace中某些具体的Pod* G8 s0 O8 z* N& }, y
; w+ Q! w; X: L( q" @
  apiVersion: security.istio.io/v1beta1
& K6 ]+ F8 W$ R5 n  kind: PeerAuthentication2 d1 N: Q- u: \# |8 U
  metadata:
; E1 k' l4 x) r8 q7 j3 ?0 W6 f    name: default8 f& `" R6 c2 S# k6 I
    namespace: foo
3 B' W- q, j( x' J0 X0 b  spec:$ C- Z6 H% C9 y1 K) k4 |% s
    selector:- E4 E4 H7 p6 T* u/ S, |$ q* o
      matchLabels:
5 `# @2 A. q8 e% n( R  _        app: finance2 b3 o) d; L1 ]7 V  \; b9 F
    mtls:1 D4 V! X9 x# ?- y& f( [
      mode: STRICT
9 l2 J  ~- m$ S& w9 h9 f$ W+ L: t8 J, F7 ^
会将带有"app: finance"label的Pod所在的Envoy实行STRICT模式。) H9 n8 _: J! d  ?9 \! B
0 ^7 p) ^, r1 L+ M1 b9 F# v
●端口级别
; P5 }( o* {* d1 f! ]6 z  apiVersion: security.istio.io/v1beta1
: L, y4 J. R2 ~9 k/ F5 O& C( ^1 O  kind: PeerAuthentication
) K0 R) w$ |/ s, x" }, ?  metadata:, u! B7 b% r% B3 w$ {
    name: default0 z$ S! i5 W8 v# n8 \; H
    namespace: foo
1 ^) r$ D6 `  A6 H. ^  spec:  u4 o1 E. }8 t4 j. p8 ^
    selector:
2 {6 A; c0 X" W* E# f* w0 W      matchLabels:) F" i; s' |  \6 z1 N; ]
        app: finance' b* L) j( i# l6 U6 L- p5 H
    mtls:
% S8 U8 v/ G8 A, A2 c" D5 T( Z      mode: STRICT$ b0 ]& X, S1 G. X# ?1 F% O
    portLevelMtls:
3 r1 R( P9 T$ v0 U( g  @. k      8080:4 F. k5 W$ `5 c0 Y) D! F) X
        mode: DISABLE
6 D, n9 B2 B8 v2 Q4 U8 B+ E) w; k6 w5 S5 S! [) J0 D4 W
会将带有"app: finance"label的Pod所在的Envoy实行STRICT模式,但是会将其中的8080端口使用DISABLE模式。
: {; [: Y2 q2 U6 s' _四、认证配置的具体方法
0 ]5 F  A1 `$ E. h/ E2 G在Istio中进行双向tls认证配置,需要注意的是客户端和服务器端配置方法是不一样的。例如在namespace foo中有两组服务A和B,每组都有一些Pod,假设服务A的Pod对应的label为"app: A",而服务B的Pod对应的label为"app: B"。这时在服务A所在的Pod中访问服务B,要将这一请求设置为STRICT模式,需要配置两处: w8 _) {/ P' ]. e5 Z
7 Z5 U7 R: S2 B% T( p
1.服务器端配置,给服务B对应的负载配置PeerAuthentication策略,这里配置的是服务B所有关联Pod对应的Envoy Proxy。
9 }8 I  B3 `  l2 L9 A) n# o$ U4 V/ A0 N- @  y
   apiVersion: security.istio.io/v1beta15 y  A/ W; n/ k7 m4 {3 p
   kind: PeerAuthentication
- o; W6 O  v) d8 f6 r& a   metadata:
. P7 b9 R2 T! X6 F$ P: t- D3 _" X     name: default' _. D4 Y  H( v! A8 v( d: |
     namespace: foo
8 k, B1 P+ D! n- _; r& X, d5 e# R) F   spec:
" t' L0 T2 Z4 x% C9 T     selector:
( Z0 ?4 t- A# T& S" K% F       matchLabels:
  w" Y& _% x% c4 E, B         app: B
1 ?7 f! R$ D7 l5 K: j     mtls:" l, w) d0 u! T  s4 B2 `' V
       mode: STRICT1 `* @  `# C! n+ n( E% D

& s4 C3 i, u3 P% ~: f2. 客户端配置,给服务B配置DestinationRule策略。这里配置的是所有访问服务B的Pod对应的Envoy Proxy。
3 Z. T6 {* g& P- G" ~' k" T' \7 t" r1 B
   cat <<EOF | kubectl apply -n foo -f -: B1 e1 s  ?, F% @; x/ {8 g( T
   apiVersion: "networking.istio.io/v1alpha3"6 v( ~( z0 M+ d; T% y# g* Y! c% L
   kind: "DestinationRule"0 i8 i* ~, t* k& [( s  ~9 [
   metadata:
+ h9 E8 Y# d* a# {5 {     name: "B"
/ x0 W: v  n$ L$ m/ o. n8 @( C   spec:
* w# ^# x2 M6 O     host: "B.foo.svc.cluster.local"9 H8 h7 Y; ]3 u7 }
     trafficPolicy:
* J  _; o: D: a' @, w6 d) o8 K       tls:
) b0 Q: p5 j" i9 H         mode: ISTIO_MUTUAL
2 Z* B6 H6 L7 s9 v! \   EOF- ]2 s6 `6 _/ D7 _# G5 X7 }
5 z( W+ i& O" N1 v7 v
也就是说客户端配置的时候需要配置目的服务的DestinationRule对象,而服务器端配置的时候需要配置服务器端对应负载的PeerAuthentication对象。
6 S, _5 B9 X0 ^) \' ~! f/ N! q五、测试case1:默认配置
2 J& I$ l5 k: kkubectl create ns foo
# p& g6 T* A  _" e; z+ Wkubectl apply -f <(istioctl kube-inject -f samples/httpbin/httpbin.yaml) -n foo8 r- R/ f7 v" k
kubectl apply -f <(istioctl kube-inject -f samples/sleep/sleep.yaml) -n foo" P: |) {7 o9 S& O* [% ]/ [
kubectl create ns bar
' R* m/ W' W( I" jkubectl apply -f <(istioctl kube-inject -f samples/httpbin/httpbin.yaml) -n bar
7 R0 @  {3 r2 O! J1 D# K" Akubectl apply -f <(istioctl kube-inject -f samples/sleep/sleep.yaml) -n bar
2 Q) O8 Y# z4 i+ R: ]8 b' Ckubectl create ns legacy
) d7 @7 [+ O- U  |  Nkubectl apply -f samples/httpbin/httpbin.yaml -n legacy! y! Q* V! ^/ q6 ?+ s
kubectl apply -f samples/sleep/sleep.yaml -n legacy
: G$ d- S. _0 ^
" x5 r" k- }" v  P* n) z/ o创建了3个namespace:foo, bar和legacy,每个namespace分别创建了sleep和httpbin两种应用,作为客户端和服务器端。在foo和bar中的Pod有对应的Envoy Proxy,而在legacy中则没有。下面是创建成功后的Pod情况* P/ z) p5 H* S3 \
[root@master1 istio-1.6.0]# kubectl get pod --all-namespaces6 [% i5 C& ?, \1 W
NAMESPACE      NAME                                    READY   STATUS    RESTARTS   AGE0 m. W& A. n5 b
bar            httpbin-67576779c-tjl4m                 2/2     Running   0          31m- q/ ^; r1 F; {3 j% f1 W
bar            sleep-7dc44b8d45-rfhpl                  2/2     Running   0          31m
% G! Y/ W. S- a8 j9 rfoo            httpbin-67576779c-tw6kl                 2/2     Running   0          31m
) B- [  j% }$ M. c1 @foo            sleep-7dc44b8d45-87x2p                  2/2     Running   0          31m
% l1 `" [# ?  v% E/ f  _legacy         httpbin-779c54bf49-h5wrw                1/1     Running   0          31m
, I3 L  G$ v! e' Glegacy         sleep-f8cbf5b76-b8xgd                   1/1     Running   0          31m
- N9 y0 J7 m, ~5 o' w0 r. A
3 `) k9 a5 \$ g' L/ ]( [
% Y2 e" f, x- O0 j0 o9 Q' A在使用默认的default配置部署Istio的情况下,如果没有设置任何安全策略,默认是PERMISSIVE,即同时允许双向tls认证和不进行任何认证的明文传输两种方式。注意这只针对有Envoy Proxy的情况,因为这些策略最终的执行者是Envoy,而对于那些没有Envoy Proxy的Pod,例如legacy中的Pod,则只能使用明文方式进行收发数据。下面来验证这一点
* n; K4 y4 f9 ]$ n8 u& L2 c2 Z8 I1 j- `( g" t  ^
[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
1 i0 m6 C3 c  Z9 ^' z" X3 Osleep.foo to httpbin.foo: 2002 v5 Z6 K8 H) w4 G* Q0 O
sleep.foo to httpbin.bar: 200, A8 E5 ?% L4 p  V
sleep.foo to httpbin.legacy: 200
2 M; J9 G- R8 d* x1 Isleep.bar to httpbin.foo: 200
  [/ F! e( Z7 m4 c- q% Qsleep.bar to httpbin.bar: 200
1 w1 J* ]4 q: csleep.bar to httpbin.legacy: 200
$ G! m, `* z- Xsleep.legacy to httpbin.foo: 200
5 T+ k- E4 [' L3 }0 w9 ]/ _# Ksleep.legacy to httpbin.bar: 200
- O% Y* W- L; {! ~sleep.legacy to httpbin.legacy: 200; H( b9 f8 E- v
& E/ V# {  W# K/ E- e5 e' t  E" Q
可以看到任何两个sleep与httpbin之间都是可以连通的。但是如果进一步观察,发现这些认证方式其实是不同的
% _' {, a) k) X& V8 E& 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/headers -s | grep X-Forwarded-Client-Cert
1 [% b, }5 W- L. x/ _  p    "X-Forwarded-Client-Cert": "By=spiffe://cluster.local/ns/foo/sa/httpbin;Hash=41eb8aa0a91782fc1a09df8da85b586c5eaabbca3117f645cdb9df8d998b55f2;Subject=\"\";URI=spiffe://cluster.local/ns/foo/sa/sleep"
  Z6 ]+ Z4 W5 r+ j$ R2 V2 Y% ~7 d3 b0 U  b
从foo中的sleep访问foo中的httpbin,header中带有"X-Forwarded-Client-Cert"表明使用了双向tls认证。% K' e6 c2 h. Q* R# Q7 ^, Y  O6 D
[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, `+ j- U7 H7 f
[root@master1 istio-1.6.0]#0 j$ k9 N6 p2 p9 y* J0 Y- v( `+ Z
$ s; T3 g5 U1 t) D
而从legacy中的sleep访问legacy中的httpbin,header中则不会带有"X-Forwarded-Client-Cert",因为客户端和服务器端都没有Envoy Proxy,只能进行没有任何加密的明文传输。/ p7 ?' U) K7 _) T' ^6 r
' G# S1 V8 W* }$ \5 j
另外,还可以看出sleep.legacy发出去的请求都是明文数据,而sleep.httpbin收到的请求也都是明文数据。而foo和bar里面的Pod发送请求时则会优先使用双向tls认证方式(即下面四种),这些可以自行测试验证。1 ^2 _# ]; F$ o$ D
sleep.foo to httpbin.foo: 200
9 u" g' c) r9 U! Psleep.foo to httpbin.bar: 200
5 C2 Z/ u5 P: M8 |" k: ]$ j: @sleep.bar to httpbin.foo: 200/ o( _$ B3 X, z0 c" D1 |
sleep.bar to httpbin.bar: 200
+ }& Z. o, J+ G' f
  _. l# ~; W# q清理命令4 u5 [+ \( @5 z& z3 [. d! s
kubectl delete -f <(istioctl kube-inject -f samples/httpbin/httpbin.yaml) -n foo! Y; h' j* {$ j9 x. G) J
kubectl delete -f <(istioctl kube-inject -f samples/sleep/sleep.yaml) -n foo
2 y1 [- g% n+ }kubectl delete -f samples/httpbin/httpbin.yaml -n legacy( `8 y/ `- T+ b7 r. n, Z/ C4 s
kubectl delete -f samples/sleep/sleep.yaml -n legacy4 M) b1 G. U+ f& k
kubectl delete -f <(istioctl kube-inject -f samples/httpbin/httpbin.yaml) -n bar
& U: I2 x, b* L# l7 Zkubectl delete -f <(istioctl kube-inject -f samples/sleep/sleep.yaml) -n bar  F4 J4 n2 l5 _7 o7 c0 N
kubectl delete ns foo; p# \) L; u: m1 R$ i
kubectl delete ns legacy# o, `, S" @% Q
kubectl delete ns bar/ ^1 f4 t' `# A( |

: X8 u) f8 p( i( L六、测试case2:针对特定服务的配置  m% R! ~; F3 F- ~( u) X% A# Q; D
首先,创建一个全局的安全策略,禁用所有的双向tls认证。
( Q0 b6 F9 n& T0 B* U; ^' r0 Fkubectl apply -f - <<EOF
+ G, x+ R6 \- k# J2 h- J0 zapiVersion: "security.istio.io/v1beta1"
0 i, B3 `# j$ Vkind: "PeerAuthentication"$ x0 o- \3 w+ b# k% b
metadata:0 [7 a$ v* X3 _; D  z0 X
  name: "default": H, f% d5 \9 d4 z6 E0 P- N( _( |" b
  namespace: "istio-system"( M% ?5 v+ ]3 p
spec:
9 v- f$ z( P0 M: C) A( f8 M( b+ P  mtls:/ J  T$ B9 p/ `1 N, e7 n
    mode: DISABLE/ Y- Z. L$ t! b0 N# g
EOF
" M; E" E, m2 f: \. u0 o
1 M( {$ ]6 k& h7 L+ I* v然后创建一个foo namespace,并在其中创建带有Envoy Proxy的sleep和httpbin; [8 T- w9 A8 e7 [: B0 U# L/ o
kubectl create ns foo
8 v' |- Y( V7 d1 `( R) nkubectl apply -f <(istioctl kube-inject -f samples/httpbin/httpbin.yaml) -n foo
( M3 e$ ^# H9 l% zkubectl apply -f <(istioctl kube-inject -f samples/sleep/sleep.yaml) -n foo
0 M! p5 o# O) ~) G
1 J2 H% y. u, x# V这时进行测试,会发现他们之间可以正常访问,但没有使用双向tls认证,这符合预期,说明全局策略生效。
+ I# K1 m7 U( {! 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"" g. f9 g0 l0 N) G9 ~
sleep.foo to httpbin.foo: 2006 N1 g8 r- l. \9 ^: s& 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/headers -s | grep X-Forwarded-Client-Cert4 x$ x# c" Y" ]/ w. C
[root@master1 istio-1.6.0]#5 J4 q: T* P. B' u# l* X! M

  j& N, G6 h$ A' N( t% x. B接下来为服务器端配置PeerAuthentication策略,让其强制执行双向tls认证# s0 T) b$ q+ q2 z% F/ L$ L
cat <<EOF | kubectl apply -n foo -f -
' N1 O( t% g5 {7 o# PapiVersion: "security.istio.io/v1beta1"
/ l# `2 P' z* j! Nkind: "PeerAuthentication"# F5 [( |8 B8 |6 b
metadata:
' j0 @7 e' T# G: u% l- [  name: "httpbin"/ H/ _" \5 E' R! O7 _8 O6 ^
  namespace: "foo"
2 |5 g. L! G) C/ e0 B0 J, Ispec:9 G3 f6 ~5 h) K* u6 l9 h( {: H* F7 W
  selector:) K3 A5 ^- u4 \4 _  g' }
    matchLabels:
: _0 [8 h' Y/ l3 X8 L" w$ Q      app: httpbin$ v$ n: P" }$ o8 t# a; x& w
  mtls:
* t" m0 Q6 s9 \. b    mode: STRICT' u$ d2 q2 R4 W4 P/ A' }7 C0 \, Z
EOF& W  v6 H1 h1 e; V8 r5 P" i
6 E9 |6 y  D7 a1 O
这时再次进行测试6 b' l( p8 G2 [5 Q+ I
[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"
! F# Y5 I/ \- I$ ^" Gsleep.foo to httpbin.foo: 503
7 {& R1 @. G; ]0 a; A[root@master1 istio-1.6.0]#3 j; ], Z% D  K- f# S- V! s/ c) y

" p0 |$ U9 d$ [8 {, E出现了503错误,这其实是一个tls冲突,因为截至目前为止我们为服务器端设置了强制使用双向tls认证,但是客户端还未设置。
2 b" P4 m' m0 N: E+ A4 ^4 B% u  J8 L9 v/ _- I. q1 e3 I) L
接下来设置客户端。
: d$ l- t' W6 U7 xcat <<EOF | kubectl apply -n foo -f -" k* z. X0 H+ k4 V
apiVersion: "networking.istio.io/v1alpha3"
1 ]' Y# m( |4 R4 k! A5 Ukind: "DestinationRule"
, s  Q7 C5 N! |metadata:
6 x( Q1 P* c# H  name: "httpbin"
1 N1 D5 v. M( D+ ~7 Tspec:% ^/ A! o7 j- p
  host: "httpbin.foo.svc.cluster.local"
$ P2 Q* Y* U, {/ C- L  trafficPolicy:! c7 D8 w7 C: [0 t
    tls:
+ P+ X; u* b/ [, F: K1 Y* n      mode: ISTIO_MUTUAL
: B; C1 K' Y# h- e. Z  ]EOF& \. |/ h. X( h2 ]0 Q3 Q

  R8 z* n% u4 N( }然后进行测试,发现现在已经可以正常访问,且使用了双向tls认证,符合预期。7 f) Y# K) y  [2 a) 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"
! N' @0 M! N6 N2 A: Y/ k% T+ Wsleep.foo to httpbin.foo: 200# A" d- f. u5 `! J% P6 f  D+ V* 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/headers -s | grep X-Forwarded-Client-Cert5 s& P6 g6 m" {9 M* m
    "X-Forwarded-Client-Cert": "By=spiffe://cluster.local/ns/foo/sa/httpbin;Hash=b8a73b2655b270e23eda820e49c56cc9b16521d98cb6c1896eff41c58cc32d56;Subject=\"\";URI=spiffe://cluster.local/ns/foo/sa/sleep"$ {2 x- ?3 x3 i
[root@master1 istio-1.6.0]#
) L6 ]1 n' ?$ ]' p  k8 U, c
. z; R* F7 C2 `7 p& R& Y清理命令7 c* R# I+ d7 Z* R
  a+ S# d# H9 B$ O2 @7 @: J
kubectl delete PeerAuthentication httpbin -n foo
% x. L! L5 ?, w! ~$ U1 Ikubectl delete DestinationRule httpbin -n foo& j6 \; s8 {: k7 D
kubectl delete -f <(istioctl kube-inject -f samples/httpbin/httpbin.yaml) -n foo
/ X7 a- @4 i4 C  ?% q  B, Rkubectl delete -f <(istioctl kube-inject -f samples/sleep/sleep.yaml) -n foo
% z9 P, @' n' k# j8 Q2 T' w* Skubectl delete ns foo2 o1 J4 Z' m1 l0 W/ {* k2 I1 h6 U

8 b( p8 R9 Y+ R) i5 O" A, n- X. C- r( o

回复

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

本版积分规则

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