|
|
楼主 |
发表于 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中的工作负载 |
|