From ef952aa1883d36f63554253935aae0a712750625 Mon Sep 17 00:00:00 2001 From: "huanqing.shao" Date: Fri, 26 Jul 2019 15:11:28 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96install-k8s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 +- docs/404.html | 6 +- .../img/image-20190718175957160.f5abe01a.png | Bin 98647 -> 0 bytes .../img/image-20190726144001775.edc163c8.png | Bin 0 -> 73134 bytes .../js/{10.0978f731.js => 10.ff008501.js} | 2 +- .../js/{12.b79a1929.js => 12.614212a6.js} | 2 +- .../js/{13.3120e0e4.js => 13.cb2c3aac.js} | 2 +- docs/assets/js/17.009e5fb4.js | 1 + docs/assets/js/17.681350a4.js | 1 - .../js/{19.194af6da.js => 19.883b60d2.js} | 2 +- docs/assets/js/21.d311f8b4.js | 1 + docs/assets/js/21.ea13fede.js | 1 - .../js/{22.50b539e7.js => 22.f9ec7565.js} | 2 +- .../js/{24.e37558ec.js => 24.01658ddf.js} | 2 +- .../js/{31.f5fb3037.js => 31.fc5a4b53.js} | 2 +- .../js/{33.823e968d.js => 33.b07c1dd9.js} | 2 +- .../js/{34.3b288482.js => 34.0e81432c.js} | 2 +- .../js/{35.6d4bbc2f.js => 35.ad36ca26.js} | 2 +- .../js/{36.79893dad.js => 36.3cb7735a.js} | 2 +- docs/assets/js/37.20254ec8.js | 1 - docs/assets/js/37.4fb05979.js | 1 + .../js/{5.d71edffc.js => 5.218c2a4d.js} | 2 +- .../js/{6.9d7b5b48.js => 6.ca632ba2.js} | 2 +- .../js/{7.8f3815d8.js => 7.60ad387b.js} | 2 +- .../js/{app.b0eaf38d.js => app.3c8f40d1.js} | 4 +- docs/guide/cluster/computing.html | 4 +- docs/guide/cluster/namespace.html | 4 +- docs/guide/cluster/storage.html | 4 +- docs/guide/diagonize/events.html | 4 +- docs/guide/diagonize/logs.html | 4 +- docs/guide/diagonize/port-forward.html | 4 +- docs/guide/example/busybox.html | 4 +- docs/guide/example/import.html | 4 +- docs/guide/example/monitor.html | 4 +- docs/guide/index.html | 4 +- docs/guide/monitor/apis.html | 4 +- docs/guide/monitor/index.html | 4 +- docs/guide/namespace/adjustion.html | 4 +- docs/guide/namespace/configMap.html | 4 +- docs/guide/namespace/index.html | 4 +- docs/guide/namespace/multi-env.html | 4 +- docs/guide/namespace/pvc.html | 4 +- docs/guide/namespace/secrets.html | 4 +- docs/guide/namespace/workload.html | 4 +- docs/index.html | 8 +- docs/install/index.html | 8 +- docs/install/install-common-ingress.html | 6 +- docs/install/install-common-vm.html | 6 +- docs/install/install-dashboard.html | 14 +-- docs/install/install-k8s.html | 33 +++---- docs/install/install-kind.html | 6 +- docs/install/install-kubernetes.html | 14 +-- docs/overview/concepts.html | 4 +- docs/overview/index.html | 4 +- docs/overview/why-kuboard.html | 4 +- docs/support/index.html | 4 +- install/install-dashboard.md | 40 ++++----- .../image-20190718175957160.png | Bin 98647 -> 0 bytes .../image-20190726144001775.png | Bin 0 -> 73134 bytes install/install-k8s.md | 85 ++++++++++-------- install/install-kubernetes.md | 6 +- rp/kuboard.rp | Bin 295517 -> 309318 bytes 62 files changed, 193 insertions(+), 173 deletions(-) delete mode 100644 docs/assets/img/image-20190718175957160.f5abe01a.png create mode 100644 docs/assets/img/image-20190726144001775.edc163c8.png rename docs/assets/js/{10.0978f731.js => 10.ff008501.js} (99%) rename docs/assets/js/{12.b79a1929.js => 12.614212a6.js} (76%) rename docs/assets/js/{13.3120e0e4.js => 13.cb2c3aac.js} (99%) create mode 100644 docs/assets/js/17.009e5fb4.js delete mode 100644 docs/assets/js/17.681350a4.js rename docs/assets/js/{19.194af6da.js => 19.883b60d2.js} (94%) create mode 100644 docs/assets/js/21.d311f8b4.js delete mode 100644 docs/assets/js/21.ea13fede.js rename docs/assets/js/{22.50b539e7.js => 22.f9ec7565.js} (85%) rename docs/assets/js/{24.e37558ec.js => 24.01658ddf.js} (95%) rename docs/assets/js/{31.f5fb3037.js => 31.fc5a4b53.js} (96%) rename docs/assets/js/{33.823e968d.js => 33.b07c1dd9.js} (92%) rename docs/assets/js/{34.3b288482.js => 34.0e81432c.js} (92%) rename docs/assets/js/{35.6d4bbc2f.js => 35.ad36ca26.js} (96%) rename docs/assets/js/{36.79893dad.js => 36.3cb7735a.js} (98%) delete mode 100644 docs/assets/js/37.20254ec8.js create mode 100644 docs/assets/js/37.4fb05979.js rename docs/assets/js/{5.d71edffc.js => 5.218c2a4d.js} (87%) rename docs/assets/js/{6.9d7b5b48.js => 6.ca632ba2.js} (84%) rename docs/assets/js/{7.8f3815d8.js => 7.60ad387b.js} (99%) rename docs/assets/js/{app.b0eaf38d.js => app.3c8f40d1.js} (67%) delete mode 100644 install/install-k8s.assets/image-20190718175957160.png create mode 100644 install/install-k8s.assets/image-20190726144001775.png diff --git a/README.md b/README.md index 6acbe85..2f81540 100644 --- a/README.md +++ b/README.md @@ -2,9 +2,9 @@ home: true # heroImage: /overview.png layout: HomePage -actionText: 在线体验 +actionText: Live Demo actionLink: http://demo.eip.work/#/login?isReadOnly=true&token=eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJrdWJvYXJkLXZpZXdlci10b2tlbi02djZiZiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJrdWJvYXJkLXZpZXdlciIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjhiYTU3YmI1LWFiMTctNDM1NS1hNTM0LTQ0Njk4NGY0NzFlZiIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTprdWJvYXJkLXZpZXdlciJ9.DcXNIp0RKha1zkV4ga_QlGfcvMLGx2LOyzX-0VeboC3FojKFhxnfBeoda-zTeh6ugJlSM4kQYrRcof1Kx8Mg3-UgofNmgRySbDEVKtJZyMUoHqLmySKUIn8sbX8q83RNcqwcvY-fM8-w8HSuzU7Td7WWNuZrlCL4q_LQDYIBet1nlQ83YsENKNE8rsZQFDw8YM0MH6BEZLdwyhaboy_jjYbsU7kv8gks3aIX4lh1Fs9ZFQpC_6B0_MZvb7rEeG2M8QWXoUkDoL5JCKu6Wot5GlWf0kDMxIsViggP0NmSDTKh6kIvCkT2FZ2I4guEcjE_EjBpdOS6Abta22tzLlPKhg -actionText2: 查看文档 → +actionText2: Get Started → actionLink2: /overview/ features: - title: 降低 Kubernetes 门槛 diff --git a/docs/404.html b/docs/404.html index 0e14cfe..161d26f 100644 --- a/docs/404.html +++ b/docs/404.html @@ -7,11 +7,11 @@ - + -

404

That's a Four-Oh-Four.
Take me home.
- +

404

Looks like we've got some broken links.
Take me home.
+ diff --git a/docs/assets/img/image-20190718175957160.f5abe01a.png b/docs/assets/img/image-20190718175957160.f5abe01a.png deleted file mode 100644 index 6ebc1926c8b88fe96aafaf22f3f7cb4860c21dc2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 98647 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μj1W(2;kJz zfJlUYV&V?n68+Bod~98{%~z38rg{gyyke;cfI-WR+KxHENvx>wc7D6}nTleD-Mp!` z(pLA~aH`?Jw?-nBvLX-I#6t=`FE2$K=2Dbqg@g zk@bLg&N;}DjdC1;j2){9Eb_KncMnf6sb_3tUugvqugoG)nKaQ{RLxn2E0N#A71VQk zVjjy#)}5TZkS)3NeH?rpt7pE3lYOg_su@{&g0GLb!U6caS@G`fu!PKgT&T@NIL{3Q zqK*?@F=T{AU;mlG(%@6=b#ZYSs?T!Y@0`NQ?V>lyhUL;7%-$Nh8M~n( z-|!g@0>4LG_Gq8!*)8crm5XpNa*SDnG4t3tD*tz|NDZ6JET=>q2H) zZnj6PV=ffj6`MyPzYDu3tljLsx-zyZGiF<7uiC+>|M>)52x$NCxM-F@BGrHD3OS@eNUb*T_Dw#>6z@K!Q09nKzqM5!)j5t@%s-P6 zkrf)rQtZ>_^E~M??k4LH)sl(LGH&{HN25Ru=<6@%Y+kTr*r3$p+iYOY)+sS9xP4Tz zJMVIRyw5q2V|P>23eF)w%CK1IFXc|FsA+`zG}4dI%)Y(70sIpm*NT#r@b1C70aj%- zzp)T0oU4O%Z;-@W8nR3SF4O+Gz0|6HiJH+QJ2Fd^^{+V+YmhG>Cwy}t$-_|=bDkPO~8|V zj7|ktA^tR0;oXU(G{0=utP+M8TKO$u!_6SyC&8E2Zc0*RYdC~c3WAREv0;_@(t8R{ z8^{LM9opNcqhAVA?YWuHKYUI1(Im6(!AJ)v6)Gg}t}zt5@w9*kE@Pzhc}pp|W|CV+%wak! zNi~}l*QUnyZ8K0jC=Pe>&Q(k)eB@(ytZz5;B)TchrEu6AAv8KRPhqKtnfI zx&FZ`{lvy3PC(Pit=C_Co*l`+v#{0O&+|J#7X@7~q!TjYW zs;L;`l9ut#Rwp-^F|Xwn(*c4(1ugY6dtXsmEl5Y4AR|dy*hNDwEw-As)BpZsZmJ$uQhw1l>S2-XOtun2V^Ugt8E1& zTmp$V%|9EQW!`$1T$Q*(l$ew9b+dv7{(pRaEoyluttBK^1Tv-{2EE1abOCRn&SZFJ+{T}BnXWT7>F#YxN8N52PnJgoo6V&F2@l0D^eqU zg4W-=f*>JkDSASZ>P$6-Ol!dIRCyCk67o;-^EFxa@4&|G?w2OL|JfrhfgT~A5$3QrG-;otI5XUIVuTZt%;xuDGUiQH@~M&B2!_}KK~f_)dG76_M*%gPMQ_JW_9b1Ea0ogN%MDD zdgs_#&=2}_sd~gpAxkt0l@n3L;nk?eh`}(1S!k@#!VYvy-POl_WO}%iFUwW*W2fsOBWEru&MKu^z@0W+TvVEp({-x-Tefulp~Uf4SOe{g<+Gs#PSeQ2=8<6uVIf5}@EX8Qn|!BX8EyAnK;N$FN)6)=iU?+(C}x=aoN|Tq;y@ zK`pS=HQYJ&h1t$5D9>V@4w9}$sx3udFX>N{!OwDBL@B?Y?AwAXdOtr%ilyucQr)Df zaQ5;6+zXl#)QNncOunLNHMvpo`s?*o^WSwW(Z+3l1_jJr*FO^M{~0J=1XW9M4CQ+1 zKCC`z+Bc(PZ=<-;Wg(im6|hRiTE3W*;mBXRgui`G+>82y-=y9}+@gu3L}t|Yo(tkv zRezOZ@PEJtkb|!OrAE^?}g>>0;T zMB*1T@sA%OnKo_C`IfLV82-y;inKV(J=~WuzeiyMR&bk5cp_s?+>e_Ox0L(kVGyUk z1QJ9Gzf=8n$^0$|;J*X>gJ5MCw%xKRPs!*n(m~O>rBdZ6{(~pvxb)>2dpt)))t|q| zitqWpBp(r!PITTeH2Yuq6;nU3XQaW4bD~F@#&4JcFCc5*kI>`M00?69h#}x!{s`o= ze7%!DrZ2)-xHeSaSaNo=Dyr`o0s4F4&gPwiGa5&J-u5d;={H2Lz6%Tg4SD}~ISVqN zR9tZh{V9i^zbCgh*rWkNrS5m%rtf<0t07*WB-n6YVKv4ss7Vpl> z%_3=NS^xx)J51nc_Rp&PlrsTzMg13_`zjYQJvXL+elT^e3{W+GM)8tDt`lI(<5yqZ zEj-|ivH;X5V7m%X&<&P3hFw|N*|F%>oj*0BAePU zl9r?4D3bVI0eq{@(B*E3N~Azn{9Mm$Aji)pisx*f=i{p*I~0y=6zAvKwSI~Hn)qZE z(i%@OTNuEJM+bYhr4~*|=0j{V@$`d|<|z;`&a%v}3gy1mn%1OFS_!qqiD}TMm#h<6 zbr{h2i870>QrYmcWv=>^6T>st9|1PO=v(GqUNJ~aFx92 zQU>Ddj~UXmkr^Y1O{3uSEp{LG90J(Y z#Yu+*aPEUD(tK=KPR*TTo!}xa)3;^?zN`jk%imXST7@ae37MbRPRF(jVS>ESI%gy> z7nKWhMOl5CvV3I|)s=?<&`6`e#=_&cFx9P~YWW@`)vnGDK1Npr6^O3+?OJPAUI3XV zPp4Ckf@{deAKMb0TncKRk<*h-rFZQIRN^y2mCmEdS(h~IzCp$DJkA~fl+G8xTRlSN z(hE>I zJccUiv5k-!Sax!dWH5&<)rrsNP4t}0*D&~rC-yrNIu;Y1N0-)0Wn3k!eH$e}R>tsa z25_S~lYc+i5}_}piHK+-SP%x!Zfb=phg5sdet1vhcMB)}BXGJ`5ZrTmA8Hk=d0fVG z$ahb)i7j~PO*~Ct{>*UoV8R$#63l)J(OYX>m|zI8ygML^|t%){{?6tZBTT!>q| zjh2Jm^#EhbuqLl{qgPV3s;qkf8nM z5fo~_Ekh)HEDW>iqF>+NDTONe)Tit$skuIP zX}*TPL3@0mTB-OEU;DL8fl-T};S+2h9<8ZWf#ZbhrXX@ZR{1NR`-Qz78w7rG4J?mx zp^js~mSSPVk4Qh^I*5~)Pp`5`Z`Jm&veyh%hJL?BejpeW>b`*m*_dV2h`aO^!T#;i zMRA`!Ye(%A$T;j>zWLD-#dN>!6Z{_%9*F9uyCzYN2e)KYF?hsO1+3-6$p<0y;q7f> z-b$MA)TJvX@nFhx{5bXES%NwX-m=TQc%QtJseZ6dWMpI{Q|FAJpx{Si0q#`|hok`Z z1U$$N@9*)Sgueb8oH4-;w|Dw%z<%6b7Ti#t-;ix4{ihq+MRxes504Z`@IJ+h1MX4b zV~4T?SDXr5cHbMETV40Scq8z09Kn4I{`5=yImk;4EeT4_xAY&2amF9y1U86V zGCc5AtdB>y^hGSZeYRuow0ZL{j>Nj>|2^UgXm32Xd0w}X>-h=F%fBlwzrO>2THq}~k4-Bg>mRgc z7tsTd{HSfwmB#yg+&@(jwL0)|WlalU^9~VW{4x0Z_h2`H!(F`kPzW&?)`CV32dzEJ?k-;wZ@NP(~9!n>D!TVSBJcQwWs(+Y;iPmhl zS$S6H19n&c^Q?puL>Cn~-rBuLO-(?^PETqgDM2RCO8D5+74M0T`$L8m7c6rJFIkJ+ zf>m^08R+jf9KyyM$Lp3RP{+Fe_r<2Tr+;$C-sEj&pYT2(y_V?6Cf(_>vu~Ga#rJ-xjLVP?OV#LGY zSIz==R~T`3eKHmChvOok4;CLNFXPj*y;#>y&##w<=E+>-Os-DjhX{Cw72e*L=HyBn zkT6_tI4D}PP5En%UVLXM{-F(%)3FIASSas5_#OWobgVwI(7txeczv&#==sPGExGKc z*W%${?`6yZS4M9c_3w$q8`M8$Bv@TbE0d&t4*uyy69fdPDlg;Db%GZx(~r5&@!8WA zyAco|;QN0cYk;ArGf4h5m;d^MG#gi1YGpG@8Xav6YJ=JwJE;C)=UB@G1n1sh*=W2S zhi1}?4Ki)UI`88DegZB-xlz32$zi-Y?~j26*o^wcZ`kbD0?~2;OS`u|!S=tV=HGwN zBivY%V~R4tQU_vXc{}0yPxvScb~7o2+#4Q8;@`tf7>Fy?pFIBGPbaw9ZEo)L+JIev z@5oUmjB!4Yo>9Dk0xmOPox{Y&J!eCaddz}TSzqxgPPzv9WTv8fvFEXjD1 z6Q5nCpeP-OY?K^(j%phDU#)9A0XRn(A`ea>N(>ZM_>dRwq@}ZSQEOlB>f6vd^PW8S zx?!fkE02(*PB{4UW|fgk#e7gyV=n@3g)IESKvmZl!`jvV0}V*X6a_Ro>&1(@l*uQ& z>-+SwT!EFKrW>_0Gma3cw~V`U&iGeQA_J!eKNk6hrf2f|3!)uc3xM*#+2OppoVNw! zzJ_0iH@z^5__|=ndCo+*(qb^ovf=yy6unL2cOx3~I8st-&|H}av;^=c4)n${8+mWx zrdKpiR6;^RZQdz4XAzv16*tQNo25E2mN>^1h7ZWdqQKjfAoQJ%A}-zwsrABJ1L4Qb zswT-a6gH@Kj_O#az=UxC36emQ-2DrCmkqC5p?z7)3cFp!pgDKl+QL$pd=mHF`kG`T zoKmVvT2M$}ak{etWIHo;BE}>2B%2s+3Lcgdx&TM4Mh;u+4gp9V$V3HZ78)wxa-c~KqpF~k?vmjkheXc ze!O+F9~SS=4;Xk3fh*Ya^GZ4#y#}`4kOf;{7k676sOeBJxrRsug2QRAagbV0#n_<* z8qV)N-6xekTP$&?WD8f4oxHqMlz~bF6Q4Z{larI#5eYo@{_1q9vww~$?x4UHlN)-i zwhtdw2lLH(azdxaDNJ!~^mwPR;Tbsl$7BXYR_E)cKn08kh!l?V9%Cp~MmbnmajV_z zp!ExccOa`f9OE1b(iK4tIKMpuh=g&7(p7HXG67$FYK!qOlxd70y_NCR5dIi;()Ok* zAa1x_Aq?LUkE#PG1s`}(vTQ0$r&%qrFwdUT%5VVC!1>M;tI8FmJvHXGasjk}*z^0N zjJ$Z8&mq;8kHDAgWjVEs3bb)HnEB=x#r_CMEL2|_M;b_|#A!Q=tU4Vz-<2-{2Iz;V z2|Z_#TcqmMdwV3~`?4dz=1OspFM3VU0wi`9$Eb#I@uDFTr|BgB2IA>LE6 zOw&?kHmwPzIf0Ouh}5`whYkNrGlw^{%k%ABD~bw%U5tib-b>KcrtXy|q7~CRZ6-;y zTg*B76EF%ah_u8s-6ugwrJaUgukS9AcM=a@LHZsz6x8KZ5jb>p&%oU4VrFOP)M!M- zecFv&s22e_mwi*yzRxN`5thl$ml+9&9d%a#tTyfO?-5 z6#?fm)HAODN^rf@h4KoPz!>Q*_0cX_IyJcPm2UNkGi9_7kkEDK2Q*A8&8j4BND>j1 zQ{|BjH+q)$MX< zc^+5b^>&FSZnX)Q5;$81LlJg|v)f~^N|H=dQ6k5!>eCJI8&g_J2PbxMch6nE$@JAw zHx7Y9Lg3OSTcT~DkcA5*|0M;enfqw~1L@yA*s}d`?iM5~sBy zxlq7hLXkdGXe{IHv)vzwv!HG*eDOIyk2$~tWZ!Q9*{^p84cQKI&F(HRJr&6P3MXsL zvKj!9lC!s7kS%*}xC5{{BPQ}SY%m~*rGFCDz0O>{y4wE*#oHB--jdTw1`yz|4upp{IF^gImYLK?o;CvYB7r;Ny2;9L+qp~SJ37N`!J#;=HtajV@XFA<2YuonLdC6s91?1%W=7M=PV(YvCDJG-_iE3Kw$YaeQ~aP>3wERkiBa_l~6G2 zY$IDeXAcsj{@#1`r%#EKIgkahA_cr|1@|sdZ+pf?3=s2CM7L{0 z5h9p0xE%>s{fyJi44tarveYbt$*BwO_O z@|d%TLET>d>sK^JyN^Z8Unnk)7omh1J{f?>30tDY6kQq8=m|NxYf7TTN=1oM#7NKj z5o_4OFi+fKdqWnhy8H?5GRb|1s~7$Dvn(=ZsD?r$F<-@+nDpolXMm>De8V1J^>3cX z-c>Dv=Aq3kk81>&Hp@oo#%J;2!5qbN-6zA9FU4|krnt>2bMyj#=&0Vj>*vRve#%a9 z%!p&StC)F)vGfq3p!WRZ8@uY}x0V{teD?T0A;95e%v!QYGrJ1sS&;MqswlINa`5O~ zgQ`@A`XI`Gh)EMdN(%%Q2AgBdC5x?6Bx5QLT?MA-MD@UYB(Z{%0_VfX5FqBWy9s2L@zs@XEJAEoc zNz6_3!Gyvr=9UN0;nNi)<|imI_k9eH1rWPk@`AJKjW0_SGe-1Wx@Muo=Eur$Ox4sT zNxslF6cGzI^$FUSyqqOVH?Q@6z7PM`;d__}!{aJwehRi`R1=TQ0HR~yZO(3osdRol zU=Gwt)r#r+Ryn-SE~}G!AJ6b4c8GUIenKF8Q5IWgKI!PKV-yQm_HkLKrP*(Zu(Lin zlU~6cHtg)*-(}cle!Xl$1S${gNlt%R(L0$*Yg|u4cS@c?dYMGJn7FMH#3>^b1e*~t zZ{P-z;7RCfu@wpE%Z2_MslIA{hDD5=_A|FC!;2aW^5QK?d&%fY+bFs_k-x9EFvgy& zo>a4<4iHa;4sc_=_|d!PBC9`fwJYb64vQ~?y@aldYZ8UOAow&1|85Yyi0?hL=b=6n#v#= zbF%%M*&xT@wHfP(uYS(&s+|LB`abo|se9?q(^PitUY!(KeT)=;Pv*{pkL{&O`2Fb-VdO2?g?7bmugSwygEMC>&WOdXd&;97xYS*GSE! z*)(qgq0V1Z!@Qs&FuH?%=lka7fFWi5AU)RR54?tq9Ckoho6Poob`|2M6dO$%PtR>~ z3|#cZt|^sY4#(NXb_65CKw7*KV0JeqFV(7U~QBdd1aqdfn;7DS&ZEEKM2K9iL=V5P7t ziaCYF8AQ&OabXJyCQaJG*AAAT!HaH#jHQK?_M+s1A;;R>F^ge~Pm&Og6bJFKM@$`nnZM${g}g0DMsOe|Yhf_4M2JfbcWFctK_F-j=`Fi(;9z?i*PU4~}aD5|Mc)ItGePD(isp`Gxp!J7ZzGmsE(p+Sz&I z_0G(z>1^j|JlXbQHi(CElE}bL>aFPg;-gId4N8LVUNWG@hhSkxy9H=v@#X8VY`jGI zFd^ln1;&9^yDiYzzv>1zbf>z1fHcK!es1fL(2LuO_d<;UmC`LfmrEW^R#0{7oh?~) zEY3Np6~}L-bS-x)$pXzH&5KukCssziOA;A}F8LAHyX#448?oT(+jg7?St<%tO*^_t zi|t870bVw;2G&eTVXJsZHJcy@`#Jzp#Yrdb6YKZqJDk%scV&`d;DR7+P9hlEBX^zY zS3OO{@Cj<{EVp+7Y3*_I6$=QP6--4k_$hjzDkDqA^*&qdMg?jxA*p;s>sx*>;1I-9 z>iHUil}g1WY2OzsrpZXm zqyYztCgLkkWE@4D+R00YFmWCeD@cla&qgk7C*Z%nJy|)98LNc8R}HHkWK{0cQr^Hg zKDk>D%4GstF+&qP9+T#3d%h9ug^dK%{fkr{ST}kL! z1ro(tc8@^-J^6Gl`5RpBxkCfT^{V|S+IFJj4ryrjaIW^{Cb(~LUlH?1j_kX(4X8S@ z>B;Hp_EYbDKmAd1(RTzY?7ZZf#NsSwFNiB#hp8}WqUN&2xi!<-g9h&v$BW_q=-Kd~ z)#vSjbc*wGe63n{E`5Is0e)cS1ByQPS=6A%l5r78CMD;A*(PspgY7zU;mO0mb8haa zOOVj1Mv~zciN)@>6Sik zX$1f0BXim-@o&S3h_iALQnR#yxHMrM$oUifJ04mJ?1vCU&iIr{{3I8)Ya?(C!!ma* z!9JD&8Y}0~nR!SeWq^EB-NztwMpxN2^6uQDCBR_bXg=Ii6I=)!VCnKlyZ0PTeD!jU z&<>b7Z+S7|KIbm4!mjG&oQu|cUxN5&5t`TYdK%#03DhN1YJQ^R7pL?BnnY16yWVT& zU1AXo^5<-yNr=?6dyG`EjzjiblocbvhPf0o?&C>`x^s$qpjkskbM6(@%^B}1J2K5A zRDHYvTp=f6I@Ccx8#}V8!?o)pCy$0$jvuOwZW$E&jCtGP<1`gL1?N(B(*@nP7g@K@ z(J0+|X4%x2>+I;wC?r4Mwb9plPO;cUuIx!hvQ5>Pt96|&$y#ba-&D74@whQGE~Ygv5A26^~5KPGvs8e zg+#R|vmZfGw&dk+LwsX|aW&9+E!c^5yYaE4J;sYjD&HrG4#JX{8FpT+X#t z7B{Gr_T^?u$l426F2=7+2_S`CA!!5M?ty35K;?J#VwpvsZv zn}8KR+vB+hwDXOhJ%*g1=8RZyH`2VP*-IES;_o++SAYv5GoWSyVq1VKS3{|aOU*w%#lDL%+h! z>fV)TMdz6-|=O!SzR;6|;YnDimo-3p-I<6|hcvhk)aNadmoO+}${=M_{{Go_Cb8DXL zQ==B46BDO}E3=mcx54|+JN0m`EWi8dqkoIKc_;)&pg^2p}*T;MI)aP zA$qLfQO+#oh@5}tH~x<747b6zNOOB_KJ6l^xveZ%t~_7Pv5my^k4g~`k8Q$3_&JsE zep~O1W8#hyX*I2*U9N=yzrO^2Bf5M0j%(fN`=FTk$GFvZ6E^3Xj?-;;y{=MfMFGWU z@77?vxBGLfe+@;jd}Q4*9BzJHMm2i<-!G_wK#~`be>Lmw&iomuh<0tYw6x6n5N)-O zYw&5(e-{ype70%fBuGjPQG@L#`@zrr1FG7=JMnauv4<(3ym9xj@j1MgRG@%LlW*+c z7QNC0!Drk4e1_kltX%fmIo&mHW;QPabL1K-p3ho zA^L0(DZ&3-<=q%!bM5}RN;JBGq0+FlrSv=AXQL@RfNFhzGIswu*Bh|CQ2l-%I%%wc zHw)xl#-Jpc1@B`!7We!~llghABCwQ$1Z583?>Kn7Pbm7B&Zx78=$ zzT((_W=H*6#F1{BHuH_Q?(kZ-1Pslgry*yK#N`X#ZbLIJxUI@XPU4z0-dC<4$e&xT zmIZ1l0(~D6e(jMTKR|~=lKD{OuSfX#LqZ@_m+j7*JXrT6{~UZnRcwy=GJ z$gfYgw6&3S}V`Ox6bR0K1OqioFB0K!rAAkShIB0Wu z>W9dEJt!JEib~|`iqaSNK$+z7RRw%4r)5znJUSje53+UtfeilZ96O#~T6&l^1nA~} zjypTYcjzfgE#I``A7NJ@qFg*`{-Zqnsujm-1I-yw2^4$6F%Q(%}d5M&U39K*t3eVO7^T>B0UGJM0$v~Ss0$I5?2HhSi)ig(R?X*eQF|$N z#k!Co^v=3H{$ry09}qgOa26x-*5cC;4p_>OhhQ6#5W^ z!4qAeo3D~+04A=IU`vPiCuiUW#sc%3Nt4I)W7a4~*w;Cf=b>&-2dMT@MSOLju>sh) z5pdWi(9(WMaJ4tYEDjpM7)w@w4I2+RBhMB+KaMqlkfzH(B2v%e#XIxBgeGfYvQDVP zwMCI+MVO>Cp_2YLbF-d?kgV_qd_~_&vCpr8hxZsN5=B!$T#P}W9meG~hIqm}a{1?7M1i;x+#siV>Smg`!MQr1lODzbJ^v(0 zJk$^keD*@;w~cXV4r(p5w%>dUkDnXp)wnLUp&Zsn5Il1>?HF=`vAB5d zN)s<*C8{55sQK&gj`W#%aBC1(*!#ApQU3x;9<`4*R@7pzX~@~|Eh)IT6+UFfHW6Ac=E&+ z653EydvVuU8B{6>-gp$$7DjI$<;eYfdkQMW@km+*TyI3eoE8T53=P_ShrCn%r|?fZd9B%t%_@c;co z{|m%kA88tZf`=Ca9BSf0TbJQ{3)*y8Hv9^8CxCvzFJOf%BK3(r7k6BB>xB&*vJJ?2 z2$f*6pnutK)NO-1Lwh+&rUR6<-5T=3`82?(FVu)JWuL%J-Rr6GLj^+okhVBHhi#1n zJHVXzbwL#|rNTjW-Xg*u|vX)X)hf`gnU;#zBk>7=iYJQES>&BiN>_>LM?^ki1q0tkL-l=v3s#q*X2j zyu7m|-i93*5CY2I;F5b6BotL__!ZXZldk6-Kj}7XE-;XrN-d7!UAfCZJe75ft06yx zPo69#BxcKL)fR9$n4yY1NXngJGhny^c2(Xylv=!CysOOh4%oLe&=6QaW#g#2Gt{|b z5Q=AnhzVVD75qqbPesrg@nUTJ1GQCriNoj6Atj56tbkgTvXe^r2r=b+{R3e?4iHFi z5YDg^b8*FIQ{g|P5`gxrVM3?Y(x@yyQ6dc}8vunRoZ&S_tvys~x_mr}ExYLwYG5kA z{_gg8w+CmyOu=>3!BU>c3~fHFeDbohn2_>$?Y75@VQi&+>5oV<_~~oxQ0<+ z8cDX}7&MXjgvrGfrdGTk@a|IFYMeR*(dUr^zirE@#kKq|E1pNn0=r(hg6>F($v(Ij z2I>K~2!lQIqXi&6WxsEEH!wM>AMgX_m<0^xc;Zj4830GbLK}R~h@>;}n9Ey1XEy2< znt#+UPjo#Lba?V2e5IoSCE0scE=v86F#Y#pUw8qh@5(7>yR|kO!+lud7})ee6E>Vc zQkg>B7t{n1J1(K`iB$5&BODtyAGb(iH-?xe(dI5~?tL#yUFy5J+gc3zq{h6*v7P>t8Na z*n~He=)cuRm%7l_3H~N0MV=<=oD83h0bd=F*~2K`CRwM6#}qZzpCDA5&xU6Bc<8VXv_nx24=3Fv z!TK%x5i!8M)E!{z6I<@#>gNjrAW4U`ColQ%K~Ehz9s_57(43$+yay60O|xXY;JV%# zB~&_`e=_kCZkM793UOR4p=G)^_G~8*buN7`2aaAiUzfw=6i%6eedpfq*U#kU^^R7Y1wpK{LE(0kE?7ZzbMa>&|&B53KQQ<-Y9UH0kw^ zCHi3#k(NT3!o7cf+`8WY-DbzNY=Zr$YVw>NF5EwRdJ(Yz*3O?C+xl5tGQQ=1&-bTn zH+#Zu*(N<~VhCjj7t!?atg4rkPp+Lk#N|T>EvR9YLJNI8s0Da+*v4Zfzs;HB!H#_m zQO8VL(F1dd0Pnt6qV^Qt(@#mPap4my3*WfNk?5^0cf3FP9a;QXcGB$iebD!z+VXk* zXbSIn_$)H~@Cus_w~<08Q8Ijo$xz}g{I%7D`b3g-Ki~vqeteH;^j1jm zWN|(0AM7;#4`3$znW)b|kY(F5{u}sT3kSM2wCfDYq@4cq*MFIl$Tn0}Zug}Av+f5U z0Wllzbt%#x9M!c*9ie>?1t$okZ^nO)zkD$Kr9Rc(*5QrEh2bHZRDrsdO{pk?Ka9qV z(6hsrVvM&|APhsOu?(Ple=oWHxk9mrDFNLpdyKY8lLUMPeprN_`8hj$#mA^Yyq1bc zIUHK7|NjFm9v(`E@>CXvu2aQA|CZ(~W)W}EpeF)dZsG5Qyd{JPT<_k2O6r5UCn=pnf1 z;I0TKIsO8FB!OFSvX1u$x8T>4T9E-*Ox1hn|7v3huECA*&ujIcoB8K&f|a$jG<}j$ zGmz%&>3>cFY7F@&)>v9djIj0En(0aVmMap5w0j{ zq3q4;t}bdBhC+j)=II3Kq;+yV#AR znhAk{VuIklj=eJ)0_vyc_k9sV1{vYis8!&&@j5BA zARd{$359(~o6++-AQLb6#6{?qQQ;5*(})zrjaZsD6*t%v}FngO7a)D5DZ zh`xn<5*ixL;sw`$U-Aum>0UeLYjrDBNfS9I=TZ(_m7HSV#DAPbTw=y~v? z+=jgmMTM67#%O#$B?URiKKF3jCm4&8^!={&L6=4P+bU?)?M^MEJ#rU^1a|dwO%_@PgAFW6&s-H z^{HCNZs&kx$PzMr|J$6@j&6REIycrs(m(d+c2@e06~Jg(!@Qvnoy-!a(Ty8;&cg3! z00+9)0JLgjabeoUx0}umjB6s{!#tas4#V4RB}~bPsF$7`d)iJv?Xx*v~mg)ohAi zm~rAJRG&)(1@miHo~`Y2c#K>GL#lIyKK!G;mWkl_z-AR>KagRFsDmJ z2s%=aG6L~|VapXzQG7?RmrRrtyPqse&X4$vYYXIcPe7l`hk|9K`WUNN+ylg2F*tu> zC@HhSg<$Nkjz@l!h`F?F5F}deN>fK}3p4aft#^>KzyJXDGDtI4 z73Ntg5LrnHe2=yK9OiYyGgheE3MQ#H(gW)JZ1hNNO3G0Trb21LUboYg59jgT$|2dL zvcx79_NAaf^5~xUOp~Tl;0E8+*%{u)E+gKBb6EgMXTOxNc5%=G_y|1-7N6gtHjF#h zdvEzn{@&qu=YSy}7D@sA(8apF$=Zprr^A{3I-edCmwsGZpvT6;3A}jU0s0JfvCSR` zEO9lRWA00El8 zr78*GN12?6z&5ZnSy!jRpdIAF+pNrJF#9C>Y|)8}wZbA`&KvvL1AO517pv;Y2uR7q z$bv8o_T^=6yBpW&_Mcwoa=yd3rHeg$4Vo;W#~$J+c^YKO<3LJg4MFMa`05*6@7S(h z*G1$3eH^3(PV%SIiEK1?^drs}fJd;%d6;m72Xs`=5t)XfUNdMrFe*-2@*$pZRcaCd z^f2@^V}`YuqIYKi&_MI#AD%ZGvp4`}``|(7Y_wxGx%2x5#$9H_Xd<|F{+gvp4pJ3X z22qA;XuS!LIW^t1w8?JRhnknwnP3%2kleTWn1NRm0SyMe&$`oI?>ef!yC(1&0M!DE z<-nW|K%$QnLA2UN&`A{#3?w5)$p>A4t$cgCvmDFmI3P8!J7P{OJ!Ek{JJpeWOoCLL z%*7m#@NY~Py2aS+)4?P;aMX>B6l!fof>ZTp8`seIKyDSNNlCT5tr5>&ppiC%3{f?5Ylt942j{ z&4br=8j`m6eQfjUvVRR1{tt$S5e9HPq~eT=Xawqe$tNwBYK0$| z>AJdlQu)qDnQVQ%S5|k$2KKyUd`+gLn7(_}2{{@M&x2%d$%3SihxQ##N&Z`z=FqMY zi;9L3Ui3b|!S4>Jas~Anr5G?M>AAKK^I6JVxD(poW-oom48u+IYCP`8r5uM6&?)(A z`2EdG5(wXQqWB{>!9L$s#zTd1W830i4Hdsr5*x&cb|5M}=W(Wk=v5tP^6+sBR|bh zp6f0el*`AX0pe3VrC!ADxgf1HLC)^`0m_RxRW-h4j}8^FU%lw3ywZcZ9&QO0J#Zw_ zD!Zb{noc9xLY~tz9T?%0=c8x#FJO@kpve^llsRx9a%rN}g_Dn;j2`;vfrhNhstlUc zN1GK{_Mc%>M}jVWLySVNfy1dZ-Z^o{zxeLh^*3(B9IhF_2J};s`#4ISH4X<;;5$sS z>!{>>9)s)WglO;Tm%IE&-SjSK3p}2esi2lF?eCb1>=5HQmY5=H{UPz>hXVr;4Q-dTo%GJO%Lb6yYZ`y4|2ilz5i?$b;4 z61pv}#kZ95x6kyC+EwC`JW)o}j$fwo{s>+|Vtf!neahz+%`6*qWOhreT?9KhFA~Z5 z87TFC98kUqnm>TzN(R_cxOt!)5nHzM>ha1(4}wVUeY zm{p*%UMfTYvgKRuO3M(knA~CqVI>tke*way?nBjGj2B}PF}fUbYfp;5&FMw8UP2;; z&&+mYNSpa+5|7k%${VQCr^I51clnM)nd}pGuo6s$*7+N(TXe7BFO;kN0;Tx8Pw{YS#DctDWIO8^ z&>$M}h;O=1U`ZSzEtA5bBkWu&W*@hq6K9)O+T`drme4tr*BAU77iiLFkd~e9)D3DEpb07!n zR&e4ZiA3Gr16OSKLy0`S@a^XP*B-X}(0jmTzzJ=Pw_+{IYf)AGlCKxz$6?bA;^rmR zFw;{=zIA4HUz0Q5R)iIu_L&e>EVpaad@`}I<{rt@9NM<_7ud~Yu56T;&t+ip)c6AW zh!7X!Td4~Qu^q=fG%t)}9Aj^SUKy(G_sIM1`+_t9QAN&O6bl)^5ok^}hhPZky+zNO zYiw~EhM!BFD>tDs$^dYZovp`kE2`em%znD&+N%Wp-axW^PM>R8=VNU#`K`FrAp^mti%kIHBOo!U0< zQB?-nK6VBRaX)m0aT-n3pC##edzg%Q0(uU(k^0rV!xEf(_I^K`z;SU9J}M$=g(D(b zJ&5LmacR;-ARK=S19&b|p7{3gYy-|E4N4jmHJ8P1oUv7bq67+4YDjuUAl&1FAV*X3 z|7-8c!>Me$J)(>mLOT^oN`|PUN$dvdr9mn4uuFq7L{TEcjv^6?1`SAtGKU7hbI$uuSJ(Co_r2z|?)Cf@3cg#ryEZ5q=&LfGI$g8& zW36rS_gD!z>y!?j7i<1Vjx_+U zhM)&p<4P|QeLzf>OjF(@=TquM=YhVRf3j0s3aXd|+`B>rtoSA(- zW_wW&x9N1~;g-8{Z`EiAcR`cVx|cBSdX98Os)0KEd!ZFRjB8LTS}(bLm%)6}f-~FZ z&&cib)oJTSP1VqteiT9c9ltu?V!;{d`CLW-(Z6k`fz4hNBDOvP06u6YkDFn1VRdi) zAw}K%4Lo`9tt~Wg549*Al09FgbiTU`a>--;PvV#}&M$)$#wvetSoJ4gEuIjQ^K@5( zFRl@vX6hRt5#Zd?&|>oSWNKPQOG9^5p*^+j|Cyk0edA=fHE5m6Xur}}AlV^S9m#7b!fpGs}EZ(Rrb8#N0mmD71xTWE47@|!DD|>yz z*`Z;MXZGZSyscN7)DmuW`uxWo2zTrU|u^u(TWJb5&?LWdW8Kr{BM^1wR~ zl(+AxEOWRSx1B@41oJC@Tno= z8kUjH*)?-VP<%(8!<=xD*xWP)Jmd;bA83-db_n%AQ>Mq?(MUl&+y@pa@c8}}I&uj& zu%_-sq7P=#MS5Ua{Y?}+F_Tltjc{mVbyWRNXlee-n9tbN7_*Q;E$yV1Zg<8XJoXsC z*=0t+ly!J&jpcn0ivJuG$Ulp>nCDwbL*<~+?B+;uW`t1p5!`ah?IW0TsNb+gM=dZa zCa-J&@bYJBJ-UC4o>J#aFK#BiC;vHb&ir|sxU)o<7B6I+FC3WT#IxR+IN$x6n3Sax z7td$YN;Xk{!o0L?n~WHk#beygaCvL0ab<~!sRiGkiktLcMbKfttLPvcLm!(RB;zM_={w%c)us<#qboxD43&es$myl`2Gz@S*jfisa4s!tvGajZ>5b4*e$Sz|fZL!K5>*X5k8|WrC=G zX2{OY=9uY?JEjo!R-v#G?%jQY=OAX2!}1Z&SLEblc32d56vSLwRdN)wfFS~H5e=jl z@k>~RrPa7%MtsN+WxD(_0q){qDOF#?ogjm~M@*Y?I(olaHpVu}#4>CP7)f7Qx+n6(aB0FIf)J%ULb(wS{oMuUIbMK3{G@P&W;8b9W_ zTu*lrrzl_C<2M7dH1zi(zSz7dA!M|$-11g|tHlpnVt*SkMN~W>n=`9Z!cJO8&}xt#CzH$+BO^)al`^( z-u_f8uw$yn9kFwjYmJP6Jl>C-)`cvWj%~wUqd_^nqN;rH|iMG}*;}5rI@;H%N{;X8<2xRy~;l{;t4cAPY zt!BCy#@ny#dQyrIaPhXgrdyw@H-xK+)gpi#AZZw^p@qJ>01WA_9paQp9 zVmpJz{fG)J?Cfqt=}-Eg23?|f%Hr-u@0Hs{oRX`|kn$4}`PU5uJ#uoM+0lRxkL^`< z;H^`&Fjyj2@%+)wExf53VKGxr{QgTMurDL#G6={lTM}K&%(X=X?7nQl z9qfgHru40k;*~rxN6C~x)@y@z?|Dr1z+F4O?95_I_+AhNdeX%%(Q&i3xL>jo9|xRb z0Rt3cn~w?c5SiHHo%m#?K3a1d|0NoB{XbQXFcWr>t8`s{0Y*d7-evgd?aD4HQ8mAz z{ZX_SWl0`me;-GK$=nQ4+pl|tBvtdaZZ546@7%Y6qF zM|^#x)6S6SIESlwbs`9=xHejj<4d}GQM+_k?h8NC)_g*c)_RoPv9*deP&ftY`ge#=OY&M;*c z@WwJIZ!irS_gPr#ljWI?7}5uqo1bjC>&J&N>V7G;URHv3oeF$lpv>GQT`REj;2#*ac?Ut`_7Kww#A>Jb(W!XCESIPPQQW`t5t4Fdh_&+$M2MtlPD8BHktfn8_#7D#~SYh`0- zEMvj&Rq?ROKBmb=CyBCc@LtUyO;R!O~X{y zaA=QDHAu#4%jzO+IPxFZOvf!ln3J5$pnRHxle5OhTN0m}E(j^`BAhE~f>SfA-d|Q?YMlcLBdn^nJV$vmlPRY6O_|5y7}QOrieCi6{;Xn`9-4aDVLs z$VqV(xKW+hAsp?*Z8(s=(IL@~8zY(UMnV*&$o;KxO!>9CNT;}^wvE5a5+k>d;dvxi zk<;fx@Mp3oZ){i_K80Mta;@+UqqHREMbDVP@OYd2O&372u}S{SfY$)VT`Z8fOtLs8 zAQLYYl|w~)&=61n4lFy6()< zK(sJ9eIiPHc(DMY1@a~ojW9}K3oeW*C>ohnjIC3#N1|xt)#P*C#FZon0C+#nnym^k z&kG>?tyAO>Om+(;*RRLlUD4P#$|k6H&nFE$VBMl5WO9@eE+&n2H^0-WODqYOlz7Gz zguJ!DHk^Na7FYS_;D@-!`GT}HMy&8s{qs+ObHI#zStWq4D-wtx_R~o_<*|_nY~kr{ zsH=pY_2VB;05MyHP;Gml-xA*~=pJ=2#5mtlElpCm>gag@gLeYGAmC{oSio3LG8BZ; z7phF>W`Mg5q-U_)QQP%ub*a-nRUeE;h=f9Oym;7t%>K1piLYxEA*N~4k>s#B)l6Fg(p2qEt$~+A1P}q*F(J@QK`xk46M9?@A z<-5AJ=YK69*$Z+ta=P1>2-B9+8{l-y#KnbhD+rV>YFlUC%QYP%I73g)hY(};c1hei z@J0&m@=hg6bTWPcV?e%->~UgjGdAT`^8|amB3c>aQb|9C>~YSdtIhutWge7`9@2`d z*&5b(h#MbbKUD<-bn1<|9JLgZydm&h`t(h+DfRDT+3G||2Di0zNq+S_EO8JECP&Q50nWyEn^>{6T zsNJsYtG1>#=JAMf9Nc2=`;0e63)LlRPzVt>d&eOS-dYVp*7!LLV;F`6e7^*gdd7yN zkQE8YOpRV3IL0I4AHYR8$`IAuLAi~36`U7B(P4drTMd?_ly6|6m20ZSF$$QQi7b$S z&ZKGdFRwW-E7%4HI#fg>W;`bGBKeX- zAThs;Nzqo|u-t>jc%0L*hRR&{M*XcAno%!q#5@U0kTo>kZ9zfj3Xso~sa8~argjF5 z5R2QnUvDIm^gsdbF24N#pyYFu0(v5r(ONyW<`V{PrLK4;?x0&%6&zH{3IZ^-I`<{9cptR7dj|oWpLQIR5c=C^Z_@J~BJRJ#21ZGS9htE|SpU#HdKrw&zDu||eH$Aj^m{%{r8?jv=YxF{ z4_+ZN`f7THDGO22NBHj+9R6pEKESdWANQz&;n6AW!r8(RbMwo=6FV59>X-Wp!>+~o zK|Y^Q&S8sFL?y_J_#O*j6p2ipfokwP|2q#@wunKt>r%Rb+7)AXK1#7uDBFDyJ*K>` zftq^?e^Kx!P5(-B&qn7<+J~N)sNH^YoXS(dlTI<`@X1t~*x0P{a@mhBRGY>Un?7># zD(yV%<-#W;mn>^OR@BG*5-AB`*a6M}(4W}HkX~1imaW9Tl_U&uKlKi~Ag0BT%m}d$ zi?^l=1g?`aa=$s`qWt(_k~pJiDOaFdM(szff?XsFhz& zgq-yBRJ-^ReHN;KA3T8rgC&zkS4-2}mWU`1jNySdQjD3-X{0IJHRS3YV)F2Oc^udL zhF=uAn{?I*#qh&WmS?Sa)jJp}nG$R}By*1EJ^3s@s5IF~mk=xjp03!CN zC5QhQ$HKvufZpkQ)b$7Ii+<|v7l_%#@?PS5Xee~7kmu4}sPv&W2*gmxv6e|iCQ$!8 zva``GLcV9k5M>p#35A-s!4MZv`xaqGIMwYlk=%$`cLh4_ZdC=%Wi-k#N>n64$t8b*JGL8xOJ&y^3k1;_V?eW&89 zykqz0FOEXQZD+5p#L-bL-O2C!{gwRqq8ha6u@W3uFl)gGA9hc0CQ;-R=QDO*^;Ava zM#~Q$YED=Lyt<5c3af#0PlMc#jc0=~bb`em;WK_CppO8P_6vi6vb&2hVaP79n56Lb zX}sz$_)1iL11%_@v=;pJiqFVtLeu@aVEW)Ad#h+m>N~cC_(HWaIC2t=P`+FGN_7~F zbA%cTW`Z0YJ4TOjGb4YZ<^s74jt#3dc6L+$OwV9X4sEjh;A(;86yp5uCC~_ZY#;qt z3BmnBE@RSpv`9=5-6I8b$2ISfk3cAL-*SaGMx2}%p%8rGe^i-A0tcE zz=zmG128~;M%<3a7Eiz$I7>p{xjy>hA&l9h7Rpg#UncZH?_R6xSxG&Qz2Msxv_l-rfx*&i=Tb0Un?e&Ay?~58RqO~98*0cfL#G7 zY{MD`#35l_DD@m16Ouw!1ocr1(dIE82_wuuHI-sB!`L%vS_jNi;3CLE(ScJ(NuG+O z%8N(}E7vU2#27f40c3%Sizc!_uCDBsBUk_!o-X76>(=Nmwi)_an#17^wKxkbftuvG zK{|Z&ufdE?gIu7b6RyG~LE3%K#1ymGQ6-@IParoqSzHqiypDVjxc%_D_0<*BL=N8w zRl2#~_hA}DaElvxx;9Hfe7^EB;6(U(IR07@$cEK9G7lIe6{0K_g0N}>qRsXH2jw3K z#Xx78Z!L-$Q~y~5E=D&jqm4_H^qUKz_gc?A0v9@*i zUK~77?r%`Qc~ZNp%f74E$eP|!p{sS?fOuc`x5B(PgI3Is12_jx|ESq$?Who4+qC-Q z3QbBt(m+~!jhVG$MNjYZkA?#SEuB}pqq`gZ2V%Akp8iodZSZvXU;w8{kKOB&U!cDr zSYA~Gqf);S2@XDjfN$Db2?OUA$=i7Jm$4r6>BhjMW$HV5{W`Y5d9>HZ3-}HhYSBaw zAPd0RRI!`1?ASlye(`n%PaywYjE%O2D3dij<5Gh@G@O6~ATIm?&^YT>AF9(`*QOUa z8&9CkuoBR~_$4vbBbxKuJIK6nJIn0F-^M9 z4eV5h=oMjF`$t~^O!`{~AXP7qD($LhxDLGiO;#?p-Zwrc;%9;fu|F@0X#*JlLI~?1 z6r5!63c-3t4r=oI&9g=#ko(}jcH&ND$GwSM&vaz?tl+`bNf6aL3bpaR%g26T^&3tY zdjS1&eRb~qR_sS^B<=z6zkg}Pl93;NySpL+L~Wjn6F1S0$nQf$zFX8pkG2_DiX5f- zk@K`&-yZ1C30EmeroAI0Mjh)z@1YOCTG1IF?vC9ZB)4#+7V`83D`Bzkld*;e|4Tdy zPpnUg(vHaP!V&Z&4;6s2+E>w;!iW(4=08MMxbi=KnSt*ZepdA*CSTPDYb_neI0?~0 zeG-%F>;O`|yQ+1DHc{Uo6~KM6G%f?Y(}@zj?8vT=-I)*up1TMEGdhdx$p_7v6{Yja z@D*e(tuQF)lsv1V`XXW6cMwVa&}5>O=_3JumJz2PR4Na@ruVCPUih99U)`l+Y`AW9 z0V&AWl&>1L(BAGW6!r}DmmOGOMEl4KCYPZbihUBU(R?-?c^UA>_ugSi+NzJ*lc+m{ z@TxXKp965TA*TLXi{|U0?jcK(jjz9iJJ%lP#(b#Q>Mz6_3o&E_KCi$z5GI=cH^~9f{jJ;15xxwJ) z(x+%sm>o3WfS3U7pwKu0+{I*tM?fZDO%}!){FY)r|5RiQZ}(i1SxsA~mw~(R4Kk)J zih(bY%;-Bjqg8Aor!oEf=CWYdzcpqUEqJM=P~s0f&jPTQ**Z}gr2zMq?ZVR2t+H88 z`1h2gB=bO$9-aRM&RUG!DVc-)O%^TB7M*O&jF@r=-?^YX$XI66`)IMrdT~b!}J-zUr%)bq^lr8#N)aF=XaGk z=l9m!I@y>Dc#!JZ07#^nQaEiQ25&=6!7k#@edx%Ri(;*6U;XH*i#ZvvcA)*vg(a+j zM_RC^)dpa6Q##uk>-76zMpu}kMpJ5gzjbrv6AAqm$`nqks!W(sB4ID2m}4RY({LLB z1gL2`8u5~icJ|&n<9Fr&37+=@kl33M5-S-PfNKax5`cAA~WC%>3_3YQ@&@VLucwoYt1Lu)}A!)%Gb=` zi3T7r8JMzB!8L%H(={e;5Vjk2FV*vZls7r7)B~8ty)D(xjJDUh%-GHh7|NYf%Y`%( zzpa3=I~NSu5&E8H>L8$6aw1S&H_!Q&N*-v?PENy?w291+tP*L1I*;EX5R}|h3QQ_1 zD|cUDEr_Nt^~`%)vU{nlEN=nK-Ijr2){TjP&$W3_aN0!L=`XA{oGh0!ny!Y>izLYa zkhWH6epP1)LY^vvQFlhO4!-D=)Q-RF*fe8@{7XfHcG81C<=6l*cz-D%fo>?v+FxxS zVNkdH_X11@wOI&ppK|P0fc1#!l7Q?SAA3rYda`q)w(v{o6c6gPKL%v!kDQh;Rrf56 zxw=1i>W%aAf>k0g(=3x24L{5Rh}(?shXW?EBl{&Fix`3)Am3!H6epxByPazNdKSTp zJ$uz#y-0CZ==NLhJv#wf_AJb-S#r}Ni{ab3pntLCG7D;6K|n{ z2Phe**fAiuT^LE7QKa8r3HXrA(}Yf2tor0Mr6QHYyE*LE37t}ahI?y!piH?M1k$j! z4-hctMguV5kQjn8M%y(u=LvB(+XK{|t40JL0s^*xInd{_r>~XVdPB}Eq}P5T;V)u@ z&+TP{@{cVb3bT>-B+Xw969!k>NL)Jb{K{E`6CTx+XlAwy=1-f?$o*r{E#4DlmU({i zRo6J>e-OI>*>6sz%G|ic!LMs0tvop=l9Xep2;aze1-`1)W81Bs=>7%gPm@#-ZV2b#jIX*tvY^OlgC% za{p?W{KxU&P@#dzoJGG#J=WhLtexK6>E{aD__|2;gVHo}AwL^-tZZA{hC{ zjKErx>*Jqi9a3n$-nhb&?NaiFb6CVCJiW=G%*7cD%1|JdWzxNk^h6aQe6j-YpKceB zQQ&J~z{hg;yOD95FV4uzglR#khEj$Z@;3o+Ph>}o)tuQ&(Kzd~v(1x(diw#-kpNco zhhKCv{x}OOQp6+h4b-_^ISCBPtOu3?{ng0CGWY#pzRG>7#QBcb6iBVhFId}DCe#Y* zH{CMT$2uKNVj4L7!K-cYoUv>g{Y91t@yQf-NhJox7T(f>H_Wo?-#w7nX707FgZXvX zj;352aADanC{U1JQY$w18lWxeC0Ack?Wut=kpTm7_;2y3((OlV#TiV0G*ViidQ0?U zK(^?l#HG~6l!!|*mbyNxkAHOm@V@0>wHBb^ke^{d6&nDxv%(c70Lnf$3#Lx;BEU8a zz#?@8Rf*`GgTUvmtv-HGv~a)LL_W`13_4S|A}X%~wPNAB0EtURUhCu}brOuHGz#>G zAQZl204dL&b?7Gd*FSH}1hxsmJg$_)>0CE9R4zX?k+2zGa+2EOzuW8)kFbn6BbwPh z@E~`OSV{YPKnw^TFM}8l{}z$e*SaiM|N7XgZyy|?AebV|)r8;;oVlPB`CyWun1;m^hb_me?$q)%7P z{>Z%i;0tCn&Y@&Y4`AfZa2V|U=!($!<$LQN?Coy(vKL$iCmOW5sxi4L3&wku*fy0t zI-U&!3Ixz(RW7fv9RU^TP2L-)v%rW6y*m5!85j7aSRG;9WH!J~5(FVYEULA#4a=&2 zb{WNoJb=d=WAW;bMQ1@8(;N%%&?VS{8@X9>INss5u(9b%ALJ~z;cu@8ZijFA^kk+X zJNPgIw?FwT51da-uYC0G!68>DN`T+3c5_g~}C^zCX_9RGgF1daKDwGfk^quW!zc<$|`~f*RK< zPQU|t^T4na*+CpTzgO!xd~Id07~ zH;HX!fTsExOf|cg;(*PnhJ@EyFePEexpOJ&EXtQwmBv|$$QkA|!5_O~A@(?-S(FTM zcQ(MJWp~#E2t6!2_S~Xq{j{i#IdMVr;mS91m30UYw=>1-bhXG{h-X+4{3|${MOgqw z%WnYi)#mDX2zJ<_{f(xpjpu~Utr_+6$!iuqm?7+)PI(ognhg-D{7W+XTCAgOUpl*O zn~r9srV1IUXNz9ddsW^c;$ZnL$n}KgO*aYc9A!5&iliPw_jKJBtujB~3BufCaws zMU%Tk^fw2=Q@18GjaA!7SvGd0LYRUD?pYqftIrVAf0NspW2S_xb9?B3t72bJru|bG z_4)c}hTF>AJyIDRi7{tcW>oYC53bDY-sYH=9QBN2Wm!?bJWOA<$l>1HR`|rZ^ab~g zMU{0vn+0p-EUXm!njF!@6&HwTf_rN}Ide`&0PmV68Q=63A)L2>ad;;*pSXQ22R|^+ zJf?D@FWpJZq@>GMIOVYNd~t~(jT)-WU{9$A+cSem-fzsZ|mMM#OlVfo&IxAl+Noz!yE)+2ET1qd|&RczLGIe}(9Bh0j3>imv_$&xeiqcPfFTQ7zerUf@ZrZ8V6b?dqZ{;?V z)Rocq&(bbL;z)aJP z0x~@-S7Spue2VH#MkrqB@OtXSU2q|>fkE}^k_N?%diVC3#Q;KF+m3dD#X~miWL;_} z*y8UiZF6p*xz+>eLOn&UJ$WLWFk|@2kLQL1@x6P(S}TNl)2jd%ylQX3&DA1DEw@s| zX4Kv@kQW7*Dzl8&IRlPJ-0hmn8qXW1^?Z-`4Axb@>QUF16n}*h+siYk-$=cf zsapWHhmJ2B!M%};hC-@XfUZ5;-CE;{(ub&xp7JZ9deUeO1Ieuidtk2T1IM)Q>znkN zGHe`RqC~ABf078yzSi#vu$#8FK6c}^6($-@MuRah;8%07l!n6@HF`u69~l7Bt!K;F zdh$fvY;>4&${a=6P0Dg457Q#TDMvkRqt97q%VU(IZQ~#aYnM(1-0!!g#@sigONyN= zDfH7^L{+b}HJ!xzGU{(#FmY*E7JO*QgT$L{Hw--(*TSdH}G~4ba z$U|Yug?O~r>#d>VI{B_o&Jkbwz}mP1PIYjvz3H8AW}+w!m4PwLjhzr~*B$A6BCYH& z80Tdl>9|eLx(W>o>1;j2#FhoE*Mns#)2~PyRvi7N_11dA zK>2sks4FiIap?Wq^=h>2#R(JT+z3kQpkYdL zPuuOGk9#zDhEg9GH7kHdjWoLRLCVQt*#BK~qp81}gw{>Rfx)DcO_3T4^a)NTUYj{` zC|kLt&!6}43G@-WMqu4{P?-75b>RemF=xNUNA?+$<_|EdPf=Hr;abiiyOe8v>GH&G z-&x;`0-A2#%ZPLk5Xj5e9n~JmVrVz`$Ts72LnZk4LE9w8`6|XnkMu$%G^6j{Jif-Z z&A6wl*(l|B&34!cvo(p+y89vNXc$jHS52Jb;D8mB2-_gcYlDldAb3o$@9l83 z54qFVw&hX9iJPmBFZ83^!m`gdJ=4DTA?q1mnWwg!Sq$`2Pe{#OV`ZGaS#P2P;#g5~ z=;12|$eDxmE&Ej2tkdcjZCT?~2ImEoYm6#3cjkO}Xr`MKIc3`PyAYCw&RDd)&$jVU zSLLV2&b1ZkcC`QlAJt@-Zfng~PzuG1?*oMa%!_+(tv$H}rX~sd#T<$}=_`Fu-mXJZ zKht5|+||eKw#UKxLty$=Xm4jz*k&(57Q+PbM-v=P%dDU`q+ENSQ>^MliDVK~bVv&t zP<5&Vu=84YLT!2K$%vSp_2sE6{a`4SW1oWENs!##1ud872`QZ3l6s;+MKn3iuCtM& zLEqtabzgUDL~GsKn24CYr@LE38%pCu=EBs9#ENtLEnIjjf-#|F78YjGR%0y{_>h<~ zC=m-4f!z*r`_f+8L$PVlDTKam(1 z7zi^6mv|=1KZeAOY{|w<@~~65KT!bv(^xJP7Is=np0^nD>Hcq4LP!E(O|A)EGg0(1 z9X$;vhTpZdg zAr7|Y<{B(Zdusx~gV)zCi__)-H{yZKDizv1_!lkIWaHI$vVR`?CQv`-uyxb|jr=Ev z7nsoV?Zr%)9<_(lej@=R7jp@7=@98e+H6+PKH_f!CcJcwUx!WI#&y%=BA{$gUc_pe zJP72Zr}t3sZJ>P;=)%uMVP0qOCvCy9XJ#g~1(|Zve7SG}Mdw?iECLr0WP8Vfn(k8_4 zr4%!rrZ@UNV>fMEB9jaP|4BrRre+AsSOc-|?NIBVD3lyxF69$2(AkSfPy5PZCPtZ1 zh4t+d#Q($k?F>r9uE4-VTiw-Xa#61JFutKJ>+DNpZ0JO4(!^>$@v#1q>2akJX@co4 z(hs`ag>@b92?njbkz|1g!L!b8pe^tBSiyZ*ANx-GBwkqr44MBUt0rc1k7mRTAY?~o%vyIJuF?5CLjAr50} z9G-C*fSFJ(IJL9j$E!&^H;WY_A7+UNJm?%gHi2YS4hZ#NR-!U(lIkFm?vI)%Bi2M4Fpxh)N`z^~2x_{Z zP!D6zrz3Qk1xwodiqa&oGIg=(sh|;UN%m+hzs$@jlKT4<{z^BM&tgGD4IFzKU(>Z zko?~fl9#q=Tj}WNp8c_D{qFzmeu4asrH|=Q{Zst{59KD<6x|<6+c!mTAf5RyFz>a+ diff --git a/docs/assets/img/image-20190726144001775.edc163c8.png b/docs/assets/img/image-20190726144001775.edc163c8.png new file mode 100644 index 0000000000000000000000000000000000000000..7b1d697ecc566eee77dc40f92cb23969976158a3 GIT binary patch literal 73134 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 literal 0 HcmV?d00001 diff --git a/docs/assets/js/10.0978f731.js b/docs/assets/js/10.ff008501.js similarity index 99% rename from docs/assets/js/10.0978f731.js rename to docs/assets/js/10.ff008501.js index fdd5603..6861f07 100644 --- a/docs/assets/js/10.0978f731.js +++ b/docs/assets/js/10.ff008501.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[10],{301:function(t,e,a){t.exports=a.p+"assets/img/image-20190722223454676.b545b43f.png"},302:function(t,e,a){t.exports=a.p+"assets/img/image-20190722223551308.ed106a2a.png"},303:function(t,e,a){t.exports=a.p+"assets/img/image-20190722223605920.3e762b29.png"},304:function(t,e,a){t.exports=a.p+"assets/img/image-20190722231246540.ebf13194.png"},305:function(t,e,a){t.exports=a.p+"assets/img/image-20190722224029397.abc44209.png"},306:function(t,e,a){t.exports=a.p+"assets/img/image-20190722225347491.984fabae.png"},307:function(t,e,a){t.exports=a.p+"assets/img/image-20190722225454029.73400267.png"},308:function(t,e,a){t.exports=a.p+"assets/img/image-20190722230511430.ed459354.png"},376:function(t,e,a){"use strict";a.r(e);var r=a(0),s=Object(r.a)({},function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[r("h1",{attrs:{id:"工作负载"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#工作负载","aria-hidden":"true"}},[t._v("#")]),t._v(" 工作负载")]),t._v(" "),r("h2",{attrs:{id:"创建-查看-编辑工作负载"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#创建-查看-编辑工作负载","aria-hidden":"true"}},[t._v("#")]),t._v(" 创建/查看/编辑工作负载")]),t._v(" "),r("p",[t._v("请参考 "),r("a",{attrs:{href:"/guide/example/busybox"}},[t._v("创建 busybox")])]),t._v(" "),r("h2",{attrs:{id:"伸缩"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#伸缩","aria-hidden":"true"}},[t._v("#")]),t._v(" 伸缩")]),t._v(" "),r("p",[t._v("伸缩操作,通过调整工作负载的 replicas 大小,来控制该工作负载运行容器组的数量。")]),t._v(" "),r("ul",[r("li",[t._v("假设您已进入工作负载查看界面,如下图所示:")])]),t._v(" "),r("p",[r("img",{attrs:{src:a(301),alt:"image-20190722223454676"}})]),t._v(" "),r("ul",[r("li",[r("p",[t._v("点击 "),r("em",[r("strong",[t._v("伸缩")])]),t._v(" 按钮")]),t._v(" "),r("p",[t._v("填写表单")]),t._v(" "),r("p",[t._v("副本数: 目标容器组数量")])])]),t._v(" "),r("p",[r("img",{attrs:{src:a(302),alt:"image-20190722223551308"}})]),t._v(" "),r("ul",[r("li",[r("p",[t._v("点击 "),r("em",[r("strong",[t._v("确定")])]),t._v(" 按钮")]),t._v(" "),r("p",[t._v("等待,知道伸缩操作执行完毕。")])])]),t._v(" "),r("p",[r("img",{attrs:{src:a(303),alt:"image-20190722223605920"}})]),t._v(" "),r("h2",{attrs:{id:"删除容器组"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#删除容器组","aria-hidden":"true"}},[t._v("#")]),t._v(" 删除容器组")]),t._v(" "),r("ul",[r("li",[r("p",[t._v("点击 "),r("em",[r("strong",[t._v("删除容器组")])]),t._v(" 按钮")]),t._v(" "),r("p",[t._v("可删除该容器组。")]),t._v(" "),r("ul",[r("li",[r("p",[t._v("容器组被删除之后,Kubernetes Workload Controller 将要重新创建一个容器组,用于替代被删除的容器组;被删除容器组原有的状态将丢失,新容器组重新从 镜像中加载启动;")])]),t._v(" "),r("li",[r("p",[t._v("Kuboard 的工作负载编辑器,默认将容器组的 imagePullPolicy 设置为 Alwarys,因此,每次在容器组启动的时候,Kubenetes 都会尝试从镜像仓库中抓取最新镜像;")])])])])]),t._v(" "),r("p",[r("img",{attrs:{src:a(304),alt:"image-20190722231246540"}})]),t._v(" "),r("h2",{attrs:{id:"诊断问题"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#诊断问题","aria-hidden":"true"}},[t._v("#")]),t._v(" 诊断问题")]),t._v(" "),r("p",[t._v("在诊断工作负载的问题时,Kuboard主要提供三种手段:")]),t._v(" "),r("h3",{attrs:{id:"事件:-kubernetes-部署相关问题"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#事件:-kubernetes-部署相关问题","aria-hidden":"true"}},[t._v("#")]),t._v(" 事件: Kubernetes 部署相关问题")]),t._v(" "),r("p",[t._v("如下图所示,图中提示")]),t._v(" "),r("blockquote",[r("p",[t._v("错误内容:Error: ErrImagePull 该容器组抓取镜像失败")]),t._v(" "),r("p",[t._v("失败原因:pull access denied for busy-box, repository does not exist or may require 'docker login'")])]),t._v(" "),r("p",[t._v("对于这样的错误,需要技术人员检查:")]),t._v(" "),r("ul",[r("li",[t._v("容器所在节点与镜像仓库之间的网络连通性")]),t._v(" "),r("li",[t._v("容器镜像拼写是否正确")]),t._v(" "),r("li",[t._v("如果为私有仓库,是否在工作负载编辑器中正确配置了 docker 仓库用户名密码")])]),t._v(" "),r("p",[t._v("!> Kuboard 监听了 Kubernetes 集群的事件变化,您无需刷新页面,即可在工作负载编辑器的容器组界面区域看到该容器相关的最新事件。")]),t._v(" "),r("p",[t._v("通过 Kubernetes 事件所指示出来的问题,通常是集群本身配置的问题,或者是创建工作负载时的参数填写问题,解决这样的问题需要的是 Kubernetes 集群相关的知识和背景,"),r("strong",[t._v("通常运维人员可以独立解决此类问题")]),t._v("。")]),t._v(" "),r("p",[r("img",{attrs:{src:a(305),alt:"image-20190722224029397"}})]),t._v(" "),r("h3",{attrs:{id:"日志:-容器运行时产生的错误"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#日志:-容器运行时产生的错误","aria-hidden":"true"}},[t._v("#")]),t._v(" 日志: 容器运行时产生的错误")]),t._v(" "),r("p",[t._v("如下图所示,假设您已进入工作负载查看界面:")]),t._v(" "),r("p",[r("img",{attrs:{src:a(306),alt:"image-20190722225347491"}})]),t._v(" "),r("ul",[r("li",[t._v("点击其中的 "),r("em",[r("strong",[t._v("日志")])]),t._v(" 按钮")])]),t._v(" "),r("p",[t._v("可查看该容器的运行时日志,如下图所示:")]),t._v(" "),r("p",[r("img",{attrs:{src:a(307),alt:"image-20190722225454029"}})]),t._v(" "),r("p",[r("strong",[t._v("容器运行时问题定位及解决")])]),t._v(" "),r("p",[t._v("日志所指示出来的错误,可能有两类原因:")]),t._v(" "),r("ul",[r("li",[t._v("将其容器部署到 Kubernetes 时,参数配置填写错误")]),t._v(" "),r("li",[t._v("容器内应用程序自身的 BUG")])]),t._v(" "),r("p",[t._v("无论是上述何种原因,运维人员如果请开发人员介入,一起排查这里问题,效果会好很多。")]),t._v(" "),r("h3",{attrs:{id:"终端:-通过交互式命令,在容器内诊断问题"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#终端:-通过交互式命令,在容器内诊断问题","aria-hidden":"true"}},[t._v("#")]),t._v(" 终端: 通过交互式命令,在容器内诊断问题")]),t._v(" "),r("ul",[r("li",[r("p",[t._v("点击 "),r("em",[r("strong",[t._v("终端")])]),t._v(" 按钮")]),t._v(" "),r("p",[t._v("可进入该容器的交互式命令界面")])])]),t._v(" "),r("p",[r("img",{attrs:{src:a(308),alt:"image-20190722230511430"}})]),t._v(" "),r("p",[r("strong",[t._v("适用场景")])]),t._v(" "),r("p",[t._v("在交互式终端里,"),r("strong",[t._v("运维人员")]),t._v("可以:")]),t._v(" "),r("ul",[r("li",[t._v("通过 ping / curl 等命令,测试网络连通性,测试 Kubernetes 的服务 DNS 解析是否正确")]),t._v(" "),r("li",[t._v("通过 export 命令检查该容器的环境变量的设置是否正确")])]),t._v(" "),r("p",[r("strong",[t._v("开发人员")]),t._v(" 可以:")]),t._v(" "),r("ul",[r("li",[t._v("通过 ls / cat / vi 等命令,查看该容器是否包含了最新的代码变更")]),t._v(" "),r("li",[t._v("通过 vi 等命令,临时对容器中的配置文件进行修改,并在验证这种修改有效之后,才将其正式更新到代码库")])])])},[],!1,null,null,null);e.default=s.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[10],{301:function(t,e,a){t.exports=a.p+"assets/img/image-20190722223454676.b545b43f.png"},302:function(t,e,a){t.exports=a.p+"assets/img/image-20190722223551308.ed106a2a.png"},303:function(t,e,a){t.exports=a.p+"assets/img/image-20190722223605920.3e762b29.png"},304:function(t,e,a){t.exports=a.p+"assets/img/image-20190722231246540.ebf13194.png"},305:function(t,e,a){t.exports=a.p+"assets/img/image-20190722224029397.abc44209.png"},306:function(t,e,a){t.exports=a.p+"assets/img/image-20190722225347491.984fabae.png"},307:function(t,e,a){t.exports=a.p+"assets/img/image-20190722225454029.73400267.png"},308:function(t,e,a){t.exports=a.p+"assets/img/image-20190722230511430.ed459354.png"},372:function(t,e,a){"use strict";a.r(e);var r=a(0),s=Object(r.a)({},function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[r("h1",{attrs:{id:"工作负载"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#工作负载","aria-hidden":"true"}},[t._v("#")]),t._v(" 工作负载")]),t._v(" "),r("h2",{attrs:{id:"创建-查看-编辑工作负载"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#创建-查看-编辑工作负载","aria-hidden":"true"}},[t._v("#")]),t._v(" 创建/查看/编辑工作负载")]),t._v(" "),r("p",[t._v("请参考 "),r("a",{attrs:{href:"/guide/example/busybox"}},[t._v("创建 busybox")])]),t._v(" "),r("h2",{attrs:{id:"伸缩"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#伸缩","aria-hidden":"true"}},[t._v("#")]),t._v(" 伸缩")]),t._v(" "),r("p",[t._v("伸缩操作,通过调整工作负载的 replicas 大小,来控制该工作负载运行容器组的数量。")]),t._v(" "),r("ul",[r("li",[t._v("假设您已进入工作负载查看界面,如下图所示:")])]),t._v(" "),r("p",[r("img",{attrs:{src:a(301),alt:"image-20190722223454676"}})]),t._v(" "),r("ul",[r("li",[r("p",[t._v("点击 "),r("em",[r("strong",[t._v("伸缩")])]),t._v(" 按钮")]),t._v(" "),r("p",[t._v("填写表单")]),t._v(" "),r("p",[t._v("副本数: 目标容器组数量")])])]),t._v(" "),r("p",[r("img",{attrs:{src:a(302),alt:"image-20190722223551308"}})]),t._v(" "),r("ul",[r("li",[r("p",[t._v("点击 "),r("em",[r("strong",[t._v("确定")])]),t._v(" 按钮")]),t._v(" "),r("p",[t._v("等待,知道伸缩操作执行完毕。")])])]),t._v(" "),r("p",[r("img",{attrs:{src:a(303),alt:"image-20190722223605920"}})]),t._v(" "),r("h2",{attrs:{id:"删除容器组"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#删除容器组","aria-hidden":"true"}},[t._v("#")]),t._v(" 删除容器组")]),t._v(" "),r("ul",[r("li",[r("p",[t._v("点击 "),r("em",[r("strong",[t._v("删除容器组")])]),t._v(" 按钮")]),t._v(" "),r("p",[t._v("可删除该容器组。")]),t._v(" "),r("ul",[r("li",[r("p",[t._v("容器组被删除之后,Kubernetes Workload Controller 将要重新创建一个容器组,用于替代被删除的容器组;被删除容器组原有的状态将丢失,新容器组重新从 镜像中加载启动;")])]),t._v(" "),r("li",[r("p",[t._v("Kuboard 的工作负载编辑器,默认将容器组的 imagePullPolicy 设置为 Alwarys,因此,每次在容器组启动的时候,Kubenetes 都会尝试从镜像仓库中抓取最新镜像;")])])])])]),t._v(" "),r("p",[r("img",{attrs:{src:a(304),alt:"image-20190722231246540"}})]),t._v(" "),r("h2",{attrs:{id:"诊断问题"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#诊断问题","aria-hidden":"true"}},[t._v("#")]),t._v(" 诊断问题")]),t._v(" "),r("p",[t._v("在诊断工作负载的问题时,Kuboard主要提供三种手段:")]),t._v(" "),r("h3",{attrs:{id:"事件:-kubernetes-部署相关问题"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#事件:-kubernetes-部署相关问题","aria-hidden":"true"}},[t._v("#")]),t._v(" 事件: Kubernetes 部署相关问题")]),t._v(" "),r("p",[t._v("如下图所示,图中提示")]),t._v(" "),r("blockquote",[r("p",[t._v("错误内容:Error: ErrImagePull 该容器组抓取镜像失败")]),t._v(" "),r("p",[t._v("失败原因:pull access denied for busy-box, repository does not exist or may require 'docker login'")])]),t._v(" "),r("p",[t._v("对于这样的错误,需要技术人员检查:")]),t._v(" "),r("ul",[r("li",[t._v("容器所在节点与镜像仓库之间的网络连通性")]),t._v(" "),r("li",[t._v("容器镜像拼写是否正确")]),t._v(" "),r("li",[t._v("如果为私有仓库,是否在工作负载编辑器中正确配置了 docker 仓库用户名密码")])]),t._v(" "),r("p",[t._v("!> Kuboard 监听了 Kubernetes 集群的事件变化,您无需刷新页面,即可在工作负载编辑器的容器组界面区域看到该容器相关的最新事件。")]),t._v(" "),r("p",[t._v("通过 Kubernetes 事件所指示出来的问题,通常是集群本身配置的问题,或者是创建工作负载时的参数填写问题,解决这样的问题需要的是 Kubernetes 集群相关的知识和背景,"),r("strong",[t._v("通常运维人员可以独立解决此类问题")]),t._v("。")]),t._v(" "),r("p",[r("img",{attrs:{src:a(305),alt:"image-20190722224029397"}})]),t._v(" "),r("h3",{attrs:{id:"日志:-容器运行时产生的错误"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#日志:-容器运行时产生的错误","aria-hidden":"true"}},[t._v("#")]),t._v(" 日志: 容器运行时产生的错误")]),t._v(" "),r("p",[t._v("如下图所示,假设您已进入工作负载查看界面:")]),t._v(" "),r("p",[r("img",{attrs:{src:a(306),alt:"image-20190722225347491"}})]),t._v(" "),r("ul",[r("li",[t._v("点击其中的 "),r("em",[r("strong",[t._v("日志")])]),t._v(" 按钮")])]),t._v(" "),r("p",[t._v("可查看该容器的运行时日志,如下图所示:")]),t._v(" "),r("p",[r("img",{attrs:{src:a(307),alt:"image-20190722225454029"}})]),t._v(" "),r("p",[r("strong",[t._v("容器运行时问题定位及解决")])]),t._v(" "),r("p",[t._v("日志所指示出来的错误,可能有两类原因:")]),t._v(" "),r("ul",[r("li",[t._v("将其容器部署到 Kubernetes 时,参数配置填写错误")]),t._v(" "),r("li",[t._v("容器内应用程序自身的 BUG")])]),t._v(" "),r("p",[t._v("无论是上述何种原因,运维人员如果请开发人员介入,一起排查这里问题,效果会好很多。")]),t._v(" "),r("h3",{attrs:{id:"终端:-通过交互式命令,在容器内诊断问题"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#终端:-通过交互式命令,在容器内诊断问题","aria-hidden":"true"}},[t._v("#")]),t._v(" 终端: 通过交互式命令,在容器内诊断问题")]),t._v(" "),r("ul",[r("li",[r("p",[t._v("点击 "),r("em",[r("strong",[t._v("终端")])]),t._v(" 按钮")]),t._v(" "),r("p",[t._v("可进入该容器的交互式命令界面")])])]),t._v(" "),r("p",[r("img",{attrs:{src:a(308),alt:"image-20190722230511430"}})]),t._v(" "),r("p",[r("strong",[t._v("适用场景")])]),t._v(" "),r("p",[t._v("在交互式终端里,"),r("strong",[t._v("运维人员")]),t._v("可以:")]),t._v(" "),r("ul",[r("li",[t._v("通过 ping / curl 等命令,测试网络连通性,测试 Kubernetes 的服务 DNS 解析是否正确")]),t._v(" "),r("li",[t._v("通过 export 命令检查该容器的环境变量的设置是否正确")])]),t._v(" "),r("p",[r("strong",[t._v("开发人员")]),t._v(" 可以:")]),t._v(" "),r("ul",[r("li",[t._v("通过 ls / cat / vi 等命令,查看该容器是否包含了最新的代码变更")]),t._v(" "),r("li",[t._v("通过 vi 等命令,临时对容器中的配置文件进行修改,并在验证这种修改有效之后,才将其正式更新到代码库")])])])},[],!1,null,null,null);e.default=s.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/12.b79a1929.js b/docs/assets/js/12.614212a6.js similarity index 76% rename from docs/assets/js/12.b79a1929.js rename to docs/assets/js/12.614212a6.js index a1b28d3..87c9f60 100644 --- a/docs/assets/js/12.b79a1929.js +++ b/docs/assets/js/12.614212a6.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[12],{227:function(t,a,e){t.exports=e.p+"assets/img/image-20190723105606081.bc471512.png"},228:function(t,a,e){t.exports=e.p+"assets/img/image-20190723105644937.968b1660.png"},229:function(t,a,e){t.exports=e.p+"assets/img/image-20190723105722999.5b6c9bae.png"},230:function(t,a,e){t.exports=e.p+"assets/img/image-20190723105748435.1cb3ad0d.png"},231:function(t,a,e){t.exports=e.p+"assets/img/image-20190723105809872.61add376.png"},232:function(t,a,e){t.exports=e.p+"assets/img/image-20190723105830318.43414c56.png"},383:function(t,a,e){"use strict";e.r(a);var s=e(0),r=Object(s.a)({},function(){var t=this,a=t.$createElement,s=t._self._c||a;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"名称空间管理"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#名称空间管理","aria-hidden":"true"}},[t._v("#")]),t._v(" 名称空间管理")]),t._v(" "),s("h2",{attrs:{id:"创建名称空间"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#创建名称空间","aria-hidden":"true"}},[t._v("#")]),t._v(" 创建名称空间")]),t._v(" "),s("h3",{attrs:{id:"前提"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#前提","aria-hidden":"true"}},[t._v("#")]),t._v(" 前提")]),t._v(" "),s("p",[t._v("必须具备如下条件:")]),t._v(" "),s("ul",[s("li",[t._v("Kubernetes 集群")]),t._v(" "),s("li",[t._v("已在集群中安装 Kuboard")]),t._v(" "),s("li",[t._v("已进入 Kuboard 操作界面 "),s("a",{attrs:{href:"/install/install-dashboard"}},[t._v("安装并进入 Kuboard")])])]),t._v(" "),s("p",[t._v("假设您已经进入了 Kuboard 界面,如下图所示:")]),t._v(" "),s("p",[s("img",{attrs:{src:e(227),alt:"image-20190723105606081"}})]),t._v(" "),s("h3",{attrs:{id:"准备"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#准备","aria-hidden":"true"}},[t._v("#")]),t._v(" 准备")]),t._v(" "),s("ul",[s("li",[t._v("点击 "),s("em",[s("strong",[t._v("创建")])]),t._v(" 按钮,创建名称空间")])]),t._v(" "),s("p",[t._v("并填写:")]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",[t._v("字段名称")]),t._v(" "),s("th",[t._v("填写内容")]),t._v(" "),s("th",[t._v("说明")])])]),t._v(" "),s("tbody",[s("tr",[s("td",[t._v("名称")]),t._v(" "),s("td",[t._v("example")]),t._v(" "),s("td",[t._v("Kubernetes 的 namespace 名称")])])])]),t._v(" "),s("p",[s("img",{attrs:{src:e(228),alt:"image-20190723105644937"}})]),t._v(" "),s("ul",[s("li",[t._v("点击 "),s("em",[s("strong",[t._v("保存")])])])]),t._v(" "),s("p",[s("img",{attrs:{src:e(229),alt:"image-20190723105722999"}})]),t._v(" "),s("ul",[s("li",[t._v("点击 "),s("em",[s("strong",[t._v("应用")])])])]),t._v(" "),s("p",[s("img",{attrs:{src:e(230),alt:"image-20190723105748435"}})]),t._v(" "),s("ul",[s("li",[s("p",[t._v("点击 "),s("em",[s("strong",[t._v("完成")])])]),t._v(" "),s("p",[t._v("此时可在名称空间列表中查看到刚刚创建好的名称空间 "),s("em",[t._v("example")])])])]),t._v(" "),s("p",[s("img",{attrs:{src:e(231),alt:"image-20190723105809872"}})]),t._v(" "),s("ul",[s("li",[s("p",[t._v("点击 "),s("em",[t._v("example")]),t._v(" 名称空间")]),t._v(" "),s("p",[t._v("点击 "),s("em",[t._v("example")]),t._v(" 名称空间后,可进入该名称空间的页面。刚刚初始化的名称空间的界面布局如下图所示:")])])]),t._v(" "),s("p",[s("img",{attrs:{src:e(232),alt:"image-20190723105830318"}})])])},[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[12],{224:function(t,a,e){t.exports=e.p+"assets/img/image-20190723105606081.bc471512.png"},225:function(t,a,e){t.exports=e.p+"assets/img/image-20190723105644937.968b1660.png"},226:function(t,a,e){t.exports=e.p+"assets/img/image-20190723105722999.5b6c9bae.png"},227:function(t,a,e){t.exports=e.p+"assets/img/image-20190723105748435.1cb3ad0d.png"},228:function(t,a,e){t.exports=e.p+"assets/img/image-20190723105809872.61add376.png"},229:function(t,a,e){t.exports=e.p+"assets/img/image-20190723105830318.43414c56.png"},363:function(t,a,e){"use strict";e.r(a);var s=e(0),r=Object(s.a)({},function(){var t=this,a=t.$createElement,s=t._self._c||a;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"名称空间管理"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#名称空间管理","aria-hidden":"true"}},[t._v("#")]),t._v(" 名称空间管理")]),t._v(" "),s("h2",{attrs:{id:"创建名称空间"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#创建名称空间","aria-hidden":"true"}},[t._v("#")]),t._v(" 创建名称空间")]),t._v(" "),s("h3",{attrs:{id:"前提"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#前提","aria-hidden":"true"}},[t._v("#")]),t._v(" 前提")]),t._v(" "),s("p",[t._v("必须具备如下条件:")]),t._v(" "),s("ul",[s("li",[t._v("Kubernetes 集群")]),t._v(" "),s("li",[t._v("已在集群中安装 Kuboard")]),t._v(" "),s("li",[t._v("已进入 Kuboard 操作界面 "),s("a",{attrs:{href:"/install/install-dashboard"}},[t._v("安装并进入 Kuboard")])])]),t._v(" "),s("p",[t._v("假设您已经进入了 Kuboard 界面,如下图所示:")]),t._v(" "),s("p",[s("img",{attrs:{src:e(224),alt:"image-20190723105606081"}})]),t._v(" "),s("h3",{attrs:{id:"准备"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#准备","aria-hidden":"true"}},[t._v("#")]),t._v(" 准备")]),t._v(" "),s("ul",[s("li",[t._v("点击 "),s("em",[s("strong",[t._v("创建")])]),t._v(" 按钮,创建名称空间")])]),t._v(" "),s("p",[t._v("并填写:")]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",[t._v("字段名称")]),t._v(" "),s("th",[t._v("填写内容")]),t._v(" "),s("th",[t._v("说明")])])]),t._v(" "),s("tbody",[s("tr",[s("td",[t._v("名称")]),t._v(" "),s("td",[t._v("example")]),t._v(" "),s("td",[t._v("Kubernetes 的 namespace 名称")])])])]),t._v(" "),s("p",[s("img",{attrs:{src:e(225),alt:"image-20190723105644937"}})]),t._v(" "),s("ul",[s("li",[t._v("点击 "),s("em",[s("strong",[t._v("保存")])])])]),t._v(" "),s("p",[s("img",{attrs:{src:e(226),alt:"image-20190723105722999"}})]),t._v(" "),s("ul",[s("li",[t._v("点击 "),s("em",[s("strong",[t._v("应用")])])])]),t._v(" "),s("p",[s("img",{attrs:{src:e(227),alt:"image-20190723105748435"}})]),t._v(" "),s("ul",[s("li",[s("p",[t._v("点击 "),s("em",[s("strong",[t._v("完成")])])]),t._v(" "),s("p",[t._v("此时可在名称空间列表中查看到刚刚创建好的名称空间 "),s("em",[t._v("example")])])])]),t._v(" "),s("p",[s("img",{attrs:{src:e(228),alt:"image-20190723105809872"}})]),t._v(" "),s("ul",[s("li",[s("p",[t._v("点击 "),s("em",[t._v("example")]),t._v(" 名称空间")]),t._v(" "),s("p",[t._v("点击 "),s("em",[t._v("example")]),t._v(" 名称空间后,可进入该名称空间的页面。刚刚初始化的名称空间的界面布局如下图所示:")])])]),t._v(" "),s("p",[s("img",{attrs:{src:e(229),alt:"image-20190723105830318"}})])])},[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/13.3120e0e4.js b/docs/assets/js/13.cb2c3aac.js similarity index 99% rename from docs/assets/js/13.3120e0e4.js rename to docs/assets/js/13.cb2c3aac.js index e9fce62..8831bcf 100644 --- a/docs/assets/js/13.3120e0e4.js +++ b/docs/assets/js/13.cb2c3aac.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[13],{295:function(a,t,s){a.exports=s.p+"assets/img/image-20190721085144545.25f25dda.png"},296:function(a,t,s){a.exports=s.p+"assets/img/image-20190721090118542.46c31055.png"},297:function(a,t,s){a.exports=s.p+"assets/img/image-20190721090753742.28d009f3.png"},298:function(a,t,s){a.exports=s.p+"assets/img/image-20190721090840925.a5231632.png"},299:function(a,t,s){a.exports=s.p+"assets/img/image-20190721090935511.80fb3864.png"},300:function(a,t,s){a.exports=s.p+"assets/img/image-20190721091005130.330e9f1d.png"},370:function(a,t,s){"use strict";s.r(t);var e=s(0),r=Object(e.a)({},function(){var a=this,t=a.$createElement,e=a._self._c||t;return e("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[e("h1",{attrs:{id:"多环境"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#多环境","aria-hidden":"true"}},[a._v("#")]),a._v(" 多环境")]),a._v(" "),e("p",[a._v("在实际开发项目的过程中,我们必然会碰到如下场景:")]),a._v(" "),e("ol",[e("li",[a._v("创建一个开发环境,并在其中完成应用部署")]),a._v(" "),e("li",[a._v("创建一个测试环境,再次完成应用部署")]),a._v(" "),e("li",[a._v("创建一个准上线环境,再次完成应用部署")]),a._v(" "),e("li",[a._v("创建一个生产环境,再次完成应用部署")])]),a._v(" "),e("p",[a._v("当我们的微服务系统较为复杂时,一个环境中可能需要部署许多(几十个甚至更多)的微服务部署单元,这个时候,重复在多套环境中执行部署任务就会变得容易出错。")]),a._v(" "),e("p",[a._v("Kuboard 针对这种场景,提供了导出配置、导入配置的功能,以便运维人员可以轻易的复制多套部署环境。")]),a._v(" "),e("h2",{attrs:{id:"导出配置"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#导出配置","aria-hidden":"true"}},[a._v("#")]),a._v(" 导出配置")]),a._v(" "),e("h3",{attrs:{id:"前提"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#前提","aria-hidden":"true"}},[a._v("#")]),a._v(" 前提")]),a._v(" "),e("p",[a._v("必须满足如下条件:")]),a._v(" "),e("ul",[e("li",[a._v("您已经通过 kuboard 的 "),e("a",{attrs:{href:"/guide/namespace/workload"}},[a._v("创建工作负载")]),a._v(" 功能完成了微服务的部署。")])]),a._v(" "),e("blockquote",[e("p",[a._v("部署微服务过程中,您还可能用到 kuboard 的配置编辑功能、Secrets 编辑功能 等。")])]),a._v(" "),e("p",[a._v("假设您已完成微服务部署,并已进入 namespace 界面,如下图所示:")]),a._v(" "),e("p",[e("img",{attrs:{src:s(295),alt:"image-20190721085144545"}})]),a._v(" "),e("h3",{attrs:{id:"操作步骤"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#操作步骤","aria-hidden":"true"}},[a._v("#")]),a._v(" 操作步骤")]),a._v(" "),e("ul",[e("li",[a._v("点击 "),e("em",[e("strong",[a._v("导出工作负载")])]),a._v(" "),e("ul",[e("li",[a._v("选择要导出的分层")]),a._v(" "),e("li",[a._v("点击 "),e("em",[e("strong",[a._v("刷新")])])]),a._v(" "),e("li",[a._v("选择要导出的工作负载")])])])]),a._v(" "),e("p",[e("img",{attrs:{src:s(296),alt:"image-20190721090118542"}})]),a._v(" "),e("ul",[e("li",[e("p",[a._v("点击 "),e("em",[e("strong",[a._v("下一步")])])]),a._v(" "),e("p",[a._v("选择要导出的配置(configMap)信息")])])]),a._v(" "),e("p",[e("img",{attrs:{src:s(297),alt:"image-20190721090753742"}})]),a._v(" "),e("ul",[e("li",[e("p",[a._v("点击 "),e("em",[e("strong",[a._v("下一步")])])]),a._v(" "),e("p",[a._v("选择要导出的 Secrets")])])]),a._v(" "),e("p",[e("img",{attrs:{src:s(298),alt:"image-20190721090840925"}})]),a._v(" "),e("ul",[e("li",[a._v("点击 "),e("em",[e("strong",[a._v("下一步")])])])]),a._v(" "),e("p",[e("img",{attrs:{src:s(299),alt:"image-20190721090935511"}})]),a._v(" "),e("ul",[e("li",[a._v("点击 "),e("em",[e("strong",[a._v("确定")])])])]),a._v(" "),e("p",[e("img",{attrs:{src:s(300),alt:"image-20190721091005130"}})]),a._v(" "),e("ul",[e("li",[e("p",[a._v("查看已导出文件")]),a._v(" "),e("p",[a._v("导出文件的命名格式为 kuboard_namespace_date_time.yaml,例如:")]),a._v(" "),e("p",[a._v("kuboard_example_2019_07_21_09_09_47.yaml")]),a._v(" "),e("p",[a._v("导出文件的内容如下所示:")]),a._v(" "),e("div",{staticClass:"language-yaml extra-class"},[e("pre",{pre:!0,attrs:{class:"language-yaml"}},[e("code",[e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("---")]),a._v("\n"),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("apiVersion")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" apps/v1\n"),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("kind")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" StatefulSet\n"),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("metadata")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("namespace")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" example\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("name")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" cloud"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("-")]),a._v("eureka\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("annotations")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("k8s.eip.work/workload")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" cloud"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("-")]),a._v("eureka\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("k8s.eip.work/displayName")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" 服务注册\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("k8s.eip.work/service")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" ClusterIP\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("k8s.eip.work/ingress")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[a._v("'true'")]),a._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("labels")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("k8s.eip.work/layer")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" cloud\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("k8s.eip.work/name")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" cloud"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("-")]),a._v("eureka\n"),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("spec")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("selector")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("matchLabels")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("k8s.eip.work/layer")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" cloud\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("k8s.eip.work/name")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" cloud"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("-")]),a._v("eureka\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("template")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("metadata")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("...")]),a._v("\n")])])])])]),a._v(" "),e("blockquote",[e("p",[a._v("该文件可以通过 kubectl apply -f 命令直接执行,但是建议使用 kuboard 进行导入,以便在导入时在线编辑在特定于新环境的配置信息。")])]),a._v(" "),e("h2",{attrs:{id:"导入配置"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#导入配置","aria-hidden":"true"}},[a._v("#")]),a._v(" 导入配置")]),a._v(" "),e("h3",{attrs:{id:"前提-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#前提-2","aria-hidden":"true"}},[a._v("#")]),a._v(" 前提")]),a._v(" "),e("p",[a._v("您已经通过 kuboard 导出了配置文件,或者从别处获取到 kuboard 导出的配置文件")]),a._v(" "),e("h3",{attrs:{id:"操作步骤-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#操作步骤-2","aria-hidden":"true"}},[a._v("#")]),a._v(" 操作步骤")]),a._v(" "),e("p",[a._v("请参考 "),e("a",{attrs:{href:"/guide/example/import"}},[a._v("导入 example 微服务")])])])},[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[13],{295:function(a,t,s){a.exports=s.p+"assets/img/image-20190721085144545.25f25dda.png"},296:function(a,t,s){a.exports=s.p+"assets/img/image-20190721090118542.46c31055.png"},297:function(a,t,s){a.exports=s.p+"assets/img/image-20190721090753742.28d009f3.png"},298:function(a,t,s){a.exports=s.p+"assets/img/image-20190721090840925.a5231632.png"},299:function(a,t,s){a.exports=s.p+"assets/img/image-20190721090935511.80fb3864.png"},300:function(a,t,s){a.exports=s.p+"assets/img/image-20190721091005130.330e9f1d.png"},369:function(a,t,s){"use strict";s.r(t);var e=s(0),r=Object(e.a)({},function(){var a=this,t=a.$createElement,e=a._self._c||t;return e("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[e("h1",{attrs:{id:"多环境"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#多环境","aria-hidden":"true"}},[a._v("#")]),a._v(" 多环境")]),a._v(" "),e("p",[a._v("在实际开发项目的过程中,我们必然会碰到如下场景:")]),a._v(" "),e("ol",[e("li",[a._v("创建一个开发环境,并在其中完成应用部署")]),a._v(" "),e("li",[a._v("创建一个测试环境,再次完成应用部署")]),a._v(" "),e("li",[a._v("创建一个准上线环境,再次完成应用部署")]),a._v(" "),e("li",[a._v("创建一个生产环境,再次完成应用部署")])]),a._v(" "),e("p",[a._v("当我们的微服务系统较为复杂时,一个环境中可能需要部署许多(几十个甚至更多)的微服务部署单元,这个时候,重复在多套环境中执行部署任务就会变得容易出错。")]),a._v(" "),e("p",[a._v("Kuboard 针对这种场景,提供了导出配置、导入配置的功能,以便运维人员可以轻易的复制多套部署环境。")]),a._v(" "),e("h2",{attrs:{id:"导出配置"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#导出配置","aria-hidden":"true"}},[a._v("#")]),a._v(" 导出配置")]),a._v(" "),e("h3",{attrs:{id:"前提"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#前提","aria-hidden":"true"}},[a._v("#")]),a._v(" 前提")]),a._v(" "),e("p",[a._v("必须满足如下条件:")]),a._v(" "),e("ul",[e("li",[a._v("您已经通过 kuboard 的 "),e("a",{attrs:{href:"/guide/namespace/workload"}},[a._v("创建工作负载")]),a._v(" 功能完成了微服务的部署。")])]),a._v(" "),e("blockquote",[e("p",[a._v("部署微服务过程中,您还可能用到 kuboard 的配置编辑功能、Secrets 编辑功能 等。")])]),a._v(" "),e("p",[a._v("假设您已完成微服务部署,并已进入 namespace 界面,如下图所示:")]),a._v(" "),e("p",[e("img",{attrs:{src:s(295),alt:"image-20190721085144545"}})]),a._v(" "),e("h3",{attrs:{id:"操作步骤"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#操作步骤","aria-hidden":"true"}},[a._v("#")]),a._v(" 操作步骤")]),a._v(" "),e("ul",[e("li",[a._v("点击 "),e("em",[e("strong",[a._v("导出工作负载")])]),a._v(" "),e("ul",[e("li",[a._v("选择要导出的分层")]),a._v(" "),e("li",[a._v("点击 "),e("em",[e("strong",[a._v("刷新")])])]),a._v(" "),e("li",[a._v("选择要导出的工作负载")])])])]),a._v(" "),e("p",[e("img",{attrs:{src:s(296),alt:"image-20190721090118542"}})]),a._v(" "),e("ul",[e("li",[e("p",[a._v("点击 "),e("em",[e("strong",[a._v("下一步")])])]),a._v(" "),e("p",[a._v("选择要导出的配置(configMap)信息")])])]),a._v(" "),e("p",[e("img",{attrs:{src:s(297),alt:"image-20190721090753742"}})]),a._v(" "),e("ul",[e("li",[e("p",[a._v("点击 "),e("em",[e("strong",[a._v("下一步")])])]),a._v(" "),e("p",[a._v("选择要导出的 Secrets")])])]),a._v(" "),e("p",[e("img",{attrs:{src:s(298),alt:"image-20190721090840925"}})]),a._v(" "),e("ul",[e("li",[a._v("点击 "),e("em",[e("strong",[a._v("下一步")])])])]),a._v(" "),e("p",[e("img",{attrs:{src:s(299),alt:"image-20190721090935511"}})]),a._v(" "),e("ul",[e("li",[a._v("点击 "),e("em",[e("strong",[a._v("确定")])])])]),a._v(" "),e("p",[e("img",{attrs:{src:s(300),alt:"image-20190721091005130"}})]),a._v(" "),e("ul",[e("li",[e("p",[a._v("查看已导出文件")]),a._v(" "),e("p",[a._v("导出文件的命名格式为 kuboard_namespace_date_time.yaml,例如:")]),a._v(" "),e("p",[a._v("kuboard_example_2019_07_21_09_09_47.yaml")]),a._v(" "),e("p",[a._v("导出文件的内容如下所示:")]),a._v(" "),e("div",{staticClass:"language-yaml extra-class"},[e("pre",{pre:!0,attrs:{class:"language-yaml"}},[e("code",[e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("---")]),a._v("\n"),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("apiVersion")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" apps/v1\n"),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("kind")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" StatefulSet\n"),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("metadata")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("namespace")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" example\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("name")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" cloud"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("-")]),a._v("eureka\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("annotations")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("k8s.eip.work/workload")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" cloud"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("-")]),a._v("eureka\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("k8s.eip.work/displayName")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" 服务注册\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("k8s.eip.work/service")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" ClusterIP\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("k8s.eip.work/ingress")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[a._v("'true'")]),a._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("labels")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("k8s.eip.work/layer")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" cloud\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("k8s.eip.work/name")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" cloud"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("-")]),a._v("eureka\n"),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("spec")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("selector")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("matchLabels")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("k8s.eip.work/layer")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" cloud\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("k8s.eip.work/name")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" cloud"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("-")]),a._v("eureka\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("template")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("metadata")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("...")]),a._v("\n")])])])])]),a._v(" "),e("blockquote",[e("p",[a._v("该文件可以通过 kubectl apply -f 命令直接执行,但是建议使用 kuboard 进行导入,以便在导入时在线编辑在特定于新环境的配置信息。")])]),a._v(" "),e("h2",{attrs:{id:"导入配置"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#导入配置","aria-hidden":"true"}},[a._v("#")]),a._v(" 导入配置")]),a._v(" "),e("h3",{attrs:{id:"前提-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#前提-2","aria-hidden":"true"}},[a._v("#")]),a._v(" 前提")]),a._v(" "),e("p",[a._v("您已经通过 kuboard 导出了配置文件,或者从别处获取到 kuboard 导出的配置文件")]),a._v(" "),e("h3",{attrs:{id:"操作步骤-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#操作步骤-2","aria-hidden":"true"}},[a._v("#")]),a._v(" 操作步骤")]),a._v(" "),e("p",[a._v("请参考 "),e("a",{attrs:{href:"/guide/example/import"}},[a._v("导入 example 微服务")])])])},[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/17.009e5fb4.js b/docs/assets/js/17.009e5fb4.js new file mode 100644 index 0000000..2e7d291 --- /dev/null +++ b/docs/assets/js/17.009e5fb4.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[17],{112:function(a,s,e){a.exports=e.p+"assets/img/image-20190715085036593.ab4a32ff.png"},113:function(a,s,e){a.exports=e.p+"assets/img/image2019-07-15_09.01.21.1ac5bd70.png"},334:function(a,s,e){a.exports=e.p+"assets/img/image-20190726144001775.edc163c8.png"},335:function(a,s,e){a.exports=e.p+"assets/img/image-20190715101542756.5934c00e.png"},336:function(a,s,e){a.exports=e.p+"assets/img/image-20190715193838012.eca23618.png"},354:function(a,s,e){"use strict";e.r(s);var t=e(0),r=Object(t.a)({},function(){var a=this,s=a.$createElement,t=a._self._c||s;return t("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[t("h1",{attrs:{id:"安装-kubernetes-单master节点"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#安装-kubernetes-单master节点","aria-hidden":"true"}},[a._v("#")]),a._v(" 安装 Kubernetes 单Master节点")]),a._v(" "),t("p",[a._v("如果您想拥有一个供个人学习测试使用的 kubernetes 集群,推荐的做法是在阿里云采购如下配置:")]),a._v(" "),t("ul",[t("li",[a._v("3台 2核4G 的ECS(突发性能实例 t5 ecs.t5-c1m2.large,或同等配置)")]),a._v(" "),t("li",[a._v("Cent OS 7.6")])]),a._v(" "),t("p",[a._v("Kuboard 的 Live Demo 环境使用的是如下拓扑结构,本文档描述了如何在完成该 demo 环境的搭建。(在阿里云上,拥有一个3节点 Kubernetes 集群,每天的成本不超过12元,且,停机状态下不收费,非常适合于技术爱好者学习时使用。)")]),a._v(" "),t("p",[t("a",{attrs:{href:"https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=obezo3pg",target:"_blank",rel:"noopener noreferrer"}},[a._v("领取阿里云最高2000元红包"),t("OutboundLink")],1)]),a._v(" "),t("p",[t("a",{attrs:{href:"http://demo.eip.work/#/login?isReadOnly=true&token=eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJrdWJvYXJkLXZpZXdlci10b2tlbi02djZiZiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJrdWJvYXJkLXZpZXdlciIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjhiYTU3YmI1LWFiMTctNDM1NS1hNTM0LTQ0Njk4NGY0NzFlZiIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTprdWJvYXJkLXZpZXdlciJ9.DcXNIp0RKha1zkV4ga_QlGfcvMLGx2LOyzX-0VeboC3FojKFhxnfBeoda-zTeh6ugJlSM4kQYrRcof1Kx8Mg3-UgofNmgRySbDEVKtJZyMUoHqLmySKUIn8sbX8q83RNcqwcvY-fM8-w8HSuzU7Td7WWNuZrlCL4q_LQDYIBet1nlQ83YsENKNE8rsZQFDw8YM0MH6BEZLdwyhaboy_jjYbsU7kv8gks3aIX4lh1Fs9ZFQpC_6B0_MZvb7rEeG2M8QWXoUkDoL5JCKu6Wot5GlWf0kDMxIsViggP0NmSDTKh6kIvCkT2FZ2I4guEcjE_EjBpdOS6Abta22tzLlPKhg",target:"_blank",rel:"noopener noreferrer"}},[a._v("Kuboard Live Demo"),t("OutboundLink")],1),a._v("\n为保证环境的稳定性,Live Demo 中只提供只读权限。"),t("span",{staticStyle:{color:"#F56C6C","font-weight":"500"}},[a._v("(请在PC浏览器中打开)")])]),a._v(" "),t("p",[t("img",{attrs:{src:e(334),alt:"image-20190726144001775"}})]),a._v(" "),t("h2",{attrs:{id:"制作标准机镜像"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#制作标准机镜像","aria-hidden":"true"}},[a._v("#")]),a._v(" 制作标准机镜像")]),a._v(" "),t("p",[a._v("通过使用标准机镜像,可以")]),a._v(" "),t("ul",[t("li",[t("strong",[a._v("避免重复执行对测试机安装必要软件的过程")])]),a._v(" "),t("li",[t("strong",[a._v("以一种相对标准化的过程管理测试机的维护")])])]),a._v(" "),t("p",[a._v("标准机镜像中预装了如下内容:")]),a._v(" "),t("ul",[t("li",[a._v("docker")]),a._v(" "),t("li",[a._v("gitlab-runner")]),a._v(" "),t("li",[a._v("kubernetes images")])]),a._v(" "),t("div",{staticClass:"tip custom-block"},[t("ul",[t("li",[a._v("您也可以不制作标准机镜像,而是在三台机器上都执行 "),t("em",[t("strong",[a._v("制作标准机镜像")])]),a._v(" 中的所有操作步骤")])])]),a._v(" "),t("p",[t("strong",[a._v("标准机镜像的制作过程描述如下:")])]),a._v(" "),t("h3",{attrs:{id:"安装docker"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#安装docker","aria-hidden":"true"}},[a._v("#")]),a._v(" 安装docker")]),a._v(" "),t("p",[t("strong",[a._v("卸载旧版本")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" yum remove docker "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n\tdocker-client "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n\tdocker-client-latest "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n\tdocker-common "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n\tdocker-latest "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n\tdocker-latest-logrotate "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n\tdocker-logrotate "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n\tdocker-selinux "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n\tdocker-engine-selinux "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n\tdocker-engine\n")])])]),t("p",[t("strong",[a._v("下载依赖包及安装包")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("wget")]),a._v(" https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm\n\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("wget")]),a._v(" https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-cli-18.09.7-3.el7.x86_64.rpm\n\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("wget")]),a._v(" https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-18.09.7-3.el7.x86_64.rpm\n")])])]),t("p",[t("strong",[a._v("安装")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" yum "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("install")]),a._v(" -y containerd.io-1.2.6-3.3.el7.x86_64.rpm\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" yum "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("install")]),a._v(" -y docker-ce-cli-18.09.7-3.el7.x86_64.rpm\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" yum "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("install")]),a._v(" -y docker-ce-18.09.7-3.el7.x86_64.rpm\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" systemctl "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("enable")]),a._v(" docker\n")])])]),t("p",[t("strong",[a._v("启动 docker 服务")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" systemctl start docker\n")])])]),t("p",[t("strong",[a._v("检查 docker 版本")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("docker version\n")])])]),t("blockquote",[t("p",[t("strong",[a._v("参考文档")])]),a._v(" "),t("p",[a._v("https://docs.docker.com/install/linux/docker-ce/centos/")]),a._v(" "),t("p",[a._v("https://docs.docker.com/install/linux/linux-postinstall/")])]),a._v(" "),t("h3",{attrs:{id:"安装-nfs-utils"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#安装-nfs-utils","aria-hidden":"true"}},[a._v("#")]),a._v(" 安装 nfs-utils")]),a._v(" "),t("p",[t("strong",[a._v("执行安装命令")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" yum "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("install")]),a._v(" nfs-utils\n")])])]),t("p",[a._v("必须先安装 nfs-utils 才能挂载 nfs 网络存储")]),a._v(" "),t("h3",{attrs:{id:"k8s基本配置"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#k8s基本配置","aria-hidden":"true"}},[a._v("#")]),a._v(" K8S基本配置")]),a._v(" "),t("p",[t("strong",[a._v("配置K8S的yum源")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("cat")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("<<")]),a._v("EOF "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v(">")]),a._v(" /etc/yum.repos.d/kubernetes.repo\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),a._v("kubernetes"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("name")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("Kubernetes\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("baseurl")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("enabled")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("1")]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("gpgcheck")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("0")]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("repo_gpgcheck")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("0")]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("gpgkey")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg\n http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg\nEOF\n")])])]),t("p",[t("strong",[a._v("关闭swap、防火墙")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("swapoff -a\n")])])]),t("p",[t("strong",[a._v("关闭SeLinux")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("setenforce "),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("0")]),a._v("\n")])])]),t("p",[t("strong",[a._v("修改 /etc/sysctl.conf")])]),a._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[a._v("vim /etc/sysctl.conf\n")])])]),t("p",[a._v("向其中添加")]),a._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[a._v("net.ipv4.ip_forward = 1\nnet.bridge.bridge-nf-call-ip6tables = 1\nnet.bridge.bridge-nf-call-iptables = 1\n")])])]),t("p",[a._v("如下图所示")]),a._v(" "),t("p",[t("img",{attrs:{src:e(112),alt:"image-20190715085036593",title:":size=600x445"}})]),a._v(" "),t("p",[t("strong",[a._v("安装kubelet、kubeadm、kubectl")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("yum "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("install")]),a._v(" -y kubelet-1.15.0 kubeadm-1.15.0 kubectl-1.15.0\n")])])]),t("p",[t("strong",[a._v("修改docker Cgroup Driver为systemd")])]),a._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[a._v("vim /usr/lib/systemd/system/docker.service\n")])])]),t("p",[a._v("向其中他添加")]),a._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[a._v("--exec-opt native.cgroupdriver=systemd\n")])])]),t("p",[a._v("如下图所示")]),a._v(" "),t("p",[t("img",{attrs:{src:e(113),alt:"屏幕快照 2019-07-15 09.01.21",title:":size=1000x326"}})]),a._v(" "),t("p",[a._v("重启 docker")]),a._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[a._v("systemctl daemon-reload\nsystemctl restart docker\n")])])]),t("p",[t("strong",[a._v("启动kubelet")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("systemctl "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("enable")]),a._v(" kubelet "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("&&")]),a._v(" systemctl start kubelet\n")])])]),t("p",[t("strong",[a._v("加载 kubernetes 镜像")])]),a._v(" "),t("p",[a._v("由于k8s服务相关镜像在国外镜像源,国内无法访问")]),a._v(" "),t("p",[a._v("执行以下命令添加docker k8s国内镜像源")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("curl")]),a._v(" -sSL https://get.daocloud.io/daotools/set_mirror.sh "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sh")]),a._v(" -s http://f1361db2.m.daocloud.io\n\nsystemctl restart docker\n")])])]),t("p",[t("strong",[a._v("拉取k8s相关镜像")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("docker pull mirrorgooglecontainers/kube-apiserver:v1.15.0\ndocker pull mirrorgooglecontainers/kube-controller-manager:v1.15.0\ndocker pull mirrorgooglecontainers/kube-scheduler:v1.15.0\ndocker pull mirrorgooglecontainers/kube-proxy:v1.15.0\ndocker pull mirrorgooglecontainers/pause:3.1\ndocker pull mirrorgooglecontainers/etcd:3.3.10\ndocker pull coredns/coredns:1.3.1\n")])])]),t("p",[t("strong",[a._v("更改镜像名为k8s官网镜像")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("docker tag d235b23c3570 k8s.gcr.io/kube-proxy:v1.15.0\ndocker tag 201c7a840312 k8s.gcr.io/kube-apiserver:v1.15.0\ndocker tag 2d3813851e87 k8s.gcr.io/kube-scheduler:v1.15.0\ndocker tag 8328bb49b652 k8s.gcr.io/kube-controller-manager:v1.15.0\ndocker tag da86e6ba6ca1 k8s.gcr.io/pause:3.1\ndocker tag eb516548c180 k8s.gcr.io/coredns:1.3.1\ndocker tag 2c4adeb21b4f k8s.gcr.io/etcd:3.3.10\n")])])]),t("p",[t("strong",[a._v("制作镜像")])]),a._v(" "),t("p",[a._v("请参考阿里云基于ECS "),t("a",{attrs:{href:"https://help.aliyun.com/document_detail/35109.html?spm=5176.2020520101.0.0.75fc4df5mtdFmV",target:"_blank",rel:"noopener noreferrer"}},[a._v("制作虚拟机镜像"),t("OutboundLink")],1),a._v(" 的文档")]),a._v(" "),t("h2",{attrs:{id:"初始化-master-节点"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#初始化-master-节点","aria-hidden":"true"}},[a._v("#")]),a._v(" 初始化 master 节点")]),a._v(" "),t("h3",{attrs:{id:"在-demo-master-a-1-机器上执行"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#在-demo-master-a-1-机器上执行","aria-hidden":"true"}},[a._v("#")]),a._v(" 在 demo-master-a-1 机器上执行")]),a._v(" "),t("p",[a._v("以下命令以 root 身份执行")]),a._v(" "),t("p",[t("strong",[a._v("配置 apiserver.demo 的域名")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("echo")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"x.x.x.x apiserver.demo"')]),a._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v(">>")]),a._v(" /etc/hosts\n")])])]),t("div",{staticClass:"warning custom-block"},[t("p",[a._v("请替换其中的 x.x.x.x 为您的 demo-master-a-1 的实际 ip 地址")])]),a._v(" "),t("p",[t("strong",[a._v("创建 /root/k8s/kubeadm-config.yaml")])]),a._v(" "),t("div",{staticClass:"language-yaml extra-class"},[t("pre",{pre:!0,attrs:{class:"language-yaml"}},[t("code",[t("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("apiVersion")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" kubeadm.k8s.io/v1beta1\n"),t("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("kind")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" ClusterConfiguration\n"),t("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("kubernetesVersion")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" v1.15.0\n"),t("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("controlPlaneEndpoint")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"apiserver.demo:6443"')]),a._v("\n\n")])])]),t("p",[t("strong",[a._v("初始化 apiserver")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("kubeadm init --config"),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("kubeadm-config.yaml --upload-certs\n")])])]),t("p",[a._v("执行结果如下图所示:")]),a._v(" "),t("p",[t("img",{attrs:{src:e(335),alt:"image-20190715101542756",title:":size=800x388"}})]),a._v(" "),t("p",[t("strong",[a._v("初始化 root 用户的 kubectl 配置")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("rm")]),a._v(" -rf /root/.kube/\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("mkdir")]),a._v(" /root/.kube/\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("cp")]),a._v(" -i /etc/kubernetes/admin.conf /root/.kube/config\n")])])]),t("p",[t("strong",[a._v("安装 calico")])]),a._v(" "),t("p",[a._v("(需要在安全组–ServerFarm需要为集群服务器器端口6443建立安全组规则)")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("kubectl apply -f "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\nhttps://docs.projectcalico.org/v3.6/getting-started/kubernetes/installation/hosted/kubernetes-datastore/calico-networking/1.7/calico.yaml\n")])])]),t("blockquote",[t("p",[a._v("安装calico, 请参考https://docs.projectcalico.org/v3.6/getting-started/kubernetes/")])]),a._v(" "),t("p",[t("strong",[a._v("等待calico安装就绪:")])]),a._v(" "),t("p",[a._v("执行如下命令,等待3-10分钟,直到所有的容器组处于 Running 状态")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("watch")]),a._v(" kubectl get pod -n kube-system\n")])])]),t("h3",{attrs:{id:"检查-apiserver初始化结果"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#检查-apiserver初始化结果","aria-hidden":"true"}},[a._v("#")]),a._v(" 检查 apiserver初始化结果")]),a._v(" "),t("p",[a._v("在第一个master节点 demo-master-a-1 上执行")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("kubectl get nodes\n")])])]),t("h2",{attrs:{id:"初始化-worker节点"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#初始化-worker节点","aria-hidden":"true"}},[a._v("#")]),a._v(" 初始化 worker节点")]),a._v(" "),t("h3",{attrs:{id:"获得-join命令参数"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#获得-join命令参数","aria-hidden":"true"}},[a._v("#")]),a._v(" 获得 join命令参数")]),a._v(" "),t("p",[t("strong",[a._v("在 master 节点 demo-master-a-1 节点执行")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("kubeadm token create --print-join-command\n")])])]),t("p",[a._v("可获取kubeadm join 命令及参数,如下所示")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("kubeadm "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("join")]),a._v(" apiserver.demo:6443 --token mpfjma.4vjjg8flqihor4vt --discovery-token-ca-cert-hash sha256:6f7a8e40a810323672de5eee6f4d19aa2dbdb38411845a1bf5dd63485c43d303\n")])])]),t("h3",{attrs:{id:"初始化worker"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#初始化worker","aria-hidden":"true"}},[a._v("#")]),a._v(" 初始化worker")]),a._v(" "),t("p",[t("strong",[a._v("针对所有的 worker 节点执行")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("echo")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"x.x.x.x apiserver.demo"')]),a._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v(">>")]),a._v(" /etc/hosts\nkubeadm "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("join")]),a._v(" apiserver.demo:6443 --token mpfjma.4vjjg8flqihor4vt --discovery-token-ca-cert-hash sha256:6f7a8e40a810323672de5eee6f4d19aa2dbdb38411845a1bf5dd63485c43d303\n")])])]),t("div",{staticClass:"tip custom-block"},[t("ul",[t("li",[a._v("将 x.x.x.x 替换为 demo-master-a-1 的实际 ip")]),a._v(" "),t("li",[a._v("将 kubeadm join 命令后的参数替换为上一个步骤中实际从 demo-master-a-1 节点获得的参数")])])]),a._v(" "),t("h3",{attrs:{id:"检查-apiserver初始化结果-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#检查-apiserver初始化结果-2","aria-hidden":"true"}},[a._v("#")]),a._v(" 检查 apiserver初始化结果")]),a._v(" "),t("p",[a._v("在第一个master节点 demo-master-a-1 上执行")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("kubectl get nodes\n")])])]),t("p",[t("img",{attrs:{src:e(336),alt:"image-20190715193838012"}})]),a._v(" "),t("h2",{attrs:{id:"移除-worker-节点"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#移除-worker-节点","aria-hidden":"true"}},[a._v("#")]),a._v(" 移除 worker 节点")]),a._v(" "),t("div",{staticClass:"warning custom-block"},[t("p",[a._v("正常情况下,您无需移除 worker 节点")])]),a._v(" "),t("p",[a._v("在准备移除的 worker 节点上执行")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("kubeadm reset\n")])])]),t("p",[a._v("在第一个 master 节点 demo-master-a-1 上执行")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("kubectl delete node demo-worker-x-x\n")])])]),t("div",{staticClass:"tip custom-block"},[t("ul",[t("li",[a._v("将 demo-worker-x-x 替换为要移除的 worker 节点的名字")]),a._v(" "),t("li",[a._v("worker 节点的名字可以通过在节点 demo-master-a-1 上执行 kubectl get nodes 命令获得")])])]),a._v(" "),t("h2",{attrs:{id:"安装-ingress-controller"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#安装-ingress-controller","aria-hidden":"true"}},[a._v("#")]),a._v(" 安装 Ingress Controller")]),a._v(" "),t("blockquote",[t("p",[a._v("Ingress官方文档:https://kubernetes.io/docs/concepts/services-networking/ingress/")]),a._v(" "),t("p",[a._v("Ingress Controllers官网介绍:https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/")]),a._v(" "),t("p",[a._v("本文中使用如下部署方式:https://kubernetes.github.io/ingress-nginx/deploy/baremetal/#using-a-self-provisioned-edge")]),a._v(" "),t("p",[a._v("kubernetes支持多种Ingress Controllers,本文推荐使用 https://github.com/nginxinc/kubernetes-ingress")])]),a._v(" "),t("h3",{attrs:{id:"在-demo-master-a-1-上执行"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#在-demo-master-a-1-上执行","aria-hidden":"true"}},[a._v("#")]),a._v(" 在 demo-master-a-1 上执行")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("kubectl apply -f https://raw.githubusercontent.com/eip-work/eip-monitor-repository/master/dashboard/nginx-ingress.yaml\n")])])]),t("h3",{attrs:{id:"配置域名解析"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#配置域名解析","aria-hidden":"true"}},[a._v("#")]),a._v(" 配置域名解析")]),a._v(" "),t("p",[a._v("将域名 *.demo.yourdomain.com 解析到地址负载均衡服务器 的 IP 地址 z.z.z.z")]),a._v(" "),t("h3",{attrs:{id:"验证配置"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#验证配置","aria-hidden":"true"}},[a._v("#")]),a._v(" 验证配置")]),a._v(" "),t("p",[a._v("在浏览器访问 a.demo.yourdomain.com,将得到 404 NotFound 错误页面")]),a._v(" "),t("h2",{attrs:{id:"下一步"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#下一步","aria-hidden":"true"}},[a._v("#")]),a._v(" 下一步")]),a._v(" "),t("p",[a._v("🎉 🎉")]),a._v(" "),t("p",[a._v("您已经完成了 Kubernetes 集群的安装,下一步请:")]),a._v(" "),t("p",[t("a",{attrs:{href:"/install/install-dashboard"}},[a._v("安装 Kuboard")])])])},[],!1,null,null,null);s.default=r.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/17.681350a4.js b/docs/assets/js/17.681350a4.js deleted file mode 100644 index dfb0651..0000000 --- a/docs/assets/js/17.681350a4.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[17],{112:function(a,s,e){a.exports=e.p+"assets/img/image-20190715085036593.ab4a32ff.png"},113:function(a,s,e){a.exports=e.p+"assets/img/image2019-07-15_09.01.21.1ac5bd70.png"},319:function(a,s,e){a.exports=e.p+"assets/img/image-20190718175957160.f5abe01a.png"},320:function(a,s,e){a.exports=e.p+"assets/img/image-20190715101542756.5934c00e.png"},321:function(a,s,e){a.exports=e.p+"assets/img/image-20190715193838012.eca23618.png"},359:function(a,s,e){"use strict";e.r(s);var t=e(0),r=Object(t.a)({},function(){var a=this,s=a.$createElement,t=a._self._c||s;return t("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[t("h1",{attrs:{id:"安装-kubernetes-用于测试"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#安装-kubernetes-用于测试","aria-hidden":"true"}},[a._v("#")]),a._v(" 安装 Kubernetes 用于测试")]),a._v(" "),t("p",[a._v("如果您想拥有一个供个人学习测试使用的 kubernetes 集群,推荐的做法是在阿里云采购如下配置:")]),a._v(" "),t("ul",[t("li",[a._v("3台 2核4G 的ECS(突发性能实例 t5 ecs.t5-c1m2.large,或同等配置)")]),a._v(" "),t("li",[a._v("100G EFS")])]),a._v(" "),t("p",[a._v("Kuboard 的在线 demo 环境使用的是如下拓扑结构,本文档描述了如何在阿里云完成该 demo 环境的搭建。(推荐阿里云是因为,阿里云是当下技术爱好者最容易接触到的云环境,拥有一个3节点 Kubernetes 集群,每天的成本不超过12元,且,停机状态下不收费,非常适合于技术爱好者学习时使用。)")]),a._v(" "),t("p",[t("a",{attrs:{href:"https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=obezo3pg",target:"_blank",rel:"noopener noreferrer"}},[a._v("领取阿里云最高2000元红包"),t("OutboundLink")],1)]),a._v(" "),t("p",[t("a",{attrs:{href:"http://demo.eip.work/#/login?isReadOnly=true&token=eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJrdWJvYXJkLXZpZXdlci10b2tlbi02djZiZiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJrdWJvYXJkLXZpZXdlciIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjhiYTU3YmI1LWFiMTctNDM1NS1hNTM0LTQ0Njk4NGY0NzFlZiIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTprdWJvYXJkLXZpZXdlciJ9.DcXNIp0RKha1zkV4ga_QlGfcvMLGx2LOyzX-0VeboC3FojKFhxnfBeoda-zTeh6ugJlSM4kQYrRcof1Kx8Mg3-UgofNmgRySbDEVKtJZyMUoHqLmySKUIn8sbX8q83RNcqwcvY-fM8-w8HSuzU7Td7WWNuZrlCL4q_LQDYIBet1nlQ83YsENKNE8rsZQFDw8YM0MH6BEZLdwyhaboy_jjYbsU7kv8gks3aIX4lh1Fs9ZFQpC_6B0_MZvb7rEeG2M8QWXoUkDoL5JCKu6Wot5GlWf0kDMxIsViggP0NmSDTKh6kIvCkT2FZ2I4guEcjE_EjBpdOS6Abta22tzLlPKhg",target:"_blank",rel:"noopener noreferrer"}},[a._v("Kuboard 在线体验"),t("OutboundLink")],1),a._v("\n为保证环境的稳定性,在线 Demo 中只提供只读权限。"),t("span",{staticStyle:{color:"#F56C6C","font-weight":"500"}},[a._v("(请在PC浏览器中打开)")])]),a._v(" "),t("p",[t("img",{attrs:{src:e(319),alt:"image-20190718175957160"}})]),a._v(" "),t("h2",{attrs:{id:"制作标准机镜像"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#制作标准机镜像","aria-hidden":"true"}},[a._v("#")]),a._v(" 制作标准机镜像")]),a._v(" "),t("p",[a._v("通过使用标准机镜像,可以")]),a._v(" "),t("ul",[t("li",[t("strong",[a._v("避免重复执行对测试机安装必要软件的过程")])]),a._v(" "),t("li",[t("strong",[a._v("以一种相对标准化的过程管理测试机的维护")])])]),a._v(" "),t("p",[a._v("标准机镜像中预装了如下内容:")]),a._v(" "),t("ul",[t("li",[a._v("docker")]),a._v(" "),t("li",[a._v("gitlab-runner")]),a._v(" "),t("li",[a._v("kubernetes images")])]),a._v(" "),t("p",[a._v("本文档描述的安装过程已基于 centos 7.6 验证")]),a._v(" "),t("p",[a._v("标准机镜像的制作过程描述如下:")]),a._v(" "),t("h3",{attrs:{id:"安装docker"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#安装docker","aria-hidden":"true"}},[a._v("#")]),a._v(" 安装docker")]),a._v(" "),t("p",[t("strong",[a._v("卸载旧版本")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" yum remove docker "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n\tdocker-client "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n\tdocker-client-latest "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n\tdocker-common "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n\tdocker-latest "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n\tdocker-latest-logrotate "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n\tdocker-logrotate "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n\tdocker-selinux "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n\tdocker-engine-selinux "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n\tdocker-engine\n")])])]),t("p",[t("strong",[a._v("下载依赖包及安装包")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("wget")]),a._v(" https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm\n\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("wget")]),a._v(" https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-cli-18.09.7-3.el7.x86_64.rpm\n\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("wget")]),a._v(" https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-18.09.7-3.el7.x86_64.rpm\n")])])]),t("p",[t("strong",[a._v("安装")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" yum "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("install")]),a._v(" -y containerd.io-1.2.6-3.3.el7.x86_64.rpm\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" yum "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("install")]),a._v(" -y docker-ce-cli-18.09.7-3.el7.x86_64.rpm\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" yum "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("install")]),a._v(" -y docker-ce-18.09.7-3.el7.x86_64.rpm\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" systemctl "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("enable")]),a._v(" docker\n")])])]),t("p",[t("strong",[a._v("启动 docker 服务")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" systemctl start docker\n")])])]),t("p",[t("strong",[a._v("检查 docker 版本")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("docker version\n")])])]),t("p",[t("strong",[a._v("参考文档")])]),a._v(" "),t("p",[a._v("https://docs.docker.com/install/linux/docker-ce/centos/")]),a._v(" "),t("p",[a._v("https://docs.docker.com/install/linux/linux-postinstall/")]),a._v(" "),t("h3",{attrs:{id:"安装-nfs-utils"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#安装-nfs-utils","aria-hidden":"true"}},[a._v("#")]),a._v(" 安装 nfs-utils")]),a._v(" "),t("p",[t("strong",[a._v("执行安装命令")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" yum "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("install")]),a._v(" nfs-utils\n")])])]),t("p",[a._v("必须先安装 nfs-utils 才能挂载 nfs 网络存储")]),a._v(" "),t("h3",{attrs:{id:"k8s基本配置"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#k8s基本配置","aria-hidden":"true"}},[a._v("#")]),a._v(" K8S基本配置")]),a._v(" "),t("p",[t("strong",[a._v("配置K8S的yum源")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("cat")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("<<")]),a._v("EOF "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v(">")]),a._v(" /etc/yum.repos.d/kubernetes.repo\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),a._v("kubernetes"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("name")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("Kubernetes\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("baseurl")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("enabled")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("1")]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("gpgcheck")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("0")]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("repo_gpgcheck")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("0")]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("gpgkey")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg\n http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg\nEOF\n")])])]),t("p",[t("strong",[a._v("关闭swap、防火墙")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("swapoff -a\n")])])]),t("p",[t("strong",[a._v("关闭SeLinux")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("setenforce "),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("0")]),a._v("\n")])])]),t("p",[t("strong",[a._v("修改 /etc/sysctl.conf")])]),a._v(" "),t("p",[t("code",[a._v("vim /etc/sysctl.conf")])]),a._v(" "),t("p",[a._v("向其中添加")]),a._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[a._v("net.ipv4.ip_forward = 1\nnet.bridge.bridge-nf-call-ip6tables = 1\nnet.bridge.bridge-nf-call-iptables = 1\n")])])]),t("p",[a._v("如下图所示")]),a._v(" "),t("p",[t("img",{attrs:{src:e(112),alt:"image-20190715085036593",title:":size=600x445"}})]),a._v(" "),t("p",[t("strong",[a._v("安装kubelet、kubeadm、kubectl")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("yum "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("install")]),a._v(" -y kubelet-1.15.0 kubeadm-1.15.0 kubectl-1.15.0\n")])])]),t("p",[t("strong",[a._v("修改docker Cgroup Driver为systemd")])]),a._v(" "),t("p",[t("code",[a._v("vim /usr/lib/systemd/system/docker.service")])]),a._v(" "),t("p",[a._v("向其中他添加")]),a._v(" "),t("p",[t("code",[a._v("--exec-opt native.cgroupdriver=systemd")])]),a._v(" "),t("p",[a._v("如下图所示")]),a._v(" "),t("p",[t("img",{attrs:{src:e(113),alt:"屏幕快照 2019-07-15 09.01.21",title:":size=1000x326"}})]),a._v(" "),t("p",[a._v("重启 docker")]),a._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[a._v("systemctl daemon-reload\nsystemctl restart docker\n")])])]),t("p",[t("strong",[a._v("启动kubelet")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("systemctl "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("enable")]),a._v(" kubelet "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("&&")]),a._v(" systemctl start kubelet\n")])])]),t("p",[t("strong",[a._v("加载 kubernetes 镜像")])]),a._v(" "),t("p",[a._v("由于k8s服务相关镜像在国外镜像源,国内无法访问")]),a._v(" "),t("p",[a._v("执行以下命令添加docker k8s国内镜像源")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("curl")]),a._v(" -sSL https://get.daocloud.io/daotools/set_mirror.sh "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sh")]),a._v(" -s http://f1361db2.m.daocloud.io\n\nsystemctl restart docker\n")])])]),t("p",[t("strong",[a._v("拉取k8s相关镜像")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("docker pull mirrorgooglecontainers/kube-apiserver:v1.15.0\ndocker pull mirrorgooglecontainers/kube-controller-manager:v1.15.0\ndocker pull mirrorgooglecontainers/kube-scheduler:v1.15.0\ndocker pull mirrorgooglecontainers/kube-proxy:v1.15.0\ndocker pull mirrorgooglecontainers/pause:3.1\ndocker pull mirrorgooglecontainers/etcd:3.3.10\ndocker pull coredns/coredns:1.3.1\n")])])]),t("p",[t("strong",[a._v("更改镜像名为k8s官网镜像")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("docker tag d235b23c3570 k8s.gcr.io/kube-proxy:v1.15.0\ndocker tag 201c7a840312 k8s.gcr.io/kube-apiserver:v1.15.0\ndocker tag 2d3813851e87 k8s.gcr.io/kube-scheduler:v1.15.0\ndocker tag 8328bb49b652 k8s.gcr.io/kube-controller-manager:v1.15.0\ndocker tag da86e6ba6ca1 k8s.gcr.io/pause:3.1\ndocker tag eb516548c180 k8s.gcr.io/coredns:1.3.1\ndocker tag 2c4adeb21b4f k8s.gcr.io/etcd:3.3.10\n")])])]),t("p",[t("strong",[a._v("制作镜像")])]),a._v(" "),t("p",[a._v("请参考阿里云基于ECS "),t("a",{attrs:{href:"https://help.aliyun.com/document_detail/35109.html?spm=5176.2020520101.0.0.75fc4df5mtdFmV",target:"_blank",rel:"noopener noreferrer"}},[a._v("制作虚拟机镜像"),t("OutboundLink")],1),a._v(" 的文档")]),a._v(" "),t("h2",{attrs:{id:"初始化-master-节点"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#初始化-master-节点","aria-hidden":"true"}},[a._v("#")]),a._v(" 初始化 master 节点")]),a._v(" "),t("h3",{attrs:{id:"在-demo-master-a-1-机器上执行"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#在-demo-master-a-1-机器上执行","aria-hidden":"true"}},[a._v("#")]),a._v(" 在 demo-master-a-1 机器上执行")]),a._v(" "),t("p",[a._v("以下命令以 root 身份执行")]),a._v(" "),t("p",[t("strong",[a._v("配置 apiserver.demo 的域名")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("echo")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"x.x.x.x apiserver.demo"')]),a._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v(">>")]),a._v(" /etc/hosts\n")])])]),t("blockquote",[t("p",[a._v("请替换其中的 x.x.x.x 为您的 demo-master-a-1 的实际 ip 地址")])]),a._v(" "),t("p",[t("strong",[a._v("创建 /root/k8s/kubeadm-config.yaml")])]),a._v(" "),t("div",{staticClass:"language-yaml extra-class"},[t("pre",{pre:!0,attrs:{class:"language-yaml"}},[t("code",[t("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("apiVersion")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" kubeadm.k8s.io/v1beta1\n"),t("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("kind")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" ClusterConfiguration\n"),t("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("kubernetesVersion")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" v1.15.0\n"),t("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("controlPlaneEndpoint")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"apiserver.demo:6443"')]),a._v("\n\n")])])]),t("p",[t("strong",[a._v("初始化 apiserver")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("kubeadm init --config"),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("kubeadm-config.yaml --upload-certs\n")])])]),t("p",[a._v("执行结果如下图所示:")]),a._v(" "),t("p",[t("img",{attrs:{src:e(320),alt:"image-20190715101542756",title:":size=800x388"}})]),a._v(" "),t("p",[t("strong",[a._v("初始化 root 用户的 kubectl 配置")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("rm")]),a._v(" -rf /root/.kube/\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("mkdir")]),a._v(" /root/.kube/\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("cp")]),a._v(" -i /etc/kubernetes/admin.conf /root/.kube/config\n")])])]),t("p",[t("strong",[a._v("安装 calico")])]),a._v(" "),t("p",[a._v("(需要在安全组–ServerFarm需要为集群服务器器端口6443建立安全组规则)")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("kubectl apply -f "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\nhttps://docs.projectcalico.org/v3.6/getting-started/kubernetes/installation/hosted/kubernetes-datastore/calico-networking/1.7/calico.yaml\n")])])]),t("blockquote",[t("p",[a._v("安装calico, 请参考https://docs.projectcalico.org/v3.6/getting-started/kubernetes/")])]),a._v(" "),t("p",[t("strong",[a._v("等待calico安装就绪:")])]),a._v(" "),t("p",[a._v("执行如下命令,等待3-10分钟,直到所有的容器组处于 Running 状态")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("watch")]),a._v(" kubectl get pod -n kube-system\n")])])]),t("h3",{attrs:{id:"检查-apiserver初始化结果"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#检查-apiserver初始化结果","aria-hidden":"true"}},[a._v("#")]),a._v(" 检查 apiserver初始化结果")]),a._v(" "),t("p",[a._v("在第一个master节点 demo-master-a-1 上执行")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("kubectl get nodes\n")])])]),t("h2",{attrs:{id:"初始化-worker节点"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#初始化-worker节点","aria-hidden":"true"}},[a._v("#")]),a._v(" 初始化 worker节点")]),a._v(" "),t("h3",{attrs:{id:"获得-join命令参数"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#获得-join命令参数","aria-hidden":"true"}},[a._v("#")]),a._v(" 获得 join命令参数")]),a._v(" "),t("p",[t("strong",[a._v("在 master 节点 demo-master-a-1 节点执行")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("kubeadm token create --print-join-command\n")])])]),t("p",[a._v("可获取kubeadm join 命令及参数,如下所示")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("kubeadm "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("join")]),a._v(" apiserver.demo:6443 --token mpfjma.4vjjg8flqihor4vt --discovery-token-ca-cert-hash sha256:6f7a8e40a810323672de5eee6f4d19aa2dbdb38411845a1bf5dd63485c43d303\n")])])]),t("h3",{attrs:{id:"初始化worker"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#初始化worker","aria-hidden":"true"}},[a._v("#")]),a._v(" 初始化worker")]),a._v(" "),t("p",[t("strong",[a._v("针对所有的 worker 节点执行")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("echo")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"x.x.x.x apiserver.demo"')]),a._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v(">>")]),a._v(" /etc/hosts\nkubeadm "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("join")]),a._v(" apiserver.demo:6443 --token mpfjma.4vjjg8flqihor4vt --discovery-token-ca-cert-hash sha256:6f7a8e40a810323672de5eee6f4d19aa2dbdb38411845a1bf5dd63485c43d303\n")])])]),t("blockquote",[t("ul",[t("li",[t("p",[a._v("将 x.x.x.x 替换为 loader balancer 的实际 ip")])]),a._v(" "),t("li",[t("p",[a._v("将 kubeadm join 命令后的参数替换为上一个步骤中实际从 demo-master-a-1 节点获得的参数")])])])]),a._v(" "),t("h3",{attrs:{id:"检查-apiserver初始化结果-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#检查-apiserver初始化结果-2","aria-hidden":"true"}},[a._v("#")]),a._v(" 检查 apiserver初始化结果")]),a._v(" "),t("p",[a._v("在第一个master节点 demo-master-a-1 上执行")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("kubectl get nodes\n")])])]),t("p",[t("img",{attrs:{src:e(321),alt:"image-20190715193838012"}})]),a._v(" "),t("h2",{attrs:{id:"移除-worker-节点"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#移除-worker-节点","aria-hidden":"true"}},[a._v("#")]),a._v(" 移除 worker 节点")]),a._v(" "),t("blockquote",[t("p",[a._v("正常情况下,您无需移除 worker 节点")])]),a._v(" "),t("p",[a._v("在准备移除的 worker 节点上执行")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("kubeadm reset\n")])])]),t("p",[a._v("在第一个 master 节点 demo-master-a-1 上执行")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("kubectl delete node demo-worker-x-x\n")])])]),t("blockquote",[t("ul",[t("li",[a._v("将 demo-worker-x-x 替换为要移除的 worker 节点的名字")]),a._v(" "),t("li",[a._v("worker 节点的名字可以通过在第一个 master 节点 demo-master-a-1 上执行 kubectl get nodes 命令获得")])])]),a._v(" "),t("h2",{attrs:{id:"安装-ingress-controller"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#安装-ingress-controller","aria-hidden":"true"}},[a._v("#")]),a._v(" 安装 Ingress Controller")]),a._v(" "),t("blockquote",[t("p",[a._v("ingress官方文档:https://kubernetes.io/docs/concepts/services-networking/ingress/")]),a._v(" "),t("p",[a._v("Ingress Controllers官网介绍:"),t("a",{attrs:{href:"https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/",target:"_blank",rel:"noopener noreferrer"}},[a._v("https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/"),t("OutboundLink")],1)]),a._v(" "),t("p",[a._v("本文中使用如下部署方式:https://kubernetes.github.io/ingress-nginx/deploy/baremetal/#using-a-self-provisioned-edge")]),a._v(" "),t("p",[a._v("kubernetes支持多种Ingress Controllers,本文推荐使用")]),a._v(" "),t("p",[a._v("https://github.com/nginxinc/kubernetes-ingress")])]),a._v(" "),t("h3",{attrs:{id:"在-demo-master-a-1-上执行"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#在-demo-master-a-1-上执行","aria-hidden":"true"}},[a._v("#")]),a._v(" 在 demo-master-a-1 上执行")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("kubectl apply -f https://raw.githubusercontent.com/eip-work/eip-monitor-repository/master/dashboard/nginx-ingress.yaml\n")])])]),t("h3",{attrs:{id:"配置域名解析"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#配置域名解析","aria-hidden":"true"}},[a._v("#")]),a._v(" 配置域名解析")]),a._v(" "),t("p",[a._v("将域名 *.demo.yourdomain.com 解析到地址负载均衡服务器 的 IP 地址 z.z.z.z")]),a._v(" "),t("h3",{attrs:{id:"验证配置"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#验证配置","aria-hidden":"true"}},[a._v("#")]),a._v(" 验证配置")]),a._v(" "),t("p",[a._v("在浏览器访问 a.demo.yourdomain.com,将得到 404 NotFound 错误页面")])])},[],!1,null,null,null);s.default=r.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/19.194af6da.js b/docs/assets/js/19.883b60d2.js similarity index 94% rename from docs/assets/js/19.194af6da.js rename to docs/assets/js/19.883b60d2.js index f73e00e..389bfa6 100644 --- a/docs/assets/js/19.194af6da.js +++ b/docs/assets/js/19.883b60d2.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[19],{111:function(e,r,a){e.exports=a.p+"assets/img/kuboard_qq.45e78dbf.png"},146:function(e,r,a){e.exports=a.p+"assets/img/image-20190716234146419.bd87cdff.png"},314:function(e,r,a){e.exports=a.p+"assets/img/image-20190721154650916.3f63fdcb.jpg"},315:function(e,r,a){e.exports=a.p+"assets/img/image-20190723105039358.91eef75a.png"},316:function(e,r,a){e.exports=a.p+"assets/img/image-20190721000759925.bb32a332.png"},375:function(e,r,a){"use strict";a.r(r);var t=a(0),s=Object(t.a)({},function(){var e=this,r=e.$createElement,t=e._self._c||r;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h2",{attrs:{id:"为什么选择-kuboard"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#为什么选择-kuboard","aria-hidden":"true"}},[e._v("#")]),e._v(" 为什么选择 Kuboard")]),e._v(" "),t("p",[e._v("Kubernetes 已然是当下容器编排领域事实上的标准,各大云服务商都急于推出 Kubernetes 服务,互联网公司也纷纷跟进,将自己的应用容器化,并使用 Kubernetes 编排。")]),e._v(" "),t("p",[e._v("在 Kubernetes 图形化工具方面,我们已经获得了极大的可选择空间:")]),e._v(" "),t("ul",[t("li",[e._v("各云服务商自己推出的 Kubernetes 服务所搭载的管理控制台,例如 阿里云的 Kubernetes 服务,青云推出的 KubeSphere,其他云服务商的 CaaS 类服务")]),e._v(" "),t("li",[e._v("Kubernetes 官方的图形管理界面 Kubernetes Dashboard")]),e._v(" "),t("li",[e._v("面向企业私有化部署的 Rancher")])]),e._v(" "),t("p",[e._v("什么场景下更适合选择 Kuboard 呢?")]),e._v(" "),t("h2",{attrs:{id:"kubernetes-入门学习者"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#kubernetes-入门学习者","aria-hidden":"true"}},[e._v("#")]),e._v(" Kubernetes 入门学习者")]),e._v(" "),t("p",[e._v("​\tKuboard类似于 Kubernetes Dashboard,是一款轻量级产品,按照 Kuboard 的文档,您可以很快地搭建一套学习 Kubernetes 用的集群环境,您也可以在自己已经有的集群上轻易地完成 Kuboard 的安装。")]),e._v(" "),t("p",[e._v("​\t对于 K8S 入门学习者来说,看了那么多 Kubernetes 文章,了解了许多的跟 apiserver、etcd、pod、container、service、ingress、storage class等各种概念,都不如比不上自己动手搭一套 K8S 环境,并在其上部署一套微服务应用的效果好。Kuboard 完全采用场景化的设计,操作过程更适合人们的思考方式。例如,集群概览的展示方式、名称空间的展示方式。")]),e._v(" "),t("h3",{attrs:{id:"集群概览"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#集群概览","aria-hidden":"true"}},[e._v("#")]),e._v(" 集群概览")]),e._v(" "),t("p",[e._v("在 Kuboard 中,集群概览的展现形式如下:")]),e._v(" "),t("p",[e._v("​\t计算资源、存储资源并列在集群概览的下层,上层则是运行于计算资源与存储资源上的名称空间(应用)。")]),e._v(" "),t("p",[t("img",{attrs:{src:a(146),alt:"集群概览"}})]),e._v(" "),t("h3",{attrs:{id:"名称空间"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#名称空间","aria-hidden":"true"}},[e._v("#")]),e._v(" 名称空间")]),e._v(" "),t("p",[e._v("在 Kuboard 中,名称空间的展示形式如下:")]),e._v(" "),t("p",[e._v("​\t以微服务参考分层架构的形式,将所有的微服务分为如下几层:")]),e._v(" "),t("ul",[t("li",[e._v("展现层\n"),t("ul",[t("li",[e._v("终端用户访问的 Web 应用")])])]),e._v(" "),t("li",[e._v("API网关层\n"),t("ul",[t("li",[e._v("Spring Cloud Gateway / Zuul /Kong 等接口网关")])])]),e._v(" "),t("li",[e._v("微服务层\n"),t("ul",[t("li",[e._v("Spring Boot 微服务,或 PHP / Python 实现的微服务")])])]),e._v(" "),t("li",[e._v("持久层\n"),t("ul",[t("li",[e._v("MySQL 数据库等(开发及测试环境里,将MySQL部署于 Kubernetes 可以极大地降低环境维护的任务量)")])])]),e._v(" "),t("li",[e._v("中间件层\n"),t("ul",[t("li",[e._v("消息队列")]),e._v(" "),t("li",[e._v("服务注册 Eureka / Zookeeper / Consul 等")])])]),e._v(" "),t("li",[e._v("监控层\n"),t("ul",[t("li",[e._v("Prometheus + Grafana")]),e._v(" "),t("li",[e._v("Pinpooint 等")])])])]),e._v(" "),t("p",[t("img",{attrs:{src:a(314),alt:"image-20190721154650916"}})]),e._v(" "),t("p",[e._v("​\t更为贴心的,当某一个工作负载存在部署方面的问题时, Kuboard 将以红色高亮出该工作负载,并配有合适的方式辅助用户定位错误信息。")]),e._v(" "),t("h3",{attrs:{id:"无需手写-yaml"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#无需手写-yaml","aria-hidden":"true"}},[e._v("#")]),e._v(" 无需手写 Yaml")]),e._v(" "),t("p",[e._v("​\t学习 Kubernetes 时,需要花费许多的时间,在理解一个概念之后,模仿着写一个 yaml 文件,再使用 kubectl 应用该文件。")]),e._v(" "),t("p",[e._v("​\t使用 Kuboard 提供的工作负载编辑器,可以直观的完成应用的部署")]),e._v(" "),t("p",[t("img",{attrs:{src:a(315),alt:"image-20190723105039358"}})]),e._v(" "),t("h2",{attrs:{id:"kubernetes-日常运维人员"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#kubernetes-日常运维人员","aria-hidden":"true"}},[e._v("#")]),e._v(" Kubernetes 日常运维人员")]),e._v(" "),t("p",[e._v("​\tkubectl 的命令敲了许多遍了?yaml 文件越来越多,结构越来越复杂?又要部署一套测试环境,用来进行 UAT 测试?")]),e._v(" "),t("h3",{attrs:{id:"纯图形界面运维-kubernetes"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#纯图形界面运维-kubernetes","aria-hidden":"true"}},[e._v("#")]),e._v(" 纯图形界面运维 Kubernetes")]),e._v(" "),t("p",[e._v("在作者的日常运维工作中,除了 kubectl port-forward 还需要回到命令行界面以外,其他运维任务已经全部在 Kuboard 中轻松完成。更让人期待的是,Kuboard 作者还计划实现 port-forward 的功能,如此一来,作者日后就完全不再需要使用 kubectl 了。")]),e._v(" "),t("h3",{attrs:{id:"多环境复制"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#多环境复制","aria-hidden":"true"}},[e._v("#")]),e._v(" 多环境复制")]),e._v(" "),t("p",[e._v("为了能够是你的一套 yaml 文件适应多种部署(开发环境、测试环境、UAT环境、生产环境),您一定尝试过各种办法,例如 helmer chart, kustomize, kubectl apply -k directory_name,但是您本来可以更轻松地完成这样的任务的。")]),e._v(" "),t("p",[e._v("Kuboard 提供了 工作负载导出和导入的功能,0 yaml文件,轻松复制多个环境。")]),e._v(" "),t("h3",{attrs:{id:"应用升级"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#应用升级","aria-hidden":"true"}},[e._v("#")]),e._v(" 应用升级")]),e._v(" "),t("p",[e._v("Kuboard 提供批量修改容器镜像版本的功能,轻松升级应用程序的版本。")]),e._v(" "),t("p",[t("img",{attrs:{src:a(316),alt:"image-20190721000759925"}})]),e._v(" "),t("h2",{attrs:{id:"_0-侵入性"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_0-侵入性","aria-hidden":"true"}},[e._v("#")]),e._v(" 0 侵入性")]),e._v(" "),t("p",[e._v("​\tRancher 为了支持多云管理(MeSos,Docker Swarm,Kubernetes等),引入了一系列复杂的概念,又需要新增安装 Rancher Server、Rancher Agent等,本来学习 Kubernetes 已然不堪重负,Rancher再把多云整合到一起来,无疑又增加了学习和使用的复杂性。如果您只是打算使用 Kubernetes 的话,也许并不需要选择 Rancher 这样重量级的产品。Kuboard 仅仅依赖于原生 Kubernetes,可以运行在各种公有云、私有云上,您也可以自己基于物理机、vsphere、vmware等已经有的基础设施搭建 Kubernetes,轻松实现现有 Infrastructure 的容器化改造。")]),e._v(" "),t("h2",{attrs:{id:"更多资料"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#更多资料","aria-hidden":"true"}},[e._v("#")]),e._v(" 更多资料")]),e._v(" "),t("p",[e._v("Kuboard 官网 http://kuboard.cn")]),e._v(" "),t("p",[e._v("Kuboard QQ 群")]),e._v(" "),t("p",[t("img",{attrs:{src:a(111),alt:"Kuboard QQ 群"}})])])},[],!1,null,null,null);r.default=s.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[19],{111:function(e,r,a){e.exports=a.p+"assets/img/kuboard_qq.45e78dbf.png"},146:function(e,r,a){e.exports=a.p+"assets/img/image-20190716234146419.bd87cdff.png"},315:function(e,r,a){e.exports=a.p+"assets/img/image-20190721154650916.3f63fdcb.jpg"},316:function(e,r,a){e.exports=a.p+"assets/img/image-20190723105039358.91eef75a.png"},317:function(e,r,a){e.exports=a.p+"assets/img/image-20190721000759925.bb32a332.png"},373:function(e,r,a){"use strict";a.r(r);var t=a(0),s=Object(t.a)({},function(){var e=this,r=e.$createElement,t=e._self._c||r;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h2",{attrs:{id:"为什么选择-kuboard"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#为什么选择-kuboard","aria-hidden":"true"}},[e._v("#")]),e._v(" 为什么选择 Kuboard")]),e._v(" "),t("p",[e._v("Kubernetes 已然是当下容器编排领域事实上的标准,各大云服务商都急于推出 Kubernetes 服务,互联网公司也纷纷跟进,将自己的应用容器化,并使用 Kubernetes 编排。")]),e._v(" "),t("p",[e._v("在 Kubernetes 图形化工具方面,我们已经获得了极大的可选择空间:")]),e._v(" "),t("ul",[t("li",[e._v("各云服务商自己推出的 Kubernetes 服务所搭载的管理控制台,例如 阿里云的 Kubernetes 服务,青云推出的 KubeSphere,其他云服务商的 CaaS 类服务")]),e._v(" "),t("li",[e._v("Kubernetes 官方的图形管理界面 Kubernetes Dashboard")]),e._v(" "),t("li",[e._v("面向企业私有化部署的 Rancher")])]),e._v(" "),t("p",[e._v("什么场景下更适合选择 Kuboard 呢?")]),e._v(" "),t("h2",{attrs:{id:"kubernetes-入门学习者"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#kubernetes-入门学习者","aria-hidden":"true"}},[e._v("#")]),e._v(" Kubernetes 入门学习者")]),e._v(" "),t("p",[e._v("​\tKuboard类似于 Kubernetes Dashboard,是一款轻量级产品,按照 Kuboard 的文档,您可以很快地搭建一套学习 Kubernetes 用的集群环境,您也可以在自己已经有的集群上轻易地完成 Kuboard 的安装。")]),e._v(" "),t("p",[e._v("​\t对于 K8S 入门学习者来说,看了那么多 Kubernetes 文章,了解了许多的跟 apiserver、etcd、pod、container、service、ingress、storage class等各种概念,都不如比不上自己动手搭一套 K8S 环境,并在其上部署一套微服务应用的效果好。Kuboard 完全采用场景化的设计,操作过程更适合人们的思考方式。例如,集群概览的展示方式、名称空间的展示方式。")]),e._v(" "),t("h3",{attrs:{id:"集群概览"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#集群概览","aria-hidden":"true"}},[e._v("#")]),e._v(" 集群概览")]),e._v(" "),t("p",[e._v("在 Kuboard 中,集群概览的展现形式如下:")]),e._v(" "),t("p",[e._v("​\t计算资源、存储资源并列在集群概览的下层,上层则是运行于计算资源与存储资源上的名称空间(应用)。")]),e._v(" "),t("p",[t("img",{attrs:{src:a(146),alt:"集群概览"}})]),e._v(" "),t("h3",{attrs:{id:"名称空间"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#名称空间","aria-hidden":"true"}},[e._v("#")]),e._v(" 名称空间")]),e._v(" "),t("p",[e._v("在 Kuboard 中,名称空间的展示形式如下:")]),e._v(" "),t("p",[e._v("​\t以微服务参考分层架构的形式,将所有的微服务分为如下几层:")]),e._v(" "),t("ul",[t("li",[e._v("展现层\n"),t("ul",[t("li",[e._v("终端用户访问的 Web 应用")])])]),e._v(" "),t("li",[e._v("API网关层\n"),t("ul",[t("li",[e._v("Spring Cloud Gateway / Zuul /Kong 等接口网关")])])]),e._v(" "),t("li",[e._v("微服务层\n"),t("ul",[t("li",[e._v("Spring Boot 微服务,或 PHP / Python 实现的微服务")])])]),e._v(" "),t("li",[e._v("持久层\n"),t("ul",[t("li",[e._v("MySQL 数据库等(开发及测试环境里,将MySQL部署于 Kubernetes 可以极大地降低环境维护的任务量)")])])]),e._v(" "),t("li",[e._v("中间件层\n"),t("ul",[t("li",[e._v("消息队列")]),e._v(" "),t("li",[e._v("服务注册 Eureka / Zookeeper / Consul 等")])])]),e._v(" "),t("li",[e._v("监控层\n"),t("ul",[t("li",[e._v("Prometheus + Grafana")]),e._v(" "),t("li",[e._v("Pinpooint 等")])])])]),e._v(" "),t("p",[t("img",{attrs:{src:a(315),alt:"image-20190721154650916"}})]),e._v(" "),t("p",[e._v("​\t更为贴心的,当某一个工作负载存在部署方面的问题时, Kuboard 将以红色高亮出该工作负载,并配有合适的方式辅助用户定位错误信息。")]),e._v(" "),t("h3",{attrs:{id:"无需手写-yaml"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#无需手写-yaml","aria-hidden":"true"}},[e._v("#")]),e._v(" 无需手写 Yaml")]),e._v(" "),t("p",[e._v("​\t学习 Kubernetes 时,需要花费许多的时间,在理解一个概念之后,模仿着写一个 yaml 文件,再使用 kubectl 应用该文件。")]),e._v(" "),t("p",[e._v("​\t使用 Kuboard 提供的工作负载编辑器,可以直观的完成应用的部署")]),e._v(" "),t("p",[t("img",{attrs:{src:a(316),alt:"image-20190723105039358"}})]),e._v(" "),t("h2",{attrs:{id:"kubernetes-日常运维人员"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#kubernetes-日常运维人员","aria-hidden":"true"}},[e._v("#")]),e._v(" Kubernetes 日常运维人员")]),e._v(" "),t("p",[e._v("​\tkubectl 的命令敲了许多遍了?yaml 文件越来越多,结构越来越复杂?又要部署一套测试环境,用来进行 UAT 测试?")]),e._v(" "),t("h3",{attrs:{id:"纯图形界面运维-kubernetes"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#纯图形界面运维-kubernetes","aria-hidden":"true"}},[e._v("#")]),e._v(" 纯图形界面运维 Kubernetes")]),e._v(" "),t("p",[e._v("在作者的日常运维工作中,除了 kubectl port-forward 还需要回到命令行界面以外,其他运维任务已经全部在 Kuboard 中轻松完成。更让人期待的是,Kuboard 作者还计划实现 port-forward 的功能,如此一来,作者日后就完全不再需要使用 kubectl 了。")]),e._v(" "),t("h3",{attrs:{id:"多环境复制"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#多环境复制","aria-hidden":"true"}},[e._v("#")]),e._v(" 多环境复制")]),e._v(" "),t("p",[e._v("为了能够是你的一套 yaml 文件适应多种部署(开发环境、测试环境、UAT环境、生产环境),您一定尝试过各种办法,例如 helmer chart, kustomize, kubectl apply -k directory_name,但是您本来可以更轻松地完成这样的任务的。")]),e._v(" "),t("p",[e._v("Kuboard 提供了 工作负载导出和导入的功能,0 yaml文件,轻松复制多个环境。")]),e._v(" "),t("h3",{attrs:{id:"应用升级"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#应用升级","aria-hidden":"true"}},[e._v("#")]),e._v(" 应用升级")]),e._v(" "),t("p",[e._v("Kuboard 提供批量修改容器镜像版本的功能,轻松升级应用程序的版本。")]),e._v(" "),t("p",[t("img",{attrs:{src:a(317),alt:"image-20190721000759925"}})]),e._v(" "),t("h2",{attrs:{id:"_0-侵入性"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_0-侵入性","aria-hidden":"true"}},[e._v("#")]),e._v(" 0 侵入性")]),e._v(" "),t("p",[e._v("​\tRancher 为了支持多云管理(MeSos,Docker Swarm,Kubernetes等),引入了一系列复杂的概念,又需要新增安装 Rancher Server、Rancher Agent等,本来学习 Kubernetes 已然不堪重负,Rancher再把多云整合到一起来,无疑又增加了学习和使用的复杂性。如果您只是打算使用 Kubernetes 的话,也许并不需要选择 Rancher 这样重量级的产品。Kuboard 仅仅依赖于原生 Kubernetes,可以运行在各种公有云、私有云上,您也可以自己基于物理机、vsphere、vmware等已经有的基础设施搭建 Kubernetes,轻松实现现有 Infrastructure 的容器化改造。")]),e._v(" "),t("h2",{attrs:{id:"更多资料"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#更多资料","aria-hidden":"true"}},[e._v("#")]),e._v(" 更多资料")]),e._v(" "),t("p",[e._v("Kuboard 官网 http://kuboard.cn")]),e._v(" "),t("p",[e._v("Kuboard QQ 群")]),e._v(" "),t("p",[t("img",{attrs:{src:a(111),alt:"Kuboard QQ 群"}})])])},[],!1,null,null,null);r.default=s.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/21.d311f8b4.js b/docs/assets/js/21.d311f8b4.js new file mode 100644 index 0000000..2b534ef --- /dev/null +++ b/docs/assets/js/21.d311f8b4.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[21],{112:function(a,s,e){a.exports=e.p+"assets/img/image-20190715085036593.ab4a32ff.png"},113:function(a,s,e){a.exports=e.p+"assets/img/image2019-07-15_09.01.21.1ac5bd70.png"},332:function(a,s,e){a.exports=e.p+"assets/img/image-20190713075717350.df5244cd.png"},333:function(a,s,e){a.exports=e.p+"assets/img/image2019-6-10_15-36-29.2870ee7d.png"},356:function(a,s,e){"use strict";e.r(s);var t=e(0),r=Object(t.a)({},function(){var a=this,s=a.$createElement,t=a._self._c||s;return t("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[t("h1",{attrs:{id:"安装-kubernetes-高可用"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#安装-kubernetes-高可用","aria-hidden":"true"}},[a._v("#")]),a._v(" 安装 Kubernetes 高可用")]),a._v(" "),t("div",{staticClass:"danger custom-block"},[t("p",[a._v("推荐初学者按照 "),t("a",{attrs:{href:"install-k8s"}},[a._v("安装Kubernetes 单Master节点")]),a._v(" 文档进行 Kubernetes 集群搭建")])]),a._v(" "),t("h1",{attrs:{id:"介绍"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#介绍","aria-hidden":"true"}},[a._v("#")]),a._v(" 介绍")]),a._v(" "),t("p",[a._v("kubernetes 安装有多种选择,本文档描述的集群安装具备如下特点:")]),a._v(" "),t("ul",[t("li",[a._v("使用 kubernetes 1.15.0")]),a._v(" "),t("li",[a._v("三个 master 组成主节点集群,通过内网 loader balancer 实现负载均衡")]),a._v(" "),t("li",[a._v("多个 worker 组成工作节点集群,通过外网 loader balancer 实现负载均衡")]),a._v(" "),t("li",[a._v("使用 calico 作为网络插件")]),a._v(" "),t("li",[a._v("使用 nginx-ingress 作为 kubernetes ingress controller")])]),a._v(" "),t("p",[t("a",{attrs:{href:"https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=obezo3pg",target:"_blank",rel:"noopener noreferrer"}},[a._v("领取阿里云最高2000元红包"),t("OutboundLink")],1)]),a._v(" "),t("p",[a._v("下图为 kubernetes 安装的拓扑图")]),a._v(" "),t("p",[t("img",{attrs:{src:e(332),alt:"image-20190713075717350"}})]),a._v(" "),t("ul",[t("li",[a._v("标准机用于制作 centos 镜像,该镜像预先安装了 docker / kubelet / kubectl / kubeadm, 并预先下载了 kubernetes 所需的 docker image")]),a._v(" "),t("li",[a._v("跳板机用于通过 ssh 端口访问标准机、master 节点、worker 节点的 shell,如果您所使用的环境中,可以直接访问各节点的 shell,也可以无需跳板机")]),a._v(" "),t("li",[a._v("NAT y.y.y.y将 apiserver 的6443端口映射到外网,如果您始终只在 master 节点上执行 kubectl 命令,则无需做此映射")]),a._v(" "),t("li",[a._v("Load Balancer z.z.z.z 是 kubernetes 的 Ingress 外网映射,通常是必须的")])]),a._v(" "),t("h1",{attrs:{id:"安装步骤"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#安装步骤","aria-hidden":"true"}},[a._v("#")]),a._v(" 安装步骤")]),a._v(" "),t("h2",{attrs:{id:"制作标准机镜像"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#制作标准机镜像","aria-hidden":"true"}},[a._v("#")]),a._v(" 制作标准机镜像")]),a._v(" "),t("p",[a._v("通过使用标准机镜像,可以")]),a._v(" "),t("ul",[t("li",[t("strong",[a._v("避免重复执行对测试机安装必要软件的过程")])]),a._v(" "),t("li",[t("strong",[a._v("以一种相对标准化的过程管理测试机的维护")])])]),a._v(" "),t("p",[a._v("标准机镜像中预装了如下内容:")]),a._v(" "),t("ul",[t("li",[a._v("docker")]),a._v(" "),t("li",[a._v("gitlab-runner")]),a._v(" "),t("li",[a._v("kubernetes images")])]),a._v(" "),t("p",[a._v("本文档描述的安装过程已基于 centos 7.6 验证")]),a._v(" "),t("p",[a._v("标准机镜像的制作过程描述如下:")]),a._v(" "),t("h3",{attrs:{id:"安装docker"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#安装docker","aria-hidden":"true"}},[a._v("#")]),a._v(" 安装docker")]),a._v(" "),t("p",[t("strong",[a._v("卸载旧版本")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" yum remove docker "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n\tdocker-client "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n\tdocker-client-latest "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n\tdocker-common "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n\tdocker-latest "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n\tdocker-latest-logrotate "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n\tdocker-logrotate "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n\tdocker-selinux "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n\tdocker-engine-selinux "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n\tdocker-engine\n")])])]),t("p",[t("strong",[a._v("下载依赖包及安装包")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("wget")]),a._v(" https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm\n\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("wget")]),a._v(" https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-cli-18.09.7-3.el7.x86_64.rpm\n\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("wget")]),a._v(" https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-18.09.7-3.el7.x86_64.rpm\n")])])]),t("p",[t("strong",[a._v("安装")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" yum "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("install")]),a._v(" -y containerd.io-1.2.6-3.3.el7.x86_64.rpm\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" yum "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("install")]),a._v(" -y docker-ce-cli-18.09.7-3.el7.x86_64.rpm\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" yum "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("install")]),a._v(" -y docker-ce-18.09.7-3.el7.x86_64.rpm\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" systemctl "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("enable")]),a._v(" docker\n")])])]),t("p",[t("strong",[a._v("启动 docker 服务")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" systemctl start docker\n")])])]),t("p",[t("strong",[a._v("检查 docker 版本")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("docker version\n")])])]),t("p",[t("strong",[a._v("参考文档")])]),a._v(" "),t("p",[a._v("https://docs.docker.com/install/linux/docker-ce/centos/")]),a._v(" "),t("p",[a._v("https://docs.docker.com/install/linux/linux-postinstall/")]),a._v(" "),t("h3",{attrs:{id:"安装-nfs-utils"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#安装-nfs-utils","aria-hidden":"true"}},[a._v("#")]),a._v(" 安装 nfs-utils")]),a._v(" "),t("p",[t("strong",[a._v("执行安装命令")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" yum "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("install")]),a._v(" nfs-utils\n")])])]),t("p",[a._v("必须先安装 nfs-utils 才能挂载 nfs 网络存储")]),a._v(" "),t("h3",{attrs:{id:"k8s基本配置"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#k8s基本配置","aria-hidden":"true"}},[a._v("#")]),a._v(" K8S基本配置")]),a._v(" "),t("p",[t("strong",[a._v("配置K8S的yum源")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("cat")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("<<")]),a._v("EOF "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v(">")]),a._v(" /etc/yum.repos.d/kubernetes.repo\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),a._v("kubernetes"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("name")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("Kubernetes\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("baseurl")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("enabled")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("1")]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("gpgcheck")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("0")]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("repo_gpgcheck")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("0")]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("gpgkey")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg\n http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg\nEOF\n")])])]),t("p",[t("strong",[a._v("关闭swap、防火墙")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("swapoff -a\n")])])]),t("p",[t("strong",[a._v("关闭SeLinux")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("setenforce "),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("0")]),a._v("\n")])])]),t("p",[t("strong",[a._v("修改 /etc/sysctl.conf")])]),a._v(" "),t("p",[t("code",[a._v("vim /etc/sysctl.conf")])]),a._v(" "),t("p",[a._v("向其中添加")]),a._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[a._v("net.ipv4.ip_forward = 1\nnet.bridge.bridge-nf-call-ip6tables = 1\nnet.bridge.bridge-nf-call-iptables = 1\n")])])]),t("p",[a._v("如下图所示")]),a._v(" "),t("p",[t("img",{attrs:{src:e(112),alt:"image-20190715085036593",title:":size=600x445"}})]),a._v(" "),t("p",[t("strong",[a._v("安装kubelet、kubeadm、kubectl")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("yum "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("install")]),a._v(" -y kubelet-1.15.0 kubeadm-1.15.0 kubectl-1.15.0\n")])])]),t("p",[t("strong",[a._v("修改docker Cgroup Driver为systemd")])]),a._v(" "),t("p",[t("code",[a._v("vim /usr/lib/systemd/system/docker.service")])]),a._v(" "),t("p",[a._v("向其中他添加")]),a._v(" "),t("p",[t("code",[a._v("--exec-opt native.cgroupdriver=systemd")])]),a._v(" "),t("p",[a._v("如下图所示")]),a._v(" "),t("p",[t("img",{attrs:{src:e(113),alt:"屏幕快照 2019-07-15 09.01.21",title:":size=1000x326"}})]),a._v(" "),t("p",[a._v("重启 docker")]),a._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[a._v("systemctl daemon-reload\nsystemctl restart docker\n")])])]),t("p",[t("strong",[a._v("启动kubelet")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("systemctl "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("enable")]),a._v(" kubelet "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("&&")]),a._v(" systemctl start kubelet\n")])])]),t("p",[t("strong",[a._v("加载 kubernetes 镜像")])]),a._v(" "),t("p",[a._v("由于k8s服务相关镜像在国外镜像源,国内无法访问")]),a._v(" "),t("p",[a._v("执行以下命令添加docker k8s国内镜像源")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("curl")]),a._v(" -sSL https://get.daocloud.io/daotools/set_mirror.sh "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sh")]),a._v(" -s http://f1361db2.m.daocloud.io\n\nsystemctl restart docker\n")])])]),t("p",[t("strong",[a._v("拉取k8s相关镜像")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("docker pull mirrorgooglecontainers/kube-apiserver:v1.15.0\ndocker pull mirrorgooglecontainers/kube-controller-manager:v1.15.0\ndocker pull mirrorgooglecontainers/kube-scheduler:v1.15.0\ndocker pull mirrorgooglecontainers/kube-proxy:v1.15.0\ndocker pull mirrorgooglecontainers/pause:3.1\ndocker pull mirrorgooglecontainers/etcd:3.3.10\ndocker pull coredns/coredns:1.3.1\n")])])]),t("p",[t("strong",[a._v("更改镜像名为k8s官网镜像")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("docker tag d235b23c3570 k8s.gcr.io/kube-proxy:v1.15.0\ndocker tag 201c7a840312 k8s.gcr.io/kube-apiserver:v1.15.0\ndocker tag 2d3813851e87 k8s.gcr.io/kube-scheduler:v1.15.0\ndocker tag 8328bb49b652 k8s.gcr.io/kube-controller-manager:v1.15.0\ndocker tag da86e6ba6ca1 k8s.gcr.io/pause:3.1\ndocker tag eb516548c180 k8s.gcr.io/coredns:1.3.1\ndocker tag 2c4adeb21b4f k8s.gcr.io/etcd:3.3.10\n")])])]),t("p",[t("strong",[a._v("制作镜像")])]),a._v(" "),t("p",[a._v("请参考阿里云基于ECS "),t("a",{attrs:{href:"https://help.aliyun.com/document_detail/35109.html?spm=5176.2020520101.0.0.75fc4df5mtdFmV",target:"_blank",rel:"noopener noreferrer"}},[a._v("制作虚拟机镜像"),t("OutboundLink")],1),a._v(" 的文档")]),a._v(" "),t("h2",{attrs:{id:"初始化api-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#初始化api-server","aria-hidden":"true"}},[a._v("#")]),a._v(" 初始化API Server")]),a._v(" "),t("h3",{attrs:{id:"创建-apiserver-的-elb(私网)"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#创建-apiserver-的-elb(私网)","aria-hidden":"true"}},[a._v("#")]),a._v(" 创建 ApiServer 的 ELB(私网)")]),a._v(" "),t("p",[a._v("监听端口:6443 / TCP")]),a._v(" "),t("p",[a._v("后端资源组:包含 apple-master-a-1, apple-master-b-1, apple-master-b-2")]),a._v(" "),t("p",[a._v("后端端口:6443")]),a._v(" "),t("p",[a._v("开启 按源地址保持会话")]),a._v(" "),t("p",[a._v("假设完成创建以后,ELB的 ip 地址为 x.x.x.x")]),a._v(" "),t("h3",{attrs:{id:"初始化第一个master节点"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#初始化第一个master节点","aria-hidden":"true"}},[a._v("#")]),a._v(" 初始化第一个master节点")]),a._v(" "),t("p",[a._v("在 apple-master-a-1机器上执行")]),a._v(" "),t("p",[t("strong",[a._v("配置 apiserver.apple 的域名")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" -i\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("echo")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"x.x.x.x apiserver.apple"')]),a._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v(">>")]),a._v(" /etc/hosts\n")])])]),t("blockquote",[t("p",[a._v("请替换其中的 x.x.x.x 为您的负载均衡服务器的实际 ip 地址")])]),a._v(" "),t("p",[t("strong",[a._v("创建 /root/k8s/kubeadm-config.yaml")])]),a._v(" "),t("div",{staticClass:"language-yaml extra-class"},[t("pre",{pre:!0,attrs:{class:"language-yaml"}},[t("code",[t("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("apiVersion")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" kubeadm.k8s.io/v1beta1\n"),t("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("kind")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" ClusterConfiguration\n"),t("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("kubernetesVersion")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" v1.14.3\n"),t("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("controlPlaneEndpoint")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"apiserver.apple:6443"')]),a._v("\n\n")])])]),t("p",[t("strong",[a._v("初始化 apiserver")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("kubeadm init --config"),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("/root/k8s/kubeadm-config.yaml --upload-certs\n\n")])])]),t("p",[a._v("执行结果如下图所示:")]),a._v(" "),t("p",[t("img",{attrs:{src:e(333),alt:"image2019-6-10_15-36-29"}})]),a._v(" "),t("p",[t("strong",[a._v("初始化 gitlab-runner 用户的 kubectl 配置")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("rm")]),a._v(" -rf /home/gitlab-runner/.kube/\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("mkdir")]),a._v(" /home/gitlab-runner/.kube/\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("cp")]),a._v(" -i /etc/kubernetes/admin.conf /home/gitlab-runner/.kube/config\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("chown")]),a._v(" -R gitlab-runner:gitlab-runner /home/gitlab-runner/.kube\n")])])]),t("p",[t("strong",[a._v("安装 calico")])]),a._v(" "),t("p",[a._v("(需要在安全组–ServerFarm需要为集群服务器器端口6443建立安全组规则)")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("su")]),a._v(" - gitlab-runner\nkubectl apply -f "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n\t\thttps://docs.projectcalico.org/v3.6/getting-started/kubernetes/installation/hosted/kubernetes-datastore/calico-networking/1.7/calico.yaml\n")])])]),t("blockquote",[t("p",[a._v("安装calico, 请参考https://docs.projectcalico.org/v3.6/getting-started/kubernetes/")])]),a._v(" "),t("p",[t("strong",[a._v("等待calico安装就绪:")])]),a._v(" "),t("p",[a._v("执行如下命令,等待3-10分钟,直到所有的容器组处于 Running 状态")]),a._v(" "),t("div",{staticClass:"language-sh extra-class"},[t("pre",{pre:!0,attrs:{class:"language-sh"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("watch")]),a._v(" kubectl get pod -n kube-system\n")])])]),t("h3",{attrs:{id:"初始化第二、三个master节点"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#初始化第二、三个master节点","aria-hidden":"true"}},[a._v("#")]),a._v(" 初始化第二、三个master节点")]),a._v(" "),t("p",[a._v("在 apple-master-b-1 和 apple-master-b-2 机器上执行")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" -i\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("echo")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"x.x.x.x apiserver.apple"')]),a._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v(">>")]),a._v(" /etc/hosts\n")])])]),t("p",[a._v("执行 (以下命令行在初始化 apple-master-a-1 时,被打印在控制台上,执行时应该使用控制台打印出的命令参数)")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("kubeadm "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("join")]),a._v(" apiserver.apple:6443 --token ejwx62.vqwog6il5p83uk7y "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n--discovery-token-ca-cert-hash sha256:6f7a8e40a810323672de5eee6f4d19aa2dbdb38411845a1bf5dd63485c43d303 "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n--experimental-control-plane --certificate-key 70eb87e62f052d2d5de759969d5b42f372d0ad798f98df38f7fe73efdf63a13c\n")])])]),t("h3",{attrs:{id:"检查-apiserver初始化结果"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#检查-apiserver初始化结果","aria-hidden":"true"}},[a._v("#")]),a._v(" 检查 apiserver初始化结果")]),a._v(" "),t("p",[a._v("在第一个master节点 apple-master-a-1 上执行")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" -i\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("su")]),a._v(" - gitlab-runner\nkubectl get nodes\n")])])]),t("h2",{attrs:{id:"初始化-worker节点"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#初始化-worker节点","aria-hidden":"true"}},[a._v("#")]),a._v(" 初始化 worker节点")]),a._v(" "),t("h3",{attrs:{id:"获得-join命令参数"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#获得-join命令参数","aria-hidden":"true"}},[a._v("#")]),a._v(" 获得 join命令参数")]),a._v(" "),t("p",[t("strong",[a._v("在第一个master节点 apple-master-a-1 节点执行")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" -i\nkubeadm token create --print-join-command\n")])])]),t("p",[a._v("可获取kubeadm join 命令及参数,如下所示")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("kubeadm "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("join")]),a._v(" apiserver.apple:6443 --token mpfjma.4vjjg8flqihor4vt --discovery-token-ca-cert-hash sha256:6f7a8e40a810323672de5eee6f4d19aa2dbdb38411845a1bf5dd63485c43d303\n")])])]),t("h3",{attrs:{id:"初始化worker"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#初始化worker","aria-hidden":"true"}},[a._v("#")]),a._v(" 初始化worker")]),a._v(" "),t("p",[t("strong",[a._v("针对所有的 worker 节点执行")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" -i\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("echo")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"x.x.x.x apiserver.apple"')]),a._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v(">>")]),a._v(" /etc/hosts\nkubeadm "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("join")]),a._v(" apiserver.apple:6443 --token mpfjma.4vjjg8flqihor4vt --discovery-token-ca-cert-hash sha256:6f7a8e40a810323672de5eee6f4d19aa2dbdb38411845a1bf5dd63485c43d303\n")])])]),t("blockquote",[t("ul",[t("li",[t("p",[a._v("将 x.x.x.x 替换为 loader balancer 的实际 ip")])]),a._v(" "),t("li",[t("p",[a._v("将 kubeadm join 命令后的参数替换为上一个步骤中实际从 apple-master-a-1 节点获得的参数")])])])]),a._v(" "),t("h3",{attrs:{id:"检查-apiserver初始化结果-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#检查-apiserver初始化结果-2","aria-hidden":"true"}},[a._v("#")]),a._v(" 检查 apiserver初始化结果")]),a._v(" "),t("p",[a._v("在第一个master节点 apple-master-a-1 上执行")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" -i\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("su")]),a._v(" - gitlab-runner\nkubectl get nodes\n")])])]),t("h2",{attrs:{id:"移除-worker-节点"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#移除-worker-节点","aria-hidden":"true"}},[a._v("#")]),a._v(" 移除 worker 节点")]),a._v(" "),t("blockquote",[t("p",[a._v("正常情况下,您无需移除 worker 节点")])]),a._v(" "),t("p",[a._v("在准备移除的 worker 节点上执行")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" -i\t\nkubeadm reset\n")])])]),t("p",[a._v("在第一个 master 节点 apple-master-a-1 上执行")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" -i\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("su")]),a._v(" - gitlab-runner\nkubectl delete node apple-worker-x-x\n")])])]),t("blockquote",[t("ul",[t("li",[a._v("将 apple-worker-x-x 替换为要移除的 worker 节点的名字")]),a._v(" "),t("li",[a._v("worker 节点的名字可以通过在第一个 master 节点 apple-master-a-1 上执行 kubectl get nodes 命令获得")])])]),a._v(" "),t("h2",{attrs:{id:"安装-ingress-controller"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#安装-ingress-controller","aria-hidden":"true"}},[a._v("#")]),a._v(" 安装 Ingress Controller")]),a._v(" "),t("blockquote",[t("p",[a._v("ingress官方文档:https://kubernetes.io/docs/concepts/services-networking/ingress/")]),a._v(" "),t("p",[a._v("Ingress Controllers官网介绍:"),t("a",{attrs:{href:"https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/",target:"_blank",rel:"noopener noreferrer"}},[a._v("https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/"),t("OutboundLink")],1)]),a._v(" "),t("p",[a._v("本文中使用如下部署方式:https://kubernetes.github.io/ingress-nginx/deploy/baremetal/#using-a-self-provisioned-edge")]),a._v(" "),t("p",[a._v("kubernetes支持多种Ingress Controllers,本文推荐使用")]),a._v(" "),t("p",[a._v("https://github.com/nginxinc/kubernetes-ingress")])]),a._v(" "),t("h3",{attrs:{id:"在-apple-master-a-1-上执行"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#在-apple-master-a-1-上执行","aria-hidden":"true"}},[a._v("#")]),a._v(" 在 apple-master-a-1 上执行")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("su")]),a._v(" - gitlab-runner\nkubectl apply -f https://raw.githubusercontent.com/eip-work/eip-monitor-repository/master/dashboard/nginx-ingress.yaml\n")])])]),t("h3",{attrs:{id:"在iaas云控制台完成如下配置(公网elb)"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#在iaas云控制台完成如下配置(公网elb)","aria-hidden":"true"}},[a._v("#")]),a._v(" 在IaaS云控制台完成如下配置("),t("strong",[a._v("公网ELB")]),a._v(")")]),a._v(" "),t("p",[a._v("创建负载均衡 ELB:")]),a._v(" "),t("p",[a._v("​ 监听器 1:80 / TCP, SOURCE_ADDRESS 会话保持")]),a._v(" "),t("p",[a._v("​ 服务器资源池 1: apple-worker-x-x 的所有节点的 80端口")]),a._v(" "),t("p",[a._v("​ 监听器 2:443 / TCP, SOURCE_ADDRESS 会话保持")]),a._v(" "),t("p",[a._v("​ 服务器资源池 2: apple-worker-x-x 的所有节点的443端口")]),a._v(" "),t("p",[a._v("假设刚创建的负载均衡 ELB 的 IP 地址为: z.z.z.z")]),a._v(" "),t("h3",{attrs:{id:"配置域名解析"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#配置域名解析","aria-hidden":"true"}},[a._v("#")]),a._v(" 配置域名解析")]),a._v(" "),t("p",[a._v("将域名 *.apple.yourdomain.com 解析到地址负载均衡服务器 的 IP 地址 z.z.z.z")]),a._v(" "),t("h3",{attrs:{id:"验证配置"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#验证配置","aria-hidden":"true"}},[a._v("#")]),a._v(" 验证配置")]),a._v(" "),t("p",[a._v("在浏览器访问 a.apple.yourdomain.com,将得到 404 NotFound 错误页面")])])},[],!1,null,null,null);s.default=r.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/21.ea13fede.js b/docs/assets/js/21.ea13fede.js deleted file mode 100644 index 5495ca6..0000000 --- a/docs/assets/js/21.ea13fede.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[21],{112:function(a,s,e){a.exports=e.p+"assets/img/image-20190715085036593.ab4a32ff.png"},113:function(a,s,e){a.exports=e.p+"assets/img/image2019-07-15_09.01.21.1ac5bd70.png"},335:function(a,s,e){a.exports=e.p+"assets/img/image-20190713075717350.df5244cd.png"},336:function(a,s,e){a.exports=e.p+"assets/img/image2019-6-10_15-36-29.2870ee7d.png"},354:function(a,s,e){"use strict";e.r(s);var t=e(0),r=Object(t.a)({},function(){var a=this,s=a.$createElement,t=a._self._c||s;return t("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[t("h1",{attrs:{id:"安装-kubernetes"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#安装-kubernetes","aria-hidden":"true"}},[a._v("#")]),a._v(" 安装 Kubernetes")]),a._v(" "),t("h1",{attrs:{id:"介绍"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#介绍","aria-hidden":"true"}},[a._v("#")]),a._v(" 介绍")]),a._v(" "),t("p",[a._v("kubernetes 安装有多种选择,本文档描述的集群安装具备如下特点:")]),a._v(" "),t("ul",[t("li",[a._v("使用 kubernetes 1.15.0")]),a._v(" "),t("li",[a._v("三个 master 组成主节点集群,通过内网 loader balancer 实现负载均衡")]),a._v(" "),t("li",[a._v("多个 worker 组成工作节点集群,通过外网 loader balancer 实现负载均衡")]),a._v(" "),t("li",[a._v("使用 calico 作为网络插件")]),a._v(" "),t("li",[a._v("使用 nginx-ingress 作为 kubernetes ingress controller")])]),a._v(" "),t("p",[t("a",{attrs:{href:"https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=obezo3pg",target:"_blank",rel:"noopener noreferrer"}},[a._v("领取阿里云最高2000元红包"),t("OutboundLink")],1)]),a._v(" "),t("p",[a._v("下图为 kubernetes 安装的拓扑图")]),a._v(" "),t("p",[t("img",{attrs:{src:e(335),alt:"image-20190713075717350"}})]),a._v(" "),t("ul",[t("li",[a._v("标准机用于制作 centos 镜像,该镜像预先安装了 docker / kubelet / kubectl / kubeadm, 并预先下载了 kubernetes 所需的 docker image")]),a._v(" "),t("li",[a._v("跳板机用于通过 ssh 端口访问标准机、master 节点、worker 节点的 shell,如果您所使用的环境中,可以直接访问各节点的 shell,也可以无需跳板机")]),a._v(" "),t("li",[a._v("NAT y.y.y.y将 apiserver 的6443端口映射到外网,如果您始终只在 master 节点上执行 kubectl 命令,则无需做此映射")]),a._v(" "),t("li",[a._v("Load Balancer z.z.z.z 是 kubernetes 的 Ingress 外网映射,通常是必须的")])]),a._v(" "),t("h1",{attrs:{id:"安装步骤"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#安装步骤","aria-hidden":"true"}},[a._v("#")]),a._v(" 安装步骤")]),a._v(" "),t("h2",{attrs:{id:"制作标准机镜像"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#制作标准机镜像","aria-hidden":"true"}},[a._v("#")]),a._v(" 制作标准机镜像")]),a._v(" "),t("p",[a._v("通过使用标准机镜像,可以")]),a._v(" "),t("ul",[t("li",[t("strong",[a._v("避免重复执行对测试机安装必要软件的过程")])]),a._v(" "),t("li",[t("strong",[a._v("以一种相对标准化的过程管理测试机的维护")])])]),a._v(" "),t("p",[a._v("标准机镜像中预装了如下内容:")]),a._v(" "),t("ul",[t("li",[a._v("docker")]),a._v(" "),t("li",[a._v("gitlab-runner")]),a._v(" "),t("li",[a._v("kubernetes images")])]),a._v(" "),t("p",[a._v("本文档描述的安装过程已基于 centos 7.6 验证")]),a._v(" "),t("p",[a._v("标准机镜像的制作过程描述如下:")]),a._v(" "),t("h3",{attrs:{id:"安装docker"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#安装docker","aria-hidden":"true"}},[a._v("#")]),a._v(" 安装docker")]),a._v(" "),t("p",[t("strong",[a._v("卸载旧版本")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" yum remove docker "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n\tdocker-client "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n\tdocker-client-latest "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n\tdocker-common "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n\tdocker-latest "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n\tdocker-latest-logrotate "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n\tdocker-logrotate "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n\tdocker-selinux "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n\tdocker-engine-selinux "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n\tdocker-engine\n")])])]),t("p",[t("strong",[a._v("下载依赖包及安装包")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("wget")]),a._v(" https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm\n\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("wget")]),a._v(" https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-cli-18.09.7-3.el7.x86_64.rpm\n\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("wget")]),a._v(" https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-18.09.7-3.el7.x86_64.rpm\n")])])]),t("p",[t("strong",[a._v("安装")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" yum "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("install")]),a._v(" -y containerd.io-1.2.6-3.3.el7.x86_64.rpm\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" yum "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("install")]),a._v(" -y docker-ce-cli-18.09.7-3.el7.x86_64.rpm\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" yum "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("install")]),a._v(" -y docker-ce-18.09.7-3.el7.x86_64.rpm\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" systemctl "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("enable")]),a._v(" docker\n")])])]),t("p",[t("strong",[a._v("启动 docker 服务")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" systemctl start docker\n")])])]),t("p",[t("strong",[a._v("检查 docker 版本")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("docker version\n")])])]),t("p",[t("strong",[a._v("参考文档")])]),a._v(" "),t("p",[a._v("https://docs.docker.com/install/linux/docker-ce/centos/")]),a._v(" "),t("p",[a._v("https://docs.docker.com/install/linux/linux-postinstall/")]),a._v(" "),t("h3",{attrs:{id:"安装-nfs-utils"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#安装-nfs-utils","aria-hidden":"true"}},[a._v("#")]),a._v(" 安装 nfs-utils")]),a._v(" "),t("p",[t("strong",[a._v("执行安装命令")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" yum "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("install")]),a._v(" nfs-utils\n")])])]),t("p",[a._v("必须先安装 nfs-utils 才能挂载 nfs 网络存储")]),a._v(" "),t("h3",{attrs:{id:"k8s基本配置"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#k8s基本配置","aria-hidden":"true"}},[a._v("#")]),a._v(" K8S基本配置")]),a._v(" "),t("p",[t("strong",[a._v("配置K8S的yum源")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("cat")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("<<")]),a._v("EOF "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v(">")]),a._v(" /etc/yum.repos.d/kubernetes.repo\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),a._v("kubernetes"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("name")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("Kubernetes\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("baseurl")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("enabled")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("1")]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("gpgcheck")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("0")]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("repo_gpgcheck")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("0")]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("gpgkey")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg\n http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg\nEOF\n")])])]),t("p",[t("strong",[a._v("关闭swap、防火墙")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("swapoff -a\n")])])]),t("p",[t("strong",[a._v("关闭SeLinux")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("setenforce "),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("0")]),a._v("\n")])])]),t("p",[t("strong",[a._v("修改 /etc/sysctl.conf")])]),a._v(" "),t("p",[t("code",[a._v("vim /etc/sysctl.conf")])]),a._v(" "),t("p",[a._v("向其中添加")]),a._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[a._v("net.ipv4.ip_forward = 1\nnet.bridge.bridge-nf-call-ip6tables = 1\nnet.bridge.bridge-nf-call-iptables = 1\n")])])]),t("p",[a._v("如下图所示")]),a._v(" "),t("p",[t("img",{attrs:{src:e(112),alt:"image-20190715085036593",title:":size=600x445"}})]),a._v(" "),t("p",[t("strong",[a._v("安装kubelet、kubeadm、kubectl")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("yum "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("install")]),a._v(" -y kubelet-1.15.0 kubeadm-1.15.0 kubectl-1.15.0\n")])])]),t("p",[t("strong",[a._v("修改docker Cgroup Driver为systemd")])]),a._v(" "),t("p",[t("code",[a._v("vim /usr/lib/systemd/system/docker.service")])]),a._v(" "),t("p",[a._v("向其中他添加")]),a._v(" "),t("p",[t("code",[a._v("--exec-opt native.cgroupdriver=systemd")])]),a._v(" "),t("p",[a._v("如下图所示")]),a._v(" "),t("p",[t("img",{attrs:{src:e(113),alt:"屏幕快照 2019-07-15 09.01.21",title:":size=1000x326"}})]),a._v(" "),t("p",[a._v("重启 docker")]),a._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[a._v("systemctl daemon-reload\nsystemctl restart docker\n")])])]),t("p",[t("strong",[a._v("启动kubelet")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("systemctl "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("enable")]),a._v(" kubelet "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("&&")]),a._v(" systemctl start kubelet\n")])])]),t("p",[t("strong",[a._v("加载 kubernetes 镜像")])]),a._v(" "),t("p",[a._v("由于k8s服务相关镜像在国外镜像源,国内无法访问")]),a._v(" "),t("p",[a._v("执行以下命令添加docker k8s国内镜像源")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("curl")]),a._v(" -sSL https://get.daocloud.io/daotools/set_mirror.sh "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sh")]),a._v(" -s http://f1361db2.m.daocloud.io\n\nsystemctl restart docker\n")])])]),t("p",[t("strong",[a._v("拉取k8s相关镜像")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("docker pull mirrorgooglecontainers/kube-apiserver:v1.15.0\ndocker pull mirrorgooglecontainers/kube-controller-manager:v1.15.0\ndocker pull mirrorgooglecontainers/kube-scheduler:v1.15.0\ndocker pull mirrorgooglecontainers/kube-proxy:v1.15.0\ndocker pull mirrorgooglecontainers/pause:3.1\ndocker pull mirrorgooglecontainers/etcd:3.3.10\ndocker pull coredns/coredns:1.3.1\n")])])]),t("p",[t("strong",[a._v("更改镜像名为k8s官网镜像")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("docker tag d235b23c3570 k8s.gcr.io/kube-proxy:v1.15.0\ndocker tag 201c7a840312 k8s.gcr.io/kube-apiserver:v1.15.0\ndocker tag 2d3813851e87 k8s.gcr.io/kube-scheduler:v1.15.0\ndocker tag 8328bb49b652 k8s.gcr.io/kube-controller-manager:v1.15.0\ndocker tag da86e6ba6ca1 k8s.gcr.io/pause:3.1\ndocker tag eb516548c180 k8s.gcr.io/coredns:1.3.1\ndocker tag 2c4adeb21b4f k8s.gcr.io/etcd:3.3.10\n")])])]),t("p",[t("strong",[a._v("制作镜像")])]),a._v(" "),t("p",[a._v("请参考阿里云基于ECS "),t("a",{attrs:{href:"https://help.aliyun.com/document_detail/35109.html?spm=5176.2020520101.0.0.75fc4df5mtdFmV",target:"_blank",rel:"noopener noreferrer"}},[a._v("制作虚拟机镜像"),t("OutboundLink")],1),a._v(" 的文档")]),a._v(" "),t("h2",{attrs:{id:"初始化api-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#初始化api-server","aria-hidden":"true"}},[a._v("#")]),a._v(" 初始化API Server")]),a._v(" "),t("h3",{attrs:{id:"创建-apiserver-的-elb(私网)"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#创建-apiserver-的-elb(私网)","aria-hidden":"true"}},[a._v("#")]),a._v(" 创建 ApiServer 的 ELB(私网)")]),a._v(" "),t("p",[a._v("监听端口:6443 / TCP")]),a._v(" "),t("p",[a._v("后端资源组:包含 apple-master-a-1, apple-master-b-1, apple-master-b-2")]),a._v(" "),t("p",[a._v("后端端口:6443")]),a._v(" "),t("p",[a._v("开启 按源地址保持会话")]),a._v(" "),t("p",[a._v("假设完成创建以后,ELB的 ip 地址为 x.x.x.x")]),a._v(" "),t("h3",{attrs:{id:"初始化第一个master节点"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#初始化第一个master节点","aria-hidden":"true"}},[a._v("#")]),a._v(" 初始化第一个master节点")]),a._v(" "),t("p",[a._v("在 apple-master-a-1机器上执行")]),a._v(" "),t("p",[t("strong",[a._v("配置 apiserver.apple 的域名")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" -i\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("echo")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"x.x.x.x apiserver.apple"')]),a._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v(">>")]),a._v(" /etc/hosts\n")])])]),t("blockquote",[t("p",[a._v("请替换其中的 x.x.x.x 为您的负载均衡服务器的实际 ip 地址")])]),a._v(" "),t("p",[t("strong",[a._v("创建 /root/k8s/kubeadm-config.yaml")])]),a._v(" "),t("div",{staticClass:"language-yaml extra-class"},[t("pre",{pre:!0,attrs:{class:"language-yaml"}},[t("code",[t("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("apiVersion")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" kubeadm.k8s.io/v1beta1\n"),t("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("kind")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" ClusterConfiguration\n"),t("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("kubernetesVersion")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" v1.14.3\n"),t("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("controlPlaneEndpoint")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"apiserver.apple:6443"')]),a._v("\n\n")])])]),t("p",[t("strong",[a._v("初始化 apiserver")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("kubeadm init --config"),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("/root/k8s/kubeadm-config.yaml --upload-certs\n\n")])])]),t("p",[a._v("执行结果如下图所示:")]),a._v(" "),t("p",[t("img",{attrs:{src:e(336),alt:"image2019-6-10_15-36-29"}})]),a._v(" "),t("p",[t("strong",[a._v("初始化 gitlab-runner 用户的 kubectl 配置")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("rm")]),a._v(" -rf /home/gitlab-runner/.kube/\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("mkdir")]),a._v(" /home/gitlab-runner/.kube/\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("cp")]),a._v(" -i /etc/kubernetes/admin.conf /home/gitlab-runner/.kube/config\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("chown")]),a._v(" -R gitlab-runner:gitlab-runner /home/gitlab-runner/.kube\n")])])]),t("p",[t("strong",[a._v("安装 calico")])]),a._v(" "),t("p",[a._v("(需要在安全组–ServerFarm需要为集群服务器器端口6443建立安全组规则)")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("su")]),a._v(" - gitlab-runner\nkubectl apply -f "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n\t\thttps://docs.projectcalico.org/v3.6/getting-started/kubernetes/installation/hosted/kubernetes-datastore/calico-networking/1.7/calico.yaml\n")])])]),t("blockquote",[t("p",[a._v("安装calico, 请参考https://docs.projectcalico.org/v3.6/getting-started/kubernetes/")])]),a._v(" "),t("p",[t("strong",[a._v("等待calico安装就绪:")])]),a._v(" "),t("p",[a._v("执行如下命令,等待3-10分钟,直到所有的容器组处于 Running 状态")]),a._v(" "),t("div",{staticClass:"language-sh extra-class"},[t("pre",{pre:!0,attrs:{class:"language-sh"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("watch")]),a._v(" kubectl get pod -n kube-system\n")])])]),t("h3",{attrs:{id:"初始化第二、三个master节点"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#初始化第二、三个master节点","aria-hidden":"true"}},[a._v("#")]),a._v(" 初始化第二、三个master节点")]),a._v(" "),t("p",[a._v("在 apple-master-b-1 和 apple-master-b-2 机器上执行")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" -i\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("echo")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"x.x.x.x apiserver.apple"')]),a._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v(">>")]),a._v(" /etc/hosts\n")])])]),t("p",[a._v("执行 (以下命令行在初始化 apple-master-a-1 时,被打印在控制台上,执行时应该使用控制台打印出的命令参数)")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("kubeadm "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("join")]),a._v(" apiserver.apple:6443 --token ejwx62.vqwog6il5p83uk7y "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n--discovery-token-ca-cert-hash sha256:6f7a8e40a810323672de5eee6f4d19aa2dbdb38411845a1bf5dd63485c43d303 "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n--experimental-control-plane --certificate-key 70eb87e62f052d2d5de759969d5b42f372d0ad798f98df38f7fe73efdf63a13c\n")])])]),t("h3",{attrs:{id:"检查-apiserver初始化结果"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#检查-apiserver初始化结果","aria-hidden":"true"}},[a._v("#")]),a._v(" 检查 apiserver初始化结果")]),a._v(" "),t("p",[a._v("在第一个master节点 apple-master-a-1 上执行")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" -i\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("su")]),a._v(" - gitlab-runner\nkubectl get nodes\n")])])]),t("h2",{attrs:{id:"初始化-worker节点"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#初始化-worker节点","aria-hidden":"true"}},[a._v("#")]),a._v(" 初始化 worker节点")]),a._v(" "),t("h3",{attrs:{id:"获得-join命令参数"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#获得-join命令参数","aria-hidden":"true"}},[a._v("#")]),a._v(" 获得 join命令参数")]),a._v(" "),t("p",[t("strong",[a._v("在第一个master节点 apple-master-a-1 节点执行")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" -i\nkubeadm token create --print-join-command\n")])])]),t("p",[a._v("可获取kubeadm join 命令及参数,如下所示")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("kubeadm "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("join")]),a._v(" apiserver.apple:6443 --token mpfjma.4vjjg8flqihor4vt --discovery-token-ca-cert-hash sha256:6f7a8e40a810323672de5eee6f4d19aa2dbdb38411845a1bf5dd63485c43d303\n")])])]),t("h3",{attrs:{id:"初始化worker"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#初始化worker","aria-hidden":"true"}},[a._v("#")]),a._v(" 初始化worker")]),a._v(" "),t("p",[t("strong",[a._v("针对所有的 worker 节点执行")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" -i\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("echo")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"x.x.x.x apiserver.apple"')]),a._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v(">>")]),a._v(" /etc/hosts\nkubeadm "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("join")]),a._v(" apiserver.apple:6443 --token mpfjma.4vjjg8flqihor4vt --discovery-token-ca-cert-hash sha256:6f7a8e40a810323672de5eee6f4d19aa2dbdb38411845a1bf5dd63485c43d303\n")])])]),t("blockquote",[t("ul",[t("li",[t("p",[a._v("将 x.x.x.x 替换为 loader balancer 的实际 ip")])]),a._v(" "),t("li",[t("p",[a._v("将 kubeadm join 命令后的参数替换为上一个步骤中实际从 apple-master-a-1 节点获得的参数")])])])]),a._v(" "),t("h3",{attrs:{id:"检查-apiserver初始化结果-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#检查-apiserver初始化结果-2","aria-hidden":"true"}},[a._v("#")]),a._v(" 检查 apiserver初始化结果")]),a._v(" "),t("p",[a._v("在第一个master节点 apple-master-a-1 上执行")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" -i\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("su")]),a._v(" - gitlab-runner\nkubectl get nodes\n")])])]),t("h2",{attrs:{id:"移除-worker-节点"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#移除-worker-节点","aria-hidden":"true"}},[a._v("#")]),a._v(" 移除 worker 节点")]),a._v(" "),t("blockquote",[t("p",[a._v("正常情况下,您无需移除 worker 节点")])]),a._v(" "),t("p",[a._v("在准备移除的 worker 节点上执行")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" -i\t\nkubeadm reset\n")])])]),t("p",[a._v("在第一个 master 节点 apple-master-a-1 上执行")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" -i\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("su")]),a._v(" - gitlab-runner\nkubectl delete node apple-worker-x-x\n")])])]),t("blockquote",[t("ul",[t("li",[a._v("将 apple-worker-x-x 替换为要移除的 worker 节点的名字")]),a._v(" "),t("li",[a._v("worker 节点的名字可以通过在第一个 master 节点 apple-master-a-1 上执行 kubectl get nodes 命令获得")])])]),a._v(" "),t("h2",{attrs:{id:"安装-ingress-controller"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#安装-ingress-controller","aria-hidden":"true"}},[a._v("#")]),a._v(" 安装 Ingress Controller")]),a._v(" "),t("blockquote",[t("p",[a._v("ingress官方文档:https://kubernetes.io/docs/concepts/services-networking/ingress/")]),a._v(" "),t("p",[a._v("Ingress Controllers官网介绍:"),t("a",{attrs:{href:"https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/",target:"_blank",rel:"noopener noreferrer"}},[a._v("https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/"),t("OutboundLink")],1)]),a._v(" "),t("p",[a._v("本文中使用如下部署方式:https://kubernetes.github.io/ingress-nginx/deploy/baremetal/#using-a-self-provisioned-edge")]),a._v(" "),t("p",[a._v("kubernetes支持多种Ingress Controllers,本文推荐使用")]),a._v(" "),t("p",[a._v("https://github.com/nginxinc/kubernetes-ingress")])]),a._v(" "),t("h3",{attrs:{id:"在-apple-master-a-1-上执行"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#在-apple-master-a-1-上执行","aria-hidden":"true"}},[a._v("#")]),a._v(" 在 apple-master-a-1 上执行")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("su")]),a._v(" - gitlab-runner\nkubectl apply -f https://raw.githubusercontent.com/eip-work/eip-monitor-repository/master/dashboard/nginx-ingress.yaml\n")])])]),t("h3",{attrs:{id:"在iaas云控制台完成如下配置(公网elb)"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#在iaas云控制台完成如下配置(公网elb)","aria-hidden":"true"}},[a._v("#")]),a._v(" 在IaaS云控制台完成如下配置("),t("strong",[a._v("公网ELB")]),a._v(")")]),a._v(" "),t("p",[a._v("创建负载均衡 ELB:")]),a._v(" "),t("p",[a._v("​ 监听器 1:80 / TCP, SOURCE_ADDRESS 会话保持")]),a._v(" "),t("p",[a._v("​ 服务器资源池 1: apple-worker-x-x 的所有节点的 80端口")]),a._v(" "),t("p",[a._v("​ 监听器 2:443 / TCP, SOURCE_ADDRESS 会话保持")]),a._v(" "),t("p",[a._v("​ 服务器资源池 2: apple-worker-x-x 的所有节点的443端口")]),a._v(" "),t("p",[a._v("假设刚创建的负载均衡 ELB 的 IP 地址为: z.z.z.z")]),a._v(" "),t("h3",{attrs:{id:"配置域名解析"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#配置域名解析","aria-hidden":"true"}},[a._v("#")]),a._v(" 配置域名解析")]),a._v(" "),t("p",[a._v("将域名 *.apple.yourdomain.com 解析到地址负载均衡服务器 的 IP 地址 z.z.z.z")]),a._v(" "),t("h3",{attrs:{id:"验证配置"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#验证配置","aria-hidden":"true"}},[a._v("#")]),a._v(" 验证配置")]),a._v(" "),t("p",[a._v("在浏览器访问 a.apple.yourdomain.com,将得到 404 NotFound 错误页面")])])},[],!1,null,null,null);s.default=r.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/22.50b539e7.js b/docs/assets/js/22.f9ec7565.js similarity index 85% rename from docs/assets/js/22.50b539e7.js rename to docs/assets/js/22.f9ec7565.js index b1226fa..5ed4807 100644 --- a/docs/assets/js/22.50b539e7.js +++ b/docs/assets/js/22.f9ec7565.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[22],{212:function(t,a,e){t.exports=e.p+"assets/img/image-20190720224950653.857d1b1e.png"},213:function(t,a,e){t.exports=e.p+"assets/img/image-20190720225123111.c2b02f0c.png"},214:function(t,a,e){t.exports=e.p+"assets/img/image-20190720225222622.2081299f.png"},361:function(t,a,e){"use strict";e.r(a);var r=e(0),s=Object(r.a)({},function(){var t=this,a=t.$createElement,r=t._self._c||a;return r("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[r("h1",{attrs:{id:"计算资源管理"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#计算资源管理","aria-hidden":"true"}},[t._v("#")]),t._v(" 计算资源管理")]),t._v(" "),r("h2",{attrs:{id:"前提"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#前提","aria-hidden":"true"}},[t._v("#")]),t._v(" 前提")]),t._v(" "),r("p",[t._v("必须具备如下条件:")]),t._v(" "),r("ul",[r("li",[t._v("Kubernetes 集群")]),t._v(" "),r("li",[t._v("已在集群中安装 Kuboard")])]),t._v(" "),r("h2",{attrs:{id:"添加节点"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#添加节点","aria-hidden":"true"}},[t._v("#")]),t._v(" 添加节点")]),t._v(" "),r("p",[t._v("集群完成安装后,可以随时向集群中添加计算节点,请参考 "),r("router-link",{attrs:{to:"/install/install-k8s.html#初始化-worker节点"}},[t._v("初始化 worker 节点")])],1),t._v(" "),r("h2",{attrs:{id:"查看节点"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#查看节点","aria-hidden":"true"}},[t._v("#")]),t._v(" 查看节点")]),t._v(" "),r("p",[t._v("登录 Kuboard 之后,即可看到集群中的计算资源列表,在左下角,如下图所示:")]),t._v(" "),r("p",[r("img",{attrs:{src:e(212),alt:"image-20190720224950653"}})]),t._v(" "),r("ul",[r("li",[t._v("点击 "),r("em",[r("strong",[t._v("demo-worker002")])]),t._v(" 可查看该节点的详细信息,如下图所示:")])]),t._v(" "),r("p",[r("img",{attrs:{src:e(213),alt:"image-20190720225123111"}})]),t._v(" "),r("h2",{attrs:{id:"移除节点"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#移除节点","aria-hidden":"true"}},[t._v("#")]),t._v(" 移除节点")]),t._v(" "),r("ul",[r("li",[r("p",[t._v("点击 "),r("em",[r("strong",[t._v("节点")])]),t._v(" 详情页上方的 "),r("em",[r("strong",[t._v("删除")])])]),t._v(" "),r("p",[t._v("并确认要删除的节点的名称后,即可删除该节点")])])]),t._v(" "),r("p",[r("img",{attrs:{src:e(214),alt:"image-20190720225222622"}})]),t._v(" "),r("blockquote",[r("ul",[r("li",[r("p",[t._v("此时只是从 kubenetes 集群的配置中删除了该节点,该节点上的工作负载将被自动迁移到其他可用节点上。如果重启该节点对应的 linux 操作系统,该节点会重新注册到集群中来。")])]),t._v(" "),r("li",[r("p",[t._v("要想彻底删除该节点,您还需要登录该节点所在机器的 linux 终端,并以 root 身份执行如下命令")]),t._v(" "),r("div",{staticClass:"language-bash extra-class"},[r("pre",{pre:!0,attrs:{class:"language-bash"}},[r("code",[t._v("kubadm reset\n")])])])])])])])},[],!1,null,null,null);a.default=s.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[22],{230:function(t,a,e){t.exports=e.p+"assets/img/image-20190720224950653.857d1b1e.png"},231:function(t,a,e){t.exports=e.p+"assets/img/image-20190720225123111.c2b02f0c.png"},232:function(t,a,e){t.exports=e.p+"assets/img/image-20190720225222622.2081299f.png"},383:function(t,a,e){"use strict";e.r(a);var r=e(0),s=Object(r.a)({},function(){var t=this,a=t.$createElement,r=t._self._c||a;return r("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[r("h1",{attrs:{id:"计算资源管理"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#计算资源管理","aria-hidden":"true"}},[t._v("#")]),t._v(" 计算资源管理")]),t._v(" "),r("h2",{attrs:{id:"前提"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#前提","aria-hidden":"true"}},[t._v("#")]),t._v(" 前提")]),t._v(" "),r("p",[t._v("必须具备如下条件:")]),t._v(" "),r("ul",[r("li",[t._v("Kubernetes 集群")]),t._v(" "),r("li",[t._v("已在集群中安装 Kuboard")])]),t._v(" "),r("h2",{attrs:{id:"添加节点"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#添加节点","aria-hidden":"true"}},[t._v("#")]),t._v(" 添加节点")]),t._v(" "),r("p",[t._v("集群完成安装后,可以随时向集群中添加计算节点,请参考 "),r("router-link",{attrs:{to:"/install/install-k8s.html#初始化-worker节点"}},[t._v("初始化 worker 节点")])],1),t._v(" "),r("h2",{attrs:{id:"查看节点"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#查看节点","aria-hidden":"true"}},[t._v("#")]),t._v(" 查看节点")]),t._v(" "),r("p",[t._v("登录 Kuboard 之后,即可看到集群中的计算资源列表,在左下角,如下图所示:")]),t._v(" "),r("p",[r("img",{attrs:{src:e(230),alt:"image-20190720224950653"}})]),t._v(" "),r("ul",[r("li",[t._v("点击 "),r("em",[r("strong",[t._v("demo-worker002")])]),t._v(" 可查看该节点的详细信息,如下图所示:")])]),t._v(" "),r("p",[r("img",{attrs:{src:e(231),alt:"image-20190720225123111"}})]),t._v(" "),r("h2",{attrs:{id:"移除节点"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#移除节点","aria-hidden":"true"}},[t._v("#")]),t._v(" 移除节点")]),t._v(" "),r("ul",[r("li",[r("p",[t._v("点击 "),r("em",[r("strong",[t._v("节点")])]),t._v(" 详情页上方的 "),r("em",[r("strong",[t._v("删除")])])]),t._v(" "),r("p",[t._v("并确认要删除的节点的名称后,即可删除该节点")])])]),t._v(" "),r("p",[r("img",{attrs:{src:e(232),alt:"image-20190720225222622"}})]),t._v(" "),r("blockquote",[r("ul",[r("li",[r("p",[t._v("此时只是从 kubenetes 集群的配置中删除了该节点,该节点上的工作负载将被自动迁移到其他可用节点上。如果重启该节点对应的 linux 操作系统,该节点会重新注册到集群中来。")])]),t._v(" "),r("li",[r("p",[t._v("要想彻底删除该节点,您还需要登录该节点所在机器的 linux 终端,并以 root 身份执行如下命令")]),t._v(" "),r("div",{staticClass:"language-bash extra-class"},[r("pre",{pre:!0,attrs:{class:"language-bash"}},[r("code",[t._v("kubadm reset\n")])])])])])])])},[],!1,null,null,null);a.default=s.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/24.e37558ec.js b/docs/assets/js/24.01658ddf.js similarity index 95% rename from docs/assets/js/24.e37558ec.js rename to docs/assets/js/24.01658ddf.js index 7b43a59..08f314a 100644 --- a/docs/assets/js/24.e37558ec.js +++ b/docs/assets/js/24.01658ddf.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[24],{111:function(t,a,i){t.exports=i.p+"assets/img/kuboard_qq.45e78dbf.png"},146:function(t,a,i){t.exports=i.p+"assets/img/image-20190716234146419.bd87cdff.png"},317:function(t,a,i){t.exports=i.p+"assets/img/image-20190723104717575.f44900d3.png"},373:function(t,a,i){"use strict";i.r(a);var r=i(0),e=Object(r.a)({},function(){var t=this,a=t.$createElement,r=t._self._c||a;return r("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[r("h2",{attrs:{id:"kuboard"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#kuboard","aria-hidden":"true"}},[t._v("#")]),t._v(" Kuboard")]),t._v(" "),r("p",[t._v("A cool Kubernetes dashboard.")]),t._v(" "),r("p",[t._v("Kuboard 可以有效降低 Kubernetes 初学者的学习门槛,对于有经验的用户,也是非常顺手的一款运维工具。已在多个项目中投产使用。")]),t._v(" "),r("p",[t._v("Kuboard 的主要特点:")]),t._v(" "),r("ul",[r("li",[t._v("场景化设计")]),t._v(" "),r("li",[t._v("微服务分层显示")]),t._v(" "),r("li",[t._v("微服务上下文监控")])]),t._v(" "),r("p",[r("img",{attrs:{src:i(146),alt:"image-20190716234146419"}})]),t._v(" "),r("h2",{attrs:{id:"demo"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#demo","aria-hidden":"true"}},[t._v("#")]),t._v(" Demo")]),t._v(" "),r("p",[r("a",{attrs:{href:"http://demo.eip.work/#/login?isReadOnly=true&token=eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJrdWJvYXJkLXZpZXdlci10b2tlbi02djZiZiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJrdWJvYXJkLXZpZXdlciIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjhiYTU3YmI1LWFiMTctNDM1NS1hNTM0LTQ0Njk4NGY0NzFlZiIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTprdWJvYXJkLXZpZXdlciJ9.DcXNIp0RKha1zkV4ga_QlGfcvMLGx2LOyzX-0VeboC3FojKFhxnfBeoda-zTeh6ugJlSM4kQYrRcof1Kx8Mg3-UgofNmgRySbDEVKtJZyMUoHqLmySKUIn8sbX8q83RNcqwcvY-fM8-w8HSuzU7Td7WWNuZrlCL4q_LQDYIBet1nlQ83YsENKNE8rsZQFDw8YM0MH6BEZLdwyhaboy_jjYbsU7kv8gks3aIX4lh1Fs9ZFQpC_6B0_MZvb7rEeG2M8QWXoUkDoL5JCKu6Wot5GlWf0kDMxIsViggP0NmSDTKh6kIvCkT2FZ2I4guEcjE_EjBpdOS6Abta22tzLlPKhg",target:"_blank",rel:"noopener noreferrer"}},[t._v("Kuboard 在线体验"),r("OutboundLink")],1),t._v("\n为保证环境的稳定性,在线 Demo 中只提供只读权限。"),r("span",{staticStyle:{color:"#F56C6C","font-weight":"500"}},[t._v("(请在PC浏览器中打开)")])]),t._v(" "),r("p",[r("a",{attrs:{target:"_blank",href:"http://demo.eip.work/#/login?isReadOnly=true&token=eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJrdWJvYXJkLXZpZXdlci10b2tlbi02djZiZiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJrdWJvYXJkLXZpZXdlciIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjhiYTU3YmI1LWFiMTctNDM1NS1hNTM0LTQ0Njk4NGY0NzFlZiIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTprdWJvYXJkLXZpZXdlciJ9.DcXNIp0RKha1zkV4ga_QlGfcvMLGx2LOyzX-0VeboC3FojKFhxnfBeoda-zTeh6ugJlSM4kQYrRcof1Kx8Mg3-UgofNmgRySbDEVKtJZyMUoHqLmySKUIn8sbX8q83RNcqwcvY-fM8-w8HSuzU7Td7WWNuZrlCL4q_LQDYIBet1nlQ83YsENKNE8rsZQFDw8YM0MH6BEZLdwyhaboy_jjYbsU7kv8gks3aIX4lh1Fs9ZFQpC_6B0_MZvb7rEeG2M8QWXoUkDoL5JCKu6Wot5GlWf0kDMxIsViggP0NmSDTKh6kIvCkT2FZ2I4guEcjE_EjBpdOS6Abta22tzLlPKhg"}},[r("img",{attrs:{src:i(317)}})])]),t._v(" "),r("h2",{attrs:{id:"getting-started"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#getting-started","aria-hidden":"true"}},[t._v("#")]),t._v(" Getting Started")]),t._v(" "),r("p",[r("a",{attrs:{href:"concepts"}},[t._v("如何降低K8S学习门槛"),r("span",{staticStyle:{color:"red"}},[t._v("(必读)")])])]),t._v(" "),r("p",[r("a",{attrs:{href:"/install/index"}},[t._v("安装")])]),t._v(" "),r("p",[r("a",{attrs:{href:"/guide/index"}},[t._v("使用")])]),t._v(" "),r("h2",{attrs:{id:"在线提问"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#在线提问","aria-hidden":"true"}},[t._v("#")]),t._v(" 在线提问")]),t._v(" "),r("p",[r("img",{attrs:{src:i(111),alt:"Kuboard 兴趣群二维码"}})])])},[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[24],{111:function(t,a,i){t.exports=i.p+"assets/img/kuboard_qq.45e78dbf.png"},146:function(t,a,i){t.exports=i.p+"assets/img/image-20190716234146419.bd87cdff.png"},314:function(t,a,i){t.exports=i.p+"assets/img/image-20190723104717575.f44900d3.png"},375:function(t,a,i){"use strict";i.r(a);var r=i(0),e=Object(r.a)({},function(){var t=this,a=t.$createElement,r=t._self._c||a;return r("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[r("h2",{attrs:{id:"kuboard"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#kuboard","aria-hidden":"true"}},[t._v("#")]),t._v(" Kuboard")]),t._v(" "),r("p",[t._v("A cool Kubernetes dashboard.")]),t._v(" "),r("p",[t._v("Kuboard 可以有效降低 Kubernetes 初学者的学习门槛,对于有经验的用户,也是非常顺手的一款运维工具。已在多个项目中投产使用。")]),t._v(" "),r("p",[t._v("Kuboard 的主要特点:")]),t._v(" "),r("ul",[r("li",[t._v("场景化设计")]),t._v(" "),r("li",[t._v("微服务分层显示")]),t._v(" "),r("li",[t._v("微服务上下文监控")])]),t._v(" "),r("p",[r("img",{attrs:{src:i(146),alt:"image-20190716234146419"}})]),t._v(" "),r("h2",{attrs:{id:"demo"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#demo","aria-hidden":"true"}},[t._v("#")]),t._v(" Demo")]),t._v(" "),r("p",[r("a",{attrs:{href:"http://demo.eip.work/#/login?isReadOnly=true&token=eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJrdWJvYXJkLXZpZXdlci10b2tlbi02djZiZiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJrdWJvYXJkLXZpZXdlciIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjhiYTU3YmI1LWFiMTctNDM1NS1hNTM0LTQ0Njk4NGY0NzFlZiIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTprdWJvYXJkLXZpZXdlciJ9.DcXNIp0RKha1zkV4ga_QlGfcvMLGx2LOyzX-0VeboC3FojKFhxnfBeoda-zTeh6ugJlSM4kQYrRcof1Kx8Mg3-UgofNmgRySbDEVKtJZyMUoHqLmySKUIn8sbX8q83RNcqwcvY-fM8-w8HSuzU7Td7WWNuZrlCL4q_LQDYIBet1nlQ83YsENKNE8rsZQFDw8YM0MH6BEZLdwyhaboy_jjYbsU7kv8gks3aIX4lh1Fs9ZFQpC_6B0_MZvb7rEeG2M8QWXoUkDoL5JCKu6Wot5GlWf0kDMxIsViggP0NmSDTKh6kIvCkT2FZ2I4guEcjE_EjBpdOS6Abta22tzLlPKhg",target:"_blank",rel:"noopener noreferrer"}},[t._v("Kuboard 在线体验"),r("OutboundLink")],1),t._v("\n为保证环境的稳定性,在线 Demo 中只提供只读权限。"),r("span",{staticStyle:{color:"#F56C6C","font-weight":"500"}},[t._v("(请在PC浏览器中打开)")])]),t._v(" "),r("p",[r("a",{attrs:{target:"_blank",href:"http://demo.eip.work/#/login?isReadOnly=true&token=eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJrdWJvYXJkLXZpZXdlci10b2tlbi02djZiZiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJrdWJvYXJkLXZpZXdlciIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjhiYTU3YmI1LWFiMTctNDM1NS1hNTM0LTQ0Njk4NGY0NzFlZiIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTprdWJvYXJkLXZpZXdlciJ9.DcXNIp0RKha1zkV4ga_QlGfcvMLGx2LOyzX-0VeboC3FojKFhxnfBeoda-zTeh6ugJlSM4kQYrRcof1Kx8Mg3-UgofNmgRySbDEVKtJZyMUoHqLmySKUIn8sbX8q83RNcqwcvY-fM8-w8HSuzU7Td7WWNuZrlCL4q_LQDYIBet1nlQ83YsENKNE8rsZQFDw8YM0MH6BEZLdwyhaboy_jjYbsU7kv8gks3aIX4lh1Fs9ZFQpC_6B0_MZvb7rEeG2M8QWXoUkDoL5JCKu6Wot5GlWf0kDMxIsViggP0NmSDTKh6kIvCkT2FZ2I4guEcjE_EjBpdOS6Abta22tzLlPKhg"}},[r("img",{attrs:{src:i(314)}})])]),t._v(" "),r("h2",{attrs:{id:"getting-started"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#getting-started","aria-hidden":"true"}},[t._v("#")]),t._v(" Getting Started")]),t._v(" "),r("p",[r("a",{attrs:{href:"concepts"}},[t._v("如何降低K8S学习门槛"),r("span",{staticStyle:{color:"red"}},[t._v("(必读)")])])]),t._v(" "),r("p",[r("a",{attrs:{href:"/install/index"}},[t._v("安装")])]),t._v(" "),r("p",[r("a",{attrs:{href:"/guide/index"}},[t._v("使用")])]),t._v(" "),r("h2",{attrs:{id:"在线提问"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#在线提问","aria-hidden":"true"}},[t._v("#")]),t._v(" 在线提问")]),t._v(" "),r("p",[r("img",{attrs:{src:i(111),alt:"Kuboard 兴趣群二维码"}})])])},[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/31.f5fb3037.js b/docs/assets/js/31.fc5a4b53.js similarity index 96% rename from docs/assets/js/31.f5fb3037.js rename to docs/assets/js/31.fc5a4b53.js index 5b3a47e..6000e8c 100644 --- a/docs/assets/js/31.f5fb3037.js +++ b/docs/assets/js/31.fc5a4b53.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[31],{360:function(e,t,r){"use strict";r.r(t);var s=r(0),v=Object(s.a)({},function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[r("h1",{attrs:{id:"使用手册"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#使用手册","aria-hidden":"true"}},[e._v("#")]),e._v(" 使用手册")]),e._v(" "),r("p",[r("strong",[e._v("Kuboard 的设计目标")])]),e._v(" "),r("ul",[r("li",[e._v("降低 Kubernetes 学习门槛,让初学者先把 Kubernetes 用起来,再逐步理解 Kubernetes 中的各种概念")]),e._v(" "),r("li",[e._v("提高 Kubernetes 运维的便捷性,让资深 Kubernetes 运维人员脱离 kubectl 命令行,直接在 Kuboard 界面中完成日常运维工作")])]),e._v(" "),r("p",[r("strong",[e._v("熟悉 Kuboard 的最佳途径")])]),e._v(" "),r("ul",[r("li",[r("p",[e._v("创建一个最简单的工作负载")]),e._v(" "),r("p",[r("a",{attrs:{href:"example/busybox"}},[e._v("创建 busybox")])])]),e._v(" "),r("li",[r("p",[e._v("导入一套最简单的 Spring Cloud 微服务工作负载")]),e._v(" "),r("p",[r("a",{attrs:{href:"example/import"}},[e._v("导入 example")])])]),e._v(" "),r("li",[r("p",[e._v("根据微服务上下文查看监控结果")]),e._v(" "),r("p",[r("a",{attrs:{href:"example/monitor"}},[e._v("在微服务上下文中监控 example")])])])]),e._v(" "),r("p",[r("strong",[e._v("Kuboard 可用于")])]),e._v(" "),r("ul",[r("li",[e._v("管理 Kubernetes 集群")]),e._v(" "),r("li",[e._v("管理部署于 Kubernetes 的微服务")]),e._v(" "),r("li",[e._v("诊断集群中的问题")]),e._v(" "),r("li",[e._v("监控部署于 Kubernetes 的微服务")])])])},[],!1,null,null,null);t.default=v.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[31],{361:function(e,t,r){"use strict";r.r(t);var s=r(0),v=Object(s.a)({},function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[r("h1",{attrs:{id:"使用手册"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#使用手册","aria-hidden":"true"}},[e._v("#")]),e._v(" 使用手册")]),e._v(" "),r("p",[r("strong",[e._v("Kuboard 的设计目标")])]),e._v(" "),r("ul",[r("li",[e._v("降低 Kubernetes 学习门槛,让初学者先把 Kubernetes 用起来,再逐步理解 Kubernetes 中的各种概念")]),e._v(" "),r("li",[e._v("提高 Kubernetes 运维的便捷性,让资深 Kubernetes 运维人员脱离 kubectl 命令行,直接在 Kuboard 界面中完成日常运维工作")])]),e._v(" "),r("p",[r("strong",[e._v("熟悉 Kuboard 的最佳途径")])]),e._v(" "),r("ul",[r("li",[r("p",[e._v("创建一个最简单的工作负载")]),e._v(" "),r("p",[r("a",{attrs:{href:"example/busybox"}},[e._v("创建 busybox")])])]),e._v(" "),r("li",[r("p",[e._v("导入一套最简单的 Spring Cloud 微服务工作负载")]),e._v(" "),r("p",[r("a",{attrs:{href:"example/import"}},[e._v("导入 example")])])]),e._v(" "),r("li",[r("p",[e._v("根据微服务上下文查看监控结果")]),e._v(" "),r("p",[r("a",{attrs:{href:"example/monitor"}},[e._v("在微服务上下文中监控 example")])])])]),e._v(" "),r("p",[r("strong",[e._v("Kuboard 可用于")])]),e._v(" "),r("ul",[r("li",[e._v("管理 Kubernetes 集群")]),e._v(" "),r("li",[e._v("管理部署于 Kubernetes 的微服务")]),e._v(" "),r("li",[e._v("诊断集群中的问题")]),e._v(" "),r("li",[e._v("监控部署于 Kubernetes 的微服务")])])])},[],!1,null,null,null);t.default=v.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/33.823e968d.js b/docs/assets/js/33.b07c1dd9.js similarity index 92% rename from docs/assets/js/33.823e968d.js rename to docs/assets/js/33.b07c1dd9.js index 647b794..5956d71 100644 --- a/docs/assets/js/33.823e968d.js +++ b/docs/assets/js/33.b07c1dd9.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[33],{355:function(t,e,a){"use strict";a.r(e);var r=a(0),l=Object(r.a)({},function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"监控套件"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#监控套件","aria-hidden":"true"}},[t._v("#")]),t._v(" 监控套件")]),t._v(" "),a("p",[t._v("文档建设中...")]),t._v(" "),a("blockquote",[a("ul",[a("li",[t._v("请参考 "),a("a",{attrs:{href:"/guide/example/monitor"}},[t._v("监控 example (alpha)")]),t._v(" 体验 Kuboard 在监控套件方面的设想")]),t._v(" "),a("li",[t._v("监控套件以插件的形式整合到 Kuboard,在不使用监控套件的情况下,Kuboard 的所有功能都可正常工作")])])])])},[],!1,null,null,null);e.default=l.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[33],{357:function(t,e,a){"use strict";a.r(e);var r=a(0),l=Object(r.a)({},function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"监控套件"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#监控套件","aria-hidden":"true"}},[t._v("#")]),t._v(" 监控套件")]),t._v(" "),a("p",[t._v("文档建设中...")]),t._v(" "),a("blockquote",[a("ul",[a("li",[t._v("请参考 "),a("a",{attrs:{href:"/guide/example/monitor"}},[t._v("监控 example (alpha)")]),t._v(" 体验 Kuboard 在监控套件方面的设想")]),t._v(" "),a("li",[t._v("监控套件以插件的形式整合到 Kuboard,在不使用监控套件的情况下,Kuboard 的所有功能都可正常工作")])])])])},[],!1,null,null,null);e.default=l.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/34.3b288482.js b/docs/assets/js/34.0e81432c.js similarity index 92% rename from docs/assets/js/34.3b288482.js rename to docs/assets/js/34.0e81432c.js index 8757b96..30b2016 100644 --- a/docs/assets/js/34.3b288482.js +++ b/docs/assets/js/34.0e81432c.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[34],{358:function(t,e,a){"use strict";a.r(e);var r=a(0),l=Object(r.a)({},function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"自定义监控套件"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#自定义监控套件","aria-hidden":"true"}},[t._v("#")]),t._v(" 自定义监控套件")]),t._v(" "),a("p",[t._v("文档建设中...")]),t._v(" "),a("blockquote",[a("ul",[a("li",[t._v("请参考 "),a("a",{attrs:{href:"/guide/example/monitor"}},[t._v("监控 example (alpha)")]),t._v(" 体验 Kuboard 在监控套件方面的设想")]),t._v(" "),a("li",[t._v("监控套件以插件的形式整合到 Kuboard,在不使用监控套件的情况下,Kuboard 的所有功能都可正常工作")])])])])},[],!1,null,null,null);e.default=l.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[34],{355:function(t,e,a){"use strict";a.r(e);var r=a(0),l=Object(r.a)({},function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"自定义监控套件"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#自定义监控套件","aria-hidden":"true"}},[t._v("#")]),t._v(" 自定义监控套件")]),t._v(" "),a("p",[t._v("文档建设中...")]),t._v(" "),a("blockquote",[a("ul",[a("li",[t._v("请参考 "),a("a",{attrs:{href:"/guide/example/monitor"}},[t._v("监控 example (alpha)")]),t._v(" 体验 Kuboard 在监控套件方面的设想")]),t._v(" "),a("li",[t._v("监控套件以插件的形式整合到 Kuboard,在不使用监控套件的情况下,Kuboard 的所有功能都可正常工作")])])])])},[],!1,null,null,null);e.default=l.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/35.6d4bbc2f.js b/docs/assets/js/35.ad36ca26.js similarity index 96% rename from docs/assets/js/35.6d4bbc2f.js rename to docs/assets/js/35.ad36ca26.js index 7b7eb95..2a851aa 100644 --- a/docs/assets/js/35.6d4bbc2f.js +++ b/docs/assets/js/35.ad36ca26.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[35],{369:function(a,t,r){"use strict";r.r(t);var e=r(0),s=Object(e.a)({},function(){var a=this,t=a.$createElement,r=a._self._c||t;return r("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[r("h1",{attrs:{id:"应用管理"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#应用管理","aria-hidden":"true"}},[a._v("#")]),a._v(" 应用管理")]),a._v(" "),r("h2",{attrs:{id:"创建工作负载"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#创建工作负载","aria-hidden":"true"}},[a._v("#")]),a._v(" 创建工作负载")]),a._v(" "),r("h2",{attrs:{id:"删除工作负载"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#删除工作负载","aria-hidden":"true"}},[a._v("#")]),a._v(" 删除工作负载")]),a._v(" "),r("h2",{attrs:{id:"伸缩"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#伸缩","aria-hidden":"true"}},[a._v("#")]),a._v(" 伸缩")]),a._v(" "),r("h2",{attrs:{id:"升级工作负载版本"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#升级工作负载版本","aria-hidden":"true"}},[a._v("#")]),a._v(" 升级工作负载版本")]),a._v(" "),r("h2",{attrs:{id:"环境迁移"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#环境迁移","aria-hidden":"true"}},[a._v("#")]),a._v(" 环境迁移")]),a._v(" "),r("h3",{attrs:{id:"导出"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#导出","aria-hidden":"true"}},[a._v("#")]),a._v(" 导出")]),a._v(" "),r("h3",{attrs:{id:"导入"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#导入","aria-hidden":"true"}},[a._v("#")]),a._v(" 导入")])])},[],!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[35],{370:function(a,t,r){"use strict";r.r(t);var e=r(0),s=Object(e.a)({},function(){var a=this,t=a.$createElement,r=a._self._c||t;return r("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[r("h1",{attrs:{id:"应用管理"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#应用管理","aria-hidden":"true"}},[a._v("#")]),a._v(" 应用管理")]),a._v(" "),r("h2",{attrs:{id:"创建工作负载"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#创建工作负载","aria-hidden":"true"}},[a._v("#")]),a._v(" 创建工作负载")]),a._v(" "),r("h2",{attrs:{id:"删除工作负载"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#删除工作负载","aria-hidden":"true"}},[a._v("#")]),a._v(" 删除工作负载")]),a._v(" "),r("h2",{attrs:{id:"伸缩"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#伸缩","aria-hidden":"true"}},[a._v("#")]),a._v(" 伸缩")]),a._v(" "),r("h2",{attrs:{id:"升级工作负载版本"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#升级工作负载版本","aria-hidden":"true"}},[a._v("#")]),a._v(" 升级工作负载版本")]),a._v(" "),r("h2",{attrs:{id:"环境迁移"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#环境迁移","aria-hidden":"true"}},[a._v("#")]),a._v(" 环境迁移")]),a._v(" "),r("h3",{attrs:{id:"导出"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#导出","aria-hidden":"true"}},[a._v("#")]),a._v(" 导出")]),a._v(" "),r("h3",{attrs:{id:"导入"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#导入","aria-hidden":"true"}},[a._v("#")]),a._v(" 导入")])])},[],!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/36.79893dad.js b/docs/assets/js/36.3cb7735a.js similarity index 98% rename from docs/assets/js/36.79893dad.js rename to docs/assets/js/36.3cb7735a.js index d9ff283..405e13d 100644 --- a/docs/assets/js/36.79893dad.js +++ b/docs/assets/js/36.3cb7735a.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[36],{372:function(e,r,s){"use strict";s.r(r);var t=s(0),a=Object(t.a)({},function(){var e=this,r=e.$createElement,s=e._self._c||r;return s("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[s("h2",{attrs:{id:"安装-ingress-controller"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#安装-ingress-controller","aria-hidden":"true"}},[e._v("#")]),e._v(" 安装 Ingress Controller")]),e._v(" "),s("blockquote",[s("p",[e._v("ingress官方文档:https://kubernetes.io/docs/concepts/services-networking/ingress/")]),e._v(" "),s("p",[e._v("Ingress Controllers官网介绍:"),s("a",{attrs:{href:"https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/"),s("OutboundLink")],1)]),e._v(" "),s("p",[e._v("本文中使用如下部署方式:https://kubernetes.github.io/ingress-nginx/deploy/baremetal/#using-a-self-provisioned-edge")]),e._v(" "),s("p",[e._v("kubernetes支持多种Ingress Controllers,本文推荐使用")]),e._v(" "),s("p",[e._v("https://github.com/nginxinc/kubernetes-ingress")])]),e._v(" "),s("h3",{attrs:{id:"在-apple-master-a-1-上执行"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#在-apple-master-a-1-上执行","aria-hidden":"true"}},[e._v("#")]),e._v(" 在 apple-master-a-1 上执行")]),e._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" - gitlab-runner\nkubectl apply -f https://raw.githubusercontent.com/eip-work/eip-monitor-repository/master/dashboard/nginx-ingress.yaml\n")])])]),s("h3",{attrs:{id:"在iaas云控制台完成如下配置(公网elb)"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#在iaas云控制台完成如下配置(公网elb)","aria-hidden":"true"}},[e._v("#")]),e._v(" 在IaaS云控制台完成如下配置("),s("strong",[e._v("公网ELB")]),e._v(")")]),e._v(" "),s("p",[e._v("创建负载均衡 ELB:")]),e._v(" "),s("p",[e._v("​ 监听器 1:80 / TCP, SOURCE_ADDRESS 会话保持")]),e._v(" "),s("p",[e._v("​ 服务器资源池 1: apple-worker-x-x 的所有节点的 80端口")]),e._v(" "),s("p",[e._v("​ 监听器 2:443 / TCP, SOURCE_ADDRESS 会话保持")]),e._v(" "),s("p",[e._v("​ 服务器资源池 2: apple-worker-x-x 的所有节点的443端口")]),e._v(" "),s("p",[e._v("假设刚创建的负载均衡 ELB 的 IP 地址为: z.z.z.z")]),e._v(" "),s("h3",{attrs:{id:"配置域名解析"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置域名解析","aria-hidden":"true"}},[e._v("#")]),e._v(" 配置域名解析")]),e._v(" "),s("p",[e._v("将域名 *.apple.yourdomain.com 解析到地址负载均衡服务器 的 IP 地址 z.z.z.z")]),e._v(" "),s("h3",{attrs:{id:"验证配置"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#验证配置","aria-hidden":"true"}},[e._v("#")]),e._v(" 验证配置")]),e._v(" "),s("p",[e._v("在浏览器访问 a.apple.yourdomain.com,将得到 404 NotFound 错误页面")])])},[],!1,null,null,null);r.default=a.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[36],{376:function(e,r,s){"use strict";s.r(r);var t=s(0),a=Object(t.a)({},function(){var e=this,r=e.$createElement,s=e._self._c||r;return s("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[s("h2",{attrs:{id:"安装-ingress-controller"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#安装-ingress-controller","aria-hidden":"true"}},[e._v("#")]),e._v(" 安装 Ingress Controller")]),e._v(" "),s("blockquote",[s("p",[e._v("ingress官方文档:https://kubernetes.io/docs/concepts/services-networking/ingress/")]),e._v(" "),s("p",[e._v("Ingress Controllers官网介绍:"),s("a",{attrs:{href:"https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/"),s("OutboundLink")],1)]),e._v(" "),s("p",[e._v("本文中使用如下部署方式:https://kubernetes.github.io/ingress-nginx/deploy/baremetal/#using-a-self-provisioned-edge")]),e._v(" "),s("p",[e._v("kubernetes支持多种Ingress Controllers,本文推荐使用")]),e._v(" "),s("p",[e._v("https://github.com/nginxinc/kubernetes-ingress")])]),e._v(" "),s("h3",{attrs:{id:"在-apple-master-a-1-上执行"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#在-apple-master-a-1-上执行","aria-hidden":"true"}},[e._v("#")]),e._v(" 在 apple-master-a-1 上执行")]),e._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" - gitlab-runner\nkubectl apply -f https://raw.githubusercontent.com/eip-work/eip-monitor-repository/master/dashboard/nginx-ingress.yaml\n")])])]),s("h3",{attrs:{id:"在iaas云控制台完成如下配置(公网elb)"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#在iaas云控制台完成如下配置(公网elb)","aria-hidden":"true"}},[e._v("#")]),e._v(" 在IaaS云控制台完成如下配置("),s("strong",[e._v("公网ELB")]),e._v(")")]),e._v(" "),s("p",[e._v("创建负载均衡 ELB:")]),e._v(" "),s("p",[e._v("​ 监听器 1:80 / TCP, SOURCE_ADDRESS 会话保持")]),e._v(" "),s("p",[e._v("​ 服务器资源池 1: apple-worker-x-x 的所有节点的 80端口")]),e._v(" "),s("p",[e._v("​ 监听器 2:443 / TCP, SOURCE_ADDRESS 会话保持")]),e._v(" "),s("p",[e._v("​ 服务器资源池 2: apple-worker-x-x 的所有节点的443端口")]),e._v(" "),s("p",[e._v("假设刚创建的负载均衡 ELB 的 IP 地址为: z.z.z.z")]),e._v(" "),s("h3",{attrs:{id:"配置域名解析"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置域名解析","aria-hidden":"true"}},[e._v("#")]),e._v(" 配置域名解析")]),e._v(" "),s("p",[e._v("将域名 *.apple.yourdomain.com 解析到地址负载均衡服务器 的 IP 地址 z.z.z.z")]),e._v(" "),s("h3",{attrs:{id:"验证配置"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#验证配置","aria-hidden":"true"}},[e._v("#")]),e._v(" 验证配置")]),e._v(" "),s("p",[e._v("在浏览器访问 a.apple.yourdomain.com,将得到 404 NotFound 错误页面")])])},[],!1,null,null,null);r.default=a.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/37.20254ec8.js b/docs/assets/js/37.20254ec8.js deleted file mode 100644 index c4cfe73..0000000 --- a/docs/assets/js/37.20254ec8.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[37],{377:function(t,e,a){"use strict";a.r(e);var s=a(0),r=Object(s.a)({},function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"安装-kuboard"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#安装-kuboard","aria-hidden":"true"}},[t._v("#")]),t._v(" 安装 kuboard")]),t._v(" "),a("h2",{attrs:{id:"前提"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#前提","aria-hidden":"true"}},[t._v("#")]),t._v(" 前提")]),t._v(" "),a("p",[t._v("安装 kuboard 时,假设您已经:")]),t._v(" "),a("ul",[a("li",[t._v("已经有一个 kubernetes 集群")]),t._v(" "),a("li",[t._v("拥有对该 kubernetes 集群执行 kubectl 命令时的所有权限")])]),t._v(" "),a("p",[t._v("如果没有 kubernetes 集群,可以有如下选项:")]),t._v(" "),a("ul",[a("li",[t._v("通过 阿里云 创建 kubernetes 容器服务,并获得和配置 kubectl 的访问参数")]),t._v(" "),a("li",[t._v("参考 "),a("a",{attrs:{href:"install-k8s"}},[t._v("安装 kubernetes 用于测试")])]),t._v(" "),a("li",[t._v("或参考 "),a("a",{attrs:{href:"install-kubernetes"}},[t._v("安装 kubernetes 高可用")])])]),t._v(" "),a("p",[a("a",{attrs:{href:"https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=obezo3pg",target:"_blank",rel:"noopener noreferrer"}},[t._v("领取阿里云最高2000元红包"),a("OutboundLink")],1)]),t._v(" "),a("h2",{attrs:{id:"兼容性"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#兼容性","aria-hidden":"true"}},[t._v("#")]),t._v(" 兼容性")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Kubernetes 版本")]),t._v(" "),a("th",[t._v("Kuboard 版本")]),t._v(" "),a("th",[t._v("兼容性")]),t._v(" "),a("th",[t._v("说明")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[t._v("v1.15")]),t._v(" "),a("td",[t._v("v1.0.0-beta.10")]),t._v(" "),a("td",[a("span",{staticStyle:{"font-size":"24px"}},[t._v("😄")])]),t._v(" "),a("td",[t._v("已验证")])]),t._v(" "),a("tr",[a("td",[t._v("v1.14")]),t._v(" "),a("td",[t._v("v1.0.0-beta.10")]),t._v(" "),a("td",[a("span",{staticStyle:{"font-size":"24px"}},[t._v("😄")])]),t._v(" "),a("td",[t._v("已验证")])]),t._v(" "),a("tr",[a("td",[t._v("v1.13")]),t._v(" "),a("td",[t._v("v1.0.0-beta.10")]),t._v(" "),a("td",[a("span",{staticStyle:{"font-size":"24px"}},[t._v("😄")])]),t._v(" "),a("td",[t._v("已验证")])]),t._v(" "),a("tr",[a("td",[t._v("v1.12")]),t._v(" "),a("td",[t._v("v1.0.0-beta.10")]),t._v(" "),a("td",[a("span",{staticStyle:{"font-size":"24px"}},[t._v("😐")])]),t._v(" "),a("td",[t._v("Kubernetes Api v1.12 尚不支持 dryRun,"),a("br"),t._v("忽略Kuboard在执行命令时的参数校验错误,可正常工作")])]),t._v(" "),a("tr",[a("td",[t._v("v1.11")]),t._v(" "),a("td",[t._v("v1.0.0-beta.10")]),t._v(" "),a("td",[a("span",{staticStyle:{"font-size":"24px"}},[t._v("😐")])]),t._v(" "),a("td",[t._v("同上")])])])]),t._v(" "),a("div",{staticClass:"warning custom-block"},[a("p",[a("strong",[t._v("Kubernetes 安装方式")])]),t._v(" "),a("ul",[a("li",[t._v("部分用户使用二进制包的形式安装 Kubernetes,Kuboard 现在的版本不能在这类 Kubernetes 集群中正常工作,作者正在解决此问题。")]),t._v(" "),a("li",[t._v("如果您是使用 kubeadm 安装的 Kubernetes 集群(Kubernetes 官方推荐的安装方式),请放心使用 Kuboard。")]),t._v(" "),a("li",[t._v("Kubeadm 相关资料请参考 https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/")])])]),t._v(" "),a("h2",{attrs:{id:"安装"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#安装","aria-hidden":"true"}},[t._v("#")]),t._v(" 安装")]),t._v(" "),a("p",[a("strong",[t._v("获取并修改yaml文件")])]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("wget")]),t._v(" https://raw.githubusercontent.com/eip-work/eip-monitor-repository/master/dashboard/kuboard.yaml\n")])])]),a("p",[t._v("修改文件 kuboard.yaml 中 Ingress 的 host 为 kuboard.yourclustername.yourdomain.com")]),t._v(" "),a("p",[a("strong",[t._v("执行安装")])]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[t._v("kubectl apply -f kuboard.yaml \n")])])]),a("h2",{attrs:{id:"获取-token"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#获取-token","aria-hidden":"true"}},[t._v("#")]),t._v(" 获取 token")]),t._v(" "),a("p",[t._v("您可以获得管理员用户、只读用户的Token")]),t._v(" "),a("Tabs",{attrs:{type:"border-card"}},[a("Tab",{attrs:{label:"管理员用户",lazy:""}},[a("p",[a("strong",[t._v("拥有的权限")])]),t._v(" "),a("ul",[a("li",[t._v("此Token拥有 ClusterAdmin 的权限,可以执行所有操作")])]),t._v(" "),a("p",[a("strong",[t._v("执行命令")])]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[t._v("kubectl -n kube-system describe secret "),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$(")]),t._v("kubectl -n kube-system get secret "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("grep")]),t._v(" kuboard-user "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("awk")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'{print "),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$1")]),t._v("}'")]),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v(")")])]),t._v(" \n")])])]),a("p",[a("strong",[t._v("输出")])]),t._v(" "),a("p",[t._v("取输出信息中 token 字段")]),t._v(" "),a("div",{staticClass:"language- extra-class"},[a("div",{staticClass:"highlight-lines"},[a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("div",{staticClass:"highlighted"},[t._v(" ")]),a("br")]),a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v("Name: admin-user-token-g8hxb\nNamespace: kube-system\nLabels: \nAnnotations: [kubernetes.io/service-account.name](http://kubernetes.io/service-account.name): kuboard-user\n[kubernetes.io/service-account.uid](http://kubernetes.io/service-account.uid): 948bb5e6-8cdc-11e9-b67e-fa163e5f7a0f\n\nType: [kubernetes.io/service-account-token](http://kubernetes.io/service-account-token)\n\nData\n====\nca.crt: 1025 bytes\nnamespace: 11 bytes\ntoken: eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLWc4aHhiIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiI5NDhiYjVlNi04Y2RjLTExZTktYjY3ZS1mYTE2M2U1ZjdhMGYiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06YWRtaW4tdXNlciJ9.DZ6dMTr8GExo5IH_vCWdB_MDfQaNognjfZKl0E5VW8vUFMVvALwo0BS-6Qsqpfxrlz87oE9yGVCpBYV0D00811bLhHIg-IR_MiBneadcqdQ_TGm_a0Pz0RbIzqJlRPiyMSxk1eXhmayfPn01upPdVCQj6D3vAY77dpcGplu3p5wE6vsNWAvrQ2d_V1KhR03IB1jJZkYwrI8FHCq_5YuzkPfHsgZ9MBQgH-jqqNXs6r8aoUZIbLsYcMHkin2vzRsMy_tjMCI9yXGiOqI-E5efTb-_KbDVwV5cbdqEIegdtYZ2J3mlrFQlmPGYTwFI8Ba9LleSYbCi4o0k74568KcN_w\n")])])])]),t._v(" "),a("Tab",{attrs:{label:"只读用户",lazy:""}},[a("p",[a("strong",[t._v("拥有的权限")])]),t._v(" "),a("ul",[a("li",[t._v("view 可查看名称空间的内容")]),t._v(" "),a("li",[t._v("system:node 可查看节点信息")]),t._v(" "),a("li",[t._v("system:persistent-volume-provisioner 可查看存储类和存储卷声明的信息")])]),t._v(" "),a("p",[a("strong",[t._v("适用场景")])]),t._v(" "),a("p",[t._v("只读用户不能对集群的配置执行修改操作,非常适用于将开发环境中的 kuboard 只读权限分发给开发者,以便开发者可以便捷地诊断问题")]),t._v(" "),a("p",[a("strong",[t._v("执行命令")])]),t._v(" "),a("p",[t._v("执行如下命令可以获得 "),a("span",{staticStyle:{color:"#F56C6C","font-weight":"500"}},[t._v("只读用户")]),t._v(" 的 Token")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[t._v("kubectl -n kube-system describe secret "),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$(")]),t._v("kubectl -n kube-system get secret "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("grep")]),t._v(" kuboard-viewer "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("awk")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'{print "),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$1")]),t._v("}'")]),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v(")")])]),t._v(" \n")])])]),a("p",[a("strong",[t._v("输出")])]),t._v(" "),a("p",[t._v("取输出信息中 token 字段")]),t._v(" "),a("div",{staticClass:"language- extra-class"},[a("div",{staticClass:"highlight-lines"},[a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("div",{staticClass:"highlighted"},[t._v(" ")]),a("br")]),a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v("Name: admin-user-token-g8hxb\nNamespace: kube-system\nLabels: \nAnnotations: [kubernetes.io/service-account.name](http://kubernetes.io/service-account.name): kuboard-viewer\n[kubernetes.io/service-account.uid](http://kubernetes.io/service-account.uid): 948bb5e6-8cdc-11e9-b67e-fa163e5f7a0f\n\nType: [kubernetes.io/service-account-token](http://kubernetes.io/service-account-token)\n\nData\n====\nca.crt: 1025 bytes\nnamespace: 11 bytes\ntoken: eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLWc4aHhiIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiI5NDhiYjVlNi04Y2RjLTExZTktYjY3ZS1mYTE2M2U1ZjdhMGYiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06YWRtaW4tdXNlciJ9.DZ6dMTr8GExo5IH_vCWdB_MDfQaNognjfZKl0E5VW8vUFMVvALwo0BS-6Qsqpfxrlz87oE9yGVCpBYV0D00811bLhHIg-IR_MiBneadcqdQ_TGm_a0Pz0RbIzqJlRPiyMSxk1eXhmayfPn01upPdVCQj6D3vAY77dpcGplu3p5wE6vsNWAvrQ2d_V1KhR03IB1jJZkYwrI8FHCq_5YuzkPfHsgZ9MBQgH-jqqNXs6r8aoUZIbLsYcMHkin2vzRsMy_tjMCI9yXGiOqI-E5efTb-_KbDVwV5cbdqEIegdtYZ2J3mlrFQlmPGYTwFI8Ba9LleSYbCi4o0k74568KcN_w\n")])])])])],1),t._v(" "),a("h2",{attrs:{id:"访问-kuboard"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#访问-kuboard","aria-hidden":"true"}},[t._v("#")]),t._v(" 访问 Kuboard")]),t._v(" "),a("p",[t._v("您可以通过NodePort、Port-forward、域名三种方式访问 Kuboard")]),t._v(" "),a("Tabs",{attrs:{type:"border-card"}},[a("Tab",{attrs:{label:"通过NodePort访问",lazy:""}},[a("p",[t._v("kuboard Service 使用了 NodePort 的方式暴露服务,NodePort 为 32567;您可以按如下方式访问 kuboard。(可以使用集群中任意节点的 IP 地址)")]),t._v(" "),a("p",[a("code",[t._v("http://any-of-your-node-ip:32567/")])]),t._v(" "),a("p",[t._v("输入前一步骤中获得的 token,可进入控制台界面")]),t._v(" "),a("div",{staticClass:"tip custom-block"},[a("p",[t._v("您也可以修改 kuboard.yaml 文件,使用自己定义的 NodePort 端口号")])])]),t._v(" "),a("Tab",{attrs:{label:"通过port-forward访问",lazy:""}},[a("p",[t._v("在您的客户端电脑中执行如下命令")]),t._v(" "),a("div",{staticClass:"language-sh extra-class"},[a("pre",{pre:!0,attrs:{class:"language-sh"}},[a("code",[t._v("kubectl port-forward service/kuboard "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("8080")]),t._v(":80 -n kube-system\n")])])]),a("p",[t._v("在浏览器打开链接 (请使用 kubectl 所在机器的IP地址)")]),t._v(" "),a("p",[a("code",[t._v("http://localhost:8080")])]),t._v(" "),a("div",{staticClass:"tip custom-block"},[a("p",[t._v("需要您自行设定 kubectl 的配置")])])]),t._v(" "),a("Tab",{attrs:{label:"通过域名访问",lazy:""}},[a("p",[t._v("在浏览器打开链接 (请使用前面已修改的域名)")]),t._v(" "),a("p",[a("code",[t._v("http://kuboard.yourclustername.yourdomain.com")])]),t._v(" "),a("p",[t._v("输入前一步骤中获得的 token,可进入控制台界面")]),t._v(" "),a("div",{staticClass:"tip custom-block"},[a("p",[t._v("需要您")]),t._v(" "),a("ul",[a("li",[t._v("正确安装 Ingress Controller")]),t._v(" "),a("li",[t._v("将您所使用的域名指向 Kubernetes 中的一个 Worker 节点(或者Ingress Controller所在机器的IP,不同类型的Ingress Controller配置不同)")])])])])],1)],1)},[],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/37.4fb05979.js b/docs/assets/js/37.4fb05979.js new file mode 100644 index 0000000..c2d9697 --- /dev/null +++ b/docs/assets/js/37.4fb05979.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[37],{377:function(t,e,a){"use strict";a.r(e);var s=a(0),r=Object(s.a)({},function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"安装-kuboard"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#安装-kuboard","aria-hidden":"true"}},[t._v("#")]),t._v(" 安装 Kuboard")]),t._v(" "),a("h2",{attrs:{id:"前提"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#前提","aria-hidden":"true"}},[t._v("#")]),t._v(" 前提")]),t._v(" "),a("p",[t._v("安装 Kuboard 时,假设您已经:")]),t._v(" "),a("ul",[a("li",[t._v("已经有一个 Kubernetes 集群")]),t._v(" "),a("li",[t._v("拥有对该 Kubernetes 集群执行 kubectl 命令时的所有权限")])]),t._v(" "),a("p",[t._v("如果没有 Kubernetes 集群,可以有如下选项:")]),t._v(" "),a("ul",[a("li",[t._v("通过 阿里云 创建 Kubernetes 容器服务,并获得和配置 kubectl 的访问参数")]),t._v(" "),a("li",[t._v("参考 "),a("a",{attrs:{href:"install-k8s"}},[t._v("安装 Kubernetes 单 Master 节点")])]),t._v(" "),a("li",[t._v("或参考 "),a("a",{attrs:{href:"install-kubernetes"}},[t._v("安装 Kubernetes 高可用")])])]),t._v(" "),a("p",[a("a",{attrs:{href:"https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=obezo3pg",target:"_blank",rel:"noopener noreferrer"}},[t._v("领取阿里云最高2000元红包"),a("OutboundLink")],1)]),t._v(" "),a("h2",{attrs:{id:"兼容性"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#兼容性","aria-hidden":"true"}},[t._v("#")]),t._v(" 兼容性")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Kubernetes 版本")]),t._v(" "),a("th",[t._v("Kuboard 版本")]),t._v(" "),a("th",[t._v("兼容性")]),t._v(" "),a("th",[t._v("说明")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[t._v("v1.15")]),t._v(" "),a("td",[t._v("v1.0.0-beta.10")]),t._v(" "),a("td",[a("span",{staticStyle:{"font-size":"24px"}},[t._v("😄")])]),t._v(" "),a("td",[t._v("已验证")])]),t._v(" "),a("tr",[a("td",[t._v("v1.14")]),t._v(" "),a("td",[t._v("v1.0.0-beta.10")]),t._v(" "),a("td",[a("span",{staticStyle:{"font-size":"24px"}},[t._v("😄")])]),t._v(" "),a("td",[t._v("已验证")])]),t._v(" "),a("tr",[a("td",[t._v("v1.13")]),t._v(" "),a("td",[t._v("v1.0.0-beta.10")]),t._v(" "),a("td",[a("span",{staticStyle:{"font-size":"24px"}},[t._v("😄")])]),t._v(" "),a("td",[t._v("已验证")])]),t._v(" "),a("tr",[a("td",[t._v("v1.12")]),t._v(" "),a("td",[t._v("v1.0.0-beta.10")]),t._v(" "),a("td",[a("span",{staticStyle:{"font-size":"24px"}},[t._v("😐")])]),t._v(" "),a("td",[t._v("Kubernetes Api v1.12 尚不支持 dryRun,"),a("br"),t._v("忽略Kuboard在执行命令时的参数校验错误,可正常工作")])]),t._v(" "),a("tr",[a("td",[t._v("v1.11")]),t._v(" "),a("td",[t._v("v1.0.0-beta.10")]),t._v(" "),a("td",[a("span",{staticStyle:{"font-size":"24px"}},[t._v("😐")])]),t._v(" "),a("td",[t._v("同上")])])])]),t._v(" "),a("div",{staticClass:"warning custom-block"},[a("p",[a("strong",[t._v("Kubernetes 安装方式")])]),t._v(" "),a("ul",[a("li",[t._v("部分用户使用二进制包的形式安装 Kubernetes,Kuboard 现在的版本不能在这类 Kubernetes 集群中正常工作,作者正在解决此问题。")]),t._v(" "),a("li",[t._v("如果您是使用 kubeadm 安装的 Kubernetes 集群(Kubernetes 官方推荐的安装方式),请放心使用 Kuboard。")]),t._v(" "),a("li",[t._v("Kubeadm 相关资料请参考 https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/")])])]),t._v(" "),a("h2",{attrs:{id:"安装"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#安装","aria-hidden":"true"}},[t._v("#")]),t._v(" 安装")]),t._v(" "),a("p",[a("strong",[t._v("获取并修改yaml文件")])]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("wget")]),t._v(" https://raw.githubusercontent.com/eip-work/eip-monitor-repository/master/dashboard/Kuboard.yaml\n")])])]),a("p",[t._v("修改文件 Kuboard.yaml 中 Ingress 的 host 为 Kuboard.yourclustername.yourdomain.com")]),t._v(" "),a("p",[a("strong",[t._v("执行安装")])]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[t._v("kubectl apply -f Kuboard.yaml \n")])])]),a("h2",{attrs:{id:"获取-token"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#获取-token","aria-hidden":"true"}},[t._v("#")]),t._v(" 获取 token")]),t._v(" "),a("p",[t._v("您可以获得管理员用户、只读用户的Token")]),t._v(" "),a("Tabs",{attrs:{type:"border-card"}},[a("Tab",{attrs:{label:"管理员用户",lazy:""}},[a("p",[a("strong",[t._v("拥有的权限")])]),t._v(" "),a("ul",[a("li",[t._v("此Token拥有 ClusterAdmin 的权限,可以执行所有操作")])]),t._v(" "),a("p",[a("strong",[t._v("执行命令")])]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[t._v("kubectl -n kube-system describe secret "),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$(")]),t._v("kubectl -n kube-system get secret "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("grep")]),t._v(" Kuboard-user "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("awk")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'{print "),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$1")]),t._v("}'")]),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v(")")])]),t._v(" \n")])])]),a("p",[a("strong",[t._v("输出")])]),t._v(" "),a("p",[t._v("取输出信息中 token 字段")]),t._v(" "),a("div",{staticClass:"language- extra-class"},[a("div",{staticClass:"highlight-lines"},[a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("div",{staticClass:"highlighted"},[t._v(" ")]),a("br")]),a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v("Name: admin-user-token-g8hxb\nNamespace: kube-system\nLabels: \nAnnotations: [kubernetes.io/service-account.name](http://kubernetes.io/service-account.name): Kuboard-user\n[kubernetes.io/service-account.uid](http://kubernetes.io/service-account.uid): 948bb5e6-8cdc-11e9-b67e-fa163e5f7a0f\n\nType: [kubernetes.io/service-account-token](http://kubernetes.io/service-account-token)\n\nData\n====\nca.crt: 1025 bytes\nnamespace: 11 bytes\ntoken: eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLWc4aHhiIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiI5NDhiYjVlNi04Y2RjLTExZTktYjY3ZS1mYTE2M2U1ZjdhMGYiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06YWRtaW4tdXNlciJ9.DZ6dMTr8GExo5IH_vCWdB_MDfQaNognjfZKl0E5VW8vUFMVvALwo0BS-6Qsqpfxrlz87oE9yGVCpBYV0D00811bLhHIg-IR_MiBneadcqdQ_TGm_a0Pz0RbIzqJlRPiyMSxk1eXhmayfPn01upPdVCQj6D3vAY77dpcGplu3p5wE6vsNWAvrQ2d_V1KhR03IB1jJZkYwrI8FHCq_5YuzkPfHsgZ9MBQgH-jqqNXs6r8aoUZIbLsYcMHkin2vzRsMy_tjMCI9yXGiOqI-E5efTb-_KbDVwV5cbdqEIegdtYZ2J3mlrFQlmPGYTwFI8Ba9LleSYbCi4o0k74568KcN_w\n")])])])]),t._v(" "),a("Tab",{attrs:{label:"只读用户",lazy:""}},[a("p",[a("strong",[t._v("拥有的权限")])]),t._v(" "),a("ul",[a("li",[t._v("view 可查看名称空间的内容")]),t._v(" "),a("li",[t._v("system:node 可查看节点信息")]),t._v(" "),a("li",[t._v("system:persistent-volume-provisioner 可查看存储类和存储卷声明的信息")])]),t._v(" "),a("p",[a("strong",[t._v("适用场景")])]),t._v(" "),a("p",[t._v("只读用户不能对集群的配置执行修改操作,非常适用于将开发环境中的 Kuboard 只读权限分发给开发者,以便开发者可以便捷地诊断问题")]),t._v(" "),a("p",[a("strong",[t._v("执行命令")])]),t._v(" "),a("p",[t._v("执行如下命令可以获得 "),a("span",{staticStyle:{color:"#F56C6C","font-weight":"500"}},[t._v("只读用户")]),t._v(" 的 Token")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[t._v("kubectl -n kube-system describe secret "),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$(")]),t._v("kubectl -n kube-system get secret "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("grep")]),t._v(" Kuboard-viewer "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("awk")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'{print "),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$1")]),t._v("}'")]),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v(")")])]),t._v(" \n")])])]),a("p",[a("strong",[t._v("输出")])]),t._v(" "),a("p",[t._v("取输出信息中 token 字段")]),t._v(" "),a("div",{staticClass:"language- extra-class"},[a("div",{staticClass:"highlight-lines"},[a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("div",{staticClass:"highlighted"},[t._v(" ")]),a("br")]),a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v("Name: admin-user-token-g8hxb\nNamespace: kube-system\nLabels: \nAnnotations: [kubernetes.io/service-account.name](http://kubernetes.io/service-account.name): Kuboard-viewer\n[kubernetes.io/service-account.uid](http://kubernetes.io/service-account.uid): 948bb5e6-8cdc-11e9-b67e-fa163e5f7a0f\n\nType: [kubernetes.io/service-account-token](http://kubernetes.io/service-account-token)\n\nData\n====\nca.crt: 1025 bytes\nnamespace: 11 bytes\ntoken: eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLWc4aHhiIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiI5NDhiYjVlNi04Y2RjLTExZTktYjY3ZS1mYTE2M2U1ZjdhMGYiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06YWRtaW4tdXNlciJ9.DZ6dMTr8GExo5IH_vCWdB_MDfQaNognjfZKl0E5VW8vUFMVvALwo0BS-6Qsqpfxrlz87oE9yGVCpBYV0D00811bLhHIg-IR_MiBneadcqdQ_TGm_a0Pz0RbIzqJlRPiyMSxk1eXhmayfPn01upPdVCQj6D3vAY77dpcGplu3p5wE6vsNWAvrQ2d_V1KhR03IB1jJZkYwrI8FHCq_5YuzkPfHsgZ9MBQgH-jqqNXs6r8aoUZIbLsYcMHkin2vzRsMy_tjMCI9yXGiOqI-E5efTb-_KbDVwV5cbdqEIegdtYZ2J3mlrFQlmPGYTwFI8Ba9LleSYbCi4o0k74568KcN_w\n")])])])])],1),t._v(" "),a("h2",{attrs:{id:"访问-kuboard"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#访问-kuboard","aria-hidden":"true"}},[t._v("#")]),t._v(" 访问 Kuboard")]),t._v(" "),a("p",[t._v("您可以通过NodePort、Port-forward、域名三种方式访问 Kuboard")]),t._v(" "),a("Tabs",{attrs:{type:"border-card"}},[a("Tab",{attrs:{label:"通过NodePort访问",lazy:""}},[a("p",[t._v("Kuboard Service 使用了 NodePort 的方式暴露服务,NodePort 为 32567;您可以按如下方式访问 Kuboard。(可以使用集群中任意节点的 IP 地址)")]),t._v(" "),a("p",[a("code",[t._v("http://any-of-your-node-ip:32567/")])]),t._v(" "),a("p",[t._v("输入前一步骤中获得的 token,可进入控制台界面")]),t._v(" "),a("div",{staticClass:"tip custom-block"},[a("p",[t._v("您也可以修改 Kuboard.yaml 文件,使用自己定义的 NodePort 端口号")])])]),t._v(" "),a("Tab",{attrs:{label:"通过port-forward访问",lazy:""}},[a("p",[t._v("在您的客户端电脑中执行如下命令")]),t._v(" "),a("div",{staticClass:"language-sh extra-class"},[a("pre",{pre:!0,attrs:{class:"language-sh"}},[a("code",[t._v("kubectl port-forward service/Kuboard "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("8080")]),t._v(":80 -n kube-system\n")])])]),a("p",[t._v("在浏览器打开链接 (请使用 kubectl 所在机器的IP地址)")]),t._v(" "),a("p",[a("code",[t._v("http://localhost:8080")])]),t._v(" "),a("div",{staticClass:"tip custom-block"},[a("p",[t._v("需要您自行设定 kubectl 的配置")])])]),t._v(" "),a("Tab",{attrs:{label:"通过域名访问",lazy:""}},[a("p",[t._v("在浏览器打开链接 (请使用前面已修改的域名)")]),t._v(" "),a("p",[a("code",[t._v("http://Kuboard.yourclustername.yourdomain.com")])]),t._v(" "),a("p",[t._v("输入前一步骤中获得的 token,可进入控制台界面")]),t._v(" "),a("div",{staticClass:"tip custom-block"},[a("p",[t._v("需要您")]),t._v(" "),a("ul",[a("li",[t._v("正确安装 Ingress Controller")]),t._v(" "),a("li",[t._v("将您所使用的域名指向 Kubernetes 中的一个 Worker 节点(或者Ingress Controller所在机器的IP,不同类型的Ingress Controller配置不同)")])])])])],1)],1)},[],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/5.d71edffc.js b/docs/assets/js/5.218c2a4d.js similarity index 87% rename from docs/assets/js/5.d71edffc.js rename to docs/assets/js/5.218c2a4d.js index 97f835c..29acb7c 100644 --- a/docs/assets/js/5.d71edffc.js +++ b/docs/assets/js/5.218c2a4d.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[5],{144:function(e,t,a){e.exports=a.p+"assets/img/image-20190723115721514.bf981ef3.png"},145:function(e,t,a){e.exports=a.p+"assets/img/image-20190723121433809.7a1b4b00.png"},322:function(e,t,a){e.exports=a.p+"assets/img/image-20190723120730196.9793d8ec.png"},323:function(e,t,a){e.exports=a.p+"assets/img/image-20190723120753533.081b6d6b.png"},324:function(e,t,a){e.exports=a.p+"assets/img/image-20190723120832778.e154bccd.png"},325:function(e,t,a){e.exports=a.p+"assets/img/image-20190723120912377.e1404406.png"},326:function(e,t,a){e.exports=a.p+"assets/img/image-20190723120926747.c9754776.png"},327:function(e,t,a){e.exports=a.p+"assets/img/image-20190723120956821.69bcdbbe.png"},328:function(e,t,a){e.exports=a.p+"assets/img/image-20190723121019167.81af1060.png"},329:function(e,t,a){e.exports=a.p+"assets/img/image-20190723121035917.8a2b1320.png"},330:function(e,t,a){e.exports=a.p+"assets/img/image-20190723121055648.2c6ba8d1.png"},331:function(e,t,a){e.exports=a.p+"assets/img/image-20190723121117514.ef774d3a.png"},332:function(e,t,a){e.exports=a.p+"assets/img/image-20190723121132991.69146097.png"},333:function(e,t,a){e.exports=a.p+"assets/img/image-20190723121412027.6888452e.png"},334:function(e,t,a){e.exports=a.p+"assets/img/image-20190717193548703.5167e3b9.png"},356:function(e,t,a){"use strict";a.r(t);var r=a(0),o=Object(r.a)({},function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[r("h1",{attrs:{id:"导入-example-微服务"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#导入-example-微服务","aria-hidden":"true"}},[e._v("#")]),e._v(" 导入 example 微服务")]),e._v(" "),r("h2",{attrs:{id:"前提"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#前提","aria-hidden":"true"}},[e._v("#")]),e._v(" 前提")]),e._v(" "),r("p",[e._v("必须具备如下条件:")]),e._v(" "),r("ul",[r("li",[e._v("Kubernetes 集群 (安装在阿里云,本文将使用阿里云的 NFS 服务作为存储资源,Kuboard 也可以运行在其他云环境或者私有环境中。)")]),e._v(" "),r("li",[e._v("已在集群中安装 Kuboard")])]),e._v(" "),r("h2",{attrs:{id:"创建存储资源"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#创建存储资源","aria-hidden":"true"}},[e._v("#")]),e._v(" 创建存储资源")]),e._v(" "),r("p",[e._v("example中用到了存储卷声明,请在 Kuboard 中 "),r("a",{attrs:{href:"/guide/cluster/storage?id=%E5%88%9B%E5%BB%BA%E5%AD%98%E5%82%A8%E7%B1%BB"}},[e._v("创建存储类")]),e._v(" ,否则不能完成 example 的导入操作。")]),e._v(" "),r("h2",{attrs:{id:"创建名称空间"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#创建名称空间","aria-hidden":"true"}},[e._v("#")]),e._v(" 创建名称空间")]),e._v(" "),r("p",[e._v("创建新的名称空间,用来导入 exmaple。可参考 "),r("a",{attrs:{href:"/guide/cluster/namespace?id=%E5%88%9B%E5%BB%BA%E5%90%8D%E7%A7%B0%E7%A9%BA%E9%97%B4"}},[e._v("创建名称空间")])]),e._v(" "),r("p",[e._v("假设您已经进入了 Kuboard 名称空间界面,如下图所示:")]),e._v(" "),r("p",[r("img",{attrs:{src:a(144),alt:"image-20190723115721514"}})]),e._v(" "),r("h2",{attrs:{id:"导入-example"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#导入-example","aria-hidden":"true"}},[e._v("#")]),e._v(" 导入 example")]),e._v(" "),r("ul",[r("li",[e._v("下载 "),r("a",{attrs:{href:e.$withBase("/kuboard_example.yaml"),download:"kuboard_example.yaml"}},[e._v("kuboard_example.yaml")]),e._v(" 文件")])]),e._v(" "),r("blockquote",[r("p",[e._v("在 Kuboard 中,您无需手写 yaml 文件,此 yaml 文件的内容生成步骤如下:")]),e._v(" "),r("ul",[r("li",[e._v("通过 "),r("a",{attrs:{href:"busybox"}},[e._v("创建工作负载")]),e._v(" 完成微服务应用的部署")]),e._v(" "),r("li",[e._v("通过 "),r("strong",[e._v("导出工作负载")]),e._v(" 将名称空间中的微服务配置导出到一个 yaml 文件中")])])]),e._v(" "),r("ul",[r("li",[e._v("点击 "),r("em",[r("strong",[e._v("导入工作负载")])]),e._v(" 按钮")])]),e._v(" "),r("p",[r("img",{attrs:{src:a(322),alt:"image-20190723120730196"}})]),e._v(" "),r("ul",[r("li",[r("p",[e._v("点击 "),r("em",[r("strong",[e._v("上传文件")])]),e._v(" 按钮")]),e._v(" "),r("p",[e._v("并选择刚才下载的 export_example.yaml 文件")])])]),e._v(" "),r("p",[r("img",{attrs:{src:a(323),alt:"image-20190723120753533"}})]),e._v(" "),r("ul",[r("li",[r("p",[e._v("点击 "),r("em",[r("strong",[e._v("下一步")])])]),e._v(" "),r("p",[e._v("默认选择所有的工作负载")])])]),e._v(" "),r("p",[r("img",{attrs:{src:a(324),alt:"image-20190723120832778"}})]),e._v(" "),r("ul",[r("li",[r("p",[e._v("点击 "),r("em",[r("strong",[e._v("下一步")])])]),e._v(" "),r("p",[e._v("默认选择所有要导入的配置,example中没有使用到配置信息")])])]),e._v(" "),r("p",[r("img",{attrs:{src:a(325),alt:"image-20190723120912377"}})]),e._v(" "),r("ul",[r("li",[r("p",[e._v("点击 "),r("em",[r("strong",[e._v("下一步")])])]),e._v(" "),r("p",[e._v("默认选择所有 Secrets")])])]),e._v(" "),r("p",[r("img",{attrs:{src:a(326),alt:"image-20190723120926747"}})]),e._v(" "),r("ul",[r("li",[r("p",[e._v("点击 "),r("em",[r("strong",[e._v("下一步")])])]),e._v(" "),r("p",[e._v("填写表单:")])])]),e._v(" "),r("table",[r("thead",[r("tr",[r("th",[e._v("字段名称")]),e._v(" "),r("th",[e._v("填写内容")]),e._v(" "),r("th",[e._v("说明")])])]),e._v(" "),r("tbody",[r("tr",[r("td",[e._v("数据卷类型")]),e._v(" "),r("td",[e._v("db-example-storage")]),e._v(" "),r("td",[e._v("NFS:容器组直连NFS"),r("br"),e._v("存储卷声明:容器组使用存储卷声明")])]),e._v(" "),r("tr",[r("td",[e._v("是否新建存储卷声明")]),e._v(" "),r("td",[e._v("创建新存储卷声明")]),e._v(" "),r("td",[e._v("使用已有存储卷声明:可以使用事先创建好的存储卷声明"),r("br"),e._v("创建新存储卷声明:可以创建新存储卷声明")])]),e._v(" "),r("tr",[r("td",[e._v("分配模式")]),e._v(" "),r("td",[e._v("动态分配")]),e._v(" "),r("td")]),e._v(" "),r("tr",[r("td",[e._v("读写模式")]),e._v(" "),r("td",[e._v("可被多节点读写")]),e._v(" "),r("td",[e._v("只能被单节点读写、可被多节点只读、可被多节点读写")])]),e._v(" "),r("tr",[r("td",[e._v("总量")]),e._v(" "),r("td",[e._v("2Gi")]),e._v(" "),r("td",[e._v("2Gi代表 2G空间")])])])]),e._v(" "),r("p",[r("img",{attrs:{src:a(327),alt:"image-20190723120956821"}})]),e._v(" "),r("ul",[r("li",[r("p",[e._v("点击 "),r("em",[r("strong",[e._v("下一步")])])]),e._v(" "),r("p",[e._v("填写表单:")])])]),e._v(" "),r("table",[r("thead",[r("tr",[r("th",[e._v("字段名称")]),e._v(" "),r("th",[e._v("填写内容")]),e._v(" "),r("th",[e._v("说明")])])]),e._v(" "),r("tbody",[r("tr",[r("td",[e._v("cloud-eureka域名")]),e._v(" "),r("td",[e._v("cloud-eureka.example.demo.eip.work")]),e._v(" "),r("td",[e._v("使用您自己的域名,"),r("br"),e._v("在测试环境建议使用如下域名格式:"),r("br"),e._v("workloadname.namespace-name.cluster-name.domain.com"),r("br"),e._v("该域名应该解析到您worker节点的外网地址,或者worker 节点 80/443 端口对应负载均衡服务器的外网地址。")])]),e._v(" "),r("tr",[r("td",[e._v("web-example")]),e._v(" "),r("td",[e._v("web-example.example.demo.eip")]),e._v(" "),r("td")])])]),e._v(" "),r("p",[r("img",{attrs:{src:a(328),alt:"image-20190723121019167"}})]),e._v(" "),r("ul",[r("li",[e._v("点击 "),r("em",[r("strong",[e._v("下一步")])])])]),e._v(" "),r("p",[r("img",{attrs:{src:a(329),alt:"image-20190723121035917"}})]),e._v(" "),r("ul",[r("li",[e._v("点击 "),r("em",[r("strong",[e._v("确定")])])])]),e._v(" "),r("p",[r("img",{attrs:{src:a(330),alt:"image-20190723121055648"}})]),e._v(" "),r("ul",[r("li",[e._v("点击 "),r("em",[r("strong",[e._v("应用")])])])]),e._v(" "),r("p",[r("img",{attrs:{src:a(331),alt:"image-20190723121117514"}})]),e._v(" "),r("ul",[r("li",[e._v("点击 "),r("em",[r("strong",[e._v("完成")])])])]),e._v(" "),r("p",[r("img",{attrs:{src:a(332),alt:"image-20190723121132991"}})]),e._v(" "),r("ul",[r("li",[r("p",[e._v("点击 "),r("em",[r("strong",[e._v("已完成")])])]),e._v(" "),r("p",[e._v("可再名称空间中查看到刚才导入的 example 的所有工作负载及存储卷声明")])])]),e._v(" "),r("p",[r("img",{attrs:{src:a(145),alt:"image-20190723121433809"}})]),e._v(" "),r("h2",{attrs:{id:"验证-web-example"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#验证-web-example","aria-hidden":"true"}},[e._v("#")]),e._v(" 验证 web-example")]),e._v(" "),r("ul",[r("li",[e._v("点击工作负载 "),r("em",[r("strong",[e._v("web-example")])])])]),e._v(" "),r("p",[r("img",{attrs:{src:a(333),alt:"image-20190723121412027"}})]),e._v(" "),r("ul",[r("li",[r("p",[e._v("点击 互联网入口中的域名 "),r("em",[r("strong",[e._v("http://web-example.example.demo.eip.work")])])]),e._v(" "),r("p",[r("strong",[e._v("Example 部署成功")])])])]),e._v(" "),r("p",[r("img",{attrs:{src:a(334),alt:"image-20190717193548703"}})]),e._v(" "),r("blockquote",[r("p",[e._v("web-example容器的日志中会出现如下异常,错误原因是,example使用了一个监控套件,该监控套件要求将容器注册到monitor-eureka中,当下我们并没有安装该监控套件。此错误并不影响 example 程序的使用。暂时忽略该异常。")]),e._v(" "),r("div",{staticClass:"language- extra-class"},[r("pre",{pre:!0,attrs:{class:"language-text"}},[r("code",[e._v("[DiscoveryClient-InstanceInfoReplicator-0] WARN com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient - Request execution failed with message: java.net.UnknownHostException: monitor-eureka\n[DiscoveryClient-InstanceInfoReplicator-0] WARN com.netflix.discovery.DiscoveryClient - DiscoveryClient_WEB-ADMIN/web-example-7f668c75db-j7ncx - registration failed Cannot execute request on any known server\ncom.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server\n at com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient.execute(RetryableEurekaHttpClient.java:112)\n at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.register(EurekaHttpClientDecorator.java:56)\n at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator$1.execute(EurekaHttpClientDecorator.java:59)\n at com.netflix.discovery.shared.transport.decorator.SessionedEurekaHttpClient.execute(SessionedEurekaHttpClient.java:77)\n at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.register(EurekaHttpClientDecorator.java:56)\n at com.netflix.discovery.DiscoveryClient.register(DiscoveryClient.java:829)\n at com.netflix.discovery.InstanceInfoReplicator.run(InstanceInfoReplicator.java:121)\n at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)\n at java.util.concurrent.FutureTask.run(FutureTask.java:266)\n at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)\n at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)\n at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)\n at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)\n at java.lang.Thread.run(Thread.java:748)\n[DiscoveryClient-InstanceInfoReplicator-0] WARN com.netflix.discovery.InstanceInfoReplicator - There was a problem with the instance info replicator\ncom.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server\n at com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient.execute(RetryableEurekaHttpClient.java:112)\n at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.register(EurekaHttpClientDecorator.java:56)\n at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator$1.execute(EurekaHttpClientDecorator.java:59)\n at com.netflix.discovery.shared.transport.decorator.SessionedEurekaHttpClient.execute(SessionedEurekaHttpClient.java:77)\n at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.register(EurekaHttpClientDecorator.java:56)\n at com.netflix.discovery.DiscoveryClient.register(DiscoveryClient.java:829)\n at com.netflix.discovery.InstanceInfoReplicator.run(InstanceInfoReplicator.java:121)\n at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)\n at java.util.concurrent.FutureTask.run(FutureTask.java:266)\n at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)\n at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)\n at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)\n at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)\n at java.lang.Thread.run(Thread.java:748)\n")])])])])])},[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[5],{144:function(e,t,a){e.exports=a.p+"assets/img/image-20190723115721514.bf981ef3.png"},145:function(e,t,a){e.exports=a.p+"assets/img/image-20190723121433809.7a1b4b00.png"},319:function(e,t,a){e.exports=a.p+"assets/img/image-20190723120730196.9793d8ec.png"},320:function(e,t,a){e.exports=a.p+"assets/img/image-20190723120753533.081b6d6b.png"},321:function(e,t,a){e.exports=a.p+"assets/img/image-20190723120832778.e154bccd.png"},322:function(e,t,a){e.exports=a.p+"assets/img/image-20190723120912377.e1404406.png"},323:function(e,t,a){e.exports=a.p+"assets/img/image-20190723120926747.c9754776.png"},324:function(e,t,a){e.exports=a.p+"assets/img/image-20190723120956821.69bcdbbe.png"},325:function(e,t,a){e.exports=a.p+"assets/img/image-20190723121019167.81af1060.png"},326:function(e,t,a){e.exports=a.p+"assets/img/image-20190723121035917.8a2b1320.png"},327:function(e,t,a){e.exports=a.p+"assets/img/image-20190723121055648.2c6ba8d1.png"},328:function(e,t,a){e.exports=a.p+"assets/img/image-20190723121117514.ef774d3a.png"},329:function(e,t,a){e.exports=a.p+"assets/img/image-20190723121132991.69146097.png"},330:function(e,t,a){e.exports=a.p+"assets/img/image-20190723121412027.6888452e.png"},331:function(e,t,a){e.exports=a.p+"assets/img/image-20190717193548703.5167e3b9.png"},359:function(e,t,a){"use strict";a.r(t);var r=a(0),o=Object(r.a)({},function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[r("h1",{attrs:{id:"导入-example-微服务"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#导入-example-微服务","aria-hidden":"true"}},[e._v("#")]),e._v(" 导入 example 微服务")]),e._v(" "),r("h2",{attrs:{id:"前提"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#前提","aria-hidden":"true"}},[e._v("#")]),e._v(" 前提")]),e._v(" "),r("p",[e._v("必须具备如下条件:")]),e._v(" "),r("ul",[r("li",[e._v("Kubernetes 集群 (安装在阿里云,本文将使用阿里云的 NFS 服务作为存储资源,Kuboard 也可以运行在其他云环境或者私有环境中。)")]),e._v(" "),r("li",[e._v("已在集群中安装 Kuboard")])]),e._v(" "),r("h2",{attrs:{id:"创建存储资源"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#创建存储资源","aria-hidden":"true"}},[e._v("#")]),e._v(" 创建存储资源")]),e._v(" "),r("p",[e._v("example中用到了存储卷声明,请在 Kuboard 中 "),r("a",{attrs:{href:"/guide/cluster/storage?id=%E5%88%9B%E5%BB%BA%E5%AD%98%E5%82%A8%E7%B1%BB"}},[e._v("创建存储类")]),e._v(" ,否则不能完成 example 的导入操作。")]),e._v(" "),r("h2",{attrs:{id:"创建名称空间"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#创建名称空间","aria-hidden":"true"}},[e._v("#")]),e._v(" 创建名称空间")]),e._v(" "),r("p",[e._v("创建新的名称空间,用来导入 exmaple。可参考 "),r("a",{attrs:{href:"/guide/cluster/namespace?id=%E5%88%9B%E5%BB%BA%E5%90%8D%E7%A7%B0%E7%A9%BA%E9%97%B4"}},[e._v("创建名称空间")])]),e._v(" "),r("p",[e._v("假设您已经进入了 Kuboard 名称空间界面,如下图所示:")]),e._v(" "),r("p",[r("img",{attrs:{src:a(144),alt:"image-20190723115721514"}})]),e._v(" "),r("h2",{attrs:{id:"导入-example"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#导入-example","aria-hidden":"true"}},[e._v("#")]),e._v(" 导入 example")]),e._v(" "),r("ul",[r("li",[e._v("下载 "),r("a",{attrs:{href:e.$withBase("/kuboard_example.yaml"),download:"kuboard_example.yaml"}},[e._v("kuboard_example.yaml")]),e._v(" 文件")])]),e._v(" "),r("blockquote",[r("p",[e._v("在 Kuboard 中,您无需手写 yaml 文件,此 yaml 文件的内容生成步骤如下:")]),e._v(" "),r("ul",[r("li",[e._v("通过 "),r("a",{attrs:{href:"busybox"}},[e._v("创建工作负载")]),e._v(" 完成微服务应用的部署")]),e._v(" "),r("li",[e._v("通过 "),r("strong",[e._v("导出工作负载")]),e._v(" 将名称空间中的微服务配置导出到一个 yaml 文件中")])])]),e._v(" "),r("ul",[r("li",[e._v("点击 "),r("em",[r("strong",[e._v("导入工作负载")])]),e._v(" 按钮")])]),e._v(" "),r("p",[r("img",{attrs:{src:a(319),alt:"image-20190723120730196"}})]),e._v(" "),r("ul",[r("li",[r("p",[e._v("点击 "),r("em",[r("strong",[e._v("上传文件")])]),e._v(" 按钮")]),e._v(" "),r("p",[e._v("并选择刚才下载的 export_example.yaml 文件")])])]),e._v(" "),r("p",[r("img",{attrs:{src:a(320),alt:"image-20190723120753533"}})]),e._v(" "),r("ul",[r("li",[r("p",[e._v("点击 "),r("em",[r("strong",[e._v("下一步")])])]),e._v(" "),r("p",[e._v("默认选择所有的工作负载")])])]),e._v(" "),r("p",[r("img",{attrs:{src:a(321),alt:"image-20190723120832778"}})]),e._v(" "),r("ul",[r("li",[r("p",[e._v("点击 "),r("em",[r("strong",[e._v("下一步")])])]),e._v(" "),r("p",[e._v("默认选择所有要导入的配置,example中没有使用到配置信息")])])]),e._v(" "),r("p",[r("img",{attrs:{src:a(322),alt:"image-20190723120912377"}})]),e._v(" "),r("ul",[r("li",[r("p",[e._v("点击 "),r("em",[r("strong",[e._v("下一步")])])]),e._v(" "),r("p",[e._v("默认选择所有 Secrets")])])]),e._v(" "),r("p",[r("img",{attrs:{src:a(323),alt:"image-20190723120926747"}})]),e._v(" "),r("ul",[r("li",[r("p",[e._v("点击 "),r("em",[r("strong",[e._v("下一步")])])]),e._v(" "),r("p",[e._v("填写表单:")])])]),e._v(" "),r("table",[r("thead",[r("tr",[r("th",[e._v("字段名称")]),e._v(" "),r("th",[e._v("填写内容")]),e._v(" "),r("th",[e._v("说明")])])]),e._v(" "),r("tbody",[r("tr",[r("td",[e._v("数据卷类型")]),e._v(" "),r("td",[e._v("db-example-storage")]),e._v(" "),r("td",[e._v("NFS:容器组直连NFS"),r("br"),e._v("存储卷声明:容器组使用存储卷声明")])]),e._v(" "),r("tr",[r("td",[e._v("是否新建存储卷声明")]),e._v(" "),r("td",[e._v("创建新存储卷声明")]),e._v(" "),r("td",[e._v("使用已有存储卷声明:可以使用事先创建好的存储卷声明"),r("br"),e._v("创建新存储卷声明:可以创建新存储卷声明")])]),e._v(" "),r("tr",[r("td",[e._v("分配模式")]),e._v(" "),r("td",[e._v("动态分配")]),e._v(" "),r("td")]),e._v(" "),r("tr",[r("td",[e._v("读写模式")]),e._v(" "),r("td",[e._v("可被多节点读写")]),e._v(" "),r("td",[e._v("只能被单节点读写、可被多节点只读、可被多节点读写")])]),e._v(" "),r("tr",[r("td",[e._v("总量")]),e._v(" "),r("td",[e._v("2Gi")]),e._v(" "),r("td",[e._v("2Gi代表 2G空间")])])])]),e._v(" "),r("p",[r("img",{attrs:{src:a(324),alt:"image-20190723120956821"}})]),e._v(" "),r("ul",[r("li",[r("p",[e._v("点击 "),r("em",[r("strong",[e._v("下一步")])])]),e._v(" "),r("p",[e._v("填写表单:")])])]),e._v(" "),r("table",[r("thead",[r("tr",[r("th",[e._v("字段名称")]),e._v(" "),r("th",[e._v("填写内容")]),e._v(" "),r("th",[e._v("说明")])])]),e._v(" "),r("tbody",[r("tr",[r("td",[e._v("cloud-eureka域名")]),e._v(" "),r("td",[e._v("cloud-eureka.example.demo.eip.work")]),e._v(" "),r("td",[e._v("使用您自己的域名,"),r("br"),e._v("在测试环境建议使用如下域名格式:"),r("br"),e._v("workloadname.namespace-name.cluster-name.domain.com"),r("br"),e._v("该域名应该解析到您worker节点的外网地址,或者worker 节点 80/443 端口对应负载均衡服务器的外网地址。")])]),e._v(" "),r("tr",[r("td",[e._v("web-example")]),e._v(" "),r("td",[e._v("web-example.example.demo.eip")]),e._v(" "),r("td")])])]),e._v(" "),r("p",[r("img",{attrs:{src:a(325),alt:"image-20190723121019167"}})]),e._v(" "),r("ul",[r("li",[e._v("点击 "),r("em",[r("strong",[e._v("下一步")])])])]),e._v(" "),r("p",[r("img",{attrs:{src:a(326),alt:"image-20190723121035917"}})]),e._v(" "),r("ul",[r("li",[e._v("点击 "),r("em",[r("strong",[e._v("确定")])])])]),e._v(" "),r("p",[r("img",{attrs:{src:a(327),alt:"image-20190723121055648"}})]),e._v(" "),r("ul",[r("li",[e._v("点击 "),r("em",[r("strong",[e._v("应用")])])])]),e._v(" "),r("p",[r("img",{attrs:{src:a(328),alt:"image-20190723121117514"}})]),e._v(" "),r("ul",[r("li",[e._v("点击 "),r("em",[r("strong",[e._v("完成")])])])]),e._v(" "),r("p",[r("img",{attrs:{src:a(329),alt:"image-20190723121132991"}})]),e._v(" "),r("ul",[r("li",[r("p",[e._v("点击 "),r("em",[r("strong",[e._v("已完成")])])]),e._v(" "),r("p",[e._v("可再名称空间中查看到刚才导入的 example 的所有工作负载及存储卷声明")])])]),e._v(" "),r("p",[r("img",{attrs:{src:a(145),alt:"image-20190723121433809"}})]),e._v(" "),r("h2",{attrs:{id:"验证-web-example"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#验证-web-example","aria-hidden":"true"}},[e._v("#")]),e._v(" 验证 web-example")]),e._v(" "),r("ul",[r("li",[e._v("点击工作负载 "),r("em",[r("strong",[e._v("web-example")])])])]),e._v(" "),r("p",[r("img",{attrs:{src:a(330),alt:"image-20190723121412027"}})]),e._v(" "),r("ul",[r("li",[r("p",[e._v("点击 互联网入口中的域名 "),r("em",[r("strong",[e._v("http://web-example.example.demo.eip.work")])])]),e._v(" "),r("p",[r("strong",[e._v("Example 部署成功")])])])]),e._v(" "),r("p",[r("img",{attrs:{src:a(331),alt:"image-20190717193548703"}})]),e._v(" "),r("blockquote",[r("p",[e._v("web-example容器的日志中会出现如下异常,错误原因是,example使用了一个监控套件,该监控套件要求将容器注册到monitor-eureka中,当下我们并没有安装该监控套件。此错误并不影响 example 程序的使用。暂时忽略该异常。")]),e._v(" "),r("div",{staticClass:"language- extra-class"},[r("pre",{pre:!0,attrs:{class:"language-text"}},[r("code",[e._v("[DiscoveryClient-InstanceInfoReplicator-0] WARN com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient - Request execution failed with message: java.net.UnknownHostException: monitor-eureka\n[DiscoveryClient-InstanceInfoReplicator-0] WARN com.netflix.discovery.DiscoveryClient - DiscoveryClient_WEB-ADMIN/web-example-7f668c75db-j7ncx - registration failed Cannot execute request on any known server\ncom.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server\n at com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient.execute(RetryableEurekaHttpClient.java:112)\n at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.register(EurekaHttpClientDecorator.java:56)\n at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator$1.execute(EurekaHttpClientDecorator.java:59)\n at com.netflix.discovery.shared.transport.decorator.SessionedEurekaHttpClient.execute(SessionedEurekaHttpClient.java:77)\n at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.register(EurekaHttpClientDecorator.java:56)\n at com.netflix.discovery.DiscoveryClient.register(DiscoveryClient.java:829)\n at com.netflix.discovery.InstanceInfoReplicator.run(InstanceInfoReplicator.java:121)\n at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)\n at java.util.concurrent.FutureTask.run(FutureTask.java:266)\n at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)\n at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)\n at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)\n at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)\n at java.lang.Thread.run(Thread.java:748)\n[DiscoveryClient-InstanceInfoReplicator-0] WARN com.netflix.discovery.InstanceInfoReplicator - There was a problem with the instance info replicator\ncom.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server\n at com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient.execute(RetryableEurekaHttpClient.java:112)\n at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.register(EurekaHttpClientDecorator.java:56)\n at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator$1.execute(EurekaHttpClientDecorator.java:59)\n at com.netflix.discovery.shared.transport.decorator.SessionedEurekaHttpClient.execute(SessionedEurekaHttpClient.java:77)\n at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.register(EurekaHttpClientDecorator.java:56)\n at com.netflix.discovery.DiscoveryClient.register(DiscoveryClient.java:829)\n at com.netflix.discovery.InstanceInfoReplicator.run(InstanceInfoReplicator.java:121)\n at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)\n at java.util.concurrent.FutureTask.run(FutureTask.java:266)\n at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)\n at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)\n at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)\n at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)\n at java.lang.Thread.run(Thread.java:748)\n")])])])])])},[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/6.9d7b5b48.js b/docs/assets/js/6.ca632ba2.js similarity index 84% rename from docs/assets/js/6.9d7b5b48.js rename to docs/assets/js/6.ca632ba2.js index bc9f422..b936669 100644 --- a/docs/assets/js/6.9d7b5b48.js +++ b/docs/assets/js/6.ca632ba2.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[6],{215:function(t,v,_){t.exports=_.p+"assets/img/image-20190717113807552.b3fe5f7d.png"},216:function(t,v,_){t.exports=_.p+"assets/img/image-20190717114304953.854b47d8.png"},217:function(t,v,_){t.exports=_.p+"assets/img/image-20190717114354610.6d522c25.png"},218:function(t,v,_){t.exports=_.p+"assets/img/image-20190717115020848.eec5a17e.png"},219:function(t,v,_){t.exports=_.p+"assets/img/image-20190717115403374.48894c27.png"},220:function(t,v,_){t.exports=_.p+"assets/img/image-20190717115457614.c7f0d044.png"},221:function(t,v,_){t.exports=_.p+"assets/img/image-20190717115829821.63b81f36.png"},222:function(t,v,_){t.exports=_.p+"assets/img/image-20190723112105018.a27c638f.png"},223:function(t,v,_){t.exports=_.p+"assets/img/image-20190723112143032.7a5220bd.png"},224:function(t,v,_){t.exports=_.p+"assets/img/image-20190723112204681.8279ca8f.png"},225:function(t,v,_){t.exports=_.p+"assets/img/image-20190723113250521.3b80f3d2.png"},226:function(t,v,_){t.exports=_.p+"assets/img/image-20190723113312360.a3a51c0c.png"},363:function(t,v,_){"use strict";_.r(v);var a=_(0),r=Object(a.a)({},function(){var t=this,v=t.$createElement,a=t._self._c||v;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"存储空间管理"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#存储空间管理","aria-hidden":"true"}},[t._v("#")]),t._v(" 存储空间管理")]),t._v(" "),a("h2",{attrs:{id:"创建存储类"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#创建存储类","aria-hidden":"true"}},[t._v("#")]),t._v(" 创建存储类")]),t._v(" "),a("p",[t._v("前提")]),t._v(" "),a("p",[t._v("必须具备如下条件:")]),t._v(" "),a("ul",[a("li",[t._v("Kubernetes 集群 (安装在阿里云,本文将使用阿里云的 NFS 服务作为存储资源,Kuboard 也可以运行在其他云环境或者私有环境中。)")]),t._v(" "),a("li",[t._v("已在集群中安装 Kuboard")])]),t._v(" "),a("h3",{attrs:{id:"在阿里云创建-nas-服务"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#在阿里云创建-nas-服务","aria-hidden":"true"}},[t._v("#")]),t._v(" 在阿里云创建 NAS 服务")]),t._v(" "),a("p",[t._v("如果您在其他 IaaS 供应商搭建了 Kubernetes 集群,请参考该 IaaS 供应商的文档,创建 NFS 服务。您也可以自行搭建 NFS 服务器,用来为 Kubernetes 集群提供存储资源。")]),t._v(" "),a("ul",[a("li",[t._v("进入阿里云 "),a("em",[a("strong",[t._v("文件存储 NAS 服务")])]),t._v(" 控制台")])]),t._v(" "),a("p",[t._v("登录 www.aliyun.com 后,在控制台界面的产品与服务中选择 "),a("em",[a("strong",[t._v("文件存储 NAS")])])]),t._v(" "),a("p",[t._v("如下图所示")]),t._v(" "),a("p",[a("img",{attrs:{src:_(215),alt:"image-20190717113807552"}})]),t._v(" "),a("ul",[a("li",[t._v("在 "),a("em",[a("strong",[t._v("文件存储 NAS")])]),t._v(" 控制台中点击 "),a("em",[a("strong",[t._v("创建文件系统")])])])]),t._v(" "),a("p",[a("img",{attrs:{src:_(216),alt:"image-20190717114304953"}})]),t._v(" "),a("ul",[a("li",[t._v("填写表单")])]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("字段名称")]),t._v(" "),a("th",[t._v("填写内容")]),t._v(" "),a("th",[t._v("说明")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[t._v("地域")]),t._v(" "),a("td",[t._v("请选择您的 Kubernetes 集群所在的地域")]),t._v(" "),a("td",[t._v("文件系统所在地域")])]),t._v(" "),a("tr",[a("td",[t._v("存储类型")]),t._v(" "),a("td",[t._v("容量型 / 或 SSD型")]),t._v(" "),a("td",[t._v("测试目的,使用价格便宜的容量型即可")])]),t._v(" "),a("tr",[a("td",[t._v("协议类型")]),t._v(" "),a("td",[t._v("NFS")]),t._v(" "),a("td",[t._v("请选择NFS")])]),t._v(" "),a("tr",[a("td",[t._v("可用区")]),t._v(" "),a("td",[t._v("请选择您的 Kubernetes 集群所在的可用区")]),t._v(" "),a("td",[t._v("文件系统所在可用区")])]),t._v(" "),a("tr",[a("td",[t._v("存储包")]),t._v(" "),a("td",[t._v("如果当下没有存储包,可以后续绑定")]),t._v(" "),a("td",[t._v("不绑定存储包,将无法使用该文件系统")])])])]),t._v(" "),a("p",[a("img",{attrs:{src:_(217),alt:"image-20190717114354610"}})]),t._v(" "),a("ul",[a("li",[t._v("点击 "),a("em",[a("strong",[t._v("确定")])])])]),t._v(" "),a("p",[t._v("点击确定后,可查看到该文件系统已创建成功")]),t._v(" "),a("p",[a("img",{attrs:{src:_(218),alt:"image-20190717115020848"}})]),t._v(" "),a("ul",[a("li",[t._v("绑定存储包")])]),t._v(" "),a("p",[t._v("请自行在阿里云中为该文件系统绑定存储包,如果不绑定存储包,将无法使用该文件系统。")]),t._v(" "),a("ul",[a("li",[t._v("点击刚创建文件系统的 "),a("em",[a("strong",[t._v("管理")])]),t._v(" 按钮")])]),t._v(" "),a("p",[a("img",{attrs:{src:_(219),alt:"image-20190717115403374"}})]),t._v(" "),a("ul",[a("li",[t._v("点击 "),a("em",[a("strong",[t._v("添加挂载点")])])])]),t._v(" "),a("p",[t._v("并填写表单")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("字段名称")]),t._v(" "),a("th",[t._v("填写内容")]),t._v(" "),a("th",[t._v("说明")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[t._v("挂载点类型")]),t._v(" "),a("td",[t._v("专有网络")]),t._v(" "),a("td")]),t._v(" "),a("tr",[a("td",[t._v("VPC网络")]),t._v(" "),a("td",[t._v("请选择您的 Kubernetes 集群所在的VPC")]),t._v(" "),a("td")]),t._v(" "),a("tr",[a("td",[t._v("交换机")]),t._v(" "),a("td",[t._v("请选择您的 Kubernetes 集群所在的交换机")]),t._v(" "),a("td")]),t._v(" "),a("tr",[a("td",[t._v("权限组")]),t._v(" "),a("td",[t._v("VPC默认权限组(全部允许)")]),t._v(" "),a("td",[t._v("请选择全部允许")])])])]),t._v(" "),a("p",[a("img",{attrs:{src:_(220),alt:"image-20190717115457614"}})]),t._v(" "),a("ul",[a("li",[t._v("点击 "),a("em",[a("strong",[t._v("确定")])])])]),t._v(" "),a("p",[t._v("点击确定后,将完成挂载点创建,如下图所示:")]),t._v(" "),a("p",[a("img",{attrs:{src:_(221),alt:"image-20190717115829821"}})]),t._v(" "),a("ul",[a("li",[t._v("获取 NFS 连接参数:")])]),t._v(" "),a("p",[t._v("在上图界面中,将 "),a("em",[a("strong",[t._v("V4 Mount")])]),t._v(" 的指令复制下来后,如下所示:")]),t._v(" "),a("div",{staticStyle:{"font-family":"Monaco,Menlo,Consolas,Bitstream Vera Sans Mono,monospace",padding:"20px","background-color":"rgb(244, 244, 245)","border-radius":"4px"}},[t._v("\nsudo mount -t nfs -o vers=4,minorversion=0,noresvport "),a("span",{staticStyle:{color:"red","background-color":"rgb(254, 240, 240)"}},[t._v("189344a39c-lex38.cn-beijing.nas.aliyuncs.com")]),t._v(":"),a("span",{staticStyle:{color:"blue","background-color":"rgb(217, 236, 255)"}},[t._v("/")]),t._v(" /mnt\n")]),t._v(" "),a("p",[t._v("其中红色字体的文字为 NFS Server 的地址,蓝色字体的文字为 NFS Path。如下表所示:")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("字段名称")]),t._v(" "),a("th",[t._v("字段取值")]),t._v(" "),a("th",[t._v("说明")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[t._v("NFS Server")]),t._v(" "),a("td",[t._v("189344a39c-lex38.cn-beijing.nas.aliyuncs.com")]),t._v(" "),a("td")]),t._v(" "),a("tr",[a("td",[t._v("NFS Path")]),t._v(" "),a("td",[t._v("/")]),t._v(" "),a("td",[t._v("NFS Server和NFS Path以冒号分隔")])])])]),t._v(" "),a("h3",{attrs:{id:"在-kuboard-创建存储类"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#在-kuboard-创建存储类","aria-hidden":"true"}},[t._v("#")]),t._v(" 在 Kuboard 创建存储类")]),t._v(" "),a("ul",[a("li",[a("p",[t._v("进入 Kuboard "),a("em",[a("strong",[t._v("集群概览页")])])]),t._v(" "),a("p",[t._v("参考 "),a("a",{attrs:{href:"install/install-dashboard?id=%E8%AE%BF%E9%97%AE"}},[t._v("访问 Kuboard")])]),t._v(" "),a("p",[t._v("如下图所示:")])])]),t._v(" "),a("p",[a("img",{attrs:{src:_(222),alt:"image-20190723112105018"}})]),t._v(" "),a("ul",[a("li",[a("p",[t._v("点击 "),a("em",[a("strong",[t._v("创建存储类")])])]),t._v(" "),a("p",[t._v("填写表单")])])]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("字段名称")]),t._v(" "),a("th",[t._v("填写内容")]),t._v(" "),a("th",[t._v("说明")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[t._v("名称")]),t._v(" "),a("td",[t._v("cluster-storage")]),t._v(" "),a("td",[t._v("填写你喜欢的名称")])]),t._v(" "),a("tr",[a("td",[t._v("限定名称空间")]),t._v(" "),a("td",[t._v("不填写")]),t._v(" "),a("td",[t._v("如果限定名称空间,"),a("br"),t._v("则在 Kuboard 中,您只能在指定的名称空间中使用该存储类"),a("br"),t._v("在 kubectl 中,不受影响")])]),t._v(" "),a("tr",[a("td",[t._v("存储类型")]),t._v(" "),a("td",[t._v("NFS")]),t._v(" "),a("td",[t._v("目前 Kuboard 只支持 NFS,将要增加其他类型的存储,如 CephFS、Cinder 等")])]),t._v(" "),a("tr",[a("td",[t._v("回收策略")]),t._v(" "),a("td",[t._v("回收后删除")]),t._v(" "),a("td",[t._v("当该存储类创建的 存储卷(Persistent Volume)被删除后,之前该存储卷中的文件可以被:回收后删除 / 回收后保留")])]),t._v(" "),a("tr",[a("td",[t._v("存储卷绑定模式")]),t._v(" "),a("td",[t._v("首次使用时绑定")]),t._v(" "),a("td",[t._v("即刻绑定:当 存储卷被创建时,就在 NFS 中为其分配空间,并绑定;"),a("br"),t._v("首次使用时绑定: 在存储卷被第一次使用到时,才绑定")])])])]),t._v(" "),a("p",[a("img",{attrs:{src:_(223),alt:"image-20190723112143032"}})]),t._v(" "),a("ul",[a("li",[t._v("点击 "),a("em",[a("strong",[t._v("保存")])])])]),t._v(" "),a("p",[a("img",{attrs:{src:_(224),alt:"image-20190723112204681"}})]),t._v(" "),a("ul",[a("li",[t._v("点击 "),a("em",[a("strong",[t._v("应用")])])])]),t._v(" "),a("p",[a("img",{attrs:{src:_(225),alt:"image-20190723113250521"}})]),t._v(" "),a("ul",[a("li",[a("p",[t._v("点击 "),a("em",[a("strong",[t._v("完成")])])]),t._v(" "),a("p",[t._v("此时可在存储资源列表中查看到刚创建的存储类")])])]),t._v(" "),a("p",[a("img",{attrs:{src:_(226),alt:"image-20190723113312360"}})])])},[],!1,null,null,null);v.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[6],{212:function(t,v,_){t.exports=_.p+"assets/img/image-20190717113807552.b3fe5f7d.png"},213:function(t,v,_){t.exports=_.p+"assets/img/image-20190717114304953.854b47d8.png"},214:function(t,v,_){t.exports=_.p+"assets/img/image-20190717114354610.6d522c25.png"},215:function(t,v,_){t.exports=_.p+"assets/img/image-20190717115020848.eec5a17e.png"},216:function(t,v,_){t.exports=_.p+"assets/img/image-20190717115403374.48894c27.png"},217:function(t,v,_){t.exports=_.p+"assets/img/image-20190717115457614.c7f0d044.png"},218:function(t,v,_){t.exports=_.p+"assets/img/image-20190717115829821.63b81f36.png"},219:function(t,v,_){t.exports=_.p+"assets/img/image-20190723112105018.a27c638f.png"},220:function(t,v,_){t.exports=_.p+"assets/img/image-20190723112143032.7a5220bd.png"},221:function(t,v,_){t.exports=_.p+"assets/img/image-20190723112204681.8279ca8f.png"},222:function(t,v,_){t.exports=_.p+"assets/img/image-20190723113250521.3b80f3d2.png"},223:function(t,v,_){t.exports=_.p+"assets/img/image-20190723113312360.a3a51c0c.png"},360:function(t,v,_){"use strict";_.r(v);var a=_(0),r=Object(a.a)({},function(){var t=this,v=t.$createElement,a=t._self._c||v;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"存储空间管理"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#存储空间管理","aria-hidden":"true"}},[t._v("#")]),t._v(" 存储空间管理")]),t._v(" "),a("h2",{attrs:{id:"创建存储类"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#创建存储类","aria-hidden":"true"}},[t._v("#")]),t._v(" 创建存储类")]),t._v(" "),a("p",[t._v("前提")]),t._v(" "),a("p",[t._v("必须具备如下条件:")]),t._v(" "),a("ul",[a("li",[t._v("Kubernetes 集群 (安装在阿里云,本文将使用阿里云的 NFS 服务作为存储资源,Kuboard 也可以运行在其他云环境或者私有环境中。)")]),t._v(" "),a("li",[t._v("已在集群中安装 Kuboard")])]),t._v(" "),a("h3",{attrs:{id:"在阿里云创建-nas-服务"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#在阿里云创建-nas-服务","aria-hidden":"true"}},[t._v("#")]),t._v(" 在阿里云创建 NAS 服务")]),t._v(" "),a("p",[t._v("如果您在其他 IaaS 供应商搭建了 Kubernetes 集群,请参考该 IaaS 供应商的文档,创建 NFS 服务。您也可以自行搭建 NFS 服务器,用来为 Kubernetes 集群提供存储资源。")]),t._v(" "),a("ul",[a("li",[t._v("进入阿里云 "),a("em",[a("strong",[t._v("文件存储 NAS 服务")])]),t._v(" 控制台")])]),t._v(" "),a("p",[t._v("登录 www.aliyun.com 后,在控制台界面的产品与服务中选择 "),a("em",[a("strong",[t._v("文件存储 NAS")])])]),t._v(" "),a("p",[t._v("如下图所示")]),t._v(" "),a("p",[a("img",{attrs:{src:_(212),alt:"image-20190717113807552"}})]),t._v(" "),a("ul",[a("li",[t._v("在 "),a("em",[a("strong",[t._v("文件存储 NAS")])]),t._v(" 控制台中点击 "),a("em",[a("strong",[t._v("创建文件系统")])])])]),t._v(" "),a("p",[a("img",{attrs:{src:_(213),alt:"image-20190717114304953"}})]),t._v(" "),a("ul",[a("li",[t._v("填写表单")])]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("字段名称")]),t._v(" "),a("th",[t._v("填写内容")]),t._v(" "),a("th",[t._v("说明")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[t._v("地域")]),t._v(" "),a("td",[t._v("请选择您的 Kubernetes 集群所在的地域")]),t._v(" "),a("td",[t._v("文件系统所在地域")])]),t._v(" "),a("tr",[a("td",[t._v("存储类型")]),t._v(" "),a("td",[t._v("容量型 / 或 SSD型")]),t._v(" "),a("td",[t._v("测试目的,使用价格便宜的容量型即可")])]),t._v(" "),a("tr",[a("td",[t._v("协议类型")]),t._v(" "),a("td",[t._v("NFS")]),t._v(" "),a("td",[t._v("请选择NFS")])]),t._v(" "),a("tr",[a("td",[t._v("可用区")]),t._v(" "),a("td",[t._v("请选择您的 Kubernetes 集群所在的可用区")]),t._v(" "),a("td",[t._v("文件系统所在可用区")])]),t._v(" "),a("tr",[a("td",[t._v("存储包")]),t._v(" "),a("td",[t._v("如果当下没有存储包,可以后续绑定")]),t._v(" "),a("td",[t._v("不绑定存储包,将无法使用该文件系统")])])])]),t._v(" "),a("p",[a("img",{attrs:{src:_(214),alt:"image-20190717114354610"}})]),t._v(" "),a("ul",[a("li",[t._v("点击 "),a("em",[a("strong",[t._v("确定")])])])]),t._v(" "),a("p",[t._v("点击确定后,可查看到该文件系统已创建成功")]),t._v(" "),a("p",[a("img",{attrs:{src:_(215),alt:"image-20190717115020848"}})]),t._v(" "),a("ul",[a("li",[t._v("绑定存储包")])]),t._v(" "),a("p",[t._v("请自行在阿里云中为该文件系统绑定存储包,如果不绑定存储包,将无法使用该文件系统。")]),t._v(" "),a("ul",[a("li",[t._v("点击刚创建文件系统的 "),a("em",[a("strong",[t._v("管理")])]),t._v(" 按钮")])]),t._v(" "),a("p",[a("img",{attrs:{src:_(216),alt:"image-20190717115403374"}})]),t._v(" "),a("ul",[a("li",[t._v("点击 "),a("em",[a("strong",[t._v("添加挂载点")])])])]),t._v(" "),a("p",[t._v("并填写表单")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("字段名称")]),t._v(" "),a("th",[t._v("填写内容")]),t._v(" "),a("th",[t._v("说明")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[t._v("挂载点类型")]),t._v(" "),a("td",[t._v("专有网络")]),t._v(" "),a("td")]),t._v(" "),a("tr",[a("td",[t._v("VPC网络")]),t._v(" "),a("td",[t._v("请选择您的 Kubernetes 集群所在的VPC")]),t._v(" "),a("td")]),t._v(" "),a("tr",[a("td",[t._v("交换机")]),t._v(" "),a("td",[t._v("请选择您的 Kubernetes 集群所在的交换机")]),t._v(" "),a("td")]),t._v(" "),a("tr",[a("td",[t._v("权限组")]),t._v(" "),a("td",[t._v("VPC默认权限组(全部允许)")]),t._v(" "),a("td",[t._v("请选择全部允许")])])])]),t._v(" "),a("p",[a("img",{attrs:{src:_(217),alt:"image-20190717115457614"}})]),t._v(" "),a("ul",[a("li",[t._v("点击 "),a("em",[a("strong",[t._v("确定")])])])]),t._v(" "),a("p",[t._v("点击确定后,将完成挂载点创建,如下图所示:")]),t._v(" "),a("p",[a("img",{attrs:{src:_(218),alt:"image-20190717115829821"}})]),t._v(" "),a("ul",[a("li",[t._v("获取 NFS 连接参数:")])]),t._v(" "),a("p",[t._v("在上图界面中,将 "),a("em",[a("strong",[t._v("V4 Mount")])]),t._v(" 的指令复制下来后,如下所示:")]),t._v(" "),a("div",{staticStyle:{"font-family":"Monaco,Menlo,Consolas,Bitstream Vera Sans Mono,monospace",padding:"20px","background-color":"rgb(244, 244, 245)","border-radius":"4px"}},[t._v("\nsudo mount -t nfs -o vers=4,minorversion=0,noresvport "),a("span",{staticStyle:{color:"red","background-color":"rgb(254, 240, 240)"}},[t._v("189344a39c-lex38.cn-beijing.nas.aliyuncs.com")]),t._v(":"),a("span",{staticStyle:{color:"blue","background-color":"rgb(217, 236, 255)"}},[t._v("/")]),t._v(" /mnt\n")]),t._v(" "),a("p",[t._v("其中红色字体的文字为 NFS Server 的地址,蓝色字体的文字为 NFS Path。如下表所示:")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("字段名称")]),t._v(" "),a("th",[t._v("字段取值")]),t._v(" "),a("th",[t._v("说明")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[t._v("NFS Server")]),t._v(" "),a("td",[t._v("189344a39c-lex38.cn-beijing.nas.aliyuncs.com")]),t._v(" "),a("td")]),t._v(" "),a("tr",[a("td",[t._v("NFS Path")]),t._v(" "),a("td",[t._v("/")]),t._v(" "),a("td",[t._v("NFS Server和NFS Path以冒号分隔")])])])]),t._v(" "),a("h3",{attrs:{id:"在-kuboard-创建存储类"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#在-kuboard-创建存储类","aria-hidden":"true"}},[t._v("#")]),t._v(" 在 Kuboard 创建存储类")]),t._v(" "),a("ul",[a("li",[a("p",[t._v("进入 Kuboard "),a("em",[a("strong",[t._v("集群概览页")])])]),t._v(" "),a("p",[t._v("参考 "),a("a",{attrs:{href:"install/install-dashboard?id=%E8%AE%BF%E9%97%AE"}},[t._v("访问 Kuboard")])]),t._v(" "),a("p",[t._v("如下图所示:")])])]),t._v(" "),a("p",[a("img",{attrs:{src:_(219),alt:"image-20190723112105018"}})]),t._v(" "),a("ul",[a("li",[a("p",[t._v("点击 "),a("em",[a("strong",[t._v("创建存储类")])])]),t._v(" "),a("p",[t._v("填写表单")])])]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("字段名称")]),t._v(" "),a("th",[t._v("填写内容")]),t._v(" "),a("th",[t._v("说明")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[t._v("名称")]),t._v(" "),a("td",[t._v("cluster-storage")]),t._v(" "),a("td",[t._v("填写你喜欢的名称")])]),t._v(" "),a("tr",[a("td",[t._v("限定名称空间")]),t._v(" "),a("td",[t._v("不填写")]),t._v(" "),a("td",[t._v("如果限定名称空间,"),a("br"),t._v("则在 Kuboard 中,您只能在指定的名称空间中使用该存储类"),a("br"),t._v("在 kubectl 中,不受影响")])]),t._v(" "),a("tr",[a("td",[t._v("存储类型")]),t._v(" "),a("td",[t._v("NFS")]),t._v(" "),a("td",[t._v("目前 Kuboard 只支持 NFS,将要增加其他类型的存储,如 CephFS、Cinder 等")])]),t._v(" "),a("tr",[a("td",[t._v("回收策略")]),t._v(" "),a("td",[t._v("回收后删除")]),t._v(" "),a("td",[t._v("当该存储类创建的 存储卷(Persistent Volume)被删除后,之前该存储卷中的文件可以被:回收后删除 / 回收后保留")])]),t._v(" "),a("tr",[a("td",[t._v("存储卷绑定模式")]),t._v(" "),a("td",[t._v("首次使用时绑定")]),t._v(" "),a("td",[t._v("即刻绑定:当 存储卷被创建时,就在 NFS 中为其分配空间,并绑定;"),a("br"),t._v("首次使用时绑定: 在存储卷被第一次使用到时,才绑定")])])])]),t._v(" "),a("p",[a("img",{attrs:{src:_(220),alt:"image-20190723112143032"}})]),t._v(" "),a("ul",[a("li",[t._v("点击 "),a("em",[a("strong",[t._v("保存")])])])]),t._v(" "),a("p",[a("img",{attrs:{src:_(221),alt:"image-20190723112204681"}})]),t._v(" "),a("ul",[a("li",[t._v("点击 "),a("em",[a("strong",[t._v("应用")])])])]),t._v(" "),a("p",[a("img",{attrs:{src:_(222),alt:"image-20190723113250521"}})]),t._v(" "),a("ul",[a("li",[a("p",[t._v("点击 "),a("em",[a("strong",[t._v("完成")])])]),t._v(" "),a("p",[t._v("此时可在存储资源列表中查看到刚创建的存储类")])])]),t._v(" "),a("p",[a("img",{attrs:{src:_(223),alt:"image-20190723113312360"}})])])},[],!1,null,null,null);v.default=r.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/7.8f3815d8.js b/docs/assets/js/7.60ad387b.js similarity index 99% rename from docs/assets/js/7.8f3815d8.js rename to docs/assets/js/7.60ad387b.js index fb0b896..1a5e797 100644 --- a/docs/assets/js/7.8f3815d8.js +++ b/docs/assets/js/7.60ad387b.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[7],{271:function(t,e,s){t.exports=s.p+"assets/img/image-20190720232405147.8fc011f9.png"},272:function(t,e,s){t.exports=s.p+"assets/img/image-20190720233322837.998be85a.png"},273:function(t,e,s){t.exports=s.p+"assets/img/image-20190720233348284.2360801d.png"},274:function(t,e,s){t.exports=s.p+"assets/img/image-20190720233412812.4f5ce20f.png"},275:function(t,e,s){t.exports=s.p+"assets/img/image-20190720233436465.6d8cf61e.png"},276:function(t,e,s){t.exports=s.p+"assets/img/image-20190720233512996.d7ba2b19.png"},277:function(t,e,s){t.exports=s.p+"assets/img/image-20190721000526434.cfdf2d30.png"},278:function(t,e,s){t.exports=s.p+"assets/img/image-20190721000759925.bb32a332.png"},279:function(t,e,s){t.exports=s.p+"assets/img/image-20190721000822458.5797bca7.png"},280:function(t,e,s){t.exports=s.p+"assets/img/image-20190721000847954.6f05e4b8.png"},281:function(t,e,s){t.exports=s.p+"assets/img/image-20190721000919933.3a1d313e.png"},282:function(t,e,s){t.exports=s.p+"assets/img/image-20190721100715898.f0faa9aa.png"},357:function(t,e,s){"use strict";s.r(e);var a=s(0),v=Object(a.a)({},function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"日常调整"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#日常调整","aria-hidden":"true"}},[t._v("#")]),t._v(" 日常调整")]),t._v(" "),a("h2",{attrs:{id:"前提"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#前提","aria-hidden":"true"}},[t._v("#")]),t._v(" 前提")]),t._v(" "),a("p",[t._v("必须具备如下条件:")]),t._v(" "),a("ul",[a("li",[a("p",[t._v("Kubernetes 集群")])]),t._v(" "),a("li",[a("p",[t._v("已在集群中安装 Kuboard")])])]),t._v(" "),a("p",[t._v("假设您一进入 "),a("em",[a("strong",[t._v("example")])]),t._v(" 名称空间页面,如下图所示:")]),t._v(" "),a("p",[a("img",{attrs:{src:s(271),alt:"image-20190720232405147"}})]),t._v(" "),a("h2",{attrs:{id:"批量删除容器组"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#批量删除容器组","aria-hidden":"true"}},[t._v("#")]),t._v(" 批量删除容器组")]),t._v(" "),a("p",[t._v("批量删除容器组特别适用于 "),a("strong",[t._v("开发测试环境的版本更新")]),t._v(" 场景,描述如下:")]),t._v(" "),a("ul",[a("li",[t._v("开发/测试环境中,开发人员提交代码")]),t._v(" "),a("li",[t._v("DevOps环境自动构建出 docker 镜像,并将 docker 镜像推送到仓库;\n"),a("ul",[a("li",[t._v("如果您的 devops 环境只在生成新的 branch 或者 tag 时,生成镜像的新 version,那么原镜像标签的实际镜像已发生改变。")])])]),t._v(" "),a("li",[t._v("从 Kubernetes 中删除该镜像的 容器组")]),t._v(" "),a("li",[t._v("Kubernetes 创建新的 容器组,并且该容器组重新从镜像仓库拉取最新的镜像")])]),t._v(" "),a("p",[t._v("在 Kuboard 中,"),a("em",[a("strong",[t._v("批量删除容器组")])]),t._v(" 的操作步骤为:")]),t._v(" "),a("ul",[a("li",[a("p",[t._v("在名称空间页面点击 "),a("em",[a("strong",[t._v("容器组列表")])])]),t._v(" "),a("ul",[a("li",[a("p",[t._v("选择要筛选的应用分层,并点击刷新,")])]),t._v(" "),a("li",[a("p",[t._v("选择要删除的容器组")])])]),t._v(" "),a("p",[t._v("如下图所示:")])])]),t._v(" "),a("p",[a("img",{attrs:{src:s(272),alt:"image-20190720233322837"}})]),t._v(" "),a("ul",[a("li",[t._v("点击 "),a("em",[a("strong",[t._v("删除")])]),t._v(" 按钮")])]),t._v(" "),a("p",[a("img",{attrs:{src:s(273),alt:"image-20190720233348284"}})]),t._v(" "),a("ul",[a("li",[t._v("点击 "),a("em",[a("strong",[t._v("确定")])])])]),t._v(" "),a("p",[a("img",{attrs:{src:s(274),alt:"image-20190720233412812"}})]),t._v(" "),a("ul",[a("li",[t._v("点击 "),a("em",[a("strong",[t._v("应用")])])])]),t._v(" "),a("p",[a("img",{attrs:{src:s(275),alt:"image-20190720233436465"}})]),t._v(" "),a("ul",[a("li",[a("p",[t._v("点击 "),a("em",[a("strong",[t._v("完成")])])]),t._v(" "),a("p",[t._v("并等待,直到 kubernetes 完成对容器组的调整操作")]),t._v(" "),a("blockquote",[a("p",[t._v("Kuboard 会自动监听 kubernetes 执行此调整操作时的变化,您无需刷新页面,只要等待结果即可。")])])])]),t._v(" "),a("p",[a("img",{attrs:{src:s(276),alt:"image-20190720233512996"}})]),t._v(" "),a("h2",{attrs:{id:"批量调整镜像版本"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#批量调整镜像版本","aria-hidden":"true"}},[t._v("#")]),t._v(" 批量调整镜像版本")]),t._v(" "),a("p",[t._v("批量调整镜像版本适用于如下场景:")]),t._v(" "),a("ul",[a("li",[a("p",[t._v("需要更新容器所使用的镜像的版本号")]),t._v(" "),a("p",[t._v("通常是经过测试的版本,且 DevOps 环境在构建镜像时,为其生成了新的版本号")])])]),t._v(" "),a("p",[t._v("批量调整镜像版本的操作如下:")]),t._v(" "),a("ul",[a("li",[t._v("在名称空间页面点击 "),a("em",[a("strong",[t._v("调整镜像版本")])])])]),t._v(" "),a("p",[a("img",{attrs:{src:s(277),alt:"image-20190721000526434"}})]),t._v(" "),a("ul",[a("li",[a("p",[t._v("在要调整的镜像上点击 "),a("em",[a("strong",[t._v("修改")])])]),t._v(" "),a("p",[t._v("并填写新的镜像版本号,如下图所示:")])])]),t._v(" "),a("p",[a("img",{attrs:{src:s(278),alt:"image-20190721000759925"}})]),t._v(" "),a("ul",[a("li",[t._v("点击 "),a("em",[a("strong",[t._v("执行变更")])])])]),t._v(" "),a("p",[a("img",{attrs:{src:s(279),alt:"image-20190721000822458"}})]),t._v(" "),a("ul",[a("li",[t._v("点击 "),a("em",[a("strong",[t._v("应用")])])])]),t._v(" "),a("p",[a("img",{attrs:{src:s(280),alt:"image-20190721000847954"}})]),t._v(" "),a("ul",[a("li",[a("p",[t._v("点击 "),a("em",[a("strong",[t._v("完成")])])]),t._v(" "),a("p",[t._v("此时会进入容器组列表界面,请等待 Kubernetes 完成对容器组的调整(无需刷新页面)")])])]),t._v(" "),a("p",[a("img",{attrs:{src:s(281),alt:"image-20190721000919933"}})]),t._v(" "),a("h2",{attrs:{id:"批量调整工作负载的副本数"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#批量调整工作负载的副本数","aria-hidden":"true"}},[t._v("#")]),t._v(" 批量调整工作负载的副本数")]),t._v(" "),a("p",[a("em",[a("strong",[t._v("调整容器镜像版本")])]),t._v(" 的功能界面中,也可以用来调整工作负载的副本数,如下图所示:")]),t._v(" "),a("p",[a("img",{attrs:{src:s(282),alt:"image-20190721100715898"}})])])},[],!1,null,null,null);e.default=v.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[7],{271:function(t,e,s){t.exports=s.p+"assets/img/image-20190720232405147.8fc011f9.png"},272:function(t,e,s){t.exports=s.p+"assets/img/image-20190720233322837.998be85a.png"},273:function(t,e,s){t.exports=s.p+"assets/img/image-20190720233348284.2360801d.png"},274:function(t,e,s){t.exports=s.p+"assets/img/image-20190720233412812.4f5ce20f.png"},275:function(t,e,s){t.exports=s.p+"assets/img/image-20190720233436465.6d8cf61e.png"},276:function(t,e,s){t.exports=s.p+"assets/img/image-20190720233512996.d7ba2b19.png"},277:function(t,e,s){t.exports=s.p+"assets/img/image-20190721000526434.cfdf2d30.png"},278:function(t,e,s){t.exports=s.p+"assets/img/image-20190721000759925.bb32a332.png"},279:function(t,e,s){t.exports=s.p+"assets/img/image-20190721000822458.5797bca7.png"},280:function(t,e,s){t.exports=s.p+"assets/img/image-20190721000847954.6f05e4b8.png"},281:function(t,e,s){t.exports=s.p+"assets/img/image-20190721000919933.3a1d313e.png"},282:function(t,e,s){t.exports=s.p+"assets/img/image-20190721100715898.f0faa9aa.png"},358:function(t,e,s){"use strict";s.r(e);var a=s(0),v=Object(a.a)({},function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"日常调整"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#日常调整","aria-hidden":"true"}},[t._v("#")]),t._v(" 日常调整")]),t._v(" "),a("h2",{attrs:{id:"前提"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#前提","aria-hidden":"true"}},[t._v("#")]),t._v(" 前提")]),t._v(" "),a("p",[t._v("必须具备如下条件:")]),t._v(" "),a("ul",[a("li",[a("p",[t._v("Kubernetes 集群")])]),t._v(" "),a("li",[a("p",[t._v("已在集群中安装 Kuboard")])])]),t._v(" "),a("p",[t._v("假设您一进入 "),a("em",[a("strong",[t._v("example")])]),t._v(" 名称空间页面,如下图所示:")]),t._v(" "),a("p",[a("img",{attrs:{src:s(271),alt:"image-20190720232405147"}})]),t._v(" "),a("h2",{attrs:{id:"批量删除容器组"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#批量删除容器组","aria-hidden":"true"}},[t._v("#")]),t._v(" 批量删除容器组")]),t._v(" "),a("p",[t._v("批量删除容器组特别适用于 "),a("strong",[t._v("开发测试环境的版本更新")]),t._v(" 场景,描述如下:")]),t._v(" "),a("ul",[a("li",[t._v("开发/测试环境中,开发人员提交代码")]),t._v(" "),a("li",[t._v("DevOps环境自动构建出 docker 镜像,并将 docker 镜像推送到仓库;\n"),a("ul",[a("li",[t._v("如果您的 devops 环境只在生成新的 branch 或者 tag 时,生成镜像的新 version,那么原镜像标签的实际镜像已发生改变。")])])]),t._v(" "),a("li",[t._v("从 Kubernetes 中删除该镜像的 容器组")]),t._v(" "),a("li",[t._v("Kubernetes 创建新的 容器组,并且该容器组重新从镜像仓库拉取最新的镜像")])]),t._v(" "),a("p",[t._v("在 Kuboard 中,"),a("em",[a("strong",[t._v("批量删除容器组")])]),t._v(" 的操作步骤为:")]),t._v(" "),a("ul",[a("li",[a("p",[t._v("在名称空间页面点击 "),a("em",[a("strong",[t._v("容器组列表")])])]),t._v(" "),a("ul",[a("li",[a("p",[t._v("选择要筛选的应用分层,并点击刷新,")])]),t._v(" "),a("li",[a("p",[t._v("选择要删除的容器组")])])]),t._v(" "),a("p",[t._v("如下图所示:")])])]),t._v(" "),a("p",[a("img",{attrs:{src:s(272),alt:"image-20190720233322837"}})]),t._v(" "),a("ul",[a("li",[t._v("点击 "),a("em",[a("strong",[t._v("删除")])]),t._v(" 按钮")])]),t._v(" "),a("p",[a("img",{attrs:{src:s(273),alt:"image-20190720233348284"}})]),t._v(" "),a("ul",[a("li",[t._v("点击 "),a("em",[a("strong",[t._v("确定")])])])]),t._v(" "),a("p",[a("img",{attrs:{src:s(274),alt:"image-20190720233412812"}})]),t._v(" "),a("ul",[a("li",[t._v("点击 "),a("em",[a("strong",[t._v("应用")])])])]),t._v(" "),a("p",[a("img",{attrs:{src:s(275),alt:"image-20190720233436465"}})]),t._v(" "),a("ul",[a("li",[a("p",[t._v("点击 "),a("em",[a("strong",[t._v("完成")])])]),t._v(" "),a("p",[t._v("并等待,直到 kubernetes 完成对容器组的调整操作")]),t._v(" "),a("blockquote",[a("p",[t._v("Kuboard 会自动监听 kubernetes 执行此调整操作时的变化,您无需刷新页面,只要等待结果即可。")])])])]),t._v(" "),a("p",[a("img",{attrs:{src:s(276),alt:"image-20190720233512996"}})]),t._v(" "),a("h2",{attrs:{id:"批量调整镜像版本"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#批量调整镜像版本","aria-hidden":"true"}},[t._v("#")]),t._v(" 批量调整镜像版本")]),t._v(" "),a("p",[t._v("批量调整镜像版本适用于如下场景:")]),t._v(" "),a("ul",[a("li",[a("p",[t._v("需要更新容器所使用的镜像的版本号")]),t._v(" "),a("p",[t._v("通常是经过测试的版本,且 DevOps 环境在构建镜像时,为其生成了新的版本号")])])]),t._v(" "),a("p",[t._v("批量调整镜像版本的操作如下:")]),t._v(" "),a("ul",[a("li",[t._v("在名称空间页面点击 "),a("em",[a("strong",[t._v("调整镜像版本")])])])]),t._v(" "),a("p",[a("img",{attrs:{src:s(277),alt:"image-20190721000526434"}})]),t._v(" "),a("ul",[a("li",[a("p",[t._v("在要调整的镜像上点击 "),a("em",[a("strong",[t._v("修改")])])]),t._v(" "),a("p",[t._v("并填写新的镜像版本号,如下图所示:")])])]),t._v(" "),a("p",[a("img",{attrs:{src:s(278),alt:"image-20190721000759925"}})]),t._v(" "),a("ul",[a("li",[t._v("点击 "),a("em",[a("strong",[t._v("执行变更")])])])]),t._v(" "),a("p",[a("img",{attrs:{src:s(279),alt:"image-20190721000822458"}})]),t._v(" "),a("ul",[a("li",[t._v("点击 "),a("em",[a("strong",[t._v("应用")])])])]),t._v(" "),a("p",[a("img",{attrs:{src:s(280),alt:"image-20190721000847954"}})]),t._v(" "),a("ul",[a("li",[a("p",[t._v("点击 "),a("em",[a("strong",[t._v("完成")])])]),t._v(" "),a("p",[t._v("此时会进入容器组列表界面,请等待 Kubernetes 完成对容器组的调整(无需刷新页面)")])])]),t._v(" "),a("p",[a("img",{attrs:{src:s(281),alt:"image-20190721000919933"}})]),t._v(" "),a("h2",{attrs:{id:"批量调整工作负载的副本数"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#批量调整工作负载的副本数","aria-hidden":"true"}},[t._v("#")]),t._v(" 批量调整工作负载的副本数")]),t._v(" "),a("p",[a("em",[a("strong",[t._v("调整容器镜像版本")])]),t._v(" 的功能界面中,也可以用来调整工作负载的副本数,如下图所示:")]),t._v(" "),a("p",[a("img",{attrs:{src:s(282),alt:"image-20190721100715898"}})])])},[],!1,null,null,null);e.default=v.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/app.b0eaf38d.js b/docs/assets/js/app.3c8f40d1.js similarity index 67% rename from docs/assets/js/app.b0eaf38d.js rename to docs/assets/js/app.3c8f40d1.js index bedf351..06da779 100644 --- a/docs/assets/js/app.b0eaf38d.js +++ b/docs/assets/js/app.3c8f40d1.js @@ -1,4 +1,4 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[0],[]]);!function(t){function e(e){for(var r,a,s=e[0],l=e[1],c=e[2],p=0,f=[];p0?r:n)(t)}},function(t,e,n){},function(t,e,n){},function(t,e,n){},function(t,e,n){var r,o; +(window.webpackJsonp=window.webpackJsonp||[]).push([[0],[]]);!function(t){function e(e){for(var r,a,s=e[0],l=e[1],c=e[2],p=0,f=[];p0?r:n)(t)}},function(t,e,n){},function(t,e,n){},function(t,e,n){},function(t,e,n){var r,o; /* NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress * @license MIT */void 0===(o="function"==typeof(r=function(){var t,e,n={version:"0.2.0"},r=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'
'};function o(t,e,n){return tn?n:t}function i(t){return 100*(-1+t)}n.configure=function(t){var e,n;for(e in t)void 0!==(n=t[e])&&t.hasOwnProperty(e)&&(r[e]=n);return this},n.status=null,n.set=function(t){var e=n.isStarted();t=o(t,r.minimum,1),n.status=1===t?null:t;var l=n.render(!e),c=l.querySelector(r.barSelector),u=r.speed,p=r.easing;return l.offsetWidth,a(function(e){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),s(c,function(t,e,n){var o;return(o="translate3d"===r.positionUsing?{transform:"translate3d("+i(t)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+i(t)+"%,0)"}:{"margin-left":i(t)+"%"}).transition="all "+e+"ms "+n,o}(t,u,p)),1===t?(s(l,{transition:"none",opacity:1}),l.offsetWidth,setTimeout(function(){s(l,{transition:"all "+u+"ms linear",opacity:0}),setTimeout(function(){n.remove(),e()},u)},u)):setTimeout(e,u)}),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var t=function(){setTimeout(function(){n.status&&(n.trickle(),t())},r.trickleSpeed)};return r.trickle&&t(),this},n.done=function(t){return t||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(t){var e=n.status;return e?("number"!=typeof t&&(t=(1-e)*o(Math.random()*e,.1,.95)),e=o(e+t,0,.994),n.set(e)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},t=0,e=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===e&&n.start(),t++,e++,r.always(function(){0==--e?(t=0,n.done()):n.set((t-e)/t)}),this):this},n.render=function(t){if(n.isRendered())return document.getElementById("nprogress");c(document.documentElement,"nprogress-busy");var e=document.createElement("div");e.id="nprogress",e.innerHTML=r.template;var o,a=e.querySelector(r.barSelector),l=t?"-100":i(n.status||0),u=document.querySelector(r.parent);return s(a,{transition:"all 0 linear",transform:"translate3d("+l+"%,0,0)"}),r.showSpinner||(o=e.querySelector(r.spinnerSelector))&&f(o),u!=document.body&&c(u,"nprogress-custom-parent"),u.appendChild(e),e},n.remove=function(){u(document.documentElement,"nprogress-busy"),u(document.querySelector(r.parent),"nprogress-custom-parent");var t=document.getElementById("nprogress");t&&f(t)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var t=document.body.style,e="WebkitTransform"in t?"Webkit":"MozTransform"in t?"Moz":"msTransform"in t?"ms":"OTransform"in t?"O":"";return e+"Perspective"in t?"translate3d":e+"Transform"in t?"translate":"margin"};var a=function(){var t=[];function e(){var n=t.shift();n&&n(e)}return function(n){t.push(n),1==t.length&&e()}}(),s=function(){var t=["Webkit","O","Moz","ms"],e={};function n(n){return n=n.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,function(t,e){return e.toUpperCase()}),e[n]||(e[n]=function(e){var n=document.body.style;if(e in n)return e;for(var r,o=t.length,i=e.charAt(0).toUpperCase()+e.slice(1);o--;)if((r=t[o]+i)in n)return r;return e}(n))}function r(t,e,r){e=n(e),t.style[e]=r}return function(t,e){var n,o,i=arguments;if(2==i.length)for(n in e)void 0!==(o=e[n])&&e.hasOwnProperty(n)&&r(t,n,o);else r(t,i[1],i[2])}}();function l(t,e){var n="string"==typeof t?t:p(t);return n.indexOf(" "+e+" ")>=0}function c(t,e){var n=p(t),r=n+e;l(n,e)||(t.className=r.substring(1))}function u(t,e){var n,r=p(t);l(t,e)&&(n=r.replace(" "+e+" "," "),t.className=n.substring(1,n.length-1))}function p(t){return(" "+(t.className||"")+" ").replace(/\s+/gi," ")}function f(t){t&&t.parentNode&&t.parentNode.removeChild(t)}return n})?r.call(e,n,e,t):r)||(t.exports=o)},function(t,e,n){var r=n(26)("wks"),o=n(27),i=n(2).Symbol,a="function"==typeof i;(t.exports=function(t){return r[t]||(r[t]=a&&i[t]||(a?i:o)("Symbol."+t))}).store=r},function(t,e,n){var r=n(9),o=n(35);t.exports=n(3)?function(t,e,n){return r.f(t,e,o(1,n))}:function(t,e,n){return t[e]=n,t}},function(t,e,n){var r=n(2),o=n(18),i=n(8),a=n(27)("src"),s=n(81),l=(""+s).split("toString");n(21).inspectSource=function(t){return s.call(t)},(t.exports=function(t,e,n,s){var c="function"==typeof n;c&&(i(n,"name")||o(n,"name",e)),t[e]!==n&&(c&&(i(n,a)||o(n,a,t[e]?""+t[e]:l.join(String(e)))),t===r?t[e]=n:s?t[e]?t[e]=n:o(t,e,n):(delete t[e],o(t,e,n)))})(Function.prototype,"toString",function(){return"function"==typeof this&&this[a]||s.call(this)})},function(t,e,n){var r=n(44),o=n(7);t.exports=function(t){return r(o(t))}},function(t,e){var n=t.exports={version:"2.6.9"};"number"==typeof __e&&(__e=n)},function(t,e,n){"use strict";var r=n(5);t.exports=function(t,e){return!!t&&r(function(){e?t.call(null,function(){},1):t.call(null)})}},function(t,e,n){var r=n(12),o=Math.min;t.exports=function(t){return t>0?o(r(t),9007199254740991):0}},function(t,e,n){var r=n(42);t.exports=function(t,e,n){if(r(t),void 0===e)return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,r){return t.call(e,n,r)};case 3:return function(n,r,o){return t.call(e,n,r,o)}}return function(){return t.apply(e,arguments)}}},function(t,e,n){var r=n(4);t.exports=function(t,e){if(!r(t))return t;var n,o;if(e&&"function"==typeof(n=t.toString)&&!r(o=n.call(t)))return o;if("function"==typeof(n=t.valueOf)&&!r(o=n.call(t)))return o;if(!e&&"function"==typeof(n=t.toString)&&!r(o=n.call(t)))return o;throw TypeError("Can't convert object to primitive value")}},function(t,e,n){var r=n(21),o=n(2),i=o["__core-js_shared__"]||(o["__core-js_shared__"]={});(t.exports=function(t,e){return i[t]||(i[t]=void 0!==e?e:{})})("versions",[]).push({version:r.version,mode:n(61)?"pure":"global",copyright:"© 2019 Denis Pushkarev (zloirock.ru)"})},function(t,e){var n=0,r=Math.random();t.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++n+r).toString(36))}},function(t,e){t.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(t,e){t.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},function(t,e,n){var r=n(9).f,o=Function.prototype,i=/^\s*function ([^ (]*)/;"name"in o||n(3)&&r(o,"name",{configurable:!0,get:function(){try{return(""+this).match(i)[1]}catch(t){return""}}})},function(t,e){var n=t.exports={version:"2.6.9"};"number"==typeof __e&&(__e=n)},function(t,e,n){var r=n(7);t.exports=function(t){return Object(r(t))}},function(t,e){var n=t.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=n)},function(t,e,n){var r=n(59),o=n(95),i=n(96),a=Object.defineProperty;e.f=n(11)?Object.defineProperty:function(t,e,n){if(r(t),e=i(e,!0),r(n),o)try{return a(t,e,n)}catch(t){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(t[e]=n.value),t}},function(t,e){t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},function(t,e,n){var r=n(26)("keys"),o=n(27);t.exports=function(t){return r[t]||(r[t]=o(t))}},function(t,e,n){var r=n(24),o=n(44),i=n(32),a=n(23),s=n(86);t.exports=function(t,e){var n=1==t,l=2==t,c=3==t,u=4==t,p=6==t,f=5==t||p,d=e||s;return function(e,s,h){for(var v,m,g=i(e),y=o(g),b=r(s,h,3),_=a(y.length),w=0,x=n?d(e,_):l?d(e,0):void 0;_>w;w++)if((f||w in y)&&(m=b(v=y[w],w,g),t))if(n)x[w]=m;else if(m)switch(t){case 3:return!0;case 5:return v;case 6:return w;case 2:x.push(v)}else if(u)return!1;return p?-1:c||u?u:x}}},function(t,e,n){"use strict";var r=n(1),o=n(48)(!1),i=[].indexOf,a=!!i&&1/[1].indexOf(1,-0)<0;r(r.P+r.F*(a||!n(22)(i)),"Array",{indexOf:function(t){return a?i.apply(this,arguments)||0:o(this,t,arguments[1])}})},function(t,e,n){"use strict";var r=n(6),o=n(32),i=n(23),a=n(12),s=n(70),l=n(71),c=Math.max,u=Math.min,p=Math.floor,f=/\$([$&`']|\d\d?|<[^>]*>)/g,d=/\$([$&`']|\d\d?)/g;n(72)("replace",2,function(t,e,n,h){return[function(r,o){var i=t(this),a=null==r?void 0:r[e];return void 0!==a?a.call(r,i,o):n.call(String(i),r,o)},function(t,e){var o=h(n,t,this,e);if(o.done)return o.value;var p=r(t),f=String(this),d="function"==typeof e;d||(e=String(e));var m=p.global;if(m){var g=p.unicode;p.lastIndex=0}for(var y=[];;){var b=l(p,f);if(null===b)break;if(y.push(b),!m)break;""===String(b[0])&&(p.lastIndex=s(f,i(p.lastIndex),g))}for(var _,w="",x=0,k=0;k=x&&(w+=f.slice(x,$)+A,x=$+O.length)}return w+f.slice(x)}];function v(t,e,r,i,a,s){var l=r+t.length,c=i.length,u=d;return void 0!==a&&(a=o(a),u=f),n.call(s,u,function(n,o){var s;switch(o.charAt(0)){case"$":return"$";case"&":return t;case"`":return e.slice(0,r);case"'":return e.slice(l);case"<":s=a[o.slice(1,-1)];break;default:var u=+o;if(0===u)return n;if(u>c){var f=p(u/10);return 0===f?n:f<=c?void 0===i[f-1]?o.charAt(1):i[f-1]+o.charAt(1):n}s=i[u-1]}return void 0===s?"":s})}})},function(t,e,n){"use strict";var r=n(1),o=n(37)(2);r(r.P+r.F*!n(22)([].filter,!0),"Array",{filter:function(t){return o(this,t,arguments[1])}})},function(t,e,n){var r=n(1);r(r.S,"Array",{isArray:n(49)})},function(t,e){t.exports=function(t){if("function"!=typeof t)throw TypeError(t+" is not a function!");return t}},function(t,e,n){var r=n(79),o=n(35),i=n(20),a=n(25),s=n(8),l=n(45),c=Object.getOwnPropertyDescriptor;e.f=n(3)?c:function(t,e){if(t=i(t),e=a(e,!0),l)try{return c(t,e)}catch(t){}if(s(t,e))return o(!r.f.call(t,e),t[e])}},function(t,e,n){var r=n(10);t.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==r(t)?t.split(""):Object(t)}},function(t,e,n){t.exports=!n(3)&&!n(5)(function(){return 7!=Object.defineProperty(n(46)("div"),"a",{get:function(){return 7}}).a})},function(t,e,n){var r=n(4),o=n(2).document,i=r(o)&&r(o.createElement);t.exports=function(t){return i?o.createElement(t):{}}},function(t,e,n){var r=n(8),o=n(20),i=n(48)(!1),a=n(36)("IE_PROTO");t.exports=function(t,e){var n,s=o(t),l=0,c=[];for(n in s)n!=a&&r(s,n)&&c.push(n);for(;e.length>l;)r(s,n=e[l++])&&(~i(c,n)||c.push(n));return c}},function(t,e,n){var r=n(20),o=n(23),i=n(80);t.exports=function(t){return function(e,n,a){var s,l=r(e),c=o(l.length),u=i(a,c);if(t&&n!=n){for(;c>u;)if((s=l[u++])!=s)return!0}else for(;c>u;u++)if((t||u in l)&&l[u]===n)return t||u||0;return!t&&-1}}},function(t,e,n){var r=n(10);t.exports=Array.isArray||function(t){return"Array"==r(t)}},function(t,e){t.exports=function(t){try{return!!t()}catch(t){return!0}}},function(t,e,n){"use strict";var r,o,i=n(73),a=RegExp.prototype.exec,s=String.prototype.replace,l=a,c=(r=/a/,o=/b*/g,a.call(r,"a"),a.call(o,"a"),0!==r.lastIndex||0!==o.lastIndex),u=void 0!==/()??/.exec("")[1];(c||u)&&(l=function(t){var e,n,r,o,l=this;return u&&(n=new RegExp("^"+l.source+"$(?!\\s)",i.call(l))),c&&(e=l.lastIndex),r=a.call(l,t),c&&r&&(l.lastIndex=l.global?r.index+r[0].length:e),u&&r&&r.length>1&&s.call(r[0],n,function(){for(o=1;o=e||n<0||f&&t-u>=a}function w(){var t=m();if(_(t))return x(t);l=setTimeout(w,function(t){var n=e-(t-c);return f?v(n,a-(t-u)):n}(t))}function x(t){return l=void 0,d&&o?g(t):(o=i=void 0,s)}function k(){var t=m(),n=_(t);if(o=arguments,i=this,c=t,n){if(void 0===l)return function(t){return u=t,l=setTimeout(w,e),p?g(t):s}(c);if(f)return l=setTimeout(w,e),g(c)}return void 0===l&&(l=setTimeout(w,e)),s}return e=b(e)||0,y(r)&&(p=!!r.leading,a=(f="maxWait"in r)?h(b(r.maxWait)||0,e):a,d="trailing"in r?!!r.trailing:d),k.cancel=function(){void 0!==l&&clearTimeout(l),u=0,o=c=i=l=void 0},k.flush=function(){return void 0===l?s:x(m())},k}function y(t){var e=typeof t;return!!t&&("object"==e||"function"==e)}function b(t){if("number"==typeof t)return t;if(function(t){return"symbol"==typeof t||function(t){return!!t&&"object"==typeof t}(t)&&d.call(t)==o}(t))return r;if(y(t)){var e="function"==typeof t.valueOf?t.valueOf():t;t=y(e)?e+"":e}if("string"!=typeof t)return 0===t?t:+t;t=t.replace(i,"");var n=s.test(t);return n||l.test(t)?c(t.slice(2),n?2:8):a.test(t)?r:+t}t.exports=function(t,e,r){var o=!0,i=!0;if("function"!=typeof t)throw new TypeError(n);return y(r)&&(o="leading"in r?!!r.leading:o,i="trailing"in r?!!r.trailing:i),g(t,e,{leading:o,maxWait:e,trailing:i})}},function(t,e){var n="Expected a function",r=NaN,o="[object Symbol]",i=/^\s+|\s+$/g,a=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,l=/^0o[0-7]+$/i,c=parseInt,u="object"==typeof global&&global&&global.Object===Object&&global,p="object"==typeof self&&self&&self.Object===Object&&self,f=u||p||Function("return this")(),d=Object.prototype.toString,h=Math.max,v=Math.min,m=function(){return f.Date.now()};function g(t){var e=typeof t;return!!t&&("object"==e||"function"==e)}function y(t){if("number"==typeof t)return t;if(function(t){return"symbol"==typeof t||function(t){return!!t&&"object"==typeof t}(t)&&d.call(t)==o}(t))return r;if(g(t)){var e="function"==typeof t.valueOf?t.valueOf():t;t=g(e)?e+"":e}if("string"!=typeof t)return 0===t?t:+t;t=t.replace(i,"");var n=s.test(t);return n||l.test(t)?c(t.slice(2),n?2:8):a.test(t)?r:+t}t.exports=function(t,e,r){var o,i,a,s,l,c,u=0,p=!1,f=!1,d=!0;if("function"!=typeof t)throw new TypeError(n);function b(e){var n=o,r=i;return o=i=void 0,u=e,s=t.apply(r,n)}function _(t){var n=t-c;return void 0===c||n>=e||n<0||f&&t-u>=a}function w(){var t=m();if(_(t))return x(t);l=setTimeout(w,function(t){var n=e-(t-c);return f?v(n,a-(t-u)):n}(t))}function x(t){return l=void 0,d&&o?b(t):(o=i=void 0,s)}function k(){var t=m(),n=_(t);if(o=arguments,i=this,c=t,n){if(void 0===l)return function(t){return u=t,l=setTimeout(w,e),p?b(t):s}(c);if(f)return l=setTimeout(w,e),b(c)}return void 0===l&&(l=setTimeout(w,e)),s}return e=y(e)||0,g(r)&&(p=!!r.leading,a=(f="maxWait"in r)?h(y(r.maxWait)||0,e):a,d="trailing"in r?!!r.trailing:d),k.cancel=function(){void 0!==l&&clearTimeout(l),u=0,o=c=i=l=void 0},k.flush=function(){return void 0===l?s:x(m())},k}},function(t,e,n){t.exports=n(92)},function(t,e,n){"use strict";function r(){return(r=Object.assign||function(t){for(var e,n=1;ndocument.F=Object<\/script>"),t.close(),l=t.F;r--;)delete l.prototype[i[r]];return l()};t.exports=Object.create||function(t,e){var n;return null!==t?(s.prototype=r(t),n=new s,s.prototype=null,n[a]=t):n=l(),void 0===e?n:o(n,e)}},function(t,e){t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},function(t,e,n){"use strict";var r=n(1),o=n(37)(1);r(r.P+r.F*!n(22)([].map,!0),"Array",{map:function(t){return o(this,t,arguments[1])}})},function(t,e,n){var r=n(4),o=n(78).set;t.exports=function(t,e,n){var i,a=e.constructor;return a!==n&&"function"==typeof a&&(i=a.prototype)!==n.prototype&&r(i)&&o&&o(t,i),t}},function(t,e,n){var r=n(47),o=n(28).concat("length","prototype");e.f=Object.getOwnPropertyNames||function(t){return r(t,o)}},function(t,e,n){var r=n(1),o=n(7),i=n(5),a=n(82),s="["+a+"]",l=RegExp("^"+s+s+"*"),c=RegExp(s+s+"*$"),u=function(t,e,n){var o={},s=i(function(){return!!a[t]()||"​…"!="​…"[t]()}),l=o[t]=s?e(p):a[t];n&&(o[n]=l),r(r.P+r.F*s,"String",o)},p=u.trim=function(t,e){return t=String(o(t)),1&e&&(t=t.replace(l,"")),2&e&&(t=t.replace(c,"")),t};t.exports=u},function(t,e,n){var r=n(94);t.exports=function(t,e,n){if(r(t),void 0===e)return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,r){return t.call(e,n,r)};case 3:return function(n,r,o){return t.call(e,n,r,o)}}return function(){return t.apply(e,arguments)}}},function(t,e,n){var r=n(29),o=n(33).document,i=r(o)&&r(o.createElement);t.exports=function(t){return i?o.createElement(t):{}}},function(t,e,n){"use strict";var r=n(97)(!0);t.exports=function(t,e,n){return e+(n?r(t,e).length:1)}},function(t,e,n){"use strict";var r=n(98),o=RegExp.prototype.exec;t.exports=function(t,e){var n=t.exec;if("function"==typeof n){var i=n.call(t,e);if("object"!=typeof i)throw new TypeError("RegExp exec method returned something other than an Object or null");return i}if("RegExp"!==r(t))throw new TypeError("RegExp#exec called on incompatible receiver");return o.call(t,e)}},function(t,e,n){"use strict";n(99);var r=n(19),o=n(18),i=n(5),a=n(7),s=n(17),l=n(51),c=s("species"),u=!i(function(){var t=/./;return t.exec=function(){var t=[];return t.groups={a:"7"},t},"7"!=="".replace(t,"$
")}),p=function(){var t=/(?:)/,e=t.exec;t.exec=function(){return e.apply(this,arguments)};var n="ab".split(t);return 2===n.length&&"a"===n[0]&&"b"===n[1]}();t.exports=function(t,e,n){var f=s(t),d=!i(function(){var e={};return e[f]=function(){return 7},7!=""[t](e)}),h=d?!i(function(){var e=!1,n=/a/;return n.exec=function(){return e=!0,null},"split"===t&&(n.constructor={},n.constructor[c]=function(){return n}),n[f](""),!e}):void 0;if(!d||!h||"replace"===t&&!u||"split"===t&&!p){var v=/./[f],m=n(a,f,""[t],function(t,e,n,r,o){return e.exec===l?d&&!o?{done:!0,value:v.call(e,n,r)}:{done:!0,value:t.call(n,e,r)}:{done:!1}}),g=m[0],y=m[1];r(String.prototype,t,g),o(RegExp.prototype,f,2==e?function(t,e){return y.call(t,this,e)}:function(t){return y.call(t,this)})}}},function(t,e,n){"use strict";var r=n(6);t.exports=function(){var t=r(this),e="";return t.global&&(e+="g"),t.ignoreCase&&(e+="i"),t.multiline&&(e+="m"),t.unicode&&(e+="u"),t.sticky&&(e+="y"),e}},function(t,e,n){t.exports=n(102)},function(t,e,n){Promise.all([n.e(0),n.e(38)]).then(n.t.bind(null,103,7))},function(t,e,n){},function(t,e,n){"use strict";var r=n(2),o=n(8),i=n(10),a=n(65),s=n(25),l=n(5),c=n(66).f,u=n(43).f,p=n(9).f,f=n(67).trim,d=r.Number,h=d,v=d.prototype,m="Number"==i(n(62)(v)),g="trim"in String.prototype,y=function(t){var e=s(t,!1);if("string"==typeof e&&e.length>2){var n,r,o,i=(e=g?e.trim():f(e,3)).charCodeAt(0);if(43===i||45===i){if(88===(n=e.charCodeAt(2))||120===n)return NaN}else if(48===i){switch(e.charCodeAt(1)){case 66:case 98:r=2,o=49;break;case 79:case 111:r=8,o=55;break;default:return+e}for(var a,l=e.slice(2),c=0,u=l.length;co)return NaN;return parseInt(l,r)}}return+e};if(!d(" 0o1")||!d("0b1")||d("+0x1")){d=function(t){var e=arguments.length<1?0:t,n=this;return n instanceof d&&(m?l(function(){v.valueOf.call(n)}):"Number"!=i(n))?a(new h(y(e)),n,d):y(e)};for(var b,_=n(3)?c(h):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),w=0;_.length>w;w++)o(h,b=_[w])&&!o(d,b)&&p(d,b,u(h,b));d.prototype=v,v.constructor=d,n(19)(r,"Number",d)}},function(t,e,n){var r=n(4),o=n(6),i=function(t,e){if(o(t),!r(e)&&null!==e)throw TypeError(e+": can't set as prototype!")};t.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(t,e,r){try{(r=n(24)(Function.call,n(43).f(Object.prototype,"__proto__").set,2))(t,[]),e=!(t instanceof Array)}catch(t){e=!0}return function(t,n){return i(t,n),e?t.__proto__=n:r(t,n),t}}({},!1):void 0),check:i}},function(t,e){e.f={}.propertyIsEnumerable},function(t,e,n){var r=n(12),o=Math.max,i=Math.min;t.exports=function(t,e){return(t=r(t))<0?o(t+e,0):i(t,e)}},function(t,e,n){t.exports=n(26)("native-function-to-string",Function.toString)},function(t,e){t.exports="\t\n\v\f\r   ᠎              \u2028\u2029\ufeff"},function(t,e,n){var r=n(9),o=n(6),i=n(56);t.exports=n(3)?Object.defineProperties:function(t,e){o(t);for(var n,a=i(e),s=a.length,l=0;s>l;)r.f(t,n=a[l++],e[n]);return t}},function(t,e,n){var r=n(2).document;t.exports=r&&r.documentElement},function(t,e,n){"use strict";var r=n(13);n.n(r).a},function(t,e,n){var r=n(87);t.exports=function(t,e){return new(r(t))(e)}},function(t,e,n){var r=n(4),o=n(49),i=n(17)("species");t.exports=function(t){var e;return o(t)&&("function"!=typeof(e=t.constructor)||e!==Array&&!o(e.prototype)||(e=void 0),r(e)&&null===(e=e[i])&&(e=void 0)),void 0===e?Array:e}},function(t,e,n){"use strict";var r=n(14);n.n(r).a},function(t,e,n){var r=n(1);r(r.P,"Function",{bind:n(90)})},function(t,e,n){"use strict";var r=n(42),o=n(4),i=n(91),a=[].slice,s={},l=function(t,e,n){if(!(e in s)){for(var r=[],o=0;o=c?t?"":void 0:(i=s.charCodeAt(l))<55296||i>56319||l+1===c||(a=s.charCodeAt(l+1))<56320||a>57343?t?s.charAt(l):i:t?s.slice(l,l+2):a-56320+(i-55296<<10)+65536}}},function(t,e,n){var r=n(10),o=n(17)("toStringTag"),i="Arguments"==r(function(){return arguments}());t.exports=function(t){var e,n,a;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(n=function(t,e){try{return t[e]}catch(t){}}(e=Object(t),o))?n:i?r(e):"Object"==(a=r(e))&&"function"==typeof e.callee?"Arguments":a}},function(t,e,n){"use strict";var r=n(51);n(1)({target:"RegExp",proto:!0,forced:r!==/./.exec},{exec:r})},function(t,e,n){},function(t,e,n){"use strict";var r=n(15);n.n(r).a},function(t,e,n){"use strict";n.r(e); /*! @@ -11,4 +11,4 @@ var r=Object.freeze({});function o(t){return null==t}function i(t){return null!= * vue-router v3.0.7 * (c) 2019 Evan You * @license MIT - */function Do(t){return Object.prototype.toString.call(t).indexOf("Error")>-1}function Ko(t,e){for(var n in e)t[n]=e[n];return t}var zo={name:"RouterView",functional:!0,props:{name:{type:String,default:"default"}},render:function(t,e){var n=e.props,r=e.children,o=e.parent,i=e.data;i.routerView=!0;for(var a=o.$createElement,s=n.name,l=o.$route,c=o._routerViewCache||(o._routerViewCache={}),u=0,p=!1;o&&o._routerRoot!==o;){var f=o.$vnode&&o.$vnode.data;f&&(f.routerView&&u++,f.keepAlive&&o._inactive&&(p=!0)),o=o.$parent}if(i.routerViewDepth=u,p)return a(c[s],i,r);var d=l.matched[u];if(!d)return c[s]=null,a();var h=c[s]=d.components[s];i.registerRouteInstance=function(t,e){var n=d.instances[s];(e&&n!==t||!e&&n===t)&&(d.instances[s]=e)},(i.hook||(i.hook={})).prepatch=function(t,e){d.instances[s]=e.componentInstance},i.hook.init=function(t){t.data.keepAlive&&t.componentInstance&&t.componentInstance!==d.instances[s]&&(d.instances[s]=t.componentInstance)};var v=i.props=function(t,e){switch(typeof e){case"undefined":return;case"object":return e;case"function":return e(t);case"boolean":return e?t.params:void 0;default:0}}(l,d.props&&d.props[s]);if(v){v=i.props=Ko({},v);var m=i.attrs=i.attrs||{};for(var g in v)h.props&&g in h.props||(m[g]=v[g],delete v[g])}return a(h,i,r)}};var Bo=/[!'()*]/g,Vo=function(t){return"%"+t.charCodeAt(0).toString(16)},Ho=/%2C/g,Zo=function(t){return encodeURIComponent(t).replace(Bo,Vo).replace(Ho,",")},Wo=decodeURIComponent;function qo(t){var e={};return(t=t.trim().replace(/^(\?|#|&)/,""))?(t.split("&").forEach(function(t){var n=t.replace(/\+/g," ").split("="),r=Wo(n.shift()),o=n.length>0?Wo(n.join("=")):null;void 0===e[r]?e[r]=o:Array.isArray(e[r])?e[r].push(o):e[r]=[e[r],o]}),e):e}function Yo(t){var e=t?Object.keys(t).map(function(e){var n=t[e];if(void 0===n)return"";if(null===n)return Zo(e);if(Array.isArray(n)){var r=[];return n.forEach(function(t){void 0!==t&&(null===t?r.push(Zo(e)):r.push(Zo(e)+"="+Zo(t)))}),r.join("&")}return Zo(e)+"="+Zo(n)}).filter(function(t){return t.length>0}).join("&"):null;return e?"?"+e:""}var Xo=/\/?$/;function Jo(t,e,n,r){var o=r&&r.options.stringifyQuery,i=e.query||{};try{i=Go(i)}catch(t){}var a={name:e.name||t&&t.name,meta:t&&t.meta||{},path:e.path||"/",hash:e.hash||"",query:i,params:e.params||{},fullPath:ei(e,o),matched:t?ti(t):[]};return n&&(a.redirectedFrom=ei(n,o)),Object.freeze(a)}function Go(t){if(Array.isArray(t))return t.map(Go);if(t&&"object"==typeof t){var e={};for(var n in t)e[n]=Go(t[n]);return e}return t}var Qo=Jo(null,{path:"/"});function ti(t){for(var e=[];t;)e.unshift(t),t=t.parent;return e}function ei(t,e){var n=t.path,r=t.query;void 0===r&&(r={});var o=t.hash;return void 0===o&&(o=""),(n||"/")+(e||Yo)(r)+o}function ni(t,e){return e===Qo?t===e:!!e&&(t.path&&e.path?t.path.replace(Xo,"")===e.path.replace(Xo,"")&&t.hash===e.hash&&ri(t.query,e.query):!(!t.name||!e.name)&&(t.name===e.name&&t.hash===e.hash&&ri(t.query,e.query)&&ri(t.params,e.params)))}function ri(t,e){if(void 0===t&&(t={}),void 0===e&&(e={}),!t||!e)return t===e;var n=Object.keys(t),r=Object.keys(e);return n.length===r.length&&n.every(function(n){var r=t[n],o=e[n];return"object"==typeof r&&"object"==typeof o?ri(r,o):String(r)===String(o)})}var oi,ii=[String,Object],ai=[String,Array],si={name:"RouterLink",props:{to:{type:ii,required:!0},tag:{type:String,default:"a"},exact:Boolean,append:Boolean,replace:Boolean,activeClass:String,exactActiveClass:String,event:{type:ai,default:"click"}},render:function(t){var e=this,n=this.$router,r=this.$route,o=n.resolve(this.to,r,this.append),i=o.location,a=o.route,s=o.href,l={},c=n.options.linkActiveClass,u=n.options.linkExactActiveClass,p=null==c?"router-link-active":c,f=null==u?"router-link-exact-active":u,d=null==this.activeClass?p:this.activeClass,h=null==this.exactActiveClass?f:this.exactActiveClass,v=i.path?Jo(null,i,null,n):a;l[h]=ni(r,v),l[d]=this.exact?l[h]:function(t,e){return 0===t.path.replace(Xo,"/").indexOf(e.path.replace(Xo,"/"))&&(!e.hash||t.hash===e.hash)&&function(t,e){for(var n in e)if(!(n in t))return!1;return!0}(t.query,e.query)}(r,v);var m=function(t){li(t)&&(e.replace?n.replace(i):n.push(i))},g={click:li};Array.isArray(this.event)?this.event.forEach(function(t){g[t]=m}):g[this.event]=m;var y={class:l};if("a"===this.tag)y.on=g,y.attrs={href:s};else{var b=function t(e){if(e)for(var n,r=0;r=0&&(e=t.slice(r),t=t.slice(0,r));var o=t.indexOf("?");return o>=0&&(n=t.slice(o+1),t=t.slice(0,o)),{path:t,query:n,hash:e}}(o.path||""),l=e&&e.path||"/",c=s.path?ui(s.path,l,n||o.append):l,u=function(t,e,n){void 0===e&&(e={});var r,o=n||qo;try{r=o(t||"")}catch(t){r={}}for(var i in e)r[i]=e[i];return r}(s.query,o.query,r&&r.options.parseQuery),p=o.hash||s.hash;return p&&"#"!==p.charAt(0)&&(p="#"+p),{_normalized:!0,path:c,query:u,hash:p}}function Li(t,e){var n=Ai(t),r=n.pathList,o=n.pathMap,i=n.nameMap;function a(t,n,a){var s=Pi(t,n,!1,e),c=s.name;if(c){var u=i[c];if(!u)return l(null,s);var p=u.regex.keys.filter(function(t){return!t.optional}).map(function(t){return t.name});if("object"!=typeof s.params&&(s.params={}),n&&"object"==typeof n.params)for(var f in n.params)!(f in s.params)&&p.indexOf(f)>-1&&(s.params[f]=n.params[f]);return s.path=Ti(u.path,s.params),l(u,s,a)}if(s.path){s.params={};for(var d=0;d=t.length?n():t[o]?e(t[o],function(){r(o+1)}):r(o+1)};r(0)}function Gi(t){return function(e,n,r){var o=!1,i=0,a=null;Qi(t,function(t,e,n,s){if("function"==typeof t&&void 0===t.cid){o=!0,i++;var l,c=na(function(e){var o;((o=e).__esModule||ea&&"Module"===o[Symbol.toStringTag])&&(e=e.default),t.resolved="function"==typeof e?e:oi.extend(e),n.components[s]=e,--i<=0&&r()}),u=na(function(t){var e="Failed to resolve async component "+s+": "+t;a||(a=Do(t)?t:new Error(e),r(a))});try{l=t(c,u)}catch(t){u(t)}if(l)if("function"==typeof l.then)l.then(c,u);else{var p=l.component;p&&"function"==typeof p.then&&p.then(c,u)}}}),o||r()}}function Qi(t,e){return ta(t.map(function(t){return Object.keys(t.components).map(function(n){return e(t.components[n],t.instances[n],t,n)})}))}function ta(t){return Array.prototype.concat.apply([],t)}var ea="function"==typeof Symbol&&"symbol"==typeof Symbol.toStringTag;function na(t){var e=!1;return function(){for(var n=[],r=arguments.length;r--;)n[r]=arguments[r];if(!e)return e=!0,t.apply(this,n)}}var ra=function(t,e){this.router=t,this.base=function(t){if(!t)if(ci){var e=document.querySelector("base");t=(t=e&&e.getAttribute("href")||"/").replace(/^https?:\/\/[^\/]+/,"")}else t="/";"/"!==t.charAt(0)&&(t="/"+t);return t.replace(/\/$/,"")}(e),this.current=Qo,this.pending=null,this.ready=!1,this.readyCbs=[],this.readyErrorCbs=[],this.errorCbs=[]};function oa(t,e,n,r){var o=Qi(t,function(t,r,o,i){var a=function(t,e){"function"!=typeof t&&(t=oi.extend(t));return t.options[e]}(t,e);if(a)return Array.isArray(a)?a.map(function(t){return n(t,r,o,i)}):n(a,r,o,i)});return ta(r?o.reverse():o)}function ia(t,e){if(e)return function(){return t.apply(e,arguments)}}ra.prototype.listen=function(t){this.cb=t},ra.prototype.onReady=function(t,e){this.ready?t():(this.readyCbs.push(t),e&&this.readyErrorCbs.push(e))},ra.prototype.onError=function(t){this.errorCbs.push(t)},ra.prototype.transitionTo=function(t,e,n){var r=this,o=this.router.match(t,this.current);this.confirmTransition(o,function(){r.updateRoute(o),e&&e(o),r.ensureURL(),r.ready||(r.ready=!0,r.readyCbs.forEach(function(t){t(o)}))},function(t){n&&n(t),t&&!r.ready&&(r.ready=!0,r.readyErrorCbs.forEach(function(e){e(t)}))})},ra.prototype.confirmTransition=function(t,e,n){var r=this,o=this.current,i=function(t){Do(t)&&(r.errorCbs.length?r.errorCbs.forEach(function(e){e(t)}):console.error(t)),n&&n(t)};if(ni(t,o)&&t.matched.length===o.matched.length)return this.ensureURL(),i();var a=function(t,e){var n,r=Math.max(t.length,e.length);for(n=0;n-1?decodeURI(t.slice(0,r))+t.slice(r):decodeURI(t)}else n>-1&&(t=decodeURI(t.slice(0,n))+t.slice(n));return t}function pa(t){var e=window.location.href,n=e.indexOf("#");return(n>=0?e.slice(0,n):e)+"#"+t}function fa(t){Vi?Yi(pa(t)):window.location.hash=t}function da(t){Vi?Xi(pa(t)):window.location.replace(pa(t))}var ha=function(t){function e(e,n){t.call(this,e,n),this.stack=[],this.index=-1}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.push=function(t,e,n){var r=this;this.transitionTo(t,function(t){r.stack=r.stack.slice(0,r.index+1).concat(t),r.index++,e&&e(t)},n)},e.prototype.replace=function(t,e,n){var r=this;this.transitionTo(t,function(t){r.stack=r.stack.slice(0,r.index).concat(t),e&&e(t)},n)},e.prototype.go=function(t){var e=this,n=this.index+t;if(!(n<0||n>=this.stack.length)){var r=this.stack[n];this.confirmTransition(r,function(){e.index=n,e.updateRoute(r)})}},e.prototype.getCurrentLocation=function(){var t=this.stack[this.stack.length-1];return t?t.fullPath:"/"},e.prototype.ensureURL=function(){},e}(ra),va=function(t){void 0===t&&(t={}),this.app=null,this.apps=[],this.options=t,this.beforeHooks=[],this.resolveHooks=[],this.afterHooks=[],this.matcher=Li(t.routes||[],this);var e=t.mode||"hash";switch(this.fallback="history"===e&&!Vi&&!1!==t.fallback,this.fallback&&(e="hash"),ci||(e="abstract"),this.mode=e,e){case"history":this.history=new aa(this,t.base);break;case"hash":this.history=new la(this,t.base,this.fallback);break;case"abstract":this.history=new ha(this,t.base);break;default:0}},ma={currentRoute:{configurable:!0}};function ya(t,e){return t.push(e),function(){var n=t.indexOf(e);n>-1&&t.splice(n,1)}}va.prototype.match=function(t,e,n){return this.matcher.match(t,e,n)},ma.currentRoute.get=function(){return this.history&&this.history.current},va.prototype.init=function(t){var e=this;if(this.apps.push(t),t.$once("hook:destroyed",function(){var n=e.apps.indexOf(t);n>-1&&e.apps.splice(n,1),e.app===t&&(e.app=e.apps[0]||null)}),!this.app){this.app=t;var n=this.history;if(n instanceof aa)n.transitionTo(n.getCurrentLocation());else if(n instanceof la){var r=function(){n.setupListeners()};n.transitionTo(n.getCurrentLocation(),r,r)}n.listen(function(t){e.apps.forEach(function(e){e._route=t})})}},va.prototype.beforeEach=function(t){return ya(this.beforeHooks,t)},va.prototype.beforeResolve=function(t){return ya(this.resolveHooks,t)},va.prototype.afterEach=function(t){return ya(this.afterHooks,t)},va.prototype.onReady=function(t,e){this.history.onReady(t,e)},va.prototype.onError=function(t){this.history.onError(t)},va.prototype.push=function(t,e,n){this.history.push(t,e,n)},va.prototype.replace=function(t,e,n){this.history.replace(t,e,n)},va.prototype.go=function(t){this.history.go(t)},va.prototype.back=function(){this.go(-1)},va.prototype.forward=function(){this.go(1)},va.prototype.getMatchedComponents=function(t){var e=t?t.matched?t:this.resolve(t).route:this.currentRoute;return e?[].concat.apply([],e.matched.map(function(t){return Object.keys(t.components).map(function(e){return t.components[e]})})):[]},va.prototype.resolve=function(t,e,n){var r=Pi(t,e=e||this.history.current,n,this),o=this.match(r,e),i=o.redirectedFrom||o.fullPath;return{location:r,route:o,href:function(t,e,n){var r="hash"===n?"#"+e:e;return t?pi(t+"/"+r):r}(this.history.base,i,this.mode),normalizedTo:r,resolved:o}},va.prototype.addRoutes=function(t){this.matcher.addRoutes(t),this.history.current!==Qo&&this.history.transitionTo(this.history.getCurrentLocation())},Object.defineProperties(va.prototype,ma),va.install=function t(e){if(!t.installed||oi!==e){t.installed=!0,oi=e;var n=function(t){return void 0!==t},r=function(t,e){var r=t.$options._parentVnode;n(r)&&n(r=r.data)&&n(r=r.registerRouteInstance)&&r(t,e)};e.mixin({beforeCreate:function(){n(this.$options.router)?(this._routerRoot=this,this._router=this.$options.router,this._router.init(this),e.util.defineReactive(this,"_route",this._router.history.current)):this._routerRoot=this.$parent&&this.$parent._routerRoot||this,r(this,this)},destroyed:function(){r(this)}}),Object.defineProperty(e.prototype,"$router",{get:function(){return this._routerRoot._router}}),Object.defineProperty(e.prototype,"$route",{get:function(){return this._routerRoot._route}}),e.component("RouterView",zo),e.component("RouterLink",si);var o=e.config.optionMergeStrategies;o.beforeRouteEnter=o.beforeRouteLeave=o.beforeRouteUpdate=o.created}},va.version="3.0.7",ci&&window.Vue&&window.Vue.use(va);var ba=va;var _a={NotFound:()=>n.e(29).then(n.bind(null,352)),Layout:()=>Promise.all([n.e(0),n.e(2),n.e(11)]).then(n.bind(null,351))},wa={"v-cbd95058":()=>n.e(30).then(n.bind(null,364)),"v-77cc1ec7":()=>n.e(22).then(n.bind(null,361)),"v-796bf18c":()=>n.e(31).then(n.bind(null,360)),"v-0a714732":()=>n.e(6).then(n.bind(null,363)),"v-46ec0327":()=>n.e(12).then(n.bind(null,383)),"v-986dbade":()=>n.e(20).then(n.bind(null,382)),"v-8d4dfbb6":()=>n.e(23).then(n.bind(null,381)),"v-76564011":()=>n.e(32).then(n.bind(null,380)),"v-8658c2f2":()=>n.e(9).then(n.bind(null,367)),"v-7434c187":()=>n.e(3).then(n.bind(null,368)),"v-0996c938":()=>n.e(33).then(n.bind(null,355)),"v-c0fa0cf2":()=>n.e(7).then(n.bind(null,357)),"v-4db1779e":()=>n.e(34).then(n.bind(null,358)),"v-6c5acde7":()=>n.e(14).then(n.bind(null,365)),"v-240eddf2":()=>n.e(15).then(n.bind(null,366)),"v-7d2f6cc7":()=>n.e(16).then(n.bind(null,384)),"v-1263fa20":()=>n.e(35).then(n.bind(null,369)),"v-9d44dcf2":()=>n.e(13).then(n.bind(null,370)),"v-61ad5b01":()=>n.e(36).then(n.bind(null,372)),"v-5be22288":()=>n.e(27).then(n.bind(null,374)),"v-5db85fb7":()=>n.e(10).then(n.bind(null,376)),"v-4b91c5e7":()=>n.e(26).then(n.bind(null,378)),"v-cfc76602":()=>n.e(18).then(n.bind(null,379)),"v-c621d7f2":()=>n.e(37).then(n.bind(null,377)),"v-5566a571":()=>n.e(19).then(n.bind(null,375)),"v-7249b1a4":()=>n.e(24).then(n.bind(null,373)),"v-76626758":()=>n.e(28).then(n.bind(null,371)),"v-292f2847":()=>n.e(17).then(n.bind(null,359)),"v-554543f9":()=>n.e(5).then(n.bind(null,356)),"v-3732859b":()=>n.e(21).then(n.bind(null,354)),"v-0393ebb2":()=>n.e(8).then(n.bind(null,353))};function xa(t){const e=Object.create(null);return function(n){return e[n]||(e[n]=t(n))}}const ka=/-(\w)/g,Oa=xa(t=>t.replace(ka,(t,e)=>e?e.toUpperCase():"")),$a=/\B([A-Z])/g,Ca=xa(t=>t.replace($a,"-$1").toLowerCase()),Ea=xa(t=>t.charAt(0).toUpperCase()+t.slice(1));function Sa(t,e){if(!e)return;if(t(e))return t(e);return e.includes("-")?t(Ea(Oa(e))):t(Ea(e))||t(Ca(e))}const Ta=Object.assign({},_a,wa),Aa=t=>Ta[t],ja=t=>wa[t],Pa=t=>_a[t],La=t=>Uo.component(t);function Ia(t){return Sa(ja,t)}function Ma(t){return Sa(Pa,t)}function Ra(t){return Sa(Aa,t)}function Na(t){return Sa(La,t)}function Fa(...t){return Promise.all(t.filter(t=>t).map(async t=>{if(!Na(t)&&Ra(t)){const e=await Ra(t)();Uo.component(t,e.default)}}))}function Ua(t,e){"undefined"!=typeof window&&window.__VUEPRESS__&&(window.__VUEPRESS__[t]=e)}var Da={created(){this.$ssrContext&&(this.$ssrContext.title=this.$title,this.$ssrContext.lang=this.$lang,this.$ssrContext.description=this.$page.description||this.$description)},mounted(){this.currentMetaTags=new Set,this.updateMeta()},methods:{updateMeta(){document.title=this.$title,document.documentElement.lang=this.$lang;const t=this.$page.frontmatter.meta||[],e=t.slice(0);0===t.filter(t=>"description"===t.name).length&&e.push({name:"description",content:this.$description});const n=document.querySelectorAll('meta[name="description"]');n.length&&n.forEach(t=>this.currentMetaTags.add(t)),this.currentMetaTags=new Set(Ka(e,this.currentMetaTags))}},watch:{$page(){this.updateMeta()}},beforeDestroy(){Ka(null,this.currentMetaTags)}};function Ka(t,e){if(e&&[...e].forEach(t=>{document.head.removeChild(t)}),t)return t.map(t=>{const e=document.createElement("meta");return Object.keys(t).forEach(n=>{e.setAttribute(n,t[n])}),document.head.appendChild(e),e})}var za=n(52),Ba={mounted(){window.addEventListener("scroll",this.onScroll)},methods:{onScroll:n.n(za)()(function(){this.setActiveHash()},300),setActiveHash(){const t=[].slice.call(document.querySelectorAll(".sidebar-link")),e=[].slice.call(document.querySelectorAll(".header-anchor")).filter(e=>t.some(t=>t.hash===e.hash)),n=Math.max(window.pageYOffset,document.documentElement.scrollTop,document.body.scrollTop),r=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight),o=window.innerHeight+n;for(let t=0;t=i.parentElement.offsetTop+10&&(!a||n{this.$nextTick(()=>{this.$vuepress.$set("disableScrollBehavior",!1)})})}}}},beforeDestroy(){window.removeEventListener("scroll",this.onScroll)}},Va=n(16),Ha=n.n(Va),Za=[Da,Ba,{mounted(){Ha.a.configure({showSpinner:!1}),this.$router.beforeEach((t,e,n)=>{t.path===e.path||Uo.component(t.name)||Ha.a.start(),n()}),this.$router.afterEach(()=>{Ha.a.done(),this.isSidebarOpen=!1})}}],Wa={methods:{getLayout:function(){if(this.$page.path){var t=this.$page.frontmatter.layout;return t&&(this.$vuepress.getLayoutAsyncComponent(t)||this.$vuepress.getVueComponent(t))?t:"Layout"}return"NotFound"}},computed:{layout:function(){var t=this.getLayout();return Ua("layout",t),Uo.component(t)}}},qa=n(0),Ya=Object(qa.a)(Wa,function(){var t=this.$createElement;return(this._self._c||t)(this.layout,{tag:"component"})},[],!1,null,null,null).exports;!function(t,e,n){switch(e){case"components":t[e]||(t[e]={}),Object.assign(t[e],n);break;case"mixins":t[e]||(t[e]=[]),t[e].push(...n);break;default:throw new Error("Unknown option name.")}}(Ya,"mixins",Za);const Xa=[{name:"v-cbd95058",path:"/",component:Ya,beforeEnter:(t,e,n)=>{Fa("HomePage","v-cbd95058").then(n)}},{path:"/index.html",redirect:"/"},{name:"v-77cc1ec7",path:"/guide/cluster/computing.html",component:Ya,beforeEnter:(t,e,n)=>{Fa("Layout","v-77cc1ec7").then(n)}},{name:"v-796bf18c",path:"/guide/",component:Ya,beforeEnter:(t,e,n)=>{Fa("Layout","v-796bf18c").then(n)}},{path:"/guide/index.html",redirect:"/guide/"},{name:"v-0a714732",path:"/guide/cluster/storage.html",component:Ya,beforeEnter:(t,e,n)=>{Fa("Layout","v-0a714732").then(n)}},{name:"v-46ec0327",path:"/guide/cluster/namespace.html",component:Ya,beforeEnter:(t,e,n)=>{Fa("Layout","v-46ec0327").then(n)}},{name:"v-986dbade",path:"/guide/diagonize/events.html",component:Ya,beforeEnter:(t,e,n)=>{Fa("Layout","v-986dbade").then(n)}},{name:"v-8d4dfbb6",path:"/guide/diagonize/logs.html",component:Ya,beforeEnter:(t,e,n)=>{Fa("Layout","v-8d4dfbb6").then(n)}},{name:"v-76564011",path:"/guide/diagonize/port-forward.html",component:Ya,beforeEnter:(t,e,n)=>{Fa("Layout","v-76564011").then(n)}},{name:"v-8658c2f2",path:"/guide/example/busybox.html",component:Ya,beforeEnter:(t,e,n)=>{Fa("Layout","v-8658c2f2").then(n)}},{name:"v-7434c187",path:"/guide/example/monitor.html",component:Ya,beforeEnter:(t,e,n)=>{Fa("Layout","v-7434c187").then(n)}},{name:"v-0996c938",path:"/guide/monitor/",component:Ya,beforeEnter:(t,e,n)=>{Fa("Layout","v-0996c938").then(n)}},{path:"/guide/monitor/index.html",redirect:"/guide/monitor/"},{name:"v-c0fa0cf2",path:"/guide/namespace/adjustion.html",component:Ya,beforeEnter:(t,e,n)=>{Fa("Layout","v-c0fa0cf2").then(n)}},{name:"v-4db1779e",path:"/guide/monitor/apis.html",component:Ya,beforeEnter:(t,e,n)=>{Fa("Layout","v-4db1779e").then(n)}},{name:"v-6c5acde7",path:"/guide/namespace/configMap.html",component:Ya,beforeEnter:(t,e,n)=>{Fa("Layout","v-6c5acde7").then(n)}},{name:"v-240eddf2",path:"/guide/namespace/pvc.html",component:Ya,beforeEnter:(t,e,n)=>{Fa("Layout","v-240eddf2").then(n)}},{name:"v-7d2f6cc7",path:"/guide/namespace/secrets.html",component:Ya,beforeEnter:(t,e,n)=>{Fa("Layout","v-7d2f6cc7").then(n)}},{name:"v-1263fa20",path:"/guide/namespace/",component:Ya,beforeEnter:(t,e,n)=>{Fa("Layout","v-1263fa20").then(n)}},{path:"/guide/namespace/index.html",redirect:"/guide/namespace/"},{name:"v-9d44dcf2",path:"/guide/namespace/multi-env.html",component:Ya,beforeEnter:(t,e,n)=>{Fa("Layout","v-9d44dcf2").then(n)}},{name:"v-61ad5b01",path:"/install/install-common-ingress.html",component:Ya,beforeEnter:(t,e,n)=>{Fa("Layout","v-61ad5b01").then(n)}},{name:"v-5be22288",path:"/install/",component:Ya,beforeEnter:(t,e,n)=>{Fa("Layout","v-5be22288").then(n)}},{path:"/install/index.html",redirect:"/install/"},{name:"v-5db85fb7",path:"/guide/namespace/workload.html",component:Ya,beforeEnter:(t,e,n)=>{Fa("Layout","v-5db85fb7").then(n)}},{name:"v-4b91c5e7",path:"/install/install-common-vm.html",component:Ya,beforeEnter:(t,e,n)=>{Fa("Layout","v-4b91c5e7").then(n)}},{name:"v-cfc76602",path:"/install/install-kind.html",component:Ya,beforeEnter:(t,e,n)=>{Fa("Layout","v-cfc76602").then(n)}},{name:"v-c621d7f2",path:"/install/install-dashboard.html",component:Ya,beforeEnter:(t,e,n)=>{Fa("Layout","v-c621d7f2").then(n)}},{name:"v-5566a571",path:"/overview/why-kuboard.html",component:Ya,beforeEnter:(t,e,n)=>{Fa("Layout","v-5566a571").then(n)}},{name:"v-7249b1a4",path:"/overview/",component:Ya,beforeEnter:(t,e,n)=>{Fa("Layout","v-7249b1a4").then(n)}},{path:"/overview/index.html",redirect:"/overview/"},{name:"v-76626758",path:"/support/",component:Ya,beforeEnter:(t,e,n)=>{Fa("Layout","v-76626758").then(n)}},{path:"/support/index.html",redirect:"/support/"},{name:"v-292f2847",path:"/install/install-k8s.html",component:Ya,beforeEnter:(t,e,n)=>{Fa("Layout","v-292f2847").then(n)}},{name:"v-554543f9",path:"/guide/example/import.html",component:Ya,beforeEnter:(t,e,n)=>{Fa("Layout","v-554543f9").then(n)}},{name:"v-3732859b",path:"/install/install-kubernetes.html",component:Ya,beforeEnter:(t,e,n)=>{Fa("Layout","v-3732859b").then(n)}},{name:"v-0393ebb2",path:"/overview/concepts.html",component:Ya,beforeEnter:(t,e,n)=>{Fa("Layout","v-0393ebb2").then(n)}},{path:"*",component:Ya}],Ja={title:"Kuboard",description:"A cool Kubernetes Dashboard",base:"/",pages:[{title:"Home",frontmatter:{home:!0,layout:"HomePage",actionText:"在线体验",actionLink:"http://demo.eip.work/#/login?isReadOnly=true&token=eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJrdWJvYXJkLXZpZXdlci10b2tlbi02djZiZiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJrdWJvYXJkLXZpZXdlciIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjhiYTU3YmI1LWFiMTctNDM1NS1hNTM0LTQ0Njk4NGY0NzFlZiIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTprdWJvYXJkLXZpZXdlciJ9.DcXNIp0RKha1zkV4ga_QlGfcvMLGx2LOyzX-0VeboC3FojKFhxnfBeoda-zTeh6ugJlSM4kQYrRcof1Kx8Mg3-UgofNmgRySbDEVKtJZyMUoHqLmySKUIn8sbX8q83RNcqwcvY-fM8-w8HSuzU7Td7WWNuZrlCL4q_LQDYIBet1nlQ83YsENKNE8rsZQFDw8YM0MH6BEZLdwyhaboy_jjYbsU7kv8gks3aIX4lh1Fs9ZFQpC_6B0_MZvb7rEeG2M8QWXoUkDoL5JCKu6Wot5GlWf0kDMxIsViggP0NmSDTKh6kIvCkT2FZ2I4guEcjE_EjBpdOS6Abta22tzLlPKhg",actionText2:"查看文档 →",actionLink2:"/overview/",features:[{title:"降低 Kubernetes 门槛",details:"创建工作负载,导出/导入配置,批量调整镜像版本,问题诊断"},{title:"直观显示微服务架构",details:"展现层/网关层/服务层/持久层/中间件层/监控层"},{title:"上下文关联监控",details:"资源层监控/中间件层监控/链路层监控"}],footer:"Copyright © 2019-present HuanQing Shao",meta:[{property:"article:modified_time",content:"2019-07-25T10:04:19.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"Home"},{property:"og:type",content:"website"},{property:"og:url",content:"/"},{name:"twitter:title",content:"Home"},{name:"twitter:url",content:"/"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/",relativePath:"README.md",key:"v-cbd95058",path:"/",lastUpdated:"2019-07-25 18:04:19"},{title:"计算资源管理",frontmatter:{meta:[{property:"article:modified_time",content:"2019-07-24T22:22:52.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"计算资源管理"},{property:"og:type",content:"website"},{property:"og:url",content:"/guide/cluster/computing.html"},{name:"twitter:title",content:"计算资源管理"},{name:"twitter:url",content:"/guide/cluster/computing.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/guide/cluster/computing.html",relativePath:"guide/cluster/computing.md",key:"v-77cc1ec7",path:"/guide/cluster/computing.html",headers:[{level:2,title:"前提",slug:"前提"},{level:2,title:"添加节点",slug:"添加节点"},{level:2,title:"查看节点",slug:"查看节点"},{level:2,title:"移除节点",slug:"移除节点"}],lastUpdated:"2019-07-25 06:22:52"},{title:"使用手册",frontmatter:{meta:[{property:"article:modified_time",content:"2019-07-24T22:22:52.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"使用手册"},{property:"og:type",content:"website"},{property:"og:url",content:"/guide/"},{name:"twitter:title",content:"使用手册"},{name:"twitter:url",content:"/guide/"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/guide/",relativePath:"guide/README.md",key:"v-796bf18c",path:"/guide/",lastUpdated:"2019-07-25 06:22:52"},{title:"存储空间管理",frontmatter:{meta:[{property:"article:modified_time",content:"2019-07-24T22:22:52.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"存储空间管理"},{property:"og:type",content:"website"},{property:"og:url",content:"/guide/cluster/storage.html"},{name:"twitter:title",content:"存储空间管理"},{name:"twitter:url",content:"/guide/cluster/storage.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/guide/cluster/storage.html",relativePath:"guide/cluster/storage.md",key:"v-0a714732",path:"/guide/cluster/storage.html",headers:[{level:2,title:"创建存储类",slug:"创建存储类"},{level:3,title:"在阿里云创建 NAS 服务",slug:"在阿里云创建-nas-服务"},{level:3,title:"在 Kuboard 创建存储类",slug:"在-kuboard-创建存储类"}],lastUpdated:"2019-07-25 06:22:52"},{title:"名称空间管理",frontmatter:{meta:[{property:"article:modified_time",content:"2019-07-24T22:22:52.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"名称空间管理"},{property:"og:type",content:"website"},{property:"og:url",content:"/guide/cluster/namespace.html"},{name:"twitter:title",content:"名称空间管理"},{name:"twitter:url",content:"/guide/cluster/namespace.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/guide/cluster/namespace.html",relativePath:"guide/cluster/namespace.md",key:"v-46ec0327",path:"/guide/cluster/namespace.html",headers:[{level:2,title:"创建名称空间",slug:"创建名称空间"},{level:3,title:"前提",slug:"前提"},{level:3,title:"准备",slug:"准备"}],lastUpdated:"2019-07-25 06:22:52"},{title:"集群事件",frontmatter:{meta:[{property:"article:modified_time",content:"2019-07-24T22:22:52.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"集群事件"},{property:"og:type",content:"website"},{property:"og:url",content:"/guide/diagonize/events.html"},{name:"twitter:title",content:"集群事件"},{name:"twitter:url",content:"/guide/diagonize/events.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/guide/diagonize/events.html",relativePath:"guide/diagonize/events.md",key:"v-986dbade",path:"/guide/diagonize/events.html",headers:[{level:2,title:"错误事件提示",slug:"错误事件提示"},{level:2,title:"全局事件",slug:"全局事件"},{level:3,title:"查看全局事件",slug:"查看全局事件"},{level:3,title:"删除事件",slug:"删除事件"},{level:2,title:"微服务上下文相关的事件",slug:"微服务上下文相关的事件"}],lastUpdated:"2019-07-25 06:22:52"},{title:"日志及终端",frontmatter:{meta:[{property:"article:modified_time",content:"2019-07-24T22:22:52.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"日志及终端"},{property:"og:type",content:"website"},{property:"og:url",content:"/guide/diagonize/logs.html"},{name:"twitter:title",content:"日志及终端"},{name:"twitter:url",content:"/guide/diagonize/logs.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/guide/diagonize/logs.html",relativePath:"guide/diagonize/logs.md",key:"v-8d4dfbb6",path:"/guide/diagonize/logs.html",lastUpdated:"2019-07-25 06:22:52"},{title:"端口转发",frontmatter:{meta:[{property:"article:modified_time",content:"2019-07-25T14:26:28.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"端口转发"},{property:"og:type",content:"website"},{property:"og:url",content:"/guide/diagonize/port-forward.html"},{name:"twitter:title",content:"端口转发"},{name:"twitter:url",content:"/guide/diagonize/port-forward.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/guide/diagonize/port-forward.html",relativePath:"guide/diagonize/port-forward.md",key:"v-76564011",path:"/guide/diagonize/port-forward.html",headers:[{level:2,title:"Feature planned",slug:"feature-planned"}],lastUpdated:"2019-07-25 22:26:28"},{title:"部署 busybox",frontmatter:{meta:[{property:"article:modified_time",content:"2019-07-25T14:26:28.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"部署 busybox"},{property:"og:type",content:"website"},{property:"og:url",content:"/guide/example/busybox.html"},{name:"twitter:title",content:"部署 busybox"},{name:"twitter:url",content:"/guide/example/busybox.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/guide/example/busybox.html",relativePath:"guide/example/busybox.md",key:"v-8658c2f2",path:"/guide/example/busybox.html",headers:[{level:2,title:"前提",slug:"前提"},{level:2,title:"部署 busybox",slug:"部署-busybox-2"},{level:2,title:"验证工作负载",slug:"验证工作负载"}],lastUpdated:"2019-07-25 22:26:28"},{title:"监控 example (alpha)",frontmatter:{meta:[{property:"article:modified_time",content:"2019-07-24T22:22:52.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"监控 example (alpha)"},{property:"og:type",content:"website"},{property:"og:url",content:"/guide/example/monitor.html"},{name:"twitter:title",content:"监控 example (alpha)"},{name:"twitter:url",content:"/guide/example/monitor.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/guide/example/monitor.html",relativePath:"guide/example/monitor.md",key:"v-7434c187",path:"/guide/example/monitor.html",headers:[{level:2,title:"前提",slug:"前提"},{level:2,title:"安装监控套件",slug:"安装监控套件"},{level:3,title:"安装全局监控套件",slug:"安装全局监控套件"},{level:3,title:"安装名称空间监控套件",slug:"安装名称空间监控套件"},{level:3,title:"查看监控套件的工作负载",slug:"查看监控套件的工作负载"},{level:2,title:"重启 example 容器组",slug:"重启-example-容器组"},{level:2,title:"查看监控信息",slug:"查看监控信息"},{level:3,title:"查看资源层监控信息",slug:"查看资源层监控信息"},{level:3,title:"查看中间件层监控信息",slug:"查看中间件层监控信息"},{level:3,title:"查看链路追踪监控信息",slug:"查看链路追踪监控信息"}],lastUpdated:"2019-07-25 06:22:52"},{title:"监控套件",frontmatter:{meta:[{property:"article:modified_time",content:"2019-07-24T22:22:52.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"监控套件"},{property:"og:type",content:"website"},{property:"og:url",content:"/guide/monitor/"},{name:"twitter:title",content:"监控套件"},{name:"twitter:url",content:"/guide/monitor/"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/guide/monitor/",relativePath:"guide/monitor/README.md",key:"v-0996c938",path:"/guide/monitor/",lastUpdated:"2019-07-25 06:22:52"},{title:"日常调整",frontmatter:{meta:[{property:"article:modified_time",content:"2019-07-24T22:22:52.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"日常调整"},{property:"og:type",content:"website"},{property:"og:url",content:"/guide/namespace/adjustion.html"},{name:"twitter:title",content:"日常调整"},{name:"twitter:url",content:"/guide/namespace/adjustion.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/guide/namespace/adjustion.html",relativePath:"guide/namespace/adjustion.md",key:"v-c0fa0cf2",path:"/guide/namespace/adjustion.html",headers:[{level:2,title:"前提",slug:"前提"},{level:2,title:"批量删除容器组",slug:"批量删除容器组"},{level:2,title:"批量调整镜像版本",slug:"批量调整镜像版本"},{level:2,title:"批量调整工作负载的副本数",slug:"批量调整工作负载的副本数"}],lastUpdated:"2019-07-25 06:22:52"},{title:"自定义监控套件",frontmatter:{meta:[{property:"article:modified_time",content:"2019-07-24T22:22:52.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"自定义监控套件"},{property:"og:type",content:"website"},{property:"og:url",content:"/guide/monitor/apis.html"},{name:"twitter:title",content:"自定义监控套件"},{name:"twitter:url",content:"/guide/monitor/apis.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/guide/monitor/apis.html",relativePath:"guide/monitor/apis.md",key:"v-4db1779e",path:"/guide/monitor/apis.html",lastUpdated:"2019-07-25 06:22:52"},{title:"配置",frontmatter:{meta:[{property:"article:modified_time",content:"2019-07-24T22:22:52.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"配置"},{property:"og:type",content:"website"},{property:"og:url",content:"/guide/namespace/configMap.html"},{name:"twitter:title",content:"配置"},{name:"twitter:url",content:"/guide/namespace/configMap.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/guide/namespace/configMap.html",relativePath:"guide/namespace/configMap.md",key:"v-6c5acde7",path:"/guide/namespace/configMap.html",lastUpdated:"2019-07-25 06:22:52"},{title:"存储卷声明",frontmatter:{meta:[{property:"article:modified_time",content:"2019-07-24T22:22:52.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"存储卷声明"},{property:"og:type",content:"website"},{property:"og:url",content:"/guide/namespace/pvc.html"},{name:"twitter:title",content:"存储卷声明"},{name:"twitter:url",content:"/guide/namespace/pvc.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/guide/namespace/pvc.html",relativePath:"guide/namespace/pvc.md",key:"v-240eddf2",path:"/guide/namespace/pvc.html",lastUpdated:"2019-07-25 06:22:52"},{title:"Secrets",frontmatter:{meta:[{property:"article:modified_time",content:"2019-07-24T22:22:52.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"Secrets"},{property:"og:type",content:"website"},{property:"og:url",content:"/guide/namespace/secrets.html"},{name:"twitter:title",content:"Secrets"},{name:"twitter:url",content:"/guide/namespace/secrets.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/guide/namespace/secrets.html",relativePath:"guide/namespace/secrets.md",key:"v-7d2f6cc7",path:"/guide/namespace/secrets.html",lastUpdated:"2019-07-25 06:22:52"},{title:"应用管理",frontmatter:{meta:[{property:"article:modified_time",content:"2019-07-24T22:22:52.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"应用管理"},{property:"og:type",content:"website"},{property:"og:url",content:"/guide/namespace/"},{name:"twitter:title",content:"应用管理"},{name:"twitter:url",content:"/guide/namespace/"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/guide/namespace/",relativePath:"guide/namespace/index.md",key:"v-1263fa20",path:"/guide/namespace/",headers:[{level:2,title:"创建工作负载",slug:"创建工作负载"},{level:2,title:"删除工作负载",slug:"删除工作负载"},{level:2,title:"伸缩",slug:"伸缩"},{level:2,title:"升级工作负载版本",slug:"升级工作负载版本"},{level:2,title:"环境迁移",slug:"环境迁移"},{level:3,title:"导出",slug:"导出"},{level:3,title:"导入",slug:"导入"}],lastUpdated:"2019-07-25 06:22:52"},{title:"多环境",frontmatter:{meta:[{property:"article:modified_time",content:"2019-07-24T22:22:52.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"多环境"},{property:"og:type",content:"website"},{property:"og:url",content:"/guide/namespace/multi-env.html"},{name:"twitter:title",content:"多环境"},{name:"twitter:url",content:"/guide/namespace/multi-env.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/guide/namespace/multi-env.html",relativePath:"guide/namespace/multi-env.md",key:"v-9d44dcf2",path:"/guide/namespace/multi-env.html",headers:[{level:2,title:"导出配置",slug:"导出配置"},{level:3,title:"前提",slug:"前提"},{level:3,title:"操作步骤",slug:"操作步骤"},{level:2,title:"导入配置",slug:"导入配置"},{level:3,title:"前提",slug:"前提-2"},{level:3,title:"操作步骤",slug:"操作步骤-2"}],lastUpdated:"2019-07-25 06:22:52"},{title:"安装 Ingress Controller",frontmatter:{meta:[{property:"article:modified_time",content:"2019-07-24T22:22:52.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"安装 Ingress Controller"},{property:"og:type",content:"website"},{property:"og:url",content:"/install/install-common-ingress.html"},{name:"twitter:title",content:"安装 Ingress Controller"},{name:"twitter:url",content:"/install/install-common-ingress.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/install/install-common-ingress.html",relativePath:"install/install-common-ingress.md",key:"v-61ad5b01",path:"/install/install-common-ingress.html",headers:[{level:2,title:"安装 Ingress Controller",slug:"安装-ingress-controller"},{level:3,title:"在 apple-master-a-1 上执行",slug:"在-apple-master-a-1-上执行"},{level:3,title:"在IaaS云控制台完成如下配置(公网ELB)",slug:"在iaas云控制台完成如下配置(公网elb)"},{level:3,title:"配置域名解析",slug:"配置域名解析"},{level:3,title:"验证配置",slug:"验证配置"}],lastUpdated:"2019-07-25 06:22:52"},{title:"概述",frontmatter:{meta:[{property:"article:modified_time",content:"2019-07-24T22:22:52.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"概述"},{property:"og:type",content:"website"},{property:"og:url",content:"/install/"},{name:"twitter:title",content:"概述"},{name:"twitter:url",content:"/install/"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/install/",relativePath:"install/README.md",key:"v-5be22288",path:"/install/",lastUpdated:"2019-07-25 06:22:52"},{title:"工作负载",frontmatter:{meta:[{property:"article:modified_time",content:"2019-07-24T22:22:52.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"工作负载"},{property:"og:type",content:"website"},{property:"og:url",content:"/guide/namespace/workload.html"},{name:"twitter:title",content:"工作负载"},{name:"twitter:url",content:"/guide/namespace/workload.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/guide/namespace/workload.html",relativePath:"guide/namespace/workload.md",key:"v-5db85fb7",path:"/guide/namespace/workload.html",headers:[{level:2,title:"创建/查看/编辑工作负载",slug:"创建-查看-编辑工作负载"},{level:2,title:"伸缩",slug:"伸缩"},{level:2,title:"删除容器组",slug:"删除容器组"},{level:2,title:"诊断问题",slug:"诊断问题"},{level:3,title:"事件: Kubernetes 部署相关问题",slug:"事件:-kubernetes-部署相关问题"},{level:3,title:"日志: 容器运行时产生的错误",slug:"日志:-容器运行时产生的错误"},{level:3,title:"终端: 通过交互式命令,在容器内诊断问题",slug:"终端:-通过交互式命令,在容器内诊断问题"}],lastUpdated:"2019-07-25 06:22:52"},{title:"制作标准机镜像",frontmatter:{meta:[{property:"article:modified_time",content:"2019-07-24T22:22:52.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"制作标准机镜像"},{property:"og:type",content:"website"},{property:"og:url",content:"/install/install-common-vm.html"},{name:"twitter:title",content:"制作标准机镜像"},{name:"twitter:url",content:"/install/install-common-vm.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/install/install-common-vm.html",relativePath:"install/install-common-vm.md",key:"v-4b91c5e7",path:"/install/install-common-vm.html",headers:[{level:2,title:"制作标准机镜像",slug:"制作标准机镜像"},{level:3,title:"安装docker",slug:"安装docker"},{level:3,title:"安装 nfs-utils",slug:"安装-nfs-utils"},{level:3,title:"K8S基本配置",slug:"k8s基本配置"}],lastUpdated:"2019-07-25 06:22:52"},{title:"在单机使用 kind 安装 Kubernetes",frontmatter:{meta:[{property:"article:modified_time",content:"2019-07-24T22:22:52.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"在单机使用 kind 安装 Kubernetes"},{property:"og:type",content:"website"},{property:"og:url",content:"/install/install-kind.html"},{name:"twitter:title",content:"在单机使用 kind 安装 Kubernetes"},{name:"twitter:url",content:"/install/install-kind.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/install/install-kind.html",relativePath:"install/install-kind.md",key:"v-cfc76602",path:"/install/install-kind.html",headers:[{level:2,title:"环境简介",slug:"环境简介"},{level:3,title:"kind 简介与安装",slug:"kind-简介与安装"},{level:3,title:"docker 环境",slug:"docker-环境"},{level:3,title:"kubectl 安装",slug:"kubectl-安装"},{level:2,title:"k8s 集群搭建",slug:"k8s-集群搭建"},{level:3,title:"准备 kind 搭建集群配置文件 kind-config.yaml",slug:"准备-kind-搭建集群配置文件-kind-config-yaml"},{level:3,title:"使用 kind 搭建集群",slug:"使用-kind-搭建集群"},{level:3,title:"创建成功",slug:"创建成功"},{level:2,title:"kuboard 安装",slug:"kuboard-安装"},{level:3,title:"获取并修改 yaml 文件",slug:"获取并修改-yaml-文件"},{level:3,title:"执行安装",slug:"执行安装"},{level:3,title:"查看启动状态",slug:"查看启动状态"},{level:3,title:"访问 kuboard 页面",slug:"访问-kuboard-页面"}],lastUpdated:"2019-07-25 06:22:52"},{title:"安装 kuboard",frontmatter:{meta:[{property:"article:modified_time",content:"2019-07-26T01:56:14.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"安装 kuboard"},{property:"og:type",content:"website"},{property:"og:url",content:"/install/install-dashboard.html"},{name:"twitter:title",content:"安装 kuboard"},{name:"twitter:url",content:"/install/install-dashboard.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/install/install-dashboard.html",relativePath:"install/install-dashboard.md",key:"v-c621d7f2",path:"/install/install-dashboard.html",headers:[{level:2,title:"前提",slug:"前提"},{level:2,title:"兼容性",slug:"兼容性"},{level:2,title:"安装",slug:"安装"},{level:2,title:"获取 token",slug:"获取-token"},{level:2,title:"访问 Kuboard",slug:"访问-kuboard"}],lastUpdated:"2019-07-26 09:56:14"},{title:"为什么选择 Kuboard",frontmatter:{meta:[{property:"article:modified_time",content:"2019-07-24T22:22:52.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"为什么选择 Kuboard"},{property:"og:type",content:"website"},{property:"og:url",content:"/overview/why-kuboard.html"},{name:"twitter:title",content:"为什么选择 Kuboard"},{name:"twitter:url",content:"/overview/why-kuboard.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/overview/why-kuboard.html",relativePath:"overview/why-kuboard.md",key:"v-5566a571",path:"/overview/why-kuboard.html",headers:[{level:2,title:"为什么选择 Kuboard",slug:"为什么选择-kuboard"},{level:2,title:"Kubernetes 入门学习者",slug:"kubernetes-入门学习者"},{level:3,title:"集群概览",slug:"集群概览"},{level:3,title:"名称空间",slug:"名称空间"},{level:3,title:"无需手写 Yaml",slug:"无需手写-yaml"},{level:2,title:"Kubernetes 日常运维人员",slug:"kubernetes-日常运维人员"},{level:3,title:"纯图形界面运维 Kubernetes",slug:"纯图形界面运维-kubernetes"},{level:3,title:"多环境复制",slug:"多环境复制"},{level:3,title:"应用升级",slug:"应用升级"},{level:2,title:"0 侵入性",slug:"_0-侵入性"},{level:2,title:"更多资料",slug:"更多资料"}],lastUpdated:"2019-07-25 06:22:52"},{title:"Kuboard",frontmatter:{meta:[{property:"article:modified_time",content:"2019-07-24T22:22:52.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"Kuboard"},{property:"og:type",content:"website"},{property:"og:url",content:"/overview/"},{name:"twitter:title",content:"Kuboard"},{name:"twitter:url",content:"/overview/"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/overview/",relativePath:"overview/README.md",key:"v-7249b1a4",path:"/overview/",headers:[{level:2,title:"Kuboard",slug:"kuboard"},{level:2,title:"Demo",slug:"demo"},{level:2,title:"Getting Started",slug:"getting-started"},{level:2,title:"在线提问",slug:"在线提问"}],lastUpdated:"2019-07-25 06:22:52"},{title:"提交问题",frontmatter:{meta:[{property:"article:modified_time",content:"2019-07-24T22:22:52.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"提交问题"},{property:"og:type",content:"website"},{property:"og:url",content:"/support/"},{name:"twitter:title",content:"提交问题"},{name:"twitter:url",content:"/support/"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/support/",relativePath:"support/README.md",key:"v-76626758",path:"/support/",headers:[{level:2,title:"提交问题",slug:"提交问题"},{level:2,title:"在线提问",slug:"在线提问"}],lastUpdated:"2019-07-25 06:22:52"},{title:"安装 Kubernetes 用于测试",frontmatter:{meta:[{property:"article:modified_time",content:"2019-07-24T22:22:52.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"安装 Kubernetes 用于测试"},{property:"og:type",content:"website"},{property:"og:url",content:"/install/install-k8s.html"},{name:"twitter:title",content:"安装 Kubernetes 用于测试"},{name:"twitter:url",content:"/install/install-k8s.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/install/install-k8s.html",relativePath:"install/install-k8s.md",key:"v-292f2847",path:"/install/install-k8s.html",headers:[{level:2,title:"制作标准机镜像",slug:"制作标准机镜像"},{level:3,title:"安装docker",slug:"安装docker"},{level:3,title:"安装 nfs-utils",slug:"安装-nfs-utils"},{level:3,title:"K8S基本配置",slug:"k8s基本配置"},{level:2,title:"初始化 master 节点",slug:"初始化-master-节点"},{level:3,title:"在 demo-master-a-1 机器上执行",slug:"在-demo-master-a-1-机器上执行"},{level:3,title:"检查 apiserver初始化结果",slug:"检查-apiserver初始化结果"},{level:2,title:"初始化 worker节点",slug:"初始化-worker节点"},{level:3,title:"获得 join命令参数",slug:"获得-join命令参数"},{level:3,title:"初始化worker",slug:"初始化worker"},{level:3,title:"检查 apiserver初始化结果",slug:"检查-apiserver初始化结果-2"},{level:2,title:"移除 worker 节点",slug:"移除-worker-节点"},{level:2,title:"安装 Ingress Controller",slug:"安装-ingress-controller"},{level:3,title:"在 demo-master-a-1 上执行",slug:"在-demo-master-a-1-上执行"},{level:3,title:"配置域名解析",slug:"配置域名解析"},{level:3,title:"验证配置",slug:"验证配置"}],lastUpdated:"2019-07-25 06:22:52"},{title:"导入 example 微服务",frontmatter:{meta:[{property:"article:modified_time",content:"2019-07-25T14:26:28.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"导入 example 微服务"},{property:"og:type",content:"website"},{property:"og:url",content:"/guide/example/import.html"},{name:"twitter:title",content:"导入 example 微服务"},{name:"twitter:url",content:"/guide/example/import.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/guide/example/import.html",relativePath:"guide/example/import.md",key:"v-554543f9",path:"/guide/example/import.html",headers:[{level:2,title:"前提",slug:"前提"},{level:2,title:"创建存储资源",slug:"创建存储资源"},{level:2,title:"创建名称空间",slug:"创建名称空间"},{level:2,title:"导入 example",slug:"导入-example"},{level:2,title:"验证 web-example",slug:"验证-web-example"}],lastUpdated:"2019-07-25 22:26:28"},{title:"安装 Kubernetes",frontmatter:{meta:[{property:"article:modified_time",content:"2019-07-24T22:22:52.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"安装 Kubernetes"},{property:"og:type",content:"website"},{property:"og:url",content:"/install/install-kubernetes.html"},{name:"twitter:title",content:"安装 Kubernetes"},{name:"twitter:url",content:"/install/install-kubernetes.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/install/install-kubernetes.html",relativePath:"install/install-kubernetes.md",key:"v-3732859b",path:"/install/install-kubernetes.html",headers:[{level:2,title:"制作标准机镜像",slug:"制作标准机镜像"},{level:3,title:"安装docker",slug:"安装docker"},{level:3,title:"安装 nfs-utils",slug:"安装-nfs-utils"},{level:3,title:"K8S基本配置",slug:"k8s基本配置"},{level:2,title:"初始化API Server",slug:"初始化api-server"},{level:3,title:"创建 ApiServer 的 ELB(私网)",slug:"创建-apiserver-的-elb(私网)"},{level:3,title:"初始化第一个master节点",slug:"初始化第一个master节点"},{level:3,title:"初始化第二、三个master节点",slug:"初始化第二、三个master节点"},{level:3,title:"检查 apiserver初始化结果",slug:"检查-apiserver初始化结果"},{level:2,title:"初始化 worker节点",slug:"初始化-worker节点"},{level:3,title:"获得 join命令参数",slug:"获得-join命令参数"},{level:3,title:"初始化worker",slug:"初始化worker"},{level:3,title:"检查 apiserver初始化结果",slug:"检查-apiserver初始化结果-2"},{level:2,title:"移除 worker 节点",slug:"移除-worker-节点"},{level:2,title:"安装 Ingress Controller",slug:"安装-ingress-controller"},{level:3,title:"在 apple-master-a-1 上执行",slug:"在-apple-master-a-1-上执行"},{level:3,title:"在IaaS云控制台完成如下配置(公网ELB)",slug:"在iaas云控制台完成如下配置(公网elb)"},{level:3,title:"配置域名解析",slug:"配置域名解析"},{level:3,title:"验证配置",slug:"验证配置"}],lastUpdated:"2019-07-25 06:22:52"},{title:"如何降低K8S学习门槛 🎉",frontmatter:{meta:[{property:"article:modified_time",content:"2019-07-25T06:09:59.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"如何降低K8S学习门槛 🎉"},{property:"og:type",content:"website"},{property:"og:url",content:"/overview/concepts.html"},{name:"twitter:title",content:"如何降低K8S学习门槛 🎉"},{name:"twitter:url",content:"/overview/concepts.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/overview/concepts.html",relativePath:"overview/concepts.md",key:"v-0393ebb2",path:"/overview/concepts.html",headers:[{level:2,title:"Kubernetes 学习门槛在哪儿",slug:"kubernetes-学习门槛在哪儿"},{level:2,title:"降低 Kubernetes 学习门槛",slug:"降低-kubernetes-学习门槛"},{level:2,title:"工作负载编辑器设计",slug:"工作负载编辑器设计"},{level:2,title:"工作负载编辑器介绍",slug:"工作负载编辑器介绍"},{level:3,title:"1. 基本信息",slug:"_1-基本信息"},{level:3,title:"2. 数据卷",slug:"_2-数据卷"},{level:3,title:"3. 身份信息",slug:"_3-身份信息"},{level:3,title:"4. 容器",slug:"_4-容器"},{level:3,title:"5. 访问方式",slug:"_5-访问方式"},{level:3,title:"6. 互联网入口",slug:"_6-互联网入口"}],lastUpdated:"2019-07-25 14:09:59"}],themeConfig:{nav:[{text:"简介",link:"/overview/"},{text:"安装",link:"/install/"},{text:"使用",link:"/guide/"},{text:"支持",link:"/support/"}],displayAllHeaders:!1,sidebarDepth:2,serviceWorker:{updatePopup:!0},lastUpdated:"更新时间",sidebar:{"/overview/":[{title:"简介",collapsable:!1,children:[""]},{title:"Why Kuboard",collapsable:!1,children:["why-kuboard","concepts"]}],"/install/":[{title:"概述",collapsable:!1,children:[""]},{title:"安装 Kubernetes",collapsable:!1,children:["install-k8s","install-kubernetes"]},{title:"安装 Kuboard",collapsable:!1,children:["install-dashboard"]}],"/guide/":[{title:"概述",collapsable:!1,children:[["","概述"]]},{title:"Example",collapsable:!1,children:["example/busybox","example/import","example/monitor"]},{title:"集群管理",collapsable:!1,children:["cluster/computing","cluster/storage","cluster/namespace"]},{title:"应用管理",collapsable:!1,children:["namespace/workload","namespace/secrets","namespace/configMap","namespace/pvc","namespace/adjustion","namespace/multi-env"]},{title:"问题诊断",collapsable:!1,children:["diagonize/events","diagonize/logs","diagonize/port-forward"]},{title:"监控套件 (alpha)",collapsable:!1,children:["monitor/","monitor/apis"]}],"/support/":[""]}}};n(75);Uo.component("HomePage",()=>Promise.all([n.e(0),n.e(4)]).then(n.bind(null,350))),Uo.component("Badge",()=>Promise.all([n.e(0),n.e(25)]).then(n.bind(null,362)));n(76),n(77);var Ga=n(53),Qa=n.n(Ga),ts={props:{threshold:{type:Number,default:300}},data:function(){return{scrollTop:null}},mounted:function(){var t=this;this.scrollTop=this.getScrollTop(),window.addEventListener("scroll",Qa()(function(){t.scrollTop=t.getScrollTop()},100))},methods:{getScrollTop:function(){return window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0},scrollToTop:function(){window.scrollTo({top:0,behavior:"smooth"}),this.scrollTop=0}},computed:{show:function(){return this.scrollTop>this.threshold}}},es=(n(85),Object(qa.a)(ts,function(){var t=this.$createElement,e=this._self._c||t;return e("transition",{attrs:{name:"fade"}},[this.show?e("svg",{staticClass:"go-to-top",attrs:{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 49.484 28.284"},on:{click:this.scrollToTop}},[e("g",{attrs:{transform:"translate(-229 -126.358)"}},[e("rect",{attrs:{fill:"currentColor",width:"35",height:"5",rx:"2",transform:"translate(229 151.107) rotate(-45)"}}),this._v(" "),e("rect",{attrs:{fill:"currentColor",width:"35",height:"5",rx:"2",transform:"translate(274.949 154.642) rotate(-135)"}})])]):this._e()])},[],!1,null,"67a9666a",null).exports),ns=(n(40),{data:function(){return{readingTop:0,readingHeight:1,progressStyle:null,transform:["transform"]}},watch:{$readingShow:function(){this.base()}},mounted:function(){this.base()},beforeDestroy:function(){var t=this;window.removeEventListener("scroll",function(){t.getReadingBase()})},methods:{base:function(){var t=this;this.$readingShow&&(this.transform=this.getTransform(),this.progressStyle=this.getProgressStyle(),window.addEventListener("scroll",function(){t.getReadingBase()},200))},getReadingBase:function(){this.readingHeight=this.getReadingHeight()-this.getScreenHeight(),this.readingTop=this.getReadingTop(),this.progressStyle=this.getProgressStyle()},getReadingHeight:function(){return document.body.offsetHeight||document.body.scrollHeight||0},getScreenHeight:function(){return window.innerHeight||document.documentElement.clientHeight||0},getReadingTop:function(){return window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0},getTransform:function(){var t=this;return["transform","-webkit-transform","-moz-transform","-o-transform","-ms-transform"].filter(function(e){return t.supportCss(e)})},getProgressStyle:function(){var t=this.readingTop/this.readingHeight;switch(this.$readingShow){case"top":case"bottom":return this.transform[0]?"".concat(this.transform[0],": translate(").concat(100*t/2-50,"%, 0) scale(").concat(t,", 1)"):"width: ".concat(100*t,"%");case"left":case"right":return this.transform[0]?"".concat(this.transform[0],": translate(0, ").concat(100*t/2-50,"%) scale(1, ").concat(t,")"):"height: ".concat(100*t,"%")}},supportCss:function(t){return t in document.createElement("div").style}}}),rs=(n(88),Object(qa.a)(ns,function(){var t=this.$createElement,e=this._self._c||t;return this.$readingShow?e("div",{staticClass:"reading-progress",class:this.$readingShow},[e("div",{staticClass:"progress",style:this.progressStyle})]):this._e()},[],!1,null,"7681808f",null).exports),os={readingDir:null,fixed:"top"};const is=(t,e,n)=>!!t.includes(e)&&n;n(89);var as=n(54),ss=n.n(as);function ls(t,e,n){return e in t?ss()(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}var cs=n(55),us=n.n(cs);n(41),n(64),n(30),n(38),n(39);Object.prototype.hasOwnProperty;var ps={name:"TabBar",props:{tabs:Array},inject:["rootTabs"],computed:{barStyle:{get:function(){var t=this,e={},n=0,r=0,o=-1!==["top","bottom"].indexOf(this.rootTabs.tabPosition)?"width":"height",i="width"===o?"x":"y",a=function(t){return t.toLowerCase().replace(/( |^)[a-z]/g,function(t){return t.toUpperCase()})};this.tabs.every(function(e,i){var s=((t,e)=>{const n=((t,e)=>{for(let n=0;n!==t.length;++n)if(e(t[n]))return n;return-1})(t,e);return-1!==n?t[n]:void 0})(t.$parent.$refs.tabs||[],function(t){return t.id.replace("tab-","")===e.paneName});return!!s&&(e.active?(r=s["client".concat(a(o))],"width"===o&&t.tabs.length>1&&(r-=0===i||i===t.tabs.length-1?20:40),!1):(n+=s["client".concat(a(o))],!0))}),"width"===o&&0!==n&&(n+=20);var s="translate".concat(a(i),"(").concat(n,"px)");return e[o]=r+"px",e.transform=s,e.msTransform=s,e.webkitTransform=s,e}}}},fs=Object(qa.a)(ps,function(){var t=this.$createElement;return(this._self._c||t)("div",{staticClass:"el-tabs__active-bar",class:"is-"+this.rootTabs.tabPosition,style:this.barStyle})},[],!1,null,null,null).exports,ds=function(){if("undefined"!=typeof Map)return Map;function t(t,e){var n=-1;return t.some(function(t,r){return t[0]===e&&(n=r,!0)}),n}return function(){function e(){this.__entries__=[]}return Object.defineProperty(e.prototype,"size",{get:function(){return this.__entries__.length},enumerable:!0,configurable:!0}),e.prototype.get=function(e){var n=t(this.__entries__,e),r=this.__entries__[n];return r&&r[1]},e.prototype.set=function(e,n){var r=t(this.__entries__,e);~r?this.__entries__[r][1]=n:this.__entries__.push([e,n])},e.prototype.delete=function(e){var n=this.__entries__,r=t(n,e);~r&&n.splice(r,1)},e.prototype.has=function(e){return!!~t(this.__entries__,e)},e.prototype.clear=function(){this.__entries__.splice(0)},e.prototype.forEach=function(t,e){void 0===e&&(e=null);for(var n=0,r=this.__entries__;n0},t.prototype.connect_=function(){hs&&!this.connected_&&(document.addEventListener("transitionend",this.onTransitionEnd_),window.addEventListener("resize",this.refresh),_s?(this.mutationsObserver_=new MutationObserver(this.refresh),this.mutationsObserver_.observe(document,{attributes:!0,childList:!0,characterData:!0,subtree:!0})):(document.addEventListener("DOMSubtreeModified",this.refresh),this.mutationEventsAdded_=!0),this.connected_=!0)},t.prototype.disconnect_=function(){hs&&this.connected_&&(document.removeEventListener("transitionend",this.onTransitionEnd_),window.removeEventListener("resize",this.refresh),this.mutationsObserver_&&this.mutationsObserver_.disconnect(),this.mutationEventsAdded_&&document.removeEventListener("DOMSubtreeModified",this.refresh),this.mutationsObserver_=null,this.mutationEventsAdded_=!1,this.connected_=!1)},t.prototype.onTransitionEnd_=function(t){var e=t.propertyName,n=void 0===e?"":e;bs.some(function(t){return!!~n.indexOf(t)})&&this.refresh()},t.getInstance=function(){return this.instance_||(this.instance_=new t),this.instance_},t.instance_=null,t}(),xs=function(t,e){for(var n=0,r=Object.keys(e);n0},t}(),Is="undefined"!=typeof WeakMap?new WeakMap:new ds,Ms=function t(e){if(!(this instanceof t))throw new TypeError("Cannot call a class as a function.");if(!arguments.length)throw new TypeError("1 argument required, but only 0 present.");var n=ws.getInstance(),r=new Ls(e,n,this);Is.set(this,r)};["observe","unobserve","disconnect"].forEach(function(t){Ms.prototype[t]=function(){var e;return(e=Is.get(this))[t].apply(e,arguments)}});var Rs=void 0!==vs.ResizeObserver?vs.ResizeObserver:Ms;const Ns="undefined"==typeof window,Fs=function(t){for(let e of t){const t=e.target.__resizeListeners__||[];t.length&&t.forEach(t=>{t()})}};function Us(){}var Ds=function(t){return t.toLowerCase().replace(/( |^)[a-z]/g,function(t){return t.toUpperCase()})},Ks={name:"TabNav",components:{TabBar:fs},inject:["rootTabs"],props:{panes:Array,currentName:String,editable:Boolean,onTabClick:{type:Function,default:Us},onTabRemove:{type:Function,default:Us},type:String,stretch:Boolean},data:function(){return{scrollable:!1,navOffset:0,isFocus:!1,focusable:!0}},computed:{navStyle:function(){var t=-1!==["top","bottom"].indexOf(this.rootTabs.tabPosition)?"X":"Y";return{transform:"translate".concat(t,"(-").concat(this.navOffset,"px)")}},sizeName:function(){return-1!==["top","bottom"].indexOf(this.rootTabs.tabPosition)?"width":"height"}},methods:{scrollPrev:function(){var t=this.$refs.navScroll["offset".concat(Ds(this.sizeName))],e=this.navOffset;if(e){var n=e>t?e-t:0;this.navOffset=n}},scrollNext:function(){var t=this.$refs.nav["offset".concat(Ds(this.sizeName))],e=this.$refs.navScroll["offset".concat(Ds(this.sizeName))],n=this.navOffset;if(!(t-n<=e)){var r=t-n>2*e?n+e:t-e;this.navOffset=r}},scrollToActiveTab:function(){if(this.scrollable){var t=this.$refs.nav,e=this.$el.querySelector(".is-active");if(e){var n=this.$refs.navScroll,r=e.getBoundingClientRect(),o=n.getBoundingClientRect(),i=t.offsetWidth-o.width,a=this.navOffset,s=a;r.lefto.right&&(s=a+r.right-o.right),s=Math.max(s,0),this.navOffset=Math.min(s,i)}}},update:function(){if(this.$refs.nav){var t=this.sizeName,e=this.$refs.nav["offset".concat(Ds(t))],n=this.$refs.navScroll["offset".concat(Ds(t))],r=this.navOffset;if(n0&&(this.navOffset=0)}},changeTab:function(t){var e,n,r,o=t.keyCode;-1!==[37,38,39,40].indexOf(o)&&(r=t.currentTarget.querySelectorAll("[role=tab]"),n=Array.prototype.indexOf.call(r,t.target),r[e=37===o||38===o?0===n?r.length-1:n-1:n"])]:null,m=this._l(r,function(n,r){var i,l=n.name||n.index||r,c=n.isClosable||o;n.index="".concat(r);var u=c?t("span",{class:"el-icon-close",on:{click:function(t){s(n,t)}}}):null,p=n.$slots.label||n.label,f=n.active?0:-1;return t("div",{class:(i={"el-tabs__item":!0},ls(i,"is-".concat(e.rootTabs.tabPosition),!0),ls(i,"is-active",n.active),ls(i,"is-disabled",n.disabled),ls(i,"is-closable",c),ls(i,"is-focus",e.isFocus),i),attrs:{id:"tab-".concat(l),"aria-controls":"pane-".concat(l),role:"tab","aria-selected":n.active,tabindex:f},key:"tab-".concat(l),ref:"tabs",refInFor:!0,on:{focus:function(){d()},blur:function(){h()},click:function(t){h(),a(n,l,t)},keydown:function(t){!c||46!==t.keyCode&&8!==t.keyCode||s(n,t)}}},[p,u])});return t("div",{class:["el-tabs__nav-wrap",c?"is-scrollable":"","is-".concat(this.rootTabs.tabPosition)]},[v,t("div",{class:["el-tabs__nav-scroll"],ref:"navScroll"},[t("div",{class:["el-tabs__nav","is-".concat(this.rootTabs.tabPosition),i&&-1!==["top","bottom"].indexOf(this.rootTabs.tabPosition)?"is-stretch":""],ref:"nav",style:l,attrs:{role:"tablist"},on:{keydown:f}},[n?null:t("tab-bar",{attrs:{tabs:r}}),m])])])},mounted:function(){var t,e,n=this;t=this.$el,e=this.update,Ns||(t.__resizeListeners__||(t.__resizeListeners__=[],t.__ro__=new Rs(Fs),t.__ro__.observe(t)),t.__resizeListeners__.push(e)),document.addEventListener("visibilitychange",this.visibilityChangeHandler),window.addEventListener("blur",this.windowBlurHandler),window.addEventListener("focus",this.windowFocusHandler),setTimeout(function(){n.scrollToActiveTab()},0)},beforeDestroy:function(){var t,e;this.$el&&this.update&&(t=this.$el,e=this.update,t&&t.__resizeListeners__&&(t.__resizeListeners__.splice(t.__resizeListeners__.indexOf(e),1),t.__resizeListeners__.length||t.__ro__.disconnect())),document.removeEventListener("visibilitychange",this.visibilityChangeHandler),window.removeEventListener("blur",this.windowBlurHandler),window.removeEventListener("focus",this.windowFocusHandler)}},zs={name:"ElTabs",components:{TabNav:Object(qa.a)(Ks,void 0,void 0,!1,null,null,null).exports},props:{type:String,activeName:String,closable:Boolean,addable:Boolean,value:{},editable:Boolean,tabPosition:{type:String,default:"top"},beforeLeave:Function,stretch:Boolean},provide:function(){return{rootTabs:this}},data:function(){return{currentName:this.value||this.activeName,panes:[]}},watch:{activeName:function(t){this.setCurrentName(t)},value:function(t){this.setCurrentName(t)},currentName:function(t){var e=this;this.$refs.nav&&this.$nextTick(function(){e.$refs.nav.$nextTick(function(t){e.$refs.nav.scrollToActiveTab()})})}},methods:{calcPaneInstances:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(this.$slots.default){var n=this.$slots.default.filter(function(t){return t.tag&&t.componentOptions&&"ElTabPane"===t.componentOptions.Ctor.options.name}),r=n.map(function(t){return t.componentInstance}),o=!(r.length===this.panes.length&&r.every(function(e,n){return e===t.panes[n]}));(e||o)&&(this.panes=r)}else 0!==this.panes.length&&(this.panes=[])},handleTabClick:function(t,e,n){t.disabled||(this.setCurrentName(e),this.$emit("tab-click",t,n))},handleTabRemove:function(t,e){t.disabled||(e.stopPropagation(),this.$emit("edit",t.name,"remove"),this.$emit("tab-remove",t.name))},handleTabAdd:function(){this.$emit("edit",null,"add"),this.$emit("tab-add")},setCurrentName:function(t){var e=this,n=function(){e.currentName=t,e.$emit("input",t)};if(this.currentName!==t&&this.beforeLeave){var r=this.beforeLeave(t,this.currentName);r&&r.then?r.then(function(){n(),e.$refs.nav&&e.$refs.nav.removeFocus()},function(){}):!1!==r&&n()}else n()}},render:function(t){var e,n=this.type,r=this.handleTabClick,o=this.handleTabRemove,i=this.handleTabAdd,a=this.currentName,s=this.panes,l=this.editable,c=this.addable,u=this.tabPosition,p=this.stretch,f=l||c?t("span",{class:"el-tabs__new-tab",on:{click:i,keydown:function(t){13===t.keyCode&&i()}},attrs:{tabindex:"0"}},[t("i",{class:"el-icon-plus"})]):null,d={props:{currentName:a,onTabClick:r,onTabRemove:o,editable:l,type:n,panes:s,stretch:p},ref:"nav"},h=t("div",{class:["el-tabs__header","is-".concat(u)]},[f,t("tab-nav",us()([{},d]))]),v=t("div",{class:"el-tabs__content"},[this.$slots.default]);return t("div",{class:(e={"el-tabs":!0,"el-tabs--card":"card"===n},ls(e,"el-tabs--".concat(u),!0),ls(e,"el-tabs--border-card","border-card"===n),e)},["bottom"!==u?[h,v]:[v,h]])},created:function(){this.currentName||this.setCurrentName("0"),this.$on("tab-nav-update",this.calcPaneInstances.bind(null,!0))},mounted:function(){this.calcPaneInstances()},updated:function(){this.calcPaneInstances()}},Bs=Object(qa.a)(zs,void 0,void 0,!1,null,null,null).exports,Vs={name:"ElTabPane",componentName:"ElTabPane",props:{label:String,labelContent:Function,name:String,closable:Boolean,disabled:Boolean,lazy:Boolean},data:function(){return{index:null,loaded:!1}},computed:{isClosable:function(){return this.closable||this.$parent.closable},active:function(){var t=this.$parent.currentName===(this.name||this.index);return t&&(this.loaded=!0),t},paneName:function(){return this.name||this.index}},updated:function(){this.$parent.$emit("tab-nav-update")}},Hs=Object(qa.a)(Vs,function(){var t=this,e=t.$createElement,n=t._self._c||e;return!t.lazy||t.loaded||t.active?n("div",{directives:[{name:"show",rawName:"v-show",value:t.active,expression:"active"}],staticClass:"el-tab-pane",attrs:{role:"tabpanel","aria-hidden":!t.active,id:"pane-"+t.paneName,"aria-labelledby":"tab-"+t.paneName}},[t._t("default")],2):t._e()},[],!1,null,null,null).exports,Zs=(n(100),[{},({Vue:t})=>{t.mixin({computed:{$dataBlock(){return this.$options.__data__block__}}})},{},{},({router:t})=>{"undefined"!=typeof window&&(function(t,e,n,r,o,i,a){t.GoogleAnalyticsObject=o,t.ga=t.ga||function(){(t.ga.q=t.ga.q||[]).push(arguments)},t.ga.l=1*new Date,i=e.createElement(n),a=e.getElementsByTagName(n)[0],i.async=1,i.src="https://www.google-analytics.com/analytics.js",a.parentNode.insertBefore(i,a)}(window,document,"script",0,"ga"),ga("create","UA-144196556-1","auto"),ga("set","anonymizeIp",!0),ga("send","pageview"),t.afterEach(function(t){ga("set","page",t.fullPath),ga("send","pageview")}))},({Vue:t})=>{t.component("BackToTop",es)},({Vue:t})=>{t.component("ReadingProgress",rs),t.mixin({computed:{$readingShow(){const{readingDir:t,fixed:e}=os,n=this.$page.regularPath;if(void 0!==this.$frontmatter.readingShow){const t=this.$frontmatter.readingShow;return"boolean"==typeof t&&t?"top":t}if(n){if(null===t)return e;if("string"==typeof t)return is(n,t,e);if(Array.isArray(t)){for(let r=0;rt.path.toLowerCase()===e.toLowerCase()).length>0}var Gs={props:{pageKey:String,slotKey:{type:String,default:"default"}},render(t){const e=this.pageKey||this.$parent.$page.key;return Ua("pageKey",e),Uo.component(e)||Uo.component(e,Ia(e)),t(e||"")}},Qs={functional:!0,props:{slotKey:String,required:!0},render:(t,{props:e,slots:n})=>t("div",{class:[`content__${e.slotKey}`]},n()[e.slotKey])},tl=(n(101),Object(qa.a)({},function(t,e){var n=e._c;return n("svg",{staticClass:"icon outbound",attrs:{xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",x:"0px",y:"0px",viewBox:"0 0 100 100",width:"15",height:"15"}},[n("path",{attrs:{fill:"currentColor",d:"M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"}}),e._v(" "),n("polygon",{attrs:{fill:"currentColor",points:"45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"}})])},[],!0,null,null,null).exports),el={functional:!0,render(t,{parent:e,children:n}){if(e._isMounted)return n;e.$once("hook:mounted",()=>{e.$forceUpdate()})}};Uo.config.productionTip=!1,Uo.use(ba),Uo.use(Xs),Uo.mixin(function(t,e,n=Uo){!function(t){t.locales&&Object.keys(t.locales).forEach(e=>{t.locales[e].path=e}),Object.freeze(t)}(e),n.$vuepress.$set("siteData",e);const r=new(t(n.$vuepress.$get("siteData"))),o=Object.getOwnPropertyDescriptors(Object.getPrototypeOf(r)),i={};return Object.keys(o).reduce((t,e)=>(e.startsWith("$")&&(t[e]=o[e].get),t),i),{computed:i}}(t=>(class{setPage(t){this.__page=t}get $site(){return t}get $themeConfig(){return this.$site.themeConfig}get $frontmatter(){return this.$page.frontmatter}get $localeConfig(){const{locales:t={}}=this.$site;let e,n;for(const r in t)"/"===r?n=t[r]:0===this.$page.path.indexOf(r)&&(e=t[r]);return e||n||{}}get $siteTitle(){return this.$localeConfig.title||this.$site.title||""}get $title(){const t=this.$page,{metaTitle:e}=this.$page.frontmatter;if("string"==typeof e)return e;const n=this.$siteTitle,r=t.frontmatter.home?null:t.frontmatter.title||t.title;return n?r?r+" | "+n:n:r||"VuePress"}get $description(){const t=function(t){if(t){const e=t.filter(t=>"description"===t.name)[0];if(e)return e.content}}(this.$page.frontmatter.meta);return t||this.$page.frontmatter.description||this.$localeConfig.description||this.$site.description||""}get $lang(){return this.$page.frontmatter.lang||this.$localeConfig.lang||"en-US"}get $localePath(){return this.$localeConfig.path||"/"}get $themeLocaleConfig(){return(this.$site.themeConfig.locales||{})[this.$localePath]||{}}get $page(){return this.__page?this.__page:function(t,e){for(let n=0;nn||(t.hash?!Uo.$vuepress.$get("disableScrollBehavior")&&{selector:t.hash}:{x:0,y:0})});!function(t){t.beforeEach((e,n,r)=>{if(Js(t,e.path))r();else if(/(\/|\.html)$/.test(e.path))if(/\/$/.test(e.path)){const n=e.path.replace(/\/$/,"")+".html";Js(t,n)?r(n):r()}else r();else{const n=e.path+"/",o=e.path+".html";Js(t,o)?r(o):Js(t,n)?r(n):r()}})}(n);const r={};try{Zs.forEach(e=>{"function"==typeof e&&e({Vue:Uo,options:r,router:n,siteData:Ja,isServer:t})})}catch(t){console.error(t)}return{app:new Uo(Object.assign(r,{router:n,render:t=>t("div",{attrs:{id:"app"}},[t("router-view",{ref:"layout"}),t("div",{class:"global-ui"},Ws.map(e=>t(e)))])})),router:n}}(!1);window.__VUEPRESS__={version:"1.0.2",hash:"dd7eaf0"},rl.onReady(()=>{nl.$mount("#app")})}]); \ No newline at end of file + */function Do(t){return Object.prototype.toString.call(t).indexOf("Error")>-1}function Ko(t,e){for(var n in e)t[n]=e[n];return t}var zo={name:"RouterView",functional:!0,props:{name:{type:String,default:"default"}},render:function(t,e){var n=e.props,r=e.children,o=e.parent,i=e.data;i.routerView=!0;for(var a=o.$createElement,s=n.name,l=o.$route,c=o._routerViewCache||(o._routerViewCache={}),u=0,p=!1;o&&o._routerRoot!==o;){var f=o.$vnode&&o.$vnode.data;f&&(f.routerView&&u++,f.keepAlive&&o._inactive&&(p=!0)),o=o.$parent}if(i.routerViewDepth=u,p)return a(c[s],i,r);var d=l.matched[u];if(!d)return c[s]=null,a();var h=c[s]=d.components[s];i.registerRouteInstance=function(t,e){var n=d.instances[s];(e&&n!==t||!e&&n===t)&&(d.instances[s]=e)},(i.hook||(i.hook={})).prepatch=function(t,e){d.instances[s]=e.componentInstance},i.hook.init=function(t){t.data.keepAlive&&t.componentInstance&&t.componentInstance!==d.instances[s]&&(d.instances[s]=t.componentInstance)};var v=i.props=function(t,e){switch(typeof e){case"undefined":return;case"object":return e;case"function":return e(t);case"boolean":return e?t.params:void 0;default:0}}(l,d.props&&d.props[s]);if(v){v=i.props=Ko({},v);var m=i.attrs=i.attrs||{};for(var g in v)h.props&&g in h.props||(m[g]=v[g],delete v[g])}return a(h,i,r)}};var Bo=/[!'()*]/g,Vo=function(t){return"%"+t.charCodeAt(0).toString(16)},Ho=/%2C/g,Zo=function(t){return encodeURIComponent(t).replace(Bo,Vo).replace(Ho,",")},Wo=decodeURIComponent;function qo(t){var e={};return(t=t.trim().replace(/^(\?|#|&)/,""))?(t.split("&").forEach(function(t){var n=t.replace(/\+/g," ").split("="),r=Wo(n.shift()),o=n.length>0?Wo(n.join("=")):null;void 0===e[r]?e[r]=o:Array.isArray(e[r])?e[r].push(o):e[r]=[e[r],o]}),e):e}function Yo(t){var e=t?Object.keys(t).map(function(e){var n=t[e];if(void 0===n)return"";if(null===n)return Zo(e);if(Array.isArray(n)){var r=[];return n.forEach(function(t){void 0!==t&&(null===t?r.push(Zo(e)):r.push(Zo(e)+"="+Zo(t)))}),r.join("&")}return Zo(e)+"="+Zo(n)}).filter(function(t){return t.length>0}).join("&"):null;return e?"?"+e:""}var Xo=/\/?$/;function Jo(t,e,n,r){var o=r&&r.options.stringifyQuery,i=e.query||{};try{i=Go(i)}catch(t){}var a={name:e.name||t&&t.name,meta:t&&t.meta||{},path:e.path||"/",hash:e.hash||"",query:i,params:e.params||{},fullPath:ei(e,o),matched:t?ti(t):[]};return n&&(a.redirectedFrom=ei(n,o)),Object.freeze(a)}function Go(t){if(Array.isArray(t))return t.map(Go);if(t&&"object"==typeof t){var e={};for(var n in t)e[n]=Go(t[n]);return e}return t}var Qo=Jo(null,{path:"/"});function ti(t){for(var e=[];t;)e.unshift(t),t=t.parent;return e}function ei(t,e){var n=t.path,r=t.query;void 0===r&&(r={});var o=t.hash;return void 0===o&&(o=""),(n||"/")+(e||Yo)(r)+o}function ni(t,e){return e===Qo?t===e:!!e&&(t.path&&e.path?t.path.replace(Xo,"")===e.path.replace(Xo,"")&&t.hash===e.hash&&ri(t.query,e.query):!(!t.name||!e.name)&&(t.name===e.name&&t.hash===e.hash&&ri(t.query,e.query)&&ri(t.params,e.params)))}function ri(t,e){if(void 0===t&&(t={}),void 0===e&&(e={}),!t||!e)return t===e;var n=Object.keys(t),r=Object.keys(e);return n.length===r.length&&n.every(function(n){var r=t[n],o=e[n];return"object"==typeof r&&"object"==typeof o?ri(r,o):String(r)===String(o)})}var oi,ii=[String,Object],ai=[String,Array],si={name:"RouterLink",props:{to:{type:ii,required:!0},tag:{type:String,default:"a"},exact:Boolean,append:Boolean,replace:Boolean,activeClass:String,exactActiveClass:String,event:{type:ai,default:"click"}},render:function(t){var e=this,n=this.$router,r=this.$route,o=n.resolve(this.to,r,this.append),i=o.location,a=o.route,s=o.href,l={},c=n.options.linkActiveClass,u=n.options.linkExactActiveClass,p=null==c?"router-link-active":c,f=null==u?"router-link-exact-active":u,d=null==this.activeClass?p:this.activeClass,h=null==this.exactActiveClass?f:this.exactActiveClass,v=i.path?Jo(null,i,null,n):a;l[h]=ni(r,v),l[d]=this.exact?l[h]:function(t,e){return 0===t.path.replace(Xo,"/").indexOf(e.path.replace(Xo,"/"))&&(!e.hash||t.hash===e.hash)&&function(t,e){for(var n in e)if(!(n in t))return!1;return!0}(t.query,e.query)}(r,v);var m=function(t){li(t)&&(e.replace?n.replace(i):n.push(i))},g={click:li};Array.isArray(this.event)?this.event.forEach(function(t){g[t]=m}):g[this.event]=m;var y={class:l};if("a"===this.tag)y.on=g,y.attrs={href:s};else{var b=function t(e){if(e)for(var n,r=0;r=0&&(e=t.slice(r),t=t.slice(0,r));var o=t.indexOf("?");return o>=0&&(n=t.slice(o+1),t=t.slice(0,o)),{path:t,query:n,hash:e}}(o.path||""),l=e&&e.path||"/",c=s.path?ui(s.path,l,n||o.append):l,u=function(t,e,n){void 0===e&&(e={});var r,o=n||qo;try{r=o(t||"")}catch(t){r={}}for(var i in e)r[i]=e[i];return r}(s.query,o.query,r&&r.options.parseQuery),p=o.hash||s.hash;return p&&"#"!==p.charAt(0)&&(p="#"+p),{_normalized:!0,path:c,query:u,hash:p}}function Li(t,e){var n=Ai(t),r=n.pathList,o=n.pathMap,i=n.nameMap;function a(t,n,a){var s=Pi(t,n,!1,e),c=s.name;if(c){var u=i[c];if(!u)return l(null,s);var p=u.regex.keys.filter(function(t){return!t.optional}).map(function(t){return t.name});if("object"!=typeof s.params&&(s.params={}),n&&"object"==typeof n.params)for(var f in n.params)!(f in s.params)&&p.indexOf(f)>-1&&(s.params[f]=n.params[f]);return s.path=Ti(u.path,s.params),l(u,s,a)}if(s.path){s.params={};for(var d=0;d=t.length?n():t[o]?e(t[o],function(){r(o+1)}):r(o+1)};r(0)}function Gi(t){return function(e,n,r){var o=!1,i=0,a=null;Qi(t,function(t,e,n,s){if("function"==typeof t&&void 0===t.cid){o=!0,i++;var l,c=na(function(e){var o;((o=e).__esModule||ea&&"Module"===o[Symbol.toStringTag])&&(e=e.default),t.resolved="function"==typeof e?e:oi.extend(e),n.components[s]=e,--i<=0&&r()}),u=na(function(t){var e="Failed to resolve async component "+s+": "+t;a||(a=Do(t)?t:new Error(e),r(a))});try{l=t(c,u)}catch(t){u(t)}if(l)if("function"==typeof l.then)l.then(c,u);else{var p=l.component;p&&"function"==typeof p.then&&p.then(c,u)}}}),o||r()}}function Qi(t,e){return ta(t.map(function(t){return Object.keys(t.components).map(function(n){return e(t.components[n],t.instances[n],t,n)})}))}function ta(t){return Array.prototype.concat.apply([],t)}var ea="function"==typeof Symbol&&"symbol"==typeof Symbol.toStringTag;function na(t){var e=!1;return function(){for(var n=[],r=arguments.length;r--;)n[r]=arguments[r];if(!e)return e=!0,t.apply(this,n)}}var ra=function(t,e){this.router=t,this.base=function(t){if(!t)if(ci){var e=document.querySelector("base");t=(t=e&&e.getAttribute("href")||"/").replace(/^https?:\/\/[^\/]+/,"")}else t="/";"/"!==t.charAt(0)&&(t="/"+t);return t.replace(/\/$/,"")}(e),this.current=Qo,this.pending=null,this.ready=!1,this.readyCbs=[],this.readyErrorCbs=[],this.errorCbs=[]};function oa(t,e,n,r){var o=Qi(t,function(t,r,o,i){var a=function(t,e){"function"!=typeof t&&(t=oi.extend(t));return t.options[e]}(t,e);if(a)return Array.isArray(a)?a.map(function(t){return n(t,r,o,i)}):n(a,r,o,i)});return ta(r?o.reverse():o)}function ia(t,e){if(e)return function(){return t.apply(e,arguments)}}ra.prototype.listen=function(t){this.cb=t},ra.prototype.onReady=function(t,e){this.ready?t():(this.readyCbs.push(t),e&&this.readyErrorCbs.push(e))},ra.prototype.onError=function(t){this.errorCbs.push(t)},ra.prototype.transitionTo=function(t,e,n){var r=this,o=this.router.match(t,this.current);this.confirmTransition(o,function(){r.updateRoute(o),e&&e(o),r.ensureURL(),r.ready||(r.ready=!0,r.readyCbs.forEach(function(t){t(o)}))},function(t){n&&n(t),t&&!r.ready&&(r.ready=!0,r.readyErrorCbs.forEach(function(e){e(t)}))})},ra.prototype.confirmTransition=function(t,e,n){var r=this,o=this.current,i=function(t){Do(t)&&(r.errorCbs.length?r.errorCbs.forEach(function(e){e(t)}):console.error(t)),n&&n(t)};if(ni(t,o)&&t.matched.length===o.matched.length)return this.ensureURL(),i();var a=function(t,e){var n,r=Math.max(t.length,e.length);for(n=0;n-1?decodeURI(t.slice(0,r))+t.slice(r):decodeURI(t)}else n>-1&&(t=decodeURI(t.slice(0,n))+t.slice(n));return t}function pa(t){var e=window.location.href,n=e.indexOf("#");return(n>=0?e.slice(0,n):e)+"#"+t}function fa(t){Vi?Yi(pa(t)):window.location.hash=t}function da(t){Vi?Xi(pa(t)):window.location.replace(pa(t))}var ha=function(t){function e(e,n){t.call(this,e,n),this.stack=[],this.index=-1}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.push=function(t,e,n){var r=this;this.transitionTo(t,function(t){r.stack=r.stack.slice(0,r.index+1).concat(t),r.index++,e&&e(t)},n)},e.prototype.replace=function(t,e,n){var r=this;this.transitionTo(t,function(t){r.stack=r.stack.slice(0,r.index).concat(t),e&&e(t)},n)},e.prototype.go=function(t){var e=this,n=this.index+t;if(!(n<0||n>=this.stack.length)){var r=this.stack[n];this.confirmTransition(r,function(){e.index=n,e.updateRoute(r)})}},e.prototype.getCurrentLocation=function(){var t=this.stack[this.stack.length-1];return t?t.fullPath:"/"},e.prototype.ensureURL=function(){},e}(ra),va=function(t){void 0===t&&(t={}),this.app=null,this.apps=[],this.options=t,this.beforeHooks=[],this.resolveHooks=[],this.afterHooks=[],this.matcher=Li(t.routes||[],this);var e=t.mode||"hash";switch(this.fallback="history"===e&&!Vi&&!1!==t.fallback,this.fallback&&(e="hash"),ci||(e="abstract"),this.mode=e,e){case"history":this.history=new aa(this,t.base);break;case"hash":this.history=new la(this,t.base,this.fallback);break;case"abstract":this.history=new ha(this,t.base);break;default:0}},ma={currentRoute:{configurable:!0}};function ya(t,e){return t.push(e),function(){var n=t.indexOf(e);n>-1&&t.splice(n,1)}}va.prototype.match=function(t,e,n){return this.matcher.match(t,e,n)},ma.currentRoute.get=function(){return this.history&&this.history.current},va.prototype.init=function(t){var e=this;if(this.apps.push(t),t.$once("hook:destroyed",function(){var n=e.apps.indexOf(t);n>-1&&e.apps.splice(n,1),e.app===t&&(e.app=e.apps[0]||null)}),!this.app){this.app=t;var n=this.history;if(n instanceof aa)n.transitionTo(n.getCurrentLocation());else if(n instanceof la){var r=function(){n.setupListeners()};n.transitionTo(n.getCurrentLocation(),r,r)}n.listen(function(t){e.apps.forEach(function(e){e._route=t})})}},va.prototype.beforeEach=function(t){return ya(this.beforeHooks,t)},va.prototype.beforeResolve=function(t){return ya(this.resolveHooks,t)},va.prototype.afterEach=function(t){return ya(this.afterHooks,t)},va.prototype.onReady=function(t,e){this.history.onReady(t,e)},va.prototype.onError=function(t){this.history.onError(t)},va.prototype.push=function(t,e,n){this.history.push(t,e,n)},va.prototype.replace=function(t,e,n){this.history.replace(t,e,n)},va.prototype.go=function(t){this.history.go(t)},va.prototype.back=function(){this.go(-1)},va.prototype.forward=function(){this.go(1)},va.prototype.getMatchedComponents=function(t){var e=t?t.matched?t:this.resolve(t).route:this.currentRoute;return e?[].concat.apply([],e.matched.map(function(t){return Object.keys(t.components).map(function(e){return t.components[e]})})):[]},va.prototype.resolve=function(t,e,n){var r=Pi(t,e=e||this.history.current,n,this),o=this.match(r,e),i=o.redirectedFrom||o.fullPath;return{location:r,route:o,href:function(t,e,n){var r="hash"===n?"#"+e:e;return t?pi(t+"/"+r):r}(this.history.base,i,this.mode),normalizedTo:r,resolved:o}},va.prototype.addRoutes=function(t){this.matcher.addRoutes(t),this.history.current!==Qo&&this.history.transitionTo(this.history.getCurrentLocation())},Object.defineProperties(va.prototype,ma),va.install=function t(e){if(!t.installed||oi!==e){t.installed=!0,oi=e;var n=function(t){return void 0!==t},r=function(t,e){var r=t.$options._parentVnode;n(r)&&n(r=r.data)&&n(r=r.registerRouteInstance)&&r(t,e)};e.mixin({beforeCreate:function(){n(this.$options.router)?(this._routerRoot=this,this._router=this.$options.router,this._router.init(this),e.util.defineReactive(this,"_route",this._router.history.current)):this._routerRoot=this.$parent&&this.$parent._routerRoot||this,r(this,this)},destroyed:function(){r(this)}}),Object.defineProperty(e.prototype,"$router",{get:function(){return this._routerRoot._router}}),Object.defineProperty(e.prototype,"$route",{get:function(){return this._routerRoot._route}}),e.component("RouterView",zo),e.component("RouterLink",si);var o=e.config.optionMergeStrategies;o.beforeRouteEnter=o.beforeRouteLeave=o.beforeRouteUpdate=o.created}},va.version="3.0.7",ci&&window.Vue&&window.Vue.use(va);var ba=va;var _a={NotFound:()=>n.e(29).then(n.bind(null,352)),Layout:()=>Promise.all([n.e(0),n.e(2),n.e(11)]).then(n.bind(null,351))},wa={"v-cbd95058":()=>n.e(30).then(n.bind(null,364)),"v-796bf18c":()=>n.e(31).then(n.bind(null,361)),"v-0a714732":()=>n.e(6).then(n.bind(null,360)),"v-46ec0327":()=>n.e(12).then(n.bind(null,363)),"v-77cc1ec7":()=>n.e(22).then(n.bind(null,383)),"v-986dbade":()=>n.e(20).then(n.bind(null,382)),"v-8d4dfbb6":()=>n.e(23).then(n.bind(null,381)),"v-76564011":()=>n.e(32).then(n.bind(null,380)),"v-8658c2f2":()=>n.e(9).then(n.bind(null,367)),"v-7434c187":()=>n.e(3).then(n.bind(null,368)),"v-4db1779e":()=>n.e(34).then(n.bind(null,355)),"v-0996c938":()=>n.e(33).then(n.bind(null,357)),"v-c0fa0cf2":()=>n.e(7).then(n.bind(null,358)),"v-6c5acde7":()=>n.e(14).then(n.bind(null,365)),"v-240eddf2":()=>n.e(15).then(n.bind(null,366)),"v-7d2f6cc7":()=>n.e(16).then(n.bind(null,384)),"v-9d44dcf2":()=>n.e(13).then(n.bind(null,369)),"v-1263fa20":()=>n.e(35).then(n.bind(null,370)),"v-5db85fb7":()=>n.e(10).then(n.bind(null,372)),"v-5be22288":()=>n.e(27).then(n.bind(null,374)),"v-61ad5b01":()=>n.e(36).then(n.bind(null,376)),"v-4b91c5e7":()=>n.e(26).then(n.bind(null,378)),"v-cfc76602":()=>n.e(18).then(n.bind(null,379)),"v-c621d7f2":()=>n.e(37).then(n.bind(null,377)),"v-7249b1a4":()=>n.e(24).then(n.bind(null,375)),"v-5566a571":()=>n.e(19).then(n.bind(null,373)),"v-76626758":()=>n.e(28).then(n.bind(null,371)),"v-554543f9":()=>n.e(5).then(n.bind(null,359)),"v-3732859b":()=>n.e(21).then(n.bind(null,356)),"v-292f2847":()=>n.e(17).then(n.bind(null,354)),"v-0393ebb2":()=>n.e(8).then(n.bind(null,353))};function xa(t){const e=Object.create(null);return function(n){return e[n]||(e[n]=t(n))}}const ka=/-(\w)/g,Oa=xa(t=>t.replace(ka,(t,e)=>e?e.toUpperCase():"")),$a=/\B([A-Z])/g,Ca=xa(t=>t.replace($a,"-$1").toLowerCase()),Ea=xa(t=>t.charAt(0).toUpperCase()+t.slice(1));function Sa(t,e){if(!e)return;if(t(e))return t(e);return e.includes("-")?t(Ea(Oa(e))):t(Ea(e))||t(Ca(e))}const Ta=Object.assign({},_a,wa),Aa=t=>Ta[t],ja=t=>wa[t],Pa=t=>_a[t],La=t=>Uo.component(t);function Ia(t){return Sa(ja,t)}function Ma(t){return Sa(Pa,t)}function Ra(t){return Sa(Aa,t)}function Na(t){return Sa(La,t)}function Fa(...t){return Promise.all(t.filter(t=>t).map(async t=>{if(!Na(t)&&Ra(t)){const e=await Ra(t)();Uo.component(t,e.default)}}))}function Ua(t,e){"undefined"!=typeof window&&window.__VUEPRESS__&&(window.__VUEPRESS__[t]=e)}var Da={created(){this.$ssrContext&&(this.$ssrContext.title=this.$title,this.$ssrContext.lang=this.$lang,this.$ssrContext.description=this.$page.description||this.$description)},mounted(){this.currentMetaTags=new Set,this.updateMeta()},methods:{updateMeta(){document.title=this.$title,document.documentElement.lang=this.$lang;const t=this.$page.frontmatter.meta||[],e=t.slice(0);0===t.filter(t=>"description"===t.name).length&&e.push({name:"description",content:this.$description});const n=document.querySelectorAll('meta[name="description"]');n.length&&n.forEach(t=>this.currentMetaTags.add(t)),this.currentMetaTags=new Set(Ka(e,this.currentMetaTags))}},watch:{$page(){this.updateMeta()}},beforeDestroy(){Ka(null,this.currentMetaTags)}};function Ka(t,e){if(e&&[...e].forEach(t=>{document.head.removeChild(t)}),t)return t.map(t=>{const e=document.createElement("meta");return Object.keys(t).forEach(n=>{e.setAttribute(n,t[n])}),document.head.appendChild(e),e})}var za=n(52),Ba={mounted(){window.addEventListener("scroll",this.onScroll)},methods:{onScroll:n.n(za)()(function(){this.setActiveHash()},300),setActiveHash(){const t=[].slice.call(document.querySelectorAll(".sidebar-link")),e=[].slice.call(document.querySelectorAll(".header-anchor")).filter(e=>t.some(t=>t.hash===e.hash)),n=Math.max(window.pageYOffset,document.documentElement.scrollTop,document.body.scrollTop),r=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight),o=window.innerHeight+n;for(let t=0;t=i.parentElement.offsetTop+10&&(!a||n{this.$nextTick(()=>{this.$vuepress.$set("disableScrollBehavior",!1)})})}}}},beforeDestroy(){window.removeEventListener("scroll",this.onScroll)}},Va=n(16),Ha=n.n(Va),Za=[Da,Ba,{mounted(){Ha.a.configure({showSpinner:!1}),this.$router.beforeEach((t,e,n)=>{t.path===e.path||Uo.component(t.name)||Ha.a.start(),n()}),this.$router.afterEach(()=>{Ha.a.done(),this.isSidebarOpen=!1})}}],Wa={methods:{getLayout:function(){if(this.$page.path){var t=this.$page.frontmatter.layout;return t&&(this.$vuepress.getLayoutAsyncComponent(t)||this.$vuepress.getVueComponent(t))?t:"Layout"}return"NotFound"}},computed:{layout:function(){var t=this.getLayout();return Ua("layout",t),Uo.component(t)}}},qa=n(0),Ya=Object(qa.a)(Wa,function(){var t=this.$createElement;return(this._self._c||t)(this.layout,{tag:"component"})},[],!1,null,null,null).exports;!function(t,e,n){switch(e){case"components":t[e]||(t[e]={}),Object.assign(t[e],n);break;case"mixins":t[e]||(t[e]=[]),t[e].push(...n);break;default:throw new Error("Unknown option name.")}}(Ya,"mixins",Za);const Xa=[{name:"v-cbd95058",path:"/",component:Ya,beforeEnter:(t,e,n)=>{Fa("HomePage","v-cbd95058").then(n)}},{path:"/index.html",redirect:"/"},{name:"v-796bf18c",path:"/guide/",component:Ya,beforeEnter:(t,e,n)=>{Fa("Layout","v-796bf18c").then(n)}},{path:"/guide/index.html",redirect:"/guide/"},{name:"v-0a714732",path:"/guide/cluster/storage.html",component:Ya,beforeEnter:(t,e,n)=>{Fa("Layout","v-0a714732").then(n)}},{name:"v-46ec0327",path:"/guide/cluster/namespace.html",component:Ya,beforeEnter:(t,e,n)=>{Fa("Layout","v-46ec0327").then(n)}},{name:"v-77cc1ec7",path:"/guide/cluster/computing.html",component:Ya,beforeEnter:(t,e,n)=>{Fa("Layout","v-77cc1ec7").then(n)}},{name:"v-986dbade",path:"/guide/diagonize/events.html",component:Ya,beforeEnter:(t,e,n)=>{Fa("Layout","v-986dbade").then(n)}},{name:"v-8d4dfbb6",path:"/guide/diagonize/logs.html",component:Ya,beforeEnter:(t,e,n)=>{Fa("Layout","v-8d4dfbb6").then(n)}},{name:"v-76564011",path:"/guide/diagonize/port-forward.html",component:Ya,beforeEnter:(t,e,n)=>{Fa("Layout","v-76564011").then(n)}},{name:"v-8658c2f2",path:"/guide/example/busybox.html",component:Ya,beforeEnter:(t,e,n)=>{Fa("Layout","v-8658c2f2").then(n)}},{name:"v-7434c187",path:"/guide/example/monitor.html",component:Ya,beforeEnter:(t,e,n)=>{Fa("Layout","v-7434c187").then(n)}},{name:"v-4db1779e",path:"/guide/monitor/apis.html",component:Ya,beforeEnter:(t,e,n)=>{Fa("Layout","v-4db1779e").then(n)}},{name:"v-0996c938",path:"/guide/monitor/",component:Ya,beforeEnter:(t,e,n)=>{Fa("Layout","v-0996c938").then(n)}},{path:"/guide/monitor/index.html",redirect:"/guide/monitor/"},{name:"v-c0fa0cf2",path:"/guide/namespace/adjustion.html",component:Ya,beforeEnter:(t,e,n)=>{Fa("Layout","v-c0fa0cf2").then(n)}},{name:"v-6c5acde7",path:"/guide/namespace/configMap.html",component:Ya,beforeEnter:(t,e,n)=>{Fa("Layout","v-6c5acde7").then(n)}},{name:"v-240eddf2",path:"/guide/namespace/pvc.html",component:Ya,beforeEnter:(t,e,n)=>{Fa("Layout","v-240eddf2").then(n)}},{name:"v-7d2f6cc7",path:"/guide/namespace/secrets.html",component:Ya,beforeEnter:(t,e,n)=>{Fa("Layout","v-7d2f6cc7").then(n)}},{name:"v-9d44dcf2",path:"/guide/namespace/multi-env.html",component:Ya,beforeEnter:(t,e,n)=>{Fa("Layout","v-9d44dcf2").then(n)}},{name:"v-1263fa20",path:"/guide/namespace/",component:Ya,beforeEnter:(t,e,n)=>{Fa("Layout","v-1263fa20").then(n)}},{path:"/guide/namespace/index.html",redirect:"/guide/namespace/"},{name:"v-5db85fb7",path:"/guide/namespace/workload.html",component:Ya,beforeEnter:(t,e,n)=>{Fa("Layout","v-5db85fb7").then(n)}},{name:"v-5be22288",path:"/install/",component:Ya,beforeEnter:(t,e,n)=>{Fa("Layout","v-5be22288").then(n)}},{path:"/install/index.html",redirect:"/install/"},{name:"v-61ad5b01",path:"/install/install-common-ingress.html",component:Ya,beforeEnter:(t,e,n)=>{Fa("Layout","v-61ad5b01").then(n)}},{name:"v-4b91c5e7",path:"/install/install-common-vm.html",component:Ya,beforeEnter:(t,e,n)=>{Fa("Layout","v-4b91c5e7").then(n)}},{name:"v-cfc76602",path:"/install/install-kind.html",component:Ya,beforeEnter:(t,e,n)=>{Fa("Layout","v-cfc76602").then(n)}},{name:"v-c621d7f2",path:"/install/install-dashboard.html",component:Ya,beforeEnter:(t,e,n)=>{Fa("Layout","v-c621d7f2").then(n)}},{name:"v-7249b1a4",path:"/overview/",component:Ya,beforeEnter:(t,e,n)=>{Fa("Layout","v-7249b1a4").then(n)}},{path:"/overview/index.html",redirect:"/overview/"},{name:"v-5566a571",path:"/overview/why-kuboard.html",component:Ya,beforeEnter:(t,e,n)=>{Fa("Layout","v-5566a571").then(n)}},{name:"v-76626758",path:"/support/",component:Ya,beforeEnter:(t,e,n)=>{Fa("Layout","v-76626758").then(n)}},{path:"/support/index.html",redirect:"/support/"},{name:"v-554543f9",path:"/guide/example/import.html",component:Ya,beforeEnter:(t,e,n)=>{Fa("Layout","v-554543f9").then(n)}},{name:"v-3732859b",path:"/install/install-kubernetes.html",component:Ya,beforeEnter:(t,e,n)=>{Fa("Layout","v-3732859b").then(n)}},{name:"v-292f2847",path:"/install/install-k8s.html",component:Ya,beforeEnter:(t,e,n)=>{Fa("Layout","v-292f2847").then(n)}},{name:"v-0393ebb2",path:"/overview/concepts.html",component:Ya,beforeEnter:(t,e,n)=>{Fa("Layout","v-0393ebb2").then(n)}},{path:"*",component:Ya}],Ja={title:"Kuboard",description:"A cool Kubernetes Dashboard",base:"/",pages:[{title:"Home",frontmatter:{home:!0,layout:"HomePage",actionText:"Live Demo",actionLink:"http://demo.eip.work/#/login?isReadOnly=true&token=eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJrdWJvYXJkLXZpZXdlci10b2tlbi02djZiZiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJrdWJvYXJkLXZpZXdlciIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjhiYTU3YmI1LWFiMTctNDM1NS1hNTM0LTQ0Njk4NGY0NzFlZiIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTprdWJvYXJkLXZpZXdlciJ9.DcXNIp0RKha1zkV4ga_QlGfcvMLGx2LOyzX-0VeboC3FojKFhxnfBeoda-zTeh6ugJlSM4kQYrRcof1Kx8Mg3-UgofNmgRySbDEVKtJZyMUoHqLmySKUIn8sbX8q83RNcqwcvY-fM8-w8HSuzU7Td7WWNuZrlCL4q_LQDYIBet1nlQ83YsENKNE8rsZQFDw8YM0MH6BEZLdwyhaboy_jjYbsU7kv8gks3aIX4lh1Fs9ZFQpC_6B0_MZvb7rEeG2M8QWXoUkDoL5JCKu6Wot5GlWf0kDMxIsViggP0NmSDTKh6kIvCkT2FZ2I4guEcjE_EjBpdOS6Abta22tzLlPKhg",actionText2:"Get Started →",actionLink2:"/overview/",features:[{title:"降低 Kubernetes 门槛",details:"创建工作负载,导出/导入配置,批量调整镜像版本,问题诊断"},{title:"直观显示微服务架构",details:"展现层/网关层/服务层/持久层/中间件层/监控层"},{title:"上下文关联监控",details:"资源层监控/中间件层监控/链路层监控"}],footer:"Copyright © 2019-present HuanQing Shao",meta:[{property:"article:modified_time",content:"2019-07-25T10:04:19.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"Home"},{property:"og:type",content:"website"},{property:"og:url",content:"/"},{name:"twitter:title",content:"Home"},{name:"twitter:url",content:"/"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/",relativePath:"README.md",key:"v-cbd95058",path:"/",lastUpdated:"2019-07-25 18:04:19"},{title:"使用手册",frontmatter:{meta:[{property:"article:modified_time",content:"2019-07-24T22:22:52.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"使用手册"},{property:"og:type",content:"website"},{property:"og:url",content:"/guide/"},{name:"twitter:title",content:"使用手册"},{name:"twitter:url",content:"/guide/"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/guide/",relativePath:"guide/README.md",key:"v-796bf18c",path:"/guide/",lastUpdated:"2019-07-25 06:22:52"},{title:"存储空间管理",frontmatter:{meta:[{property:"article:modified_time",content:"2019-07-24T22:22:52.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"存储空间管理"},{property:"og:type",content:"website"},{property:"og:url",content:"/guide/cluster/storage.html"},{name:"twitter:title",content:"存储空间管理"},{name:"twitter:url",content:"/guide/cluster/storage.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/guide/cluster/storage.html",relativePath:"guide/cluster/storage.md",key:"v-0a714732",path:"/guide/cluster/storage.html",headers:[{level:2,title:"创建存储类",slug:"创建存储类"},{level:3,title:"在阿里云创建 NAS 服务",slug:"在阿里云创建-nas-服务"},{level:3,title:"在 Kuboard 创建存储类",slug:"在-kuboard-创建存储类"}],lastUpdated:"2019-07-25 06:22:52"},{title:"名称空间管理",frontmatter:{meta:[{property:"article:modified_time",content:"2019-07-24T22:22:52.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"名称空间管理"},{property:"og:type",content:"website"},{property:"og:url",content:"/guide/cluster/namespace.html"},{name:"twitter:title",content:"名称空间管理"},{name:"twitter:url",content:"/guide/cluster/namespace.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/guide/cluster/namespace.html",relativePath:"guide/cluster/namespace.md",key:"v-46ec0327",path:"/guide/cluster/namespace.html",headers:[{level:2,title:"创建名称空间",slug:"创建名称空间"},{level:3,title:"前提",slug:"前提"},{level:3,title:"准备",slug:"准备"}],lastUpdated:"2019-07-25 06:22:52"},{title:"计算资源管理",frontmatter:{meta:[{property:"article:modified_time",content:"2019-07-24T22:22:52.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"计算资源管理"},{property:"og:type",content:"website"},{property:"og:url",content:"/guide/cluster/computing.html"},{name:"twitter:title",content:"计算资源管理"},{name:"twitter:url",content:"/guide/cluster/computing.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/guide/cluster/computing.html",relativePath:"guide/cluster/computing.md",key:"v-77cc1ec7",path:"/guide/cluster/computing.html",headers:[{level:2,title:"前提",slug:"前提"},{level:2,title:"添加节点",slug:"添加节点"},{level:2,title:"查看节点",slug:"查看节点"},{level:2,title:"移除节点",slug:"移除节点"}],lastUpdated:"2019-07-25 06:22:52"},{title:"集群事件",frontmatter:{meta:[{property:"article:modified_time",content:"2019-07-24T22:22:52.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"集群事件"},{property:"og:type",content:"website"},{property:"og:url",content:"/guide/diagonize/events.html"},{name:"twitter:title",content:"集群事件"},{name:"twitter:url",content:"/guide/diagonize/events.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/guide/diagonize/events.html",relativePath:"guide/diagonize/events.md",key:"v-986dbade",path:"/guide/diagonize/events.html",headers:[{level:2,title:"错误事件提示",slug:"错误事件提示"},{level:2,title:"全局事件",slug:"全局事件"},{level:3,title:"查看全局事件",slug:"查看全局事件"},{level:3,title:"删除事件",slug:"删除事件"},{level:2,title:"微服务上下文相关的事件",slug:"微服务上下文相关的事件"}],lastUpdated:"2019-07-25 06:22:52"},{title:"日志及终端",frontmatter:{meta:[{property:"article:modified_time",content:"2019-07-24T22:22:52.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"日志及终端"},{property:"og:type",content:"website"},{property:"og:url",content:"/guide/diagonize/logs.html"},{name:"twitter:title",content:"日志及终端"},{name:"twitter:url",content:"/guide/diagonize/logs.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/guide/diagonize/logs.html",relativePath:"guide/diagonize/logs.md",key:"v-8d4dfbb6",path:"/guide/diagonize/logs.html",lastUpdated:"2019-07-25 06:22:52"},{title:"端口转发",frontmatter:{meta:[{property:"article:modified_time",content:"2019-07-25T14:26:28.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"端口转发"},{property:"og:type",content:"website"},{property:"og:url",content:"/guide/diagonize/port-forward.html"},{name:"twitter:title",content:"端口转发"},{name:"twitter:url",content:"/guide/diagonize/port-forward.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/guide/diagonize/port-forward.html",relativePath:"guide/diagonize/port-forward.md",key:"v-76564011",path:"/guide/diagonize/port-forward.html",headers:[{level:2,title:"Feature planned",slug:"feature-planned"}],lastUpdated:"2019-07-25 22:26:28"},{title:"部署 busybox",frontmatter:{meta:[{property:"article:modified_time",content:"2019-07-25T14:26:28.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"部署 busybox"},{property:"og:type",content:"website"},{property:"og:url",content:"/guide/example/busybox.html"},{name:"twitter:title",content:"部署 busybox"},{name:"twitter:url",content:"/guide/example/busybox.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/guide/example/busybox.html",relativePath:"guide/example/busybox.md",key:"v-8658c2f2",path:"/guide/example/busybox.html",headers:[{level:2,title:"前提",slug:"前提"},{level:2,title:"部署 busybox",slug:"部署-busybox-2"},{level:2,title:"验证工作负载",slug:"验证工作负载"}],lastUpdated:"2019-07-25 22:26:28"},{title:"监控 example (alpha)",frontmatter:{meta:[{property:"article:modified_time",content:"2019-07-24T22:22:52.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"监控 example (alpha)"},{property:"og:type",content:"website"},{property:"og:url",content:"/guide/example/monitor.html"},{name:"twitter:title",content:"监控 example (alpha)"},{name:"twitter:url",content:"/guide/example/monitor.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/guide/example/monitor.html",relativePath:"guide/example/monitor.md",key:"v-7434c187",path:"/guide/example/monitor.html",headers:[{level:2,title:"前提",slug:"前提"},{level:2,title:"安装监控套件",slug:"安装监控套件"},{level:3,title:"安装全局监控套件",slug:"安装全局监控套件"},{level:3,title:"安装名称空间监控套件",slug:"安装名称空间监控套件"},{level:3,title:"查看监控套件的工作负载",slug:"查看监控套件的工作负载"},{level:2,title:"重启 example 容器组",slug:"重启-example-容器组"},{level:2,title:"查看监控信息",slug:"查看监控信息"},{level:3,title:"查看资源层监控信息",slug:"查看资源层监控信息"},{level:3,title:"查看中间件层监控信息",slug:"查看中间件层监控信息"},{level:3,title:"查看链路追踪监控信息",slug:"查看链路追踪监控信息"}],lastUpdated:"2019-07-25 06:22:52"},{title:"自定义监控套件",frontmatter:{meta:[{property:"article:modified_time",content:"2019-07-24T22:22:52.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"自定义监控套件"},{property:"og:type",content:"website"},{property:"og:url",content:"/guide/monitor/apis.html"},{name:"twitter:title",content:"自定义监控套件"},{name:"twitter:url",content:"/guide/monitor/apis.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/guide/monitor/apis.html",relativePath:"guide/monitor/apis.md",key:"v-4db1779e",path:"/guide/monitor/apis.html",lastUpdated:"2019-07-25 06:22:52"},{title:"监控套件",frontmatter:{meta:[{property:"article:modified_time",content:"2019-07-24T22:22:52.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"监控套件"},{property:"og:type",content:"website"},{property:"og:url",content:"/guide/monitor/"},{name:"twitter:title",content:"监控套件"},{name:"twitter:url",content:"/guide/monitor/"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/guide/monitor/",relativePath:"guide/monitor/README.md",key:"v-0996c938",path:"/guide/monitor/",lastUpdated:"2019-07-25 06:22:52"},{title:"日常调整",frontmatter:{meta:[{property:"article:modified_time",content:"2019-07-24T22:22:52.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"日常调整"},{property:"og:type",content:"website"},{property:"og:url",content:"/guide/namespace/adjustion.html"},{name:"twitter:title",content:"日常调整"},{name:"twitter:url",content:"/guide/namespace/adjustion.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/guide/namespace/adjustion.html",relativePath:"guide/namespace/adjustion.md",key:"v-c0fa0cf2",path:"/guide/namespace/adjustion.html",headers:[{level:2,title:"前提",slug:"前提"},{level:2,title:"批量删除容器组",slug:"批量删除容器组"},{level:2,title:"批量调整镜像版本",slug:"批量调整镜像版本"},{level:2,title:"批量调整工作负载的副本数",slug:"批量调整工作负载的副本数"}],lastUpdated:"2019-07-25 06:22:52"},{title:"配置",frontmatter:{meta:[{property:"article:modified_time",content:"2019-07-24T22:22:52.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"配置"},{property:"og:type",content:"website"},{property:"og:url",content:"/guide/namespace/configMap.html"},{name:"twitter:title",content:"配置"},{name:"twitter:url",content:"/guide/namespace/configMap.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/guide/namespace/configMap.html",relativePath:"guide/namespace/configMap.md",key:"v-6c5acde7",path:"/guide/namespace/configMap.html",lastUpdated:"2019-07-25 06:22:52"},{title:"存储卷声明",frontmatter:{meta:[{property:"article:modified_time",content:"2019-07-24T22:22:52.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"存储卷声明"},{property:"og:type",content:"website"},{property:"og:url",content:"/guide/namespace/pvc.html"},{name:"twitter:title",content:"存储卷声明"},{name:"twitter:url",content:"/guide/namespace/pvc.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/guide/namespace/pvc.html",relativePath:"guide/namespace/pvc.md",key:"v-240eddf2",path:"/guide/namespace/pvc.html",lastUpdated:"2019-07-25 06:22:52"},{title:"Secrets",frontmatter:{meta:[{property:"article:modified_time",content:"2019-07-24T22:22:52.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"Secrets"},{property:"og:type",content:"website"},{property:"og:url",content:"/guide/namespace/secrets.html"},{name:"twitter:title",content:"Secrets"},{name:"twitter:url",content:"/guide/namespace/secrets.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/guide/namespace/secrets.html",relativePath:"guide/namespace/secrets.md",key:"v-7d2f6cc7",path:"/guide/namespace/secrets.html",lastUpdated:"2019-07-25 06:22:52"},{title:"多环境",frontmatter:{meta:[{property:"article:modified_time",content:"2019-07-24T22:22:52.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"多环境"},{property:"og:type",content:"website"},{property:"og:url",content:"/guide/namespace/multi-env.html"},{name:"twitter:title",content:"多环境"},{name:"twitter:url",content:"/guide/namespace/multi-env.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/guide/namespace/multi-env.html",relativePath:"guide/namespace/multi-env.md",key:"v-9d44dcf2",path:"/guide/namespace/multi-env.html",headers:[{level:2,title:"导出配置",slug:"导出配置"},{level:3,title:"前提",slug:"前提"},{level:3,title:"操作步骤",slug:"操作步骤"},{level:2,title:"导入配置",slug:"导入配置"},{level:3,title:"前提",slug:"前提-2"},{level:3,title:"操作步骤",slug:"操作步骤-2"}],lastUpdated:"2019-07-25 06:22:52"},{title:"应用管理",frontmatter:{meta:[{property:"article:modified_time",content:"2019-07-24T22:22:52.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"应用管理"},{property:"og:type",content:"website"},{property:"og:url",content:"/guide/namespace/"},{name:"twitter:title",content:"应用管理"},{name:"twitter:url",content:"/guide/namespace/"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/guide/namespace/",relativePath:"guide/namespace/index.md",key:"v-1263fa20",path:"/guide/namespace/",headers:[{level:2,title:"创建工作负载",slug:"创建工作负载"},{level:2,title:"删除工作负载",slug:"删除工作负载"},{level:2,title:"伸缩",slug:"伸缩"},{level:2,title:"升级工作负载版本",slug:"升级工作负载版本"},{level:2,title:"环境迁移",slug:"环境迁移"},{level:3,title:"导出",slug:"导出"},{level:3,title:"导入",slug:"导入"}],lastUpdated:"2019-07-25 06:22:52"},{title:"工作负载",frontmatter:{meta:[{property:"article:modified_time",content:"2019-07-24T22:22:52.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"工作负载"},{property:"og:type",content:"website"},{property:"og:url",content:"/guide/namespace/workload.html"},{name:"twitter:title",content:"工作负载"},{name:"twitter:url",content:"/guide/namespace/workload.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/guide/namespace/workload.html",relativePath:"guide/namespace/workload.md",key:"v-5db85fb7",path:"/guide/namespace/workload.html",headers:[{level:2,title:"创建/查看/编辑工作负载",slug:"创建-查看-编辑工作负载"},{level:2,title:"伸缩",slug:"伸缩"},{level:2,title:"删除容器组",slug:"删除容器组"},{level:2,title:"诊断问题",slug:"诊断问题"},{level:3,title:"事件: Kubernetes 部署相关问题",slug:"事件:-kubernetes-部署相关问题"},{level:3,title:"日志: 容器运行时产生的错误",slug:"日志:-容器运行时产生的错误"},{level:3,title:"终端: 通过交互式命令,在容器内诊断问题",slug:"终端:-通过交互式命令,在容器内诊断问题"}],lastUpdated:"2019-07-25 06:22:52"},{title:"概述",frontmatter:{meta:[{property:"article:modified_time",content:"2019-07-24T22:22:52.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"概述"},{property:"og:type",content:"website"},{property:"og:url",content:"/install/"},{name:"twitter:title",content:"概述"},{name:"twitter:url",content:"/install/"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/install/",relativePath:"install/README.md",key:"v-5be22288",path:"/install/",lastUpdated:"2019-07-25 06:22:52"},{title:"安装 Ingress Controller",frontmatter:{meta:[{property:"article:modified_time",content:"2019-07-24T22:22:52.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"安装 Ingress Controller"},{property:"og:type",content:"website"},{property:"og:url",content:"/install/install-common-ingress.html"},{name:"twitter:title",content:"安装 Ingress Controller"},{name:"twitter:url",content:"/install/install-common-ingress.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/install/install-common-ingress.html",relativePath:"install/install-common-ingress.md",key:"v-61ad5b01",path:"/install/install-common-ingress.html",headers:[{level:2,title:"安装 Ingress Controller",slug:"安装-ingress-controller"},{level:3,title:"在 apple-master-a-1 上执行",slug:"在-apple-master-a-1-上执行"},{level:3,title:"在IaaS云控制台完成如下配置(公网ELB)",slug:"在iaas云控制台完成如下配置(公网elb)"},{level:3,title:"配置域名解析",slug:"配置域名解析"},{level:3,title:"验证配置",slug:"验证配置"}],lastUpdated:"2019-07-25 06:22:52"},{title:"制作标准机镜像",frontmatter:{meta:[{property:"article:modified_time",content:"2019-07-24T22:22:52.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"制作标准机镜像"},{property:"og:type",content:"website"},{property:"og:url",content:"/install/install-common-vm.html"},{name:"twitter:title",content:"制作标准机镜像"},{name:"twitter:url",content:"/install/install-common-vm.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/install/install-common-vm.html",relativePath:"install/install-common-vm.md",key:"v-4b91c5e7",path:"/install/install-common-vm.html",headers:[{level:2,title:"制作标准机镜像",slug:"制作标准机镜像"},{level:3,title:"安装docker",slug:"安装docker"},{level:3,title:"安装 nfs-utils",slug:"安装-nfs-utils"},{level:3,title:"K8S基本配置",slug:"k8s基本配置"}],lastUpdated:"2019-07-25 06:22:52"},{title:"在单机使用 kind 安装 Kubernetes",frontmatter:{meta:[{property:"article:modified_time",content:"2019-07-24T22:22:52.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"在单机使用 kind 安装 Kubernetes"},{property:"og:type",content:"website"},{property:"og:url",content:"/install/install-kind.html"},{name:"twitter:title",content:"在单机使用 kind 安装 Kubernetes"},{name:"twitter:url",content:"/install/install-kind.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/install/install-kind.html",relativePath:"install/install-kind.md",key:"v-cfc76602",path:"/install/install-kind.html",headers:[{level:2,title:"环境简介",slug:"环境简介"},{level:3,title:"kind 简介与安装",slug:"kind-简介与安装"},{level:3,title:"docker 环境",slug:"docker-环境"},{level:3,title:"kubectl 安装",slug:"kubectl-安装"},{level:2,title:"k8s 集群搭建",slug:"k8s-集群搭建"},{level:3,title:"准备 kind 搭建集群配置文件 kind-config.yaml",slug:"准备-kind-搭建集群配置文件-kind-config-yaml"},{level:3,title:"使用 kind 搭建集群",slug:"使用-kind-搭建集群"},{level:3,title:"创建成功",slug:"创建成功"},{level:2,title:"kuboard 安装",slug:"kuboard-安装"},{level:3,title:"获取并修改 yaml 文件",slug:"获取并修改-yaml-文件"},{level:3,title:"执行安装",slug:"执行安装"},{level:3,title:"查看启动状态",slug:"查看启动状态"},{level:3,title:"访问 kuboard 页面",slug:"访问-kuboard-页面"}],lastUpdated:"2019-07-25 06:22:52"},{title:"安装 Kuboard",frontmatter:{meta:[{property:"article:modified_time",content:"2019-07-26T01:56:14.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"安装 Kuboard"},{property:"og:type",content:"website"},{property:"og:url",content:"/install/install-dashboard.html"},{name:"twitter:title",content:"安装 Kuboard"},{name:"twitter:url",content:"/install/install-dashboard.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/install/install-dashboard.html",relativePath:"install/install-dashboard.md",key:"v-c621d7f2",path:"/install/install-dashboard.html",headers:[{level:2,title:"前提",slug:"前提"},{level:2,title:"兼容性",slug:"兼容性"},{level:2,title:"安装",slug:"安装"},{level:2,title:"获取 token",slug:"获取-token"},{level:2,title:"访问 Kuboard",slug:"访问-kuboard"}],lastUpdated:"2019-07-26 09:56:14"},{title:"Kuboard",frontmatter:{meta:[{property:"article:modified_time",content:"2019-07-24T22:22:52.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"Kuboard"},{property:"og:type",content:"website"},{property:"og:url",content:"/overview/"},{name:"twitter:title",content:"Kuboard"},{name:"twitter:url",content:"/overview/"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/overview/",relativePath:"overview/README.md",key:"v-7249b1a4",path:"/overview/",headers:[{level:2,title:"Kuboard",slug:"kuboard"},{level:2,title:"Demo",slug:"demo"},{level:2,title:"Getting Started",slug:"getting-started"},{level:2,title:"在线提问",slug:"在线提问"}],lastUpdated:"2019-07-25 06:22:52"},{title:"为什么选择 Kuboard",frontmatter:{meta:[{property:"article:modified_time",content:"2019-07-24T22:22:52.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"为什么选择 Kuboard"},{property:"og:type",content:"website"},{property:"og:url",content:"/overview/why-kuboard.html"},{name:"twitter:title",content:"为什么选择 Kuboard"},{name:"twitter:url",content:"/overview/why-kuboard.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/overview/why-kuboard.html",relativePath:"overview/why-kuboard.md",key:"v-5566a571",path:"/overview/why-kuboard.html",headers:[{level:2,title:"为什么选择 Kuboard",slug:"为什么选择-kuboard"},{level:2,title:"Kubernetes 入门学习者",slug:"kubernetes-入门学习者"},{level:3,title:"集群概览",slug:"集群概览"},{level:3,title:"名称空间",slug:"名称空间"},{level:3,title:"无需手写 Yaml",slug:"无需手写-yaml"},{level:2,title:"Kubernetes 日常运维人员",slug:"kubernetes-日常运维人员"},{level:3,title:"纯图形界面运维 Kubernetes",slug:"纯图形界面运维-kubernetes"},{level:3,title:"多环境复制",slug:"多环境复制"},{level:3,title:"应用升级",slug:"应用升级"},{level:2,title:"0 侵入性",slug:"_0-侵入性"},{level:2,title:"更多资料",slug:"更多资料"}],lastUpdated:"2019-07-25 06:22:52"},{title:"提交问题",frontmatter:{meta:[{property:"article:modified_time",content:"2019-07-24T22:22:52.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"提交问题"},{property:"og:type",content:"website"},{property:"og:url",content:"/support/"},{name:"twitter:title",content:"提交问题"},{name:"twitter:url",content:"/support/"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/support/",relativePath:"support/README.md",key:"v-76626758",path:"/support/",headers:[{level:2,title:"提交问题",slug:"提交问题"},{level:2,title:"在线提问",slug:"在线提问"}],lastUpdated:"2019-07-25 06:22:52"},{title:"导入 example 微服务",frontmatter:{meta:[{property:"article:modified_time",content:"2019-07-25T14:26:28.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"导入 example 微服务"},{property:"og:type",content:"website"},{property:"og:url",content:"/guide/example/import.html"},{name:"twitter:title",content:"导入 example 微服务"},{name:"twitter:url",content:"/guide/example/import.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/guide/example/import.html",relativePath:"guide/example/import.md",key:"v-554543f9",path:"/guide/example/import.html",headers:[{level:2,title:"前提",slug:"前提"},{level:2,title:"创建存储资源",slug:"创建存储资源"},{level:2,title:"创建名称空间",slug:"创建名称空间"},{level:2,title:"导入 example",slug:"导入-example"},{level:2,title:"验证 web-example",slug:"验证-web-example"}],lastUpdated:"2019-07-25 22:26:28"},{title:"安装 Kubernetes 高可用",frontmatter:{meta:[{property:"article:modified_time",content:"2019-07-24T22:22:52.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"安装 Kubernetes 高可用"},{property:"og:type",content:"website"},{property:"og:url",content:"/install/install-kubernetes.html"},{name:"twitter:title",content:"安装 Kubernetes 高可用"},{name:"twitter:url",content:"/install/install-kubernetes.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/install/install-kubernetes.html",relativePath:"install/install-kubernetes.md",key:"v-3732859b",path:"/install/install-kubernetes.html",headers:[{level:2,title:"制作标准机镜像",slug:"制作标准机镜像"},{level:3,title:"安装docker",slug:"安装docker"},{level:3,title:"安装 nfs-utils",slug:"安装-nfs-utils"},{level:3,title:"K8S基本配置",slug:"k8s基本配置"},{level:2,title:"初始化API Server",slug:"初始化api-server"},{level:3,title:"创建 ApiServer 的 ELB(私网)",slug:"创建-apiserver-的-elb(私网)"},{level:3,title:"初始化第一个master节点",slug:"初始化第一个master节点"},{level:3,title:"初始化第二、三个master节点",slug:"初始化第二、三个master节点"},{level:3,title:"检查 apiserver初始化结果",slug:"检查-apiserver初始化结果"},{level:2,title:"初始化 worker节点",slug:"初始化-worker节点"},{level:3,title:"获得 join命令参数",slug:"获得-join命令参数"},{level:3,title:"初始化worker",slug:"初始化worker"},{level:3,title:"检查 apiserver初始化结果",slug:"检查-apiserver初始化结果-2"},{level:2,title:"移除 worker 节点",slug:"移除-worker-节点"},{level:2,title:"安装 Ingress Controller",slug:"安装-ingress-controller"},{level:3,title:"在 apple-master-a-1 上执行",slug:"在-apple-master-a-1-上执行"},{level:3,title:"在IaaS云控制台完成如下配置(公网ELB)",slug:"在iaas云控制台完成如下配置(公网elb)"},{level:3,title:"配置域名解析",slug:"配置域名解析"},{level:3,title:"验证配置",slug:"验证配置"}],lastUpdated:"2019-07-25 06:22:52"},{title:"安装 Kubernetes 单Master节点",frontmatter:{meta:[{property:"article:modified_time",content:"2019-07-24T22:22:52.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"安装 Kubernetes 单Master节点"},{property:"og:type",content:"website"},{property:"og:url",content:"/install/install-k8s.html"},{name:"twitter:title",content:"安装 Kubernetes 单Master节点"},{name:"twitter:url",content:"/install/install-k8s.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/install/install-k8s.html",relativePath:"install/install-k8s.md",key:"v-292f2847",path:"/install/install-k8s.html",headers:[{level:2,title:"制作标准机镜像",slug:"制作标准机镜像"},{level:3,title:"安装docker",slug:"安装docker"},{level:3,title:"安装 nfs-utils",slug:"安装-nfs-utils"},{level:3,title:"K8S基本配置",slug:"k8s基本配置"},{level:2,title:"初始化 master 节点",slug:"初始化-master-节点"},{level:3,title:"在 demo-master-a-1 机器上执行",slug:"在-demo-master-a-1-机器上执行"},{level:3,title:"检查 apiserver初始化结果",slug:"检查-apiserver初始化结果"},{level:2,title:"初始化 worker节点",slug:"初始化-worker节点"},{level:3,title:"获得 join命令参数",slug:"获得-join命令参数"},{level:3,title:"初始化worker",slug:"初始化worker"},{level:3,title:"检查 apiserver初始化结果",slug:"检查-apiserver初始化结果-2"},{level:2,title:"移除 worker 节点",slug:"移除-worker-节点"},{level:2,title:"安装 Ingress Controller",slug:"安装-ingress-controller"},{level:3,title:"在 demo-master-a-1 上执行",slug:"在-demo-master-a-1-上执行"},{level:3,title:"配置域名解析",slug:"配置域名解析"},{level:3,title:"验证配置",slug:"验证配置"},{level:2,title:"下一步",slug:"下一步"}],lastUpdated:"2019-07-25 06:22:52"},{title:"如何降低K8S学习门槛 🎉",frontmatter:{meta:[{property:"article:modified_time",content:"2019-07-25T06:09:59.000Z"},{property:"og:site_name",content:"Kuboard"},{property:"og:title",content:"如何降低K8S学习门槛 🎉"},{property:"og:type",content:"website"},{property:"og:url",content:"/overview/concepts.html"},{name:"twitter:title",content:"如何降低K8S学习门槛 🎉"},{name:"twitter:url",content:"/overview/concepts.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/overview/concepts.html",relativePath:"overview/concepts.md",key:"v-0393ebb2",path:"/overview/concepts.html",headers:[{level:2,title:"Kubernetes 学习门槛在哪儿",slug:"kubernetes-学习门槛在哪儿"},{level:2,title:"降低 Kubernetes 学习门槛",slug:"降低-kubernetes-学习门槛"},{level:2,title:"工作负载编辑器设计",slug:"工作负载编辑器设计"},{level:2,title:"工作负载编辑器介绍",slug:"工作负载编辑器介绍"},{level:3,title:"1. 基本信息",slug:"_1-基本信息"},{level:3,title:"2. 数据卷",slug:"_2-数据卷"},{level:3,title:"3. 身份信息",slug:"_3-身份信息"},{level:3,title:"4. 容器",slug:"_4-容器"},{level:3,title:"5. 访问方式",slug:"_5-访问方式"},{level:3,title:"6. 互联网入口",slug:"_6-互联网入口"}],lastUpdated:"2019-07-25 14:09:59"}],themeConfig:{nav:[{text:"简介",link:"/overview/"},{text:"安装",link:"/install/"},{text:"使用",link:"/guide/"},{text:"支持",link:"/support/"}],displayAllHeaders:!1,sidebarDepth:2,serviceWorker:{updatePopup:!0},lastUpdated:"更新时间",sidebar:{"/overview/":[{title:"简介",collapsable:!1,children:[""]},{title:"Why Kuboard",collapsable:!1,children:["why-kuboard","concepts"]}],"/install/":[{title:"概述",collapsable:!1,children:[""]},{title:"安装 Kubernetes",collapsable:!1,children:["install-k8s","install-kubernetes"]},{title:"安装 Kuboard",collapsable:!1,children:["install-dashboard"]}],"/guide/":[{title:"概述",collapsable:!1,children:[["","概述"]]},{title:"Example",collapsable:!1,children:["example/busybox","example/import","example/monitor"]},{title:"集群管理",collapsable:!1,children:["cluster/computing","cluster/storage","cluster/namespace"]},{title:"应用管理",collapsable:!1,children:["namespace/workload","namespace/secrets","namespace/configMap","namespace/pvc","namespace/adjustion","namespace/multi-env"]},{title:"问题诊断",collapsable:!1,children:["diagonize/events","diagonize/logs","diagonize/port-forward"]},{title:"监控套件 (alpha)",collapsable:!1,children:["monitor/","monitor/apis"]}],"/support/":[""]}}};n(75);Uo.component("HomePage",()=>Promise.all([n.e(0),n.e(4)]).then(n.bind(null,350))),Uo.component("Badge",()=>Promise.all([n.e(0),n.e(25)]).then(n.bind(null,362)));n(76),n(77);var Ga=n(53),Qa=n.n(Ga),ts={props:{threshold:{type:Number,default:300}},data:function(){return{scrollTop:null}},mounted:function(){var t=this;this.scrollTop=this.getScrollTop(),window.addEventListener("scroll",Qa()(function(){t.scrollTop=t.getScrollTop()},100))},methods:{getScrollTop:function(){return window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0},scrollToTop:function(){window.scrollTo({top:0,behavior:"smooth"}),this.scrollTop=0}},computed:{show:function(){return this.scrollTop>this.threshold}}},es=(n(85),Object(qa.a)(ts,function(){var t=this.$createElement,e=this._self._c||t;return e("transition",{attrs:{name:"fade"}},[this.show?e("svg",{staticClass:"go-to-top",attrs:{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 49.484 28.284"},on:{click:this.scrollToTop}},[e("g",{attrs:{transform:"translate(-229 -126.358)"}},[e("rect",{attrs:{fill:"currentColor",width:"35",height:"5",rx:"2",transform:"translate(229 151.107) rotate(-45)"}}),this._v(" "),e("rect",{attrs:{fill:"currentColor",width:"35",height:"5",rx:"2",transform:"translate(274.949 154.642) rotate(-135)"}})])]):this._e()])},[],!1,null,"67a9666a",null).exports),ns=(n(40),{data:function(){return{readingTop:0,readingHeight:1,progressStyle:null,transform:["transform"]}},watch:{$readingShow:function(){this.base()}},mounted:function(){this.base()},beforeDestroy:function(){var t=this;window.removeEventListener("scroll",function(){t.getReadingBase()})},methods:{base:function(){var t=this;this.$readingShow&&(this.transform=this.getTransform(),this.progressStyle=this.getProgressStyle(),window.addEventListener("scroll",function(){t.getReadingBase()},200))},getReadingBase:function(){this.readingHeight=this.getReadingHeight()-this.getScreenHeight(),this.readingTop=this.getReadingTop(),this.progressStyle=this.getProgressStyle()},getReadingHeight:function(){return document.body.offsetHeight||document.body.scrollHeight||0},getScreenHeight:function(){return window.innerHeight||document.documentElement.clientHeight||0},getReadingTop:function(){return window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0},getTransform:function(){var t=this;return["transform","-webkit-transform","-moz-transform","-o-transform","-ms-transform"].filter(function(e){return t.supportCss(e)})},getProgressStyle:function(){var t=this.readingTop/this.readingHeight;switch(this.$readingShow){case"top":case"bottom":return this.transform[0]?"".concat(this.transform[0],": translate(").concat(100*t/2-50,"%, 0) scale(").concat(t,", 1)"):"width: ".concat(100*t,"%");case"left":case"right":return this.transform[0]?"".concat(this.transform[0],": translate(0, ").concat(100*t/2-50,"%) scale(1, ").concat(t,")"):"height: ".concat(100*t,"%")}},supportCss:function(t){return t in document.createElement("div").style}}}),rs=(n(88),Object(qa.a)(ns,function(){var t=this.$createElement,e=this._self._c||t;return this.$readingShow?e("div",{staticClass:"reading-progress",class:this.$readingShow},[e("div",{staticClass:"progress",style:this.progressStyle})]):this._e()},[],!1,null,"7681808f",null).exports),os={readingDir:null,fixed:"top"};const is=(t,e,n)=>!!t.includes(e)&&n;n(89);var as=n(54),ss=n.n(as);function ls(t,e,n){return e in t?ss()(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}var cs=n(55),us=n.n(cs);n(41),n(64),n(30),n(38),n(39);Object.prototype.hasOwnProperty;var ps={name:"TabBar",props:{tabs:Array},inject:["rootTabs"],computed:{barStyle:{get:function(){var t=this,e={},n=0,r=0,o=-1!==["top","bottom"].indexOf(this.rootTabs.tabPosition)?"width":"height",i="width"===o?"x":"y",a=function(t){return t.toLowerCase().replace(/( |^)[a-z]/g,function(t){return t.toUpperCase()})};this.tabs.every(function(e,i){var s=((t,e)=>{const n=((t,e)=>{for(let n=0;n!==t.length;++n)if(e(t[n]))return n;return-1})(t,e);return-1!==n?t[n]:void 0})(t.$parent.$refs.tabs||[],function(t){return t.id.replace("tab-","")===e.paneName});return!!s&&(e.active?(r=s["client".concat(a(o))],"width"===o&&t.tabs.length>1&&(r-=0===i||i===t.tabs.length-1?20:40),!1):(n+=s["client".concat(a(o))],!0))}),"width"===o&&0!==n&&(n+=20);var s="translate".concat(a(i),"(").concat(n,"px)");return e[o]=r+"px",e.transform=s,e.msTransform=s,e.webkitTransform=s,e}}}},fs=Object(qa.a)(ps,function(){var t=this.$createElement;return(this._self._c||t)("div",{staticClass:"el-tabs__active-bar",class:"is-"+this.rootTabs.tabPosition,style:this.barStyle})},[],!1,null,null,null).exports,ds=function(){if("undefined"!=typeof Map)return Map;function t(t,e){var n=-1;return t.some(function(t,r){return t[0]===e&&(n=r,!0)}),n}return function(){function e(){this.__entries__=[]}return Object.defineProperty(e.prototype,"size",{get:function(){return this.__entries__.length},enumerable:!0,configurable:!0}),e.prototype.get=function(e){var n=t(this.__entries__,e),r=this.__entries__[n];return r&&r[1]},e.prototype.set=function(e,n){var r=t(this.__entries__,e);~r?this.__entries__[r][1]=n:this.__entries__.push([e,n])},e.prototype.delete=function(e){var n=this.__entries__,r=t(n,e);~r&&n.splice(r,1)},e.prototype.has=function(e){return!!~t(this.__entries__,e)},e.prototype.clear=function(){this.__entries__.splice(0)},e.prototype.forEach=function(t,e){void 0===e&&(e=null);for(var n=0,r=this.__entries__;n0},t.prototype.connect_=function(){hs&&!this.connected_&&(document.addEventListener("transitionend",this.onTransitionEnd_),window.addEventListener("resize",this.refresh),_s?(this.mutationsObserver_=new MutationObserver(this.refresh),this.mutationsObserver_.observe(document,{attributes:!0,childList:!0,characterData:!0,subtree:!0})):(document.addEventListener("DOMSubtreeModified",this.refresh),this.mutationEventsAdded_=!0),this.connected_=!0)},t.prototype.disconnect_=function(){hs&&this.connected_&&(document.removeEventListener("transitionend",this.onTransitionEnd_),window.removeEventListener("resize",this.refresh),this.mutationsObserver_&&this.mutationsObserver_.disconnect(),this.mutationEventsAdded_&&document.removeEventListener("DOMSubtreeModified",this.refresh),this.mutationsObserver_=null,this.mutationEventsAdded_=!1,this.connected_=!1)},t.prototype.onTransitionEnd_=function(t){var e=t.propertyName,n=void 0===e?"":e;bs.some(function(t){return!!~n.indexOf(t)})&&this.refresh()},t.getInstance=function(){return this.instance_||(this.instance_=new t),this.instance_},t.instance_=null,t}(),xs=function(t,e){for(var n=0,r=Object.keys(e);n0},t}(),Is="undefined"!=typeof WeakMap?new WeakMap:new ds,Ms=function t(e){if(!(this instanceof t))throw new TypeError("Cannot call a class as a function.");if(!arguments.length)throw new TypeError("1 argument required, but only 0 present.");var n=ws.getInstance(),r=new Ls(e,n,this);Is.set(this,r)};["observe","unobserve","disconnect"].forEach(function(t){Ms.prototype[t]=function(){var e;return(e=Is.get(this))[t].apply(e,arguments)}});var Rs=void 0!==vs.ResizeObserver?vs.ResizeObserver:Ms;const Ns="undefined"==typeof window,Fs=function(t){for(let e of t){const t=e.target.__resizeListeners__||[];t.length&&t.forEach(t=>{t()})}};function Us(){}var Ds=function(t){return t.toLowerCase().replace(/( |^)[a-z]/g,function(t){return t.toUpperCase()})},Ks={name:"TabNav",components:{TabBar:fs},inject:["rootTabs"],props:{panes:Array,currentName:String,editable:Boolean,onTabClick:{type:Function,default:Us},onTabRemove:{type:Function,default:Us},type:String,stretch:Boolean},data:function(){return{scrollable:!1,navOffset:0,isFocus:!1,focusable:!0}},computed:{navStyle:function(){var t=-1!==["top","bottom"].indexOf(this.rootTabs.tabPosition)?"X":"Y";return{transform:"translate".concat(t,"(-").concat(this.navOffset,"px)")}},sizeName:function(){return-1!==["top","bottom"].indexOf(this.rootTabs.tabPosition)?"width":"height"}},methods:{scrollPrev:function(){var t=this.$refs.navScroll["offset".concat(Ds(this.sizeName))],e=this.navOffset;if(e){var n=e>t?e-t:0;this.navOffset=n}},scrollNext:function(){var t=this.$refs.nav["offset".concat(Ds(this.sizeName))],e=this.$refs.navScroll["offset".concat(Ds(this.sizeName))],n=this.navOffset;if(!(t-n<=e)){var r=t-n>2*e?n+e:t-e;this.navOffset=r}},scrollToActiveTab:function(){if(this.scrollable){var t=this.$refs.nav,e=this.$el.querySelector(".is-active");if(e){var n=this.$refs.navScroll,r=e.getBoundingClientRect(),o=n.getBoundingClientRect(),i=t.offsetWidth-o.width,a=this.navOffset,s=a;r.lefto.right&&(s=a+r.right-o.right),s=Math.max(s,0),this.navOffset=Math.min(s,i)}}},update:function(){if(this.$refs.nav){var t=this.sizeName,e=this.$refs.nav["offset".concat(Ds(t))],n=this.$refs.navScroll["offset".concat(Ds(t))],r=this.navOffset;if(n0&&(this.navOffset=0)}},changeTab:function(t){var e,n,r,o=t.keyCode;-1!==[37,38,39,40].indexOf(o)&&(r=t.currentTarget.querySelectorAll("[role=tab]"),n=Array.prototype.indexOf.call(r,t.target),r[e=37===o||38===o?0===n?r.length-1:n-1:n"])]:null,m=this._l(r,function(n,r){var i,l=n.name||n.index||r,c=n.isClosable||o;n.index="".concat(r);var u=c?t("span",{class:"el-icon-close",on:{click:function(t){s(n,t)}}}):null,p=n.$slots.label||n.label,f=n.active?0:-1;return t("div",{class:(i={"el-tabs__item":!0},ls(i,"is-".concat(e.rootTabs.tabPosition),!0),ls(i,"is-active",n.active),ls(i,"is-disabled",n.disabled),ls(i,"is-closable",c),ls(i,"is-focus",e.isFocus),i),attrs:{id:"tab-".concat(l),"aria-controls":"pane-".concat(l),role:"tab","aria-selected":n.active,tabindex:f},key:"tab-".concat(l),ref:"tabs",refInFor:!0,on:{focus:function(){d()},blur:function(){h()},click:function(t){h(),a(n,l,t)},keydown:function(t){!c||46!==t.keyCode&&8!==t.keyCode||s(n,t)}}},[p,u])});return t("div",{class:["el-tabs__nav-wrap",c?"is-scrollable":"","is-".concat(this.rootTabs.tabPosition)]},[v,t("div",{class:["el-tabs__nav-scroll"],ref:"navScroll"},[t("div",{class:["el-tabs__nav","is-".concat(this.rootTabs.tabPosition),i&&-1!==["top","bottom"].indexOf(this.rootTabs.tabPosition)?"is-stretch":""],ref:"nav",style:l,attrs:{role:"tablist"},on:{keydown:f}},[n?null:t("tab-bar",{attrs:{tabs:r}}),m])])])},mounted:function(){var t,e,n=this;t=this.$el,e=this.update,Ns||(t.__resizeListeners__||(t.__resizeListeners__=[],t.__ro__=new Rs(Fs),t.__ro__.observe(t)),t.__resizeListeners__.push(e)),document.addEventListener("visibilitychange",this.visibilityChangeHandler),window.addEventListener("blur",this.windowBlurHandler),window.addEventListener("focus",this.windowFocusHandler),setTimeout(function(){n.scrollToActiveTab()},0)},beforeDestroy:function(){var t,e;this.$el&&this.update&&(t=this.$el,e=this.update,t&&t.__resizeListeners__&&(t.__resizeListeners__.splice(t.__resizeListeners__.indexOf(e),1),t.__resizeListeners__.length||t.__ro__.disconnect())),document.removeEventListener("visibilitychange",this.visibilityChangeHandler),window.removeEventListener("blur",this.windowBlurHandler),window.removeEventListener("focus",this.windowFocusHandler)}},zs={name:"ElTabs",components:{TabNav:Object(qa.a)(Ks,void 0,void 0,!1,null,null,null).exports},props:{type:String,activeName:String,closable:Boolean,addable:Boolean,value:{},editable:Boolean,tabPosition:{type:String,default:"top"},beforeLeave:Function,stretch:Boolean},provide:function(){return{rootTabs:this}},data:function(){return{currentName:this.value||this.activeName,panes:[]}},watch:{activeName:function(t){this.setCurrentName(t)},value:function(t){this.setCurrentName(t)},currentName:function(t){var e=this;this.$refs.nav&&this.$nextTick(function(){e.$refs.nav.$nextTick(function(t){e.$refs.nav.scrollToActiveTab()})})}},methods:{calcPaneInstances:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(this.$slots.default){var n=this.$slots.default.filter(function(t){return t.tag&&t.componentOptions&&"ElTabPane"===t.componentOptions.Ctor.options.name}),r=n.map(function(t){return t.componentInstance}),o=!(r.length===this.panes.length&&r.every(function(e,n){return e===t.panes[n]}));(e||o)&&(this.panes=r)}else 0!==this.panes.length&&(this.panes=[])},handleTabClick:function(t,e,n){t.disabled||(this.setCurrentName(e),this.$emit("tab-click",t,n))},handleTabRemove:function(t,e){t.disabled||(e.stopPropagation(),this.$emit("edit",t.name,"remove"),this.$emit("tab-remove",t.name))},handleTabAdd:function(){this.$emit("edit",null,"add"),this.$emit("tab-add")},setCurrentName:function(t){var e=this,n=function(){e.currentName=t,e.$emit("input",t)};if(this.currentName!==t&&this.beforeLeave){var r=this.beforeLeave(t,this.currentName);r&&r.then?r.then(function(){n(),e.$refs.nav&&e.$refs.nav.removeFocus()},function(){}):!1!==r&&n()}else n()}},render:function(t){var e,n=this.type,r=this.handleTabClick,o=this.handleTabRemove,i=this.handleTabAdd,a=this.currentName,s=this.panes,l=this.editable,c=this.addable,u=this.tabPosition,p=this.stretch,f=l||c?t("span",{class:"el-tabs__new-tab",on:{click:i,keydown:function(t){13===t.keyCode&&i()}},attrs:{tabindex:"0"}},[t("i",{class:"el-icon-plus"})]):null,d={props:{currentName:a,onTabClick:r,onTabRemove:o,editable:l,type:n,panes:s,stretch:p},ref:"nav"},h=t("div",{class:["el-tabs__header","is-".concat(u)]},[f,t("tab-nav",us()([{},d]))]),v=t("div",{class:"el-tabs__content"},[this.$slots.default]);return t("div",{class:(e={"el-tabs":!0,"el-tabs--card":"card"===n},ls(e,"el-tabs--".concat(u),!0),ls(e,"el-tabs--border-card","border-card"===n),e)},["bottom"!==u?[h,v]:[v,h]])},created:function(){this.currentName||this.setCurrentName("0"),this.$on("tab-nav-update",this.calcPaneInstances.bind(null,!0))},mounted:function(){this.calcPaneInstances()},updated:function(){this.calcPaneInstances()}},Bs=Object(qa.a)(zs,void 0,void 0,!1,null,null,null).exports,Vs={name:"ElTabPane",componentName:"ElTabPane",props:{label:String,labelContent:Function,name:String,closable:Boolean,disabled:Boolean,lazy:Boolean},data:function(){return{index:null,loaded:!1}},computed:{isClosable:function(){return this.closable||this.$parent.closable},active:function(){var t=this.$parent.currentName===(this.name||this.index);return t&&(this.loaded=!0),t},paneName:function(){return this.name||this.index}},updated:function(){this.$parent.$emit("tab-nav-update")}},Hs=Object(qa.a)(Vs,function(){var t=this,e=t.$createElement,n=t._self._c||e;return!t.lazy||t.loaded||t.active?n("div",{directives:[{name:"show",rawName:"v-show",value:t.active,expression:"active"}],staticClass:"el-tab-pane",attrs:{role:"tabpanel","aria-hidden":!t.active,id:"pane-"+t.paneName,"aria-labelledby":"tab-"+t.paneName}},[t._t("default")],2):t._e()},[],!1,null,null,null).exports,Zs=(n(100),[{},({Vue:t})=>{t.mixin({computed:{$dataBlock(){return this.$options.__data__block__}}})},{},{},({router:t})=>{"undefined"!=typeof window&&(function(t,e,n,r,o,i,a){t.GoogleAnalyticsObject=o,t.ga=t.ga||function(){(t.ga.q=t.ga.q||[]).push(arguments)},t.ga.l=1*new Date,i=e.createElement(n),a=e.getElementsByTagName(n)[0],i.async=1,i.src="https://www.google-analytics.com/analytics.js",a.parentNode.insertBefore(i,a)}(window,document,"script",0,"ga"),ga("create","UA-144196556-1","auto"),ga("set","anonymizeIp",!0),ga("send","pageview"),t.afterEach(function(t){ga("set","page",t.fullPath),ga("send","pageview")}))},({Vue:t})=>{t.component("BackToTop",es)},({Vue:t})=>{t.component("ReadingProgress",rs),t.mixin({computed:{$readingShow(){const{readingDir:t,fixed:e}=os,n=this.$page.regularPath;if(void 0!==this.$frontmatter.readingShow){const t=this.$frontmatter.readingShow;return"boolean"==typeof t&&t?"top":t}if(n){if(null===t)return e;if("string"==typeof t)return is(n,t,e);if(Array.isArray(t)){for(let r=0;rt.path.toLowerCase()===e.toLowerCase()).length>0}var Gs={props:{pageKey:String,slotKey:{type:String,default:"default"}},render(t){const e=this.pageKey||this.$parent.$page.key;return Ua("pageKey",e),Uo.component(e)||Uo.component(e,Ia(e)),t(e||"")}},Qs={functional:!0,props:{slotKey:String,required:!0},render:(t,{props:e,slots:n})=>t("div",{class:[`content__${e.slotKey}`]},n()[e.slotKey])},tl=(n(101),Object(qa.a)({},function(t,e){var n=e._c;return n("svg",{staticClass:"icon outbound",attrs:{xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",x:"0px",y:"0px",viewBox:"0 0 100 100",width:"15",height:"15"}},[n("path",{attrs:{fill:"currentColor",d:"M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"}}),e._v(" "),n("polygon",{attrs:{fill:"currentColor",points:"45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"}})])},[],!0,null,null,null).exports),el={functional:!0,render(t,{parent:e,children:n}){if(e._isMounted)return n;e.$once("hook:mounted",()=>{e.$forceUpdate()})}};Uo.config.productionTip=!1,Uo.use(ba),Uo.use(Xs),Uo.mixin(function(t,e,n=Uo){!function(t){t.locales&&Object.keys(t.locales).forEach(e=>{t.locales[e].path=e}),Object.freeze(t)}(e),n.$vuepress.$set("siteData",e);const r=new(t(n.$vuepress.$get("siteData"))),o=Object.getOwnPropertyDescriptors(Object.getPrototypeOf(r)),i={};return Object.keys(o).reduce((t,e)=>(e.startsWith("$")&&(t[e]=o[e].get),t),i),{computed:i}}(t=>(class{setPage(t){this.__page=t}get $site(){return t}get $themeConfig(){return this.$site.themeConfig}get $frontmatter(){return this.$page.frontmatter}get $localeConfig(){const{locales:t={}}=this.$site;let e,n;for(const r in t)"/"===r?n=t[r]:0===this.$page.path.indexOf(r)&&(e=t[r]);return e||n||{}}get $siteTitle(){return this.$localeConfig.title||this.$site.title||""}get $title(){const t=this.$page,{metaTitle:e}=this.$page.frontmatter;if("string"==typeof e)return e;const n=this.$siteTitle,r=t.frontmatter.home?null:t.frontmatter.title||t.title;return n?r?r+" | "+n:n:r||"VuePress"}get $description(){const t=function(t){if(t){const e=t.filter(t=>"description"===t.name)[0];if(e)return e.content}}(this.$page.frontmatter.meta);return t||this.$page.frontmatter.description||this.$localeConfig.description||this.$site.description||""}get $lang(){return this.$page.frontmatter.lang||this.$localeConfig.lang||"en-US"}get $localePath(){return this.$localeConfig.path||"/"}get $themeLocaleConfig(){return(this.$site.themeConfig.locales||{})[this.$localePath]||{}}get $page(){return this.__page?this.__page:function(t,e){for(let n=0;nn||(t.hash?!Uo.$vuepress.$get("disableScrollBehavior")&&{selector:t.hash}:{x:0,y:0})});!function(t){t.beforeEach((e,n,r)=>{if(Js(t,e.path))r();else if(/(\/|\.html)$/.test(e.path))if(/\/$/.test(e.path)){const n=e.path.replace(/\/$/,"")+".html";Js(t,n)?r(n):r()}else r();else{const n=e.path+"/",o=e.path+".html";Js(t,o)?r(o):Js(t,n)?r(n):r()}})}(n);const r={};try{Zs.forEach(e=>{"function"==typeof e&&e({Vue:Uo,options:r,router:n,siteData:Ja,isServer:t})})}catch(t){console.error(t)}return{app:new Uo(Object.assign(r,{router:n,render:t=>t("div",{attrs:{id:"app"}},[t("router-view",{ref:"layout"}),t("div",{class:"global-ui"},Ws.map(e=>t(e)))])})),router:n}}(!1);window.__VUEPRESS__={version:"1.0.2",hash:"be2733e"},rl.onReady(()=>{nl.$mount("#app")})}]); \ No newline at end of file diff --git a/docs/guide/cluster/computing.html b/docs/guide/cluster/computing.html index 486e57b..b0bcad2 100644 --- a/docs/guide/cluster/computing.html +++ b/docs/guide/cluster/computing.html @@ -7,7 +7,7 @@ - + @@ -21,6 +21,6 @@

Copyright © 2019-present HuanQing Shao
- + diff --git a/docs/guide/cluster/namespace.html b/docs/guide/cluster/namespace.html index 89442e1..da7922f 100644 --- a/docs/guide/cluster/namespace.html +++ b/docs/guide/cluster/namespace.html @@ -7,7 +7,7 @@ - + @@ -20,6 +20,6 @@ →

Copyright © 2019-present HuanQing Shao
- + diff --git a/docs/guide/cluster/storage.html b/docs/guide/cluster/storage.html index 92a8c5f..803bb62 100644 --- a/docs/guide/cluster/storage.html +++ b/docs/guide/cluster/storage.html @@ -7,7 +7,7 @@ - + @@ -22,6 +22,6 @@ sudo mount -t nfs -o vers=4,minorversion=0,noresvport Copyright © 2019-present HuanQing Shao
- + diff --git a/docs/guide/diagonize/events.html b/docs/guide/diagonize/events.html index 86c01ca..96bd66f 100644 --- a/docs/guide/diagonize/events.html +++ b/docs/guide/diagonize/events.html @@ -7,7 +7,7 @@ - + @@ -20,6 +20,6 @@ →

Copyright © 2019-present HuanQing Shao
- + diff --git a/docs/guide/diagonize/logs.html b/docs/guide/diagonize/logs.html index 8e23597..92e8534 100644 --- a/docs/guide/diagonize/logs.html +++ b/docs/guide/diagonize/logs.html @@ -7,7 +7,7 @@ - + @@ -20,6 +20,6 @@ →

Copyright © 2019-present HuanQing Shao
- + diff --git a/docs/guide/diagonize/port-forward.html b/docs/guide/diagonize/port-forward.html index fcf3f41..cb91cd3 100644 --- a/docs/guide/diagonize/port-forward.html +++ b/docs/guide/diagonize/port-forward.html @@ -7,7 +7,7 @@ - + @@ -20,6 +20,6 @@ →

Copyright © 2019-present HuanQing Shao
- + diff --git a/docs/guide/example/busybox.html b/docs/guide/example/busybox.html index 561de73..b5225bb 100644 --- a/docs/guide/example/busybox.html +++ b/docs/guide/example/busybox.html @@ -7,7 +7,7 @@ - + @@ -20,6 +20,6 @@ →

Copyright © 2019-present HuanQing Shao
- + diff --git a/docs/guide/example/import.html b/docs/guide/example/import.html index df94e2f..a14ff94 100644 --- a/docs/guide/example/import.html +++ b/docs/guide/example/import.html @@ -7,7 +7,7 @@ - + @@ -53,6 +53,6 @@ com.netflix.discovery.shared.transport.TransportException: Cannot execute reques →

Copyright © 2019-present HuanQing Shao
- + diff --git a/docs/guide/example/monitor.html b/docs/guide/example/monitor.html index 297a3c8..5a65d6b 100644 --- a/docs/guide/example/monitor.html +++ b/docs/guide/example/monitor.html @@ -7,7 +7,7 @@ - + @@ -21,6 +21,6 @@ →

Copyright © 2019-present HuanQing Shao
- + diff --git a/docs/guide/index.html b/docs/guide/index.html index 7cb1a07..b83bc6a 100644 --- a/docs/guide/index.html +++ b/docs/guide/index.html @@ -7,7 +7,7 @@ - + @@ -16,6 +16,6 @@ →

Copyright © 2019-present HuanQing Shao
- + diff --git a/docs/guide/monitor/apis.html b/docs/guide/monitor/apis.html index 798db3e..ca7a9dc 100644 --- a/docs/guide/monitor/apis.html +++ b/docs/guide/monitor/apis.html @@ -7,7 +7,7 @@ - + @@ -16,6 +16,6 @@

Copyright © 2019-present HuanQing Shao
- + diff --git a/docs/guide/monitor/index.html b/docs/guide/monitor/index.html index 6324215..e0946c5 100644 --- a/docs/guide/monitor/index.html +++ b/docs/guide/monitor/index.html @@ -7,7 +7,7 @@ - + @@ -20,6 +20,6 @@ →

Copyright © 2019-present HuanQing Shao
- + diff --git a/docs/guide/namespace/adjustion.html b/docs/guide/namespace/adjustion.html index 18ba0b0..ed7b337 100644 --- a/docs/guide/namespace/adjustion.html +++ b/docs/guide/namespace/adjustion.html @@ -7,7 +7,7 @@ - + @@ -21,6 +21,6 @@ →

Copyright © 2019-present HuanQing Shao
- + diff --git a/docs/guide/namespace/configMap.html b/docs/guide/namespace/configMap.html index 2b6acb9..17412c9 100644 --- a/docs/guide/namespace/configMap.html +++ b/docs/guide/namespace/configMap.html @@ -7,7 +7,7 @@ - + @@ -20,6 +20,6 @@ →

Copyright © 2019-present HuanQing Shao
- + diff --git a/docs/guide/namespace/index.html b/docs/guide/namespace/index.html index 294d3e8..b707b9b 100644 --- a/docs/guide/namespace/index.html +++ b/docs/guide/namespace/index.html @@ -7,11 +7,11 @@ - +

应用管理

创建工作负载

删除工作负载

伸缩

升级工作负载版本

环境迁移

导出

导入

更新时间: 2019-07-25 06:22:52
Copyright © 2019-present HuanQing Shao
- + diff --git a/docs/guide/namespace/multi-env.html b/docs/guide/namespace/multi-env.html index 9ec15df..9b60fea 100644 --- a/docs/guide/namespace/multi-env.html +++ b/docs/guide/namespace/multi-env.html @@ -7,7 +7,7 @@ - + @@ -42,6 +42,6 @@ →

Copyright © 2019-present HuanQing Shao
- + diff --git a/docs/guide/namespace/pvc.html b/docs/guide/namespace/pvc.html index 2788560..2e1f4b2 100644 --- a/docs/guide/namespace/pvc.html +++ b/docs/guide/namespace/pvc.html @@ -7,7 +7,7 @@ - + @@ -20,6 +20,6 @@ →

Copyright © 2019-present HuanQing Shao
- + diff --git a/docs/guide/namespace/secrets.html b/docs/guide/namespace/secrets.html index 83c1fe6..a7fd7bc 100644 --- a/docs/guide/namespace/secrets.html +++ b/docs/guide/namespace/secrets.html @@ -7,7 +7,7 @@ - + @@ -20,6 +20,6 @@ →

Copyright © 2019-present HuanQing Shao
- + diff --git a/docs/guide/namespace/workload.html b/docs/guide/namespace/workload.html index 986272c..326519b 100644 --- a/docs/guide/namespace/workload.html +++ b/docs/guide/namespace/workload.html @@ -7,7 +7,7 @@ - + @@ -20,6 +20,6 @@ →

Copyright © 2019-present HuanQing Shao
- + diff --git a/docs/index.html b/docs/index.html index 0217f57..2a85443 100644 --- a/docs/index.html +++ b/docs/index.html @@ -7,17 +7,17 @@ - +

Kuboard

A cool Kubernetes Dashboard

- 在线体验 - 查看文档 →

降低 Kubernetes 门槛

创建工作负载,导出/导入配置,批量调整镜像版本,问题诊断

直观显示微服务架构

展现层/网关层/服务层/持久层/中间件层/监控层

上下文关联监控

资源层监控/中间件层监控/链路层监控

- + diff --git a/docs/install/index.html b/docs/install/index.html index 8987ef7..fa8415f 100644 --- a/docs/install/index.html +++ b/docs/install/index.html @@ -7,15 +7,15 @@ - + -

概述

Kuboard 作为一个 Deployment 运行在 Kubernetes 集群中,通过 apiserver 操作 Kubernetes 集群。 Kuboard 安装的唯一依赖条件是 Kubernetes 集群,Kuboard 可兼容 Kubernetes 1.10 以上的版本,目前已经在 Kubernetes 1.14、1.15 上验证了 Kuboard。

如果您已经有一个 Kubernetes 集群,请直接 安装 Kuboard

如果您当下没有 Kubernetes 集群:


在线提问

Kuboard 兴趣群二维码

更新时间: 2019-07-25 06:22:52