找回密码
 注册
查看: 37|回复: 2

Kubernetes Token 过期解决方案 使用kubeadm

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2024-9-16 17:00:07 | 显示全部楼层 |阅读模式
一、背景
+ V9 H. T6 N% oToken 是 Node 节点用来连接 Master 节点的令牌字串,它和 CA 证书的 Hash 值是把一台 Node 节点加入到 kubernetes集群时使用的凭证。如下图所示:2 J1 X- u* L( [( v+ k3 L) F

/ m: u2 m5 j, s* D$ n8 U/ l' q
# F& W6 y$ F5 M6 h: Y4 z" I3 |1 G( u  M: R* x
在 K8s 1.8 之后,默认生成的 Token 有效期只有 24 小时,过期后 Token 将不可用,如果想新的 Node 节点加入 K8s 集群,则需重新生成新的 Token。生产环境中我们一般都会采用默认的有效期即可(目的是为了 kubenetes 集群的安全),当然你也可以生成永久有效的 Token(但不建议)。
  T5 y2 t& I: Z. Z/ {/ T4 r6 A/ x2 H$ F
二、创建 Token
4 t4 S3 _; U9 w: y1、生成默认 24 小时 Token0 |+ h1 O; I3 j6 \/ ~

, J- S6 V: a& b7 B5 x0 ukubeadm token create
( \5 H# _: P$ @) e6 j; Z6 M1 s. p; Q
1 `* b5 B; {$ [+ J$ B" F( c- h

3 m* t! ?2 X3 {2、生成永久有效 Token" I3 L( e# g% z. k3 U: q( R
# m- i+ M# @( x. s$ V' @. H9 t9 V  }
kubeadm token create --ttl 0+ s' V& ?8 Y! n. I

& b7 I% T2 k9 q1 v$ M# R三、管理 Token
2 G* [: \9 h9 J. ~1 k& ~1、查看 Token
; f0 X6 s. S: v5 w- ]- C) `, j8 l) l* ]. B2 N' M8 k* [
kubeadm token list
0 B1 ~, L8 h/ n6 ?: G& K
; f. [% J% R% t$ |0 W# 可看到有效期为23h
# b6 I" N' e( n9 B* d8 w, P2 l6 |' C5 ]% C
; b5 u! @$ A" T) o3 c5 I1 U
0 ^; g) U5 |6 k9 o, d, J' |
, A0 K4 R, d; M5 k! S
2 H5 A7 u) ~1 s: T
2、删除 Token$ P$ \. Y9 `+ L
( i1 x  w4 F8 e% |, z0 o
kubeadm token delete <Token值>
( l0 B  y. W8 [. ]/ f2 T2 M/ f: Lkubeadm token delete lu8i0r.pzvgyu40c8g73yc1
! e' l# L4 J% I6 q* I+ d( q
9 r5 {; I7 A. c7 T, V% a4 S* O1 c  ]1 a' m
四、获取 CA 证书 Hash 值
7 x3 z% l; ]0 Q; }5 Sopenssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
% @; _, e9 @- U8 X
: C+ |7 y1 y# u. Z5 K' d# W* O+ u" x5 O' x# r( J% b+ y$ c
& i, T$ O( l" N& I$ F0 X
五、Node 节点加入kubernetes 集群4 Y5 l: `/ g9 x$ z
kubeadm join 172.27.0.13:6443 --token lu8i0r.pzvgyu40c8g73yc1 --discovery-token-ca-cert-hash sha256:3ed701329742f7549f73cb065a8677abe8b5b8a3e25bbca7bb26f317ffcf89d4: k0 `* b, B5 {2 ^
. @1 t+ O7 w4 n! I% z3 a6 x
也可以直接生成 Node 加入 kubernetes 集群的完整命令:# R! A7 m2 V! r5 x2 d& Z

0 g1 j9 @4 d9 c  @3 ^3 ^% ikubeadm token create --print-join-command* E8 w- ^4 w* u1 F$ q
. `/ X" q6 m( t( C/ z
# 这样就很方便了,就不需要单独获取ca证书的hash值了: F  M# ?, R2 x4 M# [0 J
0 Z2 f! N' p9 A

) i9 ]/ W4 v- v0 U; a

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2024-9-16 17:00:08 | 显示全部楼层
我们在使用kubeadm部署kubernetes集群时,为了安全问题的考虑,默认生成的token的有效期是24小时,过期将失效,不过也可以在初始化master节点的时候通过指定--ttl的值为0来强制生成一个永不过期的token(不推荐)。0 Y+ f$ @' }& n+ |

$ d) m( d: V1 x$ Z5 R7 s: N为什么会分享这篇文章呢?是因为我在部署k8s集群的时候,步骤进行到刚把第一台master节点初始化完成,需要进行worker节点的加入时,由于要处理一个紧急的生产业务问题,然后就随手关闭了终端,导致初始化完成后回显的提示信息“丢失”。所以将处理此问题的过程形成了此文档加以记录。, w$ }" w. _3 _* A' [
" L" f# V( l4 d% P# |4 d9 A6 j
下面我就分为以下两种情况进行简单介绍:; v" n1 B9 d4 h- I. P. q- X: A$ \0 i
& \# K; ?. m7 f% t1 N' I$ P: X
1. 类似于我上面的操作:关闭了终端窗口,或者这条命令在后续给忘记了,worker节点还没有开始执行.  P9 J9 D& j- H4 I! E7 p: \; @/ V

6 F# a/ v1 D: N2. token过期.
7 ^4 i4 A( @0 w$ C' j' R7 M8 B2 t: v7 x- m# {
# 查看token4 X  _# y& B9 N1 [( w3 ?' B

4 h" j8 W& G0 g/ Broot@master:~# kubeadm token list
' p1 ~$ O) ~0 o. |9 S  l; k/ m. L7 z  t% {
# 生成一个永不过期的token" d' ?" N- V; n% n0 T$ s

' Q/ `5 |9 B( G" Mroot@master:~# kubeadm token create --ttl 0 6 N4 j+ N) v2 p5 i

3 |1 s. D( y2 L0 rr089pu.3pjmew8vrv9mimty
8 Z, W) j! U/ ]$ f3 F* j, P" `/ a5 @: Z
root@master:~# kubeadm token list3 B# n, t) \& R$ c! E9 `; r5 X8 B( B

( h$ ]8 y6 A$ u* k8 a4 B+ UTOKEN                     TTL         EXPIRES                USAGES                   DESCRIPTION                                                EXTRA GROUPS: H' _$ y# d5 {4 w* L

" w+ f9 R2 `9 habcdef.0123456789abcdef   23h         2023-09-07T15:59:13Z   authentication,signing   <none>                                                     system:bootstrappers:kubeadm:default-node-token
) y/ h6 [2 {. C. E1 o, t0 |
8 n4 Z4 L6 H0 u  j% B5 Y3 Dr089pu.3pjmew8vrv9mimty   <forever>   <never>   authentication,signing   <none>                                                     system:bootstrappers:kubeadm:default-node-toke4 Q$ h* @7 \! S. a4 }) k" b. u

2 q' P0 R6 z; q% L# w" O* g  x由于在创建token的时候指定了ttl的值为0,可以看到新生成的token的有效期就变成了永久。$ l# I0 b2 L1 Y2 t5 D* y# @; i

3 M+ |% a" h; r6 n" U1 b我们在对master节点进行初始化后,正常的情况下,都可以看到如下一些内容,即让worker nodes节点加入的方法:/ C5 z/ Y& t& ]' _6 y, Q6 H7 C

2 }" \( b4 U6 bkubeadm join 172.19.53.150:6443 --token abcdef.0123456789abcdef \
8 D$ @. y3 b3 Z  {  H/ w2 G% M. K. K/ u& }& K
  --discovery-token-ca-cert-hash sha256:2c062e93ff47d023801c8ab8a16d46c323e2977e54f7ed0de1a76b778dfe9589; K% }9 ^; O$ F. q

0 R* g! @% B# t: @0 v' P我们来分解上面这条命令的组成:
, Q! h0 }. K% r9 I! v+ M3 n1 e+ K, W* G" X# w
172.19.53.150:6443:指定apiserver的地址及端口,也就是master节点或者是control-plane-endpoint的域名或者地址及端口。5 I5 Y2 s, w) f& o9 ~: h- G2 [
3 J) M' m- D( b6 p. H9 R$ R+ ?
--token:指定token值
# ~* b7 x5 A8 t0 R" S1 Z6 R9 l4 p' R8 y# P" Y7 q5 {- C: }2 t
--discovery-token-ca-cert-hash:这个和kubernetes的CA证书有关系。后面会讲如何获取。
/ ]1 t4 U3 f9 l) ?* N$ |
+ B1 u5 t. W# E# A( X, I/ W## 忘记token的处理办法(token未过期)
- a( X$ ~5 u3 G& k! F0 l8 i% V  [
' r$ t3 n( J+ E* w9 b! k
7 G6 X- z9 Q; [: ?2 v" }6 A  Y8 e/ T' Y. V5 v! B1 X5 a
1. 查看token值:/ H9 A* j* T. e3 d' e, T
1 y% J5 Y( h% {! J* P: y% W! F
root@master:~# kubeadm token list  ~9 }. ]/ I1 L% l
$ j& J7 x) `* J. \" J$ a0 V3 V3 @
TOKEN                     TTL         EXPIRES                USAGES                   DESCRIPTION                                                EXTRA GROUPS
0 B$ p2 @8 g6 c* ?, e/ I4 {/ j; _1 g
abcdef.0123456789abcdef   23h         2023-09-07T15:59:13Z   authentication,signing   <none>                                                     system:bootstrappers:kubeadm:default-node-token2 P6 i+ l& O5 }' V

1 x; H# G' M  Y6 _$ K/ E7 a5 ^  ?这里获取到的token值为:abcdef.0123456789abcdef
+ P0 d7 y. _& _9 A5 E: X) h6 h: c' Y$ j6 d- a
2. 获取ca证书sha256编码hash值(只适用于适用kubeadm方式部署的集群): c) X( Y! x0 R% o

. s- m, g7 J! v/ W  Croot@master:~# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
5 r1 J5 @8 `, }6 Q8 h6 |1 C# J5 g5 z* T% C, w  m5 h3 B% M2 Z
2c062e93ff47d023801c8ab8a16d46c323e2977e54f7ed0de1a76b778dfe9589
; [: d* N# h5 x7 ^/ E$ e
; ?- ~+ S5 ^( j" m- ]/ b$ g这里查看到的ca证书的sha256编码的哈希值为:2c062e93ff47d023801c8ab8a16d46c323e2977e54f7ed0de1a76b778dfe9589,如何通过二进制部署,需要按实际情况修改ca证书的存放路径。* N& ^1 m9 z& l5 U- `
. a# @8 y) O$ V, R% S; q
3. 命令拼装加入节点
7 P" j+ N! g8 o2 A
  W! D2 p: f' r; c我们上面已经提到了将一个worker节点加入集群的命令组成,我们将以上两个步骤中获取到的token和ca证书的hash值按照格式拼接起来就可以正常执行加入worker节点的操作了。, D% o4 }/ {- v2 m# j" d

2 P2 b: H9 S+ m2 A2 Wkubeadm join 172.19.53.150:6443 --token abcdef.0123456789abcdef \
  z7 v5 A! g2 X/ k; G! {7 i
0 K: _+ _& V& O. y  --discovery-token-ca-cert-hash sha256:2c062e93ff47d023801c8ab8a16d46c323e2977e54f7ed0de1a76b778dfe9589
: c  C; |3 `9 W. M: M( \0 z
" o( F6 ?# n8 Z3 t& U7 [## token过期处理办法8 R& @: r* F+ g' C8 V+ C

  B! i3 |) H, s9 }9 Q; y) D
" ]; g- N& l! t8 r6 r* N1 K7 f% q4 G7 V3 x8 H0 z
1. 重新生成新的token
% i5 ~, m7 n) m9 ^7 ^" c6 W0 c' i5 B& a0 @9 d) N, v) a$ r) Q
# 生成一个有效期为24小时的token
6 `" j( d# C0 o; X1 Q# {! N1 K. f" g: g: T, _% c- t+ [
root@master:~# kubeadm token create
; l) j( O3 ]: ~: T9 R; h. |# |* i5 j+ Y# Z" U' _
# 生成一个永久的token) }$ F% f. e4 p! `+ F3 `
, i9 E( [: @) X5 g+ H& P
root@master:~# kubeadm token create --ttl 04 L, m* `: M/ n: t+ t) C' `% _5 \

4 t( ?# \% Z, X5 A# 查看新生成的token1 M! h; m+ b1 S# g0 F# V5 X
1 S& R" U/ X4 i
root@master:~# kubeadm token list% L7 C* i* T4 K, x3 b

( M- o2 q" J% I: dTOKEN                     TTL         EXPIRES                USAGES                   DESCRIPTION                                                EXTRA GROUPS
3 U  e+ N" e$ {: m3 J$ o3 |* A6 ?4 b# h0 O) A% `4 k  q) B
abcdef.0123456789abcdef   23h         2023-09-07T15:59:13Z   authentication,signing   <none>                                                     system:bootstrappers:kubeadm:default-node-token4 _# _8 I4 B2 O

5 Y# \; |1 k: K: d! |r089pu.3pjmew8vrv9mimty   <forever>   <never>   authentication,signing   <none>                                                     system:bootstrappers:kubeadm:default-node-token
  k; U9 M2 |: ^4 \7 G0 m: M; A9 C( R/ o3 V
以上集群是我在一小时前刚部署的,可以看到token的默认有效期为24小时,将在23小时后的2023-09-07T15:59:13Z过期。同时生成了一个永久的token。  W& A1 b/ D4 J% \  f8 |
  f8 E( I( L- w5 h. u6 \

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2024-9-16 17:00:09 | 显示全部楼层
1. token过期处理" L3 j; H- ~( X  q
k8s的令牌默认24小时过期,逾期需要重新加入
# H) C! V1 n) v% j
; g7 L8 v/ K: h1 F1.1 master节点创建新令牌9 K; P' @: Q$ B* x% p
## 在master节点4 ~- }8 P% `8 \
# kubeadm token create --print-join-command
) g; b' n- m7 c" r  p* T% `# `  `6 k) i& n
[root@master1 admin]# kubeadm token create --print-join-command4 G- E$ ]4 n2 y" k& {
W0705 23:14:39.436166    7030 configset.go:202] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
: i# s, X  S+ n! `6 Skubeadm join master.k8s.io:6443 --token ime4yx.8fb5jsv0smqkk0aq     --discovery-token-ca-cert-hash sha256:ffb3b09434cb153048558614e774221d0ef8107e4f824a415e2f41e84f6ac0b1 , c0 ~2 t! S6 B- Q! z0 w' ~
: j- ?0 A  m1 N0 B2 I* }

7 K- K2 B9 w: P* r3 X$ {9 {% B; L1.2 worker节点或者master集群节点执行命令1 @7 x' C8 H- u( c
## 集群的其他master节点, 有 --control-plane( U2 U$ j8 b( v+ r+ _& W
kubeadm join master.k8s.io:6443 --token ime4yx.8fb5jsv0smqkk0aq  \
+ n, d2 ?4 z" ~+ F   --discovery-token-ca-cert-hash sha256:ffb3b09434cb153048558614e774221d0ef8107e4f824a415e2f41e84f6ac0b1; b, u8 t' ]( i# a- g5 |: P
   --control-plane. `6 M7 b; F. M0 ^5 t) C8 r0 A
  
' }# D! Z: X% I; Z; z/ C6 K## 集群的worker节点 , 没有 --control-plane
# a8 l( k7 m/ h1 b# m8 Ekubeadm join master.k8s.io:6443 --token ime4yx.8fb5jsv0smqkk0aq  \% ^2 [) d) w% A& p2 {/ ~% d
   --discovery-token-ca-cert-hash sha256:ffb3b09434cb153048558614e774221d0ef8107e4f824a415e2f41e84f6ac0b1% B# i/ M3 O2 y8 t7 s
, _. [( h$ m5 r  P9 t
2. 部署dashboard1 z7 ~1 v2 i. `3 {! v) z6 U
2.1 Kubernetes 官方提供的可视化界面
2 H* h; Y9 }5 F* ^2 I3 nURL: https://github.com/kubernetes/dashboard
# h7 T8 W* \. a  n1: i5 |& B; R! J- `9 Q
2.2 下载k8s dashboard
" i% _. |0 V. t& v# 命令:kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml, B4 V/ y  |) h' j7 v0 J
1 Q) }. J  X* d: l  f3 e/ {
# 或者先下载:wget --no-check-certificate https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml  W9 S& e: m1 E3 t3 V
# 再应用 kubectl apply -f recommended.yaml' i, }- h2 Q4 v+ d% j+ u' B

! ?: e! w1 d) W9 [; ?  M" y+ s2 C0 s! o! R4 m
[root@master1 admin]# kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml
: s: ]; p, L( O2 I% a) K$ A3 Ynamespace/kubernetes-dashboard created
" L0 b+ B. o0 U1 c/ Q% Qserviceaccount/kubernetes-dashboard created
: ]3 F% |% S; k( o) Z9 F- M; Uservice/kubernetes-dashboard created, Y4 F4 B) D9 `- N7 r6 F; c. N: a! K& |
secret/kubernetes-dashboard-certs created
0 W' L: ^$ ?" |( e; lsecret/kubernetes-dashboard-csrf created0 H" }' R& f+ C6 D
secret/kubernetes-dashboard-key-holder created
9 d# U+ [+ x3 C  g7 p2 ]. Qconfigmap/kubernetes-dashboard-settings created9 K, D; ?$ i4 ^6 j
role.rbac.authorization.k8s.io/kubernetes-dashboard created
+ p0 b, e5 p! E; k+ Rclusterrole.rbac.authorization.k8s.io/kubernetes-dashboard created
  ^& ~3 T) e. d" u' t) xrolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
( j! F; y' G: g" M) c( vclusterrolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
0 w1 \, S0 q" ~* l) A( Ideployment.apps/kubernetes-dashboard created& N5 v  Z9 n( `  ]
service/dashboard-metrics-scraper created
& F$ C# R/ Z4 J- b; T, {. h# Fdeployment.apps/dashboard-metrics-scraper created
5 h, l+ ^0 G& n7 c8 ^! h3 a
& I2 c, R+ x$ g" J5 ?# c* I检查:
/ b! A' c4 M$ e  i  h( {: T3 h3 h, l5 q6 H
[root@master1 admin]# kubectl get pods -A0 q$ _) ^* J% d/ J! Q
NAMESPACE              NAME                                         READY   STATUS    RESTARTS   AGE2 r1 t6 |8 a, }. [$ g' X+ ^3 P& p
kubernetes-dashboard   dashboard-metrics-scraper-78f5d9f487-s854v   1/1     Running   0          4m8s7 x8 A# G  j4 W  ?% A) N7 q
kubernetes-dashboard   kubernetes-dashboard-6bc5cb8879-8zjj2        1/1     Running   0          4m8s
0 ^" _$ x( |( S& R/ Z, |# F9 c10 r: Q4 _; \1 {% N
2
- a5 R% [( Q$ B  U8 d9 N: O1 R3
" q( w% ^/ x' A% |4
) C: ?% [! L/ X2 v" c1 P$ e2 O* M' ]2.3 设置访问端口4 Y. d. O3 \) C/ m, L9 |1 X
[root@master1 admin]# kubectl get svc -o wide -A
! b/ i" N' i3 jNAMESPACE              NAME                        TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                  AGE     SELECTOR. R$ ]3 @+ }+ Y; w9 i3 ?, Y
default                javademo1                   NodePort    10.1.230.223   <none>        8111:31880/TCP           2d23h   app=javademo1; G' o. a. C* m% X/ r: b' ?
default                kubernetes                  ClusterIP   10.1.0.1       <none>        443/TCP                  3d      <none>9 k% T+ f; f$ C9 Y3 P
kube-system            kube-dns                    ClusterIP   10.1.0.10      <none>        53/UDP,53/TCP,9153/TCP   3d      k8s-app=kube-dns2 j9 ?: G. M/ q" F1 l- Q
kubernetes-dashboard   dashboard-metrics-scraper   ClusterIP   10.1.110.33    <none>        8000/TCP                 8m24s   k8s-app=dashboard-metrics-scraper, u9 m+ |2 A) {4 o' f4 {* a
kubernetes-dashboard   kubernetes-dashboard        ClusterIP   10.1.179.158   <none>        443/TCP                  8m24s   k8s-app=kubernetes-dashboard
% _5 y" K$ ^8 h0 w8 ^, Z. y; @. e[root@master1 admin]# kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard( ?/ b' a1 Z% b$ }2 L1 T$ |7 {5 M
service/kubernetes-dashboard edited1 o/ i+ s( r, Y7 J1 k" y* [, g

4 i9 `% y' p' [/ v2 g4 `9 s其中的 type: ClusterIP 改为 type: NodePort3 b+ C5 q9 B& r: l+ ]& y& r

. k& ]+ s) U# K6 A
9 u$ w) m# z' k( x0 H8 s& e可以看到,dashboard的端口变成了30798/ ~- {1 G4 g  X$ ~% n5 {

  ^6 v# H3 o5 U# 命令: kubectl get svc -A | grep kubernetes-dashboard
1 J) T" _3 U9 `1 ]% |# 或者: kubectl get svc -o wide -A2 j/ Q: N+ O+ E! q$ w: ~
[root@master1 admin]# kubectl get svc -o wide -A. f% v1 v9 s+ {$ O8 e
NAMESPACE              NAME                        TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                  AGE     SELECTOR; Y6 V5 J5 R. H2 B& T
default                javademo1                   NodePort    10.1.230.223   <none>        8111:31880/TCP           2d23h   app=javademo1
4 Y4 z* ^5 l: idefault                kubernetes                  ClusterIP   10.1.0.1       <none>        443/TCP                  3d      <none>8 D! c( \8 a5 b3 q* e5 B
kube-system            kube-dns                    ClusterIP   10.1.0.10      <none>        53/UDP,53/TCP,9153/TCP   3d      k8s-app=kube-dns1 o/ z1 q$ W- {* A+ q0 ?
kubernetes-dashboard   dashboard-metrics-scraper   ClusterIP   10.1.110.33    <none>        8000/TCP                 12m     k8s-app=dashboard-metrics-scraper
& f# u( F* ?) ^6 Zkubernetes-dashboard   kubernetes-dashboard        NodePort    10.1.179.158   <none>        443:30798/TCP            12m     k8s-app=kubernetes-dashboard
* t$ C; P8 K) }- x1 ?
( J/ x5 X2 F6 z0 T* v3 K% I+ a3 ~- I3 ^( h7 r% w& Z/ O) ~

( {/ W) S& l1 l2.4 登录  X" S9 I6 C& c3 J# Q, v$ S8 E, C
2.4.1 创建登录用户(masternode)* z% H, v9 ?# f$ Q+ j' V+ S
URL: https://192.168.8.190:30798/
* P5 O) D' r6 }& l4 l创建一个登录账号的文件:dash-user.yaml4 {5 f. z6 m; C7 E. a
内容: 把一个集群账号admin-user创建出来  X% }6 U0 w6 s+ o
/ m7 P- W" \- L5 ~, D/ J/ i
# dash-user.yaml
/ `" K9 j) A! d; m$ ^# KapiVersion: v1  o; O( d& @% V4 y% k, m# B
kind: ServiceAccount
% U( S/ D. v' Mmetadata:
  Y+ n6 x* O  P2 {  name: admin-user+ C; n- c* L5 q# Z' ]( t! {4 N
  namespace: kubernetes-dashboard
* J" r) K$ n- A) i: L8 Z---$ q: B& V# E1 n1 M, E
apiVersion: rbac.authorization.k8s.io/v1, c; z- j) X4 a7 e9 o, r  U
kind: ClusterRoleBinding
2 g" }$ Z( G; I0 }! `" J* {metadata:. ]7 U$ ?4 V# b; e1 p
  name: admin-user' R" W& N& X( I9 L" [9 z3 Q: I! v
roleRef:5 ~& b* y5 A, v' B+ W- q6 B$ o' x
  apiGroup: rbac.authorization.k8s.io/ k, W: P7 D2 g  F1 \
  kind: ClusterRole
" O; V* Y( M! s9 z7 Q4 n  name: cluster-admin% ^: ]7 z3 a7 L( t+ F
subjects:
7 L/ G2 \, ?; W- U$ v1 j5 \- kind: ServiceAccount( e2 l) Y( f( G& X. K9 O; x
  name: admin-user; K4 X# o) z/ w! D
  namespace: kubernetes-dashboard
8 ]( l- N! j3 P* `" O/ o
: z2 t. ^. n5 A8 b0 P; K; i9 O6 }## 应用- _0 q* {  i8 G& a; y: I- ~
[root@master1 ~]# kubectl apply -f dash-user.yaml 4 `* Z& E8 O5 B# J2 N  ~
serviceaccount/admin-user created6 b! q+ O. L# D6 R
clusterrolebinding.rbac.authorization.k8s.io/admin-user created
; B/ p# ^8 b6 K2 L% ?( X6 z7 U/ [; T; w
2.4.2 获取新建用户的访问令牌
* R" }. ^. k# i. z命令:5 Z. }0 H' H: K2 u. ^
3 t; `. U0 c! L1 F# u
kubectl -n kubernetes-dashboard \
: L( r; p: x! S6 n9 M4 Vget secret $(kubectl -n kubernetes-dashboard get sa/admin-user \
; c" }; X  t5 J& j1 k# T5 i-o jsonpath="{.secrets[0].name}") \) I' f( [0 N4 x: i) Q2 Y2 @2 j
-o go-template="{{.data.token | base64decode}}"
. B& Y5 x* P, n4 r) h
0 F2 ]( x' X9 t, P0 E执行后会出现一串令牌,复制后粘贴在dashboard的token输入框中即可8 N# r+ G# ?) @1 p

8 N8 @9 Z  V+ F0 Z% X& g/ o, {. B1 D8 G4 J/ G) e
3. 工作负载deployment9 @/ f$ N& D" M3 B/ c. @
控制Pod,使Pod拥有多副本,自愈,扩缩容等能力
0 n' U" Z" D; S( Q: z. P
# g% z* {, ~7 V+ ?; ]# 清除所有Pod,比较下面两个命令有何不同效果?7 m  @* o9 W) l( C# V6 {8 p, m, Q  b- }
kubectl run mynginx --image=nginx/ t7 c- _/ S4 W) p" F) C# a

2 E% {0 J3 q- [9 A7 Z" x' ~kubectl create deployment mytomcat --image=tomcat:8.5.68
  X. Q: w: {- n: _" u8 }# 自愈能力
1 c- }7 G* L: w9 h0 V# 删除之后,k8s会重新启动一个tomcat。除非删除deployment0 p1 F3 k! k' [' r/ A6 V
8 O) E+ ]- Y1 @$ O* W, |9 r
3.1 多副本6 z3 \2 E' L% @& e
3.1.1 命令行方式:; D: J2 R# I; F4 r/ j
kubectl create deployment my-dep --image=nginx --replicas=31 a( e( i7 t& M& \$ ^! B' U: d
. Z1 `# h" Y9 e8 v1 X9 E4 D! X
3.1.2) V& f0 n$ S/ ]) f4 x( O; j
yaml文件方式
  I- _" v* x+ @) e2 y5 |( V: `
, E* d( ^: e9 i* z. A8 JapiVersion: apps/v1
- i+ Q8 L4 `3 C' okind: Deployment. y! V, O8 J1 |
metadata:4 K4 @" [% d# ?7 ?3 u0 v' _
  labels:
& v8 `( s( @4 V- _    app: my-dep/ K! t) `; Q) T" }' N
  name: my-dep
+ x1 L& y6 O. e8 j% h# Xspec:
  e. S& M' \8 i8 ]  replicas: 3
- ^% z% n6 s1 d! L8 q  selector:
9 X( k9 J5 Q" X& ^5 H# h    matchLabels:- q2 Q( h5 [1 f7 x+ D% Y1 S/ G
      app: my-dep
$ V: A( L( s4 U, u( J  template:
, t. Q# Y8 c' O; ^. E' z    metadata:
: A8 R6 T) A- `/ l( ^  |1 Q# p2 M      labels:
# [8 B  w# S, f        app: my-dep
# N1 M4 D% h8 U. Q    spec:
+ d( k3 y' v6 n9 X1 M      containers:
4 k$ ~5 ]+ a& P! P5 v0 s      - image: nginx
) x- Q+ g  c3 A1 {% ^* Z        name: nginx; A, k. ?. I0 y" J$ D/ W/ d4 |

2 `3 B+ M1 W0 n$ D) l3.2 扩缩容
+ X% h% U1 t3 J  [1 I$ E/ n3.2.1 使用scale方式
* S8 P* ~* Y+ }% dkubectl scale --replicas=5 deployment/my-dep4 P4 f# Z! d$ p( j
# ?" N/ H6 v+ D" [+ T8 h: y9 R
3.2.2 修改deployment方式
' ^7 I( P; Q. d; zkubectl edit deployment my-dep0 O6 h5 |: K. u# |

3 B; H) Y9 R1 w* V& k  R# P#修改 replicas 的值5 [7 L$ o- C8 f5 t% `
& b% J, p6 S$ h- z& v* b+ u2 p
3.3 自愈&故障转移' B& Z  ]2 T# `6 V8 \4 G$ J4 n
● 停机, l5 o2 K3 J% Q0 z2 G6 |
● 删除Pod& [, w/ Q" f6 w0 R* m+ Q' f4 L
● 容器崩溃
% w) u& C2 M( X5 F% H. h/ v● ....
. Y2 G, X5 a6 k: C+ ~0 C& A/ I$ p
& {- i2 J: P  i9 Y3.4 滚动更新
3 P# g" j% |0 @3.4.1 直接使用命令+ O+ U5 R4 X9 h. [- @7 N
在以deployment创建一个nginx的情况下
# M+ m8 \+ k* B# |% D1 }
0 V1 Y# O' b' o) [## 设置新版本, 该命令会是k8s去下载版本为1.16.1的nginx镜像。
. V! o" e) a; J% x+ l+ P## 同理,也可以使k8s去指定仓库拉取指定版本的某镜像(比如某服务的新版本)
8 f3 E- B8 J) i" x7 S* i$ V9 Vkubectl set image deployment/my-dep nginx=nginx:1.16.1 --record
, r! a% W4 Q5 mkubectl rollout status deployment/my-dep
6 b# |7 r" t" ^4 [2 G9 Z
/ z3 G' V! M+ o' _9 w( S- R3.4.2 修改deployment的内容
& F8 x* E7 t' ^## 修改image的版本
0 T1 g, B0 O6 n# Y- Q" y# skubectl edit deployment/my-dep
! x' |) h( m: ?/ u/ E2 A  y/ I- B% l/ I# |9 M8 O, f' e
3.5 版本回退8 Q) {4 F& v" c# O2 M3 x# \
#历史记录: N) J6 M+ [: F
kubectl rollout history deployment/my-dep
  s. U7 T; S+ I' Q4 _
* U2 L/ e$ i4 |& w#查看某个历史详情
% q$ b/ E$ B6 K, t+ x( y0 w1 x! W$ wkubectl rollout history deployment/my-dep --revision=2
9 L3 |4 \) O+ f  g( M& M$ g7 Z0 M! S5 [4 ~
#回滚(回到上次)
8 H/ I; p. M% F/ ?! P0 Nkubectl rollout undo deployment/my-dep
6 T- u6 H( B; t: B" b: q0 F1 R  c1 q
#回滚(回到指定版本), a, b% v  W" W& @. u' G9 s
kubectl rollout undo deployment/my-dep --to-revision=29 ?& ?/ L3 U1 P. _' w/ d* V+ m5 [

# }4 n5 C2 ^: t6 \更多:
2 S$ d( S6 f( C) @* v- X5 }, E6 n$ R! G  B! i
除了Deployment,k8s还有 StatefulSet 、DaemonSet 、Job  等 类型资源。: }9 S- V* s, _" c/ a) B, r
我们都称为 工作负载。+ p* ]. h3 y& r8 ?( E
有状态应用使用  StatefulSet  部署,无状态应用使用 Deployment 部署
& K' G4 _# C+ C0 Z) A' p' rurl: https://kubernetes.io/zh/docs/concepts/workloads/controllers/% ]1 I- e* L, c! `  |- o

, Q0 F: g9 r5 v4 J3.6 工作负载小总结# `  S4 ~7 \' x* n7 {

& W- O+ o& u9 x6 @3 g8 i6 R7 U0 R" Z9 Ydashboard中的工作负载
您需要登录后才可以回帖 登录 | 注册

本版积分规则

返回首页|Archiver|手机版|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )

GMT+8, 2026-6-12 01:39 , Processed in 0.017852 second(s), 22 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表