|
|
* O* F: n+ i2 c2 Y/ R$ T" \<p>kubectl作为我们主要的操作K8S的工具,其具备非常丰富的功能,但是如果不经过打磨,使用起来还是存在诸多不便,今天我们来看看如何将我们的kubectl打磨的更加易用。</p>
. C; z$ g1 v+ D<p> </p>; A Y V; b* r5 C# M
<p>一、命令自动补全</p># `( y8 A6 D4 U6 ^
<p>kubectl中提供非常多的命令,如果每一次都要手动一个字符一个字符的敲未免太累了,那么如何配置自动补全呢?这里以ubuntu系统为例:</p>
; ?8 S: Q9 a" {* G<p>1、安装auto-completion工具</p>! O- i1 D+ i2 H% \) \4 |. I
<div class="cnblogs_code">* `0 A" s3 c9 p8 [5 h6 ]& M5 b" _6 ]
<pre>$ <span style="color: rgba(0, 0, 255, 1)">sudo</span><span style="color: rgba(0, 0, 0, 1)"> apt update& l! U' d& R, J, p4 E
Hit:</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>2 ^0 a2 w' ~9 n3 I! N r* L
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>4 a2 k+ s$ F0 E: ~2 x& o
Hit:<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>
) {/ d5 b# q6 Y0 H" }! CHit:<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>8 k: Q" `8 a; E8 f \5 S: K2 M
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>
8 M+ \, f+ B6 [3 p0 y0 X<span style="color: rgba(0, 0, 0, 1)">Reading package lists... Done
6 T$ K2 E4 } v9 ~Building dependency tree
$ _2 M+ n0 M7 H% L8 wReading state information... Done
$ S) L& n6 M) L3 P" n: ~</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.; R, r" j2 Y( X4 H. m2 V- M9 X
$ </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)">completion9 K1 P- ]3 ]! [, I
Reading package lists... Done
9 k& S/ \ |0 [/ y" [Building dependency tree% f3 E( Z$ {3 e @
Reading state information... Done& n: W) |* B9 V# A/ D5 f3 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).
4 o; D& z& ]% ` u, a; p4 Q</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>$ c9 N/ \1 R q' \9 t7 ~
</div>
8 V# h4 |, u9 W* M# r8 t<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>
5 w* S( l9 R+ w) 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>* ?" ]" @$ C, W+ T
<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>- t5 y% d: v+ _! } C
<div class="cnblogs_code">
, j4 K$ H# V G% h+ j& n' p! d$ n) k<pre>source <<span style="color: rgba(0, 0, 0, 1)">(kubectl completion bash)
4 T) p0 n! }7 x& Q- Q( y2 {</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>9 {& W4 c5 i# t/ E
</div>
D# U! b3 g* p* Z* l<p><strong>Zsh</strong>:</p># i% G. p0 k& ?8 C/ o* q
<div class="cnblogs_code">
- C$ z8 K$ n6 P( U<pre>source <<span style="color: rgba(0, 0, 0, 1)">(kubectl completion zsh)- b: t3 u1 U+ q4 ]7 I( d$ R' ]
</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>3 R$ u: q7 T4 H& ~$ S
</div>7 \3 A6 d# N- r v) r2 c" q
<p>配置后就可以通过Tab键自动补全命令啦!</p>! H7 l4 C" k1 G6 H! K1 j3 }
<p> </p>* A2 \! C# U* w' N
<p>二、配置kubectl别名</p>* T/ e M) l6 O
<p>我们可以通过设置别名简化kubectl命令,编辑.bashrc文件,添加如下内容:</p>
/ U2 @6 o+ A7 t<div class="cnblogs_code">
/ @3 V0 _3 L; J5 G- {<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)">
! y& e. }5 \$ K/ Calias 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)">
" Y- G, ?, Q% Z, ]alias 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)">6 T! t( J! j1 f3 ]% \ z; _6 q9 x( E
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)">
7 B5 v, l, e7 k# M: Kalias 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)">' ~. m% [7 ~" n! c" L, y3 @# c( o
alias 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)">
4 A* k7 \: y7 x& valias 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>
( ^) k I' y9 o</div>5 Q, x& N* [5 G" j$ j
<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>
) Z/ T0 d) D8 X# [; I1 d, ]<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>* b! H: |( W @: k( W* m
<div class="cnblogs_code">
. i6 T, D* K3 e* k3 N<pre>$ <span style="color: rgba(0, 0, 255, 1)">sudo</span><span style="color: rgba(0, 0, 0, 1)"> ka webapp_pod.yaml& Z6 w7 `( G5 V/ z6 _1 n9 q
pod</span>/<span style="color: rgba(0, 0, 0, 1)">webapp created8 T8 P7 n: h% ^0 a# h0 g
$ </span><span style="color: rgba(0, 0, 255, 1)">sudo</span><span style="color: rgba(0, 0, 0, 1)"> kg pods" c ]6 |/ E; P
NAME READY STATUS RESTARTS AGE
]( G; ]. F' M0 ], W. rwebapp </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)"> 7s5 l+ A% m& o* }5 s4 d. g: N' i
$ </span><span style="color: rgba(0, 0, 255, 1)">sudo</span><span style="color: rgba(0, 0, 0, 1)"> kd pod webapp
+ g3 h, _! ?' A- j9 ~: i, \; gName: webapp4 V% v' H$ q7 f% _! i8 V& m
Namespace: default' E. v2 W1 K2 A4 i" |& J( R
Priority: </span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">& ?) r8 c$ ]2 o5 F4 x2 j! l
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)">
' ]( _' F8 P; m' f& R6 D! RStart 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)">
5 T# j- q0 @4 t+ o v; wLabels: app</span>=<span style="color: rgba(0, 0, 0, 1)">webapp
) ?9 c; g2 i/ x& a9 AAnnotations: </span><none><span style="color: rgba(0, 0, 0, 1)">
+ N" ?% T: Y/ x% t% j# y4 GStatus: Running
& U4 x0 M$ h B4 F: [- e% e/ QIP: </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)">/ @: ^& ~! c6 t1 S' Q9 E" p1 `
IPs:
) F& r" G. D7 ?) J8 b S# f 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 |6 ^4 H* ]8 d6 lContainers:8 Q/ a+ I7 R" l( s
webapp:6 q# H) S% E5 ?& Y2 R3 _* k% @
Container ID: docker:</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">d9ddf9dd47de12b53f2119bf75df6706bee2e7711509638ad52adc9addeda704</span>, t8 M1 r* w% c" E) g! G9 L" V8 M
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)">) P/ z2 T2 k9 d
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>
) ]# P1 {# L. i. y" r" x: { Port: <span style="color: rgba(128, 0, 128, 1)">5000</span>/<span style="color: rgba(0, 0, 0, 1)">TCP
2 Y$ Q9 }# b' k1 ]0 } Host Port: </span><span style="color: rgba(128, 0, 128, 1)">0</span>/<span style="color: rgba(0, 0, 0, 1)">TCP2 f, [; K9 @5 \9 J) R, f. s
State: Running6 O7 D" T2 e9 U& u3 H
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)">
1 P/ z: Z; h) B9 F Ready: True% C# k4 i* D/ h9 ~
Restart Count: </span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">
, s6 {4 f* c3 g% o- R+ b4 A" _ Environment: </span><none><span style="color: rgba(0, 0, 0, 1)">
, o5 Y+ d* S+ S3 j/ f4 x Mounts:# v/ a! h5 @7 b( R w0 p+ ]* f( a
</span>/tmp from webapp-<span style="color: rgba(0, 0, 0, 1)">logs (rw)7 U6 f2 V* F, g$ i. U- ?4 |4 [
</span>/var/run/secrets/kubernetes.io/serviceaccount from default-token-<span style="color: rgba(0, 0, 0, 1)">pcr2h (ro)
+ Z5 S. G# Y! b5 y+ y: @ busybox:4 f3 m7 U l& h' |0 y
Container ID: docker:</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">6a6a35a628a782fc643af3dd49986bbc77c23de1ae4726bc521c77f61abbbf5d</span>
$ X9 p( T* J9 U. U. D<span style="color: rgba(0, 0, 0, 1)"> Image: busybox- o. m( ^9 P, Q8 z9 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>
6 F9 v; g. U! U Port: <none><span style="color: rgba(0, 0, 0, 1)">
7 F: c/ t# W P8 c) j$ o1 G Host Port: </span><none><span style="color: rgba(0, 0, 0, 1)">) Z1 w1 l; {0 ?4 r- d: F2 j0 O7 G: J
Command:( x* @" Y7 J3 U5 i
</span><span style="color: rgba(0, 0, 255, 1)">sh</span>
' U( a8 T7 V8 G/ E% h -<span style="color: rgba(0, 0, 0, 1)">c1 e' O, ?- L& S
</span><span style="color: rgba(0, 0, 255, 1)">tail</span> -f /logs/<span style="color: rgba(0, 0, 0, 1)">log.out" y- X' [% l0 e, t4 a
State: Running7 r' A. [* R4 ^7 U6 {1 h+ ^& Q
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)">' P# u5 F% R" W8 k) l
Ready: True& ^' U. B. D$ e* w% l
Restart Count: </span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">- p% M5 @9 [, W2 v) Q
Environment: </span><none><span style="color: rgba(0, 0, 0, 1)">/ O/ ~9 L4 S) v+ S5 g' n
Mounts:
' h/ V1 w: H9 K! L </span>/logs from webapp-<span style="color: rgba(0, 0, 0, 1)">logs (rw)* D% M3 v2 Z- B6 D$ S3 u- {
</span>/var/run/secrets/kubernetes.io/serviceaccount from default-token-<span style="color: rgba(0, 0, 0, 1)">pcr2h (ro)$ E# P& l% ^ x4 a
Conditions:
4 {5 b. _& I7 p& x1 ]" X, U6 ^ Type Status) @' C( J( M7 W- |% D* f2 J
Initialized True' n% ]! y3 d; q2 ^
Ready True
/ z- f3 A! p1 w/ h1 t. Q ContainersReady True
$ I$ L( C* L; C8 j PodScheduled True
& D$ ?+ N& L& J# O) D* L eVolumes:* k- e: u2 n5 n2 D& ]/ B
webapp</span>-<span style="color: rgba(0, 0, 0, 1)">logs:
6 a8 t+ W4 ~5 ~0 D$ u 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>& a- _4 f) e5 `. Z% L7 T& W
<span style="color: rgba(0, 0, 0, 1)"> Medium:- A3 q, ], p2 Z* h. o% T
SizeLimit: </span><unset><span style="color: rgba(0, 0, 0, 1)">
" ?: D. I: T/ B" Z% u/ t default</span>-token-<span style="color: rgba(0, 0, 0, 1)">pcr2h:5 G" b; x$ M; D
Type: Secret (a volume populated by a Secret); Q7 G5 W5 F D4 c# Q6 N) t9 f9 g
SecretName: default</span>-token-<span style="color: rgba(0, 0, 0, 1)">pcr2h
: }0 s* G" H. A* l Optional: </span><span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">
7 M6 q, r% v0 }" QQoS Class: BestEffort
# s, l, u# D% T! h' s. u$ `Node</span>-Selectors: <none><span style="color: rgba(0, 0, 0, 1)">: x0 ? C2 T# l
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)"> 300s
% W, V: ]" j7 ?6 { 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)"> 300s6 [- R% C& U1 y7 k+ @. f0 a
Events:
2 i+ d, Q! N g* @ w1 d! d0 A Type Reason Age From Message
; N; L+ E6 t* U8 B4 t </span>---- ------ ---- ---- -------<span style="color: rgba(0, 0, 0, 1)">. V- U' c& B2 V9 y% w5 A
Normal Scheduled 2m23s default</span>-scheduler Successfully assigned default/<span style="color: rgba(0, 0, 0, 1)">webapp to ayato
6 }" y" U6 n' \* b* L } 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& s1 b* i$ n% k- W* o) Q
Normal Created 2m21s kubelet Created container webapp0 Y6 {9 [* B* K1 @8 g1 k: _3 w5 p
Normal Started 2m21s kubelet Started container webapp
9 c& W+ q1 r- T! D1 B4 `7 ] 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)">3 t4 [1 `3 ?" G6 T1 a7 t+ F. H
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)">.633078305s2 k) p) C T: t
Normal Created 15s kubelet Created container busybox
) w! a- D T3 d' s Normal Started 14s kubelet Started container busybox</span></pre>' f0 j( A1 K! `3 F6 `: S+ ?
</div>
. E5 O% M1 S1 i7 G. z; {6 G* f+ C<p>真的是飞一般的感觉!!!</p>
. s( ?/ l# I5 E4 q' ~4 \0 S<p> </p>! p5 R" s# u; Q4 O
<p>三、Context和Namespace切换</p>
& m7 J3 Y3 }: a<p>我们在公司的容器平台上使用kubectl时,经常需要切换context和namespace,导致命令非常繁琐,那有没有简便的方式呢?—— kubectx</p>; A# ]! @; M ^8 @
<p>kubectx安装</p>
) E, a1 s$ p+ O6 {6 x<div class="cnblogs_code">' i+ j; G6 C. U
<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>. S0 n5 x% G8 V5 j1 m; l% [* P
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)">...0 U5 L3 l$ P1 \$ A) f
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)">.
}+ t( l8 d6 j" Q' Aremote: 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)">.
+ N/ x* H" C7 C9 ?* {% u: Oremote: 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)">.# G0 k7 P, o0 f9 e2 Y- k! c7 h" D; q
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)">
1 A9 q7 [! v k4 fReceiving 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)">./ h6 m+ ], N5 D
Resolving 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)">.
3 m0 T2 c6 Q2 [9 k5 ^$ </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)">ns2 d6 y0 l) Y4 ?# v) U5 v6 B
$ </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>
( L6 x/ [" _, \. E</div>9 _" y% ^0 E* G1 j
<p>我们来看一下效果:</p>
% a6 {' M, e' R7 H" d7 c; U<div class="cnblogs_code">
) z& N. [* X4 [4 Y5 t+ r<pre>$ <span style="color: rgba(0, 0, 255, 1)">sudo</span><span style="color: rgba(0, 0, 0, 1)"> k ctx
7 \( w& {3 K$ J+ aminikube
8 N( \2 K2 K9 }; \6 A$ </span><span style="color: rgba(0, 0, 255, 1)">sudo</span><span style="color: rgba(0, 0, 0, 1)"> k ctx minikube6 j7 w, e, `3 b1 ]; c# A P# L7 v
Switched 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)">.2 J: H3 e V3 J1 Y1 C' e3 d9 |
$ </span><span style="color: rgba(0, 0, 255, 1)">sudo</span><span style="color: rgba(0, 0, 0, 1)"> k ns
: e V* L; o1 ^! Kdefault/ R/ D/ s4 Z: i5 p4 m
kube</span>-node-<span style="color: rgba(0, 0, 0, 1)">lease
4 W9 Q( d" s; ~+ q9 R& Ikube</span>-<span style="color: rgba(0, 0, 0, 1)">public; S! v* U2 V0 S
kube</span>-<span style="color: rgba(0, 0, 0, 1)">system- ^% |" Y: E6 F$ ^. i2 M
kubernetes</span>-<span style="color: rgba(0, 0, 0, 1)">dashboard e2 H# x0 ~& S$ O6 E
$ </span><span style="color: rgba(0, 0, 255, 1)">sudo</span> k ns kube-<span style="color: rgba(0, 0, 0, 1)">public
. D) n0 ^0 N eContext </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.' y$ C, G0 _. [0 ~+ u* _3 p, L
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)">.
5 M- C) D8 t. Z! g8 S$ </span><span style="color: rgba(0, 0, 255, 1)">sudo</span><span style="color: rgba(0, 0, 0, 1)"> k ns default& o! g7 _8 w, U( ^7 V! s! }, @8 k
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.
9 N/ ~! A3 Y& UActive 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>! G3 f8 H3 ^3 P' K% d$ Y/ B
</div>
, ]: {' c! ~2 a( i3 L$ K1 w% g<p> </p>8 [) `8 S. Q! j! z2 Z, J
<p>四、跟踪查看多个Pod的日志</p>
" i) F( ]/ L) W, [! f<p>我们一般使用kubectl logs命令查看Pod日志,但是它不能通过-f参数同时跟踪查看多个Pod日志,这就不方便了,毕竟实际生产环境中每个服务都会有多个Pod,这时我们可以使用stern这个工具,它具备如下能力:</p>
$ F* A0 B- }4 k. I6 Z<ul class="list-paddingleft-2">
% X/ U: @' B: Y' y- @7 J<li>6 a& D0 ?; a* P8 z$ x
<p>允许使用正则表达式来选择需要查看的PodName</p>
}7 i9 I; D# p1 u t" j</li>" a* L1 O# \# o$ a2 Z$ R
<li>- Y; {# a5 T g' t/ D
<p>为不同 Pod 的日志展示不同的颜色</p>5 s' m" ` D( g P- p5 V( Z
</li>
8 w; h* M: i, {+ B<li>& q2 }0 s: e4 C# B. T1 \( E3 d
<p>跟踪日志过程中假如有符合规则的新 Pod 被创建, 那么会自动添加到输出中</p>$ t- ~. c& j1 ] S9 X
</li>7 S8 e& p: S" B( L9 k s
</ul>$ t3 a; q1 V- B: P0 ?! Z- s7 Q# Z; N
<p>首先安装stern(下载stern时可能较慢可以多试几次):</p>
s% O1 p, k# ~9 K8 k+ @<div class="cnblogs_code">; j: l4 v/ Z. ^, l; c' c2 K7 ^6 j
<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>
- x: n$ x" x) I7 n' R<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>
: E1 u) T+ T8 K6 Q0 _<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>
2 `2 T5 V' Z/ h/ P" p: c# J. ^</div>( u/ R1 n) I' l: H- I3 Y3 ^
<p>安装完毕后让我一起感受一下stern的魅力吧,我的Pod里面有两个容器:webapp和busybox,如果使用kubectl logs 还得指定具体的容器,而使用stern就没有这样的限制。</p>
4 l1 H, M" o; @- g( _<div class="cnblogs_code"># Z# m' f7 \- {. M1 _- M
<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)"> .' A+ v4 q! |# b& m0 T
</span>+<span style="color: rgba(0, 0, 0, 1)"> webapp › busybox) I- T2 h1 \) C
</span>+<span style="color: rgba(0, 0, 0, 1)"> webapp › webapp+ Q# |, g( o0 \
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.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)">]
! Z3 O Z- F& r4 L! z6 Kwebapp 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]3 P: s$ @/ ~. ]& ~7 \& R% b& }; {
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.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)">]
9 w$ i! L/ X1 Q* {/ S6 Uwebapp 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
" q% d8 `0 \6 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)">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. q. c9 R' i/ d) K5 Z
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)">
6 ^0 H7 A! D4 w/ Z% s, r0 k4 Swebapp 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)
& H- M0 ^& k6 c% i4 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)">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)">]
. n: y$ L6 Q6 L0 }8 Z0 pwebapp 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)">4 ^2 }" D8 H0 N* V
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.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)">)* ], I+ T4 f$ L
webapp webapp' l( A8 |) a4 f
webapp webapp . ____ _ __ _ _( F+ O0 p: m6 }$ K& |2 P9 g
webapp webapp </span>/\\ / ___<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">_ __ _ _(_)_ __ __ _ \ \ \ \</span>' a/ a" d2 q/ P! |& Z. h
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>& W% {( {6 O9 H) a8 ~* P3 `
webapp webapp \\/ ___)| |_)| | | | | || (_| |<span style="color: rgba(0, 0, 0, 1)"> ) ) ) )
; Q) o8 I6 T7 U) g3 e1 I8 E3 bwebapp webapp </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)"> |____| .__|_| |_|_| |_\__, | / / / /</span>
, f* S' |1 o/ uwebapp webapp =========|_|==============|___/=/_/_/_/<span style="color: rgba(0, 0, 0, 1)">9 |7 X: q' n' q) _ ]) a
webapp webapp :: Spring Boot :: (v2.</span><span style="color: rgba(128, 0, 128, 1)">4.2</span><span style="color: rgba(0, 0, 0, 1)">)" ^' x5 F) m! R9 t3 M
webapp webapp( n- \5 Q1 R! g" v+ L \
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.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)3 X3 i3 [ v- 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: default; A7 @. n/ b4 C$ v( e3 m9 @
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)4 ?. z; o$ |8 Q( v
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)">]
7 E/ I2 U+ s' T' lwebapp 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]
% w$ {. M$ y: w$ ^8 u6 c6 owebapp 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)">]- d& l* V( H2 F/ u
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 WebApplicationContext
* E( {- m; M3 l- }: Uwebapp 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
: v2 i& |5 @" w+ ~) p4 s' lwebapp 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)">
; s) B9 o, ~' r1 rwebapp 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)
4 q3 F; n, }3 I, O4 \! \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)">]
; {! ~8 q. z, l! |( J: mwebapp 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)">
+ _# J. ]0 @' t1 A$ Q# z# {9 y$ lwebapp 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>, n, z" p' z' N* S5 V: C
</div>
; F) X- e8 } \8 l$ t<p> </p>
R; }3 `9 A+ h0 C* v5 [% z |
|