找回密码
 注册
查看: 45|回复: 3

Kubernetes集群测试 相关功能测试

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2024-9-19 15:07:15 | 显示全部楼层 |阅读模式
(一)创建一个nginx的测试环境
, k8 z) @) |* Y/ q1 x7 \
+ E* l5 E, m! x7 {9 o创建一个nginx镜像,向Kubernetes集群提交一个Pod创建的请求,控制平面会根据集群的配置和调度策略,在可用的节点上选择一个节点来运行这个Pod。
6 x' T4 Q' h1 H# Y9 \
( o/ F+ q  P; |; I; i; U5 N9 R) D& i4 J1 l
[root@kubernetes-master ~]# kubectl create  deployment podnginx  --image nginx
' I+ X5 h) I% O- B; |7 T' A
3 H; F1 z" H; X" ^" Y, N& a( y& O4 [9 B( c

$ _$ @% L( c9 i8 g+ ~. o2 p[root@kubernetes-master ~]# kubectl create  deployment podnginx  --image nginx
: D4 a8 O  h" R- m0 tdeployment.apps/podnginx created
9 v& f) m+ o: E- x. s$ i$ @- e8 [$ ]0 q4 J- k! L! v2 \. n

+ V( K, D% V  r% h* _6 T
1 U# J+ J! A9 J3 @  _: Z! R' i; N2 y: C  x; D6 n

: H6 |  y+ \) x) H8 @(二)暴露端口" o9 ?. C3 p& Q: B8 L
创建一个Service资源,并将其关联到mynginx Pod,将其与集群的外部网络连接起来,指定Service的端口为80,并使用NodePort类型,NodePort类型会在每个节点上选择一个端口,将外部流量转发到Service的端口上。3 _' ?0 A7 y9 C7 R! G7 ^

/ k7 g# h( Z5 @- p0 k- Q! ?! a0 C/ V. m, q6 y- j

* q; V/ {" J! D! \[root@kubernetes-master ~]# kubectl expose deployment podnginx --port 80 --type NodePort 0 ]% y$ P& D0 X1 u% P- s
service/podnginx exposed" Z7 G) R' p# t

4 A# {3 B1 L5 m' c$ n4 [+ J  I2 ]6 Z1 [6 g; s6 _# O
[root@kubernetes-master ~]# kubectl expose deployment podnginx --port 80 --type NodePort
- x8 O1 t: V: u4 \service/podnginx exposed. n9 k" V; T' h  @, @' G
[root@kubernetes-master ~]# kubectl get  svc -A! t! [, v; G9 D; C% b8 U( a7 i2 C
NAMESPACE              NAME                        TYPE        CLUSTER-IP        EXTERNAL-IP   PORT(S)                  AGE! f( U! ]) u  p% D
default                kubernetes                  ClusterIP   100.176.0.1       <none>        443/TCP                  47h
' y, {) B* \2 ~: O9 tdefault                podnginx                    NodePort    100.178.184.66    <none>        80:31855/TCP             47s/ e4 H, Y5 V" A. O- [
kube-system            kube-dns                    ClusterIP   100.176.0.10      <none>        53/UDP,53/TCP,9153/TCP   47h/ @, _7 t& O$ I- r, U0 H2 O8 B, y
kubernetes-dashboard   dashboard-metrics-scraper   ClusterIP   100.184.128.141   <none>        8000/TCP                 22h
# @  H" x+ Y% u  H4 F, S4 D; mkubernetes-dashboard   kubernetes-dashboard        NodePort    100.186.249.64    <none>        443:32333/TCP            22h9 I5 ]/ G9 ^; V/ [8 R
. w: p6 R. }8 {$ S% @

; c. ~/ t7 ^5 L$ s$ j
0 A; h1 |! P& y7 b: H[root@kubernetes-master ~]# kubectl get pod,svc/ r/ D( [/ J* w* {
NAME                            READY   STATUS    RESTARTS   AGE5 [* T4 v$ V! C$ m8 `- E6 f3 j
pod/podnginx-7c985cd598-pssgw   1/1     Running   0          3m21s
* C. d1 H- [- h2 p' }- t
, O' Z8 r" C# X% K- SNAME                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
# u0 l3 R; o: i* Q7 i3 G+ Nservice/kubernetes   ClusterIP   100.176.0.1      <none>        443/TCP        47h
+ o8 X: o0 p: O1 K& Gservice/podnginx     NodePort    100.178.184.66   <none>        80:31855/TCP   2m25s
/ n# q* o7 z2 N0 b
- v9 U7 L9 c; [3 P0 P  z: e- D6 J: n6 B2 K- \0 E
(三)访问nginx6 i1 w! N8 n0 k* H* s, K
通过浏览器访问任一节点的IP地址和暴露的NodePort端口,可以访问到nginx服务,说明测试成功
: i3 [+ Q1 o9 d5 }7 a
% d0 Z" T* l$ a- |1 w( n[root@kubernetes-master ~]# telnet 172.24.110.182 31855
, m. @; }0 O! c: l# j" N2 o3 f0 rTrying 172.24.110.182...
5 v. ~0 S! @1 {. a: X) t7 I! ?1 \# |Connected to 172.24.110.182.4 ~- B, s9 s; u, O' i
Escape character is '^]'.
# [0 }; S3 S$ {1 M$ [; R. J1 D0 L' u  h$ B% J& d* |0 ^& J

5 O" C* [1 L6 T2 V7 g8 y& ?8 w" U* [  u+ F8 w

7 S, R+ N1 _" x0 s, h& Z3 C[root@kubernetes-master ~]# curl 172.24.110.182:31855
' i& @+ q; A% d- \6 a) Z/ E<!DOCTYPE html>
6 I; n# `- v. l$ @8 N9 h<html>/ I) B3 b" W( \# _1 k1 C
<head>
. H% u, H  H& a9 \  @  K<title>Welcome to nginx!</title>2 r& g( g' r! s) U' f
<style>
+ e. ]( i' ^$ t/ ]* d8 Hhtml { color-scheme: light dark; }3 C9 l- l) [) [3 b# T7 Z
body { width: 35em; margin: 0 auto;
, O* S  j# t' lfont-family: Tahoma, Verdana, Arial, sans-serif; }. @: A; m* C- O3 m/ w
</style>( ~# L8 L& f. t/ K, D
</head>$ w# ?0 P0 G8 |" i1 l! {" s
<body>
2 T$ e1 M+ i- {4 l& G; ~( g5 h) G<h1>Welcome to nginx!</h1>
1 _) C4 P2 R4 [2 T% s2 S4 ?7 o<p>If you see this page, the nginx web server is successfully installed and
; H6 ], h" `  Zworking. Further configuration is required.</p>
) Y0 N$ k1 H" r& W0 F$ U
) c- W9 i" M5 V- S; @$ Q1 m! p<p>For online documentation and support please refer to
# Z6 x  `/ I1 b" }<a href="http://nginx.org/">nginx.org</a>.<br/>+ ?/ v& _' G7 x# d
Commercial support is available at* {# n$ n! K' P2 Q$ t/ c
<a href="http://nginx.com/">nginx.com</a>.</p>* ]6 Z* d5 C0 q, G! m

" X6 @& q/ m7 f+ {<p><em>Thank you for using nginx.</em></p>" X+ [& J. p' Y; v/ a7 B
</body>6 m; K4 B1 J% Y' ~4 k& S
</html>) q- z. e2 j0 B3 t. X

: w8 C/ B0 {- q8 D2 y, H6 \
, a$ u! s4 x# D7 H: w) B7 r; j+ {测试成功。
  u* k7 w6 E9 ~  `

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2024-9-19 15:12:00 | 显示全部楼层
[root@kubernetes-master ~]# kubectl apply -n kube-system -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version|base64 |tr -d '\n')"3 i$ l' ]% m5 i& c6 U8 }7 k
Unable to connect to the server: dial tcp: lookup cloud.weave.works on 114.114.114.114:53: no such host
/ n5 S% B6 N% {6 T* x! w  }* u$ ^

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2025-1-13 10:56:52 | 显示全部楼层
[root@k8s-master src]# kubectl create deployment podnginx --image nginx 1 K2 R# W( s" j+ m/ u
deployment.apps/podnginx created( m& n+ |3 R0 P7 M1 A1 z/ C  u
[root@k8s-master src]# kubectl  expose deployment podnginx --port 80 --type NodePort
9 p: J6 y/ q! X2 i$ Y4 @9 `7 sservice/podnginx exposed6 l$ r1 l9 R8 `% u" V. q* r
[root@k8s-master src]# kubectl get  svc -A
5 `& y! Z8 t% Q% j, h. e, iNAMESPACE              NAME                        TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                  AGE
# _1 N/ Z  z2 |  _default                kubernetes                  ClusterIP   172.29.16.1     <none>        443/TCP                  3d17h
- T! ~1 R% j& B8 _+ S2 h2 w1 J+ _. _default                podnginx                    NodePort    172.29.18.205   <none>        80:30166/TCP             32s
; K2 l  f2 C( l7 M  T) {kube-system            kube-dns                    ClusterIP   172.29.16.10    <none>        53/UDP,53/TCP,9153/TCP   3d17h7 v$ e; Y3 m2 z1 z5 G' x/ t
kubernetes-dashboard   dashboard-metrics-scraper   ClusterIP   172.29.22.180   <none>        8000/TCP                 2d17h1 i4 K) T4 F* ~9 e( F& f9 m$ Z# Q
kubernetes-dashboard   kubernetes-dashboard        NodePort    172.29.20.180   <none>        443:32333/TCP            2d17h% L2 \9 a5 v+ _- Q7 A" s3 _, H
[root@k8s-master src]# kubectl get pod,svc
- Y0 v6 h& M7 FNAME                            READY   STATUS    RESTARTS   AGE
+ v- m" ~8 c  K6 I! tpod/podnginx-6c6fbbbbb4-zzjg6   1/1     Running   0          2m3s
! X" F( Y6 N' @2 n  h. V
9 Q3 t' T% F% c* LNAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE3 y  s$ _4 L" x1 a6 w0 q
service/kubernetes   ClusterIP   172.29.16.1     <none>        443/TCP        3d17h
! i' f& }% h/ B1 L7 \9 Uservice/podnginx     NodePort    172.29.18.205   <none>        80:30166/TCP   65s% K+ {* x* p/ g# N" z6 d
[root@k8s-master src]# 8 ^. O  d5 z' W  t) Q4 p5 `
' [, b5 w. \4 |" m3 f
# W% T- [7 j: @0 Q6 h7 ]! ~  v

2 }, H6 c% F3 t! |! Q* u检查端口是否正常:4 b7 M. u' a$ L9 `# H( C9 O3 s
[C:\~]$ telnet 192.168.8.190 30166 . A% i$ X: m& U3 o& J/ ]

' B$ |5 i+ o7 G: J1 b% o
$ l2 G  R8 v+ r7 \Connecting to 192.168.8.190:30166...
7 m8 `1 P7 \) m/ E) [7 SConnection established.+ G( a6 L/ X) h' L+ C0 ~1 M
To escape to local shell, press 'Ctrl+Alt+]'.2 b; Q# M. c( ~3 K5 b- `# D; s
quitHTTP/1.1 400 Bad Request6 \9 w- i  D* k/ L6 L
Server: nginx/1.27.3
5 F* M& [2 }+ c/ ^1 }/ j6 V& [6 UDate: Mon, 13 Jan 2025 02:55:32 GMT8 I. d# a6 L- X2 y' b
Content-Type: text/html- P. \: H8 L4 Y) i+ I
Content-Length: 157
4 @! y! I  r5 V& [( ]! R* |/ OConnection: close
& P: d$ o! }( T; F' n. f
& l' Y, M& f) D<html>$ h8 g7 ]! |; U; K9 G9 r
<head><title>400 Bad Request</title></head>
1 }& f8 \# x/ h3 J; N8 H& Z<body>
! W* E; Y. O+ p9 f1 ?<center><h1>400 Bad Request</h1></center>
7 U( u; H/ l& U( b1 ^  S( g& W<hr><center>nginx/1.27.3</center>( Q( j7 K$ e+ T
</body>/ V1 S. N% j" s
</html>: E  o9 @- L* B7 h

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2025-1-14 16:42:47 | 显示全部楼层
环境准备3 H' {$ X" P& S8 d
服务器规划. Y4 Q' s$ o; v: [0 _& m# l
服务器配置即角色规划如下,操作系统仍然选择 Ubuntu Server X64 18.04
% b4 W1 _7 g+ ~& h192.168.90.31 4核2G 40G硬盘 Kubernetes server1 Master 主) [2 `: \5 e  r( i" `4 R+ e
192.168.90.32 4核2G 40G硬盘 Kubernetes server2 Master 备) }6 Y" P6 y* x3 m/ e
192.168.90.33 4核2G 40G硬盘 Kubernetes server3 Master 备
9 G0 @  Z( V2 v+ t2 I& w& \, y192.168.90.34 4核2G 40G硬盘 Kubernetes server4 Slave
8 f/ Z) I  r, {& x- H  D192.168.90.35 4核2G 40G硬盘 Kubernetes server5 Slave
& u4 e& p' d5 i( y$ n! D192.168.90.36 4核2G 40G硬盘 Kubernetes server6 Slave9 O) t6 _$ L( ~3 H: O

, M, R2 o9 S- @- X( L1 P三台master节点通过 vip 192.168.90.100 代理访问
) d- `4 c  V: g6 U6 @! h
$ i3 S3 f# b$ P8 h  T: a; C环境准备
0 |  A* L8 `& D  |% G8 E3 l+ U3 v9 ]按照kubeadm安装K8s集群 中的步骤,安装一台虚拟机并完成初步配置工作,之后再做如下配置:
8 T& B) E& E! l0 B同步时间
2 H$ |/ z( N6 I" q% ?! F, P! f) r设置时区选择亚洲上海
0 R! t0 `6 t" g) Z2 S; W3 B5 `) r, P, j9 k0 f6 X
eric@server1:~$ sudo dpkg-reconfigure tzdata6 z" x7 Y2 ^5 ?! }0 M/ Z+ \
[sudo] password for eric:/ }- J- D6 {% I3 S' ~3 G

2 i, I6 e# e* Z, @" j$ }! ECurrent default time zone: 'Asia/Shanghai'
: u, c( ?4 M* VLocal time is now:      Mon Aug  9 23:05:09 CST 2021.
- f, e" t2 ]3 ?  L$ hUniversal Time is now:  Mon Aug  9 15:05:09 UTC 2021.
$ u7 r! B- x1 F+ X1 O1
% u9 n4 C1 |) X6 h$ v% X2' A1 j' e& L# {5 J& y$ P/ A) P
3- f* a* J5 a7 W" `' ]$ f# _
4  U3 v2 z3 F, T1 e: P
54 C# a# |3 K/ @9 m* `
61 \+ z: p1 c0 \9 ?) W
eric@server1:~$ sudo apt-get install ntpdate  --安装 ntpdate8 {* o+ x# J6 t
Reading package lists... Done
4 |5 D+ j. t0 l5 f; V$ Q2 d3 s8 g......
4 i* q4 s. ^! @! }/ D6 ceric@server1:~$ sudo ntpdate cn.pool.ntp.org --设置系统时间与网络时间同步(cn.pool.ntp.org 位于中国的公共 NTP 服务器); P0 t$ ?' \" c  U
9 Aug 23:06:30 ntpdate[33117]: adjust time server 202.118.1.130 offset 0.007500 sec
5 ?( n, a+ @0 }1 `eric@server1:~$ sudo hwclock --systohc  --将系统时间写入硬件时间9 V& n/ W* J7 c4 }9 C
eric@server1:~$ date  --查看确认时间5 M/ a, ]; i0 T1 H; O
Mon Aug  9 23:06:49 CST 20214 |* P. g  g4 n
1
1 A3 C7 A$ ~6 f/ I) e% H! D$ I% A7 v2/ F' d: a$ e& g. d7 f
3, p7 ^$ n" N. A4 [
43 V6 `. {* y) G7 C* ]
5
% h% _. X( x" W6 q1 g6
5 U) O  C; x8 f8 ~. u8 J( ]4 z7
. L9 K  e4 J' v$ j9 r& k# N8
6 J7 T& a6 C" l& \配置IPVS4 ?4 f0 x, i* C7 O8 G/ q* A

) x. x) x3 z; Y  Heric@server1:~$ sudo apt-get install -y ipset ipvsadm  --安装系统工具
6 r# R8 m+ b- @) s- eReading package lists... Done! K- Z# \% T, F2 U, B" K, C
......( }8 {) ^+ @3 A. G, H& J
eric@server1:~$ sudo mkdir -p /etc/sysconfig/modules/   --创建目录  配置并加载ipvs模块& N  o$ O/ ~* c) I! E* o
eric@server1:~$ sudo vi /etc/sysconfig/modules/ipvs.modules --编辑文件并保存; k; v, ?* _% a/ D: B
modprobe -- ip_vs2 Y2 y$ R/ q( h% _8 v
modprobe -- ip_vs_rr
/ S$ B' X7 m# t% D4 C$ G! O, H9 fmodprobe -- ip_vs_wrr+ Z5 x; {4 N. h5 z
modprobe -- ip_vs_sh
- l# ~& W3 ^- ~6 K  r7 dmodprobe -- nf_conntrack_ipv4) a  N* V; f( u; L: t& a
4 A0 [# x4 g3 n4 N1 ?
---切换root用户执行脚本否则报错
& K+ I0 Q  D8 }6 X; M' t% e8 K, |root@server1:/home/eric# chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4: `* }1 J- m2 G; A+ d! c8 A/ z1 _
ip_vs_sh               16384  0
& U: \# t& x4 a& G" [ip_vs_wrr              16384  0& H1 D4 b5 w: v  }' H
ip_vs_rr               16384  0
7 z! @) b) p* B4 H4 ?ip_vs                 151552  6 ip_vs_rr,ip_vs_sh,ip_vs_wrr- D  B* E7 ]9 ^8 r, L- p1 y
nf_defrag_ipv6         20480  1 ip_vs' K9 }% X0 v/ Q" ~( c
nf_conntrack_ipv4      16384  48 X4 y- ^. D  X) X2 R; v
nf_defrag_ipv4         16384  1 nf_conntrack_ipv4
+ p+ J( x0 t' K6 D$ tnf_conntrack          135168  8 xt_conntrack,nf_nat_masquerade_ipv4,nf_conntrack_ipv4,nf_nat,ipt_MASQUERADE,nf_nat_ipv4,nf_conntrack_netlink,ip_vs
5 ]8 H% k0 M2 mlibcrc32c              16384  4 nf_conntrack,nf_nat,raid456,ip_vs4: [) `" c2 p9 o* M! Y, Z2 l. E/ Q; {
' G/ R* m: J. u( E& I

: l0 U: ^: o8 [- d8 ~; O14 v" U% F2 J; _4 v
2
! [# q" O/ M/ i4 N* Q) ^3
2 n5 B4 p5 L* x, ?. `46 S! h6 ~  A! R. N2 O: h- E2 V) \0 G1 _
5
, F! s+ B- ^5 j$ H/ g* I6
! k# m  o# `2 k78 I' o, g' a; B
8- }5 n3 ?4 W+ P8 p$ A& H
9
, J: [9 @& s' A10
' @6 d9 W+ r, D9 a$ `11
% |9 E4 b7 f+ H12
2 l9 f8 U" u1 o2 r13# d3 f8 J9 R# L- G
14
  z8 v2 b/ |8 G7 Y, @9 M3 S15, `: T6 ~* V% W2 T
16; d8 S& d' Y' ?; }0 J# |
17
1 \" K( z7 H" S; B  |4 S18
. g% V5 Z4 n0 v% l  A# c) q* i/ I19
% g- E3 {( T/ P/ `& ]20% W$ g9 z) j, n2 }5 s( ~# P
21
$ x5 y- n9 \/ ]7 d22
7 ?/ d! C9 g" m! T6 e7 E1 c* S23
  ^. w9 h, V/ X3 u/ ~& N: G7 N4 n8 w配置内核参数$ V! U  m3 F$ t" w" O

- ~" y; }4 K/ Xroot@server1:/home/eric# vi /etc/sysctl.d/k8s.conf  --编辑配置参数
( _- w4 ]8 q4 b4 r2 _) L6 _) U  enet.bridge.bridge-nf-call-ip6tables = 1: |: e! I6 T5 z; o0 c
net.bridge.bridge-nf-call-iptables = 1
  K* R3 N% N8 H1 w' jnet.ipv4.ip_nonlocal_bind = 1
' Z: X' q6 g; g* q% I- Mnet.ipv4.ip_forward = 1# u2 H* L& r6 U+ O" Y0 ^
vm.swappiness=0, q, C8 f$ A4 i4 h
root@server1:/home/eric# sysctl --system   ---应用参数7 P' a& x0 j1 A/ a8 H
* Applying /etc/sysctl.d/10-console-messages.conf ..., ~( P! r3 y2 P) j* e
kernel.printk = 4 4 1 7
8 l: m/ Q* s) P* Applying /etc/sysctl.d/10-ipv6-privacy.conf ...) s! i% R9 L( k- j7 b+ i
net.ipv6.conf.all.use_tempaddr = 2
/ ]; x2 E- @6 |; F8 |5 Gnet.ipv6.conf.default.use_tempaddr = 26 V" q+ _/ E' f
* Applying /etc/sysctl.d/10-kernel-hardening.conf ...
2 B$ ?# J5 c1 K0 B2 L! K......
( s. B; ^9 |4 w. n. e# ?/ f* Applying /etc/sysctl.d/k8s.conf ...   --生效7 Y# B! O  z/ ?  y3 q* Z
net.bridge.bridge-nf-call-ip6tables = 1
( y- \$ P7 F( z: nnet.bridge.bridge-nf-call-iptables = 1
2 g7 O4 h" m" h2 Z  Pnet.ipv4.ip_nonlocal_bind = 1
: u1 A! x- V! }4 u. f! V4 W2 o' Dnet.ipv4.ip_forward = 1& B6 X, b, I: a! x; B
vm.swappiness = 0
5 ^$ f$ m# }9 M9 R2 I
( P# x; `; p/ D0 a% b' G1
, T$ d) z' s, F2
( a9 o, X+ n3 `0 I3
# l& R: t! F1 ]/ i+ H) i- R4
9 D2 H8 G# C9 e/ P( Z* W1 M5
: k5 H! f; `# K7 P6
3 o1 n# q2 T1 {  |! C7
9 f4 I& [- Z' L! \: D% f3 J2 j81 R" N5 @5 Q: L( y
9
$ M8 M8 X8 U- ~$ |, j5 N+ ]0 z% s& F10+ t! |( ~" ^3 y" g0 i
11
% r( ~6 `3 M' C! {! f, u9 ]% O- ?12+ s' l+ t% s- E$ ]
13
/ }4 K! N" [$ |14
2 q: |& F1 [5 b  U8 q7 F15( b$ U2 \/ u+ E- ~  N0 S) T- s
16% V1 |' [) {: w8 X
17  \6 z! y/ G  t3 w
18
/ L" L! u# {1 Y- x' Z% h* b19
6 w; \2 z) d! q! _( D20- |, g8 Z. `4 J: z1 V
修改 cloud.cfg
8 D- L# \8 u: M" ^' L0 j/ s  }1 y* o
vi /etc/cloud/cloud.cfg
, u, j/ O( ~. I* }* ~7 g# 该配置默认为 false,修改为 true 即可1 o( g1 }( [, g8 O0 Q+ ]+ ^
preserve_hostname: true
$ i% a9 s% m$ Y1
) s& w! {' v6 S% l2- A' M/ [2 Q8 }" ?$ q
3' L% u/ c: m$ m+ s, w+ N
克隆虚拟机并分别配置ip和主机名
- e: {$ X/ c- z+ J* W3 B$ A$ G% N4 |! |/ i$ l, L3 k
hostnamectl set-hostname server1  --配置主机名命令
! p$ f. ~9 h/ I9 U! N6 s17 f: X( `0 d6 c1 s' d
ip配置:找到并修改如下文件,修改保存后 执行 sudo netplan apply 使生效- ~: G: w3 E; U! z9 u% w' _
$ D4 g. y* H# _$ ]( `
eric@server1:~$ cat /etc/netplan/00-installer-config.yaml+ t/ R" c2 g4 z$ J( A2 J5 S0 F
# This is the network config written by 'subiquity'& d  H) d; J6 Y
network:
7 B4 i+ p0 d/ r, f. k' v) ~; J. S  ethernets:8 F1 x4 S) i" H* M3 _
    ens33:
6 n/ J& M8 k7 d* \      dhcp4: false: s7 K' N# u8 y0 c
      addresses: [192.168.90.32/24]4 l" Q: ]" z0 L6 }% H
      gateway4: 192.168.90.1" m) ?9 ]; m2 z4 G% L
      nameservers:
0 O7 S+ b3 r  c              addresses: [8.8.8.8]
! f& e6 w6 E7 ~5 E& A  version: 2; ~8 [+ y1 j# b0 g; b
1# g$ @& ]- g9 w; f  {# ^& P8 G, P
23 A. h5 j+ P3 k( U* }9 g
3* f4 p' x/ m* o4 y2 ]; X& V
4+ |* J0 i, m& }; U
5: ?$ Q( {* W  N5 u% Y/ O* Z
69 E' \2 ]5 F* I9 U0 Z/ T
7; c7 y2 \' t* ?) `5 ~
8
9 d, f7 N% c" `2 k: [8 ~% z/ L94 h! W: B9 N0 O$ A3 `' B  q
10
5 ~% ^: I# y3 p) [11* S" K) g, a- x6 t) G7 P
高可用原理
* G! @9 f  a' c, D) N! ~% O% lKubernetes Master 节点运行组件如下:
/ a. J% @2 F+ s" s2 l& U: c8 }kube-apiserver: 提供了资源操作的唯一入口,并提供认证、授权、访问控制、API 注册和发现等机制
$ D1 _( u) S9 G2 \3 ~2 Xkube-scheduler: 负责资源的调度,按照预定的调度策略将 Pod 调度到相应的机器上
9 H: `. `; l& N; K! L: Gkube-controller-manager: 负责维护集群的状态,比如故障检测、自动扩展、滚动更新等7 @5 _- V, \( S3 k! a& {( N9 g
etcd: CoreOS 基于 Raft 开发的分布式 key-value 存储,可用于服务发现、共享配置以及一致性保障(如数据库选主、分布式锁等)
5 |/ K0 k- P' W6 x7 U+ y" K. k
3 j3 K- \" _; K; }; Nkube-scheduler 和 kube-controller-manager 可以以集群模式运行,通过 leader 选举产生一个工作进程,其它进程处于阻塞模式。
8 F1 N" p2 U/ q0 vkube-apiserver 可以运行多个实例,但对其它组件需要提供统一的访问地址,本章节部署 Kubernetes 高可用集群实际就是利用 HAProxy + Keepalived 配置该组件$ r/ W" [7 f& s7 B* a+ ~! N) J# [" p
配置的思路就是利用 HAProxy + Keepalived 实现 kube-apiserver 虚拟 IP 访问从而实现高可用和负载均衡,拆解如下:
: M) f4 ^6 P7 i1 l1 i. ]Keepalived 提供 kube-apiserver 对外服务的虚拟 IP(VIP)
1 f5 X& q0 |& w& V/ [( X0 }HAProxy 监听 Keepalived VIP" n7 M- v( z9 A) G
运行 Keepalived 和 HAProxy 的节点称为 LB(负载均衡) 节点% _9 {9 {$ t% ?; n& O4 h: h+ c
Keepalived 是一主多备运行模式,故至少需要两个 LB 节点
% A# E/ c2 t2 c& Y6 X  cKeepalived 在运行过程中周期检查本机的 HAProxy 进程状态,如果检测到 HAProxy 进程异常,则触发重新选主的过程,VIP 将飘移到新选出来的主节点,从而实现 VIP 的高可用3 b; j) e1 L7 S: C* a7 v- R4 S$ p: m
所有组件(如 kubeclt、apiserver、controller-manager、scheduler 等)都通过 VIP +HAProxy 监听的 6444 端口访问 kube-apiserver 服务(注意:kube-apiserver 默认端口为 6443,为了避免冲突我们将 HAProxy 端口设置为 6444,其它组件都是通过该端口统一请求 apiserver). M  c$ i/ O& O4 w2 M, h
5 w( h& n+ A% U$ ]( V8 O1 G
9 Q+ l5 w; X1 ?$ f* B4 G; ^8 j( W

! G* G# W% |5 k/ @% P" R安装HAProxy和Keepalived
' i7 P2 x$ @+ u- r  f. r3 _/ {HAproxy启动脚本4 _, O5 j( V. R( k) B
master1节点创建HAproxy启动脚本,并设置执行权限
2 j% O$ C* v' E4 C$ `0 p: \6 J& m7 \
sudo mkdir -p /usr/local/kubernetes/lb) B0 {, D/ l) V
sudo vi /usr/local/kubernetes/lb/start-haproxy.sh
: `, Z+ b2 ~1 z+ z1 g% H4 |
2 y9 k; Q$ f4 o) F# 输入内容如下
& _3 o  `0 `9 g- K7 s! |#!/bin/bash
7 h- L. o. b7 n  E2 j# 修改为你自己的 Master 地址
1 f1 ?, p2 o" Z) |# n7 D4 ?MasterIP1=192.168.90.31
! @( u/ v) k( Y* G( n& {- e/ U, yMasterIP2=192.168.90.32: r; v7 E- E* Y  K0 r2 [2 W
MasterIP3=192.168.90.335 i$ v1 D  T, _4 p$ p
# 这是 kube-apiserver 默认端口,不用修改4 `6 A" y$ _! M6 z# _
MasterPort=6443' v! ^; |1 j5 k3 p, A! \# q
0 O  a4 x- ?- X% H/ N9 w* W
# 容器将 HAProxy 的 6444 端口暴露出去% R# j" v1 Z5 q% k9 g* H
docker run -d --restart=always --name HAProxy-K8S -p 6444:6444 \' R! R- q$ g5 v$ J- c, L( W
        -e MasterIP1=$MasterIP1 \4 x$ ~& S4 X8 ?7 |+ K
        -e MasterIP2=$MasterIP2 \, b0 j  Y. R2 R* |7 N$ m" U* K
        -e MasterIP3=$MasterIP3 \
% \: i& |; X; D5 b( j        -e MasterPort=$MasterPort \
" E# z9 p. M& N$ ^        wise2c/haproxy-k8s
. I, C8 C8 v$ s, q/ E" U$ G, C2 o) j
* P) r2 F. s: I; n5 k# 设置权限4 l' w5 R6 p0 L; A6 v7 U4 A9 E+ C
sudo chmod +x /usr/local/kubernetes/lb/start-haproxy.sh; ~6 m( a# X) u

, {4 p/ ]0 I5 j) P$ l% @1' y  B% {. E; J& Q) _0 Z0 @
2
" R( b# B2 m7 ~" u39 d0 W$ d- Y; a/ C+ Z3 p
4. q, s4 H) T2 }$ C. }$ Z. W' N
53 N( ]' i# O4 ^' c0 u5 M
6
$ N9 L9 w; Q) Z7 }7+ `& v% N5 Y5 k# S1 }
8
$ o$ ?) |+ }; B! m3 j& e9 B5 }96 {+ u: p% \! e& T
10
! _4 b/ k2 c# `. R11
: G- O+ G9 Q4 Y1 ?) U0 c12- m  R0 y+ s+ {6 _
13/ d) Z) q. \: ]0 v$ Z: O0 e
14. L+ O) h: Q8 f' B
152 K% X: f4 b$ t1 `+ F
16; C: e1 }4 i0 W& p4 F2 v
17
2 w! W2 Q# o* m9 D7 b0 l3 |18
: H6 R. g( h2 R3 |, X4 o190 M; l, w6 F( D! m
20. G5 l8 A2 i2 [
21: t) i+ a& J& `8 o2 _# S: C
22
  r$ _: c( ]( G' d/ f- t( PKeepalived启动脚本
1 K2 [  y4 P% ?5 `0 ~, Zmaster01节点增加 keepalived启动脚本,并添加执行权限如下:
0 @3 Q/ B+ R6 v. h: f# _
2 A- Q/ o2 C  ssudo mkdir -p /usr/local/kubernetes/lb
' S  E: T" M' }( E! \sudo vi /usr/local/kubernetes/lb/start-keepalived.sh# L! Z% a# x2 w" T; {! r) T3 A
# 输入内容如下
1 c% z+ ?) a1 y0 `" j  u#!/bin/bash
5 U, [' i% k3 o/ M: D& e$ N. T& ]3 o# 修改为你自己的虚拟 IP 地址
6 @7 {' E# ?- ^4 c; W: IVIRTUAL_IP=192.168.90.1007 {8 @, Z  I. d
# 虚拟网卡设备名
8 X6 M  w  g7 T) r% I' aINTERFACE=ens33
0 R9 s# v$ r! ]# 虚拟网卡的子网掩码  I0 k* H+ H$ @
NETMASK_BIT=242 i2 ^. s; D% p9 z/ a* P- h3 B
# HAProxy 暴露端口,内部指向 kube-apiserver 的 6443 端口
( f" s: L' N4 wCHECK_PORT=6444
$ |, Y% M) C0 t, \" R# 路由标识符5 R8 ~. X5 ]( Y" r
RID=100 X2 K) X- q7 |( L# U) \1 s
# 虚拟路由标识符
4 c* `' A: p" F4 F% X1 t4 ]VRID=160
1 ?8 ?8 u7 J. _# IPV4 多播地址,默认 224.0.0.18
2 j$ J9 y# Q0 P' ~) ~3 L4 R: t2 u9 MMCAST_GROUP=224.0.0.18, `. ?# E# {* K
docker run -itd --restart=always --name=Keepalived-K8S \
: _: d; W6 j( ?7 Z# Q4 F1 F( a        --net=host --cap-add=NET_ADMIN \3 Y+ m) ^5 h5 n( h. ]. J' K
        -e VIRTUAL_IP=$VIRTUAL_IP \
$ o7 _! F$ E, D        -e INTERFACE=$INTERFACE \
: h/ ~) y, ^! ~5 h5 {' c+ V2 J5 B        -e CHECK_PORT=$CHECK_PORT \: `* g, q* h% `% W; T1 m' _
        -e RID=$RID \
2 S/ B* C2 }3 I- ?0 O        -e VRID=$VRID \5 }9 f1 g$ o  T( x: R
        -e NETMASK_BIT=$NETMASK_BIT \
/ ]8 z% H; r6 G. z/ r% T  x4 v        -e MCAST_GROUP=$MCAST_GROUP \
! J) N1 _4 `( @; j* s; G4 x6 \        wise2c/keepalived-k8s: W0 A9 {- R8 ~1 G2 u7 e
# 设置权限. i* Y: R1 Z' w: y  \: |- i& A
sudo chmod +x /usr/local/kubernetes/lb/start-keepalived.sh5 k7 n7 ?% |( ?1 U  M+ e

) u" m, M3 u! j' B1
* R6 T* p. I% ~2- @. R) H. b; l% p2 E
3
1 K- V9 @2 {) K5 v9 y43 {# u7 W( a/ }7 F" Q6 D
5
; N, C0 s0 T; a6 e62 W9 G5 B( ^- U( ^' ^
7
5 r! c' V9 w8 G# H! S8
0 g4 A. I- Z# a0 a9
7 F, b3 c& f0 O- m' Y* w; ^9 m10
4 K: y7 H* r- I7 O0 ~0 f11& x  M' f, W1 @; f2 n2 @
12
6 r* l1 K! a# k, n13
( P& O; }9 J, u0 q' O8 @0 X1 I149 b! M# K4 O( d7 E% r$ J
15. f8 Q: z: s7 ?% }" t
16
8 b: l) S; H# a3 Q1 T17$ O0 _, L' s( p
18
$ w% `3 E5 B2 D5 |; G19$ h; h2 E% l% u/ o
20
# K2 b( }: p, C$ z/ K. j+ r5 t* q21: X* n9 l, R3 O7 y: e
22
1 o1 J% n* s/ @: }. C( o23
# f$ @$ ~$ Q) F1 Z24
8 K# `7 A  Q0 q" ~% y) L25
8 d/ z; u/ A1 H9 j0 K1 q% p264 d! z6 r; n) }( }. b
270 ]; {! v. [0 F% D3 Q
28
$ a# m/ ^8 S* j. D! M6 j7 b+ d29
1 L. O5 x2 D7 w6 [) f- ^8 }4 L30, S0 c9 y5 @7 u# m3 P( r% h) }! {
复制脚本到其他两台master9 E6 _" Y& j: N! M  v$ n
32 和 33 创建 目录 ,并复制脚本文件命令如下
* F+ N! E4 B- E9 L, D+ A7 _( }2 E- ?. y1 ~8 a9 M  K+ j
sudo mkdir -p /usr/local/kubernetes/lb6 ^& l; H1 d. g8 V2 Q2 r* |
root@server1:/home/eric# scp /usr/local/kubernetes/lb/start-haproxy.sh /usr/local/kubernetes/lb/start-keepalived.sh eric@192.168.90.32:/home/eric   --先复制到服务器 再到服务器上复制到指定目录
  s7 _9 S! P+ N, N& ?" U5 @root@server1:/home/eric# scp /usr/local/kubernetes/lb/start-haproxy.sh /usr/local/kubernetes/lb/start-keepalived.sh eric@192.168.90.33:/home/eric+ a9 ~# {" ^& w4 q2 D1 `
eric@server3:~$ sudo mv *.sh /usr/local/kubernetes/lb
* V4 J! {% B/ y; Q2 M4 F1
7 j! H# A( T3 c( U  Y! X+ I3 U2
' Y" e2 w' W: k& A3
: ^& p9 |# u/ h+ c3 r! W: L1 e4' [. N  l9 C4 J
启动容器; Z' A6 m6 s) G
三个节点分别执行如下命令,docker 会下载、启动 haproxy和keepalived 镜像! Q  O, H( K+ M+ i/ m

) T4 y1 X! y' V& I3 k# z* ^, [* ?sudo sh /usr/local/kubernetes/lb/start-haproxy.sh && sudo  sh /usr/local/kubernetes/lb/start-keepalived.sh
+ r/ X9 C* d5 y1
4 _% r- f/ J9 J! A+ J检验容器" m3 }/ l* }: z7 k( G4 ]
三个主节点分别执行 docker ps 可以看到 haproxy和keepalived 正在运行如下:
" |- v) B0 E- Z/ t9 t
6 {1 I1 A4 w! y3 x+ M, ^root@server1:/home/eric# docker ps
9 ]; ~; K$ \/ y5 j' A) W$ \3 `. NCONTAINER ID   IMAGE                   COMMAND                  CREATED              STATUS              PORTS                                       NAMES5 V3 S  M  {5 X# q7 B, f9 o9 E
2ee95ae52da6   wise2c/keepalived-k8s   "/usr/bin/keepalived…"   52 seconds ago       Up 51 seconds                                                   Keepalived-K8S
2 @+ H( s6 }( g: q. A0 @- x* C97db17bc81c7   wise2c/haproxy-k8s      "/docker-entrypoint.…"   About a minute ago   Up About a minute   0.0.0.0:6444->6444/tcp, :::6444->6444/tcp   HAProxy-K8S
1 c8 V5 O$ m1 P4 O. Q" @7 j1
! i0 K8 S1 ~0 ^+ e2 q# e2
+ N1 x; Z* Z2 a3
/ J$ w) f: f. w! ^3 v8 v6 P4
# W# z( C9 z8 j5 \- p- N虚拟IP验证1 n! Q. b. K9 v- `0 j1 @
31、32、33 三台服务器 执行如下命令,只有一台可以看到 ip与虚拟ip绑定。如果 被绑定的一台宕机,绑定关系就会漂移到另外两台机器中的一台上,默认在 31 服务器上,关闭 31服务器上会出现在33服务器上如下:7 p2 i. R3 }/ O
. }$ g) [/ ~7 y' ~4 V9 K5 A
eric@server3:~$ ip a | grep ens33
) Y. J# `( s! M' z& X3 b# j2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000" T9 H( b9 d1 y! B
    inet 192.168.90.33/24 brd 192.168.90.255 scope global ens33* U8 `7 I& S( |0 {& b+ T# V: W# t
    inet 192.168.90.100/24 scope global secondary ens33
* w/ I. p* @+ M6 i) r5 u# Y1 w" W1" `0 t5 A7 D4 O
2
! t0 V; `( G. H( X3: P- p8 `% F9 p( t; }' V
4
+ y# U% a- U6 k1 {部署K8S集群
& N) K" U8 i5 l2 O3 O创建工作目录并导出配置文件
& K/ `5 U8 ~, D! I  r& |& c8 A# |8 |$ l# x! ~! h
# 创建工作目录. A) Z$ S3 {' l: u8 H3 P
sudo  mkdir -p /usr/local/kubernetes/cluster
' K$ E5 P. w, b, f; O# 导出配置文件到工作目录
( w6 f; i' O& o& Q. vsu root
6 h1 i9 m6 b8 ?$ N& s$ m kubeadm config print init-defaults --kubeconfig ClusterConfiguration > /usr/local/kubernetes/cluster/kubeadm.yml; ^. Y* @* O6 z( Z
1
3 Z+ f: r9 l$ }  X2/ O7 c7 O# U; [. y  N0 ]( d
36 Q2 G! _* ]: x) ?/ d  \; T! Q6 H
4
7 ~  C0 }! h) ~6 X58 ~) N" r4 m9 h: O& @
修改配置文件  T" Z" f5 W1 E, ~7 k, p
33节点修改kubeadm.yml 内容如下+ Y& I( Y1 r+ `* g( c/ q) u

' E: a  b8 @6 P( e% F8 Qroot@server1:/usr/local/kubernetes/cluster# cat kubeadm.yml# {. }/ d2 Z/ h8 U: U
apiVersion: kubeadm.k8s.io/v1beta1
( a- f0 C% J7 H6 F6 n) m% k; Q, p8 q1 SbootstrapTokens:0 _. }0 n5 {  e# d2 H+ T
- groups:! a# k" n# m' s, C- }2 p; I
  - system:bootstrappers:kubeadm:default-node-token/ V0 Y0 e$ @% ^: x! ^! F9 I7 U
  token: abcdef.0123456789abcdef
+ z* T- a) p7 J; |; z, M  ttl: 24h0m0s. p' ]6 o0 i! _: D& E$ u
  usages:
6 j: n7 M7 Z1 P+ r& K; y/ y  - signing4 y! n# t% E2 Q3 U2 S6 o) `
  - authentication$ H/ g# e7 h3 a6 _
kind: InitConfiguration
2 y$ _8 o( `& h2 D5 E3 qlocalAPIEndpoint:
0 a+ @3 _4 w7 l, B  advertiseAddress: 192.168.90.33  #节点ip+ a! ?4 o- K  l! p
  bindPort: 6443" s' B. ~0 M1 a( `% y
nodeRegistration:
+ }: A8 S6 M- \! a  criSocket: /var/run/dockershim.sock' Z. H, X0 j; w  Q# q6 n
  name: server1+ R1 N! n, `% B3 o
  taints:# E; `' u$ O  o9 @/ v
  - effect: NoSchedule
' C- T. ]" ~4 q8 V    key: node-role.kubernetes.io/master& q1 y! b& d& V# n
---4 O# {' J7 s: E3 v( J
apiServer:
' w+ l: `3 T2 Q" |, X  timeoutForControlPlane: 4m0s2 F& J! \+ V$ W% _2 d% s  T3 X# M
apiVersion: kubeadm.k8s.io/v1beta1( K6 a5 v' Z3 G8 e9 m! ?4 g
certificatesDir: /etc/kubernetes/pki* h; Z4 u% o% |+ c0 w7 @& z; N
clusterName: kubernetes
. L# w1 C7 X. icontrolPlaneEndpoint: "192.168.90.100:6444"  # vip 和 端口
/ W, c  [& {7 K2 UcontrollerManager: {}, p6 \. E( C' R
dns:
! v6 y. y* d2 p$ ?- C- B! c6 E  type: CoreDNS' t- M! O# K. d7 r. ^+ M4 l/ H
etcd:
5 P! o8 O+ K6 w- R( K9 a6 I  local:  h! i# X1 N5 ^5 N% ]
    dataDir: /var/lib/etcd
0 _& E" L- k1 J% I, g1 E' wimageRepository: registry.aliyuncs.com/google_containers  # 阿里镜像库, {+ q3 _! x5 S* t3 Y
kind: ClusterConfiguration" s* [/ A* c. i  C3 V9 A
kubernetesVersion: v1.14.10   # 版本号( u  x# P) U; h9 K8 e
networking:
- Q0 g( W9 x. z  @5 P  dnsDomain: cluster.local
4 H( u/ F; l8 k5 c9 R  podSubnet: "10.244.0.0/16"  # IP段 不能和 主节点所在ip段冲突  如:主节点ip 为 192.168.90.33 那么这里不能谢 192.168.0.0/16  7 H/ _, U3 |( h2 J4 o1 a
  serviceSubnet: 10.96.0.0/12
6 P$ [. N: ~, i1 g/ Y# Ischeduler: {}* c3 Y3 q7 @. q: x! v
---4 N; a4 G2 n6 A; `
# 开启 IPVS 模式
9 v' l* k- s- u* s- N; O) l/ U/ WapiVersion: kubeproxy.config.k8s.io/v1alpha1# R, T8 v" p0 B6 Y  `: a( m
kind: KubeProxyConfiguration
7 ~( q  j' u$ \) k7 z  j- N* X+ NfeatureGates:" ]% D6 ^1 J, L3 |
  SupportIPVSProxyMode: true  f, L- t! f2 t. ^( b' a$ S) M
mode: ipvs
! j& U7 }3 q; C( ?7 m5 l5 p5 ]) \' v
1" d9 T" B/ O" j* i
2# T& O6 o* \$ q/ s
3
5 j# m1 H" M; j" z4( D% ~; ^0 u% u( S) ~) n. s+ I+ r5 [
5
7 N. ?2 y8 J; A0 w: Z. W! y2 ~6' d* q2 c# S) u1 o- N' g
7
7 P7 Z5 ^0 I9 D8/ U' ]: B, ^9 D! K8 H: d
9& H/ ~9 I- I. E3 _
10
9 C4 ^* t" Q- p4 J11- O% H3 H" G) V
12! x6 E# E+ G$ ]" Q
13( f, L- a% _) Y; W
14: C0 Y8 K# [/ q1 O( a& p+ W
156 J7 v  \" C: K# {9 _  P
16! C* H: q' m! z  U5 s3 n
17
$ _2 }2 R0 h$ [8 J18
: ?3 }6 r$ }% Q  n+ {0 D# C19
) ~. G; ^% D8 a! U* \8 M) }4 R# e203 h; A, F/ |( P. X" X
218 l" M( V8 y: ^" U$ l$ |0 U
22
+ Z1 Q8 d1 D" v- s& c1 E23
1 r1 L3 p4 `. u; H24
. Y: I6 K( p3 m/ b& X6 B- Y( V250 h4 F& d$ U/ v* m% i+ ^7 D9 V7 W
26
8 m: G3 _/ ?6 x( T0 p$ \) z27
" }: D4 a; g0 V$ k7 b" x) T28. h3 p: C5 I  z+ w
29! j0 E( ?3 X; ^. f# ~& \: L
30
2 W7 ^6 {8 s/ q5 S" \' `31
) f: N  p- W( X' p, @32# f+ A  k! [* M2 f2 U
33
) M/ r8 @! U3 `, _- L' d, z34
  H% C; ?6 w6 k$ k; C6 q35! c1 h" B7 g4 b+ ~# @- f5 m
36- r( l2 g1 M5 E* ^4 _" D4 G# |
37
0 \) T) b9 X' p; {& i! v385 e4 Q& H$ A0 w  |+ t  S( V
39& e6 D! G8 p# S: o
40$ {1 }; }( J& g9 F3 l+ i9 G
41
1 f5 s$ t5 B- l' y42% r2 N  F2 z5 l" @& z
43
8 g7 F5 f3 ~/ R; d6 t44
$ r* u' K" P' y2 L& Q( z) G2 ?' z; r45
4 ]4 u. ^* x/ m5 ~1 l46
' Q/ {& m' G" }3 I- _5 M47
9 s5 j& m/ A- w, S: i2 f& g" z. n$ `483 y: ?/ c0 {* I7 j
kubeadm 初始化master
/ z' G1 s( H% c* S4 a# K4 Q$ V" N" A6 ]8 [, C
kubeadm 初始化/ d: ^, A! u3 F+ ]
+ |  `3 {0 D! k0 x( H/ Q$ _* f
root@server1:/usr/local/kubernetes/cluster# kubeadm init --config=kubeadm.yml --experimental-upload-certs | tee kubeadm-init.log
% [' S7 `" y! |5 z: W" d  n......4 \. g) C! P) H2 z; L4 [6 {5 X
Your Kubernetes control-plane has initialized successfully!
8 S5 _7 }1 F$ T: @, `3 d: H; N$ K0 N8 J
To start using your cluster, you need to run the following as a regular user:1 P* i! ]- Z* i3 a2 l  g

8 x6 F3 g* }$ A9 j( B2 Q! @  mkdir -p $HOME/.kube  Y" _- }# e  U: B9 P6 }1 ~9 I
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config* E. n+ C8 ?+ ~" _$ b# w
  sudo chown $(id -u):$(id -g) $HOME/.kube/config
% C9 R) i& L) B0 e- U' h
7 @8 g" |! ~/ V: z& [5 J# F+ @$ PYou should now deploy a pod network to the cluster.3 U$ ^! Z+ ^" H5 h! v5 c% I, y: m
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:+ w# n5 X7 ~& q
  https://kubernetes.io/docs/conce ... inistration/addons/
. l& M7 j5 Z% w# O+ }( o- r9 @2 x( u4 n: S: ?& x
You can now join any number of the control-plane node running the following command on each as root:
$ ^! h' ^" o3 {# `. N2 o% H
0 b; t5 z8 G  s  ~  kubeadm join 192.168.90.100:6444 --token abcdef.0123456789abcdef \
6 P5 {0 c( G& t! J: q  u8 a, H, e/ j    --discovery-token-ca-cert-hash sha256:d5890a0d44846cb7b18ae919a04031c5290d002769a93892a79bb427f657fe9e \/ T4 P- l& g$ c, c
    --experimental-control-plane --certificate-key cf231517325f3c8756e057c8851d2065363a875cccea31c5629871a44c394dbf
1 g8 B+ @$ B9 v; t$ A6 Q
; e4 s- H% R0 @! PPlease note that the certificate-key gives access to cluster sensitive data, keep it secret!. _! B8 U% h" i
As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use$ ?8 Z9 l4 p- r' p
"kubeadm init phase upload-certs --experimental-upload-certs" to reload certs afterward.  I2 c4 \9 r! d
  S* q9 ]" k! k! A4 x% x5 f
Then you can join any number of worker nodes by running the following on each as root:/ @: Y4 S* f& g+ b
0 u5 p# g: ]0 B$ r, e
kubeadm join 192.168.90.100:6444 --token abcdef.0123456789abcdef \
$ g# C: p' A7 ?* f7 }/ \    --discovery-token-ca-cert-hash sha256:d5890a0d44846cb7b18ae919a04031c5290d002769a93892a79bb427f657fe9e7 h8 I, \+ r% q) M7 W; c8 G8 ^' A

( ^0 l: g" [! x" c# o& t" i) O1
& P' R' P# F& u2 e* V2! L& y/ v. k4 ~: D
3
# c0 W5 c% l& C4 x7 T5 o4/ y( g( |4 v  [: c
5
+ _. m. O4 m' M; D6
, M4 L$ {1 V; N5 o, B% [7/ \% G9 s' e) |2 Y2 V# N5 C" v
85 u( j: o) x* V- ^5 }! I
9/ o  ^! I( J0 f
10& Q( F! O+ ~; Q% ]
11: u( R# z; Z+ J
12; N5 w+ Y3 B/ v( p# s
13
! G* O% b4 t% s/ m) G9 i  R) J% p14
: y; p' W9 V8 l2 K154 q* `" `  H7 S5 I# X1 s
16
! m: C. H/ X$ _  X0 S17* h5 D2 L/ P9 \/ f/ J
18
7 K6 H( ~2 ]9 {19
# U) ]7 [$ e* H202 O/ |/ D: ~. Q8 `9 B8 i
218 ?# j9 g: V4 ^
22& _: o0 V; s5 W5 p# E$ K1 H
23. K! Y8 ?5 x4 h- |) T! `
24; U' Y% J( }0 ]& E9 J
25
" Q& \& w. `' n+ t) Q26
/ M7 {" \# H9 X8 {# E5 H( j27
# [6 w! ]! i9 V' E# D28
! `0 e, E9 x  i# q0 B% z: Y根据日志输出,切换到普通用户eric执行以下命令
4 o$ ^# S, I/ w/ ]' r# C9 S( Z( B% ]: v0 W: W
root@server3:/usr/local/kubernetes/cluster# su eric( Q( }! W0 y! B/ s1 ]/ N- j
eric@server3:/usr/local/kubernetes/cluster$ mkdir -p $HOME/.kube
$ F5 g0 s0 J5 h3 F" Geric@server3:/usr/local/kubernetes/cluster$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config2 }- J0 W9 g' t& @# g' z
eric@server3:/usr/local/kubernetes/cluster$   sudo chown $(id -u):$(id -g) $HOME/.kube/config
) L( j, z1 s3 a1( O3 E& U, _+ j# e* v9 _2 K
2
; ~: _- R9 w) X5 X6 K, @3
4 X3 Y4 Z1 t/ G4 G) A" d40 ~+ u: @8 F' B  x& ]
验证是否成功3 x7 w+ _* g. L. o" e: x, a
eric@server3:/usr/local/kubernetes/cluster$ kubectl get node1 J3 C4 C, s& @& H
NAME      STATUS     ROLES    AGE     VERSION
2 A5 H: O2 A1 h! ^; _8 Eserver3   NotReady   master   4m11s   v1.14.108 _  Z9 y: J; l2 u" k; [
1
( G% f% J' T; i/ B: f! n0 q+ l- w/ e2
" ^+ V3 ?& b4 p3
" g$ n. E8 V0 e/ V1 F9 D安装网络插件
: ^/ t  u- \' h$ w( W/ M3 P+ @6 F* V( Q8 ~- {0 v
eric@server3:/usr/local/kubernetes/cluster$ kubectl apply -f https://docs.projectcalico.org/v3.7/manifests/calico.yaml
1 I. M0 H( ?9 s7 P+ T. Iconfigmap/calico-config created
7 ?, Y  U2 f4 m) U# h4 y......7 G! G  Q5 t4 N
serviceaccount/calico-node created% E( p& \9 D  g6 i9 ]  S+ T4 K7 M
deployment.extensions/calico-kube-controllers created# Q. ~5 m8 w- {3 C/ U5 p" P4 }
serviceaccount/calico-kube-controllers created
* {# n; k# y! }% L9 C" m( H0 }  v1
' m4 V0 k+ ^: ?4 T4 G- t7 l6 z2
1 e. l- A  P3 m& [38 F- L$ W' ]7 E" a' y: x( Y
4
. j6 Z* x/ f/ @* M5: i/ C* B2 Y  g2 l% u
6
# i3 V! ^) g1 D) _8 d/ o* I3 C, W# 验证安装是否成功  我这里足足等了 64分钟 各个插件才正常运行 running 状态
9 K) q- |- F) @- p! \) }5 Fwatch kubectl get pods --all-namespaces% U5 a2 g6 Y/ M$ D% D
kube-system   kube-scheduler-server3                    1/1     Running             0          34m
8 |, U7 j% v2 e8 C# fEvery 2.0s: kubectl get pods --all-namespaces                                                                                                                                                                                                           server3: Sun Aug 15 00:59:23 2021
0 y' U) o0 l! mNAMESPACE     NAME                                      READY   STATUS    RESTARTS   AGE* W6 ^: g" A( |" y
kube-system   calico-kube-controllers-f6ff9cbbb-6dcjs   1/1     Running   0          64m* ]% K9 B1 P) l1 ]& {" B
kube-system   calico-node-sb2kb                         1/1     Running   0          64m! N( X6 w% [* O; O' C! k' @" A
kube-system   coredns-7b7df549dd-vmpww                  1/1     Running   0          66m; {2 o; P1 o! c+ g
kube-system   coredns-7b7df549dd-zzjf8                  1/1     Running   0          66m
2 c/ J* H4 ~) M7 p: y8 Q: i6 s( Rkube-system   etcd-server3                              1/1     Running   0          65m+ H7 A- E$ J/ Y, {" F/ \$ M1 P3 A7 N
kube-system   kube-apiserver-server3                    1/1     Running   0          65m
1 ]' W% \6 i1 }kube-system   kube-controller-manager-server3           1/1     Running   0          65m1 \7 i2 o) h2 B
kube-system   kube-proxy-q42pg                          1/1     Running   0          66m  }' B' a, a  O1 A# ?( }/ K" R1 O( h
kube-system   kube-scheduler-server3                    1/1     Running   0          65m
# S- g3 e3 e/ C8 A# I  N& w+ N1
- Y, O* U9 o% Y+ y2
7 d: B5 B& L9 K, |* I; @% A3. a+ o  Y8 I6 s+ O* L: J* U" B# O9 C
4
2 `1 v( D. k+ q  c5 q; U8 c, `5
& @* E% G9 B' J. [& W6: p$ |7 G0 K: W5 Y/ b* Y
73 M$ o3 Z: s1 B5 W7 _
8; ~7 A9 C7 ]% r( E) d
9
- n/ Y9 m/ v- c$ r10' D. v0 d! ]8 A. ~
11. v* F* _. H4 o  t; N
124 Z: |. [, T% F2 X7 H0 R( F4 L
13
( a- G. L  w3 y1 [1 A14
. \' x. U& B# U+ q" s' ^加入mater节点# M5 I3 y. h2 i2 W4 n
31 和32节点分别执行初始化日志中的 主节点加入命令,将 31 和 32 节点初始化成 master节点。# g( g8 a9 f# x& U, `+ Q0 T- Y) q
注意:如果初始化完成很久之后才执行 加入master节点操作,那么token 可能会失效,参考上一篇文章,重新获取token 等参数3 M; v0 t3 k, R, ]

1 z+ A2 l* W5 y" z- C, N kubeadm join 192.168.90.100:6444 --token abcdef.0123456789abcdef \
4 c8 D& ?/ b$ |9 V; S* j! x6 v# `    --discovery-token-ca-cert-hash sha256:d5890a0d44846cb7b18ae919a04031c5290d002769a93892a79bb427f657fe9e \5 z5 P0 q( \; e" Y4 t! |$ u
    --experimental-control-plane --certificate-key cf231517325f3c8756e057c8851d2065363a875cccea31c5629871a44c394dbf/ c, V$ j+ g5 N6 G: f
  n: b$ h" @. \3 a0 b% T! k
.....
3 W$ K% g- g) m4 P& P+ j7 u[mark-control-plane] Marking the node server1 as control-plane by adding the label "node-role.kubernetes.io/master=''"8 b. m2 F8 J! B0 W5 B& ^& e
[mark-control-plane] Marking the node server1 as control-plane by adding the taints [node-role.kubernetes.io/master:NoSchedule]" P7 n& z5 G6 M7 ~, w- f- i3 @2 S

1 @. @; v9 d2 k/ HThis node has joined the cluster and a new control plane instance was created:6 Q8 R" T! d# |" b! m4 D

; ^8 F4 y* j) v+ q: u3 }: p* Certificate signing request was sent to apiserver and approval was received.$ _4 J% ^6 o6 ?0 E1 P
* The Kubelet was informed of the new secure connection details.
5 z+ E0 j3 a; O+ W5 a: P* Control plane (master) label and taint were applied to the new node.
# p& n) ~/ J! X3 z* The Kubernetes control plane instances scaled up.
  W  \# i% S* R5 R- J* A new etcd member was added to the local/stacked etcd cluster.' M. Y) I1 h& g  X# @- Z
. \) e8 v/ ~9 Y1 X5 B0 R
To start administering your cluster from this node, you need to run the following as a regular user:
  V3 c" ^7 h$ K- ]  S) W6 B# g4 l, d7 ^( R( Y* p  G& w
        mkdir -p $HOME/.kube
9 Y8 @; v+ }$ h2 e        sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
' i: Y- L1 I7 R5 S7 `        sudo chown $(id -u):$(id -g) $HOME/.kube/config
. `8 u2 [  l* q2 w- }9 N2 j( K/ l7 @( b! V
Run 'kubectl get nodes' to see this node join the cluster.
, r% Q  U8 {& ?0 V7 D4 D* i5 f2 v: |, y+ b" \: o# c1 _% g. g! t
1
7 O  f4 s9 ~- m2  D( B: J& z2 f
3( J/ Y+ K6 R2 K5 M
4' j" b" K* V' P3 ~3 n
5
8 g  K8 g# t& c& |* ]& B' R. B+ {4 A6
* B. A0 l6 o* R+ ^# m  F78 ?; c  b- A9 W- @. `
8
. _2 w4 ^3 T4 f; E* {. _9( i0 @% _: c+ c! Y+ H
10
# S2 }' T, `- w4 [5 w( C( Y" w9 O% e11' [' X% t4 S! r. \4 T) k$ k
12
; d7 j3 F1 ~9 f+ Z% U) M2 E' F13( s, Q3 B/ \# L- F  N$ A
14
; W1 _0 x& ~' Y8 b% h15
( z+ h0 D: _5 S7 e4 v/ @6 Z16
, Y5 F& j" C% D: A8 e17& v  A- M- y3 Q$ {& r' T* |
18
+ t8 h* n3 U3 D9 R2 O1 U19
8 e  |. D/ r3 ^. o/ @9 d20& y6 ?0 I% z: B) ^+ _: q3 \
21
2 K' e2 c% j- z. _/ i: G220 n0 z+ {5 x: I4 J/ `
23
1 [% ]% r& ]5 C& B- [8 U按照上述日志,执行配置命令:5 g3 ~! ]$ t2 W6 ^0 ]$ a5 \& ~8 \
* a4 k  Y; }! B
root@server1:/home/eric# su eric  ?1 K7 I" B2 ^1 A( h
eric@server1:~$ mkdir -p $HOME/.kube
& L9 C$ q9 c( [1 V; L; Feric@server1:~$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
4 K5 ]8 z# n* L[sudo] password for eric:. l" L/ g1 [: P- e4 K6 a, Z
eric@server1:~$ sudo chown $(id -u):$(id -g) $HOME/.kube/config" S, t3 y! t" \4 A7 U
17 G" x* O2 Y( E/ P+ b
25 @+ f1 ]( U& l8 H8 M% T# ]0 ?
33 b! t3 v) p; b' p* @
43 f  j" L! Q! q* F
55 G9 c4 h$ z, w3 F: Z- c7 f+ A1 r9 m
加入node节点
& ^% C8 F% v, l# y三个从节点分别执行以下命令,加入集群
2 e) v) U# K3 ^9 n+ o5 n$ k初始化日志中会打印加入命令,直接复制执行即可,如果参数不正确,参考上一篇,重新生成参数。
# L2 i$ X' w5 U& l( g4 E' O$ `# _0 K6 X  x1 U3 S
root@server4:/home/eric# kubeadm join 192.168.90.100:6444 --token abcdef.0123456789abcdef \& ~! Z8 g3 w- H! T$ O- ~
>     --discovery-token-ca-cert-hash sha256:19c012298212324b7851d89d71af9ff0d50c4fb130cb774b8a80c3a32d51d051
" a5 L4 A. {1 A( I7 s, A[preflight] Running pre-flight checks" R" T) m# X- A) ^5 \
        [WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/
! N+ z8 H* o0 y% m        [WARNING SystemVerification]: this Docker version is not on the list of validated versions: 20.10.8. Latest validated version: 18.09
8 C5 W9 q+ E6 J* r[preflight] Reading configuration from the cluster...
2 N- @0 h% b+ k% N[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -oyaml'
2 _: n: e% z4 ?9 z" B9 M[kubelet-start] Downloading configuration for the kubelet from the "kubelet-config-1.14" ConfigMap in the kube-system namespace
- \; ]1 U# y( C- |  g8 \[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"; q' j) t' {4 @) K% ?+ @! M! ?
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
8 \/ E$ n5 S# N[kubelet-start] Activating the kubelet service$ g* g& m0 w2 R% Q
[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...
9 m# g; U- l+ ^$ O. B( T- t, W9 y# P/ M
This node has joined the cluster:+ I; [) o' p. @8 j
* Certificate signing request was sent to apiserver and a response was received.- e# y. t+ R4 E
* The Kubelet was informed of the new secure connection details.
: @3 Y, ^. D7 b* K( ~
3 V, x! o& P6 }2 d4 ?* eRun 'kubectl get nodes' on the control-plane to see this node join the cluster." M6 t  Y" ^2 n: Y' z

) {1 p0 M! b6 u! A. O# e/ s1
) j$ t6 \, Y; v2' I9 V' o$ z' T8 ~! J, |6 T+ }
31 m) k# k6 A/ L( b7 ?$ C' E$ P
44 j- n( x( M8 N8 A* U  M
5) s5 i: p4 ~' f% h( [3 X4 ?
6
4 j, y4 J% E; C: P# x0 l; ^6 z- ?7) _4 m9 p3 I) ?; Q8 m9 M" j
8* x8 p# I0 C: D& o" M  z* o
9
, o5 ~, b1 v& D0 ?# o10' |' s0 F; B8 l) V3 N
11' a4 z& a  V6 s( g
12
0 A: m. j7 `' A4 a' {# J131 f+ V( d5 Q1 C1 R
14  l+ J. P5 p. Z, G
15- }$ C' w8 n' b& L
16
: g0 T: U7 ~5 k8 L; f; `: h17
9 `2 a- J) H, Q* O" Z18
' C2 o  w3 _$ m5 s* |$ L6 P& O验证集群状态. x  P9 N  c2 t$ g) Q7 v2 _- c
master节点执行如下命令验证集群状态6 \& i' l8 K1 |7 o
) @! u0 [# o$ h! @0 A; I
eric@server1:~$ kubectl get nodes   --查看节点1 ~2 |# X1 N# P8 a
NAME      STATUS     ROLES    AGE     VERSION. U1 r2 C; _, }: W
server1   Ready      master   7m35s   v1.14.102 c& W$ u& I( E' u4 G
server2   Ready      master   7m22s   v1.14.10+ l# I3 x6 S% y- V, o5 f+ _8 l
server3   Ready      master   85m     v1.14.10
8 s  i0 G( ]$ ]' X6 v: U: {/ \server4   NotReady   <none>   43s     v1.14.10. p) z( _7 U/ F* j5 M5 X8 m+ t
server5   NotReady   <none>   42s     v1.14.10
% G, P& Y, [! O+ ~server6   NotReady   <none>   41s     v1.14.10) E) B; P% _. F) H8 J
eric@server1:~$ kubectl get nodes -o wide  --查看节点
* Z) ^  w( V2 ?& [% }4 B4 qNAME      STATUS     ROLES    AGE     VERSION    INTERNAL-IP     EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION       CONTAINER-RUNTIME" ?+ q# G3 Z" C$ |  r$ q6 X
server1   Ready      master   9m43s   v1.14.10   192.168.90.31   <none>        Ubuntu 18.04.5 LTS   4.15.0-153-generic   docker://20.10.8! j; E9 J7 T& K1 E0 e3 ?
server2   Ready      master   9m30s   v1.14.10   192.168.90.32   <none>        Ubuntu 18.04.5 LTS   4.15.0-153-generic   docker://20.10.8% m* a0 G0 S! @$ J# w0 A) _
server3   Ready      master   87m     v1.14.10   192.168.90.33   <none>        Ubuntu 18.04.5 LTS   4.15.0-153-generic   docker://20.10.8) Z" Y$ ^' Q: j. g  R' |6 |* S
server4   NotReady   <none>   2m51s   v1.14.10   192.168.90.34   <none>        Ubuntu 18.04.5 LTS   4.15.0-153-generic   docker://20.10.86 l" W% J9 _4 {6 y8 @0 G
server5   NotReady   <none>   2m50s   v1.14.10   192.168.90.35   <none>        Ubuntu 18.04.5 LTS   4.15.0-153-generic   docker://20.10.8
; f. _  _; Y, a# Xserver6   NotReady   <none>   2m49s   v1.14.10   192.168.90.36   <none>        Ubuntu 18.04.5 LTS   4.15.0-153-generic   docker://20.10.8
# ~4 }3 y3 [% @4 I7 h7 y) t2 G: ?eric@server1:~$ kubectl -n kube-system get pod -o wide    --查看pod
$ x9 N% e/ Q9 [) A! ?! DNAME                                      READY   STATUS                  RESTARTS   AGE     IP                NODE      NOMINATED NODE   READINESS GATES
6 y7 D, S) @# i1 G, y# Tcalico-kube-controllers-f6ff9cbbb-6dcjs   1/1     Running                 0          86m     192.168.141.193   server3   <none>           <none>
7 ?- \7 d7 t: a1 N1 l! w$ l- J% ?calico-node-49lqn                         0/1     PodInitializing         0          10m     192.168.90.31     server1   <none>           <none>7 f2 _5 w  a3 V1 s" `" P
calico-node-jmp28                         0/1     Init:ImagePullBackOff   0          3m17s   192.168.90.36     server6   <none>           <none>* x+ R) w- u* {9 U( ?0 x
calico-node-kszl7                         0/1     Init:0/2                0          3m18s   192.168.90.35     server5   <none>           <none>) S: @' L- K+ s) A6 f7 F  A# i! C3 ]
calico-node-njz8v                         0/1     PodInitializing         0          9m58s   192.168.90.32     server2   <none>           <none>
/ O7 c) j* v6 l9 K* f$ Ccalico-node-sb2kb                         1/1     Running                 0          86m     192.168.90.33     server3   <none>           <none>: P2 H0 v5 S3 E# E' F! ?+ B
calico-node-sn874                         0/1     Init:0/2                0          3m19s   192.168.90.34     server4   <none>           <none>; f- p4 p  ~7 K/ n
coredns-7b7df549dd-vmpww                  1/1     Running                 0          87m     192.168.141.194   server3   <none>           <none>3 T# p2 f) V/ t" U" `
coredns-7b7df549dd-zzjf8                  1/1     Running                 0          87m     192.168.141.195   server3   <none>           <none>$ L4 `$ T4 ~/ `2 k3 u* P
etcd-server1                              1/1     Running                 0          10m     192.168.90.31     server1   <none>           <none>
/ J" F& [6 l! _etcd-server2                              1/1     Running                 0          9m57s   192.168.90.32     server2   <none>           <none>& X* W# g2 t9 I3 C; x8 N! R% l2 ~
etcd-server3                              1/1     Running                 0          86m     192.168.90.33     server3   <none>           <none># k, y1 U1 }) C4 G4 I" M& P
kube-apiserver-server1                    1/1     Running                 0          10m     192.168.90.31     server1   <none>           <none>
6 R$ i# Z) T# r$ Rkube-apiserver-server2                    1/1     Running                 0          9m58s   192.168.90.32     server2   <none>           <none>0 H4 }) t, s6 e
kube-apiserver-server3                    1/1     Running                 0          86m     192.168.90.33     server3   <none>           <none>+ t! W: P: b# w
kube-controller-manager-server1           1/1     Running                 0          10m     192.168.90.31     server1   <none>           <none>; q4 R4 Z% |9 u% K) l! G8 _' s
kube-controller-manager-server2           1/1     Running                 0          9m57s   192.168.90.32     server2   <none>           <none>9 I; c0 L* Y+ u% o7 ~
kube-controller-manager-server3           1/1     Running                 0          86m     192.168.90.33     server3   <none>           <none>7 t9 e; C1 x9 a3 x& z3 z; }
kube-proxy-5hl76                          1/1     Running                 0          10m     192.168.90.31     server1   <none>           <none>, F* n3 E" F! g3 c  U# i1 G" S
kube-proxy-gt6bj                          1/1     Running                 0          3m19s   192.168.90.34     server4   <none>           <none>
+ F! n3 |* g( v' |: Z6 ekube-proxy-nxx9l                          1/1     Running                 0          3m17s   192.168.90.36     server6   <none>           <none>
2 d6 i  q" n8 J6 a7 z& k6 {; ^( }' _kube-proxy-q42pg                          1/1     Running                 0          87m     192.168.90.33     server3   <none>           <none>
4 r) n9 M  r9 i& O! Kkube-proxy-qfkth                          1/1     Running                 0          9m58s   192.168.90.32     server2   <none>           <none>
7 w( F* N* T+ m% |kube-proxy-zc5c2                          1/1     Running                 0          3m18s   192.168.90.35     server5   <none>           <none>2 G. e0 s4 y; v' ?! [) c% i  T
kube-scheduler-server1                    1/1     Running                 0          10m     192.168.90.31     server1   <none>           <none>+ m, z( g$ S8 s5 X9 _% N) ^
kube-scheduler-server2                    1/1     Running                 0          9m58s   192.168.90.32     server2   <none>           <none>% _8 k2 ]- d7 A9 k& \0 O
kube-scheduler-server3                    1/1     Running                 0          87m     192.168.90.33     server3   <none>           <none>  p$ ]. {0 X; Q8 F1 Q4 d; y+ z
eric@server1:~$ kubectl -n kube-system get svc  --查看服务$ T9 f3 O9 D+ P; N5 p% G
NAME       TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE2 e; l- S, N: m8 c2 K" t
kube-dns   ClusterIP   10.96.0.10   <none>        53/UDP,53/TCP,9153/TCP   88m. ^9 Q' o5 K; P$ B; L* C5 s

3 E% `$ x8 L  Y2 neric@server1:~$ kubectl -n kube-system exec etcd-kubernetes-master-01 -- etcdctl \    --查看etcd集群状态; r; }$ L* d/ s2 p4 n) p+ |
> --endpoints=https://192.168.141.150:2379 \% P9 V) A3 i( H- _; e
> --ca-file=/etc/kubernetes/pki/etcd/ca.crt \
4 y" e! x# T' g0 N! |! H5 u3 J> --cert-file=/etc/kubernetes/pki/etcd/server.crt \8 D$ ?# x7 {* k: X! I' `; \  Q
> --key-file=/etc/kubernetes/pki/etcd/server.key cluster-health6 m/ M& j3 t, w- p6 _" Y
Error from server (NotFound): pods "etcd-kubernetes-master-01" not found
7 w! f- I  k, L) f; J8 zeric@server1:~$ kubectl -n kube-system exec etcd-server1  -- etcdctl --endpoints=https://192.168.90.31:2379 --ca-file=/etc/kubernetes/pki/etcd/ca.crt --cert-file=/etc/kubernetes/pki/etcd/server.crt --key-file=/etc/kubernetes/pki/etcd/server.key cluster-health
! o" o) a) G: j* O+ xmember 5054125c1f93982 is healthy: got healthy result from https://192.168.90.33:2379
8 ]& j+ h4 ~# E1 k* R0 O0 N) umember 35577abe54c175af is healthy: got healthy result from https://192.168.90.32:2379* C9 E- r' ~9 u; D/ J
member 6f5d23fdfa6c99f4 is healthy: got healthy result from https://192.168.90.31:23795 J! y; k! Y! l- l" O$ l
cluster is healthy3 e. z5 A( U+ f9 E

2 Q2 M! T1 J$ `4 L! W1
; [7 M! e9 m# W2- I; W- A- c- q1 G  r
37 y  s) l$ ]5 ~2 {( ?
4
( A: q4 U! u# o" h5 i8 @5
. y4 d; S! U$ u: r" P63 T+ S1 p5 _2 }7 K0 K- T
7; r6 y" L6 E: q" r* @
8
9 H* Y+ C/ F  _' L91 w# ]% ^) P+ d9 H7 V/ B
10
$ r1 v& S# E) r) `5 P% ~11
8 y  ]" n' y: J+ q7 ~12/ e1 W: r# F3 S0 L6 m
13  ^4 ~, \3 ?7 [2 ~
14
3 B0 p) o2 M, s% ]# W15. Y$ b6 j; J9 I
16: C+ O5 o: V( H* Y( v
17
" c2 M$ m' |8 I6 X# k& o( K  F+ ]18! G" B; d" t. N9 p6 J: B' }
19
' E% z! u! }0 ]; i3 e20
- \/ |8 L; b( R) j21
, f7 d% U* w, i; _1 Y% T" }% }22
3 e: v% T8 s* c+ V( b23
. C0 b6 s. X  l$ X6 T6 F/ s+ u24
7 D! N% p/ i) k  @25! k4 m2 c9 D4 E9 g' ^- d7 a$ @
26
7 v9 z. o; m0 v* }+ T1 k278 S3 k- N( X8 c% g( }$ W
28
. A, r6 Q' j! a29
4 v1 ^% M5 z9 p* [, f7 r- {2 z0 z) [( w30
. f  N& c6 t/ |% g  M- ^8 ~31$ k! D1 t* L* P1 h6 f8 A5 l6 k
32
. c1 i' H9 j4 c8 E" l33% e% O4 w+ j) f" G, T  M: S
348 y, X: r" |4 E' J* g5 v& [
35( i+ {- K6 g; ?; [8 ]
36
# V8 [: j$ ^. Y+ X0 w) Q$ ~" E- D37
4 l, w% o( l" y5 Z( H38
! L, `7 s5 S. T4 ]) V3 C. E* `  g+ z+ j39  }3 t/ Z5 p3 z+ g
40
$ I2 Y: A: ?! s1 I% @& |41
* K. d' q/ B- i421 o6 \  h$ @8 M4 X8 J- S
43
  p" y2 {' n0 o/ P, n; r& X  i! n44
" N) O. z( V6 ~45
6 G  Q$ p/ ?9 S8 I  |. O46
7 p! c5 P0 I& ^$ k  N. D47, h+ v) G  u8 ~' Y. D
48
/ o" w4 r8 T5 x. k' q49
3 j( z0 Q7 E3 ~7 w. i( C. R$ Y50# J7 {1 n0 g1 x- q7 u* b
51
& {9 E1 n9 D8 {  V8 f4 r52
: }& Q8 ~6 A" e1 {# q53
! T- T1 t; `/ |5 I; h! g( i0 s1 N, e54
, [# [& i" y7 h  A% v) H55. X, ?! {1 Y. J' [
56
) v$ r' Z1 [) P& [. `% H& y571 K1 G9 a, J4 Y" o8 M
587 k: g* Z! w% q9 t4 o
59
- ~# J2 M4 {- l( V7 K2 w6 H60/ |, G1 D2 d, d) g( Z
验证高可用
4 `8 ?7 B6 }) K  iKeepalived 要求至少 2 个备用节点,故想测试高可用至少需要 1 主 2 从模式验证,否则可能出现意想不到的问题! c( Z' ?. e9 L9 Y9 w5 J4 ^
开始 通过ip a |grep ens 命令可以看到 vip 在 33节点上,即 33节点作为master 对外提供服务,在 31 和 32 节点上 可以通过 kubectl get nodes -o wide 查询到节点信息 ,证明调用了主节点的apiserver服务。通过在33节点shutdown模拟现行主节点宕机,7 U9 x( J, @& |2 [

8 `& i; L& F+ o% Hshutdown -h now  --关机
3 T' v; d6 W2 ]6 \1, c! s1 l5 m" ?
通过ip a |grep ens 命令可以看到 vip 漂移到了 32 节点
- {8 ]8 v6 E5 u& u- R: U4 Q; Q
$ U' N. f: f3 F0 o# T0 t# r& ]eric@server2:~$ ip a|grep ens
( h. Q+ I9 [/ _% g4 Z2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
7 J+ _6 Z7 E- M3 K1 N+ ~. Y    inet 192.168.90.32/24 brd 192.168.90.255 scope global ens33
9 n6 K8 [( Q. F' N7 L# E$ e3 r    inet 192.168.90.100/24 scope global secondary ens33
; i8 i: X6 m% Q0 a$ l5 x1. G/ V6 W! f8 T. B& ^. L3 V  e) J
2
" R, E+ i4 |. W: B35 I! O* C4 O, p6 F9 p( m
4
6 E4 z9 g+ G. L' n- q1 G这时在 31节点仍然可以通过 kubectl get nodes -o wide 获取到节点信息如下,证明33节点宕机情况下,api server 服务仍然可用:
, P1 \8 ^# X8 f2 F2 ^+ }& `. Z9 a9 [; o' k+ R% E
eric@server1:~$ kubectl get nodes -o wide
/ [) B6 b4 G! ]# ^' q: G! @, M* oNAME      STATUS     ROLES    AGE    VERSION    INTERNAL-IP     EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION       CONTAINER-RUNTIME- U& h/ E7 n* E4 S& o" i
server1   Ready      master   42m    v1.14.10   192.168.90.31   <none>        Ubuntu 18.04.5 LTS   4.15.0-153-generic   docker://20.10.89 \- B9 q7 ]! v, f
server2   Ready      master   42m    v1.14.10   192.168.90.32   <none>        Ubuntu 18.04.5 LTS   4.15.0-153-generic   docker://20.10.8
2 U, e' E% y# V3 p8 K: Qserver3   NotReady   master   120m   v1.14.10   192.168.90.33   <none>        Ubuntu 18.04.5 LTS   4.15.0-153-generic   docker://20.10.8
# ]  A+ E# I% v4 q( R" B/ W; Gserver4   Ready      <none>   35m    v1.14.10   192.168.90.34   <none>        Ubuntu 18.04.5 LTS   4.15.0-153-generic   docker://20.10.8$ m( Y2 J0 x4 c
server5   Ready      <none>   35m    v1.14.10   192.168.90.35   <none>        Ubuntu 18.04.5 LTS   4.15.0-153-generic   docker://20.10.8
+ u( R2 @6 J% E* l" m) jserver6   Ready      <none>   35m    v1.14.10   192.168.90.36   <none>        Ubuntu 18.04.5 LTS   4.15.0-153-generic   docker://20.10.85 p5 {  _$ x8 I# U
1% F8 y5 y) O: z" e0 W
2. t1 |; z& Z+ r- J( ^4 c5 K
3
. H$ ^! }4 w4 n$ P* ]7 M; Q; V. ^4. i! B0 ~5 t7 }
5
( r. S, d: b; k6
7 L3 n( a4 y, S) }9 B7
% J1 d" N$ {' t89 j& Z0 ?4 U/ K5 E- ?
配置运行nginx容器
; _% P3 u: e4 _0 Z5 `; @1 k部署deployment
1 [4 G5 @+ c# A8 G创建 配置文件nginx-deployment.yaml如下:
' S# U( i6 n$ ?; S& j4 \  L( O8 y+ O( W4 j, Q
eric@server1:/usr/local/kubernetes/cluster$ cat nginx-deployment.yml" O0 C6 m* K7 ~) g$ C3 Z
# API 版本号3 O6 r- p# e/ K
apiVersion: extensions/v1beta1
9 N  C  N+ q6 [: Z+ w# 类型,如:Pod/ReplicationController/Deployment/Service/Ingress2 F& V# |% k6 G$ S" U% f
kind: Deployment
% i# N1 n! ]# C& P# 元数据
* }2 R2 ]) n7 W( u- w3 M. E* ?metadata:
& H- x: M  J- Q2 A  # Kind 的名称0 c& b6 F. ]: `% b) W
  name: nginx-app/ k7 [7 m: x5 @! Y
spec:
* j$ q+ T' e5 Q  D  # 部署的实例数量3 b6 ~5 F: n. n  t1 ]! [3 I
  replicas: 2
6 Y* T! c7 d$ V: _  template:) ~" R3 {& Z: m. t
    metadata:6 N% I$ i. ^0 V% q
      labels:
% h/ z9 C+ r0 X5 _9 u& ]        # 容器标签的名字,发布 Service 时,selector 需要和这里对应* W# q9 w# p" [# N) H7 `8 h8 t
        name: nginx) D$ T! C6 g, I
    spec:
, y/ g6 T$ V+ ^3 D' n      # 配置容器,数组类型,说明可以配置多个容器
# d8 U) G) d3 ~! h% S: V! U      containers:
8 J4 o. Y; r' O  g- f7 h      # 容器名称
( A, N' f9 W" s( l7 J7 X      - name: nginx( y& g4 W' e. }7 |
        # 容器镜像
* o5 e( s/ ?' @9 f' Z        image: nginx
+ e+ C/ p. e4 ]; T2 O% ^        # 暴露端口
8 _3 e5 l" _* E$ z, s        ports:
. q8 H9 ]7 W2 D, I4 \% R        # Pod 端口
, a, u5 c1 e5 @! o% Z% ?# h        - containerPort: 80
; P1 T0 t9 ]7 i' d3 C
7 B! X0 m1 G3 \18 e& L7 I3 q1 J! u2 g3 a
2
& ~) I- p/ ]) j" B( e3( I- x8 }% \8 u* o
44 {9 _4 v* W* S- U2 C# d$ b$ h
5- S, y. a' d! D5 o
6
$ N1 T7 Y! O2 ~' C7
3 ~7 M9 `3 G. o( _  v86 C( a4 _# c5 x+ J
94 M8 L: w) B, u8 v+ [- d3 `
10
. a2 t4 T9 d! S1 z2 t11' E4 L& u4 Y. Q2 W: X- \
12% H- I" O2 m  S, {4 K- V
137 f% g6 m; K; ^; g; i
14
1 z  R0 i0 _' W15
: P, Q# z) R* p16' c8 W, O7 ^6 `  y
17$ b5 b. o4 _3 A/ B* s
18: g: D, O  x: J# V4 G1 i* k
190 k# Z8 K7 T# D' o
20' j% @8 H" f4 L: \+ h9 h1 L4 n% A) E: e
212 J) ^0 Z' R: k$ U
22
3 Q/ N: {6 @: U" @4 P; j7 l23
" V' j" s$ y  _1 T* D24
% d7 u4 ]8 f: J  v9 s25
3 G, m; F5 Q# W& X4 e26
+ \$ e, G- |# R5 Y27
: Q  q$ P: l% c' N6 b9 ~: L* }283 C  \' C8 y3 `! Z6 E  L7 o
添加部署
7 s! v2 O: L9 V2 g. g+ @8 ]2 S% O- _5 o% C" x7 [( c. y% `
eric@server3:/usr/local/kubernetes/cluster$ kubectl create -f nginx-deployment.yml   ) j2 r# s2 k) U
deployment.extensions/nginx-app created3 d- t$ ]0 Y$ y. a/ U: u
16 U+ ?; B+ h- {$ a4 M; O- ]
24 o8 S5 y* N0 J% S: v
删除部署命令. b5 R! R7 i5 t, G  M; K' V
/ [0 I9 ]5 Q' z" G$ [
kubectl delete -f nginx-deployment.yml: |4 w+ @/ `! ^6 K
1
, M" {4 ^- O! g; b3 E3 f+ a发布service
: [: D" Q) L: @& [2 t) J$ Y  B6 C( Cnginx-service.yml配置文件如下:' q8 T7 D! e6 b* t! D, W

% f6 H. [, l- _, |" m/ o/ a6 M# API 版本号
! X% h" u: ?4 o3 vapiVersion: v1  C# E  e! b3 g) W- G' x6 z2 M! D
# 类型,如:Pod/ReplicationController/Deployment/Service/Ingress
: \- o- r" J6 I& m; P. {! Hkind: Service6 h7 u, f+ m, W* }. M& d+ Q
# 元数据0 w- a' W1 W  b: l# L6 B5 \
metadata:
2 B5 ?# e! ~7 _  # Kind 的名称' E. O, p5 ?; s- _
  name: nginx-http
' L4 w4 l; l- _7 `spec:
4 ?, R( f% A; m9 I( J2 a7 B  # 暴露端口; O5 M3 a0 \+ ?  _# R5 ]4 ]1 e1 F+ e  j
  ports:7 b  E5 o- C7 \; s# m) l$ x
    ## Service 暴露的端口
  Y1 ?7 \2 U% a2 G2 s    - port: 80) x. j* F( B8 I7 L( S. B: f# O
      ## Pod 上的端口,这里是将 Service 暴露的端口转发到 Pod 端口上% E) a! x: G' l; W( @
      targetPort: 809 ^) \9 J1 j/ x; Q/ I: W& q) j
  # 类型
1 G) v  Z! w: \5 b  type: LoadBalancer
9 D6 i# a4 k3 N0 i( x4 ?7 R9 r5 h  # 标签选择器
* r0 v& c% I( z9 {- E: \) _  selector:8 P3 m* d+ q: C
    # 需要和上面部署的 Deployment 标签名对应
0 F% C3 [7 r6 ]# Y    name: nginx
' R0 \2 b2 r8 h" A' [& z7 ]! O
4 R: ^4 Z3 [/ z2 @9 Z: o15 D1 p% s, g5 w( j6 L* u  `8 w
2
  P- l6 S" y: e# `/ G( D32 C# ^- R. |; w' k2 _
41 ^1 ]7 U/ e# g- p- b& o- e+ e
5
, t4 s. ~7 c4 v. Q+ @3 ~6
* \" |, q- T- q* o, r5 k; N( Q7
0 Y6 @4 B5 F$ ?) ?81 [1 J9 C8 s$ J9 m# Q
9# E9 i/ a, W3 T
10
5 n# y% M6 u4 i0 O11
; z4 ?+ k# O& n: d1 G12
: U/ p6 ]( [3 i2 Z% ~13- p9 b& o$ X  b/ x
14
: A  r7 n1 }  e( d: _. a9 T15
7 T: c/ D  U7 a% d4 E: D. L  i) Q6 M4 R162 w, y- L9 H  f* o, x4 e
177 M- F$ A8 P4 m/ @- u
18( o2 }  |$ v5 ~" r6 X' O& W
19
: a& W7 f" T6 w8 z6 Z' g& Z4 \203 \) s, f% m' s# b3 e' z
218 x$ S5 w2 a9 x5 Q* V% u) E9 Q) [
eric@server3:/usr/local/kubernetes/cluster$ kubectl create -f  nginx-service.yml, T/ }! @& d0 w) A& `* |; |
16 Q( n! s0 g& E% u) Z( Y
也可以deployment 和service一起部署
2 W8 c5 T" {! I6 m* \/ f" b) N配置文件合并在一起 内容使用 — 分割即可" \, m- o. T6 ^0 b, H5 L7 `- u
9 l$ X/ |, S6 ]9 L% I9 J& B
查看验证
2 P. E% k; c2 @) @& Z# |: K3 q5 e
eric@server3:/usr/local/kubernetes/cluster$ kubectl get pods
  O3 f3 Q, P0 M( U" fNAME                         READY   STATUS    RESTARTS   AGE
. u4 q+ j# C1 _* B# {, i# U" dnginx-app-64bb598779-kfqm2   1/1     Running   0          4m10s
: L% H( I$ E4 Tnginx-app-64bb598779-qzsjp   1/1     Running   0          4m10s5 c$ o! X8 u3 U9 P5 b* j. [! E4 _
eric@server3:/usr/local/kubernetes/cluster$ kubectl get deployment
) L. i- E, V" V; v" ~NAME        READY   UP-TO-DATE   AVAILABLE   AGE
8 B8 @: Q& {, ?" Enginx-app   2/2     2            2           4m27s( }7 |; p  J8 A7 `; n
eric@server3:/usr/local/kubernetes/cluster$ kubectl get service3 ]6 o4 [8 d. T5 p7 T- t" z
NAME         TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE+ I2 T/ u+ X1 X; A1 i- Y/ O. d
kubernetes   ClusterIP      10.96.0.1      <none>        443/TCP        11h. I9 g; h9 Y1 T( E  L
nginx-http   LoadBalancer   10.99.153.51   <pending>     80:31467/TCP   47s( e/ q1 @& Z4 p8 J
eric@server3:/usr/local/kubernetes/cluster$ kubectl describe service nginx-http
; U' f3 p4 z; r1 G: ^' n- k3 @* G1 oName:                     nginx-http* o/ E% R3 y. A' G  \2 r
Namespace:                default
0 I: u/ Q" ^& M9 _! R% |Labels:                   <none>9 s1 N; e. z+ e* A
Annotations:              <none>* b: ?3 S, c* N% u7 X
Selector:                 name=nginx8 z; q/ a- A# v+ P1 B/ J! f# d
Type:                     LoadBalancer% J% ?9 {/ g' i; z( T- E
IP:                       10.99.153.51. I* T  A9 `7 {
Port:                     <unset>  80/TCP
1 ~1 \. A* g/ U9 `+ ]! }+ CTargetPort:               80/TCP
5 r. F2 {1 g8 c% |! L1 UNodePort:                 <unset>  31467/TCP: Z: C; c3 y& D$ ]: E! ]
Endpoints:                192.168.205.67:80,192.168.22.3:80
; N/ n% l2 e1 Y- i+ E! w' gSession Affinity:         None
, b7 J/ {; {' e. X& MExternal Traffic Policy:  Cluster% ]7 H' B$ G. E* M! S
Events:                   <none>, k; k- D& Z1 t( ]
17 r; Q! x! J0 S# @7 f
2
! ^$ n, ]9 o: w2 w30 A7 @$ A" r3 ~" R
4
2 y; o2 I# b* B( Y# v  _5' J9 A( m: D* V" R1 r4 ]
6
# e' Q. A* a9 x8 W( J7
& T: C+ w5 O$ E# b! [8
6 c/ J9 X$ b+ f7 f3 e3 F91 D4 V: U3 w  i7 L
10
3 w7 c9 o: X6 z114 |/ z5 a) `0 j$ p& Q' x
12* ]" m7 M2 J9 ?% S6 X5 v2 {
139 `8 d8 J! v$ ?) ?$ O, E2 n! [" @
146 d9 `) @' M/ J5 I* u
15
& |+ P* h2 h7 |) E4 c! h0 _- g, F16
' S" ?% ~7 @' L; p% \17
( l2 d  G% C$ W# \+ i% Y# y" v0 N187 v- }* r$ w$ ?! c- C4 Q& s7 i
19
  R8 G8 b; j) J3 ~% N207 O% u* \, R1 E1 M0 j
21% Y3 I- }. l7 d4 j, M
22
4 X5 G" W+ E' k0 d- g' o23
3 a) V2 s' c: P8 ?4 v24
5 S/ e; `8 b4 v0 ?4 R25& b' i3 |! U2 j" @
26
# g0 y* d. f7 m+ L4 g* q访问192.168.90.31/32/33:31467 可以访问到nginx页面
$ \) W& L9 L6 y
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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