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

Kubernetes Token 过期解决方案 使用kubeadm

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2024-9-16 17:00:07 | 显示全部楼层 |阅读模式
一、背景
$ m1 y; F1 k! Y- @/ b* S/ LToken 是 Node 节点用来连接 Master 节点的令牌字串,它和 CA 证书的 Hash 值是把一台 Node 节点加入到 kubernetes集群时使用的凭证。如下图所示:
, @- u0 I" r8 h$ e! P2 F. f2 @- U1 j
) v; w0 x8 X. @" J

- a' X7 H* }  k& Z- n在 K8s 1.8 之后,默认生成的 Token 有效期只有 24 小时,过期后 Token 将不可用,如果想新的 Node 节点加入 K8s 集群,则需重新生成新的 Token。生产环境中我们一般都会采用默认的有效期即可(目的是为了 kubenetes 集群的安全),当然你也可以生成永久有效的 Token(但不建议)。
  a2 V0 M7 P1 B' @6 |/ C" c6 R  A% S/ Z8 \. q
二、创建 Token
& v4 b/ p# P$ L9 s0 z1、生成默认 24 小时 Token
8 ~' ?" q8 L$ q$ \. d" x4 `# m$ C( E2 N
kubeadm token create
% [; ]" Z/ V- Q8 \& d% a5 s; {! n  }5 A: U
  O8 ?* a* b) T% P0 G

# P$ g1 g6 F5 o& q2、生成永久有效 Token
+ p1 o3 m. ^3 r" d, G
. {( o. `0 I1 r: T) p* M3 H0 Jkubeadm token create --ttl 0
$ `+ A3 z' l; {$ Z7 _5 i
( U2 r1 Z, @+ n5 c$ |3 K( }! H; L9 n三、管理 Token
) {0 @* y3 L, G" S+ Q1、查看 Token
- a5 k9 d# L% ?: E, ?6 Q' ^: Q3 Z6 n1 l: p
kubeadm token list
- l. v, X+ q3 u* O$ j
$ \( S5 J* H8 x4 z# B0 h6 j# 可看到有效期为23h# M8 Z# G* W* P1 ~0 r* Z

- S" D3 C4 T& g, q
. w% n. ^/ R1 ^) ]& z) k; V
8 T  J% e% u8 _9 D
9 H+ z2 g2 r9 l
( S0 r$ @; R, |6 Y: e2 }2、删除 Token
+ s( w- d6 l9 {- X. m. G
1 G6 e7 U" U) m( b8 N6 _kubeadm token delete <Token值>6 t7 P  B' n9 T6 L1 U# r, N7 {. p
kubeadm token delete lu8i0r.pzvgyu40c8g73yc1! i* x+ G' h- H; k9 `
! {5 d! M; F8 U" i

) l4 D! b/ b+ G0 ^8 s- _* m四、获取 CA 证书 Hash 值/ G8 t3 v1 |' g+ ~' D/ _4 g5 r: u
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'( z9 r7 b% G7 W  S: u2 [

. l" j" g& V+ N! f- i
) a! k( _/ y& Z2 X
% w4 b$ y- Z/ N# Y* |五、Node 节点加入kubernetes 集群- ]! [3 ]5 q$ E' _/ r8 X
kubeadm join 172.27.0.13:6443 --token lu8i0r.pzvgyu40c8g73yc1 --discovery-token-ca-cert-hash sha256:3ed701329742f7549f73cb065a8677abe8b5b8a3e25bbca7bb26f317ffcf89d4
' u; x5 y& B% Q) N2 w* e
7 @4 }) [1 `3 Y" ~9 P, d3 t也可以直接生成 Node 加入 kubernetes 集群的完整命令:
9 K" d% U/ y- E/ U4 |: g( Z7 ]) r/ A4 L, O1 u& P$ ~6 D/ m" ?* T
kubeadm token create --print-join-command
, B/ B" z6 O1 |1 z0 h
- c2 n$ R: H7 X" e& l7 B% X2 S# 这样就很方便了,就不需要单独获取ca证书的hash值了
9 B6 W: v+ c2 \8 n: W6 U8 [# Z+ K" [4 Y# g+ N0 E! f

. n# F0 }% N- U, E

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2024-9-16 17:00:08 | 显示全部楼层
我们在使用kubeadm部署kubernetes集群时,为了安全问题的考虑,默认生成的token的有效期是24小时,过期将失效,不过也可以在初始化master节点的时候通过指定--ttl的值为0来强制生成一个永不过期的token(不推荐)。
8 p* r' W9 W4 Z" M7 R. z# q, t9 ]* c9 r, k5 U; {7 ]4 A8 u
为什么会分享这篇文章呢?是因为我在部署k8s集群的时候,步骤进行到刚把第一台master节点初始化完成,需要进行worker节点的加入时,由于要处理一个紧急的生产业务问题,然后就随手关闭了终端,导致初始化完成后回显的提示信息“丢失”。所以将处理此问题的过程形成了此文档加以记录。
8 [0 ~& K/ |0 L/ n; P: m+ b, ?. }+ a5 k6 |$ ?
下面我就分为以下两种情况进行简单介绍:
8 T! b- A2 Q& F" Z' d: |
& ~) ~. u7 N4 _+ X8 p1. 类似于我上面的操作:关闭了终端窗口,或者这条命令在后续给忘记了,worker节点还没有开始执行.
0 G- K1 t6 N% F+ ^3 v0 L& G) {! ~& A4 X) _
2. token过期.8 G  w7 B) w  Z$ _& a

: z* l9 c8 K3 k# 查看token
  Q0 @0 a0 P! J: W# }( \6 U
; I* r0 t2 z1 n7 T/ croot@master:~# kubeadm token list
. Z/ d4 X5 O7 P1 `% [  B# K7 h% I
4 ]' j' l& d1 v+ U3 N" O# 生成一个永不过期的token' K( B2 w8 g) i' C& B# @  i

* Q  D; x9 _) l3 D8 ]+ f, \7 A* wroot@master:~# kubeadm token create --ttl 0
, o# v  K; C& Z2 L% G4 q5 I# B5 j" w1 s+ v
r089pu.3pjmew8vrv9mimty
: t% f: V& w7 D3 H1 s$ O- Z" g6 Q" D0 U4 q
root@master:~# kubeadm token list
$ f6 {0 u7 u4 I* ?* e  H! [7 q5 n; R* C  y* R
TOKEN                     TTL         EXPIRES                USAGES                   DESCRIPTION                                                EXTRA GROUPS
# H2 b( l7 D; x' p2 y6 K2 J8 F/ q
abcdef.0123456789abcdef   23h         2023-09-07T15:59:13Z   authentication,signing   <none>                                                     system:bootstrappers:kubeadm:default-node-token
7 u4 ~) j6 T; R) e$ z- {  Q: n9 f  r- P" u0 \. l5 G: f
r089pu.3pjmew8vrv9mimty   <forever>   <never>   authentication,signing   <none>                                                     system:bootstrappers:kubeadm:default-node-toke
) C: z. e# T/ q2 [5 L1 M2 r, H( E; B5 S* T1 d7 j
由于在创建token的时候指定了ttl的值为0,可以看到新生成的token的有效期就变成了永久。
) h/ A0 M7 r+ V5 _3 @9 L; T5 Y4 }" B  w" l- Q; }
我们在对master节点进行初始化后,正常的情况下,都可以看到如下一些内容,即让worker nodes节点加入的方法:  ~8 r' R9 A5 {# `% e( V" O

3 G: z5 E' V. Rkubeadm join 172.19.53.150:6443 --token abcdef.0123456789abcdef \
1 M( |) k4 a, B( m8 Y) \
7 n9 N6 I/ h8 }& j" U  --discovery-token-ca-cert-hash sha256:2c062e93ff47d023801c8ab8a16d46c323e2977e54f7ed0de1a76b778dfe9589% e& D/ J8 G: [! L$ _* C5 M5 p1 ]
2 x8 A& k1 C8 H
我们来分解上面这条命令的组成:
7 |, ~* P. t2 H) X+ @0 _- h
# q! ^3 \1 E! j- x172.19.53.150:6443:指定apiserver的地址及端口,也就是master节点或者是control-plane-endpoint的域名或者地址及端口。. I; @' O- g; |8 k) r  K( o" q
3 E) o9 J- L4 @& P. }8 E
--token:指定token值6 j' F3 A/ V4 t2 ^+ a4 X& Z( \4 ]

% l8 C" |' e- u: f. t& I, r4 o2 U--discovery-token-ca-cert-hash:这个和kubernetes的CA证书有关系。后面会讲如何获取。: K6 R' g: C" N" [1 ?* T2 l8 o/ Z

% I# s& s( u9 C3 a## 忘记token的处理办法(token未过期)) \8 L5 k( o# @, i, X

- V/ }1 P  u2 W1 i+ c/ j3 |7 X; ?, Q4 ]9 p* b8 n, _

4 `& o) G" h9 B1. 查看token值:
$ {) w! x1 V, C& O: y$ |$ H
) X1 o/ l& Z5 V8 ^: U% }% t& a8 groot@master:~# kubeadm token list
) D3 D4 I4 O8 a% y# K
) L! U; L) `" T2 G' E4 ATOKEN                     TTL         EXPIRES                USAGES                   DESCRIPTION                                                EXTRA GROUPS
7 ]% D# T; w7 O+ |1 x1 Y5 _& r) w; O% s
abcdef.0123456789abcdef   23h         2023-09-07T15:59:13Z   authentication,signing   <none>                                                     system:bootstrappers:kubeadm:default-node-token
2 a% y9 T( j- w$ ^
1 J( k9 k( ?7 N' a这里获取到的token值为:abcdef.0123456789abcdef
, Q2 j1 L5 o! g) o4 o) b
& U9 ]1 t1 H/ H0 G3 t/ |2. 获取ca证书sha256编码hash值(只适用于适用kubeadm方式部署的集群), S! ?0 j- l$ l+ j
$ f& ]: l+ q2 ?' Q) I' C! h
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/^.* //'
; R# [0 a. k2 @4 A( U) J8 o) s& X& \9 `  x6 {  k! v1 r
2c062e93ff47d023801c8ab8a16d46c323e2977e54f7ed0de1a76b778dfe9589
! Z/ g; u: Y8 [4 G5 x/ F: T0 @4 j" M  e7 _& P1 F/ u; J; W7 U
这里查看到的ca证书的sha256编码的哈希值为:2c062e93ff47d023801c8ab8a16d46c323e2977e54f7ed0de1a76b778dfe9589,如何通过二进制部署,需要按实际情况修改ca证书的存放路径。5 K. Y3 ?# v* Q. F! I& G
7 S# [- I6 S3 H, V3 D
3. 命令拼装加入节点+ i; z/ A) O. U7 y2 s/ e( ~
; w' X2 C/ N+ ?- x/ w6 t( m$ e
我们上面已经提到了将一个worker节点加入集群的命令组成,我们将以上两个步骤中获取到的token和ca证书的hash值按照格式拼接起来就可以正常执行加入worker节点的操作了。
0 s# C) A$ H+ _" T9 A" `' E$ L) J
) D. G  {+ R: i" ?. vkubeadm join 172.19.53.150:6443 --token abcdef.0123456789abcdef \
, U' W- A& ^. @$ C
8 n8 B- E. m7 O3 t; B3 _+ S' R  j  --discovery-token-ca-cert-hash sha256:2c062e93ff47d023801c8ab8a16d46c323e2977e54f7ed0de1a76b778dfe9589
" H2 h- \; e$ T' x$ K5 s
0 P( I+ q5 i+ Y* c8 E( h; [## token过期处理办法0 o$ x+ ^( b9 h  ], W2 l+ Z
- O, r, \2 E. z" T$ {: a, I% l

) s0 c5 Z% ?$ V6 h" F/ O# R* `3 P& w) c, C
1. 重新生成新的token) U6 t. A- N; j0 f

  u$ I9 u4 C& s% c# 生成一个有效期为24小时的token) z" @5 _: \7 D. W
( N# {/ `1 F, x' y+ M
root@master:~# kubeadm token create+ `- F0 }7 G7 W4 Q* \* S: R

6 t1 Y6 _; G+ G  N+ u# 生成一个永久的token
+ j! G$ s4 [4 Z0 c0 t1 X& W2 S
: B% ^( Y% |( N8 Q: }root@master:~# kubeadm token create --ttl 0
  j; u7 q2 b' W+ I* k, R* k5 F( O: H. Q& a8 l% o
# 查看新生成的token* r+ J: c6 R: \

% T% D. w% w8 N; q5 broot@master:~# kubeadm token list
6 ?8 N+ }' C! {" W) S1 n+ A5 C% q% \+ J9 n. m- T
TOKEN                     TTL         EXPIRES                USAGES                   DESCRIPTION                                                EXTRA GROUPS
" s& u0 p/ G1 q% H* T7 q9 d9 ]' t. x" ~
! B% w+ J/ u5 Z" f9 [  X5 m9 g; iabcdef.0123456789abcdef   23h         2023-09-07T15:59:13Z   authentication,signing   <none>                                                     system:bootstrappers:kubeadm:default-node-token
1 e2 ~7 b) t( O' Q0 B# B4 i# U+ k/ ^2 L7 d% t0 y& F' D5 c
r089pu.3pjmew8vrv9mimty   <forever>   <never>   authentication,signing   <none>                                                     system:bootstrappers:kubeadm:default-node-token3 L1 g, {2 I4 Z7 V: a

9 J! P. q" h5 C" {以上集群是我在一小时前刚部署的,可以看到token的默认有效期为24小时,将在23小时后的2023-09-07T15:59:13Z过期。同时生成了一个永久的token。
1 x# y; A4 S1 O* [
" g( p$ J3 G# U; J

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2024-9-16 17:00:09 | 显示全部楼层
1. token过期处理
, K0 R: _; q: ^k8s的令牌默认24小时过期,逾期需要重新加入
. u7 e' T$ H7 o0 J7 s: x3 m9 ?% X- [6 |- L4 e& P6 u+ `
1.1 master节点创建新令牌
' V' O) `) Z7 Y- e" t: b0 E## 在master节点
3 x, T% i0 q& c# kubeadm token create --print-join-command6 }& V% e4 e& D0 c6 g1 U9 B4 p

, J; F  o% d1 J$ s, M& A* Q" S[root@master1 admin]# kubeadm token create --print-join-command
8 S; i5 n& n4 B7 FW0705 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]
7 {: ]' S: H' I: R  Kkubeadm join master.k8s.io:6443 --token ime4yx.8fb5jsv0smqkk0aq     --discovery-token-ca-cert-hash sha256:ffb3b09434cb153048558614e774221d0ef8107e4f824a415e2f41e84f6ac0b1
. a/ _( B' j4 f  e/ d4 A& u& \
. D+ N0 C' T. C9 _" s/ J
2 i3 I% k9 \4 \# T' ?$ E7 _5 @1.2 worker节点或者master集群节点执行命令' w+ g1 s& K! D* d3 L
## 集群的其他master节点, 有 --control-plane
) Y: P& K/ e5 a, a/ j7 }kubeadm join master.k8s.io:6443 --token ime4yx.8fb5jsv0smqkk0aq  \
, k& H* C8 p7 m& E6 Y5 Y   --discovery-token-ca-cert-hash sha256:ffb3b09434cb153048558614e774221d0ef8107e4f824a415e2f41e84f6ac0b1
( z, [$ g; m6 |7 b+ X/ Y0 k   --control-plane
2 S8 Y$ D% x* h2 X  
4 A+ Z3 {+ G/ F; Z* t## 集群的worker节点 , 没有 --control-plane
* w5 N/ `0 K" ]. C$ ?3 Okubeadm join master.k8s.io:6443 --token ime4yx.8fb5jsv0smqkk0aq  \
/ \+ ^( N/ r4 L# z; w   --discovery-token-ca-cert-hash sha256:ffb3b09434cb153048558614e774221d0ef8107e4f824a415e2f41e84f6ac0b16 K' ~; Z! G; k- p$ n' s
9 n8 [; g6 `- o3 O0 z. {
2. 部署dashboard
' s* C9 E( `$ }/ C: G! Y2.1 Kubernetes 官方提供的可视化界面! W( m% y4 i2 ]/ X
URL: https://github.com/kubernetes/dashboard
" U# ?( P- q& r" x1 \% \3 ?1) s1 A! u2 ^% B; v
2.2 下载k8s dashboard
2 D8 G1 M" l% J3 D% U: H) m  m# 命令:kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml  t5 k6 J* D9 Y6 `2 r) o" K

! Z( J" j3 m' e3 i4 J% D# 或者先下载:wget --no-check-certificate https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml4 t) o& x4 y% \4 e3 j" I
# 再应用 kubectl apply -f recommended.yaml
0 @+ b% b; k0 r% G  R
0 O  m/ m9 @) d1 P; t
6 Y: {8 `8 @: ^# E4 B- F4 T" O' D[root@master1 admin]# kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml6 I# N/ V6 j: ^' D# {
namespace/kubernetes-dashboard created9 Y. y4 p2 X) E1 o. j
serviceaccount/kubernetes-dashboard created
& P5 w/ t) Q6 _9 |. r6 Uservice/kubernetes-dashboard created* k; g8 v: F# Q2 M( o8 S% `# O
secret/kubernetes-dashboard-certs created$ ~, `, @9 N4 h! i& L5 D  M! R. b
secret/kubernetes-dashboard-csrf created
6 j7 t- r! _8 {$ \% wsecret/kubernetes-dashboard-key-holder created
: V$ v& |, v* j$ D1 N7 X! Dconfigmap/kubernetes-dashboard-settings created) }; e$ M' N: z9 W) s! b5 N) x7 ~
role.rbac.authorization.k8s.io/kubernetes-dashboard created1 b0 Z4 h& W$ D8 H7 m6 [# q
clusterrole.rbac.authorization.k8s.io/kubernetes-dashboard created
7 h* u8 ]9 {9 ]& D2 Y( ~8 G' E) w  r3 brolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created. g* ]# J/ ^: j' `
clusterrolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
  n( [$ K5 p% s1 _3 hdeployment.apps/kubernetes-dashboard created4 K9 B. B  K9 A9 w
service/dashboard-metrics-scraper created8 }7 x5 ~0 H% L1 v3 q; o
deployment.apps/dashboard-metrics-scraper created% @7 O: C- M1 |  _1 E' ?+ A
5 s+ F2 a' T- |* `
检查:
  s# b% L" p( x/ i+ I, B
/ U, \  j. R; h3 x4 v# U0 D4 k% I[root@master1 admin]# kubectl get pods -A7 i5 V' I2 y) z( G  B; m
NAMESPACE              NAME                                         READY   STATUS    RESTARTS   AGE
0 }( Z  l$ L4 Y  e) G1 F1 z' ?kubernetes-dashboard   dashboard-metrics-scraper-78f5d9f487-s854v   1/1     Running   0          4m8s+ I8 T/ s' F. `, V5 C6 J) ~
kubernetes-dashboard   kubernetes-dashboard-6bc5cb8879-8zjj2        1/1     Running   0          4m8s" H7 x, D* L) P) d! N$ o4 T* x* g
1( `3 O2 z; s! p( T0 c& C) L
2  w& z- r' H* E0 s
3
2 y2 h' T9 B2 \42 C2 [, s7 ^4 d& H( s8 j
2.3 设置访问端口
: U6 d. P( `: s7 [) V7 }% {5 \  y' L[root@master1 admin]# kubectl get svc -o wide -A4 e' D/ Q+ {! ?6 r6 b/ }, @5 b
NAMESPACE              NAME                        TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                  AGE     SELECTOR
: `7 M5 y! Q0 \5 C% Xdefault                javademo1                   NodePort    10.1.230.223   <none>        8111:31880/TCP           2d23h   app=javademo1
2 r( |& C& Z) ?  h! x0 `default                kubernetes                  ClusterIP   10.1.0.1       <none>        443/TCP                  3d      <none>
5 I5 R9 F- j/ U1 S# y) C5 `kube-system            kube-dns                    ClusterIP   10.1.0.10      <none>        53/UDP,53/TCP,9153/TCP   3d      k8s-app=kube-dns
& X4 f# Q) B1 R2 k! E$ V7 wkubernetes-dashboard   dashboard-metrics-scraper   ClusterIP   10.1.110.33    <none>        8000/TCP                 8m24s   k8s-app=dashboard-metrics-scraper
& {6 ]* `: h$ Z: ^  X7 Q+ `kubernetes-dashboard   kubernetes-dashboard        ClusterIP   10.1.179.158   <none>        443/TCP                  8m24s   k8s-app=kubernetes-dashboard
$ ?$ ]# t/ E, v8 d+ C, K[root@master1 admin]# kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard
- c; A4 l4 @" a7 ~0 M* Wservice/kubernetes-dashboard edited
" Q9 q* {5 |$ H0 B+ D! Q; P; M8 n7 p* Z( N% V3 X
其中的 type: ClusterIP 改为 type: NodePort5 U. S0 L. ?7 N( ?. ]" f

5 C; ~3 |# M7 M4 u1 _, `3 V; b" m1 |7 W
可以看到,dashboard的端口变成了30798( u2 s8 z4 D2 k+ C* U( {
0 y1 t+ h; f+ H- n, x4 r( K
# 命令: kubectl get svc -A | grep kubernetes-dashboard
, j$ r$ j1 k8 C3 C0 t- G# F% W" t" |1 j# 或者: kubectl get svc -o wide -A, L/ t5 C' }1 x7 D0 o1 P
[root@master1 admin]# kubectl get svc -o wide -A
1 v' H% C0 H9 INAMESPACE              NAME                        TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                  AGE     SELECTOR
, S9 E+ m" S* Q' Cdefault                javademo1                   NodePort    10.1.230.223   <none>        8111:31880/TCP           2d23h   app=javademo1
8 z4 R. m4 w& W5 Zdefault                kubernetes                  ClusterIP   10.1.0.1       <none>        443/TCP                  3d      <none>1 g7 w' s: h) D" H
kube-system            kube-dns                    ClusterIP   10.1.0.10      <none>        53/UDP,53/TCP,9153/TCP   3d      k8s-app=kube-dns/ n2 {8 @, |( C$ @) o$ }  `3 ^
kubernetes-dashboard   dashboard-metrics-scraper   ClusterIP   10.1.110.33    <none>        8000/TCP                 12m     k8s-app=dashboard-metrics-scraper
  I1 D' J# W6 f3 g, O" c4 Vkubernetes-dashboard   kubernetes-dashboard        NodePort    10.1.179.158   <none>        443:30798/TCP            12m     k8s-app=kubernetes-dashboard: E* M5 S- w% f/ j9 g, I9 j: p
& _9 a; d! B& `9 T/ |

+ _: w' b: H  w% r4 C( w
! V" u" z( M8 P; r# I2.4 登录
+ {! A& S/ y+ i0 y2.4.1 创建登录用户(masternode), {7 W( v. U1 f: v2 a7 U
URL: https://192.168.8.190:30798/, F* y$ e5 k$ X: {! B* p+ z
创建一个登录账号的文件:dash-user.yaml: V8 I& L& n) B$ g. Y" S4 T
内容: 把一个集群账号admin-user创建出来
& O- U" P1 |. `- q$ Q6 x  j# S1 W3 W5 g  o% V& U; ~6 h) c. b+ Q
# dash-user.yaml
7 W8 `2 y# H$ n9 Z. DapiVersion: v1
' o7 F4 |8 t# mkind: ServiceAccount4 Q: m  ]4 X) U! {( `9 a
metadata:: B7 A5 a1 u4 _9 a4 e/ w% H2 d4 t; Z
  name: admin-user
' z7 t& i1 [- o  namespace: kubernetes-dashboard
; P! U- v+ Z- H, w. o) G---3 n' D* f: s# y: ?: ^, O
apiVersion: rbac.authorization.k8s.io/v1
, r  Z" U! k+ u  A; h2 Jkind: ClusterRoleBinding* W" e; n8 R4 |8 [
metadata:
! c' D9 d% E! s! O0 }6 `6 Q  name: admin-user; N" d# A7 O( ]' O/ Q4 ^' D
roleRef:* @6 j7 l# G8 K. ?9 ]
  apiGroup: rbac.authorization.k8s.io: x5 S9 \# J, d4 @* E6 K5 s7 }# Q
  kind: ClusterRole
7 B6 L' H' y* P2 M' X  name: cluster-admin
3 k/ D6 h0 ~* C9 C1 ]/ psubjects:- E+ w3 g& E; k1 m, s( ?7 d
- kind: ServiceAccount: F0 M4 N2 P3 P/ c8 o( }& N
  name: admin-user
4 z  F9 e9 w0 m  namespace: kubernetes-dashboard
: P! I3 y) J; _+ i1 ?
1 y2 t' L+ O$ s# a9 Q## 应用/ _1 `  U' J2 W# W9 F
[root@master1 ~]# kubectl apply -f dash-user.yaml
& _+ T7 z0 o* ^' }: {8 C: Lserviceaccount/admin-user created
( z6 ?/ C. x7 ~clusterrolebinding.rbac.authorization.k8s.io/admin-user created
: s. u' i9 h0 p4 V% P: R  o9 y' |5 o
2.4.2 获取新建用户的访问令牌
: {* c. S6 N0 [' a2 p+ V命令:. d$ g0 d- N8 q% p- D

. g, w1 G; r7 X! N2 ]kubectl -n kubernetes-dashboard \
/ h. O, K" F1 A' bget secret $(kubectl -n kubernetes-dashboard get sa/admin-user \
: v# ~' j8 H& K-o jsonpath="{.secrets[0].name}") \
4 ]4 v' }- U: ^! C/ x4 L% a-o go-template="{{.data.token | base64decode}}"& g( C; G: z0 m- \% U2 T+ }  C# o

* @* g3 {1 ?( ?' L5 c执行后会出现一串令牌,复制后粘贴在dashboard的token输入框中即可
8 b- q+ |8 w6 R/ _
# c7 H  Z: A. e5 ?. h6 o. ?5 V1 M% l7 ?2 D0 D) h
3. 工作负载deployment9 I5 p5 [8 ]+ S2 D8 e( O( t! o
控制Pod,使Pod拥有多副本,自愈,扩缩容等能力
: d: R8 T0 q1 M3 m2 V8 ^/ l; _: }$ }. U6 T# i
# 清除所有Pod,比较下面两个命令有何不同效果?/ X) z. r6 \0 ^+ G, R( k6 K4 U5 y, {
kubectl run mynginx --image=nginx
  z% ~- y6 x- Z( l: O( ]2 `- D: |" l1 |8 K1 J  |0 r: {5 V
kubectl create deployment mytomcat --image=tomcat:8.5.68
# ^/ y+ k9 D3 B7 g5 ^6 o# 自愈能力
! d+ p9 j$ ?2 G# 删除之后,k8s会重新启动一个tomcat。除非删除deployment
2 I) S% W% ]: g5 i; r* b$ L- }- c8 G& y/ C5 `+ Q  G
3.1 多副本  Q7 H1 C, M6 W$ d  P% A
3.1.1 命令行方式:4 M) N. r2 }2 v6 p4 W
kubectl create deployment my-dep --image=nginx --replicas=3) s' o; P* i1 m0 x' X5 L
$ h% Q8 G* b8 d8 \5 @# L9 W$ A
3.1.22 t9 r# ~0 h7 i; [$ f
yaml文件方式* s& L3 ?& K2 @5 m7 L0 U

% I" Y+ Q  ?: m; z) fapiVersion: apps/v1
+ A! n4 _0 S+ Zkind: Deployment8 S* E( j* j% `9 C* {
metadata:
$ |/ ?2 Q, l' a' o( _2 n3 U  labels:
- ^3 H, }- x8 O- z1 `3 N    app: my-dep6 r' K' t" m* @+ r8 q
  name: my-dep
; `6 z" I+ P& W1 ~3 n+ ?spec:
# w( L) ~+ d# f) |9 D3 a  replicas: 3
% L. _* _3 p7 V. R6 q% g& n* T, n  selector:
4 t, S0 Y7 b& r1 P, j5 |' b; d6 N    matchLabels:
7 ~3 b  i9 x2 ]4 n1 Z' ^0 r      app: my-dep
# K0 w) P' Z; Z5 o: a) O5 u  template:) u9 u$ C; J% i% z: N( y
    metadata:
7 b1 y. j+ C! u8 f" M      labels:
7 D. e. G1 a, N! f7 r( [        app: my-dep
+ p: R' `. M5 J" T    spec:- _* y1 G  q& A
      containers:1 e+ n9 ?$ n1 H5 X0 n+ c
      - image: nginx
8 v) B* j) m/ X: N0 M        name: nginx0 y- Y, Q' b& v8 c6 x+ U: B

2 }4 j7 M6 p5 _3 ]1 `! |3.2 扩缩容
- j9 O$ \) a, s6 F3 s3.2.1 使用scale方式
9 V; @5 X  p* jkubectl scale --replicas=5 deployment/my-dep
7 N1 H( W+ _/ v* d* n3 n6 m: L0 ?6 @+ O# P" w2 G1 H, h; L
3.2.2 修改deployment方式
8 T8 x8 Y- O  B, Ikubectl edit deployment my-dep
0 Z0 W4 D( Y( ?7 @
8 p7 k. k0 ?* X, N#修改 replicas 的值
) g. m' \* `2 {/ {* q1 y+ g2 O
- T, b& X' [. L$ l! s- k( U0 b3.3 自愈&故障转移
' I2 L- ^$ v$ c+ k% j1 R● 停机- Y8 l. `' _& L5 Y
● 删除Pod
/ y, x$ @9 ?# b6 F  e● 容器崩溃
$ y. ^4 t6 n7 B  ]6 T● ....' ]4 T$ |" p: q% n) [
9 P: k, d3 e4 g2 g' O
3.4 滚动更新5 }8 h5 [! G8 i1 f
3.4.1 直接使用命令
) j$ m2 {+ k( Q) l& g% G在以deployment创建一个nginx的情况下
+ F/ N# L0 }3 w! J. l* @4 X; V& n) R) v
; c, i; {; v3 ^## 设置新版本, 该命令会是k8s去下载版本为1.16.1的nginx镜像。  M  r9 n) m6 N5 P. _
## 同理,也可以使k8s去指定仓库拉取指定版本的某镜像(比如某服务的新版本)4 C# x( w& q5 q- F- A9 }
kubectl set image deployment/my-dep nginx=nginx:1.16.1 --record
7 Q' x2 x8 v& _0 f, o! m0 ^3 ekubectl rollout status deployment/my-dep/ a$ E2 o# b9 {  s% T2 g. o

+ T: s/ J" Z( {- y. G3.4.2 修改deployment的内容
, F8 a" Q9 Y9 |- n; y## 修改image的版本% T/ E) x2 D  |1 t+ ^* x5 P
kubectl edit deployment/my-dep
/ N$ ]5 E# F& R) z; ~! ^, {
! Y2 v' {8 `2 y  E( F& G% ~! G3.5 版本回退. T- j1 ?* P3 w# ?3 r$ k
#历史记录
+ X5 b( ^/ Z9 z. a# N8 @kubectl rollout history deployment/my-dep* j" u5 X. [7 A! b7 O

+ d- a. n+ {1 R% Z  b) w4 [#查看某个历史详情
% n0 y  w& @# N: o2 qkubectl rollout history deployment/my-dep --revision=2
- D8 ]4 p+ i+ F; w8 H# z7 E  v4 S3 G( l( r2 w# H" u
#回滚(回到上次): Y* F* d9 m, S- }- d
kubectl rollout undo deployment/my-dep. `! W6 t% W2 k# b4 k( t- E- t

9 O4 ?8 F5 ?$ B* i2 ?: o#回滚(回到指定版本)/ i; f6 X% d' M) t; N  N" [
kubectl rollout undo deployment/my-dep --to-revision=2/ g+ A! d, Y5 m  N: {  `/ Y
1 ^7 z+ ~5 S& f2 w% b. {
更多:" W3 `! T. X( u, q9 }' a% t

0 f" H. J) J& h  u9 U除了Deployment,k8s还有 StatefulSet 、DaemonSet 、Job  等 类型资源。7 L" c; a/ A3 P
我们都称为 工作负载。
9 @3 k, N4 o- L' U( w2 i! d有状态应用使用  StatefulSet  部署,无状态应用使用 Deployment 部署7 v! k) x' `5 w. A  d1 K
url: https://kubernetes.io/zh/docs/concepts/workloads/controllers/
3 D& ^+ S+ R6 W  ]+ \
1 b" y8 U, j/ J0 {/ c4 |; m3.6 工作负载小总结; M- Y/ T& D6 U3 w: I5 x

: _4 S, n  ?+ I4 vdashboard中的工作负载
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-12 00:32 , Processed in 0.017211 second(s), 22 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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