|
1 J; d. n3 K( A8 x
<p>kubectl作为我们主要的操作K8S的工具,其具备非常丰富的功能,但是如果不经过打磨,使用起来还是存在诸多不便,今天我们来看看如何将我们的kubectl打磨的更加易用。</p> d8 V3 }" r4 Q9 g; @2 ?/ k8 N
<p> </p>
$ g5 R* F7 c6 K1 R: U! Q<p>一、命令自动补全</p>
6 k* T" g8 r0 n1 @<p>kubectl中提供非常多的命令,如果每一次都要手动一个字符一个字符的敲未免太累了,那么如何配置自动补全呢?这里以ubuntu系统为例:</p>
1 K. F, v' X# E1 ], [( M<p>1、安装auto-completion工具</p>- I# K6 x5 I+ V, D A+ i
<div class="cnblogs_code">* i2 j. \; l) q5 L5 T% D
<pre>$ <span style="color: rgba(0, 0, 255, 1)">sudo</span><span style="color: rgba(0, 0, 0, 1)"> apt update
; s7 L! @' \5 DHit:</span><span style="color: rgba(128, 0, 128, 1)">1</span> http:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">archive.ubuntu.com/ubuntu bionic InRelease</span>' G& T, C8 i4 W' F4 n
Hit:<span style="color: rgba(128, 0, 128, 1)">2</span> http:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">security.ubuntu.com/ubuntu bionic-security InRelease</span>
M( C9 b5 ^. A5 IHit:<span style="color: rgba(128, 0, 128, 1)">3</span> http:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">archive.ubuntu.com/ubuntu bionic-updates InRelease</span>5 N, f0 ` E; v5 s! Q! L
Hit:<span style="color: rgba(128, 0, 128, 1)">4</span> https:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">download.docker.com/linux/ubuntu bionic InRelease</span>6 ~8 Z' M" _8 y7 T
Hit:<span style="color: rgba(128, 0, 128, 1)">5</span> http:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">archive.ubuntu.com/ubuntu bionic-backports InRelease</span>$ \5 K! ]( J. \( P
<span style="color: rgba(0, 0, 0, 1)">Reading package lists... Done
1 i! o2 }! d Y$ Z6 K! OBuilding dependency tree0 E* ]) y* n+ q' Z/ K# X
Reading state information... Done1 I, a% C( o# {9 K+ w9 _: x3 z3 Y" F
</span><span style="color: rgba(128, 0, 128, 1)">144</span> packages can be upgraded. Run <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">apt list --upgradable</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)"> to see them.3 O, { {& Y6 L# k
$ </span><span style="color: rgba(0, 0, 255, 1)">sudo</span> apt <span style="color: rgba(0, 0, 255, 1)">install</span> bash-<span style="color: rgba(0, 0, 0, 1)">completion
1 n! [" P, P: [. R% GReading package lists... Done* [; ~3 W# t1 S% @
Building dependency tree8 E- j. z, S9 v
Reading state information... Done) x, i8 Z5 ]+ p; j9 B9 ^- R
bash</span>-completion is already the newest version (<span style="color: rgba(128, 0, 128, 1)">1</span>:<span style="color: rgba(128, 0, 128, 1)">2.8</span>-<span style="color: rgba(0, 0, 0, 1)">1ubuntu1)." V6 P& u! Y# z% e
</span><span style="color: rgba(128, 0, 128, 1)">0</span> upgraded, <span style="color: rgba(128, 0, 128, 1)">0</span> newly installed, <span style="color: rgba(128, 0, 128, 1)">0</span> to remove and <span style="color: rgba(128, 0, 128, 1)">144</span> not upgraded.</pre>% u; X8 ^0 t; Q) w& ]
</div>0 \4 r4 }! X% E" I
<p>PS:如果是centos系统,则使用<span class="js_darkmode__0" data-darkmode-color-16446330660319="rgb(0, 104, 255)" data-darkmode-original-color-16446330660319="#fff|rgb(0, 82, 255)" data-style="color: rgb(0, 82, 255);"><strong data-darkmode-color-16446330660319="rgb(0, 104, 255)" data-darkmode-original-color-16446330660319="#fff|rgb(0, 82, 255)">yum install bash-completion -y</strong>命令安装</span></p>3 k2 c6 ~% Y8 T/ p1 N3 E; |
<p>2、<span class="js_darkmode__1" data-darkmode-color-16446330660319="rgb(163, 163, 163)" data-darkmode-original-color-16446330660319="#fff|rgb(0, 0, 0)" data-style="color: rgb(0, 0, 0);">配置自动补全<br></span></p>8 w: D% o" L, s
<p><span class="js_darkmode__2" data-darkmode-color-16446330660319="rgb(163, 163, 163)" data-darkmode-original-color-16446330660319="#fff|rgb(0, 0, 0)" data-style="color: rgb(0, 0, 0);"><strong data-darkmode-color-16446330660319="rgb(163, 163, 163)" data-darkmode-original-color-16446330660319="#fff|rgb(0, 0, 0)">Bash</strong>:</span></p>
: y2 B9 a1 b2 f" [' g% f. C! e<div class="cnblogs_code"># e$ \" S0 @% t; f& U6 U( m
<pre>source <<span style="color: rgba(0, 0, 0, 1)">(kubectl completion bash)
+ Y+ C9 A4 x* H4 p- x. ~: ~# U, {</span><span style="color: rgba(0, 0, 255, 1)">echo</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">source <(kubectl completion bash)</span><span style="color: rgba(128, 0, 0, 1)">"</span> >> ~/.bashrc</pre>
5 i2 K, z3 ]+ W7 N0 e' g) h8 G( z</div>
1 t6 f% c0 }! z! c9 z<p><strong>Zsh</strong>:</p>5 P) W; M3 @8 Z0 B: j8 Q
<div class="cnblogs_code">
' }6 u0 W6 @% |0 n% \8 [<pre>source <<span style="color: rgba(0, 0, 0, 1)">(kubectl completion zsh)
6 }2 M" v0 G, ~. r) o$ o</span><span style="color: rgba(0, 0, 255, 1)">echo</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">[[ $commands[kubectl] ]] && source <(kubectl completion zsh)</span><span style="color: rgba(128, 0, 0, 1)">"</span> >> ~/.zshrc</pre>
- f) S. D' p( U2 D* m& t</div>8 `4 n: c4 [0 R- i3 o1 f; t
<p>配置后就可以通过Tab键自动补全命令啦!</p>
. k) I( X3 [! ?9 c+ j<p> </p>
% i) T2 E! m4 |% }& R. f" B3 ~' N; l<p>二、配置kubectl别名</p>4 _, ^1 {( {7 r
<p>我们可以通过设置别名简化kubectl命令,编辑.bashrc文件,添加如下内容:</p>1 a8 N3 \( E5 u; i2 {% J; [
<div class="cnblogs_code">* }0 B1 I9 r! k0 i8 x
<pre>alias <span style="color: rgba(0, 0, 255, 1)">sudo</span>=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">sudo </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">* `& t. ^2 d* C3 B
alias k</span>=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">kubectl</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
/ W2 |! _( B- [$ k% r* H5 nalias ka</span>=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">kubectl apply --recursive -f</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, T9 v7 z8 x/ ~) ?' L
alias kex</span>=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">kubectl exec -i -t</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">% F$ f0 y0 k1 s: J7 }8 K1 Z1 D! X+ b
alias klo</span>=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">kubectl logs -f</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
4 ] x: t& ^1 j) v* a! Zalias kg</span>=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">kubectl get</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">& L+ z O4 {( S& y
alias kd</span>=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">kubectl describe</span><span style="color: rgba(128, 0, 0, 1)">'</span></pre>: t( ]' O& V/ E/ x z( @+ ?# H
</div>
. u) y' u5 k) h6 r+ W. }0 C<p><span class="js_darkmode__4" data-darkmode-color-16446330660319="rgb(0, 104, 255)" data-darkmode-original-color-16446330660319="#fff|rgb(0, 82, 255)" data-style="color: rgb(0, 82, 255);"><strong data-darkmode-color-16446330660319="rgb(0, 104, 255)" data-darkmode-original-color-16446330660319="#fff|rgb(0, 82, 255)">PS:alias sudo是为了解决sudo下别名不可用问题</strong><br></span></p>
. F |" f" y- @ K; ?3 l<p><span class="js_darkmode__5" data-darkmode-color-16446330660319="rgb(163, 163, 163)" data-darkmode-original-color-16446330660319="#fff|rgb(0, 0, 0)" data-style="color: rgb(0, 0, 0);">保存后记得执行 source ~/.bashrc哈,接着我们体验下:</span></p>
, ?( o4 j4 p, q0 l2 X1 x) V<div class="cnblogs_code">; e( V1 l. `' h) q# O6 z
<pre>$ <span style="color: rgba(0, 0, 255, 1)">sudo</span><span style="color: rgba(0, 0, 0, 1)"> ka webapp_pod.yaml' x7 c8 J4 z# t8 t% B7 Z9 c
pod</span>/<span style="color: rgba(0, 0, 0, 1)">webapp created
& ~0 _$ _# q8 z$ </span><span style="color: rgba(0, 0, 255, 1)">sudo</span><span style="color: rgba(0, 0, 0, 1)"> kg pods
0 a9 c. B$ ]# |7 U7 _- }' h/ W: GNAME READY STATUS RESTARTS AGE
1 M! J7 Y, y5 pwebapp </span><span style="color: rgba(128, 0, 128, 1)">0</span>/<span style="color: rgba(128, 0, 128, 1)">2</span> ContainerCreating <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)"> 7s8 d1 K4 s; E! g7 Q2 ]# N1 G1 L+ t
$ </span><span style="color: rgba(0, 0, 255, 1)">sudo</span><span style="color: rgba(0, 0, 0, 1)"> kd pod webapp
" a; {; c; _1 HName: webapp" {; D' d* W7 _4 t' {5 `( _9 l
Namespace: default2 H( G# h& M4 y5 V4 o3 P' @
Priority: </span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">
7 M w/ ~2 k% D) F0 `Node: ayato</span>/<span style="color: rgba(128, 0, 128, 1)">172.16</span>.<span style="color: rgba(128, 0, 128, 1)">194.135</span><span style="color: rgba(0, 0, 0, 1)">! s2 w' v2 e- f5 |1 z" X
Start Time: Wed, </span><span style="color: rgba(128, 0, 128, 1)">09</span> Feb <span style="color: rgba(128, 0, 128, 1)">2022</span> <span style="color: rgba(128, 0, 128, 1)">14</span>:<span style="color: rgba(128, 0, 128, 1)">04</span>:<span style="color: rgba(128, 0, 128, 1)">44</span> +<span style="color: rgba(128, 0, 128, 1)">0000</span><span style="color: rgba(0, 0, 0, 1)">
0 y5 i2 \# W& d/ f' B0 oLabels: app</span>=<span style="color: rgba(0, 0, 0, 1)">webapp7 H2 s7 z1 b% z
Annotations: </span><none><span style="color: rgba(0, 0, 0, 1)">+ X8 _* [4 \0 `0 G$ E! ]$ M3 o
Status: Running7 w3 t( ?$ S3 r! S2 Y3 j# D
IP: </span><span style="color: rgba(128, 0, 128, 1)">172.17</span>.<span style="color: rgba(128, 0, 128, 1)">0.6</span><span style="color: rgba(0, 0, 0, 1)">
0 q8 y8 V6 ]4 g6 XIPs:5 j; b8 T- k- j( y
IP: </span><span style="color: rgba(128, 0, 128, 1)">172.17</span>.<span style="color: rgba(128, 0, 128, 1)">0.6</span><span style="color: rgba(0, 0, 0, 1)">
+ i A3 _1 C4 b* l9 T9 IContainers:
( P, C+ k' a1 t$ ~ webapp:5 _) O' Y+ n, \, ^, P0 F
Container ID: docker:</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">d9ddf9dd47de12b53f2119bf75df6706bee2e7711509638ad52adc9addeda704</span>
+ u. I5 A' [4 }2 V8 r; Z Image: <span style="color: rgba(128, 0, 128, 1)">172.16</span>.<span style="color: rgba(128, 0, 128, 1)">194.135</span>:<span style="color: rgba(128, 0, 128, 1)">5000</span>/webapp:<span style="color: rgba(128, 0, 128, 1)">1.0</span><span style="color: rgba(0, 0, 0, 1)">7 w. Z8 q: ]) Y J) a' Y d4 ~4 ^
Image ID: docker</span>-pullable:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">172.16.194.135:5000/webapp@sha256:df3a447a013ada0642dec67bb31976f42f1a0699a68873d0452f514fa24e5c77</span>
1 G: Q7 B- W2 D9 b/ F Port: <span style="color: rgba(128, 0, 128, 1)">5000</span>/<span style="color: rgba(0, 0, 0, 1)">TCP% Z4 m9 S* ?* G$ S* d
Host Port: </span><span style="color: rgba(128, 0, 128, 1)">0</span>/<span style="color: rgba(0, 0, 0, 1)">TCP6 _9 L4 ]* O, e F
State: Running
7 D% g$ \ [6 ]+ y: C Started: Wed, </span><span style="color: rgba(128, 0, 128, 1)">09</span> Feb <span style="color: rgba(128, 0, 128, 1)">2022</span> <span style="color: rgba(128, 0, 128, 1)">14</span>:<span style="color: rgba(128, 0, 128, 1)">04</span>:<span style="color: rgba(128, 0, 128, 1)">46</span> +<span style="color: rgba(128, 0, 128, 1)">0000</span><span style="color: rgba(0, 0, 0, 1)">
, | X' U9 F H9 G. @8 M& r! S3 F Ready: True
) K! v9 ?3 L; ]- t: d Restart Count: </span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">
8 @$ i0 O5 A: F7 |0 w; d Environment: </span><none><span style="color: rgba(0, 0, 0, 1)">: a$ U6 B( k% w y2 s# F
Mounts:
8 T3 Z0 H2 u3 h4 y' C </span>/tmp from webapp-<span style="color: rgba(0, 0, 0, 1)">logs (rw). e1 Q& e7 W- h# ?& c9 ?* e
</span>/var/run/secrets/kubernetes.io/serviceaccount from default-token-<span style="color: rgba(0, 0, 0, 1)">pcr2h (ro)
4 y0 y4 @9 j4 [* H1 Q3 m4 o: b busybox:! t, f# \, j, L. Y* s2 S
Container ID: docker:</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">6a6a35a628a782fc643af3dd49986bbc77c23de1ae4726bc521c77f61abbbf5d</span>. q, W, p9 Q. Q7 X
<span style="color: rgba(0, 0, 0, 1)"> Image: busybox
" a+ T$ z5 r. Z4 E( B1 _1 f Image ID: docker</span>-pullable:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">busybox@sha256:afcc7f1ac1b49db317a7196c902e61c6c3c4607d63599ee1a82d702d249a0ccb</span>
2 z; [: [; q2 \' }* \ Port: <none><span style="color: rgba(0, 0, 0, 1)">7 S6 F- x( v+ ^
Host Port: </span><none><span style="color: rgba(0, 0, 0, 1)">
: I; ^' [: k% @/ A6 ^! S! R Command:: L. F9 a6 l# c: P: {
</span><span style="color: rgba(0, 0, 255, 1)">sh</span>7 N& U4 P0 W9 V5 d9 F
-<span style="color: rgba(0, 0, 0, 1)">c
) j' v X+ M1 S( i. x; J </span><span style="color: rgba(0, 0, 255, 1)">tail</span> -f /logs/<span style="color: rgba(0, 0, 0, 1)">log.out4 P8 X* F9 c$ V) o
State: Running9 ^* j4 z- O5 w' u7 k
Started: Wed, </span><span style="color: rgba(128, 0, 128, 1)">09</span> Feb <span style="color: rgba(128, 0, 128, 1)">2022</span> <span style="color: rgba(128, 0, 128, 1)">14</span>:<span style="color: rgba(128, 0, 128, 1)">06</span>:<span style="color: rgba(128, 0, 128, 1)">53</span> +<span style="color: rgba(128, 0, 128, 1)">0000</span><span style="color: rgba(0, 0, 0, 1)">' a+ e& Z3 U2 u3 `
Ready: True3 s0 P' E0 U' v) b2 ]
Restart Count: </span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">
# C0 d; s, l9 ^! q8 F6 \) z2 H) e) V Environment: </span><none><span style="color: rgba(0, 0, 0, 1)">
3 Y' v. Q5 ~7 u; E0 Y- q$ P& ? Mounts:: d; N! U8 v7 k3 g% ~
</span>/logs from webapp-<span style="color: rgba(0, 0, 0, 1)">logs (rw)6 X( T6 ~" D7 s1 ^! _( Z
</span>/var/run/secrets/kubernetes.io/serviceaccount from default-token-<span style="color: rgba(0, 0, 0, 1)">pcr2h (ro)
% l. ~+ q8 s' W, J9 \+ j) ~Conditions:
/ o6 D9 E# k5 O Type Status
& D' q+ n- N% `( W Initialized True
+ m8 ^% I3 T# |2 L; n6 _ Ready True6 q d7 f; q H. U. L/ b7 V
ContainersReady True
& R w4 B: G$ G% ? S! b PodScheduled True
, o; Q9 Y% }3 \6 u' ^# D" V- Z1 BVolumes:
7 e7 a5 w' F' Z webapp</span>-<span style="color: rgba(0, 0, 0, 1)">logs:5 z" I1 R% d' a m
Type: EmptyDir (a temporary directory that shares a pod</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">s lifetime)</span>7 n* N4 J0 f" [5 V
<span style="color: rgba(0, 0, 0, 1)"> Medium:! O9 w1 ^9 D1 u* U' x
SizeLimit: </span><unset><span style="color: rgba(0, 0, 0, 1)">; ?" u$ h" \6 f$ ]9 D2 }; V5 q: ~
default</span>-token-<span style="color: rgba(0, 0, 0, 1)">pcr2h:5 f$ a3 s4 o. N2 P# S8 ]
Type: Secret (a volume populated by a Secret)
& N- t3 G/ V! K5 \! b2 ` SecretName: default</span>-token-<span style="color: rgba(0, 0, 0, 1)">pcr2h
+ b- V. s& ^! M. c6 r7 {9 H. X Optional: </span><span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">- g. q/ V5 l# r
QoS Class: BestEffort
$ a3 I! r( B. V' [# ?) ONode</span>-Selectors: <none><span style="color: rgba(0, 0, 0, 1)">/ H% ^9 P/ A6 Z/ H9 R
Tolerations: node.kubernetes.io</span>/not-ready:NoExecute op=Exists <span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)"> 300s8 Z' g9 d$ P8 G# v# ?6 V1 }! X
node.kubernetes.io</span>/unreachable:NoExecute op=Exists <span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)"> 300s3 T/ J4 d$ h' i( ~+ P+ d) ], k/ K
Events:
; @0 \/ Y! w& A7 |0 l' _ Type Reason Age From Message
2 ]: `* c' c% h6 X, `! U2 H6 u% {8 @ </span>---- ------ ---- ---- -------<span style="color: rgba(0, 0, 0, 1)">. q. E2 V3 k! M% u& A' }6 C+ \
Normal Scheduled 2m23s default</span>-scheduler Successfully assigned default/<span style="color: rgba(0, 0, 0, 1)">webapp to ayato
6 h! L* B# o( i( Q Normal Pulled 2m22s kubelet Container image </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">172.16.194.135:5000/webapp:1.0</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> already present on machine
& ~2 P F7 a f) B+ `; R' k- G Normal Created 2m21s kubelet Created container webapp
4 r/ _0 i2 `# B5 V) D Normal Started 2m21s kubelet Started container webapp8 v( Y# b; [8 O* ~3 R! K
Normal Pulling 2m21s kubelet Pulling image </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">busybox</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
1 i; o6 X9 m3 E$ T Normal Pulled 15s kubelet Successfully pulled image </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">busybox</span><span style="color: rgba(128, 0, 0, 1)">"</span> <span style="color: rgba(0, 0, 255, 1)">in</span> <span style="color: rgba(128, 0, 128, 1)">14</span><span style="color: rgba(0, 0, 0, 1)">.633078305s
1 o: h& ~" y( M1 q) T9 f' X ]- z' w Normal Created 15s kubelet Created container busybox* r" J7 d0 A, L) l5 l9 [! V4 d( i/ N
Normal Started 14s kubelet Started container busybox</span></pre>. @4 z) u" M) ~
</div>( _" a7 T. p% Q4 c' n
<p>真的是飞一般的感觉!!!</p>/ z/ ~& g$ H5 ~
<p> </p>
; P* e0 M. t- f2 w; V8 b<p>三、Context和Namespace切换</p>: F$ e$ c( W; x7 P( u X# @9 O
<p>我们在公司的容器平台上使用kubectl时,经常需要切换context和namespace,导致命令非常繁琐,那有没有简便的方式呢?—— kubectx</p>
" g; d) e" c% E# r h& T<p>kubectx安装</p>6 y. ]) ]+ e' x7 u7 [
<div class="cnblogs_code">3 R6 t6 ?& c3 U1 {
<pre>$ <span style="color: rgba(0, 0, 255, 1)">sudo</span> git clone https:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">github.com/ahmetb/kubectx /opt/kubectx</span>2 Y" \% F4 }$ @/ E6 M3 B* F L4 F. q
Cloning into <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/opt/kubectx</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">...6 S& ?# \/ ]% |" V
remote: Enumerating objects: </span><span style="color: rgba(128, 0, 128, 1)">1457</span>, <span style="color: rgba(0, 0, 255, 1)">done</span><span style="color: rgba(0, 0, 0, 1)">.
4 V( c/ J) H/ g [remote: Counting objects: </span><span style="color: rgba(128, 0, 128, 1)">100</span>% (<span style="color: rgba(128, 0, 128, 1)">172</span>/<span style="color: rgba(128, 0, 128, 1)">172</span>), <span style="color: rgba(0, 0, 255, 1)">done</span><span style="color: rgba(0, 0, 0, 1)">.+ ]% S8 V# \% m& m5 l- I
remote: Compressing objects: </span><span style="color: rgba(128, 0, 128, 1)">100</span>% (<span style="color: rgba(128, 0, 128, 1)">115</span>/<span style="color: rgba(128, 0, 128, 1)">115</span>), <span style="color: rgba(0, 0, 255, 1)">done</span><span style="color: rgba(0, 0, 0, 1)">.$ N% b& S; W, f- e( k
remote: Total </span><span style="color: rgba(128, 0, 128, 1)">1457</span> (delta <span style="color: rgba(128, 0, 128, 1)">85</span>), reused <span style="color: rgba(128, 0, 128, 1)">97</span> (delta <span style="color: rgba(128, 0, 128, 1)">51</span>), pack-reused <span style="color: rgba(128, 0, 128, 1)">1285</span><span style="color: rgba(0, 0, 0, 1)">. i# q0 o9 [; C" I( U- o5 f8 O7 c) Q
Receiving objects: </span><span style="color: rgba(128, 0, 128, 1)">100</span>% (<span style="color: rgba(128, 0, 128, 1)">1457</span>/<span style="color: rgba(128, 0, 128, 1)">1457</span>), <span style="color: rgba(128, 0, 128, 1)">905.30</span> KiB | <span style="color: rgba(128, 0, 128, 1)">69.00</span> KiB/s, <span style="color: rgba(0, 0, 255, 1)">done</span><span style="color: rgba(0, 0, 0, 1)">.
% y# D; O* A6 `/ W* U% fResolving deltas: </span><span style="color: rgba(128, 0, 128, 1)">100</span>% (<span style="color: rgba(128, 0, 128, 1)">817</span>/<span style="color: rgba(128, 0, 128, 1)">817</span>), <span style="color: rgba(0, 0, 255, 1)">done</span><span style="color: rgba(0, 0, 0, 1)">.
* T4 v7 ~) _# }$ </span><span style="color: rgba(0, 0, 255, 1)">sudo</span> <span style="color: rgba(0, 0, 255, 1)">ln</span> -s /opt/kubectx/kubens /usr/local/bin/kubectl-<span style="color: rgba(0, 0, 0, 1)">ns
" j. b2 i0 _5 q m$ </span><span style="color: rgba(0, 0, 255, 1)">sudo</span> <span style="color: rgba(0, 0, 255, 1)">ln</span> -s /opt/kubectx/kubectx /usr/local/bin/kubectl-ctx</pre>5 a( }: R- w+ V4 S) h
</div>! [+ u9 _8 ^# h/ R' c
<p>我们来看一下效果:</p>
4 i' i q( I A- v( h<div class="cnblogs_code">
2 i8 U9 B X0 w. D; w( o<pre>$ <span style="color: rgba(0, 0, 255, 1)">sudo</span><span style="color: rgba(0, 0, 0, 1)"> k ctx T/ i, D( i( ^/ ?( S, T5 T) H
minikube
/ [: O- Z7 F6 a& Z e* W5 A# V$ </span><span style="color: rgba(0, 0, 255, 1)">sudo</span><span style="color: rgba(0, 0, 0, 1)"> k ctx minikube
- ]% [2 P A2 |0 J1 Q1 j! sSwitched to context </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">minikube</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">.
( I/ g2 n, H+ X; ~* q( |3 ]$ </span><span style="color: rgba(0, 0, 255, 1)">sudo</span><span style="color: rgba(0, 0, 0, 1)"> k ns
/ G9 h5 S7 c# l7 O5 tdefault
& i: A k0 W6 {6 ?# xkube</span>-node-<span style="color: rgba(0, 0, 0, 1)">lease8 I9 E) W N$ z& r
kube</span>-<span style="color: rgba(0, 0, 0, 1)">public
: {( u" V% C8 S( qkube</span>-<span style="color: rgba(0, 0, 0, 1)">system! X* Q u( d$ U$ w
kubernetes</span>-<span style="color: rgba(0, 0, 0, 1)">dashboard
1 b# m$ N* Q3 f! Z$ ~; _1 c$ </span><span style="color: rgba(0, 0, 255, 1)">sudo</span> k ns kube-<span style="color: rgba(0, 0, 0, 1)">public; G) X: W' W5 C8 G( [
Context </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">minikube</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> modified.! `$ \- q$ w! [0 l. d/ B
Active namespace is </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">kube-public</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">.
$ F5 R/ g* J5 D- ?" B$ </span><span style="color: rgba(0, 0, 255, 1)">sudo</span><span style="color: rgba(0, 0, 0, 1)"> k ns default9 J9 X* X' Z& O- y5 Q
Context </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">minikube</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> modified.' g' T$ J# C- f3 a* G
Active namespace is </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">default</span><span style="color: rgba(128, 0, 0, 1)">"</span>.</pre>
) M8 V& c7 |* ^</div>
# y: h& b: S0 T* R6 G<p> </p>& [! W' a/ ^+ Q9 w4 T% G
<p>四、跟踪查看多个Pod的日志</p>: k& C1 Y- Q* \9 i1 B1 L' ? c1 }
<p>我们一般使用kubectl logs命令查看Pod日志,但是它不能通过-f参数同时跟踪查看多个Pod日志,这就不方便了,毕竟实际生产环境中每个服务都会有多个Pod,这时我们可以使用stern这个工具,它具备如下能力:</p>
U7 M" d1 w$ P0 H# u& L<ul class="list-paddingleft-2">
- A# |; |+ v: i' ^! o6 c# C( V: M<li>
+ v5 x( s) [4 T<p>允许使用正则表达式来选择需要查看的PodName</p>
1 F% Q; R8 `/ y& t5 Y$ V6 a</li>
) s4 i% p7 C6 a) \) G! ^<li>6 p4 }3 V) w9 v, i6 I2 X. m
<p>为不同 Pod 的日志展示不同的颜色</p>
6 [9 ]& A; t$ b</li>
. `( X% w4 H. H3 g5 g/ ] G7 U( F& z. O<li>
4 i" p7 {# a: ?<p>跟踪日志过程中假如有符合规则的新 Pod 被创建, 那么会自动添加到输出中</p>
" c/ b+ g1 M' v8 {6 I</li>
; Z, d! B7 C, \2 @+ l' ^% a</ul># ~0 H8 a0 a3 p7 h
<p>首先安装stern(下载stern时可能较慢可以多试几次):</p>
5 P# K1 G4 x- M% i<div class="cnblogs_code"> P! _9 Y$ i& A! t3 E- u- V
<pre><span style="color: rgba(0, 0, 255, 1)">wget</span> https:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">github.com/wercker/stern/releases/download/1.11.0/stern_linux_amd64</span>
) D* N! E! E. q6 ^9 B: a<span style="color: rgba(0, 0, 255, 1)">sudo</span> <span style="color: rgba(0, 0, 255, 1)">mv</span> stern_linux_amd64 /usr/local/bin/kubectl-<span style="color: rgba(0, 0, 255, 1)">tail</span>6 i" Z% y% A4 y: U$ `1 q
<span style="color: rgba(0, 0, 255, 1)">sudo</span> chomd +x /usr/local/bin/kubectl-<span style="color: rgba(0, 0, 255, 1)">tail</span></pre>
. a* N: y( r \; U</div>
& z$ _- g( y" z: f6 P<p>安装完毕后让我一起感受一下stern的魅力吧,我的Pod里面有两个容器:webapp和busybox,如果使用kubectl logs 还得指定具体的容器,而使用stern就没有这样的限制。</p>
, z4 t0 o) W& c) G' G* c<div class="cnblogs_code">3 L- A2 w3 A( {0 x5 ?
<pre>$ <span style="color: rgba(0, 0, 255, 1)">sudo</span> k <span style="color: rgba(0, 0, 255, 1)">tail</span><span style="color: rgba(0, 0, 0, 1)"> .
& Z$ F" n0 `, r' i7 Z/ |/ @</span>+<span style="color: rgba(0, 0, 0, 1)"> webapp › busybox
2 j! C( J/ G) ~' `5 q</span>+<span style="color: rgba(0, 0, 0, 1)"> webapp › webapp
" b k) @+ |8 _! Mwebapp busybox </span><span style="color: rgba(128, 0, 128, 1)">14</span>:<span style="color: rgba(128, 0, 128, 1)">04</span>:<span style="color: rgba(128, 0, 128, 1)">53.197</span> [INFO ] [main] [org.apache.coyote.http11.Http11NioProtocol] Initializing ProtocolHandler [<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">http-nio-4567</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">]# K( v3 C. `5 d- }3 s
webapp busybox </span><span style="color: rgba(128, 0, 128, 1)">14</span>:<span style="color: rgba(128, 0, 128, 1)">04</span>:<span style="color: rgba(128, 0, 128, 1)">53.200</span><span style="color: rgba(0, 0, 0, 1)"> [INFO ] [main] [org.apache.catalina.core.StandardService] Starting service [Tomcat]
* t' m/ K6 Q5 A" K, Iwebapp busybox </span><span style="color: rgba(128, 0, 128, 1)">14</span>:<span style="color: rgba(128, 0, 128, 1)">04</span>:<span style="color: rgba(128, 0, 128, 1)">53.201</span> [INFO ] [main] [org.apache.catalina.core.StandardEngine] Starting Servlet engine: [Apache Tomcat/<span style="color: rgba(128, 0, 128, 1)">9.0</span>.<span style="color: rgba(128, 0, 128, 1)">41</span><span style="color: rgba(0, 0, 0, 1)">]7 d& z9 t ?. ~* M8 R, u4 G
webapp busybox </span><span style="color: rgba(128, 0, 128, 1)">14</span>:<span style="color: rgba(128, 0, 128, 1)">04</span>:<span style="color: rgba(128, 0, 128, 1)">53.324</span> [INFO ] [main] [org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/<span style="color: rgba(0, 0, 0, 1)">]] Initializing Spring embedded WebApplicationContext
8 w: }! y' \$ C O1 b% J, f3 Gwebapp busybox </span><span style="color: rgba(128, 0, 128, 1)">14</span>:<span style="color: rgba(128, 0, 128, 1)">04</span>:<span style="color: rgba(128, 0, 128, 1)">53.325</span> [INFO ] [main] [org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext] Root WebApplicationContext: initialization completed <span style="color: rgba(0, 0, 255, 1)">in</span> <span style="color: rgba(128, 0, 128, 1)">2952</span><span style="color: rgba(0, 0, 0, 1)"> ms; m$ T+ C+ U$ C# q: e
webapp busybox </span><span style="color: rgba(128, 0, 128, 1)">14</span>:<span style="color: rgba(128, 0, 128, 1)">04</span>:<span style="color: rgba(128, 0, 128, 1)">53.801</span> [INFO ] [main] [org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor] Initializing ExecutorService <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">applicationTaskExecutor</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
8 O* A2 H1 K% r& n, {7 K$ H+ vwebapp busybox </span><span style="color: rgba(128, 0, 128, 1)">14</span>:<span style="color: rgba(128, 0, 128, 1)">04</span>:<span style="color: rgba(128, 0, 128, 1)">54.264</span> [WARN ] [main] [org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration$DefaultTemplateResolverConfiguration] Cannot <span style="color: rgba(0, 0, 255, 1)">find</span> template location: classpath:/templates/<span style="color: rgba(0, 0, 0, 1)"> (please add some templates or check your Thymeleaf configuration)9 X: G& N+ Y& x
webapp busybox </span><span style="color: rgba(128, 0, 128, 1)">14</span>:<span style="color: rgba(128, 0, 128, 1)">04</span>:<span style="color: rgba(128, 0, 128, 1)">54.377</span> [INFO ] [main] [org.apache.coyote.http11.Http11NioProtocol] Starting ProtocolHandler [<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">http-nio-4567</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">] _% G5 Z: u1 a' `1 x) J1 _) Y8 `
webapp busybox </span><span style="color: rgba(128, 0, 128, 1)">14</span>:<span style="color: rgba(128, 0, 128, 1)">04</span>:<span style="color: rgba(128, 0, 128, 1)">54.481</span> [INFO ] [main] [org.springframework.boot.web.embedded.tomcat.TomcatWebServer] Tomcat started on port(s): <span style="color: rgba(128, 0, 128, 1)">4567</span> (http) with context path <span style="color: rgba(128, 0, 0, 1)">''</span><span style="color: rgba(0, 0, 0, 1)">
/ L, k) g- X6 i2 i& Lwebapp busybox </span><span style="color: rgba(128, 0, 128, 1)">14</span>:<span style="color: rgba(128, 0, 128, 1)">04</span>:<span style="color: rgba(128, 0, 128, 1)">54.509</span> [INFO ] [main] [org.demo.webapp.todolist.TodoListApplication] Started TodoListApplication <span style="color: rgba(0, 0, 255, 1)">in</span> <span style="color: rgba(128, 0, 128, 1)">6.235</span> seconds (JVM running <span style="color: rgba(0, 0, 255, 1)">for</span> <span style="color: rgba(128, 0, 128, 1)">8.074</span><span style="color: rgba(0, 0, 0, 1)">)
+ N9 d% C* d9 `& Q9 A3 wwebapp webapp! n V: U* z: v! g# @) z
webapp webapp . ____ _ __ _ _
, K1 x! h8 {* w% \webapp webapp </span>/\\ / ___<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">_ __ _ _(_)_ __ __ _ \ \ \ \</span>: L5 {+ j9 I& a/ ]& C
webapp webapp ( ( )\___ | <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">_ | </span><span style="color: rgba(128, 0, 0, 1)">'</span>_| | <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">_ \/ _` | \ \ \ \</span>
0 w4 u# H6 e% l; E) vwebapp webapp \\/ ___)| |_)| | | | | || (_| |<span style="color: rgba(0, 0, 0, 1)"> ) ) ) )
$ S+ j+ U4 H# l+ N: n& v4 P* k* ywebapp webapp </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)"> |____| .__|_| |_|_| |_\__, | / / / /</span>
+ D" h* a, A" @8 h4 U3 Y' m p+ ?webapp webapp =========|_|==============|___/=/_/_/_/<span style="color: rgba(0, 0, 0, 1)">
! n* m+ S8 {8 {- l6 g. O" t- ^1 zwebapp webapp :: Spring Boot :: (v2.</span><span style="color: rgba(128, 0, 128, 1)">4.2</span><span style="color: rgba(0, 0, 0, 1)">)1 ~3 r! X! C' T1 e, |
webapp webapp
, N f1 r, J* U! y( J5 l# ]+ D3 qwebapp webapp </span><span style="color: rgba(128, 0, 128, 1)">14</span>:<span style="color: rgba(128, 0, 128, 1)">04</span>:<span style="color: rgba(128, 0, 128, 1)">50.124</span> [INFO ] [main] [org.demo.webapp.todolist.TodoListApplication] Starting TodoListApplication v1.<span style="color: rgba(128, 0, 128, 1)">0</span>-SNAPSHOT using Java <span style="color: rgba(128, 0, 128, 1)">1.8</span>.0_111 on webapp with PID <span style="color: rgba(128, 0, 128, 1)">1</span> (/opt/soft/webapp.jar started by root <span style="color: rgba(0, 0, 255, 1)">in</span> /opt/<span style="color: rgba(0, 0, 0, 1)">soft)
* Q0 U6 Z! Q7 |8 I. @webapp webapp </span><span style="color: rgba(128, 0, 128, 1)">14</span>:<span style="color: rgba(128, 0, 128, 1)">04</span>:<span style="color: rgba(128, 0, 128, 1)">50.165</span><span style="color: rgba(0, 0, 0, 1)"> [INFO ] [main] [org.demo.webapp.todolist.TodoListApplication] No active profile set, falling back to default profiles: default5 k: t8 j1 D4 q2 \ k7 W! y5 _
webapp webapp </span><span style="color: rgba(128, 0, 128, 1)">14</span>:<span style="color: rgba(128, 0, 128, 1)">04</span>:<span style="color: rgba(128, 0, 128, 1)">53.158</span> [INFO ] [main] [org.springframework.boot.web.embedded.tomcat.TomcatWebServer] Tomcat initialized with port(s): <span style="color: rgba(128, 0, 128, 1)">4567</span><span style="color: rgba(0, 0, 0, 1)"> (http); x5 c& Q/ [4 [- T% W) T8 p8 Q
webapp webapp </span><span style="color: rgba(128, 0, 128, 1)">14</span>:<span style="color: rgba(128, 0, 128, 1)">04</span>:<span style="color: rgba(128, 0, 128, 1)">53.197</span> [INFO ] [main] [org.apache.coyote.http11.Http11NioProtocol] Initializing ProtocolHandler [<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">http-nio-4567</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">]) v. X1 Y" R$ r8 `
webapp webapp </span><span style="color: rgba(128, 0, 128, 1)">14</span>:<span style="color: rgba(128, 0, 128, 1)">04</span>:<span style="color: rgba(128, 0, 128, 1)">53.200</span><span style="color: rgba(0, 0, 0, 1)"> [INFO ] [main] [org.apache.catalina.core.StandardService] Starting service [Tomcat]5 r$ ?. Q" R O' N
webapp webapp </span><span style="color: rgba(128, 0, 128, 1)">14</span>:<span style="color: rgba(128, 0, 128, 1)">04</span>:<span style="color: rgba(128, 0, 128, 1)">53.201</span> [INFO ] [main] [org.apache.catalina.core.StandardEngine] Starting Servlet engine: [Apache Tomcat/<span style="color: rgba(128, 0, 128, 1)">9.0</span>.<span style="color: rgba(128, 0, 128, 1)">41</span><span style="color: rgba(0, 0, 0, 1)">]: q1 |+ P4 Q. Y! W8 x
webapp webapp </span><span style="color: rgba(128, 0, 128, 1)">14</span>:<span style="color: rgba(128, 0, 128, 1)">04</span>:<span style="color: rgba(128, 0, 128, 1)">53.324</span> [INFO ] [main] [org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/<span style="color: rgba(0, 0, 0, 1)">]] Initializing Spring embedded WebApplicationContext3 M, \. J4 N' H5 t6 q
webapp webapp </span><span style="color: rgba(128, 0, 128, 1)">14</span>:<span style="color: rgba(128, 0, 128, 1)">04</span>:<span style="color: rgba(128, 0, 128, 1)">53.325</span> [INFO ] [main] [org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext] Root WebApplicationContext: initialization completed <span style="color: rgba(0, 0, 255, 1)">in</span> <span style="color: rgba(128, 0, 128, 1)">2952</span><span style="color: rgba(0, 0, 0, 1)"> ms( x: S# g4 C1 E$ w$ |9 `( }5 W
webapp webapp </span><span style="color: rgba(128, 0, 128, 1)">14</span>:<span style="color: rgba(128, 0, 128, 1)">04</span>:<span style="color: rgba(128, 0, 128, 1)">53.801</span> [INFO ] [main] [org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor] Initializing ExecutorService <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">applicationTaskExecutor</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
6 T B/ S p" gwebapp webapp </span><span style="color: rgba(128, 0, 128, 1)">14</span>:<span style="color: rgba(128, 0, 128, 1)">04</span>:<span style="color: rgba(128, 0, 128, 1)">54.264</span> [WARN ] [main] [org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration$DefaultTemplateResolverConfiguration] Cannot <span style="color: rgba(0, 0, 255, 1)">find</span> template location: classpath:/templates/<span style="color: rgba(0, 0, 0, 1)"> (please add some templates or check your Thymeleaf configuration)
7 ?+ K% C& J& g9 @/ n& ^webapp webapp </span><span style="color: rgba(128, 0, 128, 1)">14</span>:<span style="color: rgba(128, 0, 128, 1)">04</span>:<span style="color: rgba(128, 0, 128, 1)">54.377</span> [INFO ] [main] [org.apache.coyote.http11.Http11NioProtocol] Starting ProtocolHandler [<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">http-nio-4567</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">]) H- s% Q' J& _
webapp webapp </span><span style="color: rgba(128, 0, 128, 1)">14</span>:<span style="color: rgba(128, 0, 128, 1)">04</span>:<span style="color: rgba(128, 0, 128, 1)">54.481</span> [INFO ] [main] [org.springframework.boot.web.embedded.tomcat.TomcatWebServer] Tomcat started on port(s): <span style="color: rgba(128, 0, 128, 1)">4567</span> (http) with context path <span style="color: rgba(128, 0, 0, 1)">''</span><span style="color: rgba(0, 0, 0, 1)">
0 N7 G) T- a; F' L) i3 Y$ V' w) swebapp webapp </span><span style="color: rgba(128, 0, 128, 1)">14</span>:<span style="color: rgba(128, 0, 128, 1)">04</span>:<span style="color: rgba(128, 0, 128, 1)">54.509</span> [INFO ] [main] [org.demo.webapp.todolist.TodoListApplication] Started TodoListApplication <span style="color: rgba(0, 0, 255, 1)">in</span> <span style="color: rgba(128, 0, 128, 1)">6.235</span> seconds (JVM running <span style="color: rgba(0, 0, 255, 1)">for</span> <span style="color: rgba(128, 0, 128, 1)">8.074</span>)</pre># i& O u6 s- u+ k: V
</div>6 g! ^- z9 i. e6 F
<p> </p>
) x; j: ]4 E; M1 D' W |
|