|
|
8 q. ~; d! |" c a% U) S1 |% U<p>kubectl作为我们主要的操作K8S的工具,其具备非常丰富的功能,但是如果不经过打磨,使用起来还是存在诸多不便,今天我们来看看如何将我们的kubectl打磨的更加易用。</p>$ Z# ?& C& ~6 R0 t O0 a6 t- @
<p> </p> b" r/ W6 K2 M; _- b1 `# w+ r
<p>一、命令自动补全</p>
, _) \. u5 N$ d. Z p<p>kubectl中提供非常多的命令,如果每一次都要手动一个字符一个字符的敲未免太累了,那么如何配置自动补全呢?这里以ubuntu系统为例:</p>
! p9 R( V f2 |# S6 H' d9 s9 b1 ?<p>1、安装auto-completion工具</p>
6 r0 o( q4 @/ Y5 J$ }6 @<div class="cnblogs_code">3 {9 W% n4 p+ M6 u7 U' V
<pre>$ <span style="color: rgba(0, 0, 255, 1)">sudo</span><span style="color: rgba(0, 0, 0, 1)"> apt update
2 J( h3 d1 s7 |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>9 P7 w2 B e- j) |6 b( O" @
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>! J: u7 g8 S5 s( W0 a3 Q
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>* L5 @* @+ N/ T/ c( b- s/ ^& S
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>$ ~) i( s) j5 [" 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>
) V# i/ z; u% W/ K; s2 B1 K<span style="color: rgba(0, 0, 0, 1)">Reading package lists... Done! j- U, M! i$ R6 K; q' [0 E
Building dependency tree
. y* u& S! @' ^) E# M5 [Reading state information... Done$ F- o# u. ^* _& u
</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.
4 p: b; b. ]1 |8 O# 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
0 c; l+ r9 @% }0 ?Reading package lists... Done
5 p k' L' o- g% N+ eBuilding dependency tree0 _* [6 F9 }2 y7 N( J
Reading state information... Done/ }/ W# z) q4 q& w
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).
+ S1 ]9 d, S! E g& b% w</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>/ d9 e5 K) l$ b1 L5 J
</div>
4 o/ q; U7 q1 z7 M$ K<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>
* _7 s. Z) W2 F<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>
1 w# S; C. ^& t8 j; D* \<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>, ^# o# j1 @* |( }9 @. k$ G: K
<div class="cnblogs_code">0 K5 B4 L7 B6 W; B" j% }, }
<pre>source <<span style="color: rgba(0, 0, 0, 1)">(kubectl completion bash)) r' ~1 H/ P) a( s
</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>
/ P2 _; S* A8 s! z$ C; i# m</div># ?4 M; i% x& {0 s
<p><strong>Zsh</strong>:</p># W& u' z& o2 w" ?7 A% j5 [+ a
<div class="cnblogs_code">+ p4 G+ _$ E" @: r/ M
<pre>source <<span style="color: rgba(0, 0, 0, 1)">(kubectl completion zsh)
$ ^' S) m' B/ D# d8 k' n% h# | f</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>& c% }( E3 L( h: F2 x
</div>9 \7 Z: i" |2 v9 X) I; F
<p>配置后就可以通过Tab键自动补全命令啦!</p>
' D9 \" l9 B. q K% O<p> </p>8 c/ D2 g- g3 }
<p>二、配置kubectl别名</p>
] i; y( L7 x: O* c8 q<p>我们可以通过设置别名简化kubectl命令,编辑.bashrc文件,添加如下内容:</p>
: E* c0 v/ R# V. s* d2 q<div class="cnblogs_code"># p+ }* z* V, V7 u& J
<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)">9 j* r [+ N2 Q" ~& _& D3 s; ]1 C
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)">, [. J/ ?, `4 }" i
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)">" D6 A& e: C) {; n. `& x& m2 T/ x
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)">
1 t( d" g! X3 e) q3 N% V1 |1 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)">
; o2 _4 R, j3 d( E9 ]0 z$ t- G0 Valias 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 _* U3 B/ C7 ^ falias 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>, W2 s; c# ]' }/ b0 g8 h, X
</div>, ?- `1 ^0 i$ [' U$ a3 J( K
<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># _. ?# j+ `- L+ K1 G2 ^
<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>2 c c+ H, `% z8 s8 P
<div class="cnblogs_code">
# E- A& _3 s7 [0 M<pre>$ <span style="color: rgba(0, 0, 255, 1)">sudo</span><span style="color: rgba(0, 0, 0, 1)"> ka webapp_pod.yaml$ ~" ]: x% I0 N: v+ S- b/ w! D
pod</span>/<span style="color: rgba(0, 0, 0, 1)">webapp created' v, o1 P( X- A8 o
$ </span><span style="color: rgba(0, 0, 255, 1)">sudo</span><span style="color: rgba(0, 0, 0, 1)"> kg pods! V: }% L) N) W4 |
NAME READY STATUS RESTARTS AGE0 Z3 U B6 d+ c) _- Q
webapp </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)"> 7s
9 e/ k' h7 k; [; ]4 m$ </span><span style="color: rgba(0, 0, 255, 1)">sudo</span><span style="color: rgba(0, 0, 0, 1)"> kd pod webapp7 x$ @5 P" p' b9 {$ W. S% o& F a: W& ]
Name: webapp
S: d$ t2 m7 T: T' K2 W1 j3 ?) pNamespace: default: Q9 m9 ]0 C, X
Priority: </span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">
$ J) ~( B8 z0 e" tNode: 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)">8 W3 b$ B$ O% b* m: b% ^
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)">% D4 Z& s: Y; Q c$ R$ B% O
Labels: app</span>=<span style="color: rgba(0, 0, 0, 1)">webapp
1 j# G2 E. w" g2 j+ k# P( MAnnotations: </span><none><span style="color: rgba(0, 0, 0, 1)">% @$ ?* Q5 }- P7 a. t% u4 J+ x: Z& ]4 A
Status: Running5 j% y# ]6 w9 Z1 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)">2 z8 M( q l: n7 K# [' V" \' ]
IPs:1 I6 S0 a& S/ p% _! `* j
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)">5 W; A7 f M0 p; q: F9 h
Containers:
. ]7 |/ l% f) ]" ]3 _ webapp:; k2 t' c' C! R% V, }
Container ID: docker:</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">d9ddf9dd47de12b53f2119bf75df6706bee2e7711509638ad52adc9addeda704</span>
) m4 }( j! `$ a0 q: P5 I+ @ 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)">
9 w8 p5 B# R9 X1 ^1 n6 J/ H 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>
) _) s8 W* ?6 P. I' n; ]3 S C Port: <span style="color: rgba(128, 0, 128, 1)">5000</span>/<span style="color: rgba(0, 0, 0, 1)">TCP6 F* F, L+ _. w) g# N! H% s
Host Port: </span><span style="color: rgba(128, 0, 128, 1)">0</span>/<span style="color: rgba(0, 0, 0, 1)">TCP, n0 f! H% z5 i, x# `
State: Running
* S4 v, {8 \5 n/ A; b 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)">- ]5 L% r' t9 }; [! N
Ready: True5 n1 o$ R+ y/ Q( |) Q3 Q
Restart Count: </span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">
2 s- K, r# x! v1 X5 d Environment: </span><none><span style="color: rgba(0, 0, 0, 1)">
* @. j7 y$ n/ |, _2 u Mounts:/ v0 J0 x/ n ^4 s8 |
</span>/tmp from webapp-<span style="color: rgba(0, 0, 0, 1)">logs (rw)
/ r) V8 Q% ]! R3 e </span>/var/run/secrets/kubernetes.io/serviceaccount from default-token-<span style="color: rgba(0, 0, 0, 1)">pcr2h (ro)9 {; l: A' f e% D2 }/ _
busybox:
$ x: o( T- `$ L) e/ i0 | Container ID: docker:</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">6a6a35a628a782fc643af3dd49986bbc77c23de1ae4726bc521c77f61abbbf5d</span>
" f( w/ w" k, @<span style="color: rgba(0, 0, 0, 1)"> Image: busybox/ c+ X7 `! z1 b* [, V
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>' c; |9 p: D( Q+ s3 X
Port: <none><span style="color: rgba(0, 0, 0, 1)">
, ?5 J6 B6 z4 o0 s O' s Host Port: </span><none><span style="color: rgba(0, 0, 0, 1)">
, R1 I; {- L/ w& W6 m Command:! [) f6 d0 [) w4 D* j
</span><span style="color: rgba(0, 0, 255, 1)">sh</span>& s3 ^- H6 L: G
-<span style="color: rgba(0, 0, 0, 1)">c* c f: K( L$ E
</span><span style="color: rgba(0, 0, 255, 1)">tail</span> -f /logs/<span style="color: rgba(0, 0, 0, 1)">log.out4 _6 g$ {; n3 v" o4 a0 y" ~
State: Running4 h o/ V$ P% P0 @
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)">
2 `% {3 Y5 F/ _0 K: a5 i3 v Ready: True
0 W1 C( f& x/ A Restart Count: </span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">
9 b R6 G9 j4 K& z5 C2 @ Environment: </span><none><span style="color: rgba(0, 0, 0, 1)">
4 R& s" ~1 u3 W9 B: I3 v Mounts:( N# W! M5 e, ^. U L, _/ h: |5 o
</span>/logs from webapp-<span style="color: rgba(0, 0, 0, 1)">logs (rw)# X" h7 i S9 d! j o+ w. B
</span>/var/run/secrets/kubernetes.io/serviceaccount from default-token-<span style="color: rgba(0, 0, 0, 1)">pcr2h (ro)
: W: @' s% ?% @+ O8 Z" mConditions:6 u3 _4 r, k# V# w3 h2 H! E
Type Status
* i/ `/ h, [# g6 T; o& S Initialized True
. z! i2 K2 e, Q# j8 T9 F; | Ready True$ h* x+ L# p5 V
ContainersReady True7 U& a' s! v- _2 s! |8 B2 S
PodScheduled True% F* U5 F+ j9 x7 e& k+ r
Volumes:
! z6 h7 ]5 H6 C4 E y) Z! O webapp</span>-<span style="color: rgba(0, 0, 0, 1)">logs:
" k, t# T- Q9 a 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) K! D) C: J$ s6 V' d% _! [4 z ^, `
<span style="color: rgba(0, 0, 0, 1)"> Medium:- q8 R j6 t0 n( D( J" v
SizeLimit: </span><unset><span style="color: rgba(0, 0, 0, 1)">. q. i# i9 Y3 h7 h% [, Q* a
default</span>-token-<span style="color: rgba(0, 0, 0, 1)">pcr2h:
* N, o* l) `2 i: q1 b Type: Secret (a volume populated by a Secret)
) R! g, t' T& ?! k SecretName: default</span>-token-<span style="color: rgba(0, 0, 0, 1)">pcr2h
3 |* \& k, n% H, g Optional: </span><span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">
7 l( W7 C& E# a6 C2 ?7 n! MQoS Class: BestEffort6 r) ]0 X4 N+ Z7 d
Node</span>-Selectors: <none><span style="color: rgba(0, 0, 0, 1)">3 U7 u4 E1 e9 u: Y& h' c% 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
9 d* ]9 ~4 e# J6 ^ 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)"> 300s
* F8 p' h( [- z7 f1 @( uEvents:
0 \$ k1 |/ K% T4 s W6 b: I Type Reason Age From Message# u' x0 l+ y' V3 H! N8 M
</span>---- ------ ---- ---- -------<span style="color: rgba(0, 0, 0, 1)">
( Y. T4 k( H1 [ Normal Scheduled 2m23s default</span>-scheduler Successfully assigned default/<span style="color: rgba(0, 0, 0, 1)">webapp to ayato
: V8 M8 Z. H' W- k) |! 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+ V2 O& }$ e E+ R0 W0 l
Normal Created 2m21s kubelet Created container webapp
5 Y3 m) z, }. Q, X Normal Started 2m21s kubelet Started container webapp
+ r) ~/ p, l3 @ 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)">& x% n3 P) E! \9 d/ R d
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)">.633078305s9 M2 p$ _4 O* M) G% V2 b* h' `6 r
Normal Created 15s kubelet Created container busybox) c$ }/ I! C; [4 J* t; a7 d
Normal Started 14s kubelet Started container busybox</span></pre>
1 O: {6 }, |* q( Q& e</div>5 X) a) [/ Q( S
<p>真的是飞一般的感觉!!!</p>: r% t. Y* r# \6 A% b& V
<p> </p>
3 t3 b7 S7 @# h, f' \3 x<p>三、Context和Namespace切换</p>
% Q2 E1 @4 S* {<p>我们在公司的容器平台上使用kubectl时,经常需要切换context和namespace,导致命令非常繁琐,那有没有简便的方式呢?—— kubectx</p>
6 n2 `5 m6 F6 b5 Z<p>kubectx安装</p>" F8 N9 w3 W" i, p" P
<div class="cnblogs_code">
4 |% K) |! e0 A2 \: ]6 u( ^0 i. E<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>
* I: N7 u3 a6 ?: O: i3 OCloning 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)">...) r: z& ?. a! S2 Y: E. L) n3 w
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)">.
! V" }9 f& l0 S& s) m2 jremote: 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)">.
5 q, J n# H( o) a9 `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)">.' Q/ h8 }1 U$ U& w+ ?9 k T
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)">3 T) S i, v6 b7 s U9 y, z
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)">.$ v3 X" y. |( R, A: ]- ], ?
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)">.2 x2 m. h" q8 I* H7 ?% [1 C
$ </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)">ns6 a6 h# V+ r7 W: [, C
$ </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>2 @5 {! f e5 }3 N9 \
</div>
8 A$ R- d2 n3 X2 {. l4 J<p>我们来看一下效果:</p>% \. d9 R7 m" L" _; y, W% G
<div class="cnblogs_code">/ w4 b7 n9 P V5 `8 o/ i6 A1 d- s; ^3 U
<pre>$ <span style="color: rgba(0, 0, 255, 1)">sudo</span><span style="color: rgba(0, 0, 0, 1)"> k ctx6 b& ~4 E; k6 K1 {" M- S' @
minikube
2 X( y# ^- u) a* a" G6 C: g$ </span><span style="color: rgba(0, 0, 255, 1)">sudo</span><span style="color: rgba(0, 0, 0, 1)"> k ctx minikube. |" ~0 A |9 z0 Y
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)">.
( B, z# b6 A% ?' \) W; o2 Z, k$ </span><span style="color: rgba(0, 0, 255, 1)">sudo</span><span style="color: rgba(0, 0, 0, 1)"> k ns; j2 `% d; {2 p2 l X0 L! V+ n- G
default H0 K( i- s7 @( {" F
kube</span>-node-<span style="color: rgba(0, 0, 0, 1)">lease
. L$ r5 n6 |7 P2 rkube</span>-<span style="color: rgba(0, 0, 0, 1)">public
9 Q+ `$ e. p, B6 M* _4 `kube</span>-<span style="color: rgba(0, 0, 0, 1)">system
8 m' ~3 H* t- _) }kubernetes</span>-<span style="color: rgba(0, 0, 0, 1)">dashboard
; E$ E; C8 q0 y% u% Y% V8 D$ </span><span style="color: rgba(0, 0, 255, 1)">sudo</span> k ns kube-<span style="color: rgba(0, 0, 0, 1)">public
- m5 D* g4 u5 Y( n- Z) QContext </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.
: X" J; U) {2 E! N+ }# o2 ~% HActive 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)">.! J6 X4 G$ F$ R1 a2 s8 o% h- N
$ </span><span style="color: rgba(0, 0, 255, 1)">sudo</span><span style="color: rgba(0, 0, 0, 1)"> k ns default) [" P8 F3 K9 V8 d6 q1 x
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.6 ]5 m# u0 U& ^
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>7 h L; e9 `) ]" [7 w
</div>$ _9 l7 R3 g% q& c H
<p> </p>2 s/ v' [6 o' }' q4 \" p/ F$ G
<p>四、跟踪查看多个Pod的日志</p>
6 g6 f+ S5 |; K' s$ Y+ N<p>我们一般使用kubectl logs命令查看Pod日志,但是它不能通过-f参数同时跟踪查看多个Pod日志,这就不方便了,毕竟实际生产环境中每个服务都会有多个Pod,这时我们可以使用stern这个工具,它具备如下能力:</p>8 p K* o- C' [
<ul class="list-paddingleft-2">
, [ g* K% I0 h% I0 W<li>0 a: C, m+ ?2 A0 k/ t
<p>允许使用正则表达式来选择需要查看的PodName</p>
' s2 g& ? @5 r</li>* L" {1 y0 l# }8 L
<li>! Y& q- R, ^- f& x' t" J0 h
<p>为不同 Pod 的日志展示不同的颜色</p>
9 A* ~, \9 _; S5 r+ a- D4 v0 s</li>4 ~; W, w8 A7 f, K }6 D$ A
<li>
( K: ~% B4 D$ g6 J4 P, `7 Q<p>跟踪日志过程中假如有符合规则的新 Pod 被创建, 那么会自动添加到输出中</p>8 W- V1 ?5 c8 ^
</li>
3 k! R: F) ^ w2 G% Q. K# t, W7 C</ul># F# `. g" d1 ^6 M) }6 G
<p>首先安装stern(下载stern时可能较慢可以多试几次):</p>
# j3 F8 h N( e' ?9 c8 f" J/ y<div class="cnblogs_code">* W" Z! a3 F( o9 s* T
<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>
# C* A% g" o$ H& H% h<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>, I2 ^6 J5 b+ S8 ~
<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>
( ~( H ]( m; p, @0 H: O" D& a9 d</div>
; E% j2 H: \9 G" J$ p! m- I! y! P<p>安装完毕后让我一起感受一下stern的魅力吧,我的Pod里面有两个容器:webapp和busybox,如果使用kubectl logs 还得指定具体的容器,而使用stern就没有这样的限制。</p>
# k% C4 y7 I* R* {; F9 f8 U<div class="cnblogs_code">- u. g, O* v) C; M) v, Z3 L# H# l
<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)"> .
# A7 _8 ?- {7 q- w</span>+<span style="color: rgba(0, 0, 0, 1)"> webapp › busybox
/ @: a0 n1 [" z</span>+<span style="color: rgba(0, 0, 0, 1)"> webapp › webapp) |8 J; Q' f% Y
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)">]
( N1 S& c9 a9 } ~9 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.200</span><span style="color: rgba(0, 0, 0, 1)"> [INFO ] [main] [org.apache.catalina.core.StandardService] Starting service [Tomcat]
9 n1 z' q5 Y" l0 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)">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)">]
8 y+ r# u( l+ V! 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.324</span> [INFO ] [main] [org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/<span style="color: rgba(0, 0, 0, 1)">]] Initializing Spring embedded WebApplicationContext
' K- o# m8 O2 A2 O. Q$ o2 F& S9 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)">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)"> ms7 I% Z6 O& M. j; n, 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)">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)">9 A D% Y: |6 Y# ~9 Y' l
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.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)
& O( |5 P( e3 Fwebapp 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)">]/ T' b9 j9 ~8 h- I& o3 f0 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.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)">
3 G% }) k( a3 e& r# p& o e5 @3 {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)">). Q: w3 [: G- y. q( Y
webapp webapp
( l7 L: d- |3 a# Mwebapp webapp . ____ _ __ _ _! ?' H9 @" }1 ?
webapp webapp </span>/\\ / ___<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">_ __ _ _(_)_ __ __ _ \ \ \ \</span>
6 O8 n: k( D* {2 Kwebapp 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>
' h9 N/ S$ Q6 k2 I4 T, s0 Owebapp webapp \\/ ___)| |_)| | | | | || (_| |<span style="color: rgba(0, 0, 0, 1)"> ) ) ) )
$ P8 ]7 e5 c9 A0 qwebapp webapp </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)"> |____| .__|_| |_|_| |_\__, | / / / /</span>
1 p: S( f. [1 k1 w E. f$ kwebapp webapp =========|_|==============|___/=/_/_/_/<span style="color: rgba(0, 0, 0, 1)">9 r* {$ s% ^3 ]& g; a4 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)">)
8 K. N6 m3 v, e/ L9 P; w$ S' @1 i8 Swebapp webapp" Z5 w7 ]# z: b- U) 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)
7 }' \5 o9 e( \5 A6 {) Twebapp 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; A6 `/ v8 I5 L- m; r6 a. 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)">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)
) c$ w G0 x0 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)">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)">]" [8 ]6 l3 V/ S& J- f+ A' e$ E
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]
: [ W) _% C% G+ 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)">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)">]0 z) I! j7 L [ ]" G
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* k {5 M4 f$ q8 z) Z3 `# e+ s+ [
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
5 K& v9 L Y. {0 p" ~8 \4 e/ xwebapp 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)">
4 a7 ^- ~* D% R- Y( T" p" 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.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)
& M7 ?! u6 E6 k% V+ h* Pwebapp 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)">]
& @7 x" r. e& O% G6 `6 A" _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)">$ W; k: V9 G) v) s2 [2 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.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>$ m* T! K2 O. v, F; }# q
</div>
. D9 y( i) v5 @/ F<p> </p>0 D3 h2 p+ `, i8 h% l$ S2 H
|
|