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

Kubernetes Token 过期解决方案 使用kubeadm

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2024-9-16 17:00:07 | 显示全部楼层 |阅读模式
一、背景1 q7 @) N# j- P. c% x
Token 是 Node 节点用来连接 Master 节点的令牌字串,它和 CA 证书的 Hash 值是把一台 Node 节点加入到 kubernetes集群时使用的凭证。如下图所示:9 T8 {. p6 v7 z: L
: x+ l+ F' _$ y1 t
" ~; X9 t9 \' z- G

+ A8 g+ e8 D: v( j在 K8s 1.8 之后,默认生成的 Token 有效期只有 24 小时,过期后 Token 将不可用,如果想新的 Node 节点加入 K8s 集群,则需重新生成新的 Token。生产环境中我们一般都会采用默认的有效期即可(目的是为了 kubenetes 集群的安全),当然你也可以生成永久有效的 Token(但不建议)。
$ Z- }$ X* M: O7 r0 R' X5 d* t
2 h% V% ]! n8 c' c% M9 i二、创建 Token% D# d# L, W7 t: v4 ]# ^
1、生成默认 24 小时 Token# J7 O. l- ~$ s" [& B

  x* ^! K  W/ {) X5 Lkubeadm token create# j3 Z+ e/ Q" S+ y0 s  t$ w, K
3 h( e+ n& k- M. q& s

* R' @) t+ U( {  I, M
& v  S# Y, X! ?$ V; Z  D7 p2、生成永久有效 Token9 d$ w/ f; N) K5 U1 q+ j

! r. \5 `: B1 m- O: G; bkubeadm token create --ttl 0* s% T3 F8 f' R( G

! P% N# u. |: V2 b三、管理 Token: V) t6 H7 z7 h! T$ o' ^
1、查看 Token
( a3 s8 @& ]3 I7 M! k/ S/ N4 `" z0 v+ |( E6 ?2 L0 m# ?6 {9 a  i4 d; q
kubeadm token list& B$ [/ g% r: Y( v. z. k( y; e
; d! k& o* ]6 c9 a# L: M  n
# 可看到有效期为23h
  J, c6 T+ S; J, J& x( _" n" k5 {8 e$ F/ z3 J. e' ?: {

8 Z- Y# K9 _% ?. l- `6 X
# @; g1 u& a* \+ j& ~8 ^& Y# U# t8 p6 A  `. x: ^1 k9 m$ C

8 _1 k6 \8 K0 M1 z( a5 d9 J2、删除 Token/ t+ b# L6 Z! x7 L, m0 `2 b  X+ x/ Z# l
1 ]$ {6 q! d; u5 Y, \7 ~6 `
kubeadm token delete <Token值>
! B8 ^( Q# v. \% a! Y) ~0 Pkubeadm token delete lu8i0r.pzvgyu40c8g73yc1( Z/ B' F! B- [
. k/ k1 o6 Q1 m. r( F+ n$ t2 y5 g1 z

, V& w  M% g( J- C! `四、获取 CA 证书 Hash 值
& v% `# X) N3 Y# b$ N/ [openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'2 t! U  `/ j" V' g
3 c# E: l; B  O$ _5 k. L8 t# n2 A
( K1 W/ ^. A2 e: }
/ m, n2 T% f: Z% ^
五、Node 节点加入kubernetes 集群
# n4 d  H! \+ @) m7 Z; e2 o5 ?kubeadm join 172.27.0.13:6443 --token lu8i0r.pzvgyu40c8g73yc1 --discovery-token-ca-cert-hash sha256:3ed701329742f7549f73cb065a8677abe8b5b8a3e25bbca7bb26f317ffcf89d4
+ U+ i2 J  j' ^# Z( t8 H
2 ?1 ^1 {- ]6 [* J% v1 L' f; R& D也可以直接生成 Node 加入 kubernetes 集群的完整命令:
/ [( p4 Q* h, H# Z
, P* P8 I4 P4 ?# H# x( g& ?$ Wkubeadm token create --print-join-command: U6 r. Y2 Y. D7 D. L
2 I. o% ?9 }' c3 G! c" Y0 x
# 这样就很方便了,就不需要单独获取ca证书的hash值了
. a9 B0 K6 J$ S' b7 F! z) k
6 D7 q$ S$ }" l* W3 R) K
0 c/ O5 U) [8 a+ O$ G, {

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2024-9-16 17:00:08 | 显示全部楼层
我们在使用kubeadm部署kubernetes集群时,为了安全问题的考虑,默认生成的token的有效期是24小时,过期将失效,不过也可以在初始化master节点的时候通过指定--ttl的值为0来强制生成一个永不过期的token(不推荐)。
0 K3 b$ e( p& S" J- N% h9 {
; w: k, t8 L, X9 W为什么会分享这篇文章呢?是因为我在部署k8s集群的时候,步骤进行到刚把第一台master节点初始化完成,需要进行worker节点的加入时,由于要处理一个紧急的生产业务问题,然后就随手关闭了终端,导致初始化完成后回显的提示信息“丢失”。所以将处理此问题的过程形成了此文档加以记录。* R" A9 y3 g% W# U2 _) E" ^

1 L2 d0 t( B) o% j下面我就分为以下两种情况进行简单介绍:
. O! }: ?8 P3 ^! U5 [
! t- u, _: o# l  }" ^: M5 o1. 类似于我上面的操作:关闭了终端窗口,或者这条命令在后续给忘记了,worker节点还没有开始执行.
7 ?1 O( s  r. P0 a
# K7 c7 `1 ~3 i8 P1 R" B2. token过期.
) b3 E& I$ L) ~  }; H- R' Z" ~/ u
# 查看token
8 H! Q$ d* t9 A# U0 N& t% q, b2 T/ m, e/ C/ ?" u2 w
root@master:~# kubeadm token list
* }9 v6 R  u) T6 u, M6 S: t
+ A- x; i1 R$ J( u/ |5 X& m# 生成一个永不过期的token
& }* H7 ?3 t) L. u, C3 Y- w1 x2 x9 I1 i: W* u" y
root@master:~# kubeadm token create --ttl 0 9 t+ B+ U; Y8 ?- }) t' n! g4 d! f+ U2 V

  e) s: [9 R- X6 p( rr089pu.3pjmew8vrv9mimty( Z$ r, ]2 S, q" o: o" [
* h6 `. ?- m) l$ j
root@master:~# kubeadm token list
, g. _( J$ s/ i5 ^% w8 n3 N$ w( a
TOKEN                     TTL         EXPIRES                USAGES                   DESCRIPTION                                                EXTRA GROUPS: D5 w* Z4 Z4 m) E) E& o

9 H  g' P, Z0 e8 |( zabcdef.0123456789abcdef   23h         2023-09-07T15:59:13Z   authentication,signing   <none>                                                     system:bootstrappers:kubeadm:default-node-token
  l, }- z6 F2 Y0 U5 k" K% y; [$ o# K5 q" }
r089pu.3pjmew8vrv9mimty   <forever>   <never>   authentication,signing   <none>                                                     system:bootstrappers:kubeadm:default-node-toke
+ X( z, W; f! d$ e' K) b( t/ M4 U2 ^& K# U* K- v! s- ?- n
由于在创建token的时候指定了ttl的值为0,可以看到新生成的token的有效期就变成了永久。
. L) o" v6 ]5 t' o5 v. m; }! R9 P
6 b1 n1 e; \. Q9 h3 {我们在对master节点进行初始化后,正常的情况下,都可以看到如下一些内容,即让worker nodes节点加入的方法:. F' c- ?$ _5 Z4 t& D2 O9 B( T; w

1 x  o2 i2 ]% A( }* }kubeadm join 172.19.53.150:6443 --token abcdef.0123456789abcdef \
2 p3 J( j5 p# s. I& g" W0 R# ]- W* c) @% f5 F% j" d) z
  --discovery-token-ca-cert-hash sha256:2c062e93ff47d023801c8ab8a16d46c323e2977e54f7ed0de1a76b778dfe9589! w6 v2 b6 R( k* Y: M" C% W* u% s, z5 @+ N
+ W' Z7 C- D6 a4 \
我们来分解上面这条命令的组成:* u8 p. M& X" N3 O* p1 L
+ `) p+ z) x5 ?# ^, K5 ^# p4 m
172.19.53.150:6443:指定apiserver的地址及端口,也就是master节点或者是control-plane-endpoint的域名或者地址及端口。  {9 f/ |! i# }& U* k) @, B, o
- e* T/ j) T3 B* y% @
--token:指定token值
' a0 i$ e. c$ X" t, ^) E" k- `, S/ x0 {5 z3 l
--discovery-token-ca-cert-hash:这个和kubernetes的CA证书有关系。后面会讲如何获取。6 U2 ^- c1 ^5 D

& @8 J# }. @+ Y) g4 w: m$ l## 忘记token的处理办法(token未过期); E8 ?3 B' L: F. Q2 a8 f

! ]2 N# \' K: G' u' t0 b) J+ }: L4 p8 l; U
4 c0 P6 @: J- D! a
1. 查看token值:
- B" ~( S2 E8 v1 L( Y5 G' p* b( m' ^* @
root@master:~# kubeadm token list0 ?, v8 z: s4 ]; W* A( g

9 n0 d8 u' {; m1 I  H! E5 {$ V; eTOKEN                     TTL         EXPIRES                USAGES                   DESCRIPTION                                                EXTRA GROUPS
4 k+ q' P9 q, [- h7 W2 D# d, E7 Z0 ?
! P5 C) w9 t0 tabcdef.0123456789abcdef   23h         2023-09-07T15:59:13Z   authentication,signing   <none>                                                     system:bootstrappers:kubeadm:default-node-token& y3 J- o5 u. n1 n. U
" p& }) f% ]* K% {
这里获取到的token值为:abcdef.0123456789abcdef/ M; @8 l/ K  H

* L9 U4 ^/ i+ s2. 获取ca证书sha256编码hash值(只适用于适用kubeadm方式部署的集群)
- C; v7 T& o4 B! `- ]2 R% H! m! E9 ^% {! t& H0 r
root@master:~# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
4 [% d2 F. L! `" d4 V# Q  ]' y, S! i9 |: Y' K+ Z/ {6 F
2c062e93ff47d023801c8ab8a16d46c323e2977e54f7ed0de1a76b778dfe9589" `( H1 ]* h4 U! E

) ]5 L' T8 s4 T5 K- v这里查看到的ca证书的sha256编码的哈希值为:2c062e93ff47d023801c8ab8a16d46c323e2977e54f7ed0de1a76b778dfe9589,如何通过二进制部署,需要按实际情况修改ca证书的存放路径。- d: {% r/ f7 A

. @8 U- o% W' B' m8 n0 J3. 命令拼装加入节点8 P" }( x  K9 }' V: g
- |8 L  s2 B) `& G' U/ V+ \  H
我们上面已经提到了将一个worker节点加入集群的命令组成,我们将以上两个步骤中获取到的token和ca证书的hash值按照格式拼接起来就可以正常执行加入worker节点的操作了。
: `$ T8 E2 q' m+ W& N
& f5 y1 O! l8 |1 ~; G2 g. Jkubeadm join 172.19.53.150:6443 --token abcdef.0123456789abcdef \
( x3 ~  R9 c# |* W4 ~! z2 N
& y: u2 V, e. ~" [  --discovery-token-ca-cert-hash sha256:2c062e93ff47d023801c8ab8a16d46c323e2977e54f7ed0de1a76b778dfe9589! v3 ?6 H, q. b& a/ X
( p; A' E9 a2 M" `4 L
## token过期处理办法0 F! |5 }: j$ s, V  F1 u8 g, U

4 H. f5 a6 j8 ]. o0 r) q% ^8 E8 R6 v7 G4 ^5 j/ I
6 t" v% m- d- J1 p
1. 重新生成新的token
1 [9 F. u+ ?) Z2 e- \: Y0 D1 O1 D/ Z/ C# T
# 生成一个有效期为24小时的token# m4 ~! s0 k! Z0 H! V; b

$ i- U4 Q0 ?$ Y4 Croot@master:~# kubeadm token create% Q4 e2 o* P6 u; a. {( d
4 `, h9 u& _. V: T
# 生成一个永久的token
. f+ H8 |% A4 w2 E; s' O
) j+ @% Y" L% b/ G% I4 j- xroot@master:~# kubeadm token create --ttl 0
+ N) k, F  ~  c  c& M/ ?6 ^6 o# @
" d  U8 k, T) B5 n9 x$ }/ R& _# 查看新生成的token
$ N) P$ R! \+ E
$ X" v  c- S9 q+ F, T* q7 g5 ]) @2 Hroot@master:~# kubeadm token list
  L7 Y$ l7 x& L( x; g3 Y* V* W% y
& z( k5 g- n5 q4 \' M0 nTOKEN                     TTL         EXPIRES                USAGES                   DESCRIPTION                                                EXTRA GROUPS
; w4 e/ B- H0 u- x* y* X  n4 f8 {! O# A& W
abcdef.0123456789abcdef   23h         2023-09-07T15:59:13Z   authentication,signing   <none>                                                     system:bootstrappers:kubeadm:default-node-token
% }9 J1 r/ {' G: T4 n& a0 o8 l. ?& V1 Y8 M: m; [
r089pu.3pjmew8vrv9mimty   <forever>   <never>   authentication,signing   <none>                                                     system:bootstrappers:kubeadm:default-node-token# U* Q; c! T" R8 J  P
2 l* F5 `7 |; c2 _
以上集群是我在一小时前刚部署的,可以看到token的默认有效期为24小时,将在23小时后的2023-09-07T15:59:13Z过期。同时生成了一个永久的token。
" C3 `, ]( k% K) [6 a6 b7 G1 T& W% V

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2024-9-16 17:00:09 | 显示全部楼层
1. token过期处理3 l( B8 k% N4 A' ]7 Z8 X- w! |: o
k8s的令牌默认24小时过期,逾期需要重新加入
- p8 X; |# U, F1 A3 e3 ]; _
1 i6 Z* s' i4 l1.1 master节点创建新令牌
8 D1 q1 t- K# b  ^/ g. n( ^7 n## 在master节点
: l6 o/ U: `' ]" T. i+ w# C5 `# kubeadm token create --print-join-command
! r! e. r" N5 G2 J: h4 ?9 `0 {: z/ _, A% H( u1 h: K
[root@master1 admin]# kubeadm token create --print-join-command5 G: u- f6 F; Y  o& X
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]
/ B2 a; a5 e6 c9 m% Y6 @kubeadm join master.k8s.io:6443 --token ime4yx.8fb5jsv0smqkk0aq     --discovery-token-ca-cert-hash sha256:ffb3b09434cb153048558614e774221d0ef8107e4f824a415e2f41e84f6ac0b1 - e' F9 Q+ h& j/ _1 {6 r- y& G! o

" _7 L( L+ T2 g* J5 {) ]& L
* X6 K) D, H! \1.2 worker节点或者master集群节点执行命令5 }( K9 ]* r& t* |& f
## 集群的其他master节点, 有 --control-plane7 P' f! N  ?. @" F! ]7 o4 c
kubeadm join master.k8s.io:6443 --token ime4yx.8fb5jsv0smqkk0aq  \
/ t+ E+ [2 Z/ E5 \0 E  j   --discovery-token-ca-cert-hash sha256:ffb3b09434cb153048558614e774221d0ef8107e4f824a415e2f41e84f6ac0b1) P5 }; ^  b9 d8 Y* u* n* [* x, j
   --control-plane2 X% ^# a- o+ ~6 v2 m7 ?7 t
  
- q. x- v1 ]; J% K3 K9 Y) Q/ Y) y## 集群的worker节点 , 没有 --control-plane
. J" b# w$ u0 Qkubeadm join master.k8s.io:6443 --token ime4yx.8fb5jsv0smqkk0aq  \
5 V' L3 a7 Z8 `+ M6 v5 P2 x   --discovery-token-ca-cert-hash sha256:ffb3b09434cb153048558614e774221d0ef8107e4f824a415e2f41e84f6ac0b1  N0 F6 _& T( g  f
8 L6 V9 b9 U) T4 l( |
2. 部署dashboard
6 |; H" A$ y( }$ b1 [" K! _7 t2.1 Kubernetes 官方提供的可视化界面
4 ^+ v) R8 d( {URL: https://github.com/kubernetes/dashboard
' B( h! C% H7 Q4 a3 M/ T: G1
; [% \, l; B/ r; |/ d" O2.2 下载k8s dashboard8 [: S9 L* l9 n) y' u$ [
# 命令:kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml+ u9 B+ X# J* p" X0 c# k
4 V" o+ F" _% i2 k8 `
# 或者先下载:wget --no-check-certificate https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml( }3 I$ Q" X, X4 [: G7 o
# 再应用 kubectl apply -f recommended.yaml4 x! y5 E/ C1 _6 E+ {. k  Z
2 |" e( M- s9 N

! m& a! y+ o2 U; N5 L2 E6 T* y  p[root@master1 admin]# kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml: l3 I5 e9 R8 P
namespace/kubernetes-dashboard created' T5 Z  L  c, f/ y: @! o) y  \+ [% C
serviceaccount/kubernetes-dashboard created3 H+ P7 T5 }6 T8 g, b1 R+ I9 G
service/kubernetes-dashboard created6 S: {& o. Z7 ?& @
secret/kubernetes-dashboard-certs created1 J& ~0 |$ s* V1 Z; h( O" u; ^
secret/kubernetes-dashboard-csrf created
9 H/ S& X! `' _! Dsecret/kubernetes-dashboard-key-holder created
+ S5 M/ a& {& F3 `7 Bconfigmap/kubernetes-dashboard-settings created
4 v6 F, {0 z# prole.rbac.authorization.k8s.io/kubernetes-dashboard created
9 b0 `$ q) D4 S. z9 N3 M, Gclusterrole.rbac.authorization.k8s.io/kubernetes-dashboard created
, z: a1 V- \( b- F5 _+ s$ lrolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created7 _6 b; {3 O6 Z2 J$ m
clusterrolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created& G, A! ^+ D- A# _+ q3 S! r! J  b
deployment.apps/kubernetes-dashboard created
) m# L; C9 W- z5 c( R+ {: N6 pservice/dashboard-metrics-scraper created
% v5 |7 }$ G: @. gdeployment.apps/dashboard-metrics-scraper created
" _/ w& i( {- K# u& v# c% b- X! y
) W7 I( N( f( j检查:
) H8 O5 n, M+ i* w+ f
! {, Y: y0 l. f3 E[root@master1 admin]# kubectl get pods -A6 }% ]2 T6 o7 i$ {. ^
NAMESPACE              NAME                                         READY   STATUS    RESTARTS   AGE& P3 z7 `3 g3 n1 J$ j4 Z* _
kubernetes-dashboard   dashboard-metrics-scraper-78f5d9f487-s854v   1/1     Running   0          4m8s
2 a8 E0 [1 y8 _kubernetes-dashboard   kubernetes-dashboard-6bc5cb8879-8zjj2        1/1     Running   0          4m8s
* ~1 C- W% t' }8 t& o1- b% e9 H, s5 |7 V7 B9 B6 \3 c* s
2
4 Z: Q% v: m2 M/ V. u5 h* }5 u3
9 }+ F4 r! J/ ~+ h' h# s- M1 k4' C9 E+ |/ N4 n+ @/ t
2.3 设置访问端口
1 O  D2 F4 Z6 S4 N2 }1 R[root@master1 admin]# kubectl get svc -o wide -A+ x- X, S% Y' a' e# {0 w" v) V
NAMESPACE              NAME                        TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                  AGE     SELECTOR( W1 s: x& d1 t( z
default                javademo1                   NodePort    10.1.230.223   <none>        8111:31880/TCP           2d23h   app=javademo13 a7 q9 A0 |) Y* z1 U- a
default                kubernetes                  ClusterIP   10.1.0.1       <none>        443/TCP                  3d      <none>
0 [6 ?: D3 }$ Z! s9 A- K) L5 rkube-system            kube-dns                    ClusterIP   10.1.0.10      <none>        53/UDP,53/TCP,9153/TCP   3d      k8s-app=kube-dns
+ T9 n' W# C( M7 ^* _5 Ckubernetes-dashboard   dashboard-metrics-scraper   ClusterIP   10.1.110.33    <none>        8000/TCP                 8m24s   k8s-app=dashboard-metrics-scraper
! i: o1 t' H( E1 f" V+ `/ z( x" ]kubernetes-dashboard   kubernetes-dashboard        ClusterIP   10.1.179.158   <none>        443/TCP                  8m24s   k8s-app=kubernetes-dashboard7 w% R9 v: q. l4 l
[root@master1 admin]# kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard: \; G0 q3 }" w
service/kubernetes-dashboard edited
5 z& F/ T5 e/ ^. m
; R0 A+ S; h+ C$ o2 s* P6 x3 X+ a其中的 type: ClusterIP 改为 type: NodePort
% k7 h( h& r9 V' j: g5 O7 G6 f
8 v- H% Y% s. f+ h' |  U3 ^( V5 @, [5 B+ X5 A5 S
可以看到,dashboard的端口变成了30798
! G1 n4 G/ k1 L4 Q9 E& F7 @" R+ O; X3 M# B2 p7 W) Y7 J
# 命令: kubectl get svc -A | grep kubernetes-dashboard
) V  L; I% I, Z5 }& |: E3 W: ?# 或者: kubectl get svc -o wide -A9 O: X+ r+ F/ |
[root@master1 admin]# kubectl get svc -o wide -A4 C+ G  s' f" `8 B5 z9 _: Y- {
NAMESPACE              NAME                        TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                  AGE     SELECTOR" W4 Z2 b( m) P& L
default                javademo1                   NodePort    10.1.230.223   <none>        8111:31880/TCP           2d23h   app=javademo1
7 y. g: z- G" P' V1 `1 T2 tdefault                kubernetes                  ClusterIP   10.1.0.1       <none>        443/TCP                  3d      <none>
& `) k1 K) J2 H6 M9 ^, T/ |1 n: ]/ ekube-system            kube-dns                    ClusterIP   10.1.0.10      <none>        53/UDP,53/TCP,9153/TCP   3d      k8s-app=kube-dns
+ Y5 {7 M) O5 Q- `! w& n- M2 \kubernetes-dashboard   dashboard-metrics-scraper   ClusterIP   10.1.110.33    <none>        8000/TCP                 12m     k8s-app=dashboard-metrics-scraper
7 z, }$ p. S$ W4 Fkubernetes-dashboard   kubernetes-dashboard        NodePort    10.1.179.158   <none>        443:30798/TCP            12m     k8s-app=kubernetes-dashboard
3 L+ L9 s+ g4 O$ A5 T  Y! }
, Q' @7 h+ J! v0 X( k5 _
# O; f( O5 b/ `0 V4 Y; ?4 D: I& E9 s# O" l
2.4 登录
3 r1 R4 S/ V4 o/ J- M2 G9 j( A2.4.1 创建登录用户(masternode)
1 n' ^2 W/ |, `% O8 W" y7 ?' s$ _URL: https://192.168.8.190:30798/
6 x, K6 N# ?3 Q* b2 _创建一个登录账号的文件:dash-user.yaml/ e' N3 o- c- P4 U) S/ C& B1 N
内容: 把一个集群账号admin-user创建出来& y% @& i; C& D# |. l

; }4 }, ^& @" ^5 ^# dash-user.yaml: q2 D+ W  L6 L! |; R5 C7 n9 l
apiVersion: v1
- D3 f# ]& H0 c& f* g( X' |* Rkind: ServiceAccount
: n& K7 x3 ]% S& F9 F8 C' bmetadata:
1 I; O9 L9 s" O) u, g& A2 h  name: admin-user3 x- h- R% a. S  i/ e: S* I
  namespace: kubernetes-dashboard$ {( u% C5 d( }
---
0 Q+ h& |" G$ Z- fapiVersion: rbac.authorization.k8s.io/v1, H) p/ G, f+ ^4 \9 O
kind: ClusterRoleBinding& o" ]" ?1 s; y% w' F  [/ m, \8 h( }5 ?
metadata:
6 m# \3 @* z, d- L) b  name: admin-user
/ I  x% U, `$ groleRef:6 |0 d$ C/ K/ A
  apiGroup: rbac.authorization.k8s.io9 t+ W; Z! N* P1 B" F: Z8 u
  kind: ClusterRole
7 V; o; q8 P9 o  name: cluster-admin
8 t/ T$ r3 [3 Y* Jsubjects:! ~+ q: F) q5 d9 s7 _: q) c" T& O8 y1 i4 a
- kind: ServiceAccount, @. Z3 T$ r2 p6 o& |  S7 m
  name: admin-user
# Y; m: @/ p' h0 A0 r, E  namespace: kubernetes-dashboard7 m, d- N+ J. G

: c# {2 r1 f# U2 S; i## 应用  _. [7 n3 t% h; q# {( o
[root@master1 ~]# kubectl apply -f dash-user.yaml . m8 z, H5 X$ X8 ^' o/ W; `
serviceaccount/admin-user created
7 \7 y7 |6 @# w; Xclusterrolebinding.rbac.authorization.k8s.io/admin-user created) G# A" l4 K) i1 i4 e9 A8 a8 f
; ~- Q. N. |2 G7 {+ r# G) P
2.4.2 获取新建用户的访问令牌. s1 q. P0 d$ a2 d) u8 D
命令:% V  |) C( J' P- M- Y6 K

& C! S* A+ o& p: n& _! Lkubectl -n kubernetes-dashboard \
0 _# o1 r! C0 f- \5 J% [get secret $(kubectl -n kubernetes-dashboard get sa/admin-user \
9 B8 t" O% C9 u2 {1 ]( A' j- j-o jsonpath="{.secrets[0].name}") \
" ~4 }0 v/ c6 A8 Z4 x! t& j8 e-o go-template="{{.data.token | base64decode}}") O5 I1 N8 Q2 ?7 {* I  ]2 v6 W
! P- K7 k, S: X
执行后会出现一串令牌,复制后粘贴在dashboard的token输入框中即可  G% ^- u8 ]. Z, E% n" [8 ]( k, P2 {

1 |  }0 Z# N5 ^
4 Q. C/ b9 |) _0 ~0 `' F3. 工作负载deployment
' L8 v0 S+ t0 H" `" c) f( p控制Pod,使Pod拥有多副本,自愈,扩缩容等能力
! L* o: G# Z4 I# W% ?/ d* L  ?$ o# g* B; F; \- ~$ o
# 清除所有Pod,比较下面两个命令有何不同效果?3 v) d8 [" L3 K& u  D; o2 a
kubectl run mynginx --image=nginx
- T8 G% k. D$ j( Y! Y6 B$ ]6 n& S. Z0 K) }
kubectl create deployment mytomcat --image=tomcat:8.5.68
; s* ~5 |, I4 v! \# 自愈能力
5 o$ n) A" [( ^5 {7 v7 Y. I# 删除之后,k8s会重新启动一个tomcat。除非删除deployment; ~( v$ B- R  {( ]

4 i) U  P9 Y0 a+ [6 Z% q  t; Y* H3.1 多副本" r; I; V0 d' k0 r# y
3.1.1 命令行方式:
& M) F8 j3 d; X8 o' g& T" [kubectl create deployment my-dep --image=nginx --replicas=3+ `6 V& t( u. h9 H/ ]

  I  c3 p- v3 P5 D! g: V3 X" d3.1.2# o# c/ n9 {, n5 u- c
yaml文件方式7 r+ K+ c4 W& Q

5 [# w3 V) ^. `+ l# ~( {: d1 j0 eapiVersion: apps/v1
& V/ y4 R* y; N! ^% V2 W, k! Mkind: Deployment9 G. ^0 u& t1 g' r
metadata:
6 Z) z  }$ o$ k+ G/ k" q  labels:) A1 U' x( ?7 E2 o% N4 n* r
    app: my-dep
/ s* \6 x; c6 a. k  name: my-dep
, J5 A& h& m1 H& v, c+ lspec:
# Y% A. ?( T. F$ G  replicas: 33 r$ v4 Q7 M" p: R) ~" X
  selector:3 b' U7 |0 q9 J. Q3 @; F
    matchLabels:
' N4 ^1 E2 M# u, R      app: my-dep6 o& Y/ _' B' r9 Z  [7 j
  template:
5 B$ n/ a' Z/ ~1 @0 h4 w/ Q    metadata:0 r3 a: K6 d2 O3 _: F* F1 ?
      labels:) k+ o) Q: u) j8 n% I: I
        app: my-dep
- W2 b: V  s, \3 {& u    spec:
5 \" a$ X$ Q3 ^4 l5 g      containers:& f' l& a4 u& I% J
      - image: nginx
# R% p( L9 Z5 o! W        name: nginx
$ r) U! g7 C9 s1 Z& j' w, E# g5 j" y9 h5 o' A9 |8 V4 g
3.2 扩缩容
  o% T- ?" X3 ]. m3.2.1 使用scale方式' ]6 K* o0 j$ F; c: h8 c
kubectl scale --replicas=5 deployment/my-dep
- j1 h. |+ _) D3 A- Y- h( K6 P
* o0 u" D! ~  @% m) I9 K; o7 q3.2.2 修改deployment方式" g8 j, y2 p. `- B/ a
kubectl edit deployment my-dep' v& q* r# D. ]* `% t

( Z% s* a; x& W+ d' ]3 y#修改 replicas 的值
3 p* A! l9 x+ F, W3 _) }1 J2 H
% e% l" [6 j, M7 j3.3 自愈&故障转移( h1 e! }6 j! o( l7 W
● 停机% d. B9 {  K* ?- w" e
● 删除Pod8 Z- p( b" {$ r5 D
● 容器崩溃5 c( |/ `1 b9 b4 d/ J9 L
● ....4 {' h- m6 S; r, ^
* x5 D, s: E( `5 s/ ~2 s
3.4 滚动更新9 p: U0 Y- X% h2 _4 \
3.4.1 直接使用命令. f9 @, c9 @% c9 S
在以deployment创建一个nginx的情况下
5 o5 V& L6 B5 ]- }: C! }& y
" T+ @" @3 `7 }9 F% K5 Q9 J7 N4 D## 设置新版本, 该命令会是k8s去下载版本为1.16.1的nginx镜像。+ W7 i8 P& |! M$ T
## 同理,也可以使k8s去指定仓库拉取指定版本的某镜像(比如某服务的新版本)+ j3 U) ]: b# U# F
kubectl set image deployment/my-dep nginx=nginx:1.16.1 --record, r* I% p: ]* w
kubectl rollout status deployment/my-dep
6 Y& n. I) w* Y2 O9 J; ?8 `) `: q, z6 E( O1 Z1 X- u
3.4.2 修改deployment的内容0 l% n6 P1 G4 l& X" J
## 修改image的版本
) [: ?# w& }( |$ P9 vkubectl edit deployment/my-dep9 u- F6 x1 m3 t0 q$ k

5 i$ P1 S0 q$ `3 L: P3.5 版本回退1 H7 `. \/ w" ?5 q7 h
#历史记录
) K6 W6 M9 W2 C8 C- I, R9 g) R8 fkubectl rollout history deployment/my-dep
+ j* {( w( v0 |9 o2 y  r4 k0 z- o
7 f7 W6 E% C4 v; O1 p+ y  X#查看某个历史详情6 {) v0 r; z" N2 M% c4 _
kubectl rollout history deployment/my-dep --revision=2. U7 V! a- ~* [: I- b1 N# Y
' p: O/ m" R2 |) a3 e& k6 a9 b
#回滚(回到上次)
8 r5 L- E# N9 Z8 B5 r! Wkubectl rollout undo deployment/my-dep
: \  G1 p/ q" A9 m" _
0 O! ]1 T; U1 @* Q# b# r4 m#回滚(回到指定版本)+ d' p- j# _8 q( A' i+ A
kubectl rollout undo deployment/my-dep --to-revision=2* A+ y$ i2 V/ k  o1 W# r7 g/ O
$ L( ]  D# k+ M: [
更多:! ]$ i1 w; @. z+ H

* C! L* y& \% K+ _6 [& c除了Deployment,k8s还有 StatefulSet 、DaemonSet 、Job  等 类型资源。1 g) g( @& {/ F+ [
我们都称为 工作负载。. e: H; }) H) z. W
有状态应用使用  StatefulSet  部署,无状态应用使用 Deployment 部署
* x1 a3 t3 Q. h9 [% Surl: https://kubernetes.io/zh/docs/concepts/workloads/controllers/6 V+ P0 h) F* [8 r0 L

8 z; F2 \8 J$ r4 t- ^3.6 工作负载小总结
0 H/ w# \- R- ~. I
. C: Z: P4 `! z2 w& m" c' xdashboard中的工作负载
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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