|  | 
 
| 4 F- Y- N* b# N$ n! r<p>kubectl作为我们主要的操作K8S的工具,其具备非常丰富的功能,但是如果不经过打磨,使用起来还是存在诸多不便,今天我们来看看如何将我们的kubectl打磨的更加易用。</p>' @0 J7 f: O3 C, A# ^/ p' ?
 <p> </p>1 d2 Y: l! z" ?4 s
 <p>一、命令自动补全</p>
 % K5 _1 D' d. q, B8 W- z4 W<p>kubectl中提供非常多的命令,如果每一次都要手动一个字符一个字符的敲未免太累了,那么如何配置自动补全呢?这里以ubuntu系统为例:</p>
 1 u& N, w8 p6 |<p>1、安装auto-completion工具</p>: m; ]  t0 K% K( I" z
 <div class="cnblogs_code">  M: O$ h8 F* W% ?0 U
 <pre>$ <span style="color: rgba(0, 0, 255, 1)">sudo</span><span style="color: rgba(0, 0, 0, 1)"> apt update
 + [; x; {: F& kHit:</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>
 . T& b- C8 t- l' Q% \9 U) UHit:<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># W; m7 D5 g$ \2 m) ]8 E7 q$ L5 `( f
 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>9 w# y$ x/ P1 E- x; c: E. x
 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>7 e) c5 M1 n! x2 F% D: D* n
 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 ~# Q. S$ g  F- W6 t+ ^
 <span style="color: rgba(0, 0, 0, 1)">Reading package lists... Done
 + r2 a% d7 C) O6 V) s$ H- {Building dependency tree$ c2 A2 f$ J1 {' ^+ C
 Reading state information... Done
 4 Z  L) q' ]  Q* I/ ?</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.
 9 e/ L) d- M* J( `& }9 {% B$ </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& m% ?( v3 b, h) y. ]
 Reading package lists... Done
 8 C: v! K% ]7 }' J2 I: G* }Building dependency tree4 ?  z- Q2 L0 r; [- g0 {8 m
 Reading state information... Done
 / _# D6 Y+ _0 m& ^) O$ `9 O2 Qbash</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).
 8 I: l; L9 ?" i8 N) b& ^</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>
 ' k; t. ~5 [) p$ S- i7 G! y</div>
 . J9 U1 S# K6 f* N. \<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>
 9 w4 I% K9 T+ e* L5 m<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>! _  K9 V" x+ l; R$ i" 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>( k( D4 F8 m( S  W) D
 <div class="cnblogs_code">
 1 l( \1 a9 \1 M; O% \2 K  E<pre>source <<span style="color: rgba(0, 0, 0, 1)">(kubectl completion bash)
 ( C; u& x# |- |; q5 H: 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>
 - p. Q) h7 i' ^3 O4 P</div>$ T2 Y" R- J0 c- D5 v+ L) b5 \
 <p><strong>Zsh</strong>:</p>% n! V$ c# e% H* ?0 @5 N: G4 f
 <div class="cnblogs_code">6 M5 N  P% Z$ Z2 Z$ a
 <pre>source <<span style="color: rgba(0, 0, 0, 1)">(kubectl completion zsh)
 7 N2 _! T; g3 P1 F/ e, P2 v4 e</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>" F4 N5 o! @0 o2 `6 t
 </div>
 / w: v. M6 Z4 ~5 L# }% }<p>配置后就可以通过Tab键自动补全命令啦!</p>6 ^4 ^' p: E# }! n# c2 r# M
 <p> </p>- r# f: H6 B) e5 j
 <p>二、配置kubectl别名</p>, A$ G, O. F/ i) f; |
 <p>我们可以通过设置别名简化kubectl命令,编辑.bashrc文件,添加如下内容:</p>
 6 `  p5 X, G/ _0 M& U2 {! Z<div class="cnblogs_code">
 + F" o1 g7 H9 e& x: x4 n2 {# Z<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)">( W0 j, f/ f4 t2 N: O( `
 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)">  U  }: U( A9 _
 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)">; }; L. u3 G; a' r% t5 `
 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)">
 , D- C, I/ @, q9 j6 z1 ualias 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)">
 ) J: z8 O, r0 H9 Ialias 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)">
 ! @: r3 Z: X6 ?3 C, u* _$ `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>$ ?+ _4 P# e0 V) l7 _8 L4 v" o5 e
 </div>
 9 D2 |% {/ n# P<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>
 8 x3 F, G9 `2 e1 i<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>* v* ?5 v& c/ D% N
 <div class="cnblogs_code">
 0 R: Y& N* O3 u3 ?1 w( r- B<pre>$ <span style="color: rgba(0, 0, 255, 1)">sudo</span><span style="color: rgba(0, 0, 0, 1)"> ka webapp_pod.yaml% d! k( R: b% u
 pod</span>/<span style="color: rgba(0, 0, 0, 1)">webapp created
 ! c, {9 k9 a2 e. J, m8 _$ </span><span style="color: rgba(0, 0, 255, 1)">sudo</span><span style="color: rgba(0, 0, 0, 1)"> kg pods5 T7 M8 q7 s6 G. v2 q( ]. |- x
 NAME     READY   STATUS              RESTARTS   AGE
 : a! N- E3 A/ u* U8 Hwebapp   </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/ n* _4 Q2 c  u8 @6 H
 $ </span><span style="color: rgba(0, 0, 255, 1)">sudo</span><span style="color: rgba(0, 0, 0, 1)"> kd pod webapp
 / [! j% {; p7 `( p; Z# BName:         webapp+ S2 ?" b/ c9 a9 g
 Namespace:    default
 4 w$ {* K; T, D# E$ X5 ZPriority:     </span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">9 A  H) m: V, O$ _$ D: B( e
 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)">% o7 V- I/ k8 D% `
 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)">, H! I$ o1 R5 I8 G% m
 Labels:       app</span>=<span style="color: rgba(0, 0, 0, 1)">webapp7 r1 x$ z: }9 f
 Annotations:  </span><none><span style="color: rgba(0, 0, 0, 1)">+ o: Z. G0 K+ ^7 e1 H% a
 Status:       Running) }: Q: v4 j/ _. i. I. x) u0 d) Q
 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)">- M4 o5 X$ Y% u- h6 r% a1 r
 IPs:  p8 F# `% q& G4 z0 C' [/ E, o
 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)">4 H1 X, f1 n) w3 ~- ?6 T
 Containers:4 S7 d4 F% O4 I' D
 webapp:: I9 G* @- G$ ]! g
 Container ID:   docker:</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">d9ddf9dd47de12b53f2119bf75df6706bee2e7711509638ad52adc9addeda704</span>
 & _( q  q: T$ G$ \# d/ ^+ \. g    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)">
 + v5 [$ W) X& z    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>; x# F; a0 L9 E" Z. J' T6 ]
 Port:           <span style="color: rgba(128, 0, 128, 1)">5000</span>/<span style="color: rgba(0, 0, 0, 1)">TCP
 6 Q: M: o. @4 ~( @1 C    Host Port:      </span><span style="color: rgba(128, 0, 128, 1)">0</span>/<span style="color: rgba(0, 0, 0, 1)">TCP  T/ _- I& v7 m$ w. V# f
 State:          Running
 + E' H) D% V3 r, |      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)">, F7 f; i1 d/ Q5 {
 Ready:          True
 2 A1 z- I6 `% b: \; O    Restart Count:  </span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">
 : a$ V" K& C& V0 X" t    Environment:    </span><none><span style="color: rgba(0, 0, 0, 1)">3 f' }0 [4 [! G' F/ W3 R! L! ~
 Mounts:
 , X% R7 b3 \9 o* `& }  F( S& g. C      </span>/tmp from webapp-<span style="color: rgba(0, 0, 0, 1)">logs (rw)# G7 a2 T. G5 `+ W& S
 </span>/var/run/secrets/kubernetes.io/serviceaccount from default-token-<span style="color: rgba(0, 0, 0, 1)">pcr2h (ro)
 2 ~9 T! d5 q( ^& [' V( A1 u  busybox:
 ; X6 ~3 ~, Q. E  d    Container ID:  docker:</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">6a6a35a628a782fc643af3dd49986bbc77c23de1ae4726bc521c77f61abbbf5d</span>' ]& O7 B. p, S  u" q
 <span style="color: rgba(0, 0, 0, 1)">    Image:         busybox- p# m4 o+ y& }9 T5 G  R2 z
 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>& T1 W0 x. F4 I  U' X- A
 Port:          <none><span style="color: rgba(0, 0, 0, 1)">" Q& |) o% e7 a5 O& [# O# [' u
 Host Port:     </span><none><span style="color: rgba(0, 0, 0, 1)">
 S# l7 ], U8 s: K- v- @" f' f    Command:* ?% d0 [/ u) D
 </span><span style="color: rgba(0, 0, 255, 1)">sh</span>3 N& @7 D* B* w$ s; h7 p
 -<span style="color: rgba(0, 0, 0, 1)">c
 |5 R) K2 M7 ~, u! s* p      </span><span style="color: rgba(0, 0, 255, 1)">tail</span> -f /logs/<span style="color: rgba(0, 0, 0, 1)">log.out! a/ Q1 v2 y0 J+ N+ V7 L9 o
 State:          Running
 6 V$ _& g* \2 g; q+ P. D8 k) 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)">
 j5 P  S5 `& |9 \, X, `    Ready:          True0 G% ^$ V3 h" H/ B8 b/ i; ]
 Restart Count:  </span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">
 3 s! H. l5 i0 l$ B' w$ {0 O    Environment:    </span><none><span style="color: rgba(0, 0, 0, 1)">6 O3 H: a. c8 a$ {; C/ O
 Mounts:
 ; _- K. W, I0 I9 O. L: |      </span>/logs from webapp-<span style="color: rgba(0, 0, 0, 1)">logs (rw)
 * J& W; ]8 p! y* ?! o7 @6 k      </span>/var/run/secrets/kubernetes.io/serviceaccount from default-token-<span style="color: rgba(0, 0, 0, 1)">pcr2h (ro)
 2 ]' ^* Q* |% C: D5 R0 {/ `* O- F2 sConditions:7 L2 \7 H4 E3 u( |+ t
 Type              Status
 8 u3 t0 R0 W7 Z# C  Initialized       True) a4 M) R/ g* A
 Ready             True
 8 U5 }; N. t9 [% K+ _1 r  ContainersReady   True6 x! F* F7 E; q- j. q/ g7 r
 PodScheduled      True7 D7 m; w$ H8 r2 h7 z6 C; b
 Volumes:3 I# A( q) H7 E9 r, j  [/ d
 webapp</span>-<span style="color: rgba(0, 0, 0, 1)">logs:
 & P# n; f1 x, ?7 x" r    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>5 |  E; O5 i/ A2 D5 S$ Q% ^
 <span style="color: rgba(0, 0, 0, 1)">    Medium:/ n9 d+ P' W# [1 @2 R1 t! a0 v
 SizeLimit:  </span><unset><span style="color: rgba(0, 0, 0, 1)">4 T% l' u2 k1 P1 J
 default</span>-token-<span style="color: rgba(0, 0, 0, 1)">pcr2h:
 ; b' ~. S# W  S% J; M    Type:        Secret (a volume populated by a Secret), n$ O5 v8 ?# J& J+ \* w
 SecretName:  default</span>-token-<span style="color: rgba(0, 0, 0, 1)">pcr2h
 & E1 p$ y2 u9 n: g/ {/ e6 V    Optional:    </span><span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">
 ; ?+ W; R6 B) N% B2 `. wQoS Class:       BestEffort% r7 g' h8 V/ o( a- C
 Node</span>-Selectors:  <none><span style="color: rgba(0, 0, 0, 1)">
 ! V, f% s* j* D, |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
 7 d: i3 W( t3 ~8 |% v                 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! W% H' O7 f1 A) }
 Events:
 & {. n  G" m; t5 N; O/ ]7 ?: w8 |( R  Type    Reason     Age    From               Message
 * Z& U0 t# i/ N& I/ w  </span>----    ------     ----   ----               -------<span style="color: rgba(0, 0, 0, 1)">
 7 l3 X2 o: Z' y  Normal  Scheduled  2m23s  default</span>-scheduler  Successfully assigned default/<span style="color: rgba(0, 0, 0, 1)">webapp to ayato# N' i# W% `( L; w0 d8 r4 Y
 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. J. Z7 A# c) X7 l: y8 h2 X
 Normal  Created    2m21s  kubelet            Created container webapp
 # ^* u+ u7 z9 V1 c9 E  Normal  Started    2m21s  kubelet            Started container webapp5 N, y( f1 I1 M% I" P
 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)">) U+ c% U8 E  L% h( j" 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)">.633078305s5 O( b; z2 w5 d1 _/ e# K
 Normal  Created    15s    kubelet            Created container busybox
 $ R3 e* C1 t# [( {" q& L; ~  Normal  Started    14s    kubelet            Started container busybox</span></pre>
 * c8 G: j, o) K2 ?2 K</div>
 7 u- W* `! p4 T& W* X" t<p>真的是飞一般的感觉!!!</p>
 8 W! v( q7 z9 I% N) |% S- s<p> </p>5 v% M6 X! y5 U' i, D8 n6 |) M2 a. h
 <p>三、Context和Namespace切换</p>
 : I* K! s7 Z0 C3 n  p' j& i0 W. R<p>我们在公司的容器平台上使用kubectl时,经常需要切换context和namespace,导致命令非常繁琐,那有没有简便的方式呢?—— kubectx</p>% Y$ q4 l' i- G  u
 <p>kubectx安装</p>
 0 L: \# Y9 x$ F. k' D  W+ v2 u<div class="cnblogs_code">
 ' {& K1 p" ]2 u1 |4 ?8 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>2 P6 u+ I  G7 c) Q4 L& h
 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)">...4 r7 G6 |5 W. h6 k. b0 F, P* Q
 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)">.
 " u. I: @/ L- z$ J' m$ n- a7 G0 cremote: 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)">., o4 S4 P% H* {3 z
 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)">.
 1 O/ Z# w+ X" A) ^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)">
 ' b# C' P& u4 x% `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)">.4 g6 a+ @% |1 e' F
 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 B- e$ y% ~6 u# B" x- 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)">ns
 ! B% ^% @3 A- X, ^$ </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>- L5 v, A' S$ _: |( Y
 </div>. J& E% G3 \" n" i0 X
 <p>我们来看一下效果:</p>
 5 y. W( K! n# W( V<div class="cnblogs_code">5 y, k6 b( Y& `: q8 I$ w) a
 <pre>$ <span style="color: rgba(0, 0, 255, 1)">sudo</span><span style="color: rgba(0, 0, 0, 1)"> k ctx
 : _9 ^) x) B& R" Jminikube* ^' n; X$ _( y1 ?6 g/ a% |+ Y
 $ </span><span style="color: rgba(0, 0, 255, 1)">sudo</span><span style="color: rgba(0, 0, 0, 1)"> k ctx minikube) D/ s8 i" l/ L$ r
 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; Q, A/ s  b" @8 B$ </span><span style="color: rgba(0, 0, 255, 1)">sudo</span><span style="color: rgba(0, 0, 0, 1)"> k ns6 ]& ]1 c: u0 r; z" _
 default, t5 A2 l3 a( V% e' P% ^
 kube</span>-node-<span style="color: rgba(0, 0, 0, 1)">lease
 % T% m4 f1 h0 k2 i5 y: vkube</span>-<span style="color: rgba(0, 0, 0, 1)">public
 5 @! X6 b( |5 w: C! ?. ~5 Qkube</span>-<span style="color: rgba(0, 0, 0, 1)">system
 0 n# G9 o3 N6 ]& Y  d1 Lkubernetes</span>-<span style="color: rgba(0, 0, 0, 1)">dashboard9 t6 F& c# b1 N, C1 [
 $ </span><span style="color: rgba(0, 0, 255, 1)">sudo</span> k ns kube-<span style="color: rgba(0, 0, 0, 1)">public
 ( x# A/ y$ S, r  I# F2 GContext </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.
 ! L; A4 w5 t) m' w  w4 l# aActive 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)">.
 ; a3 g+ }% d  Z' S, Z' p- |2 {" P$ </span><span style="color: rgba(0, 0, 255, 1)">sudo</span><span style="color: rgba(0, 0, 0, 1)"> k ns default
 7 E0 Q0 P5 L& ^) _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.) ?0 q: v: X( j" }3 L' v+ S
 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>
 - t  }, F8 y3 ]$ ^2 ~! N, y</div>1 D$ |( X0 h3 |* b# ~7 `
 <p> </p>
 8 s5 J8 A, D8 `<p>四、跟踪查看多个Pod的日志</p>
 % w+ P; ~8 X% U- [$ {- x% }. r<p>我们一般使用kubectl logs命令查看Pod日志,但是它不能通过-f参数同时跟踪查看多个Pod日志,这就不方便了,毕竟实际生产环境中每个服务都会有多个Pod,这时我们可以使用stern这个工具,它具备如下能力:</p>
 : i* V0 e1 R5 u+ S4 M<ul class="list-paddingleft-2">
 # q8 W9 ^' c2 a8 c& ^4 q<li>! Z8 [1 Y0 O0 |' k2 \2 m
 <p>允许使用正则表达式来选择需要查看的PodName</p># H3 f  r& i, i6 ]4 ]
 </li>* N+ x# \5 a7 ?5 G, K
 <li>
 8 L- U+ ~+ \1 x+ C$ e<p>为不同 Pod 的日志展示不同的颜色</p>
 " E# i% h* s' N+ m: V</li>
 , Z& h7 A- |, c; h4 l3 @6 m<li>
 / o" V" F( D$ M8 J5 @) O<p>跟踪日志过程中假如有符合规则的新 Pod 被创建, 那么会自动添加到输出中</p>
 3 h" u/ a3 L) H  s9 S0 c</li>
 ; L$ e+ U/ j1 i' U/ `6 a' {' j</ul>0 @3 H) |" S5 X9 @2 D
 <p>首先安装stern(下载stern时可能较慢可以多试几次):</p>1 n0 Q3 i& N% g6 X( N9 g: H
 <div class="cnblogs_code">( ?( G. |4 Q, `, o" W2 Q, ~" C
 <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>0 j' v$ H/ @- s4 N- B% e0 C
 <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>
 5 ]% ?" f! y; L% J  M, s4 {; h<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>7 C( I3 ~8 Q- R* i& m
 </div>- Y+ @1 z2 d' ?# Z
 <p>安装完毕后让我一起感受一下stern的魅力吧,我的Pod里面有两个容器:webapp和busybox,如果使用kubectl logs 还得指定具体的容器,而使用stern就没有这样的限制。</p>0 D* q4 D! e: @' |# E8 G& O3 F
 <div class="cnblogs_code">' A8 X  z! X& 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)"> .
 , e: C: ]; c4 q; a- i6 ~7 U9 a# D</span>+<span style="color: rgba(0, 0, 0, 1)"> webapp › busybox) }* X9 `$ U; ?  }3 a( D
 </span>+<span style="color: rgba(0, 0, 0, 1)"> webapp › webapp
 # m4 O  R( n& V9 O2 F" 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)">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)">]
 9 f. L& k! z: j6 i, D; p3 dwebapp 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]
 / \" m. R& _8 N# ^+ Jwebapp 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)">]
 # ]! }! Y, E5 w  {, f: dwebapp 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' w" B5 c: V- p) u) K
 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.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: d+ [" f6 l1 I# ]% m+ A3 v6 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)">+ S: \' S# v6 l; G; u& }. x' a: q
 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)7 M9 [, u" L, q: Q& 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)">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)">]
 3 S- f! g9 R" qwebapp 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)">
 * w3 C1 W% s# a- Bwebapp 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)">)
 1 ~# D9 |# v2 A2 ?. {* ?& A' n# ]9 o1 kwebapp webapp( g& I8 r9 o- G5 i
 webapp webapp   .   ____          _            __ _ _# ]; k1 N, B' W9 V+ y
 webapp webapp  </span>/\\ / ___<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">_ __ _ _(_)_ __  __ _ \ \ \ \</span>
 7 s1 x& K; G- Q9 twebapp 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>
 " H& u$ I$ s& M% O( A+ fwebapp webapp  \\/  ___)| |_)| | | | | || (_| |<span style="color: rgba(0, 0, 0, 1)">  ) ) ) )
 # J1 ^: W: {2 {$ Y4 e- a7 Dwebapp webapp   </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">  |____| .__|_| |_|_| |_\__, | / / / /</span>6 c$ [( M$ e2 ]- ?, y0 I0 h; _; v
 webapp webapp  =========|_|==============|___/=/_/_/_/<span style="color: rgba(0, 0, 0, 1)">1 w0 a2 ]# a. D4 X& H; ^
 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)">)- F; |, ]/ a* C. G0 i* Y( T1 s: L
 webapp webapp6 v- x# s0 d( i, h# M
 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)# e: ?( V, K' f- 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)">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: Z0 }3 D. ?6 u  P1 V% e5 P$ ~
 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)
 * K! n" S/ w/ X. r4 K8 Ywebapp 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)">]
 ) R7 w, H6 _1 n: E, @+ J( 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)">53.200</span><span style="color: rgba(0, 0, 0, 1)"> [INFO ] [main] [org.apache.catalina.core.StandardService] Starting service [Tomcat]
 * v8 T" |# e, ^! t$ X7 b9 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.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)">]
 + ?" ^$ v+ ~" c+ e* i' Iwebapp 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 WebApplicationContext0 E9 u, k5 ~  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)">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
 . k9 l* k% }. ~8 S* Z3 Y" 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.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)">) D9 L$ y+ L5 {4 F: W/ _! J9 r
 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.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)
 " Z0 T9 p! D# n; ]: ]0 b# |* 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)">]- b6 o& X# X1 I0 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)">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)">
 " |' n" z# g9 p! }( 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)">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>; p. k3 C& \0 W( Y3 w" l; Z$ h
 </div># M: L' x8 C# _6 k: v3 U" {" F  ~' \
 <p> </p>
 1 {7 [% k' B1 X+ c- |; t! S
 | 
 |