From dd7eaf07ed3cb87acac69e4fecf50094123693ae Mon Sep 17 00:00:00 2001 From: "huanqing.shao" Date: Fri, 26 Jul 2019 09:56:14 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=89=E8=A3=85=E6=96=B0=E7=9A=84=E6=8F=92?= =?UTF-8?q?=E4=BB=B6,=E4=BC=98=E5=8C=96install-dashboard?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vuepress/config.js | 19 + .vuepress/theme/components/Sidebar.vue | 2 +- .../components/image-20190723104717575.png | Bin 24446 -> 164977 bytes docs/404.html | 12 +- docs/assets/css/0.styles.c0301a2f.css | 1 + docs/assets/css/0.styles.f7270952.css | 1 - .../img/image-20190723104717575.db9f16c5.png | Bin 24446 -> 0 bytes .../js/{10.fbb1a35d.js => 10.27221018.js} | 2 +- docs/assets/js/11.85cc1d1b.js | 1 + docs/assets/js/11.e6d2ff21.js | 1 - .../js/{12.3bb144bb.js => 12.2de4cc18.js} | 2 +- .../js/{13.d3d4e5f8.js => 13.2b6a1ee9.js} | 2 +- docs/assets/js/14.09835c47.js | 1 - docs/assets/js/14.6289070d.js | 1 + docs/assets/js/15.9f1bb8da.js | 1 - docs/assets/js/15.a3a371e3.js | 1 + docs/assets/js/16.b4e44009.js | 1 - docs/assets/js/16.d995289b.js | 1 + docs/assets/js/17.1a84aa27.js | 1 - docs/assets/js/17.681350a4.js | 1 + .../js/{18.223def9a.js => 18.fe656110.js} | 2 +- docs/assets/js/19.64794205.js | 1 - docs/assets/js/19.883b60d2.js | 1 + docs/assets/js/2.4586c502.js | 1 + docs/assets/js/2.7beee842.js | 1 - .../js/{20.e45af823.js => 20.8c703c22.js} | 2 +- docs/assets/js/21.8efd5947.js | 1 + docs/assets/js/21.a727e059.js | 1 - .../js/{22.34e4c905.js => 22.6174a71e.js} | 2 +- .../js/{23.0d00b1d9.js => 23.46b273ec.js} | 2 +- docs/assets/js/24.01658ddf.js | 1 + docs/assets/js/24.b4b691f0.js | 1 - .../js/{25.1b5f98e3.js => 25.890672df.js} | 2 +- docs/assets/js/26.096f7816.js | 1 + docs/assets/js/26.171931d5.js | 1 - docs/assets/js/27.b8b70092.js | 1 + docs/assets/js/27.c29212e0.js | 1 - .../js/{28.178bbcd9.js => 28.c80d142d.js} | 2 +- .../js/{29.a90b24f5.js => 29.4ff59e34.js} | 2 +- .../js/{4.146e6e28.js => 3.3acf722b.js} | 2 +- docs/assets/js/3.be84d8fc.js | 1 - .../js/{30.5e2e0648.js => 30.e89c0eee.js} | 2 +- .../js/{31.ee918a7b.js => 31.f5fb3037.js} | 2 +- .../js/{32.735c7fda.js => 32.21e0df02.js} | 2 +- .../js/{33.559772c6.js => 33.b07c1dd9.js} | 2 +- .../js/{34.bd17ff2e.js => 34.0e81432c.js} | 2 +- .../js/{35.2b3ec179.js => 35.08701c21.js} | 2 +- .../js/{36.5fbc1f27.js => 36.79893dad.js} | 2 +- docs/assets/js/37.20254ec8.js | 1 + docs/assets/js/37.8abd72a4.js | 1 - docs/assets/js/38.0324f620.js | 1 - docs/assets/js/38.7fd741bc.js | 1 + docs/assets/js/4.5c8766b1.js | 1 + .../js/{5.e33f0370.js => 5.8cef2074.js} | 2 +- .../js/{6.d9551048.js => 6.d7cb7b10.js} | 2 +- .../js/{7.88379a51.js => 7.a1e5b1ce.js} | 2 +- .../js/{8.38d68803.js => 8.8f2c5531.js} | 2 +- .../js/{9.8cc06980.js => 9.e281b433.js} | 2 +- docs/assets/js/app.51ef9522.js | 14 + docs/assets/js/app.dcfd4c5b.js | 14 - docs/guide/cluster/computing.html | 14 +- docs/guide/cluster/namespace.html | 14 +- docs/guide/cluster/storage.html | 14 +- docs/guide/diagonize/events.html | 14 +- docs/guide/diagonize/logs.html | 14 +- docs/guide/diagonize/port-forward.html | 14 +- docs/guide/example/busybox.html | 14 +- docs/guide/example/import.html | 14 +- docs/guide/example/monitor.html | 14 +- docs/guide/index.html | 14 +- docs/guide/monitor/apis.html | 14 +- docs/guide/monitor/index.html | 14 +- docs/guide/namespace/adjustion.html | 14 +- docs/guide/namespace/configMap.html | 14 +- docs/guide/namespace/index.html | 12 +- docs/guide/namespace/multi-env.html | 14 +- docs/guide/namespace/pvc.html | 14 +- docs/guide/namespace/secrets.html | 14 +- docs/guide/namespace/workload.html | 14 +- docs/index.html | 12 +- docs/install/index.html | 14 +- docs/install/install-common-ingress.html | 14 +- docs/install/install-common-vm.html | 14 +- docs/install/install-dashboard.html | 32 +- docs/install/install-k8s.html | 14 +- docs/install/install-kind.html | 14 +- docs/install/install-kubernetes.html | 14 +- docs/overview/concepts.html | 14 +- docs/overview/index.html | 14 +- docs/overview/why-kuboard.html | 14 +- docs/support/index.html | 12 +- install/install-dashboard.md | 99 +- package-lock.json | 865 +++++++++++++++++- package.json | 6 +- 94 files changed, 1247 insertions(+), 306 deletions(-) create mode 100644 docs/assets/css/0.styles.c0301a2f.css delete mode 100644 docs/assets/css/0.styles.f7270952.css delete mode 100644 docs/assets/img/image-20190723104717575.db9f16c5.png rename docs/assets/js/{10.fbb1a35d.js => 10.27221018.js} (85%) create mode 100644 docs/assets/js/11.85cc1d1b.js delete mode 100644 docs/assets/js/11.e6d2ff21.js rename docs/assets/js/{12.3bb144bb.js => 12.2de4cc18.js} (76%) rename docs/assets/js/{13.d3d4e5f8.js => 13.2b6a1ee9.js} (90%) delete mode 100644 docs/assets/js/14.09835c47.js create mode 100644 docs/assets/js/14.6289070d.js delete mode 100644 docs/assets/js/15.9f1bb8da.js create mode 100644 docs/assets/js/15.a3a371e3.js delete mode 100644 docs/assets/js/16.b4e44009.js create mode 100644 docs/assets/js/16.d995289b.js delete mode 100644 docs/assets/js/17.1a84aa27.js create mode 100644 docs/assets/js/17.681350a4.js rename docs/assets/js/{18.223def9a.js => 18.fe656110.js} (94%) delete mode 100644 docs/assets/js/19.64794205.js create mode 100644 docs/assets/js/19.883b60d2.js create mode 100644 docs/assets/js/2.4586c502.js delete mode 100644 docs/assets/js/2.7beee842.js rename docs/assets/js/{20.e45af823.js => 20.8c703c22.js} (82%) create mode 100644 docs/assets/js/21.8efd5947.js delete mode 100644 docs/assets/js/21.a727e059.js rename docs/assets/js/{22.34e4c905.js => 22.6174a71e.js} (85%) rename docs/assets/js/{23.0d00b1d9.js => 23.46b273ec.js} (80%) create mode 100644 docs/assets/js/24.01658ddf.js delete mode 100644 docs/assets/js/24.b4b691f0.js rename docs/assets/js/{25.1b5f98e3.js => 25.890672df.js} (51%) create mode 100644 docs/assets/js/26.096f7816.js delete mode 100644 docs/assets/js/26.171931d5.js create mode 100644 docs/assets/js/27.b8b70092.js delete mode 100644 docs/assets/js/27.c29212e0.js rename docs/assets/js/{28.178bbcd9.js => 28.c80d142d.js} (81%) rename docs/assets/js/{29.a90b24f5.js => 29.4ff59e34.js} (90%) rename docs/assets/js/{4.146e6e28.js => 3.3acf722b.js} (75%) delete mode 100644 docs/assets/js/3.be84d8fc.js rename docs/assets/js/{30.5e2e0648.js => 30.e89c0eee.js} (78%) rename docs/assets/js/{31.ee918a7b.js => 31.f5fb3037.js} (96%) rename docs/assets/js/{32.735c7fda.js => 32.21e0df02.js} (98%) rename docs/assets/js/{33.559772c6.js => 33.b07c1dd9.js} (92%) rename docs/assets/js/{34.bd17ff2e.js => 34.0e81432c.js} (92%) rename docs/assets/js/{35.2b3ec179.js => 35.08701c21.js} (96%) rename docs/assets/js/{36.5fbc1f27.js => 36.79893dad.js} (98%) create mode 100644 docs/assets/js/37.20254ec8.js delete mode 100644 docs/assets/js/37.8abd72a4.js delete mode 100644 docs/assets/js/38.0324f620.js create mode 100644 docs/assets/js/38.7fd741bc.js create mode 100644 docs/assets/js/4.5c8766b1.js rename docs/assets/js/{5.e33f0370.js => 5.8cef2074.js} (85%) rename docs/assets/js/{6.d9551048.js => 6.d7cb7b10.js} (84%) rename docs/assets/js/{7.88379a51.js => 7.a1e5b1ce.js} (75%) rename docs/assets/js/{8.38d68803.js => 8.8f2c5531.js} (95%) rename docs/assets/js/{9.8cc06980.js => 9.e281b433.js} (85%) create mode 100644 docs/assets/js/app.51ef9522.js delete mode 100644 docs/assets/js/app.dcfd4c5b.js diff --git a/.vuepress/config.js b/.vuepress/config.js index aa1a6a8..a9c33b9 100644 --- a/.vuepress/config.js +++ b/.vuepress/config.js @@ -3,6 +3,9 @@ let dateFns = require('date-fns') module.exports = { title: 'Kuboard', description: 'A cool Kubernetes Dashboard', + head: [ + ['meta', {name: 'keywords', content: 'Kubernetes, Docker, Dashboard, Kuboard, Linux, K8S, cluster, 分布式, 集群, 容器, 高可用'}], + ], markdown: { toc: { includeLevel: [2, 3] } }, @@ -17,6 +20,22 @@ module.exports = { transformer: (timestamp, lang) => { return dateFns.format(timestamp, 'YYYY-MM-DD HH:mm:ss') } + }, + 'reading-progress': {}, + 'vuepress-plugin-element-tabs': {}, + 'vuepress-plugin-baidu-autopush':{}, + 'seo': { + siteTitle: (_, $site) => $site.title, + title: $page => $page.title, + description: $page => $page.frontmatter.description, + author: (_, $site) => $site.themeConfig.author, + tags: $page => $page.frontmatter.tags, + // twitterCard: _ => 'summary_large_image', + type: $page => ['articles', 'posts', 'blog'].some(folder => $page.regularPath.startsWith('/' + folder)) ? 'article' : 'website', + url: (_, $site, path) => ($site.themeConfig.domain || '') + path, + image: ($page, $site) => $page.frontmatter.image && (($site.themeConfig.domain || '') + $page.frontmatter.image), + publishedAt: $page => $page.frontmatter.date && new Date($page.frontmatter.date), + modifiedAt: $page => $page.lastUpdated && new Date($page.lastUpdated), } }, themeConfig: { diff --git a/.vuepress/theme/components/Sidebar.vue b/.vuepress/theme/components/Sidebar.vue index 3ec05ce..f7d93ea 100644 --- a/.vuepress/theme/components/Sidebar.vue +++ b/.vuepress/theme/components/Sidebar.vue @@ -8,7 +8,7 @@

- +

diff --git a/.vuepress/theme/components/image-20190723104717575.png b/.vuepress/theme/components/image-20190723104717575.png index a75ad82c60b06de0378420f15343c7414affcb7f..4fb805ae33740de748e6aa1af0d08c6e4bc151df 100644 GIT binary patch literal 164977 zcmZU419&A{vvzDwCbn(cn%K5&+sVYXJxM0EZD(R9JI2IL{+v1Ie)rt(-_Nsm_g=kv zp;mR(TeaSfke3yQhrxmY0s?}Uln_w_0s zv$k_ovNtd?5jU|lakMZ}6c+*l;)sq`(J{wS`O4SsWJXLfrDV+#;#|fLPYR!?%97vE z=C`rIW}70(wn}tle19>OHaf+@-2Rp?Co1pFc#`>bpu5?hfZ`5ujjw?|8HRLqfq;Uq z;W0@5D6-@%wCGH`PGPa(ywq{Q zVR`5f`DzNd)H>zTAZ&85ZjD-7!hK$PE5A10bE}%ga8U^y@D1w^%3#A|fq$2(jJpDR zKF8zppJ?LU8y+jZ)6_A>f2HW8BL_|T@5-6r67C_REE};-Xi+)eXrsQZ^3J#rp0bdI3^f^E= z??a?M($T+K1ENA9Dq3!pw)N!nNnvmb-8TdMjaH{m_h(z z3vJoFJO}}T>1)+j%

nrs&v*Jv`T34e67;U42RKBO`i2Pc2goRK{U^foOGDuQ8Qq z^CnjnA=*YL{Ju2oApB&Q1YcHyrgfPl@8cbqfQdZ5^T^yM;?$uSUp_B?vli9mVPAaf zh+c}oq(Nv3B_5}I0oUn#9n!1SKBi$;XxhchZd03j(tA36 zWxA(+wJh59+gH14b{y86Xs?s*KeJYMa#O*wf!IU)J)1rlF^GHPaJ8?7DCV0ontoV) ztHYyVM~5I*nF{`F`J{>|8!b|K8+04iK+{R?L-97$Iq5UzGwCzs)2jm#&pn>K*R?}u zkME>6bZ>csrMcyW=7G^{cAR2W`Hhg+8Wj)Cv5##>!GP(S91hAzNMSi3rRwwrEtfur z7ZgLq71;;;NnAjF$ zdJJ+CoZ}{VwQj8!H(tUUc6;IB?7sV%$=&yD;dp((sq&E4zmc6gyL;=>d67@xqXNh* z+7CD{*INZt8}{21qRB_bOy$Dh9-3G zHuj&jfq;12xjs*AOq>k}+-2!`aJ)un4XB>PZeh?ULtiFc>-ZOM-u{8 zIu<$xB0d-b0sHqd*>-5jGJ|{^3*A;q3ItKdxwEcN2&tIina*h@zpFRK8J|82`pPK)t?4N#k=>O{c zUxWF3rhiI5r^*MzL;oMK@xe&?lo2r9b+pXosQs|^0)TYFJV(M{Q`&<9nH z68q{EL59Ve@$<>3K*6Xwg7tnNVOi@7<1#i?cz7VpoR^lm`s)4W$7SY=soVYa=7rW+ z-8SYjyOY^eR{G0^m)XHYIx|YGqnS-rnG)DnU{L{N`F|bs`H7HP@y8bnQ2+ai05Stq znSKF%AW?!fhjYrT*eAe|MwLN5UR8z?*G5^1s51q`u>G@2Il{^^w&Qa zvS)<vLb)-JHABr-P4fUpJ37*{u{hF53m<18UXWS7Cls|5dGrPfP$D1yY}FdzKMdY_Y7e zEdJ<7!bzsJutc-y#~AlDDcK^5{PORm#XQjPA|z1!4=QThP%P!YrNse+T$Wr`230Qj zGUXevBQe3LqM8wkN89OgM>w=V0D8=u57a;+E;g^$a<#4hq$PV>SlHQB)V3=7eb$b` z80=tJV3NxN#eil$1v}!M0%rEtQ9Z`6)l{kqJL&nKEW|5DZ-us31#O7 zI6McaBWzdIeVL^iV)Nx443Ia4zo%dh4kaR?pin!IPaiJUuB)z2g9-r5@m28#BQ|Wf zur>&VqsOOxrHliO5->_SB-l4rQAu8aCOU)sQDIfo&>;Qg%a>CQh3%1PdJvr?5>nE% zcPK$6Ro3f7{Ax;?6+8$U2F?R$+1fOQiZUch>I$GsMM+6XU>}lQsw*`@%5q7UCv^&N zbeF$p$p+SOoU*7|@urOL%BC~#HU3@nrsxa2_d#gmm#~;ZoiN#iT31poWM?=eKphiv zQDuV&Ta_MhG3j8P!8r`eD8&h#ZOOx@Ea;fDsNixutI9%Ui8A zry8FmHSZT6zSGk4Jp8Cs?}7n|8A0*;XzzGCP?r3Lw$kbprtN$+SZ96wB|=n_l>`w6 zH+FQHT!g^7WNRQu<3euT_cm{o0nq;z5<7qGG6Iqv5(Zw0Y-y89-t2 z%b&*-D%#&t8jdZet-Yv4`r4_^Wrk!O}yo>F8HNWucV4*ByTD@6!j>|P=e?f$jz9MCL znF5MQWoE>hK{L(2~;SNB+dxqs}(M_Tej%lzTvX&+^-Ld}hm{?O+L2f*jo+5q%vDWPCL z?G_M+83v++ydpyx4y!C|bL9`)&BWqfm<1*he1 zEz?Dr(SEzfmH=$M^tAD~d~aD@8f z3B5revq);mcCJc`U8(y1d<{Ea;w1;oy|n@AFX>|cC0$hPgOeXvk~XO{!&&Za6ED}y z$D0*l6QRH3z=4aHS%@oAXyOw6oRPueC1}o1D7L(>%4d_{Fu1-1ig#4%HpzS5oU>EF&wF1XA~HH& z(R>oU`mw&_e(Pf_26qimXZ16&ccXp8Y>TdEUrqdYp*E<4_0DCb!z0r9VqL>@GK)}S zTeLS2e9kpQGc!D#!u+g)#Oa;o)=1^ky!!h{M_8|PVD|kYcAU;$8VxRt4Q?`P>-gw} zbbP^e8_O3K*YAs#8gW*v1Z=UlPGG(y0n)!}wap!W3(DS9{}1BJLvg{A9|Kaly5&+)#d z#9Z&L&T_lgxW3S`8)KIH7+-hNv#w-%+h~^Yv!72^8wo+zF>D~;GSFD=6OD`p_H|Kd zygk{#9y%|cYqHUj3_mQ=EJBuVb3Uh%dp#tUjw=49sVUC+P_&nKj!AQ4DxK&w&5x*w z9gl6-DTu&-Chzf>4_VyO;)`DW2GfT2^AG+(3_$ypCf|65uiPxvJ~?=R@L zdJ&3YsBZc?v>%hxdcU)-CIVo)likmDe}UIq`l50^)E)9&pFx$~F9l&_zB#i5{qbBc zaKN&bDryQ&y2PzdPfQmh#K!B7g@iRp>G$syty@@xdr(kxEQ+Q6@d+6)z{PMGiSG6D zzZ%s(B+;t1X?5mTN2lpKmC=k%N5RntgpVlVnWx?&jM34@ftF*WeQs=8_kOekPP%m| zQ{OI_=IJMLA83D_Uq5@{_oWns30BmRig`5{KL^H9-_$TK< zbZAdLW^-ZDKYr;254dS%fke4?^LNSV2TdjuyD)5m>FOOumWd)rAzTjTmsnQi2F4v* zbt`7J(Mfh~`n_1Lb())v8iSzMljhWM(1*WVi=RL{MQm^1IeW66uBrG=QY-+Gs44Tl%=^AXSx?% z4}7hF18l-L=TOrU6l%3-uVxAl-`JDLI4fk;42f9${$wM6?ROsk>Y1A5JDl_KHoOf7OTH^Z8?>(($1-RT#L zVu`M{xit@pPs0f5TsRyn2!Y*4?|zrj7tpJ=F(~c~=wMH4_P`z})PKJ@IwiQYPZ=95eHZD{t%uS=ZWir^uyW(Lmp)@IXLNYc zOf2L7+fkT-Wss&VV-`D>CDXU=Qh6NYztph5GQ^;u1$>p7M=C6|CY1>?~16Sydo=RQ>H-Tj*J zO$m<2`_myQ=F>IowaHur`KVfbH-lN+#N(}z$Kz$Jl$^Bf`G7&VmToQ;zRZgVo2gAA z`Nw5S(cS0kl65l5b#pFHUdxC1Wl+?s|o)dLEIWEoX z4q;HiJc^xBa1j4#NVD@@Y&r)L-tRCTbboaC1A%tR#8d-4)$I!G2}~NzaWKel)Zx?} zOB41}r62i-XJ~qZ1y)wldzVeVztnZ#4LP?Sta1b9<+l1{Nsr|v)r15n*u?ycrbUf5 zDciDVIh=c}s<}j8rK^=VpHwlCSKc8nwfqe~oh&&#~VPxmEky zzikVM_egW7K(k=#?3ce>hN|*F2i;qG+(ef%c}=l1Jq7O>kIoe{89v%Sy%bK5>s@r= z-IEnYy-BhZ0p*;@zQl+uW8`>UlN={+D*3u>LYuatx^3>B1nRw?5z(N;q*5yBrt)>p znY;!=EBe>h?(XgxD{svP%5?8%vv0*+Yee;y(%WXJU65>?WZ43eyOIe zek3Kk{81bIn+*zG1tZ7_{FQbKm8BRBNU4k!_IaVcT$7RyqK={JLgJ` zL*c~Zna=SBcC=A?p5Qti`=)y#&-)|F5W=3EU)#5L$HVM|C?lKhoNj@O_i@}h=fQ8s zL7^|xOIzXR=xgJ*v1X(EIqo3Qo*hMfe0wKWA8<0#ZXR#lb_EK$hAAYu{nWv;)_ge6Tqk zUy5Kl-*QUe`9=*kj!-Bwls#@tWEl`;T)~~a_R)gKipz!x2hUW_<3iwWax40<~XR* z-47FBUP#LM(HCjLieUaaS?xN5`(V2|vt==P9Bp0^-mUdFZxTOn!Cp8-254j+vEV^{`*@4ouZZTxqU{D#T8a&X1f?yH^GAagVfPPKRq_ zkGJfH+6}{|*^UW~hOe3#{Nt2nS(JY5AAITFyCfd>t%oLaMTy48Dd(p2j~ngOlf{29 zCed#nVSgXgRCv2U#+RZ**~HPqkBKbQ>mFgmezu}g&U7CcS3Z`n$&N!Si2zyYrYh}L zAu>2lp^MH_I&(Gm7)kNtl?vkEXv3!mZ2YkezqiQOn^yGbd~Xen*01P`h7|^Q6Y9on z@&U(CyHt~P1~6jUaVjzOH4`i9Wz(0wj%;M-n}I%KAsoj(tx?=hLYz+v^U*dVrcvMbH=4JSs*wmp z&BAE7gLlO*VL@uSV|94`ld$Z0Kmvw=z$tPYkX2*X^Q(fxV*1L4&te&NPSk*DPMmlY74)SI6><%Y42UpsbRtFjVul$!!~#t9whFMba(6_u*Zl!P_(1 zI%b#7!r8RcNnSt;Q6UfHEU6e;WCX{_c;u@ z9>cyI^HM4WnlR@)E5je-$L|_u8RF+Zg-frsuQj$^r9jX2{K0d#YPHNrt@E?%K=TPu z%%7Mj$F1ahop`ffIWL!7NRCJTu;tZ^6FP4p$8l`TX}Zjiet*sbq)bd6!>`k&{#b5b z{ct>AI=+SH*#qRZgzJ{KLzl3n`|ihNbztVWhHn>t3~OpYsV?VCwK+vRDHuh7Vzj!f zwes~kc_q5yOTFQR@ORf+8TVMYXj<3|4+Ew%f?|-Tkyym(>HfK}>&fu|???PO#^^0@ zpT$_09dU&ibUrj(>~Z6j%1DP6$;Ig|;{f%$KdJo3O`@LnXi%VbR6cgqot^?+`<`tg z2B4jZVqE8%=^9X|z{7jwrX4YK)x(ZnxZ`C*cIT{RqmITx5*rpSEWGton`ylu1_-gV zbt79_7-1WDNLuR~4Yz0cjx-h6cnsipG^e0VsK7zO!ejg~2mYqOD78{3oC&Dk&S&53 z%-VG9Q1l$W@+FyLM1nh*YKLEjX3|`FY1Mld-v;^PgF3>Xy>1@0B<9YB6M(wiP}2v! z-5kiwne`BOJM9xC<>NQZ72%zD>n|tkhWq!42(H zRdVhhVLYJQ0`ZVcT>hKas1$uS*xsY^ zXMQ6qe~)WTH;r=lCqZ@BvmK|$b%f({`eDxqgC+v5SIflf8S|6-syI`ImEH6QrR;(Y z`9@xhFSaJiw{qfPgoOA)L_uL~gdUPX1hvhjkuQICMRVW*1Imly%-b-u4AOpBB>5+djFUj#8oA#c z3g@z#6`QTeuol({0;hMA5Ws$^l>H|b-ZBHL%o7L*26aQgvc~bTfoV?HU%UNTsmT~a0_1emlPU;1gU}eGHA9QrriNI7((Se1BJLWYAW3Fd4wZOo3 zfgyD++B0Rkz<0}TIJSMlQUya01AD|AQvUkwp=oxGk5g>b5VET&V)ikzPp_zXs^?y?G(K z*AZx&5y?7mhe3?3CduDm$bEI5+$ha{KBG64;!VHy}uRD?BzF`Sll`a(6JlukL z+XP*(5Rcf5J^V%O+oWRI3T)$9nS^z4LO|d_#lOScZr$OI2^`l2;_c$QEK4QW_lHf5 z6Jo=>hwSOQFE_S|eZT7N+OJ`95|tx`ClG2gOx;IU(*Lm9Euj(Ns*wSM-@B@koOTUF z2^Hnj#0&4gNw39wn9(qPSB+Ov=oa?$6iNcLN|CY%{SD&t29dUVL>e(@A)3){c?JEA zN`rrRAO8Zs2O-p!)y=o2j!ZRYK58bWvCF~?ayYoJS~D4Q@=HaTdW_)2X#B#xo@_K+ zs)654jQ)OaDQS~wJ(QEh5gyQ~c`>E!VK*i<6L*%>Agg1tT{FvsllVx_f9HRT%Yvhs zz@pLZSWaSSM1i-A8zku5j*wmSvAsjKHIO(J_g7B6e;CICEX|4jEo3&TK%E)0u2cy6 zawf*(gHx@@P0Nm_6~T-ecV65W1uO;+qdn&GG&=Io%zlE8hr5_$%HK#Yocbw$P9h zL^ud^|3Tb9g6AFQ5@2xqmh#!T$UpnZ%B~4ij?QHjSdauW=rID6C&GS+ zN^Va;u+LnoC#`X3j)pJmvMKzwKPdm61o!e43yLU+07+i>YQ;0&=*pj8d(!Lv5p^QS z2R=BEt{iEfU>mIB$5XgGq@@;{00U=JcWUm{&#@@C(YE~^(eudE?|rbitb|W9QSvZ& zVb|rqG`ipw>E@IOj}1xvAHKu~aD4`fe_>(O0Dl0o>r&6C9Xn7*ZOLb7v=^P15ILEB;KzzGPKm;ZN0$!hftOc5r-Aqx?WL6?lf?xf#}jx(V(@fc6-8)_KH3u`1E z!)`GokP8AA7TL)#1h6EqlnNi+Io9oRjB?v!;FMkMWUO32Z@-54&_%^?RasHpm~fAs z5}wjkY9WZ0sW@~{V9Nw8{K1k&~0ddrnss^71B3=S$=T8s>3qV;Y z#L}Q@ife=n@_<17=+<@>e|$A(e{42qPEiIdjmbhm9STV~ZbHQyxNmo39@3uIS>3*} z?hgyfjB=Gtyf+U}J2|9`bjZw1^&AGVPhC-x2r|=~lnEp2($Ha34@H8&cXa^cMH28_ zfl~`;BFvQm_Z9g+5I$4qE&UUg{W;(mL+MLcWZi+P!Cx>5)JbKnv?96^Z+P7$UwrOD zHQ(~hHJaHi>lk5TNTVj?J>_Y2ZCgp6E)N!wmKF&y&k43U%dz*tPU9Egj*b<>)<|1r zYuq>b{$ffL1CH=(;QTAak1QdE@6bR}+SIF9dogFX%^=5d#19363}fkzQgU|i{#%!G zXA{k6Q6vg_NuQ_#pKKiksbr5Kkp-vPv7^08!Wew0M0-$}@L;l-NY3v(+7I5=ReNm0 zYui=JXihm@^$1D~or+f7yQbyfH=Nj-G7fNwe;=u412yK-8VU=|fj9mmL$koIWRT-{ z#ArH%pbwg|W;9_6%vqiNqb#Vx`&~!6pG)JR^1oNzh=TGJFxOWSxin(76gcv2BzfM` zWF?b8kV9Zov+nYW#!|o2!z_I$P!#wl#T0Av=82{+LrRS?@fsYa>CP18A$--Qkgvu0 zdq?^|9E45%jva~d$UQJFR$Fj8n~8et=0?qkR0?{FAQV^HWT+)aJfgb*OIQM3N`hbxnqr*Lm6 zGN;AF!3hgZ=fz4(ciHkY3FlVk$5ON&fuG;!4f+aT2l^s1^MwICNwAd3tR&= z!@PlV!uVl8!kOA_7;PYn#IZmW=8C9=yJ&bwRtuv}Ba034>>?p2Slt%_MTm1;sgy&~ zO$=ye4%HzV>3Ip%vp{8F8%g;wwk;gY<3?Fd%^~|edu_)nA#tDr!d!{12%#pmVSCHE z$)6PMcegUE<7+8$g%DCb6x^W|!N+xd{NX8QpePyGT)}{R@hKsExaxc9qV)d3Dr6Q;v+YLR@r|LqT{59`CV;T||>*5{XBD&v4>z*&qZmD)a$YT~X z!k(`C^a^FR=SdA#*4Ua84V_wAo1=X#YG7j5CEa9uLj5oD%}fST4I3uT!@`GyGCBsV z!Nk6fL-4N|hdYFjI1|`zR=;udDP~^;7Ch~#!E*v`(M{|lm{GvX!i97DL`5ygN424&A2C0#8R7&Z!4fzog2reN5?1<8(Cpz)X+H<>g*0xuEt= zo!>cV>lrsU$;DI=eE4`iU6sD&aaYm}X3_El`NX(43Rr+=Ub@}_tSBl5KI4**(+Tk} z+lSNr*Oax6r^eT&%Ut!|uvZOI2Ihd~30X95U-c0m%h}V~Qi;$u;1B`mHB;0E$BFsJDj}O>Fq9xx{oKecl-ZWOhOq z7O1eT;6yDpyY2TuWbC3n1x%dr`0DhmgQyHWe)JYhO7+#LvoDS>%!+SUSC9U)7x9n1$FYWDVSRTTmJqziE^UK!VhMiW zj$NdlSuWxT;)g*~wb~2uP^TIWvjyh`^}4=#T*6P@p|_IzImv+vr{16jIZggGs-D#_ zBceX!7pc25o2T7lT;#$zB}hKR;{~^APQFi^mu6mK_fNRr2t%8TlaIYnIJ*BsD*MC4 z+s+f|iRlyG)ZPm!(g%^CP^GgG4(K1>8H#VRrBNH6sgUBum#a`r?MMZ&ZDo_*iWRBh zPy*-Q(Jf1bA@c$jG0FcsclZzOZYBeH8M5$b(Yqbee8cq@KW-j-!7tT+QU3l0d!Xo_ zDe%A|K>r z;R5zQWV8Q}3=y=!3R>xF{{fl*hh=zA4l;Y66`7Z8ZlCc@{`)hE8co%m&b7XS?Q<6b zBsIUfc9|zj*dm~|{Ye|o*4^$mY#5})(Y>=-r~TOVH<(LyjBb60eKeZQXjrr+hegC{ zRrvDt4%-$&mERTiM{g|eR^yz?9Wr(?TNv~uv#pokjBfGnay~93F>Q6(Cp1}IY^*Ly ztz>n_3rXMf?`&kB-e2EO?cL91bL72g=}%vdg$CQ5WoDP1PnoN+T|Gizv^-C>xV&t9 z{5m>IE=wKe``|Ba@VtWbYT6+8#yPmwh8``}t=P{1t2cUnPrV#%fVQ0y^PpnpDZoys z@a$!kdy44cFqb;+YlE)rv66)- zR{5{h{WN@ecmdl~ahl};U+BDdiZsZ(Ayf6OMPGe=R5BN(Ry%BS?E7{O>YW$K?Xa7C zjR5hXQzz`570-I(#7T1BGF5Y_-6=4#qi%m(o9cnkJnrDZ`n3vjBs>nIOvOa=#RAz7ki@-(QJRf zr8WbwspQHY^#N?COBnQ8X)S5`ty%63vLdbjz@E+7Dsg zywyR;X2)1JZ#>o;H2hxY*Y-CIn|>SGn$0xq)=w?3Hp|Z`p}sX7eq7aW4+GxLy}LG9 z0NkiW8RE`PHfiD478cuOQbg3tIR>04I`ypLV*CrA)&{uwc=qg0HEg!{0DQlv`_<=^ z#p}AICf)lC-x?meY{1UY%Il{d^s(s~b&ZEP->+W2cq}{nd6!wG<`{52;B7e5H+Iq8 zuigdCuH9~1z<&#hAtvgJ)W~?N+E2NR8wsb7l*1$7ReTnRRLr$)4ZZGPOj`h14~JmK z{a!ruZ&dNea`g0m_t&E-xiep>6G8)uiBMD4=l8Gq`eVTJ09+Q&aK`d``g>u8S6SKySX2iJ8qBfi?$j%cx2lj z+R1tDNiHvbEsg`|m;5@(JNhTFD<||FcCM`ubfl8!m9t;(e(SBh=I`1(cip=+ziv!6 zH(!{^jXxYd=&`Fz|2|p?oYgI=ERmqYv`>UPWmse=*)3?P6A*L5q4xlA7u#qU*5bEkwP z{R6fb%Q3(qPPGhrr~7CGqmWZF!h(418#7>m4}JVTVKPB49-EEEU@a}qNJWO!_l=ov zM?xbdwCi+ae5lo6u4So7dOYmdme0%Pc-<;>>Y&-7sDA3e#bTXf?rODU%{wJE({zs} z`p*w-e{{1$6OELWMc`9Yl)Ob$v$ytp)Po)~T~a+@nWw1U8xsNT@}Ty?_$H*lj7x{X zQ!6Kz{@5mqf5M9E^RzluGk5E{wu`^I*lw)(NhjB1{hAi>p(}83#knLNKRY)zcc?^b zYaI2N9V2^ue$wJH!l8)|PRo;hWA1UDCVJ9to|gAbKgO9YR;Jlu(af8{_uV-)HuGS5 z+DZ!h`&7xx4b$f0AU>H5gW2($MH5^z0virZEba6GF+YE2=0VC527l^QN-u|BnnQ|Q z4NIo&ymqd|;tJQzYACIqlrX=#uaw#RC#7+cL5E?}HbY!R524zItN*?3)nwUu4#FvA z^SP+jp!@Q`3@bagdvdRst+FDz{^3k_&0eW1x4YPF&nB(Q#g^BmgMX^C=}CJFU}dqv zk(zRBt65_;x7N1YL8mv=`a}coGrk7D)*|1<-`(jt-T+u(In~0_)p}=})YaM=dhsb~ zr^Ap-4a0W5(crW7WzXKx_t@}e+lYo8?4M)UNU_*+xA9<2-jX{#Gz53$yVu|*uR%e6l~jeywHnnGk@VVk ziGe4Y8k7zEH*E10AfRFrg84p1>ZFwqce1frO;cWhtS0VYf(nkjnl*FCADX$BA-;h# zm3Noon6KDE`Avf=i3LS~^uJNlJqpM#c?uHJp$t@cv6op1-iaI?V8P(PZ%!d!>NZOQ zBh=jFYzl-ViRBa%{~dh%NxX#%ykT_Z+l+RVS;9h*1z29bc&(s6Qpo++l5M|43c$wf zJXA$Tcm!K2UBCGx-c5aC^KE_6o`$okG7me;esMeKz-EYyarl<|m1l1;Qy-Qpu55cB z9Ew>+Y`g%M1w|__OFMR~gQyr;0yR7=1fJeNEcxm8%p%@C-6G?tqfv z263;_4go>0Fb#P+T7on%S~cQ-LIDJMu;mqp#6gNP0t;@w2i0Zzwhi=tXSU5y84_O_ z8&Ld#ecU4>+VU$}eq9D!?Abk_?d^u5{76HShx$E1-sm3w+Bg;7TntB3YSl)gzy5BoJ%Ru1Dt^kM+-I^fL(IQ^)j8`N zVQD4(xBW4#j*$s#is?<*=_Pcv{dEGFc1Ji}NWv~m{JJ6*yC<&R{6k-sH`$__(=x|t zyG3sw9_}69SyXNF_aagu0Rv|!HDzU@M%I@r8rlU~K0>rZU=d*si=qO;lj_+&D$@d0 zgPFgr0Gw|m)g>XQ5v;GK*HCATdA#(EM(ha}#i|&0O`OHgnmBWowQUf*Z|9*xkSPrH z7f2xV4)i8!h>9@jA3sST4aTt@*;keh@5)*dy$-QVH%=JMjucyo9p%KfF%+helph-v zCE|g+xl=nLfwx%8vsgSPt+Jv%?RGlHP`rbB{D>a38TK-=lxMc%Vl-6+dR$qO*OsAV zdN&0S#=17uogS%u=SvHEko4Td3;A+}Ls?NzTrAT;Zi(?z^`MNt554ZLsVmcZukx}4 z99D}o41!Ink!Rq zSQ|MY9J-%x>Yg0Oq;vUH@lE)%wKb>**JRnx#Y9jA`sGadP+4r#8g$(umIOp2nzBItciP{?Jyq)G99N+fml9_k1~?cyx613p#q_OBtI`AmH#pgI>wa z81OS%RJ53)TU9X;<&>Lbll`I>hR6g^oPdOH_eeHy=DDRpQIuc>HbYoDKTa1B=L$`< zp@cjwJEa$a)^T7|;6E_c>_x@Oe;2}R4JJ&JZ@JWDot*oA#KL)>cJ=wbh+)bU z2|4LEL&L!RL-es%@W|qh0wKOP>n0rEBMQ#LD5d>2t;_h#pHH2)N9(=oP(!PVF##Tj(v)=7LLS8>bhStXY__XJY8%eYJdR87bDdghP*mzK z!SRkXrsqmu_5i0(k$`#3`luNpUmHcGiM+9OXPdvE>tUJu-5@;)91$-|M;W@#;#U+KVRdC!p zM;xUje-|Lb zNEg=oWO&)!XyiKEa#dH=v&2ld{hpipqNzCj08>;WCY~ijiZRK+JP!`-MN&kbE^am| zU70#Capx^z9kI@^JJSDBj|pm$DEs$@sR2RHL5R?36Or69MlfBZOiem_pq&M}Rc_TN6eXDj_i%Di;fd$0P}h!L%@4JI`BK3|)4@oRg%4C(e7TKc8pcs}Wu zJgMcDCdl8&E*cVY{bFU8+Tdz4!@e+9Qkm`e(wI6P!O!unE4y3%U`mf9_2U)9++%Ei zDl8|ZUN(aw43|mh8a8tO!`4rP4A(CT3M>(2o8RT?V>G=qhe8{?`1V5ekP#uvT}opEWO+ zaQbmw^NRkE9fw5!HHM>ytf`s*x{?PjTAm+@%;XF;n{F~{X|_LI_GfJlf(2WtiJ(HS zb3p)0VhsLXB6|O$RbES-2}c*aW*44PBus03>>;~*iYf(R0KIieBVh&xGd;K-HbM=P zQ0UHgsKxx4=2-LA^SN-4ocasl* zO>(_>DL)nsytYHM`h7}5K3P70q&od$OH5YBH2W3R*b5y%4)@RDo)@+!U>2$k?&49I z4^IWU_FLoQnS5M`3&3@s)#ZpsY4TW0Epai35ESI$Poq{GWj`jLlvn+AjN=8mU(4(> z+YF#WvwC)I-yjgqAkU=(M$xcQf=HEF#hm(Mf;3^;Ffasj85}yYM0P+g-sJdFQDV5o zVsMy+#`4TQwz%gRmZQI(P^=mqPe%;LBqH+X5DF8ffjPPMbRYySrXdFb^1Igwq*SXy z$Oyl+IbWEwh`znt1%#Gn<9MxxC_?Q7kFWXO3}f$Kb#GA0@z`g^gUNDxBp6Hs^tFFA zdTu~y*B`WVF*9tjdZuDnG9R@xrH{j=#b%(n*1^rk1_5)=A0IhkVp)vO3ImQ;2+aOyje@*g-FCPw8Th-6tI@ySs%R80#R|$mwImzPd~*P=jcI zC#v2uG*JBoB6&W2F>NUBZ~~xW{~R4Jg%v|YiP`@2&M&E2tvZ>yR^-_4qixGvR)7i? zjW#*+!c+YRb;W)tH$Fo~=~qE}^F5tZ7&` zj#GV3MOT3myXN+E(F-rRi6Q1^Xzy!>iB&X`5qC`O%=YWe(+39d_|#@Qs0qxMuZF&l zL4^h{inMx@S|r___p%=QQ&uJtADik3_l@fx%gl~zF5Rgww(Xj8Uass??UplEqWR5Q zwT_KEck6ydZqq;Oh`G`4%!%cAJ)1Rjhiq(vT6JbEBnD$xpmC3qz!~NS=7P4O&_{(! zTM5;Sso@souy&y-Rv5Nl^@}C&(*kY>=YlPu$ceWYoGXKVn}z%gT@TW(6+){a7|kz8 z8{8ZpuYT21tgWp731}~ zkLyR^UNBc%H&fKh0bG1l&Mo_U)iXr=od_D>DJjB;cn4vb6D{tMJ{VVJEJZ_I1Kyxl zmt$4KrLp#*nXQGNhE4P%(!j>3QI28ov_a6)v@GggQ;5tNd%@fnSYK&foHS$pqU3f! z*#oHus5Y84PhB7JvS(tS#{$&9$|7*z8Mgl3H!@k&nwDygIiK|J1W~$O$XfS0Wpx}_ z=}!LOb1uyCyoOH5&L*x^cfCsu`yj=gTOHL=*HZ2zV zn%*iZuBPkS#x=ORTX1&>?h>SNcWK<+-Q6Wv2yTtLJAnjuXe78h{5<#jf2V!WqxbHr zv1-kA%~`yJ_-i2NCl#cycpS#1zWaTt_KO)J6TC(_fS8^0(a+**BPLcspY`JMg8c~# z&0ap=6n*C>R>j9z^q&EK_Y52+>pLmAxpZ2uPpC~{QO(%M0_A1n33)L*$_V|(bI1y}lIiJro=Yl5f#Zcc3$3(tLLkr9PJbmmNx zJ2UG>P0mTZUsj5k#Nb=df`gtO)`s7J3mL!tlAKEy;}+Tnm0f# z+lrA8)R*1hOf}Jm%A?mRN0G6Ro~ebOTQr@W3r_l7Qjge=ssplbCw9GsSxHH^*o?%t z9{NSzr^<$Srj7Ps(3tMNCw{ny{omH7|K=ozn;Ag}gwMeMQS0|`J7PT}SWD2}YLhP0-$ipw{8Wn)NQI1xfX+ZO8zr;j(!w4<_iB`+>#=8V+ozfz$RI^Pzf*5%M12 zB^JxI4QtNT+T_g50v0{c8CPdm&03pOf&Y`c_f5A=QDq7@QEN^xdne>A)wU5+^s;x{ zDkc(rKe5%jS+HE>{n`HCrL7UbFhdH;88R;fpW{5tEnOR4-1R6KJ4no96VLNnz!YM#_s~{lhtIiiWOnJIAVr6 zSS*MD3Nj=IZze)T;N1ENVE_>p3$^|&LE&fH%ik!9x8gD#3m8(K*Y+%%ioO(>nyH3m z56}Kxi|bq?eFVL5it7EXs z;aI~S+8}7O?D}T1?#creS;P2l)qR=2IuT=JqCPDC;leYoofW>$EKx)}VU&!-lYz0{ zV+_r-Jr{V{jsfvOsp_mkgki$Ii5SQUQ|<$4z0^3Cn{P^Q)k3Uq8RXhy zE>SRMUG2{@R6C9>8I?Uf>qIN?msI;k@eI*3wK9YYghiMkZmsI2ET=vY%{*&FrU$o2 zfa*avlrq~Q5sAuSf25i%_&{{L*uvOsoIV1u9(cTxe&l<-95kQKai8zhVpUg!gUL!D z5tJ|7?4EX?!y8ek{6GN&KWm`;cML|yh6FiVDkC%Na1&~-!Pa*Zqt@KYFm~T4N{jQY zd?D&#P>`GhZ76e>rGIp!+%^ZRzcyP!$v z)!7e=>$?z|kw;&QFdT=;+&G{sJ0$Dju6|Mp9WleFiORa#&VoBERDt4WDfLi}7~d=e z0g7N6$+CDWOo`R`h-8QHd0RA=`ABu$^r;BZyp%%5_+|fFeMYNp1R4posK_DLmmX(I z)>GxpXQzlAJyo@c8EQ39$VXfqF1|1Nb;3v*9``rEvT-&)pKG}E;r?`oO5sy_UJx*X zzZON4j+(%v9AY&$FU0icNfiyNC>gwLhMclP@IGFqoC5{7Ak9HQdn*1c=gt$Y=xaaw zPpXW({>88df3PDfk5x-j#a2PM^A6u4jwT!3Fxl3Yp2!?2Vbbp-KIHnTSWf>x)pH}} z7Cd2s2sB*(PLW}UAebcZ=ZXUe#QDImCC*?7-qVVfWvp13Jc_~I{ZjL7EIMR7W{&+r zKMoQPI*YlVULbluOE-O5nI-%{iN3;)B?hK{9rlF(6ALeRq3nTPNtB+9OyO(;h$K7$ zdCkQm`(eRZ5EEiX4RD z=zk=a-DKZQko2H@0XcYg62HR>3n6IS;yHc75m)Ygw7oam^_9~~%s7irxhL->Kkrr| zkN0{?;hF~~*@3UR0Y5|*5r)KMgXz$@>%+oBPW_QDWajT8&sT5SAAmrlGT z$g8QXylbHF#!Ti;xtFAxt~j{8IsT#V?B|+TQb{gb0CDrziivA5rjj! z!5>i1@j2=bzJP_YA22Q2npy3DjySUeAC)Aqg=*UpnPT*cm^GOXWcfmQ4E+*6nFcEx zO}_!W%HhK!p_p=Wc-~x(7t63vHHj?<1J38ntp-Db$GBEoneo4eUhlk8=?m$25Y8OIt4;T!OS5GPEN%&3#g~4i*WElE-!o2dX1$-%CQyG5?nr6 ztUb?*`$YV1#&d%>Ix^P@14TI=tU?mQU+OVN1un5YwNAv$9$4}P2%e8Qtp*SFRplbY zcu`J{r=A#+zKDz-KvwTjltkptpqx%&2Hh>g7aCB*!g+*rA%T}|=8N)2GMe#B;N^jG z@TcTvBubWTlEHyeMKmarrhYB#lU)-O*@7Q&5-ZraB^*EXl%ZnCWlw z0zxdpe%DT`O>LZ0|0w2g=@VIrp7rF|w#HiLIiZFwK6gj=dMq~fL=ch zz=Iqg&43TcRIQ3Wx=57ZogFzdpA$iFpc-8P%~9>=V0nNAns;G2Cn0_Eh8Y1Dz!nY%%?B>W9!Sc z`W3d9HEV0O-Y7&dq)>&h9;w9YK4DY+WnPcC%S3q12-LOM+V1Ql?90fsh=6eWQn2&T)c@n>2v;{F$t| zg2AVOv5I9~vQnx(X-|T(A!iif5F;+<=T>v8GMI5=ADCUQ=djgk@Y%SWF6P_O{?`HJ zghRj=dO-ZM+;61rwPTx;hMuNT?cCEB>7PIy=EMj3uh%~8WMIWq#M6;wX5w93g#W86 zfr5&ezIYa!lmej6{BF%I(>i_n*WTW)N2_>-EvQ>nV>)`e2yaau-(q34&Q{hFfwH$z zdo8= zSKfz-g|6E60${fUPc)qQXQt`8&I{hOcvOVQ*#(O0ivITyy2wyR=nN2Uiob>xNd!i1 zm+Q!9i0m&4rS(!RhRfDnYxLqDa~+{IHhrtv)q!lYcXz5gq1Lk=8zg zjTofO7FA_!+dHh~K7WwYHkEN076PgM4{m&ryA-%31$j-l;K+fCvQ26=%}usC-GeQ$ ztAq8{~juc5u}A**rpC*x@%e?Q zvM|ew-yzkYgG1L~=>`|WI5|P-O-f9#>CjU2J0#6n#^OaxvP|0lCojkJ1xG@xIom3= z6$Z5aS^OS&&+3uErV)>c)o|W_D-K$trMVa}TqB*h2Lu$}#t*aS&w!VbHqWOHejnHU z2Wk061lhD)4kA*4KB0hVLQ49+M>>0`w3>N4$o`?ea&fsTzgJy`|64(cLD`iOGWcv8 z)*_+)NhOsDnO18~PuSc{rQ9N62r;N`7#MegKHesd@GQ3ar;UufijYJ5+^=11+F5)H zCj*a`S%)Z9$avj8HEIY&&sSDz_WV=}4TN-F>wW zcmn18-f{{{>y0_;5n2PAPa6v^p&NCR3n;t*v$=*6Pr(<1F)?*ftK)LrdZ5YeG5!VG z8Xs>W1?u(Qe4B}ArBc(?I|s1qj=8(cb&tSm0oe5k3E1a-QLXs@^Vvm-dffJ@y6C;+S!)9h^+iaI!#3LKLqe=%50{r zL-i4K!bqK57a&}sZT_T>)8#LUJpcc@!hMJr!c;0DPXJ6p{~a9>E@I1jv#Qf`Q(mj z;#-$)b6t26!QiKO(37zoF#XV;oUbr~izo4fvk+|Z$un)W9^by%+^?3mH)n|29C-nc zLx%}|K%fi;_awZqFqpk21B6Q zZa8u(*L-e}Ufk0^55UiJL32BlMg!JL@9voir|*bQpuLS&$^=tD$HT{;Xtk&KMY1&8cT>n!j~rsd9DMLvcl zk;F));3Y;8`M`J-g@J9EBYapW0v)#eS4PIN=H~TWgTGdR+oE2ZkS~sYW9;ngDM{$9 zlb(*U-z4-3fBe8aJ4H*VINy-kUU41ecT9~AJwCWKB%}`pZJ)Flk-28}+>RN0;` zJlEkxp(hXNDeYf zt#~_w((=`%Y$}H&EC6dc)z)thzm}#YATHpnrmtO)OATH?UW<3E$glugd0a<~Cu57! z*CIzOxIg#8%}kFjD}1d0o|$>}=?6nX7twsMmG_EJMq;;RM|@NBVyh5SP1%i6Y7e_^ z?kw1Du-5VT_4SO~MsCk=jqmxBtqZwo`b_RKM|y4R3f(VD;j`Hgwx?27`%afg}skAbokntgGx8FQvVB?C>SN212n`GYT+IOOd>d2OG@A#IV z_sR4Ly&y2i1R5F`Fjp=Y7Q?}^h5&y`E3*5FumqpyiY5B656ccmA^G)k>^j<}YfbVCO%-Qhx_D zT>8YN^vZpKm{)rhO;_J|i*}*pWxia7q}&UrEfiEm@7l=xp9rc| zo!8*r~8LduYgu0i58fn=NOn% zSRpE$cVf)dzdLm!9qdu0#>+w3&=E=m={JY6$=&m15q98o=!ib)a+avt$N7Hgx?bcH z3;l#Gm71J0MxNgvjlG%T@7}zLVjmWs>wt#O?_8gRZ{|q6t9Kh0j|evKr&lg(mg9}~ zR@v3)irq6{tlIbV3qBO9F&vvU`r}kLS!PoNng&eQs12#x8}lFGmx%8N6I~E@SA_pD zA3+G8#U2yW!AKA{CP8mvG3UF3fv1%~%NT-IDPp?bo*p6OOWJ^6ml9w$FY8p6m-zW# zt%%Y9C=h|~+6|86iyFfLiX^nA?MUqR!MC9rYO}_@z707H@R zRtAM7WKdsSJzmWEGX`(an1wvjDQ_UZV1ls$8)Ai0;~OICWaknJ<`j!UphM<;SkMXQgc zOkj?MYd}0z7aGcM@gV&tGCAcXRNHrDgR`c@_~`Vkqbvc6G%Rc!O&qqOI!U9xyP$u% zcu>KI6Y>djcoc*AJmlhjTZ$s z$z}}I98BfMbshLXy5kI8vrUw_WsLeyXW}2K=h`vVtDJM8X$oaP)WB|1-E=z0Rx;N8>Pa^y|+knFs7=lw2e$&>7L5sjJ1`mojj(!VBPE@aPj@ zTKcCk`N4FR^9lL%Pz3lO(fmmP6RDc9=Z zc47cqE|GtJe&$V+t|O*`37k(o(84G|(<#kGOsrqIrjrsyrwo+x&9 zCW=zMCG34cI32ID3rkt{(#dR5PUtzb_CCTwpz&G^0m{C3oH6Dv2oOQuT^)ZUiFu-= zfr&E3g6{68&@}hfyZl^#=AI4d3wR)%e&OV?nE2OnG95&d7fj;~2IH9;pE5HqlR*vIW)+a_T8}UT}FI3|dX8k@ax8y^^kg4)JgacZQfpQBrf7rG|&q^z}^#K0PO2O0+rg zEq$>Q_PUcn++ABce_Hvu&YP@6R+C1ChsP%uj51QsMZR0sX4|YjC7cQVn7s&PCY4&W ztVuT#c|vY~0_XnzVjRs&OC5z#XoUm!zOyaA%AqI%-s{4NcqpU#7@+L3qRHc{Vx6pk zhMnEtr>4qU_VhMdl=EhUsv!x+MOW-n9(+N8l1YLgoxvu;V$k7VxsJ7(<%CX7jZn(a zs`JvMz00CLab29a?ZFe zd|}kdY?^VCeJJ$pRV3xsF^?Q8G<;3PPQ&d(E#6_+J6M5-t40%fueP6>8gNZyr$cis zk2`*i9fVB0!DC5gbnMXr)U6o{Fs^btN5oEc9z8lND~F0~RpPtRs|daPVlrwUvDP!a z3TbykalG|)1B4vg-D##_fDy4+KA8s!`W zpLm|0ev9(z&-&f-=@hoWKJwu=a$bnF7JCVgEkzl*3x+@e_^ou zU+V`f%w6yXTE%2DK~qt7{9vh+=Ee;jNns6;%3fp%?LJ}IEn^rI%2m7f(iiOJ;83vs zaU?oT)L;BdCQ)Rf*vfF`C^I8{(umA&;ERLsS@q~zH(6^fNb$K8QR;Bft}r6sw-Jnv zb92}?=tDa~H_`R?W*?7rcWne_zmE1*-mvRbN-j$2TVb!^%voUVy8F37$||=e>C?7} z_nWJbmG$3B?wxHBK{}ap=-R~<-wH?P$^p*p8^boQc5f9viecv^mw$p}6H}}Q_{Fi2vDd<~l4k6I{ifO1Bb^5X!fykC^@{EI4`L`?OQb8$ zdI6t~)f#BX!@&(19NSOzA(!T7A>-wSToO#cHamWvAKM}G_&VtKRLb4SverzYSC7zb zY-F5mt4glObrTj#Mh*f39*OCGGV6IV4gn*L2(Cg4n|0A%V@zqOtejl*wIvn0R&YzD zo7~(k9gR2R3ZJ!cw*EnS9&xlXvK1RlW#*^DZ(6)a4qt40zMkFEiqmR^IJ?m}h8m>A z;X#W>7TEB5rWMF}66=|9Hq`Wyefw{2a_WbF!(9G%7OjUFL^4Wx}JG4-?>1Z?B{WX&bA1gNfNZur!(kqOFx|lTCR-L z;B9`zi|hFYGYz>GOa;HI0hnRLj_MNjMe1=6gFY*J=%T!gE17DYvKqO_-r^>yBd~nw zdmI{)l^gcFV7}RJI&eurz)}&IPmKs%BnW-|=G*TzKc_jsmI=N|xqw~60*U3ZHE?B& zKFn_26|Z?@EK3fK30JVmkmlb~ zo+)V=wc&bu6m8=E^-P<=gf6Up9*>aIbjC5!tBF{|*YGC5>`KuKg1S(Ud&4h+!3$u& zB`hR-hTQO_e3%?199~54B`-VE;yQn)(}H9&J}9F!?*Nj$h z$~RVEhyS}5paP*;1jgg7{K13d#CNrO+8gcB8NSvOzeU+dKq+jC)??cSYfBnnuWLe> z6!`XRlidsKA;5M4QS(5BN>+=0I85_eyLG{3#v3|2SNe(A75Kf5YpDSM5fLkTT2t9^ z{K$aGymn-zy)hbm;wWt6?4^o@!-@GayHA9YbUnm!LkWg2$P8N8_sM?2H(diyLDw&* zdZkNx(ZP_h?(LpC*?z3No}u#B$XJ>`;|N<*MqsczINkl1|4f!8aD(N;2jzGfILW8_C z!wWr2Z*TuiuaU%C&|>DA-(@u16JM+uf3mBM6Kx88>h9Kp%;Z=L77lJRrIwEga(bFM z=|S{W9GBS;7LxmOewne|Y1!H5=sz5Tl2y#azV*br#ghCW@~HorF&N+1=xSA9zm?3m z<<}&M`!4Eh1zBX}e0zoH?1{H~E}n*P-fy7WrAnWMrmI_8rW%8t38O$Rn}inr+{tv#cnPOXC#xUagM~|G!vk)w-3h4rF28dOS~|%Y^=2$9zt^dOGa^o_XRwH6 z!E3AP2|~B;rVBRK{%DL{x5P^ouv9HFdb-&(`iw^4ut%rj+RCk=sfVtTp#sP5yp_mos?gDnd}G2H`8X$ z-)z=!e@#Tcvr`I>=?oZ@K3QFEWd!wWx5}ZqFt2SgbPX zz?g6R?d(?jf$li)2%s=}Xa7%RjmDk&k+2qXzle7ZSL+%QHc9 z1Fa7TErq|Va9>Ez*}l953rWWjI7-OGIq%@~LwCWiLtoqx@vfNecn3X?q5k#_i=qZj zHJXA6e?w?W26v$m^BuXuT^vm585_kD9`fyGYi|?6u9V^Boh{j8rhy!w3#owTuTq<& zvrIQCv@ih@=#MLiwAS7DONz339uq1uU5KgZ4g&fY-Y2A;&2Kaw9%oJYvf!y4br%J5 z*cFh!-O$gNPs2ZnphF04MCr_VP3X@_3WZrJ*>rz)Bec!`SU75yF z99R`=;!vV>R)UYJvTAy@wxaIGnNgQRLNha3#TMU>`!J8^)x)@x1=jA$$4L8;Q}4yI zy@DL7X4G#PaMdW<6rXweK;F%pdYHnp`wP6yBq;N&z?0vdy}~yWdO0eK%l?T%77L}@ z-)=U+p(4HWRiB@31gf8_p0gr99`^PJ?j@9*Q?nQt-=fRXKiU^^v2U!>?rS`Xl zgDE5Hx~{vPrIN$U&^%{LkwFq*oiPN}>$Bj6@2t=B@Qhj)Q&JGu0HDs`aH|k^dbPp} z8ISeunLLa50sZPoh8b>MJ@d^)Z>`=pl)b_XWw^%iY@}teQibm2(EY;=IlRy!B7{Bm zIp}#*IiA&6vhN3sfeiiAjl>7&>Bl$%d7|jnIFIAXLC9D|_wx$1&S)$)gZ+jN3P{B# zfPum>dc&hoUrMX?-luE1GFCroX$^n~V(q@F)dTdI7&=krLG~`xbu9FxeG9GkJ}D&o z9=K*}w*;)m6X-qJEA);M2}4(xU98XCJZI^5?(*mM3EB8KQa6-Yjl;1^4BPf4eNIFc zQ^=^T7yP(py{n?R*Ue0{FAgJvVTQ??NfB(`L+zA6dkxI80M7gdBsQc5A|{Qafbl@|H_ zW@NWjTl4nPAaferEBtS2ic>|TT*M4e=RjihtPO+W+Tf56D#K}-19_WuzLYcCk7W_w zOJ_cuhSR;9HsQ83Wg4B>XX^X)u>R>j&zU@nOC?$h$IG*7eZMm7JQ_e2V$~NKQOU9= zD%Gqp=*&3#JFq0W`H|EDTv+}0x9Y1jwF@^t5<mC`12kbE zP>;8jWWL#Pxp_Q?$KlBAV;!~T^kK=+Qj@We9@4mN^mx-ZsQdo51R!l!@^7)$ge+ij zNj{Uw<}EV5fw#bSNRju~yc3#^oaW?A=R zNK>`TFw){%lL$-c-&&mw*t%RYuYuJT2a^_C4QIYrdhr+u{yP`G`>24I_grq*RNdKT4H(j(~~5(%nSHC{gFFQKtx@r zf!?>GJhrEjc;?wgSu#lSa!{z7AI+_A=P}6Dd+k;~&jm~PBibdmI3zyHJL6}0zw__} z|At8swDPDj02SEHev2RjQNs<%=NkM5Bk>+;v8b;AF7$xj%29rPjG2`O`|zet+kGbN z82R?mSrevGvD%1ll+%j1j9Rr!ZnM|)osAaqf>)-I87|-n{>>ZkByH2zfD#P$o6PLM z0BnSBbHAeijOrV_!VurBNBOL)B(6~JhpZCU*2`RL^nbg6Tzk1ra>nNB7r$yvDm^Q1 zTjT%s%V0K`IGKVmDpr(xI1DF{OF^D3wc%uzn>q>&?CRfmbwXaFizg{w%7m_IU8g~s z$m~=cHx*$hYCuYb*43irv7BXN|It!*)6VuInzreXk6!(QnCjcM+}E^P{GIeaJ_k&> zrm!(9S-;JymyR|8zf>8tH2U(+Hv*Rl(}26U+@68SrtET4h+YLe{t=xwLQYFSk^WH8 z%N8SCmZLA?Q@$60)_WsL%>&`cI>&0m!^BeO#(#fl#Qdv$*XmVfPHXx#!CU(Vc(}gN zkWc>#hU*j$chSMPW9KSt3+=OZnhmjKs{a(1+-S>_CXy(Ydu6h%-osIS=TLCt)rPq& zk*#a`mIz}9gwKV%UBTRXcK3dXhc%M@n99hqP2f3PJB{jO9A=HF4S{}!`pBm+xJ$*L za$~uEsF?d~_isac{=?T6!l;4DOhzM~x2EuA{x4`9JbuyZL7yq?cMdjUO(O0GLRxNO z&=ctk=A}UZ(s+T`%o_!{?;5LK;yQ?Q)n;<5>E^>ocuC>XFKaI^YPu3hqp;+-t&W== z2Dq!0fFEApJNI8X?eo`L%BOQ!m*y=DFY;{B?mSNtnV8!Wb~5e`*XmN)x|NWRx7=DA zQ{)pNMs(9>X5S{)UbcG+ntt!m3N|U`=-lA04wOxv^$XUfTF}-F5^KL=Q=}mkd|ncO zjNQmXv$}jBk=rd0_ma0_A^bZf%eQm$gsVtf>@2FN-|Ld-?RzV|-jBRiia%uQWEq!; zBot02B=9Fn2)FF3$ij8>erAvqX{=f!o-+d}up~Nd=Izx6u4kTF9@qx-6gwX6O4;l( zZOImfPnk=8n2V_zs=C$t%7GeA4mz#q0rv>4bHvXC{)}N*(X0xI3sgNP&~L}}&!@`2 zYp*Rz+J5W)7z4AGPIp;~Z?{4OlZmlK(@S#X^U-E;Tsp6aJe0=1uE+QZC^`?lV%)nu zROHLDr#Sk(OZ%SYk1|c}RD!587>k<{4tToGk zqToZ?U_g`|19hmAtMzR*$A`^MMj!hcu%uOyT54lM@+r zTsGeZcQgV|(*Y|^YWoshY>$NWB&<`p9m^rBL0Poa`^NYhYzd7~w@K4F<4DI7DIP0r z=@dBvL_}XWOi(E_;iAcEypUCo2 zkI^Kf{T?E8OIHR_aM#jZ)~$lafAnBAQ$xkmhyFOvsUno4Q86fujs(YxqePX#Un z{y;_VfSlTW4}Ga=oT2V0=_diXtjRZFTGrkA42zJyHRvccWsdZkKX`U*iIBcGfSGb8 zJ%DQ#THKuz%wGdAyGDrhngD5imqQYPpsly9Ui<1r^|WM&cIor1YTmtv)lTSq2AEgR zj|UPW5!)`5#nsr_!T=lQ9BvTYoo%PDwt>y)WDG;Nb1nJE^)n+YDDt9rvgIK6FIs&g z2KqOxT0=*i(#x+#fX*@Z^M9Qp!Zg9f=}bJ_zck&0?{L~-l?u6+4AVMie^^x2{DetQ z&E<8$D^JzqaW_HQ0aO1j@BMf}?Y!!k%(tx3Z~aZMbYG)_*}Y=IoXeeZnLZtZ$M_?_ zT^skua6yC*le#dvv38_dD?rJr2#-m3H>2d!jWLO&v0@x|JXofXaoIt}+Yhr32P0Ve zLv+XeQSu3aR_Yq3g;Awr;@%!dpQbQ??^VM0Ep~~9Jty9fd)2|`p4Rv7M$3P+mRoRX z`Odwz^_RsjpI#G#uV*p{-Uo$&4G$t`b{idm4&g|+*!i8D#YYD2C zQ)Xm3DrZ^TCi7e`vy&Hmwg3KB?wt5dm|XqRoL(w7eiQhpUN|ib>>gbO35;({7=5@E z84C@KObp!XA37{5UnpQR+Nx8lqAska8M?HbtOn*iaPshZ?T52C&>YvjKYTBwSp4O! ze)t_d1hHz-(Z%Fo3Kh7nl;wS}k?8ZtlB{jQkzV?JYy9=aHRv0D`)D1D&PTD+Yh$9z zW`|iJewejqnksJC_sEvD^*fzv0E6(5xa3bRg0yO5IYEz=ECQpI8LazdErkf(_q-?O z!24GoyAvj&2J0~JM8@R3!>V1~*7`J|W?hw3ATc0KYPCooAoZm`^9`=Uclh{BS5L== z5@}+q$)@DF$Kn!KiN$lvxoTbHdeTL0g!^<*Cc&e|_N~L+AQ#HfdmX{Edb)Q+k8A#B zF}9G2wh2_X1ex(&A^2ECDQ$&Da$q~M&zE-xkHx~GF&(r?<)e2mv;v&_AqLtDBLPtR zV(7Iymico(FlN(DfoeBwRSfQ%-R)P{!7yIUWo=AOE}vJQ-0s>s-+?QhB=vh8mtJ@8~S^MdnS}Im| z`~@~n)}cKiE!9pt`iE3abu}Z^T{j^9*Lm+u&vWnJo>1^nU$8`mrhM=z|MC^>02^K! zDl*TQKZPeQ`%}fS`6lKjTWA1Uj|_xkL8Qwp_auCtF2xZH1RI zuzsdMGb}cGbLP@y5;d2!ZoK-oTW)V=DxC|^fJ4;hm8(_9;ZRAxZr$81{uJ|PWWgh0 zFze1Q?)_M;h3q|{St3cZsEolzgipOv(4(>gc~H(Tk0r0O;=i$dAY50I{8IZB)6H|w zEf->$x}*epT07L+$qQ$81awIgv!8ly)9GP%?0 zSIXstw2)p1qw^TM?AM&YC4roOjz|A+x#hL zQ^Lol370(K@M6Dq3Jm<&^?(`FE!QxQW;Se2x~?v2FDs}!#%HB{OiRt3oc<*|4a!g= z5=iCOI$2f*uFWgkYRJ6Rr*T(n$=DGAqLt%46_DLwNws+?tEzQ=hdj~TrX_#V7<{>b zV79H8H5q55>aWze8d#k&`#F!-2x2De#I$Gv%?x)}OQ*-UAPX4yH@02VpM?;_-WU67 zdjvh9$(4*D+YM286YWn>{ZNT464Sp$8OAv2um3kB^5pqXt;JrGsL41kO{mI#rk0<_ zeOiMttuqNcSui_NO=z~al#qC>vCGox(ZV4$(RPQO_stxCudmX-%2HRTXKrITho_pc z*gRtJCgMf~$H?i&>{&(O-#_65)^DG$j(MjhI`QopQx?v4VrE-p;x%t(T`&x`*!x7+C-#^UZbH|RV zSyE_M$JK*1n~^~uSRH_Yat+f=u-bjcg}$8qx=wSpYQ-NGx^AjE_Xvs7MMYz!dqJR6 z?U&31=q`^li#%qR7 zaTtKIo5zYeCFEa0}%>P$(5$9|TaU1lFqzI#Qr`3_Hv#lYX?co*=l#jEq z%82sWEQ5T{pF=fSw1&vZ_T5#9`PPuDVvqSd=*XbJsiSq>DtrOl$`y4f>~NwdG_9|K7a}D=+8e!0E?B@t@fpxA1T@Sl9`t;+Rb_hI%Iy@Fzy(|5@{FFlD| z`jbe6efaM6iU!r6vXCvYB4pqxUZ$i@@U$v<;o>U-+<2i7)R{zaz5N?U=U$EI@?5(F z6&j+dq+~qBNcXs^!2Ut;Vo!jtksZF%ERIm9qtgJ3$9DT(mR%|%&)Lsd zUgduOrt${YF`Q1%E#xP8pGg2kWP~aj7hW*WJ}DluO!|`WC>9Y$I57BiRZHjfwm3*+ z5AXP6Z_Y5rdAE|orQWFr6fJ}^+tJ#G3&jd58`nSbS005<1dAh;^!cT&i0naM!>e?1 zZ7Y^(fOU->ICfET8mnC1Vob&wC5Xv+CT>z&XGBU_3}Rc*5`#bfpp(P&Vwdv)y? zA@{qrE$i38#%Yt-ZuH9^K5suVw9~0d_vbm_Bx-VNu32uMp8&Jk)$IRsl{-g2{u!`_gljFrE`l*|B7fE?31MCm}%F7ZbcL|hP8W9QwZ8SI z+qiD8Q$6R@(=FE7y+mKJ(>zK5>dXM#_ACSm!EGOO0;xON> zA%F9fIJKWSUR6AxbgNtNO#9&N+~D`QXh7Y?&`m&$c`~tAq_G%8Z<}Fp(KhMM*X)lZ zTK~>P>{HAI1IY_>0!(#+yGZ&iCo(Yh8+gM}P%@u91SBBwby>X+D(+sE;BO;9A@}i; zT2#_;ERTZ6bx(0eAeWnEV`#>~3uLhTPnhB&2!{A6r(rqrvOp_sZ>r|pn`~l#b17sjp9yA>N$O6Z`dV%4CjXIbuUhFlb%l;L zVKf<(1Y(DT{^qC+;p}Ty?f(bcKqSAUA+iE-JjS`c3a|lh;hL179Doy2b0-skKkD%TB(`$`>!6B9xFbZG>?O zumUGZ!Y_FuC?ODqKwQE>2`%wJTt=w(8#ENjf%gQ!OIrF3?!e$~x8@j6mmG(ABp&!i z*$5r+zN``po-G2>f&q_%5UR`_=MCu$Y)ECR^p}TF?h|sHS+q z$YL^07L$e$4NzRdf!4B z!9v%dSP1Ek_mzIhcH)&QRrCeMhg~b2Nqd01<2OT#i8i*t3NDMuVF?8J1fPTReAw^R50+B!OK&b+>^0Om6=jfv?qpMM$%M2vf?#UxmWs14taW-$ph z2KO8ffUD*1{kyeENs?QF^2l0LFi$~u_2nF+9~<|Kdn_@yW^#5(ts2!_xX7G)0_G6j zGA$;l(D-%TrCLmi_?&z^TlXVaOd{rzzhUZ*-W*%A5K1tq?sn_P31UbKI8c}X_sZ3R z@M9CGW2<>)tYd<}Q945)_-IhMXHwz{@pEnGH$VR5bWCl^jFc7vaU6&Ha7`OC%@gB# zpIo9)E9S|OTh>!t^CXN&L9tuzbI^t#TPUG|^uZ>LYpV~kARbqhK-tn%Kl33#0HisH z;&3{82LSg64;}D>G&$KjxBQw3xH;|Gt8;?DeFh2*kC^%Ar-y)0EK;rU@!hHdUa^3K zXI$2b7AWc&@D2f$zVuVzo^j5+!@8n!TCW;+@B3~o%#580fnPENQV9BSYs8Nrm_$@5 zPMhNQ$I>$VLbHfK5e|tF@bD86r>OAEzuyLdW5%%}5;qyE>1G=yAwTIoIR=wNCPSDm zxPE>w!Er!v=osPpEwy#QLvas_!$BY+fcF!$h4fDuA~(^@K6p$xNEg@9%XB{_XNuqn zQ_Gr)uh}6%0o;cJ7L%i8UVg3+5bnTVV&GNyC4LLfj_2et&Soeclqk#vA>NODrCzN0 z_(lTCPhFQEyX~3fWkMi=Kstl^2L{cLAeclo{-I0zcYn%CiG)*>_WpBn_e3xoP|t9xdB z{x=9@;{JbwUuNn|2>efCoaQsK`k06-* zVxXN_(c=k$j8x{C7L(%%^`9p1jBx$a)F!jkpA7^OI!5N$|Jh*XxK$(p<&?v#@H=kh zW@elTflLVeVj=Le7fjfJiR}Zq#sklZ@A#hhj%U&zONipe%F!+F;=iNiLph0Mh4R^1 z>{vp2@zQI5dU>T6FQxnh_$8)KFJ5}@64Pb$oX&idepFzb{uh6nahr}zMST-Pdg&A6 z@EqD2|HixcFa9mP`^568&9RnGen+H_m7iXD@pqw~iSH=?`v$fL{C??${e%v1#L}>Y z@9EW%vJ=avor&*An+QAJ5ih;>d`k?8aRWTVH8FnTb9&_@=9!o#{+yUTl$-cIo+jLL zzRIz}B%}#f^3SNAyiYIRkoJeT9ywy8TvO|nwv_bhN*-!Pnh@ZZ=4A#CiFt;!;hI6R zl-I;d42+%h-Y3T6IWb-+H(b+86W$Rg5l7)2*KZ3RHz8g~|7~fH>3cd=;8pmgmq#c+ zvHpp83TYGLh4kV3(XPaerw`BJdbG4D-xAtL+C-eB#7($K0KL~Gl+E>MfzOFB31xp< zTJjBX<7L2qB<30ao_U`Mfgb|`KZ0O#3>?T&TAD3e7M)mog7y!OwuvPwXPe~E$xC z_xwoDnC5#%fp}qzkwG_t^ANaq~%JP@$%!};`g+Z zxQSz&w9p-{M=PJQIr*N`%0oQro?f2ua=+7kI>6&q_@$Q@XNAP+rmE!igBH=IfTwVc z(@k%a;t)6BH@z}=$9JcjDlg;}hduouP7@RJ328XEIfRt*)u#eX!?(mMap|}5@y$6u z0r%O2+l&HvQ*7dRh;WzN=Ype^PuYohj`D<-XwHg_v5e}F`Tn;Gfz69I&8FxTOPRnq6oq0?^n z9k7K9SNcI-Ov336R^BlQZ{EDamakan%nSr$pVIEwu}gK>tpk;IYft^;{Yn!m4q-W@ za}|~@TVu!r8oKn=M_w(%(@R z2y9**zO_$>wuQDq+zAU7E%B3)bLNcF`^(rL;&WK%Zk++l1=)F-41*N{ivym`D2ut$Fg^q*xbR@tJZ z%Rz?2I5Ay_o9;Dj73t!~9DF>f-!EIf*86l|IvL}8_U^Yui&lAFL119)F#ZnfM<6}| z3FCpj%h*n@?!05%gfYfgAsu-!=6&32{O{Sb|ETF<>`5ESp#J2$Wa%2wl)PK|FEna_UGVr7Q z(B#F-geSoSS___n@B;iuM?Jkw+qQdL(!_<>csbky8))RZ4Vyeq-ce>m_jlS(^@BLw z<$FAYz6af;j$Xd%wt4F|?^6LEiSXk&^d0g)l)M!-dG8f{qx|hVcIaS9o!OEcfK|wc zD{Z4+`gl5beU7B*S`q42|Id1P)|ckHtQ`E&VThWaHcJvww@qHVAkvf_V<50VZ{m;wyIUjt7Z`BZT8CRZ>Vh>ZHb6-4V^Tb zBL`YAh$@<3VnssGyWKvrnX~5DlxfqgaG@f0V)>#fceQnXtBY;iw8d770N1Qh!x@?=SjkGF@W>2M_alLR3Hg^mCtJzwAHI3Kl466)KdHfF%uOGVC0H zNBN_9*XFG^t5QsYmlW?_-(*yi$379^?AfGkq%$N3;6d3C&5u9-(iw~|27V=GWS{C) z$Hq;ZV()$2OL!9Fp*Gd4Q$vj79_#-37xr40kE~s*lPrI}d=dtB+beH&vz5YSzriEa zZ%(wLMGA}Xaxh<19%V5(Et8N#+;tl^+l<+Bt!bnBV#-$7v#-6Q=Xo}I++-UuW|E!U zqN(Z|F-YVQ>biB?HhcMvckQcDrmlYBBnNa^yyXSQI;GJjvAS|!0Szcaz{@@ebJ zRcq{@&%7exakH1rBr|Zx2z&93ZmQb~l|8{~*QjcR3m5eI=S&uI=(`A2efkZyfx|}G zoCRX!G)dO1Ue)?3{iJC#Z06jBg4tAS+OVEaW`H@etfX3LCQhDV4?Om)RV-K9Dp#!F z6JGxz!)?Z_`8ILtOq(-rfyP5!hZ}7U^$$2Z;;Q~hA3Jd1kY!a}X^*<9Ye|*dva4S# z(6}#{JBt;~7tw(^bwC9^}iL-%dQSWSYK9I}jdFe7xG}4UPG= zHeu3at6i&>AENfc%dgvniIZ*mjG3Z0U+O@`hE}Lxo|Lh#Y2Mq2;^VW=`Z%3vE4q_A zH(GMDp1r@YsnciL$kAg(w~AYtGDVLl9|2&Sg#S*WTO&q}vDU3xC_S`bzWwVz&)TY0 zt8D03Bdrt%x|J*L>2pZg0{kOwc@`TqWSHQ^K|6#45$3YlL5&KcjweQ2pX-jYFqp(6Hp;AC1TC-rq-$pCSfnseLta zoHcLS(3$t=UVU5iV7-l>Jl(2QKGDb1B=yg~{Oi9~vRGlOR;7~nhkk>G*`Tk+*wmSG z#K>;9y0vNub|`$33!?eS_iw!Wkgi2B|`PrhVL8`QQE#fy3Q!$*%-`q3JHGrccWuUgr!p-j@jFr#?+ zSaj?4cRsSVt(pnO`88K_;1 z9fh$SId-Dn)pfc-okRU&=sx0>IMAg-vgYK27P6#b-H?wzJr9jYF0#auhTmpI4zqrZI%@+T*%6mDJ@0PQhQ8v6Z%Wtu`o=T zG0VDr(%Y71kQM&Ynwz1p6h{(|xf+|f>imKQs}E5T}=jh{44 zr_fjNc<-z2>qH-WeKFYQs_GgONA{gaAbUya5z3}%oHWwhia`2er>>6s{)0zq&Z(j? zR=~@Q*PnJCEx?lnE8fxKWq$i*K>*smGikpS)nT{ar9XV1Rz_m>_epuoX(B?NO3r;w zJZfqht??&DtdL!Q&6QTVP!8)oxQvaPFi8_<73=fmKzpb2vo?MD0=wjvKiTY&{cZmI z1)BULV#S1;HCHzKyjLIV(6)`8)vl?%^3Ep)gMGub7fKs;*e3>v1B~IWT?eh}2OrzN z9(hpjv)YL*&h!bsb*tu9w{9H~#(ef+_ns22@@sN1O(;=%8sP{M#?CtPbk#Sf7@b3Q z=RNn^B^O<2O&T?_7AG~c!cyw}>A@$(>@KsWO>2t)L_|I+KZ|SV5Neu;Ax=t4QXQ19 ze(!esz|KDNG;4oSUE3viaHt!^9OAxNLQA1S1ucL6Y&Le>3^BK>?YYP9x7Xk6Vb8zx zy1muuS$n7J`}X_mudzlo%iB&V!}ssUbgX>DOzleAWyOjW(PV2@zI-|Rzk6@7JVMf6 z{`G4_{=MB+gYb|uy;P_VgLN=-D0+KTd@Y`S*zwvZ2Qigj>l5PiwZ`2#qgA{L1NTP zmn>#CUU!9nIzSXT+O?cU>xAe(uvI=dr-(7W)o!YLIG-&h*F?3?C zU@X>&c|rIpkUyWTSiQ!24;XImzWS7ytLb+2pZ;MJzo_Q|Qtn)BU3+}vAOGqMOU-Ik z+$YE|(@ zr1vLkUYai{ufk2Zrim3jfdA7^?V$dhOE59J_0D_j>MJj|PkZ#Tv(7lxPHEG~8n(aK z>eQ@Z)vH%?Sk=0dyv&Ij$Y9zE^0Td%Qu?!H6c^GY~aZSQ~du@zO@4;+YGq(b^!N zB-xs^Ym@6#%==W46D0j5hjkmaI33HCOTvm0U3bkDRz!!YkDj`~KKSSpJF{&Qd#}$I zR<=wj``zW|8a;BC>VUz{X$r6QE%H(+6uufg(Vlqd&z|ia_y0q%uV>{-ml7=Y zX&iB?_}4ym5PCL9Y4hYG_uH#)yl4NF;M3{3$L-eNUFm&=x;*)OCo5Z8LahLR#YP>+ zueb`qcy1N0>eZ}jNxODA!?;(7dSAlK3s3ybwbxHP*U3)raB>>hK{pT*Pxe0O*`+*4tBDXF?HKtVl~BBw?Db1-FWS# zPB%a4`GpN1J;4<^SeZ6$-m3X4y9;!CHL%`#|1*2^{y&PY<+GxVMN3a=Vkm*mKkF2y ztIxjlh6KD(cKL*{9-{^ zAtlsvPyF59?D~=Bg14;8D^J-B(c}hFOeO8w?XcUaISpa#k2hayRV29H_t3v>^3)lk z>&+ZL;2wGg)4Xi?DjOi-wX5jnNGX2q`1{i~rgvStq~keu{@JIwCF?1*ze4#kqVuV1 zt-u{Hq%5q-Cp8k?)R?31GH3Pta*&;MYFmfjl{eq3dF6Cj)$*h$#3I~F8Mb1jTUP4T zgeFJzKLmYOA9&<}yDYcn6}Q$2-$95aUJ>y`ScN{6;-P$*l6I5Ez%3dh-Fx)4Ki+zS zU3*zapVtwZ-hTg6JGFfqhfU}^g$fpM;r2c8Gv}Pv*85AHb{AV?2__phZ?@`HD%v%d zUns$5pvvfDf4S%OG(y?8pgZ&PZvq0bfqR_VD>n6bhiEcRosv_TP%k z`!*&Wc1?cA3(l2QVv(KH1gnKv|3O3SjFwGgIay$5p3>aTJ^L(Y79++%6RHMsX$dO? zG~;M6C9^m~k}uy0BFI@y^SfIL%1B#QvSfby?DJlB!#V9-ORFSSyjVWnuW(J)IU-n^ zKU^4y(no7L$R7jFYV=Owc!L28M#<(*-x!;?)sKJyRnBzV}#yOm?yzF9!Iq{Dr1hj^0isX@)SP@dy|1uD#--$gem#4@~}O)d;wDjGZ#u`va~M`6Xb$*yR^v zPrMy+nL^_Rv(rwNE(8i{RYXDw%B%4dpYQ#E07#vgDnn$rT}LjkLjy)i-AQ&Gn5{oX5YSVtX|#PcGVT$B~`hF=PB_2-E!%duuyDiGms+jrRYb2u*cD*r3gpi#9Od;fv_T4-<^mg8_7HQ1m8ibab@m;uJLHoS#0RIjhq5UWvJiWd%7O+HIcjZM^ zszg!$4i3>~Uw7I0(q?zD&qPmdy!v9nKEhRiUtl!RrjtIm=#vM*16na*+8pa9#&OBg zWj;RL!XaANTVwHcSq>Pp;0;&X#trI;i5z6D8`W}`tl%DoyX(ktQ|z46+pC}L_x}0( z>s_q>;NjjcR*BIsEG89NiU4!{*)45>ED+G!(i%$y=HF>E=SdKY*75kuZ~YTt*P}Up zW6#NHdE>u?PtLTflj9T{eGeq1B)x7Eh#fue{ zm3y2l$Yo?{uJ8Gxq;cG9&LFVsS=r;O%i<`iI!umnJ;=jwGE>|H6!Cd=B!yai0SV#&Yn(WiYJA2@hG?OGzGRU3~7 zt=y{dfba?IxPGoaap?tT((ycf-vLA2D}ebA7r{;H9|-JU=zWtqRc)1AAGaxw@=~xx z?aOK7rpywJ+wWr~0aYF+^UrS;0>{5Mq|TJb4aN~86a9?}iQhXnpHA5fNC>)Ui!1=I zN`u#jZSpAvRA{Y8hc*-*fHd7c{MfpF+Rqj*T_!D3 zA!oQJPnlywhfS~ngGSr(Ra=~)DN&-h4U=}WxXkgFU3`I0P~zj2_g?GT?L)izic2-= zV0AcPqsC10xP!&CZ`im+WwB^p?p&J4A)c3CcA;B0^5n@X#&M;6(ET&}!)-T<8Hkup zh*Lc9EFMSNc=VI00bkL60|r@{(xvU~uH9_;^3~q1!qRqkdj2U9=z@m+8uuN9n@@Xu zZr5CKnKO||(&$W^Ion2!8e=6(l(5%2zvb&p#G6_TX_=pV>>(#|lqQflvD&hAtFGH^ ztFD@pT;sQH{RU^W*R5ag@e=EvTHCaDp@rd^5uP)84<2Ex-+J$3H|3wwu9f4Yf+h=0 z;J8Iyd&#-3@q{7RC9N4+P0B;#ero&HKH+rh{<+~6QuV~L&fLwHWom%joca$L>6Q-q zN(s4v%oLNddd+%i+pe*VVg}Lap&@KoLQarr4j3Rzc~BFu$T5Kp)r37oX8s$mz1-^VZYU2@YZrZrFV#5gavKiu+r_eED!+an=*zhH(-Agw^KW{p9o zZav*4tX9>EYU5!sGuv&@;4wb-$Bm!iLIh0e#!Z{#GBv{PzT;Mh{Xv-#;T5}o(o^mo zRpkO%PUGI>*0kIh^FxM?my6c|F%pqWRb)|!)&Nl-1RBQXAPI#qmxVN5d7l^@_ew_J z4Sj=haJl^Btv3pfNfIO;ksz_$g%iHr`G;Grefze;7hUZehtr7B)8vLW)qa1&wO$T+ zMRhvtbdhq2OW%3=UyrzzNlJL9CG@p*VuoPQ7~{~}o$_z*{>kUE5*4xj0|(o<@l#cP zWMxWh!!bRli)%WCQYU-^_Xs5j4Ijvr^X}Vz=K?cY>MdfX7`ONS;RYAP>CZF}x=Gs@ zdsXDJiR;fxow~{mtG5d_^gm!ZaOg-IqCP!%_-G$D?v^Q7p>4kPhAXUi(L!#qfYBSG zIB3N?$a1((Zlt(2;odk{!v83_=myIh*2R>yWy*`WppYyYQ)ex-5o4#g5ti4Q)JyR7;JR#{h=0K{Vov3R;g(UKT=<8Ko_(QmOjARIpP$~$(a=oZ!n zgw3p)d_VfEuibdfrJ~nGeQqLO=w=qtF!}->1TC60kWkpw-V@#5r*H#k4jLb{xHg1+sKTI@0)(Ht4>EWNcQ)l`Pprzj<2tIJpFc>4FpC0a;LuSHC*~#;OSt>t-d963?__y=pwxnAIp>THcKh$Ia>Xa_ zimRW^lhC$k$#T0(7N+%b|LP!XTd#gY?0vaP<1&Y9Z&<$ryfQ;31R@9|4BX=Y7LA(Y z9ik2$@7D4Aj0P>W5{N~r7Fp=$X;<8JE3?}pfT0a33hpX7d7oOp6QE1cA zQTLPkS1W04ShKNrU$nkrw}>GG5kZJWuX&}3oiK5huO)flzT14l$GWj`BNKcNd-%cs zv$CZMh!7pgn9@!HRuVKh5Io60uHo7&4F=lO(^@wak!fkuWbuLN$(}u{Rj*vq8C4jb zvSrFhGvC=NSFU8WYE_oc@LCtJAfO#DIM2>*-%RHGx;A~L(hH{f^5wRw67mQTRCx|b z$ZKTx-=T@?)DBu}^O?7yO678PlU&~(dhh}JP>jm9?GWT>LiNN)`4ey)t{LJvB|>Uu z&X|g+N1Fp-|HDmUxHJi{Mr6|TIW~OEM7epLZ)-GhqCI1hM~Hzaqd`6-4OPYRa!>o? zO>+0CX4lBP4YR^G7O`Xc$48e*1#J}C*LS6%yjCV`7#OscXdcH-m?G_J9&6dGvEv#m z27bV#->Dy(D+2Gyo4&_AS}R<6m=Gro?Cy+y4_SS%w$Qf3z+}h-N}03)rl)+_GIHl> zWq-c&W?6)4x;q(lMOea3fkn4yH_OP)W7M2%Ma|M}NH`7`AL=VJWcA2rtu^Lvy{4nxe8bgJc=UG|&@U>A4q?STC_io#AM@sG4brGF_VC~CQ@gRO zP}k%-k*9u?5iw3?)hd-xJQfe5z%i>-Q7&65=h25Bv`x9`|v`vs>{JG8Y^;RZvlQ(l00s|@fvHPwSc&1wvwPup3skgd#?1eVq$P#=-f?~>T2pE6>NnR69|+j zby%YXJwRB1xrVVPUDB>Swp(z)2eD+`OBF4V+GjfxHnX z*mbHWZlJh;0*}rTEIOWjiuzs)l`R)Bb#(d;E{j+buq+gp8}H=lb8X0oaZXE7#t^T0 zvqpAMX_t(2nL4G-N$g-MDH*tBp`24e6k<>wL#~KE1pj*s^jQc>h zv5LGWmpkU~HZ7ak!X+!*f<&I5YK_h{m!9Xiz#2kd*(JOuNkHP~E`5rJg@ZX8+(JVU z82E#G-(on|jQ`H&4BHPPKv zd0!x3KBr^Uh4=`JPrmr3-0n{G`|Yy&^X}80Us`D?aIoea)cizR`mXmK&55)Z%MZdH z!Vhj+d`EbxCKtLt-TphPSG&6A%nMv#1%A~1m}x%%%nZMB2*d{Nacb$0Aee|!CWJI^ z(mX^FBjzNF){xAzsanj|uwg@+Cq`l8#@$v)%=eO&Ypty&{ADXQ`{FOwootsMG}`{n z()MrNxCm5R*5ctr;yUzl$(U) zdLRD;EFk1-WvS`iXmg zVWw^@Zol+`v+WAGU)9yR2I_-Gi*h&Xhl>S$k41%O%m`I0S8$E1Kcw>qMhH_p0up9+ z`af$&aHZQUzwmjBmiZbMm@C4dVI$pIKz&&7J8S7`3F$55{;*Q%HuyUhHnwiwSbgr0 zFKA^#VnV}*9jzhoVM2xBVbZ32+Q2<&UViI+Yp=F$lXh|0iq+oEW1gJoD4jpjovTSa1%PB$x zi|(0}Tgk0$*6cZ6Lg`XPeT~AU7oQ>5s#DyB3M*$NY1rv6b!%0y-hIDx0iF%=#*P~= zt5g+}jOO?_bm$waU$44dqA`C_$5X9E^9Je<+6_u@-L`F);~h(*ytCZZ65$l$TA@OD z$CbJX1SCysf#)8Xd#F48W~+8cIwXN(!-nm$VyHjJfI3wRl&K?SA-IelH&Ygrl@f-s zO8XhXiOoKCChZZNHi!ZJ+S|W%Ym)kt@)S;Y?@3(~H%Q}t{f4a?V_95CU$bV5?G}Al zxpJjzrwbO4Al|&GcJkB4BC74A$x}r)$|qJmO*_8zA*I>TP0C;0#6jX?UyRUO-9FJ` z+*)n{!@`LWRaL?`c!F8&EkAyQbu1gKslf$hOLE_Z0pF$FlyLXu{Y))juPyqBQUI69 z3(q}6?lxyREn_VMW2db&%fmF*ONd#Aac4ak8tKw<2ShM|IjtzB9=d_64r>TtDq%!X zWKcG{TVZMAnff9SmK1|X|3H~RzmB-^2wFVD41yohk_Ysh9krH=2D?&Y>I|zaH%u6I z=ABt{=i4}0#z>1*rl^!HWwbtpwSpgf_Jv&CTDyX6ndoJmTGf5r! zV4fwSr5ZdZiM~O@27EQv*P=j+PAp$mb3l3fSPXg_t-Av+#~xCU?KI$MG$W3CUBA}MsrDh9H?boedh z30e)^D$H6BaDSEDzi`p5DA(4Ra*sxt!y3kQT5Ci)HX>P}1?7x=ln=C>bsd+;`gGBG zXZSC&BFV~~OgF(Da}aoD%@GzqtT9DI|EZS?r7;lFZeY&Z8S3t1RC78?vn9)x`+S1S zVj;PcGG~E*HUq%oLtuVHkfyx)b!%$Q>Syg*HkHM5qkYtSptaTdEOu06O%e4+fy0`| zvD!F>zJp+o#iX3pY|-Cw8Ez?ol>UetV}p9N-5sr=^3F(^cI^EjGv==k0<|MRu>zk9hDl?tD^-XPm{VZ?$SQwTN}QyK=CmW4Z*3vhr0fUR>^E(rQAmAsV!k$*X7YKDJSAU=YK_ zi-Kx1KW)X3tq*AAbCq&6qjYeWcMc zs>$|ctr;1?z%+8=i1!rwj~Amn>Q zsMoJsr)?is_^u&r{mBj`%`}nXn#C?u=bzcZHGJ&k(o4(=)(v)QVJ92>zu%M_*kBQJ zh%HPB3_tE(XdL;$1QM9U*^07v|6wllu%jvR|sc^zrW(`?&jVD~RmMmQ=Yt&a( zOG4pUXSSD+y+!N7K3C`ZM)wiYkh@J)+OC=?KKW3c9dh>^5g#NuTM~0 zD@vPwNMmP^Te>c}_(IE;E31?s+tlBSTiJ4@L?a@rQat?urDq%BB}>$AB+wL4AER#2 zlvZ*vov(EqgT(C3)!4u0s>?O*wIiJ9PJkU_AK_q<`p$@vqa3!g)z;#|DMEJF_dayt zh#k4uNaOHfG_0nD_*gSf5N)U|1;s%LG3#x)#t0i$%+jxp*0JG|)mv-b+*g0;GH+ky zO6An%!}hZ12Aa_d+T{!D2n*g>AUt>8Jh`i0rnNeSC5TiMEs)FN(9zChb?kV)`du{U zL;d5pj^79TrrDJ%Htw+!&@aBxcnUiV#?x~T9vSy@Bvi1oR#}bZW)d_GN!aWuDt|~WaJh0mqOcyRq2oH>5tg2{{tClP2YuGky z+-x^rce!@PD&PtM1e5C3Si7PH$$~fIpDk3w_(zkBFxg!TgpoL~l&sh8i7d1}AS=aZ z+EHqPcKW*b+|zu=B2hjR_*$i?Gp3<(W+uc{VqJ?tbGgrW?iU zYko7|{a(>PE40av!-vVH>>+^*Oq3|Bn*Bx?q=pu%eI85$2b7Go3kW9$4YM@1Cap*oj;`1Y5@@FzE zSWxFou#h9J%Jmo#v4BZnw=D*JfdWxnh!V_zXxdQ&gEpJ2=%JoORyLm2+m&3b<~Aox z>D3|BowVeGO9pFFNW%nGSX+A?kY*FO(4G+7#YSzC5=D&0-ee66nq0P$Mf?1X3p<4h z*vL4gS&Zwz%9Qg%D zwIw7cpKY>i<;jVwNi<=He4{odZ;vQoc$vx&h84{rez{CEY-NZb$3#IK2so1>KLV3C zn+dQ36_W$+6YEb|SQ7Y#C5kP1NymGbk6_AAOc(0Pm2cF6A8Q$ye5nhtMr#}S8cV~i zI;WQp`0zFeucT!c7}9f&3A?o5u77x$YL!7r6Tpl$@<J0+ABl<*A=*(Y~ZcK@P2+js01 zOtdyC87Aq~KdMFQUuEm~oxVzzUD4$;YJFpBis$G3LSvmXS`Let<&!z;aB{y0IS_|2 z?(O4`8bjYDFeYFeu@*2+c+b1gr$gVx{Rg)l=mTQ{rZP_RLRnlX3q?;}36}I(=mge| zEV|EVyvEa0HuQ^nM`IVEBS*AeL1n{0Gal1}9q;(jhKO!q*~+Rq9CXVjuB*IfP6}}; zo3i+&N4Ekz0aFY-x!M#x7 z0$%@+o~yS_O0NQPCk`|rq^C_-b_5ltLBx;Xg7Q#!67E_1MjOG6x0QA!(@hrXi{$!z zi9mz4pZOt_AIjlMSxz@q7X)1dQD`iA;u_}XiNzD7bI*7JUxZLkaF5F$^ANVwc%Rw^Tre5S^tUy%9P5wAr;R^?V4_8% zE4ONEyMk#N18;pa!Gz}0$>SjmE{Fh=C!d)N7^ESPCdA`i_ym(3j~C*HD|s@(Xgq5o zNR6AAUx=T0O|P!$y-Q3Ne-80O{X^NJKO%J03F3Anfg=y<&#qg{;UQgU6Up4t5r7dd zRQJS(Nr~E?40EMnGN){qLh?Eq{1UQs+#r~IF2Uq<1QU5RiO=#fh)Ww?FwwTo*;KEz zn2vG_@CbR620|ItHS(Q}*D16+#OE7n0)r9Y8oq~XNC*C523bt0WDXZ@(ua6Roq7%V z@Fvuqi54a~{w*~{>RpH*>d15C+YS69t!--Tw0Gc!iH0;xM6^5P7h;Bd!*k*_#1HYp zbBGt-hv%bR!6jC!q+O9&)|4>ix zM|VfCh`;xT*q=}i!g)MycpvhMB}wj@58sm zw4topAs2-%_TcBItb=*g^G@_C5dPaiQvDMux82dwgprJ096e%E~IU0YV z9SA0Sf?xuG5<-9_BT0}+X}iNTndyc>3W8>cABPdRCw`!X2}Ptl5+{*v@-e_QCE`(T z63dVBGAEAg54K^YO+6yhdc`OY{akC0EeCdSR^IWd07Q&3HTX+~*zA5YIc?RLgc_eTpM zU7T)(cSlPXa7p$N-AG%{01w&`;>Pofu$Z>qsozukjK5p=RO2zE+vrWXo2r;T~MTW-1PFyD4)c*o~IAqjD?DLUh(wdKFk^MI>pm) zAL1sChwwfzet3@Kll!Req+$VU3CN*rzJsUq!nc)^UYg8zzZMA4D^mN+@o3eLAeclA z_+Oe4n9*+oK%$0$fraKVa?|>@)Y13jJ>aMlnn-AMVERMN_=ekutiUcHQE!xH2p9B& zjOs?a`9@oVz{Wd2w?yt>xNyOMWR#xr`IcVYLK^CeQic49M*uHUV#!>6WZr?GDM=K< zi|`z-v`hEteWn;E&bmqb9_kgc35;|6Jrh_?`Pbr_6<`$Nr+1B~P4D~ndH28M`M;$7 zwz>jyHf0E90G}{P$J0iABH7(eNO0Uc&LYGyu^|A4eBx=-+*4pYBtFN#CErI%yvRxx z&p!w%AxY?u@i@F=cQ3|I5D-HA^se!=>3#n`@BWuO9Xt%W;}il7B74S}P?&CjrZC2d z<3ZQ3#Edk)UhaEMQfeFjL%!*h&e)IWR_ez@n1W}rh%>9aW9=7LH1vsSQge&$zU_Nr z{9}3kU-SGf>Ay={>W)PrFulNt@f!~zKd!j5f+t0DcsiW*3|?G#iYN4YeT;{6`Y)Hez2f+__(u>-{5tRuSa5ihjct2k zyGfd4;x@L`*fttF6FZF?+qRuX6EwDU^WJ;j^E>zBeA)AC{U7Z0taXO4lXooWd+lO? z9f@9x?D6cuwK4pnHgdS^Axv%L-mJ@LD3|WSrx_jE+`|KN4%%MjhRgNk5suI$`wS{7 z_va_kc#RHIA(rFc{aZQC&GM+J|H}n%k*V3J>VR_osj-8@a%;c&q&cTWRovL= zq4Fen6Z55p>Z*_P?Vvg6lV{%Kkd%d1^k2&`TMo-tFu)D}mtUO%qaZAl&5~d*OhGZM z{;8#g@=2~w_BSX!IkE@DujGvtBp4(^5AjRk;`YDg5sW^|^^ych+%fA|jz@*3BCsYu zWZSK3tzam&GrV_0EvD7ZesQ)8JT<~C;r#I<55hSyY=8hzKoBjFRL;_7*At!nh5Gat;@Z_oZ#kT5l#OZQxx*CC3fOM=hLfexn-8iueRu*`w%Cb9LVP$=LdjtfqTOG&Zq z&+}9O*|Qa5b@cnr0-{IvPyBh#%ZIu9rdyKRep#_pJ_Z;Oiv%}3%Kgswxcl@WWs2D9 zJnA0p7se=!4WwVIwgvy$Dw4U0;G*;{OhI7MqeG4Zf0BS*pTTzjUGXJ?+ zuYGm%_&TTC`!Y~eP&buDr>dVuw6;!Qw9%r5?KIAPlQ#E!V~p2T;vQzyU$efjb?9K) z;9o|Gb&A~DxjkimNdH-z@5)~$tt#ywHttSD-1|gZkmlRlMwmW~CGs1)PZl0EZYLiY zkguHVZzmv)O7U#Mu4R!4_7USCmoTX$ByDzDDl`QXc@;ONNSM`sz=VA!4V@o9n;DNL z5gB2n2>V8SA%}>D2Hm?N`KU?Y`?=QQ{$0c`u@I3tWg{**j*V zDG7vWf6=E$(hgX}6iCwWhUwp;)@Ju7&=hXc<|wheG5?AFKGL1DfZMX~tI>qJM*7&{ ztf&x3(u%>GX-Oq$ii)LR%zn-|%i<JZYhqI#d_-Ilv{M`A0sKSg5BI?A zKw6v))9$x0ukUxPGK_wKXnPLPg%7s$$79pm(dlqHK)*oHlwUa@6zFX#&ypa*XL=Tg zf&Xbs0U6~zCRuis{qiU6e*95V5TheqG{-AH37Vu$OI%QD)8UTBig2f8SpeS6oH(y) zX;mTKy9w3)dv_Dtc{Q_uw{$qqnlF>Ft{Uez{FO)q^{@J&2HG1kQ0Q-`o8h^2%Q=1n z&9Jff##0R7%2M0e^AOcve+HjgBGt}-vv~m;4sl|Q+I_NmKT(w+9=0>SG_tIn!U)81 zgf(orCUjfeBR}^)=2sDG3VHWp{tVTdfPMZ%ny*cNLnNYxARAhIe+##L{D(MO;L+$D z=5}tIcNRPvE@{P2h0t=1^2*U~j|g>ya!l6p^q)R^(->eZ%EK&ox}v(?`T5eLCu4P*=c`gM!BM zH!1gwc7Ue??PNscd^Vrk0_iPG)2it*R+D6ic=d1J_f=fiwx*~(VyNvg>VeTAn?+hh zjsrnRX~L4sY$tkX=@5@%7yaIn$;?KxLk`iND7^+tFnXvr+pEPjypKaV9zaOp&r@(y zktrSS8nOvq2xd7l^hh;_?T?ALp8HA#S012Qh;XRGv!hUUzzI~5%naEW&~va~1J4U4u`*|R-vYnr-8=$dacm;K*nYgS3qyCAAEfBOx!;(Zbf-#&H^ zIbO`*{1s(hi`YN8c=%hUH-6n}DAyg)4Dx2CGHXz{(QDq^mQ7kQCizPm=pC|CX?J$~a`m zhfbCe*7g&W({|_5Y4?Lo@2M&h&i<$KF*e8C(K8g`2 z=D3PE$FOy!=SKr66+;Z#?Kto4>{0TmWJQQXWpP>cDgQb&iTU`jgE-yu&u6#tC6Rqb zzP=0FwvZ~fxL;5R#|5y}(8#CdSD)1T9))r7WfJAsh}AQa7H}O_)RGyxt+3Uj^M>Lvp%ju+Az~3whAQ*5m4bXwxT|iNJL@!Pg#49tX8n(?q2) zC!POo|2MIsvC{lHq)1Y%J;+h#L4#(t-UJP$jqa1qAtF(kMo5`scEx&m8rffRAAnI* zpjUY9e>QghgKRN%HLgxj;XN7cxWu^>_Y ztqJ$p)m(o7Hf*F$@B6uMgD96AkzmEyoro?1ihg@sKUs>&WMBVapCb9U+E{oGE>xmr zjA1BxM}|kb?nolw^A4ef5PIvNpMpy`U|&Icq@U8of4}l*g>fdBinxx(;9N)?b9J6@H0DhgnQJHBn1)6wOb9$Uh8&i4qnpptQ2jPYWPHP5%etTN;f_ zP%|XPGp6;itchh5YX~Qw7!CU{Zb~C;->W}NVJIf&u%7TJ;*We-5}6#H@6`Zrt<1UWKg@=5SIJHWfIW$) zx>iud!IZR=^cz>1GN%e1`OvU|HF&IpFw-i+D_7*z*tQ-`7+d{9m#MT(O;jw4DCids z^;5&i<4m~~QSm|iy&;Uj;J#$>d>70qv(|^Mt~%FY*2P^X;N=8n*EB;5@t}90g_Ljf z!$Yj_3%jf*aQdg!Xg&YT!N)E!Zq8^gv`b+@!G1THUr-xsAc1|+Az>%GEj5~Y2L}A) zRH$-0&c4xWo@iB#O|^v%=str7CzQ!*tdaL74>lj*j#08#l$%o(>S+Hw;j$o?Jy5i* zODxca-g5b8IEGIq)azJ*PbNG_l+MTF(WJ$`NN~7_K01BEce`B}Oq?_!L}hkr2) zUu%*`|F(^3co3)&LF-GA302(^z2BZM%AR*y#G??;NGhp!cDXVgMFqc-wzz*;+mM=^ zCiQ+47rMkTyR3o^rPZD9%3`HscbmwoP>x^9sixC(s!AcQ)H;Ybh>edM zbfnX19&7>Cd-RW4_YV&bYZfx?NW|W73>km}U(#{Sj?TwWy=EA36M-xglnDu-@OaH{ z-vk(IzG;~wdpGMn3Q92|1@x!A~J#W&L<w@jm*pCp*){kUn)VnJMp{Zhvjq`*PkXbIfa*H$5ilj-ISYvbMYW4c3Ga zU{x6*32W1PYLmiaw3OvJ*KJ^6Np*N)E1(1_U0udAn1bj(W!HFj!@2k7$n$}}oJiby zeWfXb7TWZB(E|zm#I?+Q(vzuEWs=Km<{c|7Y~ydHD5nB@S0mSq#rFL}{^;&$ZF ze`kH*Jg(5Wrm-g+ZXa_D7ENH}~6&@N$|`KkuybB4^3 zv@G&8q?z`v<9;9jXu^c@W;Ic#Q~opZE%HU7y&!)zwD>)Ir6&p%m~^;AJlygrpTuhU z5uK6!7mbrL=ZfQxKUv3C1tL1sX`G{2;I*{SO`Is;dt*CHw5D?T%db(JlZ}jRf^%K4#V#T=%m@1piN{ zh(mmRosQZ2GP0|5NIlq8tc5o3lYkYRndL<54oN1%c*rJ6KD!4&$q|<(a4iTd_)cAe+2*?=sSUxzwk)LG^!cbX)Q9z z84$zKQsNQ_IPoODlq1hqu5sMYBVIpJxf>6iL#>fgf$0?cn9UP?It>#x7HXQU5kx+l z=moY`*o_4va9*ZC=u^Pqods(o#%zJ6AzMua-<{^J>f(t|e*6NAG-d)m(?QETaiZ@TypBv|7v$J9%Ll`gpF7ZLeFCch|@gIss3*L8HFAF3D zv9M;+!U>z%6D2N~2x_fH($c(T9W*#&QFH60-ro^9=JMQJ1ZYTX*kYrAB=M3X=|#qw zKVp+Wqbb|=Z|kN4e&6kn7o{vd_;eQX&s@v-^R;Bg&0~69ssd-`6)dJyDMr5J794!j z*&UJ^&vq!djv-lNxcO|_0%ra3@m)FR83vjV1Ig(B2>a!_@A42VF7cV^{CGB`mdHtR zXt)o5x`5`cC+3(w;jvvV$G;(v*CUiyZzjEvm{~NIZjA97X-Pz6}az zAjZ6Ft!>PLR9u~q-$SBVnncCrV`?X%%ecY5$C;U!xjo=g9I}Iofwxk;(cy^a8aDD~ zBqz!B<|xSu*lrI*!2=h>$I{CD&EtN1j=}K?x<^cRt!1n4)+Xo9Px#yAj6O6W<#|x+ z9efe3%iR%AebAnA(U8iLactn81@%5s&nEfesY~bas7Lenj$lAAD2e+{%wGf?m7nsy z7^Nf&wUmL<){2hyvcJ=~NtnIimV4p#0iJdoRbX|KK<@IpK?6n2PxIPs1;eg{|47n< zon~6*cMOW=e4edUd7dmy%}j;=(r&1Yazkl3yP{uD8oH%s-6KEnbzD0g-ihP*NajM# zsMH6f+LF^(w8`(eA37{NSuFzbzO>&I4*SW{Cu9(&W$J6S@TcoG$aMhS@4no2r2{s} z`RtB>y`eM`m$!fWD_M69)3RN%fA@2uH5>fa9O1N2n}`86IcS(ayk}9GoQ#jnew%QJ zvy_CKv)1EE^=P?*X#&=IED!Q6Ut2c7us7c=`$!Y(o|f} z&=c_c!YEF^+IsSvS+7Z=k*7+Bdjb8Zl3%`}MAqoGDWWpgcf$R^uOaFuq%W~PKVlwTgp zYNI8m+*;l!EIAkT(tSp3QLQBIK)XV{CMBUzXVL^c@f;@S5NH+Fo;FEh6!-V_u)hd2=cF)pzyI5VWV&*eaxW|Acaeg+J>s6xM*UjA z)<)-H{2I6W=?p2#cjraFD!q0Rn=G#}ON5&jLpm3@=wrkg(4cBmGo-l|T_T$iFzb7r z%83)HO`fF_9F|pfvSkpvVtu@Y|0^N&NW3pNvNCJ) z$tOSwj`XYk@|ZWTUJ0x3-POB_2QzL!rK+pmq{Dm_Ke9)cRKFRZ()*`2=w_XP9A&JP z(|L!ZQ5+iBg5M`hNy1XI-70e<$Wgka#UPEy6m9e6Y+a9S!OpgiQ?ZS7Z$bc{x+~bS zPiAL-X2--jcEp`B*CN)Dqb{px`}88_Z2eo>OE;TuZPTxd@aLI^KX*U>{7ysuUFJEh z=kK(6W0RfuM$NjhVZxbXCh`z<#li@iw0NCflt*9@0WECFGl-bMyXi+p>lm|VJ`>`} zFf#~4>s?peMe*kcUvT<#>~4Domh254TN(xQOS$?%PVbvx7qmWEDPX zF6wbe<#7f5rp|Y!=xSZ83Jq2TX)2uDHhajAQ`CYqwH$t!urM#sS< zxl*QA(Y6uRqRnj$ql14gNEFRHKzc2zV>qXvCfhX~xBWJWC?G=ScMz0uN1tUadJT3g zA3R;I$jms5C4K{iRfr|BTp_b-Rv&4R8;Z7SQNO^csB{Ovz&$y~-*MoomVV>kBE%AT zZ5!G{SW5psy`i!u;;bk8;rCW#X2R@dqilfLW4hEwXL+<_CX4a+9Y5w0_4+V&$G zRDp}|JOqQ?A=tXi8Gm1z8jI9}*3*JxZ7}`*{hrlqGw$?3((%Yh{ZXk*7(Hi(AXT+D z4ywOO5RPz{JZ&j4}RXp>3Egbf8dF2JxDbRi*s zq!}MHV~(v9+1OdmaldvZ{Q9iJwz+hPpX?1s#`+p>$)&NfRB3Y$4!=_ZX=2AHD~ETU z6X8&;q1%l$UpHau<}f?4#5DU z!)Z)9pIu`R@nP1f1AKQCmDk<-y6_1z?|=? za4dzHHbu_+0x|~rtkq^=(>FZtMn*1{ z41k)MV3WXr;=MI2jwo)xkhPJm(^3Z$u$Hi|!{&6Ltj_q(3rG4%pZq7Aeg`?0QLOY( z1AjwV)_yUZ56zroP+-&{zX(HCa#R;{F#N5g8bIrNS&+4kbPVXX4UoQ)%T80&g&7Z{ zt-jmmK`rSP5s($h9U+*X;&qOw3BUbROg?Op8ryKV2kYMS{NPPi#_-b~!8wchlPbE5 zvrE+|KocYcM|;ukgt+Af1gJPQB24ggCAH>D69eyo$-GMiw|YKMHj-h6g-LCiY9m!S z4?B8WO|J5bc1ln&cq}?)+O_8C-*&?Ab!E65k5L-#ej_Q-T=|s-)FW=G*m?B0(rDtM zYilH99^tv*iCaUDz;pGo#_Bq^pd3UljPTkoX|fx82VHQ?*HSu|<#q)SfDZvtI<@A( zLT(>lER!;h4>-bN!*Clkx7UdM*e=MtGUsw^9QdAwNp3!s0ucy@et-ElJXXcd02NFF z#Cx=RSW5R0Tn&|VS`7MSL|)e=GX=8O*^%Z{!(YSLus{s@0C88JS2I}?wHj{ z{mk^|pjfNE#OZa#v2nlpdszpE71>Y<7*!iy2pS$5{>t2{xedE_F zZf)Nu7##&SRErCgEtc4HrZSWPU}i1*^kzqKK8s9Ey!B}&3#CZ5@k0qs)`N@LD&%x5 zB=`LNdXn0nxB5j&Ufysmh>2O*@t!X;*NVAv@g6gAD1m31WEM@H`!dn4&J;Amy)?h$ zz`KU!@ZymrHqnJVAx%dO7K-9ttd(5mx+oSpE262xqDn6z4a7i)S3^!_#1ofCqe2r9 zb3462Fk5Z$6P!B*RlhMZ9#9f4POyeWvqORxWg9+QTUH=L(eWVh1ky`l-7ti3$V%TZ z!-Yr6_)n&y5I(l>36#S%D0r~|sI3D${?1IRP+_D&-vN)ZFfneC0OqH`3623Hm=n2h z&F-rAZi_ae)&FJ7rTP@}am=d6!h#K)i~3A2_nkWG^woH_;16rx0K>>6vVOSh@y-^a zmjgYNF3dIsl-DKza#HNE@f0Qkj}p!Y(8^@E76YB%@j`WoI~7OoRdmr_J)S8d&-(WL zsn5_vdk_@;QMvd z!y-@~OBlJq1;-I|?DSz5hy;!qJ=ZTiXRc@NB=ZR+S^stj=&(`Jb3%3>0%>+U*4{9#u!;n`Q~B|=~6;bOL)yCW=nd+@)NnJ-yTT{#0DHvB}I=0 z1XdO2;!J|UVOPXt6Ee^93lUo=;72)!1$f|vvlO(mh3Er z3@Jhck4Ez?sSQVB2&jKs*MmfR$_&q+?dkA{xq}?B^9q(vW#dg68c5pO-sKS_dppQE z0xh9&x~jz2jxY4p^r3^uE(0EKo_i>@=+=AqI*5J*>YaR76H2B&RDhr{7kz+45d`}ra>{vrD@cB2kLAdsIq>FDV6mQZ=XZ^hz1 z_pNAV$fiZaSty=@x_`(8j&pYaT@WPAf$XLqt54boN+$jS+~veq?#oOult@QqQ2^Zw zpK$*)nb7CHFpS(%uvxung~6=&HED@rrb3b>v4aSafBIxpm}n zIMC^Ponvg`ZEHyo=f0f6B-MWb&RzDY^@d!4;xUE1@Sp!wx!C6BcV1=kc;6xmwG$72 zyO;$%aXgz_PW!m&FAWN9XiY7Q3q%!gdZ_l~J>g#T-+^{ab&q~Wa#-Ojo{r>QXN%Ep z8ICsG!ow#0`U1Q>W54PML!f1j0x?@yPLMB|tsNqwYzk&t0YUG#D7;Vqc#kx5MlJd# zgkOgI(nUCas<;je`5fAwp1yOSF7MAd1*T%c$pkYkUteFUaXuYRpTJ-dB@}?Cm3l)e z0M%7D-Jr^)bi4>e4z}26cp7kFKNoFIeWlx`VGF~EA`t@T(G@Ukud&XDiVZ!?l*CO3 zm`xj-BpA{kQqQtbJ;Oc`ViRy@(l@#Ib?2>Ws(OB4Rl{#gD~-Qnt~$zbXm$URTu?x; zO15+-kOQn$QQcT zJdaJ&-Ak{~h@*uy)RAesadb$H=+4v7Uq3vek>(!_gY;*d>!(>V;)7@@%0sxP3))W= z>NQTBOye>1$sY~pC^_af4$c=BH2n= z8l`YA+>@53EHsSMCLNroYfWC=o(ulb@w7FzFZ%n7g2FOx$GhCydlzxlUp@bJN^V<| z$D;>DJ{Z>-C^dapyA%MD6BeVU2SWP?2li#ioYgcG=fh6az8S;^SiR=f$8(+2PJij) zrPslWTsn}%X@W3l?bQLZFaH7Q8TyeMDhYfozxZW&!8RdtvRxm0nPvNHn{Dc^zcb9^ zsre!0Y|azqaA+z~8DR;M0!YtB_jOT%oUX;<&Mpr4Qn4tZq1Y=;PDk}G^NzgEcbb=J zd5q*0MayVPX92_EJKHh#l-b8dzzB`uR_vagCbpwMI0ayp5H38Dao4croFC>F6qM)3 z-a)Y8E=J$^uQPZ1(gJ`o=L1C&kVL|TNw|+nN~O3Jwt&UY9woobcacEfKoV5OaN5-7Aldrqh)+I0M`5X1HNnM`|5 zhF|Ji&Nq{Y1n5%8aLYvGUyP@ABHqr3u*5Uqg^6((Gee?d?8!K!+K0&<)enMV@1-(d ztKHE8nWV_cV6a|HT#6@Mo{)&3_)FS`bFrJwTkj7r1A$-)H8ECXmr-OPP=gvMOw`LpkYuZCH3zSOg#YSM9CL*xa2U*L5TxCk5sM91(arv zJ7|#MJ&n@j7i1egUw}eKW2v>a-JJVvOTokNtVUC`*~{PP)gL76uqA;1nEuUz8li*%Q00#LB#jWF^J*7y+U-~POZPw` zFd*M^TlT^3YW$?YKJCka$2T;S#O?V_!p2m-AZZ<-!gy}2h#`074UcdPm0SXPmdpTEF| zuexh`OV-{ftAhHK)}YxUoM7%5ucrt1PRB8s-z~H$B~`RVQru`36BI%~o?phZtWrsc z)r5ha_ZeI6Q-3JPL69|3RF^1yNzs08kD6JRFiDhdnQ3%dXy-Z@X1%Ld`? zjAwo|+;*H4G4X$3w1hCqYP8Ac)pAhXlN-Xoi8+3~OkQQiljW##4uyl9%W%0P^|-J) zte+wW&jG}Y3%(Yxb7Kw`sb|T8t3$CM=aL%~cI5+DA2+;nwlyJUqppTpKS`*%re$5; z;eF544(>=h7ng&nd=m-;1;Mjxf}KO1b5X>e&?LLTnavB6@V(T|@c0tu+#=G{{0gQw z7zxifQmj1}_{n{u>HM~%S*LuoPJ0_>3_6%Wbm`cVI@gqg7zWJcEm=yPFRIfNdKKgAFbN)Vxnz^NSx8zE2yxmDF=hO(UKstrjnQ zxW*^)Hw>U&SO0lTd@u_gb~23kIfK+$%?XmU4_+yOv`IYA1zv&tDni@X)mX=4$nDTuS`k0}5k@d)+8|XU61G?@7MJ4d`{z#HjLd_KE z=t>TlYLNEsHeU#`G}@%zObAvMXgVVz&}9j`m+0aGqy~^fBibstjC>M~z6?aMJSG(E z8E2s>ZQ%7A&NjPlqmFo#nD|^0jtscCXrs(u(ti1E6sV&Xx75q!&|BwYW}~|;b5bO_ zt=XVgjd-}oI(;HWzQm=9wFCd49m^206UarF<2a7b!fQ*Kga!hBP?jJklL3c=ppAOb z*hh*?eDZvG&Iu`4rT69~Lp>^qTv zO6%>Ba~x?!%9`XTV3FBEKmj$s5mFoS>3#ETL6@Cw0-yv!*0|Sn6L?CFiS_-Nmd(o& zQ?Ka|TQkIGLgWIjW3+Jhx(W9R-2xzqPq?RYQy)NCWdmPVT;UlTe{q!wZB!w61Yg`5 z7JO1to)HvJ)~@|rt2p}_sD9O(c*+Xc+^8Vqg>#RK&~Gxtw};+eb0wH)U{)hff+PGA zq(d$mWvtq+kBSTjx3(*9@-UfPVFswz;~8T=wz!N|0tOdG&? z=Y`k_P%F_Rormpb=}x0k=CxD);nu*bwb6Ju;Wy`%L>@%8U)rO zzyi?qT2SluiKUBJXbl`vk0l#bPnf(Y5V)nE@m{U!fx;DY?Wc)Um0CP#Id^Vl#%$(R zuTTod%d6h`)Y2G+2Qn+Vg|O_ZwT*B^k06JrnbuUD3$B8qiA_(P*Uvj)qSAH#E#9w;#Tp9KB@4Yh#Q2LlD68rrE4 zkhe4U&Q3K@(qhg2Gnv&dAL(|}{#+Ehy{rgvxa%9+;BMl1)&pM0gRwuApS9Xhrv9kW zN1DG+`VaFwRIuD7X&fSUB@Ucn6F+n!b$h+rVGLTbhYWJECyS6vYAF?ngM+Rhm0I|i zZ2rVh9QEyU!|H&zNAT>@u;y~aMErdKF*U@f522ys6@$-nu;obilN;;H0JG4UB}Jl3 zi;T({>#8;d&;emdG`TM@D@Ax^)6kEJ10UBm`mnbD?F@0rD8;1DgS(f)3|6Eip}`P5i%h%BTmWW19G^+=$! zKAqoZSj$i^YUvi-$Ij~3aTfPIESpxao1tG9w0WQT`aiqdzhB#L+pVXr*zcUdT2c3A zmhSCrw&~y}IKjGgF^%}sIdRCKx}A*}!Bk2oHs9fjpF~HC!tis&la@AKYG`vbus&0q z&en`e2MvG1m(Ba|ahvc}tDoK3v;|}YKvHKj?RERDmwu`gB38W?fSMcM+L~FWmb2i* zQxqIjY?D-Qti~L&%nOrv)t~*y+kJu2E;)FqutP?FAXpne4Y>5>a%}=&2tpltSj@56<22 z2YyHKwai<$_Fx=~ZL5dr1*_`H=>?lKB4z>QCQ;$wM#gsklB)=SBQ3oLDlRcSIlj^U z?1cJPn3}&OhL{yT^K3()uF%PTm=eX06vrVgv&=jPjjCV_qkqP0rfdDCw9$Tt|1+uo zZ;pG|fi|q^%6BsD1Gg^yH2V!lta{=y0Sz&INRL3C!N4%i97n4SgN4r^0|FN3yay}t zUaGvln)ClGlP(U-wK(7k2949vMtf50haHaRyH9zRf(Vn!WjjbcSaGL2kzHZf@9wI2 z_ew*xIj+%SgCSYB!$SoVEAec*Z_9BRdhx(PEf{kJx5;)@^}N;1r0;(>Kne;{l-K`G zFa?ao_fsAA!aUY~o0cb&pzNYMdDrGM&M{Ff@8^p$Mvvw^t1tJ?S?8Q7>y# z`WcJt*8k$Pn&9TOQpnlRe{=oUS&As%<9AofCzcRyMIh6r29Q-0prdj8>OzdJ$<^)* z`pVz>e1e)rM`z`faUnO3q~T}Rf7&_xIP4Kqaw~quOQAtY`JK#Y)^D)p>BpvT9OdIELQcd z!&BeqHP6H|a{Jq~Rn64A(6whBh@b$aV5UmiAVjTD?yH`=$m`eG6MY-75c#ldp;`i z+@?cE{_J^m9{DyEeJG|(U62IvGTQ&%FKk_y>&av$Vi#cvg`L{c(3gne-i4MIxV$2g*vw+@gjGz@y zIZ)q!_huUVOd0;q;rtT#X=j~@U_C92#c0%yfzPN%YrLO0W)hZ5b7^`yK7&EI&{BzR zV)6pEnI>qeH7F!N0sXl@IusyY0x!*}&VknMWkgJ!r7)A-QBYV|tb62y`GZ+*sx)VL z@4gKuX-lsL1B$v);d!EY`L|KE_Ww@qGbbVrbl{BB(ARFs`pg8_R4B_s zIQZu^6w{{D6cT8>(?*V*ON;#m;pQr=*a+5s{%)vTS0z{&9~7b(N}iHh+(_gTv;c-| zoO-)`(=+nH<%<1IX{Fks>6j1EX1tCBYVinSUTIZEqb80gG%J^14*P5REsbKX)zhLi z-3=qEg6&ArAYp8rHS5k7YbWgKs7sb$wXt?);N@S{41oDXrgp|X3Ov)u!*dC32uRbDdF!(d*-M(UHvh&D*);{!k_p)@?Qn ze={j*5h1zr3*T)&;cJ3$-v4o9X+KrxY1yqGrmpte`^ zRnuOuqaev}QzlGhQCBZdEoUUjbWi?8!!%~{;q|>s_dRrAcu@YC1`x&!O|Fvv=i6@;rPMAj7U6D(`b0b=aSwzgJ6Xx}O?aOK0&U1dt z3g45%Quy`Ui)gCA{>it))NCnZhYY^=lqeRuv&@FHp+&;+8qw#*4$d>ta;=?~R#o@w zTLNy3+h&^fYfUQH_4>mpaRkANcLx)ecBfz8g=oHz#VgV?sA9WiJN|!8Ezq6@sw>W$ z)bKyp1)=wz3h?N7nMAwzZ^PBEAtU8^)dS;h#Pf*rG7Z!>l0nIq@$F9^Y%9JH( zlkPHaho-e0zz z&J-(gfNhW*(!io!?pZToxS?Q}c3ew3->RcSxR3iTC*=<*#?)$hPCrh`gHC|boKmSg z^LvbkU&yWHhGbFDh`gG9BC0pf_Mf3dIVvJvFt6q+*B+FY^_8ls+Ww2^M-s7s(^t8H zq=vT}2$lrd*)d2{HnO zXSN<{W|6KUB!n=Gy%buZS}p>4c{R9{J5N{aWdXV5%haoZp&<^ro8iHs?V=Y;&y#GG zx{DqPOL$}MpJk68={dz#epo}Vwn|S&1WiE98jlu)7&ifD91N8fw|x{ zhPnBfR0T%8a%{wcTW@fjXcFOKxvaLf!1W+iI=G-EM>{7L5KES7HSr#8C}u>l@AGTJ zPhQk>Zl zG}vx*D2RXnKm1<%)HwXc@aBqCppQKI@2>9(%&do8KT$V(E)t0y4?A>qMmKI{TAjay zu4aT)8|BPa>wHUnc%I}DXszbzw5SN2P9}R-t&!k#m#>cotm+(|K559hVm@(QaXz<4 z)K62v?(&P}DQ4FVAV%ed3LW{dPEkTyQHJXYlZUY;l6JHAIc}$8V35yYVE$aIq#yyO z->*;f0CKcT@`j*kJeReyk_f(__*8MxNL!3fu|*o1YMC+YlkFIa)qGu~(EGMY&V}apr z<5LeU3Hm?)@O@yqw7-E->;6>mx5PerjwjH1={Ie~l3jqgNl#L*g_~Zw8ym7P%hER!>WpD%TrH=<=S) z;(^?7K?6(NCp0)F`3mC)*E@8~-IWtM9jaj{r&OPB?ZJ83tYrQID*e?qo0`MQTRD2< z5nspg>JP>@p~LrMb)Mzcd05OIN7!d>i^Y`7DbdAO^34xTqRUcFc;pX>w8z2tnM~?6 zNwrvAGcBM0E=I^(8TZU)u01Rzbp1CppZAD}mTxQbfbl;i*8jQp+j1BqFKnJ7mO!D@ zc|Z;i_D&y4_}Ho;hiO>m&XoKH>En@+5|iZf8gz~9?&?Yw^_^vo%#n;21T5!cs(#fV)M0b{pL@Hzpt*x$wZk*)*2HSQ<%h& zoiqsy)j8lMOnw4-KJa-|wYjY5MPUndNP#xFqYZI-EKCi_4C}O_; zUcTuZot)j;5jTRr#>xEN3p#FQVOCK}p4htI$|_e|6jG~n3!|O#XEI zf(NSFVMjXFUggP=Y*gJDS4>*XCfU)RXwlxs{Cbzwo|jqi_u9Bfg@(=6f29#p+V|yy`g^Kri+>P!a-aYDLZt!u3-&`3lm=gryT>Bzb?+FV-n zKY77e_5pTljdm3MGBGLcqWDacM7;51U%oIzDAN~72WQlf2tNGt@IA^cEdCKya(zQ4 z!eZYcsJ)!S9Pnkr$^T~luvnv6@w(o~gqodQYyGyHYG^#z9X0htWq6Byv)X1!)9+yn zo!f3Ln!nC--0jKm)#ZtM$guQ&*+$U+zO=bWV;SwbPYu0-HjLK7^P}w#LvrX=X{X9F zZu*eftR3F|e*=!sDlslX2zaILn;)#oe;yQwW%;_OZSl<~MlI)GOPsWrSp#h)hDq95 z&O;^+*`(hko|`Y&8Y`AklkgOg@cQR}(8v9SawyJ|fR*@uMc?{1sA1;tp+DCOMookg zFJ$JTcLYQh6mCm=_Re^@+b`={G%;zELnsXVb^2_T1XQo@uZ+&uneJ;7+;7Tc&^?{< zgM{t#g&wXi_9l%kIt4I@;Y!0xyT^Et>*o> z1iV%m9QBJ8>a$G?fin{G*=7|>MpgZ=o_G@%eZ>_GF~hZR#gJSqZ(i<6$LYe|t={mK z>T7Z|$*YBGg8Yuh$r)@>pC3 z8wq7ko~!nONH7!hx7ZxA``0Op%+pDVLN~uDg6)C;+R|-*SM(Lmn(Ve{mL>5|QS;+H zL~d4m<@}9*v{Jgo1VemdCLlYmgDnUeH&oX&0@TO#o`9jgqz?h$r}c$vRm z<_#Zz@V_rd%Euw^nCbXc;xUbSPH{$2^r`8mye3|s5}*EC;%q){gUZ!;b!fJu5^t-?;*cU-rKpV??sTMR76jSZ@99Jour; zimgcN_`F^-mL6#^HiuJ@vRZnyI13)eDdIj6x*q4^4(CXzDt|CVzg~i z(Ckx+uPxQ|d^u{-HkzeS`J0UR9_G@`OmR^W+>-0SXej`;BVPfzwNR8t@6jXcd-Zpf z9Irk7#efFOrLVkNdCG&LbD8VklcZlw+KG58nd%JIl}E z^-xVzfxhBy4L5@Sbs{|!%J^UY@Hcf>+5bOmePvjj%d$1@F2Oyx!$5Ei8roBQj-66QApEh_iSKpr+#9fuuA0(yieN7;hY{BY&lNoW z&$>t2e!m(ZDaV>wuM@tPFEZP%!aa;1nV+7EDMEnCM2v=Q32C1zd(whm9|qf}@uKz( zpWEdtiRThGPyDvgFRwbEWnO+iCMUL%JumLpy-s1{Tbz;m)Hl^KD})$5%!uwNi+V%% zjAMaLZ<=>cU;QYHC*R5w*u1wPeiIw=1Aw2mz2#A#k`=ifZ9FHLmPh&eo^UJ&yVTOG z^+H_UHp126hwj<87p2r1zd+Im{Y@|w)U#(U3FFI-pbYVBtBvY6E0({GZ< zE4^(+>TAV?Y9a#V2*_%wuauXbHcAn9cGq7GiGNmC_LweC7bd>!=E%{Al0}9bT7Adh zVVI*LJzHti9xxAUZZ>*MOnMlL^{dp2<^9?Cxpf^h1y6$gS$fuolO0|msXw!^B`G9L zph|Hm>PAxe`B(CEgR1b{j%S)U%QRv%JA@QhZEEfLpgnfv3n#9t;q2Kn;x7H9C}aEW z8TjW5r$O4gGIq@Mc>+7-va(RN!wUL_HQ&e2%pyTj&}~bie&TRC2Yz^O8~$`!@zmfh zUnGr8Fm-k+xF=~-JN-JYpS>xBHENYo1>)WL6;nG?wm8z|Iw=uj$rH|4y@ygLVge4e zEnDN)*;P8UpC58bYM@6y_+ zwUBY9uE2(29D9X9wqQAL*v*fp$T4Tyv99_R-$%>?2i3V6rz~QM+kkeyuNSmIB=BI~ z+i*Roy?qD86K!!<8*+dMp9yv#sdHWWaFdLHiE1+%8#cXQ>`4N-|1leV&6^VU!ljy{ ze7fzrKD_OusbtIbQeSGz_gbCbr1j?PXjeD__`rOnUE?NF>cS4kqf!^7+6rRzAbZg$8*fpz|(F*WG{{9?#NB|nUr7_(q5f4X;1)k9*sD?7nr1+M);f4 z&=r7rp%9{?ujlu;bo|Ngb#1!VSHFTsZkntwCA0^9km;wWYFyrw1nU&h$M~*#NcXf& z!bov`0#~8Lo(VGm>NN%1NLzIxO=dm^q{o3t?b~J*NQndSpJ*(D22vd6a5e0kD@Bgd zAn^Kd)KU!EO)3(7CpQ_ZH>-

Nrf+3GBq``%l6y6j0kj&NA_ljQ2>6B=OW-MtaWckB4Fy72W{$-mg`4G?qY zd$E8JEj#){IG}2gPm%#S!Q8yxT_tA+!$$Ps)Y$c|Ap(D7)H-_-Qa87wYY1Bq2oKut zBIF@F{(>H?Dx15lW8z7?WFy@$Ec1H-VD5#|>{0{lS*95np}9j#iq;vMFzobun7(4d zqluhO1nO2hI7VHJ@Dc^2ZbuSRq6imZ(AcEb_B_FNe@$Xa5o6$??<_Y_!y?{a`UB|~ ztHNT450tY-BSH~Ws@8_v+>{2ZH;UM89#g8^cWbM*=!VlZM8<` zy}cEFHWH}#Ee?rc4Ky+vko3UcYvzz0Pah)SCr!ij#4rlxv;3Ag-YKzsu(JQ^e_|5~ z^Q-s84qlHTA=M+>QbXb%%#QI@iycZ`v3w_GO z=ZB8O~ws^3-_LK$yhzC*8zMP14#8@r+roIOlyO}bYz14zdh;zi2yM_6gqg9i}qLr3sTd#!my)|_W`X1VrEuxl3P{X==8zEu9rS2 z6Bzr5z1|RZju1^Ifz&H%K8dIz9vJ$cu_{osmE(!`dvDCsejH*Lm}Ir8h%`TNdr(?a zkrDu|@_&uIs8KRTNQCEgV+j27UWg};ElGJU`U~R4$KmHwMGwXuDsBu$)=E-84#&OW zZnu|G(xNo0n})*sg7Bt5+5~IIg4BQ&I zuI&lIxBArD^oU)<`0=sQ6)6VGoc7b2L7b#UrV|TEMTZ@`Bzgmh^I=X_TiJ+m19G1T`;n`qz#r~S3HDG}|M{8*umu@1Sl+ai z;V=FMH6N=6CcOpLu3}@BtEU$uqj;h&WF5ooB#sAX3&mw8?foTtz9Fp+50AXr;&Ds8 z(p!+o;&WKa(0pbY`bd%fgMyVxM@H*`8>8mxml;u!P(RaDv5BcjY?EPe>sN|)Lu^&{ zu@6I+3hh3+^_`lRzvw+yN>}~VI~8$p2M|)6NNDUumlT(lfzRl?AVt1WlN5gXK8$yM zuX855)!8?7EP^Z9$#*YLFTA@A&+cuMehlkT!@u0DqqxDMI{r|dCrcDnD{&lTuvAoM z1AnZMM2Og$|Jao{M=Mv~FyTeRamoT=hITx;(6=eUR$*z(;_aqdp_{bghM9|C`?HmP z@O<=kDs?D@NOn9i*u7 zBV}k5_Hk&4#&kHogd%2_ODMzqS;4qXgOL;u#OZk?c)ZWJu>`HrbIV=1&dI{YMmO|S zN6uAPxImr-8(0SlpUiJgbDSkw-1G8g-WEV-7YtNj_!vshBH$Wy~jpx_{F@{=NFJ>sNT8su6e?+L( z-TxJj)M<6{2`2!j!dWCSFubM9P6W;D4+TidbXg=P2s(b(Wzt}vM|2i_7+vIZW!G|` zm{lH0V$4T-8em=C+1R9+ZucgzL>tynPUqC-by%g!TsDrKX<9~1^;2g)&Vx$uIm?K8 z`N)M4BFNl)drlKgG7q+7{<)R#OVLDcJAuF4xH-o4TW)lc{pFRs5j!2P)*BY1qSG@7 z5~zpy$l*KTqub~JzCKtnYIFT24v(4M3h=e$SGOMf>g8rDH#30V*g-q0z1i?<^*}#? zE4z7R7PUvag6nu}@TC+Adeff!H=pmsPqk`y#n#=THCYPQD+1O;MI>brZzY7A^UB?L z@j~tg5G`z*=c2rBjceh`R9oTo!IIoo7oj5rp|l#;e+xOfC+QIG8JGWj0rdAtA=G-RRu7_K&t_)ka(KGn9&_zy++(O-wj1i za{1#09XKyG2qJcVPB=>u$PWMg8f$6L?Bo{!g5!-R3pAFEiba8SOk_6Qd-l04&I2U5 zkhZI&>IbmU*byK(;h5exK~e7uYP$tKk`o;KSL2F7%TS(o?mg5D^qI@_aMD6hJ}Dco z_=wa;2)Z`1+Pt1uzmTnz7J6WIx&Jc^QZ`%#{_7-q{(70j73;Fk9^d(T?3>Er*2GnJ zF$LwrdBtowMnNc`Ba#Uqi#is-=bG;3i*KC~O&FSKd3`>U8R@!#x_YSBepSYak1te6 zRa2`nAmZrbv3TvK;d0zm3#WB)*q7nQ6B}ZAeLhvayxH0{LE(hOv~uf?$FFnmeFM7O z^xnyLR=2q8cpjpF&FwYs*A)#xwWV1j;+KBmJ%NQJKqNj`-b2vQ!wS%ITVtVG$YolR z5QTMpsbUTdtk170RnYS(w!~hh!qJ!5!BXjPotxu1MF9^R=GVL1N3Sl5W$8-TM#hTl zQ-gYlQX&`CB=7L};)A?t^^#}#X=@hv@Y7#3X&Lc$X7S}Kg@2J7r}Bj1=N_+cF?+aW zPL`~|fsja`e0evP2&BUTt78YZ{PJ@)Hbu}H=XA4-HR$2aUuKz&0r$1p|3&*n&@1n4 zfWt*sD9o-W$NXK;E#5?t59fzQYCPhEvyv}Mgtqbn$`5Mp=ZoxjXhgxaH!&xW!`w&$ zTV+GFR%PAvBUsMZ_POZwTOEsSqSd4^ga7LtQYv4xIlE!6``H?^IlY4VQng+?bl^JE zW{L&*whlt0xH-L2VkfmIJaXC()e^lnvqn-;kRJRF6FxKCagmtB($~=IE24+v^xi_r zWi7RQJ$xZdM?c&(SpzXy11u zlJnxQfPHG-b^JBfLjHh_w*+92v97<%( zRdmy}fZ0|Wrtt8oDhrPSejvFAF4dK*6#@Vbe7xgqeT)&u!cnu>Dr2p4=(QTddH2=( zoRsBzyPKBP)#hX95N%pwK&!c5H5$i{DT(Vdzx=1o#Qj9jJ0>U;tRMHxhHZFO?aXCZ zV!3@*)3Ro1F{>W?m6!GV6xzA{+%Q-3BP!n0<=)mrpLOkQ-G_9t1TrbBpVybmgmZGP zcmO=UZ65J-(ZoZC+~Hg#_1CjcuIJO@X*@uNxpGa-u~`7dQn0{-r3)7FI5O8BF*vc=I3NY-tu^ zsCYBxV#AWkj-yWt#h(S#kfT75uC}{<;ov%4n7(I^^{OIw+$8&?X#J){x$fSiQLGvrOsYvhli?cE{tw^T_>C8hS(Qo}|UpaBy9;Mc?}4 z1}+g-O?6Y}r$UrEcbYNqmsM@lovDi%=;%>=v{V-4OyDQOM=ABHEt}UO)@94Sl<>>h z{JT+3B)aG$kZan_95vBJ`aY$_sp?+4!6KJHxw1W~p*j)}peP850F9;8Ls?DA;*=TMkzQM#O7m=Ri%r_x5hu%U*z$+} z2LC4D+iRLJbaJYw%~#d@BGbdmxy#)X_{%GT&SLzT7hj68GCCg-b@IM3{!|%THiqc9 zRNC#n%$gw~2x=x~i32Q~>GXJ4fm@PesqovZ=^Hv2KTY($EP=TJVSsO7}&>bZ1bJ*&HS87ey9K{fuUq-BoCv^c-<Wsv$sB2KSwX_d9BA4M;=t>9PgyOu2|HGd8}WllX( z_%gB9isTuVTM;WO_UQMDPIc;Hwb#J)VHN` zlVH18I?hp|DS@xW#?Lx?5@NdH&a!FK-+zsnb2yggZwK2|-=2vU9E+28U3FbDx;iY> zNe-^D`(FmCY@~>Icc47%jwB5%fYd^0x!seh48q)0NG`siP1h=2@uqdGdZ~L5-R)Cs zw-UzI`WwNMye>38Vqb%2`RP44(y#uB&2~}!I+f1pV)NTa16UsqN3XEit2j}c%Zr<{1b;mjeg0yAXg^@f;n(okd0w^rmh*x-I16nedQ3zyYAC8+ zAx)bzia4mH1!uYrgqsqm`T5OG16vF|O?q5huqPo=E+JRxGsSCbh7OOe^{H}(Kz>gj zgu_XUy!)d^`>{Td1UMo!5Z{CRIOZl~a3|JnwJ->_*p1?>gHdp040bLqdePyS=rkWx z9@<|B&heTnV@lcm{WZ4%QlCj!zqQc8a2-h;xtTBW6%vb2xQ&hS&s=J>*cuDD%%?wB zR}gu!$Xi({Zbw0zm5+O4Kw|c*7)VaWgTw;f4oD|BNJG_-&tPOB?cy_k@U11^&&19z z6anbF8f?$B>(i4dhhr%*maIk8_Bu<-sMAjex)yiIM{5CRCpr1xw<}S34RVGz54n-K zoR1VzG#caZo~~R@Nx=f{98G*@j0D8^n(1Hu?ul@gpjdr z4Tf$Jrsw-TrMA zp<)T!un&tgJ?ubcaFRJNVT;0Ex|Qt8rVWO>ju%%=%;#f~mac^q zY1I-2GLk~Hx2IQ(P%EO>ygYMh!KvH&HTgK!bKh^M`T-QF%4c8t*lLXhjl&A+yQsT{cWgtJRFB6@yzD- zT|4YnBStAzioyKY$0UJ#nY3ngU2M^% zCBUxq^LBthgutj4PMQ%1Qmph@RFj1OGI-c!?0USZj`x6{-oXRTkq1Fx7^5{`vwOyv zjK(kAPgZD7Yc|DO?{)a0!G*qv7)K8Fv1_6l1m*smE>$dgwOa8wxUN>&b^=9aGQ35P zHY@v=d=2C)x{)a^?WVEr{Tg2w^#zPPvh#pzLN>A;S5t^HaHBu+qHgU%)>ZeYF z-B@sGMF0K*+?F^}A3mi8DZiIOmhS`Rbi19*PX8VT*1@zoj%Lma9_o{~+iA`uVF>>j zk_YLY3n{pHZEUqo$Ub}3FTIG!FUsy)i^lO6ca{8-Is=AO?s&oM|6y98FOS3JO4Uk9 zW0QuKV?mr8wjhDr;lI;7M_q?V#yt&c>ui$Y8(DbVds} zQx<|EH`1ELWmf;R}{I(^;RrkJ?=My{&Z*>6tt3ltyYJot5 zU8S8(OAtW_Wg!{UPQK;u$wn4I_tPKncLpDo)8ZKSJ*lr8gXNmQ4~j-H!cE}QT zoyi3X&qEuzdBh~`3~K-p?I0!(?OY9%Nbxc}jo=7t=qG1#v;lpg;Nk1*DMgAW!WQp; z(iQmNQ0QQGP%%j5&%8N{=zDGGeMcutYpSn|@wEqa zCZ2J-sT0qns8R@Z>=*9H&GJq z4z{u&YF+4%4MbK4ow7qK{P0WY6{$1)R+nAC`6ve+_*`%sX=kzEVAiFG@kO|{ATBAf zD9jQ^*`c9JK!@(Q7z^Tte$0KFkC+t;I<1vi!eyTybjPtvyKy#$O(L35P2n*Qd#29( zBKX*U(dD;fPie?z^etz%PAKV^tjJUMXM2vE6Or%qOTJ=75RfK@EK0j7IhQ5|;9~9- zW7%0GgDZ7UMYp0u1ql(SIOQWKFB4J)p}PM8=66wVz=5HFLmR&)-7QiGrQ?S7oIR+F zK(R=WCaE-^~jqVIcD8b+c%L;YsnJ&GNSR zvP1>dRLU)Pb~l@ves3YqnCmTw@weCZSIMb{QD$zBhIi)l`L70cJ2x{8nY(q0MTYLL z=+bnZtK^}zJ`NbB#i;Mx#|SU>t%(--_i_)7R5$_#cH(DJED+NpJ^r4hSipNqQF!oF zKN$!Kk;uJsrp5_7AUO2llG_X|minh1KMJ))8(O_p-ig#69n18b)x1KQlPTRqhqOEa z0!PO)vH_Fcd~8=LwGYJak&JhU#Jz)dreNF!8mDaBn)Z2U`XP(>xF1? zH*{ekqMz(e#@FtN-KRf;R*_gkkYuH8>7I+Xn>}3S#%S%#<3IYh=gPEHrN01&IGm+Z zv<1piW6YpELO$)zR%M^Cr2^TY_O&Y4(La)WoF<`5zPn!Dv~cJh=e3iP+6WsH_z8w& zt4ex&+e(A28g7MecbzL!H6+q7M;Sbuex+@i5O&=u;i^C6`w(nE*V~E^qQc{3 zgZo|=TR?*JQ2e*=cbn2PwYfZ9^NR0XTW+(!1M`_E)D6b2PlkxS!=ClZ=P|^Qr*jcmYsmlF(W0E*BqhxBA@l3{2J`uvzzw)Jd645Kdi! z^^QqByhDZxb+)OlDyNDu}yA_<%4FtHV4GP9W+RlCX zlrT58l@ys8DDB;lxbHB@DuCa)zK5(|dq-)b5z;wovvD1a4eELg;A;*lLVtl^jazJ5 zr^`)A(hHnX&(@vKy)m**#nmFh0v{+os*aIO={0{WD_*=iT9U)OR9BRu3!P;fz73;3 zj{U)#!@}0`vY5R-ZSO7TA_-Q@5e`A+S|}j!7*G54fQFyp$v{6dt*Qb#AkWYvU(k%) zBxPp_^QRL%tVZ2cEn>UJus8bJmaozs4Rd=c`URHK<0!@w!nfHKV^t`eJ0>IPFgi}Q z_dD?R+1U!s<5yV#S(~Q`;~=a@g*t0G1uccDZ}ZFS+1h`@XOPu{6yNQP5c+VbSdg|h z9^$g2^*5EbyM`t$7k~Ph7b}_>EV&=^p^*uHccS|pbG{p%{$tgERvF~PnD~Y-!Rg%u zRBDuqY*o-}(b_7NQ{M<_22YO*ohKbaS==Juey~2)mFveW9KZVoxz{QIdym6R3@_A_eA)tJqXI3Y2gObkH0h(vQtCep`0ODkalY^l1&>MF*@iWMOx zkyONVDVC~yD>cB#2FE##iMLsEmENE|1R$^Tk*hE}9eKO(s@o&0KxC)&y11}?=Kkkd zspS^f<%NrENwB(-1I2>zWMeL+JDPQu6H86)ihHt^jiF#;axJb%vZBeXV3Qp!Bpeb^ z@m!l`Wb^$%kaO>W2T#6gP-`BKZ9>vTLVS`B#UD}@U=tZe7Xe@lx-uk|P}xix!NUTs z6*n})6Hm`7Yp+?8Qx-9Kxc#k9KTGCx{VN2F##Zn-K)fD{>jU$AMKVF>9fQ@aa}n}H z83QuiVdk9-Gx(}!2J=I;!@Dw~3DcBIr`v4pEJ9^&TymSA#opGbkwN=IQ}I8TFmo-h zt+Sb7-G7e}J^1Vi3A+T+`)T**hKfF&<#U;hy=M(7ZUG-M*~ajxF|0ET4mcQLp z_zEeIDgDKNpVU!j^FYj_X=bP?wysR4oD5e`_y`xKI$x@(t_Xiev(E1K#DdXdP}swo z>O2Pn9Lc+qT>QMBt1-yWPGEX;J6&xIHh$W4^g_Vmi4DCi8YIQ6r~KxBJ^Y?X*dabD z6Cf=6s7eScWDtMsEpcT@=edWa9t0sG{-Z+V7esGH%bn%YfhDcN5LZqY{RzX`H3PyG zS(NhDXd7*{k}LV(pB{=SRIOUX4YSm#`JTVWR_Ha$A((!LC7OCmiY9|D_g$dz+SSfs zU*2>VA%)df;1E^VBra^-?R-{g+#{)K?K3R)wxz(lnhLYa*~-JlnUuvuM7+8w?7kZo z>Wg!9clGOa8~M~ir=v0{7Dy|E?>2o5B;@oBbI%Eos)t(Hn*|#-_ievQ5W$NNnv^XN zqlyzL5Wh>2{Rw$8>$fBb0b#iTqeoU5DNB<{TLYnmVl1pCHCOqP`f5>-m_|1K#1 zGslT_20lZ>A7eYX{_({fzFqT+aDnioPAM#l-_<2%LdUDu9jp-U%+4Y`c~T_w(y}4x zLT9tBV#|Qd&Z4pJg{74heiZMTtE$;rve#{bwZ9vKz&)N53CF?}-_^lZcH)|jCS+pUNiLn=yJ zuR1sniJU$sk;&_)flrsdW4f{zq1MQ?18ksLZo5e_WWNSRE{;N(LlQgJQcRatMc+IlAuuiu}SX@d_mqpl-8Jjxu)7u!$$<%0o?bj z>K^>k3}YM)I|mn2CaZMg>449vD|o&yUqs_Ajz7iIElU`{{NedW0AL_Yprgm+S@N>o zTYBesz;?Dv?$VUj*l1+U6~a)^wY7SU)3a8qxr+bcR8t~XKVTJ70h0CYB3t#-%Ze_~ zT`3~CQXYSFRP_YVfW>`eVQcOjFJL_i=7fDh2E5&$%%0ITODmu4^NNSynzDL4j=}IN zt6hUe1H=((X;nJ4qkn}3N`r`Q>QYpTr_^TwbbZNz1J{dJ7K{p+EwxY~9mV9|l~a8O z(nY)*7^vu}2s?Ou63{}W%j9|yZ0TgKsy=iTi+>j|b>3nDF#)hRbu`XJl|y%nGnD%W z;QMblM7Y@)Ql_GgB2$e`?N!V{Tbtg6E@AF?Sz54k^Kya+Vf$`YqoozXQpzCs&H_Mzjp=y*fou^gyEOzWU~a-_mTwR$hj z2f{ty6+9D8h1QmO?dYR94O9y!j#K6nZ4{i9ozHafGgcFtRE}s_vDTeeVkXv&Q5Q-} z>U`}`-LXY6(ZsWJH+-{tRR;CqO_JLSILFN?Y<-(aOWb>rfnu_!#UnyWb~rHL_J6!f zF;lV6#t(f38l@Ul7IC6uYLk4RSudgzK9rq z0AC{WS{(`qmEiY($1kMljNK0gly(%OCS746 zl{j<8?9$O?Cr@MjdOF4;^!Tj-GuD@v_`n15v|K5jDb^I*475}9rW3E$EZ3NJukI~E zT9GT$1xw?g?j=7%@*LRb3CUnj(@P)7Q=M+VHdN{6BQ%&5HlU?Fs8VjyAsg69f<+zP zeRCdl$G2)Fl0Z&KF2)R9-SoNkZeVAVld}#XRCC&|`nd8vW|M?Q~wSR{Ipu=d>xL>=%YG%KyivLZN`k0Ejp- zh^Ng~B8gBrE@xu~4qGD86&Lct;l2{XxdW(ByMvd|&v2yZ!j%Ygf^rKO2{6O9n~G;` zoRZm!sMMwC>iOVe6B6)N^-@e{G2({vx_Vrn%oi)xZQc*@_4hj;Z{q0DkGDkBsiS>1 zW`RRfvQ{tQ&{=q<^Rv(iXKY?A{4B#Ve2puaHcd-QTP{a1+CYZrNS>%(3a-NmR?C z4G-2qqEpSKQ!lcg9hi!WirKfCQgzzm%ORo|ZZ$<< zW(Wn*SsUm~(vKFH8n;Aq)KVgxRCluLfv_J;*IV%4Wm6Th|3a~DlKqX%EfOR|alitM z72C5Gncf&neLu&sI2A{#ilqXc&Q0 z%%tl+yLCb-a>PNb8I;d(A1*Fe1_EmPsKt`-rqoOJ_hYD4|a80kv;!qd1eElHL-Vo0$QKKj7qZ+U5;7oRFdFh+!R4e!s&Qt@{Y+XViKQ z>1WjHc*lC;tmHL405jFX*$UI8@nT(k{DjurXXL^P{J3n4*7w6lmjMh9&Zd z&6ZCRY-Ta6d&waZLDk&jEY?{cj-A<0fuSskuv3DSSh>=XeOB=WuJ^%wC1;`qt)!$y z0*Ah9(?WWdKD(F-g6$Bp(Ilccc%zz+#;RSy1eR#>()R{s#4>F;hk&^{sZ5XvVM0Gc zK4yV%-zJ0=A67tV07c}~h2PPis|kZYm<3I6P@|6;Kh!Jx)6CUOHBA5KddPV;&f)Ma%JE13z4l#LvhV&HO&MXK z26l!6l!BiC_AiR6^V?}Sez`A$7871!pYK!-cTSD0{yT{r5t_J{2_eYehCeEz3HNh< z&>9p=WisiBS&kBpp6vakg?L*dVA9X??^)P*A{BIUPkuJT5lSk_d;f!YO|k(8{sZ-G z!(B#N%~kzcYTbU0DeZr*hKNMKEY?tpS-hTmRJl0yhIC4i_U)24f!ecR5pM5b4aSyV=IHye1eE*WE|6JVdgN6EbY`pwhz}S%oJ>n{9^@qj1+ZU@Nl4+NW?V%5T(Z}~h zGOruIR*BD+U1u1KH_Bz-oncvD3?h56-!?hQ@=Wz~tjab;C}tpO!$q9IJ>&bw z9i&y)l(Wxg8&Gfjb#{a7l@ujMhh+U0eLC6WE__7Vp1*MzSpIfR+#J*< zwl6Fv!^k(DDHOyP$(C8|Kr@a});0<)56=UpI5Jb%6H^2sEya*U7jS0zgFyUQ!V&P~ zFF))D{+JLm%;EVEcTUQ|5bXt(Q_ggYv-$AwXkv7F6QntU?nUa+d!?&688|*9R#w*J zlMK4}%yDadRZQ2oC4i_huOnMR#%ba0$?>+NQj)dM<7M5aj*WP5`gYcLM%v*nuC~9o zu8J|%h7Q~J5jg}ra1PX_860=1U_nk!DxUeTBQ2#N4NkvGcIDwqB5BH7QWs9UtRU-S zW?G9m>-7d8c|y`h2981p&Hfp~9-MLGNvsX-iQ!>6mn+RlvDy>jfA$%1z%QGQJybAs zf5D}K%T!vV?p)MZiC09{#FC6dcKA>o0S`5Rvfpxmuji!z`}^mSEt`}jqXsx@%}wMn zZ1RDhrvkqX65ij|_@FO`$9%3)+oB(=p;N5m{2Z+*iNC}7z%^Idl%32GZJOq>dj&N0 zyJS+dzbp?QN<*Ms5HU{3fZK~JX7U@+>NgxsVo~DqVi->NmN;xi7`+$fP^fu(GHm_F z%A-M31n6liq!3}4xN>Y;S24ZYzK6{#yEpXwNSTQBPWr=}^$Th&{e5O0yqO_zVw`j# zCo@bh7n1}Gf#q}w*}X*PMk!NuE+Mi}=eLVXPp;nGPoNk%*`Z{LxHyRr>tgFkKB{~! z9z%Mq2b1~=k#YFV!DGGtP8vWILD!?ewWSwuB)3R!z znfGdx8cFQq;8-^l>gfLe3JY35Ce{!{Z=lWG>-V?#6_063Eo649xNQ}Ukgyq-T|9jX zwY)cFZ1+(AvL`4Wwg1CuJeHuKpi7B3ZYZftc}5Y7WYxdiC>72`(6QIFZl21|7BL8 zkP7@$sUXTRC%&MQLCgHV`ulIYEBv1;!b{&CmXgxV{juT8tC9q5S$- zC)JA~DdvBTp{AJXKXcs3Ei@innqdk{{Q18gV*@E9DDGqkke48{8^lmoo{nuU{AYsy zS<+cF7<}(+z8K~6GPxyuuyi!BobDn911)tczwSg8QHnyu|9Y_rQUNM7+P3BLEmzd; zXo&f5*YpM^It^)^&?eR^i2JC*5ZBpwd5H+1sBZtMME^9?Tr(Rd3IDd3y0(rl zG323cSO!-!K<%rluFr^~l(gIZQ2N+C@WEkMJ8j9d?YvkJ1vk66&T02UG8vnshCu1B z_x;OcdTuic@BH0HaVBCR-7ynLcIkx;*wr@GvuYGUrD;b4w4#cd59lpwuayoWOyG(- zpRB)h@)%hR!R_NkkEv~`a z_vQAgSR5=(JHA=?6wF}3uAhFAa=x*M{M7*!^!;m*%SQR<{1^8>VL33hk<=L$sc|<{^jB;$_8%tQB`v=nuox@GW({1tq#L zAAstECK0sEb@jlV<^6@vJJ4)(ll;x|k=Al7K|h7mOpEO!R}UccVb_{3dOGi(X9d&c z>n~iX8IJXN*My?O(oU}SGJww_(>vV^i|dhTyF7K-r;n(2viHVHdMy|m8i}&5SAOz&IMUJw z*+3lP&FiqyK2LzEYhmdLgOO;|(~*Y+_~~A#W7%3+`VMpuvlW@g$bPCZx_dRPD7gsG z({d9uJE70$_&uj(lvwCDp8Ojq(|_@x5vn|M@3*3{LR`(YoGdAF6LwmIhK@M{e(?2c z13q#6-W0cyGMYVKR(&ES54PO!4FAAE!%U|Ks7L?5g78Ix67rh@pQMa#-iQt0e<`Fc ztOY4JE@v8o`XtW&x9adqQr}q9{?ERirG_C=SJ0|vj_=7kg?I-v`oe$F+RFXo-u_34 zYEpGc!Tasy>&}n@*NcFfCpD($U*8`L+dc?MwxA zE+VF>rI(=(JufvYhBw-@&1JvJrlTXyXMCF3nH4Y}eT~}6QK~Wgb+i_YQ!C0md!1)? zm3b&ie--wqtM3k3=(Wf1JH7Py8C&s1`4ML^qJ_0Wofnrm#qwAdk6d4=YFb2ZUrGHS z%!)c2yjh*wjg4p*~lead>ai2nBV{Hlzk9^n#d18ohTJz4E+L%+E0aN!%FTO=&51JhiHQnId{vi^7l&FMHTn+; zXOEg%3tHsk;DO4K^TC;?d*0q&E+1l0{*(O7FNV%(n@6B@qT&@6t@48}$n{Zr7yKqE z*GFC(+$VSEUV8d3z6|~x&I^DH@E?LTWY#3AM+ayGD-BYkw&@pmJIR+1Pu{3fpVrlzvkHo*^E%S~sgGrfO8loaQzfr0$8^v8Y2=@tWYRF-;vKhQ5Fl3-hgc!8ERc6Q?JR*nyjeEkLYn+T+y@v!Wcich@MN z+@*M1=+}Oa!Mr}!!AOe6ZD_fzhdQ6;fh(XA-EQBPBWjQEo`Dj)LGnA_Vm4&aNTq1ItWjc>y<$Id`835lolpd z#q#~nt^W<1iM;kOBNc z3Az3;$p9P)X&~{=vTK;7o$GGC=)^v5B4>{lZ(}B!=Yfa6>kPJOf=p0+P5&+f#VLbP zB0=-!uZO2gyR6wNg(h~%8H|~&>n~8WKa`xx>62Q#w%x~aUkLRB6IF_W<4}|}e5QL` z3m>i-d>9rlyrPb-uePuF{cwb~N1ZM-WWNkv4P230Y3dH|s0=7MO9YpEvs)6eTd4GF zZ~7P74(*!t?XtPYb0O$J7=8s=9{Cgg94BkSUS2yXZRCf<|u`+N(q?1f2 z#ZT8S92!pfdmT?MGnM?Q=aGn&Jf`pX=ysEAh-c^QpFr#w%p{Uaes~__{jFF`}}c|KQ0ypN&`TO)onQ6V2Ny zaZg|wD?gv}lvGw<1!*iMR0?{!2TGPc2o8N}cYB~AOd?CIC-RFe*rr%d6yj98+*NE# z{V7~rZse5zmWXoye86)ofrsub-#Ae^>FzwMg#`WkI25BhWe_lb>s&!BRnLiqv5$y^ zqu|bw+muj$nA8&2$7DSB3w=mJcKiHwGOhw*Fx7r{c^A+&c|z3tYonFg?bqg1ar@IF z%Wh0jnR<-nT&J%E;&Bd0inpVE{b>cJeH&j^wf*Z5AQ8-?J|`<9mGD;6jiqPGNTX#q zZ;pHtDEVX{E1DBR#l=o%&rWhRHkk08@_qE;AZz`{$CYm#*V3jxek}>9K@g|c3ES0@ z|EshmA+mGo2JGkTyDFs#(Z_$;iN0F=-+zgpBvPgk-+2KT7lJ&H^S=-0=#YTr8(aXC z#;<{Xlx7G2qJ%QQQT!+r6iD}zf=wWMADv8VZPUgh8l=9jiaS_XZsk{=UU|+=9z@MW z8FO7q4r2WO)!2e(#@@*hj}P@UsQYhSaZz9)GU#6MTMJ5dIdH-s$RSUNo{#K1qz-|) z7~(G<RiZ1w);~#gb`Jer`i^DVdOVDJ)wtAyGySdpOYDVKEW5J2= ziA}b`f>ZUEqvj$ILq$O2Rzd<`ckZsAKJ;hCTx6NGk2>aS&%l+}_tZIO`tQe-5KX_# zPy7@jxY85=Q&XCtC>2C+Frq;>Z^-TSEj^FfGquF+$F_n}J8=>diuK@g80&7d%;Jg9ndWq`c~MldW-IG7IrvK9%hB?rgV9vC?5=*QqElqHrOv8W?@TQpN>gaD?8(2SD5te1 z!_Q#W?_O0D`mN2%Sul~*D$dSnUg&yv*9SNpl)L%z5jDKYX*HUOrA$RK4_=rZ=g~mo zrOK;CGUNq-)-$XbN620g{F$^pA2Kg3@p4F%Y&td;+csB4*EL>oj;dG}*RtlaUFtSw zZU|y=chor4iqs2m=NvkvD>xxNDRNphrd;Nf0k6HKH(1qo;>neJ-QC|`T~n1pSF}mW2b!UkgtdBYLJk;J*G;4Sty~s+xHb~jNsU;T+pN9FE2jf^u`wX?pgc|?B}@Dz=-P>mj9 z+Of;nm_6y&z0|bp3csf>%5L;N z)-6XNao*%cwUqIA1xFVsnGtYWZSu z1?N1E0&neOUaJUSo|khdM7UQQ=wVte*V5zD)uCc3sHkAB)cD^)Hfd5l5mIr5{d`6v zFmbzZ`c?D^Kzar2sQ%Ai%rzQeerX_f+4}@7Kt@x$u)S+=-L-8y0Czy2C4h;RcsHg9l#4eGgqRDcM%S&=(INZK0NiB6Y`5esAAaz?{)Qn z@%HCerPi;AZE=Z`ny-$Lyt{vlVYVD=$QuP|r!TRK^(W~iv}?nwj4b#Q3501VMM%}M z(=-GUb4u$Y>3f6y-#6NV)}3xtV;+skJI^+7gSm{rW63<7%=~T?V2sbxdOXg7th1| z7Gvs&h~)Xg3}svwGnjisFwfZFS0ve=ypN!r;n>Wr7jn?hTpDl9wET=d=pRH6iQZ#3|8?oyB6i1JQHa6;znvH z-Vz{Q^by|&Hj$`fp!?1)57g;?GWR-K6QItD%CY6B=FyK99$~cQpyb7f!;!`6cirelo z%zx(WrLP!7mTwf|{Wcg23uj<_P738#-Ci_vuFIytye|Ih)5yh&?*cub3_sE-AkeWi z>?(6AEA<0RtWfW1~!&Y&x!@u{maY&1>dG-3l7g914tN%RTCmnO1Xl;1c?K;*N2=IEMR)nK4l z;;`Y#=!|aBSh7=8jUUS_@o5+kQpG|Wp1TdkrWE!EvyI3mGle~MB$IVwoj8DaAbcqX zKE{(Mj7R9s1+<-mC$UEc9+v$D!P`=Xoe-nnx9ezRS56z7`0NhU!&j2=lpnxOYh#LK zxF@jt%0SK=>DvtV!zE2LSvIk|Fe~a5`5hjq`@O5lCRnl~(*|F|x+ zl!G~fEFa#c!+%&BG*&bSDKScqpJ~zJVf|oc-d`5pH2C!@vUq4jBwj`p2Vb3< znbBFi2JDmXkVIuy3~}n-`w$U2agVt5j*PxKz1aVj55z?&kNxv+-67s8##N+M-4B$#>Ath;uVEV9y3))}LaZgaX7-&}8ylhh#rOa9)Dy6W~dT~&p+#*)sq3VLUAgQX>p znm7$CkL{DhaH2NFbI7DK4j2oY8uV?=V^fB=QG^idcNxFcDMO}+b6#iU2@(QRN*chU zW_Z9`Q98XpVr-xi`1XKDMHf@Q!-tPGG&b*Gv)+yaU%rjX2$#?VWeFxC$f8k|{U_b) z!)b-x zJ3A-o{K;+7rIIH><{`^}cgbR=!6v2^-lyr#um5?W+KA^<*+k0TQv9Ey0y>&*J82UR zk5Y`^;-v}(3(m-0*`cH-y<}%ywV{2G-uS-4oB9|9UrVh9BPn`hbV;f|1+$it>^$?C zDvcyWAxkbeJU3gO>_C;S=bM|+>ctmb(_YVIz^1=h_brG)Utw>A!#OSt{%2AHDjCnE ze-T5xA=kX^&!Z*WlUH{!w_a)lOA_*LIr61ugJZd42_8!xo9`LxMe`kH14jMaG zg3OT%z?2p@m|r^g6*Kvt9PViKt>Z-^WzaCGx}}X%dUaYal>|} zhOGQfmVtWNmBKmSEIUqV>v*`i(>~_=a|`f(oa-^$Ord={%&Pn9ktEqVu{>5gGowot zTBG&hdf-9vg@N^vc9P&=M$URpGLi31sQei16e@Mlp!U0!?FdQ7cZmlXsQInB(13rR zUS}q_(fZf6!9Z{N^Yf9I(2!N(J;EesoNJv?c)pXAww4vXU+E-8l91SlT{ z`_jw1!K*}G-gJe3GEP%(Nyt%Y7|{!4EKs{NK{y}C<5F?rJwNz}UH!I#{bj^;ixd*E zK;4NM6 z)C^iGL?6`?c{07fIiUA?+#{VKX!Kd{@JJ*z^HZV;x@XFfIG{&Ak-@lI0s!v@%v>U% z22@E?o&v#@`_;(^k!I@?!jV%r-H}yblD9sCJjC#Qmi?^VSO{uNiQ2yAdFPP9I6uk` zM%`Xr@%F1RHcB$O?H-9+X;(}%KC(HgSuJZqG)Z}1luMrXGPXRwqb6z^+;+EBCW|up zP>5gSp8Bw1oaD;}w_f_$?f9>6gw)45B)9UPF9n&UkSfL}I@Gi-;Uq~@i+pTvc0K`v z5WW#_?lzCkM&<#=3?||pDJ-VsY>Q^THJ=z-ktT$_e<#YrbgMq}JYOsOU>Y^hv>z=t zoJk|EeI1P~mQEhd_d(@Y_uO3odc}J%psd$gJh)w-2%G1_71} z{!qC@qTW@UgV=CCfeo`ffnCnFjzqjMRp6#MWtNdtu%y5h>Fa7dUG`R+m@C{D6C)Yq ztElwcoK`Qy4*HO=YADVuR-B&>>>IH^b^p7%tMgA`4JGk#EWLIR!5=PEKP%y?piOD` zMr6LYLdZjc{Vzw!%inK6W0=FOxaw+Sq<#(r*CST*A*-F>6lV`=S4~aalqjn4OOlSs z>NQJ-3cvWkI~sQ)@8_e48Hzh?a}?zV*OVlPUIkE<Ve$A|8`W;rY`!s&(ccWbgwcJH~KfmCiE27ji){?=*|=066>6f|W##*VVR z{(|yL@Sm(iOTmWAQ9kr;`1ybsIfS3p(=%c010Rsr_;HZ3hKBDLPsEG`u
  • 9>Glv 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%0AtF68gG4 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 wl)3u+F?RR910 delta 23189 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

    )Z9SJyS>Uc!d< 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 M07*qoM6N<$f>|r Kuboard - - - - + + + + -

    - +

    404

    Looks like we've got some broken links.
    Take me home.
    + diff --git a/docs/assets/css/0.styles.c0301a2f.css b/docs/assets/css/0.styles.c0301a2f.css new file mode 100644 index 0000000..aa27358 --- /dev/null +++ b/docs/assets/css/0.styles.c0301a2f.css @@ -0,0 +1 @@ +#nprogress{pointer-events:none}#nprogress .bar{background:#007af5;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px #007af5,0 0 5px #007af5;opacity:1;transform:rotate(3deg) translateY(-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border-color:#007af5 transparent transparent #007af5;border-style:solid;border-width:2px;border-radius:50%;-webkit-animation:nprogress-spinner .4s linear infinite;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@-webkit-keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.go-to-top[data-v-67a9666a]{cursor:pointer;position:fixed;bottom:2rem;right:2.5rem;width:2rem;color:#007af5;z-index:1}.go-to-top[data-v-67a9666a]:hover{color:#45a2ff}@media (max-width:959px){.go-to-top[data-v-67a9666a]{display:none}}.fade-enter-active[data-v-67a9666a],.fade-leave-active[data-v-67a9666a]{transition:opacity .3s}.fade-enter[data-v-67a9666a],.fade-leave-to[data-v-67a9666a]{opacity:0}.reading-progress[data-v-7681808f]{position:fixed;z-index:1000;background:transparent;overflow:hidden}.reading-progress .progress[data-v-7681808f]{width:100%;height:100%;background:#007af5;background-image:none;transition:transform .2s ease-out}.top[data-v-7681808f]{top:0;left:0;right:0;width:100%;height:3px}.bottom[data-v-7681808f]{bottom:0;left:0;right:0;width:100%;height:3px}.left[data-v-7681808f]{left:0;top:0;bottom:0;width:3px;height:100%}.right[data-v-7681808f]{right:0;top:0;bottom:0;width:3px;height:100%}.el-tabs__header{padding:0;position:relative;margin:15px 0}.el-tabs__active-bar{position:absolute;bottom:0;left:0;height:2px;background-color:#3eaf7c;z-index:1;transition:transform .3s cubic-bezier(.645,.045,.355,1);list-style:none}.el-tabs__new-tab{float:right;border:1px solid #d3dce6;height:18px;width:18px;line-height:18px;margin:12px 0 9px 10px;border-radius:3px;text-align:center;font-size:12px;color:#d3dce6;cursor:pointer;transition:all .15s}.el-tabs__new-tab .el-icon-plus{transform:scale(.8)}.el-tabs__new-tab:hover{color:#3eaf7c}.el-tabs__nav-wrap{overflow:hidden;margin-bottom:-1px;position:relative}.el-tabs__nav-wrap:after{content:"";position:absolute;left:0;bottom:0;width:100%;height:2px;background-color:#e4e7ed;z-index:1}.el-tabs__nav-wrap.is-scrollable{padding:0 20px;box-sizing:border-box}.el-tabs__nav-scroll{overflow:hidden}.el-tabs__nav-next,.el-tabs__nav-prev{position:absolute;cursor:pointer;line-height:44px;font-size:12px;color:#909399;width:20px;text-align:center}.el-tabs__nav-next{right:0}.el-tabs__nav-prev{left:0}.el-tabs__nav{white-space:nowrap;position:relative;transition:transform .3s;float:left;z-index:2}.el-tabs__nav.is-stretch{min-width:100%;display:flex}.el-tabs__nav.is-stretch>*{flex:1;text-align:center}.el-tabs__item{padding:0 20px;height:40px;box-sizing:border-box;line-height:40px;display:inline-block;list-style:none;font-size:14px;font-weight:500;color:#303133;position:relative}.el-tabs__item:focus,.el-tabs__item:focus:active{outline:none}.el-tabs__item:focus.is-active.is-focus:not(:active){box-shadow:inset 0 0 2px 2px #3eaf7c;border-radius:3px}.el-tabs__item .el-icon-close{border-radius:50%;text-align:center;transition:all .3s cubic-bezier(.645,.045,.355,1);margin-left:5px}.el-tabs__item .el-icon-close:before{transform:scale(.9);display:inline-block}.el-tabs__item .el-icon-close:hover{background-color:#c0c4cc;color:#fff}.el-tabs__item.is-active{color:#3eaf7c}.el-tabs__item:hover{color:#3eaf7c;cursor:pointer}.el-tabs__item.is-disabled{color:#c0c4cc;cursor:default}.el-tabs__content{overflow:hidden;position:relative}.el-tabs--card>.el-tabs__header{border-bottom:1px solid #e4e7ed}.el-tabs--card>.el-tabs__header .el-tabs__nav-wrap:after{content:none}.el-tabs--card>.el-tabs__header .el-tabs__nav{border:1px solid #e4e7ed;border-bottom:none;border-radius:4px 4px 0 0;box-sizing:border-box}.el-tabs--card>.el-tabs__header .el-tabs__active-bar{display:none}.el-tabs--card>.el-tabs__header .el-tabs__item .el-icon-close{position:relative;font-size:12px;width:0;height:14px;vertical-align:middle;line-height:15px;overflow:hidden;top:-1px;right:-2px;transform-origin:100% 50%}.el-tabs--card>.el-tabs__header .el-tabs__item{border-bottom:1px solid transparent;border-left:1px solid #e4e7ed;transition:color .3s cubic-bezier(.645,.045,.355,1),padding .3s cubic-bezier(.645,.045,.355,1)}.el-tabs--card>.el-tabs__header .el-tabs__item:first-child{border-left:none}.el-tabs--card>.el-tabs__header .el-tabs__item.is-closable:hover{padding-left:13px;padding-right:13px}.el-tabs--card>.el-tabs__header .el-tabs__item.is-closable:hover .el-icon-close{width:14px}.el-tabs--card>.el-tabs__header .el-tabs__item.is-active{border-bottom-color:#fff}.el-tabs--card>.el-tabs__header .el-tabs__item.is-active.is-closable{padding-left:20px;padding-right:20px}.el-tabs--card>.el-tabs__header .el-tabs__item.is-active.is-closable .el-icon-close{width:14px}.el-tabs--border-card{background:#fff;border:1px solid #dcdfe6;box-shadow:0 2px 4px 0 rgba(0,0,0,.12),0 0 6px 0 rgba(0,0,0,.04);margin-top:15px}.el-tabs--border-card>.el-tabs__content{padding:15px}.el-tabs--border-card>.el-tabs__header{background-color:#f5f7fa;border-bottom:1px solid #e4e7ed;margin:0}.el-tabs--border-card>.el-tabs__header .el-tabs__nav-wrap:after{content:none}.el-tabs--border-card>.el-tabs__header .el-tabs__item{transition:all .3s cubic-bezier(.645,.045,.355,1);border:1px solid transparent;margin-top:-1px;color:#909399}.el-tabs--border-card>.el-tabs__header .el-tabs__item+.el-tabs__item,.el-tabs--border-card>.el-tabs__header .el-tabs__item:first-child{margin-left:-1px}.el-tabs--border-card>.el-tabs__header .el-tabs__item.is-active{color:#3eaf7c;background-color:#fff;border-right-color:#dcdfe6;border-left-color:#dcdfe6}.el-tabs--border-card>.el-tabs__header .el-tabs__item:not(.is-disabled):hover{color:#3eaf7c}.el-tabs--border-card>.el-tabs__header .el-tabs__item.is-disabled{color:#c0c4cc}.el-tabs--border-card>.el-tabs__header .is-scrollable .el-tabs__item:first-child{margin-left:0}.el-tabs--bottom .el-tabs__item.is-bottom:nth-child(2),.el-tabs--bottom .el-tabs__item.is-top:nth-child(2),.el-tabs--top .el-tabs__item.is-bottom:nth-child(2),.el-tabs--top .el-tabs__item.is-top:nth-child(2){padding-left:0}.el-tabs--bottom .el-tabs__item.is-bottom:last-child,.el-tabs--bottom .el-tabs__item.is-top:last-child,.el-tabs--top .el-tabs__item.is-bottom:last-child,.el-tabs--top .el-tabs__item.is-top:last-child{padding-right:0}.el-tabs--bottom.el-tabs--border-card .el-tabs__item:nth-child(2),.el-tabs--bottom.el-tabs--card .el-tabs__item:nth-child(2),.el-tabs--bottom .el-tabs--left .el-tabs__item:nth-child(2),.el-tabs--bottom .el-tabs--right .el-tabs__item:nth-child(2),.el-tabs--top.el-tabs--border-card .el-tabs__item:nth-child(2),.el-tabs--top.el-tabs--card .el-tabs__item:nth-child(2),.el-tabs--top .el-tabs--left .el-tabs__item:nth-child(2),.el-tabs--top .el-tabs--right .el-tabs__item:nth-child(2){padding-left:20px}.el-tabs--bottom.el-tabs--border-card .el-tabs__item:last-child,.el-tabs--bottom.el-tabs--card .el-tabs__item:last-child,.el-tabs--bottom .el-tabs--left .el-tabs__item:last-child,.el-tabs--bottom .el-tabs--right .el-tabs__item:last-child,.el-tabs--top.el-tabs--border-card .el-tabs__item:last-child,.el-tabs--top.el-tabs--card .el-tabs__item:last-child,.el-tabs--top .el-tabs--left .el-tabs__item:last-child,.el-tabs--top .el-tabs--right .el-tabs__item:last-child{padding-right:20px}.el-tabs--bottom .el-tabs__header.is-bottom{margin-bottom:0;margin-top:10px}.el-tabs--bottom.el-tabs--border-card .el-tabs__header.is-bottom{border-bottom:0;border-top:1px solid #dcdfe6}.el-tabs--bottom.el-tabs--border-card .el-tabs__nav-wrap.is-bottom{margin-top:-1px;margin-bottom:0}.el-tabs--bottom.el-tabs--border-card .el-tabs__item.is-bottom:not(.is-active){border:1px solid transparent}.el-tabs--bottom.el-tabs--border-card .el-tabs__item.is-bottom{margin:0 -1px -1px}.el-tabs--left,.el-tabs--right{overflow:hidden}.el-tabs--left .el-tabs__header.is-left,.el-tabs--left .el-tabs__header.is-right,.el-tabs--left .el-tabs__nav-scroll,.el-tabs--left .el-tabs__nav-wrap.is-left,.el-tabs--left .el-tabs__nav-wrap.is-right,.el-tabs--right .el-tabs__header.is-left,.el-tabs--right .el-tabs__header.is-right,.el-tabs--right .el-tabs__nav-scroll,.el-tabs--right .el-tabs__nav-wrap.is-left,.el-tabs--right .el-tabs__nav-wrap.is-right{height:100%}.el-tabs--left .el-tabs__active-bar.is-left,.el-tabs--left .el-tabs__active-bar.is-right,.el-tabs--right .el-tabs__active-bar.is-left,.el-tabs--right .el-tabs__active-bar.is-right{top:0;bottom:auto;width:2px;height:auto}.el-tabs--left .el-tabs__nav-wrap.is-left,.el-tabs--left .el-tabs__nav-wrap.is-right,.el-tabs--right .el-tabs__nav-wrap.is-left,.el-tabs--right .el-tabs__nav-wrap.is-right{margin-bottom:0}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev{height:30px;line-height:30px;width:100%;text-align:center;cursor:pointer}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next i,.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev i,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next i,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev i,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next i,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev i,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next i,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev i{transform:rotate(90deg)}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev{left:auto;top:0}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next{right:auto;bottom:0}.el-tabs--left .el-tabs__nav-wrap.is-left.is-scrollable,.el-tabs--left .el-tabs__nav-wrap.is-right.is-scrollable,.el-tabs--right .el-tabs__nav-wrap.is-left.is-scrollable,.el-tabs--right .el-tabs__nav-wrap.is-right.is-scrollable{padding:30px 0}.el-tabs--left .el-tabs__nav-wrap.is-left:after,.el-tabs--left .el-tabs__nav-wrap.is-right:after,.el-tabs--right .el-tabs__nav-wrap.is-left:after,.el-tabs--right .el-tabs__nav-wrap.is-right:after{height:100%;width:2px;bottom:auto;top:0}.el-tabs--left .el-tabs__nav.is-left,.el-tabs--left .el-tabs__nav.is-right,.el-tabs--right .el-tabs__nav.is-left,.el-tabs--right .el-tabs__nav.is-right{float:none}.el-tabs--left .el-tabs__item.is-left,.el-tabs--left .el-tabs__item.is-right,.el-tabs--right .el-tabs__item.is-left,.el-tabs--right .el-tabs__item.is-right{display:block}.el-tabs--left .el-tabs__header.is-left{float:left;margin-bottom:0;margin-right:10px}.el-tabs--left .el-tabs__nav-wrap.is-left{margin-right:-1px}.el-tabs--left .el-tabs__active-bar.is-left,.el-tabs--left .el-tabs__nav-wrap.is-left:after{left:auto;right:0}.el-tabs--left .el-tabs__item.is-left{text-align:right}.el-tabs--left.el-tabs--card .el-tabs__active-bar.is-left{display:none}.el-tabs--left.el-tabs--card .el-tabs__item.is-left{border:1px solid #e4e7ed;border-bottom:none;border-left:none}.el-tabs--left.el-tabs--card .el-tabs__item.is-left:first-child{border-right:1px solid #e4e7ed;border-top:none}.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active{border:none;border-top:1px solid #e4e7ed;border-right:1px solid #fff}.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active:first-child{border-top:none}.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active:last-child{border-bottom:none}.el-tabs--left.el-tabs--card .el-tabs__nav{border-radius:4px 0 0 4px;border-bottom:1px solid #e4e7ed;border-right:none}.el-tabs--left.el-tabs--card .el-tabs__new-tab{float:none}.el-tabs--left.el-tabs--border-card .el-tabs__header.is-left{border-right:1px solid #dfe4ed}.el-tabs--left.el-tabs--border-card .el-tabs__item.is-left{border:1px solid transparent;margin:-1px 0 -1px -1px}.el-tabs--left.el-tabs--border-card .el-tabs__item.is-left.is-active{border-color:#d1dbe5 transparent}.el-tabs--right .el-tabs__header.is-right{float:right;margin-bottom:0;margin-left:10px}.el-tabs--right .el-tabs__nav-wrap.is-right{margin-left:-1px}.el-tabs--right .el-tabs__nav-wrap.is-right:after{left:0;right:auto}.el-tabs--right .el-tabs__active-bar.is-right{left:0}.el-tabs--right.el-tabs--card .el-tabs__active-bar.is-right{display:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right{border-bottom:none;border-top:1px solid #e4e7ed}.el-tabs--right.el-tabs--card .el-tabs__item.is-right:first-child{border-left:1px solid #e4e7ed;border-top:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active{border:none;border-top:1px solid #e4e7ed;border-left:1px solid #fff}.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active:first-child{border-top:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active:last-child{border-bottom:none}.el-tabs--right.el-tabs--card .el-tabs__nav{border-radius:0 4px 4px 0;border-bottom:1px solid #e4e7ed;border-left:none}.el-tabs--right.el-tabs--border-card .el-tabs__header.is-right{border-left:1px solid #dfe4ed}.el-tabs--right.el-tabs--border-card .el-tabs__item.is-right{border:1px solid transparent;margin:-1px -1px -1px 0}.el-tabs--right.el-tabs--border-card .el-tabs__item.is-right.is-active{border-color:#d1dbe5 transparent}.slideInLeft-transition,.slideInRight-transition{display:inline-block}.slideInRight-enter{-webkit-animation:slideInRight-enter .3s;animation:slideInRight-enter .3s}.slideInRight-leave{position:absolute;left:0;right:0;-webkit-animation:slideInRight-leave .3s;animation:slideInRight-leave .3s}.slideInLeft-enter{-webkit-animation:slideInLeft-enter .3s;animation:slideInLeft-enter .3s}.slideInLeft-leave{position:absolute;left:0;right:0;-webkit-animation:slideInLeft-leave .3s;animation:slideInLeft-leave .3s}@-webkit-keyframes slideInRight-enter{0%{opacity:0;transform-origin:0 0;transform:translateX(100%)}to{opacity:1;transform-origin:0 0;transform:translateX(0)}}@keyframes slideInRight-enter{0%{opacity:0;transform-origin:0 0;transform:translateX(100%)}to{opacity:1;transform-origin:0 0;transform:translateX(0)}}@-webkit-keyframes slideInRight-leave{0%{transform-origin:0 0;transform:translateX(0);opacity:1}to{transform-origin:0 0;transform:translateX(100%);opacity:0}}@keyframes slideInRight-leave{0%{transform-origin:0 0;transform:translateX(0);opacity:1}to{transform-origin:0 0;transform:translateX(100%);opacity:0}}@-webkit-keyframes slideInLeft-enter{0%{opacity:0;transform-origin:0 0;transform:translateX(-100%)}to{opacity:1;transform-origin:0 0;transform:translateX(0)}}@keyframes slideInLeft-enter{0%{opacity:0;transform-origin:0 0;transform:translateX(-100%)}to{opacity:1;transform-origin:0 0;transform:translateX(0)}}@-webkit-keyframes slideInLeft-leave{0%{transform-origin:0 0;transform:translateX(0);opacity:1}to{transform-origin:0 0;transform:translateX(-100%);opacity:0}}@keyframes slideInLeft-leave{0%{transform-origin:0 0;transform:translateX(0);opacity:1}to{transform-origin:0 0;transform:translateX(-100%);opacity:0}}.icon.outbound{color:#aaa;vertical-align:middle;top:-1px}.icon.outbound,.search-box{display:inline-block;position:relative}.search-box{margin-right:1rem}.search-box input{cursor:text;width:10rem;height:2rem;color:#4e6e8e;display:inline-block;border:1px solid #cfd4db;border-radius:2rem;font-size:.9rem;line-height:2rem;padding:0 .5rem 0 2rem;outline:none;transition:all .2s ease;background:#fff url(/assets/img/search.83621669.svg) .6rem .5rem no-repeat;background-size:1rem}.search-box input:focus{cursor:auto;border-color:#007af5}.search-box .suggestions{background:#fff;width:20rem;position:absolute;top:1.5rem;border:1px solid #cfd4db;border-radius:6px;padding:.4rem;list-style-type:none}.search-box .suggestions.align-right{right:0}.search-box .suggestion{line-height:1.4;padding:.4rem .6rem;border-radius:4px;cursor:pointer}.search-box .suggestion a{white-space:normal;color:#5d82a6}.search-box .suggestion a .page-title{font-weight:600}.search-box .suggestion a .header{font-size:.9em;margin-left:.25em}.search-box .suggestion.focused{background-color:#f3f4f5}.search-box .suggestion.focused a{color:#007af5}@media (max-width:959px){.search-box input{cursor:pointer;width:0;border-color:transparent;position:relative}.search-box input:focus{cursor:text;left:0;width:10rem}}@media (-ms-high-contrast:none){.search-box input{height:2rem}}@media (max-width:959px) and (min-width:719px){.search-box .suggestions{left:0}}@media (max-width:719px){.search-box{margin-right:0}.search-box input{left:1rem}.search-box .suggestions{right:0}}@media (max-width:419px){.search-box .suggestions{width:calc(100vw - 4rem)}.search-box input:focus{width:8rem}}.sidebar-button{cursor:pointer;display:none;width:1.25rem;height:1.25rem;position:absolute;padding:.6rem;top:.6rem;left:1rem}.sidebar-button .icon{display:block;width:1.25rem;height:1.25rem}@media (max-width:719px){.sidebar-button{display:block}}.dropdown-enter,.dropdown-leave-to{height:0!important}.dropdown-wrapper{cursor:pointer}.dropdown-wrapper .dropdown-title{display:block}.dropdown-wrapper .dropdown-title:hover{border-color:transparent}.dropdown-wrapper .dropdown-title .arrow{vertical-align:middle;margin-top:-1px;margin-left:.4rem}.dropdown-wrapper .nav-dropdown .dropdown-item{color:inherit;line-height:1.7rem}.dropdown-wrapper .nav-dropdown .dropdown-item h4{margin:.45rem 0 0;border-top:1px solid #eee;padding:.45rem 1.5rem 0 1.25rem}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem-wrapper{padding:0;list-style:none}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem-wrapper .dropdown-subitem{font-size:.9em}.dropdown-wrapper .nav-dropdown .dropdown-item a{display:block;line-height:1.7rem;position:relative;border-bottom:none;font-weight:400;margin-bottom:0;padding:0 1.5rem 0 1.25rem}.dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active,.dropdown-wrapper .nav-dropdown .dropdown-item a:hover{color:#007af5}.dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active:after{content:"";width:0;height:0;border-left:5px solid #007af5;border-top:3px solid transparent;border-bottom:3px solid transparent;position:absolute;top:calc(50% - 2px);left:9px}.dropdown-wrapper .nav-dropdown .dropdown-item:first-child h4{margin-top:0;padding-top:0;border-top:0}@media (max-width:719px){.dropdown-wrapper.open .dropdown-title{margin-bottom:.5rem}.dropdown-wrapper .nav-dropdown{transition:height .1s ease-out;overflow:hidden}.dropdown-wrapper .nav-dropdown .dropdown-item h4{border-top:0;margin-top:0;padding-top:0}.dropdown-wrapper .nav-dropdown .dropdown-item>a,.dropdown-wrapper .nav-dropdown .dropdown-item h4{font-size:15px;line-height:2rem}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem{font-size:14px;padding-left:1rem}}@media (min-width:719px){.dropdown-wrapper{height:1.8rem}.dropdown-wrapper:hover .nav-dropdown{display:block!important}.dropdown-wrapper .dropdown-title .arrow{border-left:4px solid transparent;border-right:4px solid transparent;border-top:6px solid #ccc;border-bottom:0}.dropdown-wrapper .nav-dropdown{display:none;height:auto!important;box-sizing:border-box;max-height:calc(100vh - 2.7rem);overflow-y:auto;position:absolute;top:100%;right:0;background-color:#fff;padding:.6rem 0;border:1px solid;border-color:#ddd #ddd #ccc;text-align:left;border-radius:.25rem;white-space:nowrap;margin:0}}.nav-links{display:inline-block}.nav-links a{line-height:1.4rem;color:inherit}.nav-links a.router-link-active,.nav-links a:hover{color:#007af5}.nav-links .nav-item{position:relative;display:inline-block;margin-left:1.5rem;line-height:2rem}.nav-links .nav-item:first-child{margin-left:0}.nav-links .repo-link{margin-left:1.5rem}@media (max-width:719px){.nav-links .nav-item,.nav-links .repo-link{margin-left:0}}@media (min-width:719px){.nav-links a.router-link-active,.nav-links a:hover{color:#2c3e50}.nav-item>a:not(.external).router-link-active,.nav-item>a:not(.external):hover{margin-bottom:-2px;border-bottom:2px solid #0b85ff}}.navbar{padding:.7rem 1.5rem;line-height:2.2rem}.navbar a,.navbar img,.navbar span{display:inline-block}.navbar .logo{height:2.2rem;min-width:2.2rem;margin-right:.8rem;vertical-align:top}.navbar .site-name{font-size:1.3rem;font-weight:600;color:#2c3e50;position:relative}.navbar .links{padding-left:1.5rem;box-sizing:border-box;background-color:#fff;white-space:nowrap;font-size:.9rem;position:absolute;right:1.5rem;top:.7rem;display:flex}.navbar .links .search-box{flex:0 0 auto;vertical-align:top}@media (max-width:719px){.navbar{padding-left:4rem}.navbar .can-hide{display:none}.navbar .links{padding-left:1.5rem}}.page-edit,.page-nav{max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.page-edit,.page-nav{padding:2rem}}@media (max-width:419px){.page-edit,.page-nav{padding:1.5rem}}.page{padding-bottom:2rem;display:block}.page-edit{padding-top:1rem;padding-bottom:1rem;overflow:auto}.page-edit .edit-link{display:inline-block}.page-edit .edit-link a{color:#4e6e8e;margin-right:.25rem}.page-edit .last-updated{float:right;font-size:.9em}.page-edit .last-updated .prefix{font-weight:500;color:#4e6e8e}.page-edit .last-updated .time{font-weight:400;color:#aaa}.page-nav{padding-top:1rem;padding-bottom:0}.page-nav .inner{min-height:2rem;margin-top:0;border-top:1px solid #eaecef;padding-top:1rem;overflow:auto}.page-nav .next{float:right}@media (max-width:719px){.page-edit .edit-link{margin-bottom:.5rem}.page-edit .last-updated{font-size:.8em;float:none;text-align:left}}.sidebar-group .sidebar-group{padding-left:.5em}.sidebar-group:not(.collapsable) .sidebar-heading:not(.clickable){cursor:auto;color:inherit}.sidebar-group.is-sub-group{padding-left:0}.sidebar-group.is-sub-group>.sidebar-heading{font-size:.95em;line-height:1.4;font-weight:400;padding-left:2rem}.sidebar-group.is-sub-group>.sidebar-heading:not(.clickable){opacity:.5}.sidebar-group.is-sub-group>.sidebar-group-items{padding-left:1rem}.sidebar-group.is-sub-group>.sidebar-group-items>li>.sidebar-link{font-size:.95em;border-left:none}.sidebar-group.depth-2>.sidebar-heading{border-left:none}.sidebar-heading{color:#2c3e50;transition:color .15s ease;cursor:pointer;font-size:1.1em;font-weight:700;padding:.35rem 1.5rem .35rem 1.25rem;width:100%;box-sizing:border-box;margin:0;border-left:.25rem solid transparent}.sidebar-heading.open,.sidebar-heading:hover{color:inherit}.sidebar-heading .arrow{position:relative;top:-.12em;left:.5em}.sidebar-heading.clickable.active{font-weight:600;color:#007af5;border-left-color:#007af5}.sidebar-heading.clickable:hover{color:#007af5}.sidebar-group-items{transition:height .1s ease-out;font-size:.95em;overflow:hidden}.sidebar .sidebar-sub-headers{padding-left:1rem;font-size:.95em}a.sidebar-link{font-size:1em;font-weight:400;display:inline-block;color:#2c3e50;border-left:.25rem solid transparent;padding:.35rem 1rem .35rem 1.25rem;line-height:1.4;width:100%;box-sizing:border-box}a.sidebar-link:hover{color:#007af5}a.sidebar-link.active{font-weight:600;color:#007af5;border-left-color:#007af5}.sidebar-group a.sidebar-link{padding-left:2rem}.sidebar-sub-headers a.sidebar-link{padding-top:.25rem;padding-bottom:.25rem;border-left:none}.sidebar-sub-headers a.sidebar-link.active{font-weight:500}.sidebar ul{padding:0;margin:0;list-style-type:none}.sidebar a{display:inline-block}.sidebar .nav-links{display:none;border-bottom:1px solid #eaecef;padding:.5rem 0 .75rem}.sidebar .nav-links a{font-weight:600}.sidebar .nav-links .nav-item,.sidebar .nav-links .repo-link{display:block;line-height:1.25rem;font-size:1.1em;padding:.5rem 0 .5rem 1.5rem}.sidebar>.sidebar-links{padding:1.5rem 0}.sidebar>.sidebar-links>li>a.sidebar-link{font-size:1.1em;line-height:1.7;font-weight:700}.sidebar>.sidebar-links>li:not(:first-child){margin-top:.75rem}@media (max-width:719px){.sidebar .nav-links{display:block}.sidebar .nav-links .dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active:after{top:calc(1rem - 2px)}.sidebar>.sidebar-links{padding:1rem 0}}code[class*=language-],pre[class*=language-]{color:#ccc;background:none;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#2d2d2d}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.block-comment,.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#999}.token.punctuation{color:#ccc}.token.attr-name,.token.deleted,.token.namespace,.token.tag{color:#e2777a}.token.function-name{color:#6196cc}.token.boolean,.token.function,.token.number{color:#f08d49}.token.class-name,.token.constant,.token.property,.token.symbol{color:#f8c555}.token.atrule,.token.builtin,.token.important,.token.keyword,.token.selector{color:#cc99cd}.token.attr-value,.token.char,.token.regex,.token.string,.token.variable{color:#7ec699}.token.entity,.token.operator,.token.url{color:#67cdcc}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.inserted{color:green}.bottom-description[data-v-79c95b4d]{text-align:center;font-size:.8rem;color:#909399}.side-nav-item[data-v-79c95b4d]{margin-bottom:-2px;margin-left:20px;display:inline-block;line-height:1.4rem;white-space:nowrap;font-size:1rem;cursor:pointer}.side-nav-item a[data-v-79c95b4d]{color:#2c3e50}.theme-default-content code{color:#476582;padding:.25rem .5rem;margin:0;font-size:.85em;background-color:rgba(27,31,35,.05);border-radius:3px}.theme-default-content code .token.deleted{color:#ec5975}.theme-default-content code .token.inserted{color:#007af5}.theme-default-content pre,.theme-default-content pre[class*=language-]{line-height:1.4;padding:1.25rem 1.5rem;margin:.85rem 0;background-color:#282c34;border-radius:6px;overflow:auto}.theme-default-content pre[class*=language-] code,.theme-default-content pre code{color:#fff;padding:0;background-color:transparent;border-radius:0}div[class*=language-]{position:relative;background-color:#282c34;border-radius:6px}div[class*=language-] .highlight-lines{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;padding-top:1.3rem;position:absolute;top:0;left:0;width:100%;line-height:1.4}div[class*=language-] .highlight-lines .highlighted{background-color:rgba(0,0,0,.66)}div[class*=language-] pre,div[class*=language-] pre[class*=language-]{background:transparent;position:relative;z-index:1}div[class*=language-]:before{position:absolute;z-index:3;top:.8em;right:1em;font-size:.75rem;color:hsla(0,0%,100%,.4)}div[class*=language-]:not(.line-numbers-mode) .line-numbers-wrapper{display:none}div[class*=language-].line-numbers-mode .highlight-lines .highlighted{position:relative}div[class*=language-].line-numbers-mode .highlight-lines .highlighted:before{content:" ";position:absolute;z-index:3;left:0;top:0;display:block;width:3.5rem;height:100%;background-color:rgba(0,0,0,.66)}div[class*=language-].line-numbers-mode pre{padding-left:4.5rem;vertical-align:middle}div[class*=language-].line-numbers-mode .line-numbers-wrapper{position:absolute;top:0;width:3.5rem;text-align:center;color:hsla(0,0%,100%,.3);padding:1.25rem 0;line-height:1.4}div[class*=language-].line-numbers-mode .line-numbers-wrapper .line-number,div[class*=language-].line-numbers-mode .line-numbers-wrapper br{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}div[class*=language-].line-numbers-mode .line-numbers-wrapper .line-number{position:relative;z-index:4;font-size:.85em}div[class*=language-].line-numbers-mode:after{content:"";position:absolute;z-index:2;top:0;left:0;width:3.5rem;height:100%;border-radius:6px 0 0 6px;border-right:1px solid rgba(0,0,0,.66);background-color:#282c34}div[class~=language-js]:before{content:"js"}div[class~=language-ts]:before{content:"ts"}div[class~=language-html]:before{content:"html"}div[class~=language-md]:before{content:"md"}div[class~=language-vue]:before{content:"vue"}div[class~=language-css]:before{content:"css"}div[class~=language-sass]:before{content:"sass"}div[class~=language-scss]:before{content:"scss"}div[class~=language-less]:before{content:"less"}div[class~=language-stylus]:before{content:"stylus"}div[class~=language-go]:before{content:"go"}div[class~=language-java]:before{content:"java"}div[class~=language-c]:before{content:"c"}div[class~=language-sh]:before{content:"sh"}div[class~=language-yaml]:before{content:"yaml"}div[class~=language-py]:before{content:"py"}div[class~=language-docker]:before{content:"docker"}div[class~=language-dockerfile]:before{content:"dockerfile"}div[class~=language-makefile]:before{content:"makefile"}div[class~=language-javascript]:before{content:"js"}div[class~=language-typescript]:before{content:"ts"}div[class~=language-markup]:before{content:"html"}div[class~=language-markdown]:before{content:"md"}div[class~=language-json]:before{content:"json"}div[class~=language-ruby]:before{content:"rb"}div[class~=language-python]:before{content:"py"}div[class~=language-bash]:before{content:"sh"}div[class~=language-php]:before{content:"php"}.custom-block .custom-block-title{font-weight:600;margin-bottom:-.4rem}.custom-block.danger,.custom-block.tip,.custom-block.warning{padding:.1rem 1.5rem;border-left-width:.5rem;border-left-style:solid;margin:1rem 0}.custom-block.tip{background-color:#f3f5f7;border-color:#42b983}.custom-block.warning{background-color:rgba(255,229,100,.3);border-color:#e7c000;color:#6b5900}.custom-block.warning .custom-block-title{color:#b29400}.custom-block.warning a{color:#2c3e50}.custom-block.danger{background-color:#ffe6e6;border-color:#c00;color:#4d0000}.custom-block.danger .custom-block-title{color:#900}.custom-block.danger a{color:#2c3e50}.arrow{display:inline-block;width:0;height:0}.arrow.up{border-bottom:6px solid #ccc}.arrow.down,.arrow.up{border-left:4px solid transparent;border-right:4px solid transparent}.arrow.down{border-top:6px solid #ccc}.arrow.right{border-left:6px solid #ccc}.arrow.left,.arrow.right{border-top:4px solid transparent;border-bottom:4px solid transparent}.arrow.left{border-right:6px solid #ccc}.theme-default-content:not(.custom){max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.theme-default-content:not(.custom){padding:2rem}}@media (max-width:419px){.theme-default-content:not(.custom){padding:1.5rem}}.table-of-contents .badge{vertical-align:middle}body,html{padding:0;margin:0;background-color:#fff}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:16px;color:#2c3e50}.page{padding-left:20rem}.navbar{z-index:20;right:0;height:3.6rem;background-color:#fff;box-sizing:border-box;border-bottom:1px solid #eaecef}.navbar,.sidebar-mask{position:fixed;top:0;left:0}.sidebar-mask{z-index:9;width:100vw;height:100vh;display:none}.sidebar{font-size:16px;background-color:#fff;width:20rem;position:fixed;z-index:10;margin:0;top:3.6rem;left:0;bottom:0;box-sizing:border-box;border-right:1px solid #eaecef;overflow-y:auto}.theme-default-content:not(.custom)>:first-child{margin-top:3.6rem}.theme-default-content:not(.custom) a:hover{text-decoration:underline}.theme-default-content:not(.custom) p.demo{padding:1rem 1.5rem;border:1px solid #ddd;border-radius:4px}.theme-default-content:not(.custom) img{max-width:100%}.theme-default-content.custom{padding:0;margin:0}.theme-default-content.custom img{max-width:100%}a{font-weight:500;text-decoration:none}a,p a code{color:#007af5}p a code{font-weight:400}kbd{background:#eee;border:.15rem solid #ddd;border-bottom:.25rem solid #ddd;border-radius:.15rem;padding:0 .15em}blockquote{font-size:1rem;color:#999;border-left:.2rem solid #dfe2e5;margin:1rem 0;padding:.25rem 0 .25rem 1rem}blockquote>p{margin:0}ol,ul{padding-left:1.2em}strong{font-weight:600}h1,h2,h3,h4,h5,h6{font-weight:600;line-height:1.25}.theme-default-content:not(.custom)>h1,.theme-default-content:not(.custom)>h2,.theme-default-content:not(.custom)>h3,.theme-default-content:not(.custom)>h4,.theme-default-content:not(.custom)>h5,.theme-default-content:not(.custom)>h6{margin-top:-3.1rem;padding-top:4.6rem;margin-bottom:0}.theme-default-content:not(.custom)>h1:first-child,.theme-default-content:not(.custom)>h2:first-child,.theme-default-content:not(.custom)>h3:first-child,.theme-default-content:not(.custom)>h4:first-child,.theme-default-content:not(.custom)>h5:first-child,.theme-default-content:not(.custom)>h6:first-child{margin-top:-1.5rem;margin-bottom:1rem}.theme-default-content:not(.custom)>h1:first-child+.custom-block,.theme-default-content:not(.custom)>h1:first-child+p,.theme-default-content:not(.custom)>h1:first-child+pre,.theme-default-content:not(.custom)>h2:first-child+.custom-block,.theme-default-content:not(.custom)>h2:first-child+p,.theme-default-content:not(.custom)>h2:first-child+pre,.theme-default-content:not(.custom)>h3:first-child+.custom-block,.theme-default-content:not(.custom)>h3:first-child+p,.theme-default-content:not(.custom)>h3:first-child+pre,.theme-default-content:not(.custom)>h4:first-child+.custom-block,.theme-default-content:not(.custom)>h4:first-child+p,.theme-default-content:not(.custom)>h4:first-child+pre,.theme-default-content:not(.custom)>h5:first-child+.custom-block,.theme-default-content:not(.custom)>h5:first-child+p,.theme-default-content:not(.custom)>h5:first-child+pre,.theme-default-content:not(.custom)>h6:first-child+.custom-block,.theme-default-content:not(.custom)>h6:first-child+p,.theme-default-content:not(.custom)>h6:first-child+pre{margin-top:2rem}h1:hover .header-anchor,h2:hover .header-anchor,h3:hover .header-anchor,h4:hover .header-anchor,h5:hover .header-anchor,h6:hover .header-anchor{opacity:1}h1{font-size:2.2rem}h2{font-size:1.65rem;padding-bottom:.3rem;border-bottom:1px solid #eaecef}h3{font-size:1.35rem}a.header-anchor{font-size:.85em;float:left;margin-left:-.87em;padding-right:.23em;margin-top:.125em;opacity:0}a.header-anchor:hover{text-decoration:none}.line-number,code,kbd{font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace}ol,p,ul{line-height:1.7}hr{border:0;border-top:1px solid #eaecef}table{border-collapse:collapse;margin:1rem 0;display:block;overflow-x:auto}tr{border-top:1px solid #dfe2e5}tr:nth-child(2n){background-color:#f6f8fa}td,th{border:1px solid #dfe2e5;padding:.6em 1em}.theme-container.sidebar-open .sidebar-mask{display:block}.theme-container.no-navbar .theme-default-content:not(.custom)>h1,.theme-container.no-navbar h2,.theme-container.no-navbar h3,.theme-container.no-navbar h4,.theme-container.no-navbar h5,.theme-container.no-navbar h6{margin-top:1.5rem;padding-top:0}.theme-container.no-navbar .sidebar{top:0}@media (min-width:720px){.theme-container.no-sidebar .sidebar{display:none}.theme-container.no-sidebar .page{padding-left:0}}@media (max-width:959px){.sidebar{font-size:15px;width:16.4rem}.page{padding-left:16.4rem}}@media (max-width:719px){.sidebar{top:0;padding-top:3.6rem;transform:translateX(-100%);transition:transform .2s ease}.page{padding-left:0}.theme-container.sidebar-open .sidebar{transform:translateX(0)}.theme-container.no-navbar .sidebar{padding-top:0}}@media (max-width:419px){h1{font-size:1.9rem}.theme-default-content div[class*=language-]{margin:.85rem -1.5rem;border-radius:0}}.content__default{max-width:1000px!important}p img{border:1px solid #d7dae2}.home{padding:3.6rem 2rem 0;max-width:960px;margin:0 auto;display:block}.home .hero{text-align:center}.home .hero img{max-width:100%;max-height:280px;display:block;margin:3rem auto 1.5rem}.home .hero h1{font-size:3rem}.home .hero .action,.home .hero .description,.home .hero h1{margin:1.8rem auto}.home .hero .description{max-width:35rem;font-size:1.6rem;line-height:1.3;color:#6a8bad}.home .hero .action-button{display:inline-block;font-size:1.2rem;color:#fff;background-color:#007af5;vertical-align:top;margin-left:.5rem;padding:.8rem 1.6rem;border-radius:4px;transition:background-color .1s ease;box-sizing:border-box;border-bottom:1px solid #006edd}.home .hero .action-button:hover{background-color:#1187ff;color:#fff}.home .hero .action-button2{color:#007af5;background-color:#fff;border:1px solid #007af5}.home .features{border-top:1px solid #eaecef;padding:1.2rem 0;margin-top:2.5rem;display:flex;flex-wrap:wrap;align-items:flex-start;align-content:stretch;justify-content:space-between}.home .feature{flex-grow:1;flex-basis:30%;max-width:30%}.home .feature h2{font-size:1.4rem;font-weight:500;border-bottom:none;padding-bottom:0;color:#3a5169}.home .feature p{color:#4e6e8e}.home .footer{padding:2.5rem;border-top:1px solid #eaecef;text-align:center;color:#4e6e8e}@media (max-width:719px){.home .features{flex-direction:column}.home .feature{max-width:100%;padding:0 2.5rem}}@media (max-width:419px){.home{padding-left:1.5rem;padding-right:1.5rem}.home .hero img{max-height:210px;margin:2rem auto 1.2rem}.home .hero h1{font-size:2rem}.home .hero .action,.home .hero .description,.home .hero h1{margin:1.2rem auto}.home .hero .description{font-size:1.2rem}.home .hero .action-button{font-size:1rem;padding:.6rem 1.2rem}.home .feature h2{font-size:1.25rem}}.badge[data-v-c13ee5b0]{display:inline-block;font-size:14px;height:18px;line-height:18px;border-radius:3px;padding:0 6px;color:#fff}.badge.green[data-v-c13ee5b0],.badge.tip[data-v-c13ee5b0],.badge[data-v-c13ee5b0]{background-color:#42b983}.badge.error[data-v-c13ee5b0]{background-color:#da5961}.badge.warn[data-v-c13ee5b0],.badge.warning[data-v-c13ee5b0],.badge.yellow[data-v-c13ee5b0]{background-color:#e7c000}.badge+.badge[data-v-c13ee5b0]{margin-left:5px} \ No newline at end of file diff --git a/docs/assets/css/0.styles.f7270952.css b/docs/assets/css/0.styles.f7270952.css deleted file mode 100644 index 5d2da21..0000000 --- a/docs/assets/css/0.styles.f7270952.css +++ /dev/null @@ -1 +0,0 @@ -#nprogress{pointer-events:none}#nprogress .bar{background:#007af5;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px #007af5,0 0 5px #007af5;opacity:1;transform:rotate(3deg) translateY(-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border-color:#007af5 transparent transparent #007af5;border-style:solid;border-width:2px;border-radius:50%;-webkit-animation:nprogress-spinner .4s linear infinite;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@-webkit-keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.go-to-top[data-v-67a9666a]{cursor:pointer;position:fixed;bottom:2rem;right:2.5rem;width:2rem;color:#007af5;z-index:1}.go-to-top[data-v-67a9666a]:hover{color:#45a2ff}@media (max-width:959px){.go-to-top[data-v-67a9666a]{display:none}}.fade-enter-active[data-v-67a9666a],.fade-leave-active[data-v-67a9666a]{transition:opacity .3s}.fade-enter[data-v-67a9666a],.fade-leave-to[data-v-67a9666a]{opacity:0}.icon.outbound{color:#aaa;vertical-align:middle;top:-1px}.icon.outbound,.search-box{display:inline-block;position:relative}.search-box{margin-right:1rem}.search-box input{cursor:text;width:10rem;height:2rem;color:#4e6e8e;display:inline-block;border:1px solid #cfd4db;border-radius:2rem;font-size:.9rem;line-height:2rem;padding:0 .5rem 0 2rem;outline:none;transition:all .2s ease;background:#fff url(/assets/img/search.83621669.svg) .6rem .5rem no-repeat;background-size:1rem}.search-box input:focus{cursor:auto;border-color:#007af5}.search-box .suggestions{background:#fff;width:20rem;position:absolute;top:1.5rem;border:1px solid #cfd4db;border-radius:6px;padding:.4rem;list-style-type:none}.search-box .suggestions.align-right{right:0}.search-box .suggestion{line-height:1.4;padding:.4rem .6rem;border-radius:4px;cursor:pointer}.search-box .suggestion a{white-space:normal;color:#5d82a6}.search-box .suggestion a .page-title{font-weight:600}.search-box .suggestion a .header{font-size:.9em;margin-left:.25em}.search-box .suggestion.focused{background-color:#f3f4f5}.search-box .suggestion.focused a{color:#007af5}@media (max-width:959px){.search-box input{cursor:pointer;width:0;border-color:transparent;position:relative}.search-box input:focus{cursor:text;left:0;width:10rem}}@media (-ms-high-contrast:none){.search-box input{height:2rem}}@media (max-width:959px) and (min-width:719px){.search-box .suggestions{left:0}}@media (max-width:719px){.search-box{margin-right:0}.search-box input{left:1rem}.search-box .suggestions{right:0}}@media (max-width:419px){.search-box .suggestions{width:calc(100vw - 4rem)}.search-box input:focus{width:8rem}}.sidebar-button{cursor:pointer;display:none;width:1.25rem;height:1.25rem;position:absolute;padding:.6rem;top:.6rem;left:1rem}.sidebar-button .icon{display:block;width:1.25rem;height:1.25rem}@media (max-width:719px){.sidebar-button{display:block}}.dropdown-enter,.dropdown-leave-to{height:0!important}.dropdown-wrapper{cursor:pointer}.dropdown-wrapper .dropdown-title{display:block}.dropdown-wrapper .dropdown-title:hover{border-color:transparent}.dropdown-wrapper .dropdown-title .arrow{vertical-align:middle;margin-top:-1px;margin-left:.4rem}.dropdown-wrapper .nav-dropdown .dropdown-item{color:inherit;line-height:1.7rem}.dropdown-wrapper .nav-dropdown .dropdown-item h4{margin:.45rem 0 0;border-top:1px solid #eee;padding:.45rem 1.5rem 0 1.25rem}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem-wrapper{padding:0;list-style:none}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem-wrapper .dropdown-subitem{font-size:.9em}.dropdown-wrapper .nav-dropdown .dropdown-item a{display:block;line-height:1.7rem;position:relative;border-bottom:none;font-weight:400;margin-bottom:0;padding:0 1.5rem 0 1.25rem}.dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active,.dropdown-wrapper .nav-dropdown .dropdown-item a:hover{color:#007af5}.dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active:after{content:"";width:0;height:0;border-left:5px solid #007af5;border-top:3px solid transparent;border-bottom:3px solid transparent;position:absolute;top:calc(50% - 2px);left:9px}.dropdown-wrapper .nav-dropdown .dropdown-item:first-child h4{margin-top:0;padding-top:0;border-top:0}@media (max-width:719px){.dropdown-wrapper.open .dropdown-title{margin-bottom:.5rem}.dropdown-wrapper .nav-dropdown{transition:height .1s ease-out;overflow:hidden}.dropdown-wrapper .nav-dropdown .dropdown-item h4{border-top:0;margin-top:0;padding-top:0}.dropdown-wrapper .nav-dropdown .dropdown-item>a,.dropdown-wrapper .nav-dropdown .dropdown-item h4{font-size:15px;line-height:2rem}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem{font-size:14px;padding-left:1rem}}@media (min-width:719px){.dropdown-wrapper{height:1.8rem}.dropdown-wrapper:hover .nav-dropdown{display:block!important}.dropdown-wrapper .dropdown-title .arrow{border-left:4px solid transparent;border-right:4px solid transparent;border-top:6px solid #ccc;border-bottom:0}.dropdown-wrapper .nav-dropdown{display:none;height:auto!important;box-sizing:border-box;max-height:calc(100vh - 2.7rem);overflow-y:auto;position:absolute;top:100%;right:0;background-color:#fff;padding:.6rem 0;border:1px solid;border-color:#ddd #ddd #ccc;text-align:left;border-radius:.25rem;white-space:nowrap;margin:0}}.nav-links{display:inline-block}.nav-links a{line-height:1.4rem;color:inherit}.nav-links a.router-link-active,.nav-links a:hover{color:#007af5}.nav-links .nav-item{position:relative;display:inline-block;margin-left:1.5rem;line-height:2rem}.nav-links .nav-item:first-child{margin-left:0}.nav-links .repo-link{margin-left:1.5rem}@media (max-width:719px){.nav-links .nav-item,.nav-links .repo-link{margin-left:0}}@media (min-width:719px){.nav-links a.router-link-active,.nav-links a:hover{color:#2c3e50}.nav-item>a:not(.external).router-link-active,.nav-item>a:not(.external):hover{margin-bottom:-2px;border-bottom:2px solid #0b85ff}}.navbar{padding:.7rem 1.5rem;line-height:2.2rem}.navbar a,.navbar img,.navbar span{display:inline-block}.navbar .logo{height:2.2rem;min-width:2.2rem;margin-right:.8rem;vertical-align:top}.navbar .site-name{font-size:1.3rem;font-weight:600;color:#2c3e50;position:relative}.navbar .links{padding-left:1.5rem;box-sizing:border-box;background-color:#fff;white-space:nowrap;font-size:.9rem;position:absolute;right:1.5rem;top:.7rem;display:flex}.navbar .links .search-box{flex:0 0 auto;vertical-align:top}@media (max-width:719px){.navbar{padding-left:4rem}.navbar .can-hide{display:none}.navbar .links{padding-left:1.5rem}}.page-edit,.page-nav{max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.page-edit,.page-nav{padding:2rem}}@media (max-width:419px){.page-edit,.page-nav{padding:1.5rem}}.page{padding-bottom:2rem;display:block}.page-edit{padding-top:1rem;padding-bottom:1rem;overflow:auto}.page-edit .edit-link{display:inline-block}.page-edit .edit-link a{color:#4e6e8e;margin-right:.25rem}.page-edit .last-updated{float:right;font-size:.9em}.page-edit .last-updated .prefix{font-weight:500;color:#4e6e8e}.page-edit .last-updated .time{font-weight:400;color:#aaa}.page-nav{padding-top:1rem;padding-bottom:0}.page-nav .inner{min-height:2rem;margin-top:0;border-top:1px solid #eaecef;padding-top:1rem;overflow:auto}.page-nav .next{float:right}@media (max-width:719px){.page-edit .edit-link{margin-bottom:.5rem}.page-edit .last-updated{font-size:.8em;float:none;text-align:left}}.sidebar-group .sidebar-group{padding-left:.5em}.sidebar-group:not(.collapsable) .sidebar-heading:not(.clickable){cursor:auto;color:inherit}.sidebar-group.is-sub-group{padding-left:0}.sidebar-group.is-sub-group>.sidebar-heading{font-size:.95em;line-height:1.4;font-weight:400;padding-left:2rem}.sidebar-group.is-sub-group>.sidebar-heading:not(.clickable){opacity:.5}.sidebar-group.is-sub-group>.sidebar-group-items{padding-left:1rem}.sidebar-group.is-sub-group>.sidebar-group-items>li>.sidebar-link{font-size:.95em;border-left:none}.sidebar-group.depth-2>.sidebar-heading{border-left:none}.sidebar-heading{color:#2c3e50;transition:color .15s ease;cursor:pointer;font-size:1.1em;font-weight:700;padding:.35rem 1.5rem .35rem 1.25rem;width:100%;box-sizing:border-box;margin:0;border-left:.25rem solid transparent}.sidebar-heading.open,.sidebar-heading:hover{color:inherit}.sidebar-heading .arrow{position:relative;top:-.12em;left:.5em}.sidebar-heading.clickable.active{font-weight:600;color:#007af5;border-left-color:#007af5}.sidebar-heading.clickable:hover{color:#007af5}.sidebar-group-items{transition:height .1s ease-out;font-size:.95em;overflow:hidden}.sidebar .sidebar-sub-headers{padding-left:1rem;font-size:.95em}a.sidebar-link{font-size:1em;font-weight:400;display:inline-block;color:#2c3e50;border-left:.25rem solid transparent;padding:.35rem 1rem .35rem 1.25rem;line-height:1.4;width:100%;box-sizing:border-box}a.sidebar-link:hover{color:#007af5}a.sidebar-link.active{font-weight:600;color:#007af5;border-left-color:#007af5}.sidebar-group a.sidebar-link{padding-left:2rem}.sidebar-sub-headers a.sidebar-link{padding-top:.25rem;padding-bottom:.25rem;border-left:none}.sidebar-sub-headers a.sidebar-link.active{font-weight:500}.sidebar ul{padding:0;margin:0;list-style-type:none}.sidebar a{display:inline-block}.sidebar .nav-links{display:none;border-bottom:1px solid #eaecef;padding:.5rem 0 .75rem}.sidebar .nav-links a{font-weight:600}.sidebar .nav-links .nav-item,.sidebar .nav-links .repo-link{display:block;line-height:1.25rem;font-size:1.1em;padding:.5rem 0 .5rem 1.5rem}.sidebar>.sidebar-links{padding:1.5rem 0}.sidebar>.sidebar-links>li>a.sidebar-link{font-size:1.1em;line-height:1.7;font-weight:700}.sidebar>.sidebar-links>li:not(:first-child){margin-top:.75rem}@media (max-width:719px){.sidebar .nav-links{display:block}.sidebar .nav-links .dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active:after{top:calc(1rem - 2px)}.sidebar>.sidebar-links{padding:1rem 0}}code[class*=language-],pre[class*=language-]{color:#ccc;background:none;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#2d2d2d}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.block-comment,.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#999}.token.punctuation{color:#ccc}.token.attr-name,.token.deleted,.token.namespace,.token.tag{color:#e2777a}.token.function-name{color:#6196cc}.token.boolean,.token.function,.token.number{color:#f08d49}.token.class-name,.token.constant,.token.property,.token.symbol{color:#f8c555}.token.atrule,.token.builtin,.token.important,.token.keyword,.token.selector{color:#cc99cd}.token.attr-value,.token.char,.token.regex,.token.string,.token.variable{color:#7ec699}.token.entity,.token.operator,.token.url{color:#67cdcc}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.inserted{color:green}.bottom-description[data-v-79c95b4d]{text-align:center;font-size:.8rem;color:#909399}.side-nav-item[data-v-79c95b4d]{margin-bottom:-2px;margin-left:20px;display:inline-block;line-height:1.4rem;white-space:nowrap;font-size:1rem;cursor:pointer}.side-nav-item a[data-v-79c95b4d]{color:#2c3e50}.theme-default-content code{color:#476582;padding:.25rem .5rem;margin:0;font-size:.85em;background-color:rgba(27,31,35,.05);border-radius:3px}.theme-default-content code .token.deleted{color:#ec5975}.theme-default-content code .token.inserted{color:#007af5}.theme-default-content pre,.theme-default-content pre[class*=language-]{line-height:1.4;padding:1.25rem 1.5rem;margin:.85rem 0;background-color:#282c34;border-radius:6px;overflow:auto}.theme-default-content pre[class*=language-] code,.theme-default-content pre code{color:#fff;padding:0;background-color:transparent;border-radius:0}div[class*=language-]{position:relative;background-color:#282c34;border-radius:6px}div[class*=language-] .highlight-lines{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;padding-top:1.3rem;position:absolute;top:0;left:0;width:100%;line-height:1.4}div[class*=language-] .highlight-lines .highlighted{background-color:rgba(0,0,0,.66)}div[class*=language-] pre,div[class*=language-] pre[class*=language-]{background:transparent;position:relative;z-index:1}div[class*=language-]:before{position:absolute;z-index:3;top:.8em;right:1em;font-size:.75rem;color:hsla(0,0%,100%,.4)}div[class*=language-]:not(.line-numbers-mode) .line-numbers-wrapper{display:none}div[class*=language-].line-numbers-mode .highlight-lines .highlighted{position:relative}div[class*=language-].line-numbers-mode .highlight-lines .highlighted:before{content:" ";position:absolute;z-index:3;left:0;top:0;display:block;width:3.5rem;height:100%;background-color:rgba(0,0,0,.66)}div[class*=language-].line-numbers-mode pre{padding-left:4.5rem;vertical-align:middle}div[class*=language-].line-numbers-mode .line-numbers-wrapper{position:absolute;top:0;width:3.5rem;text-align:center;color:hsla(0,0%,100%,.3);padding:1.25rem 0;line-height:1.4}div[class*=language-].line-numbers-mode .line-numbers-wrapper .line-number,div[class*=language-].line-numbers-mode .line-numbers-wrapper br{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}div[class*=language-].line-numbers-mode .line-numbers-wrapper .line-number{position:relative;z-index:4;font-size:.85em}div[class*=language-].line-numbers-mode:after{content:"";position:absolute;z-index:2;top:0;left:0;width:3.5rem;height:100%;border-radius:6px 0 0 6px;border-right:1px solid rgba(0,0,0,.66);background-color:#282c34}div[class~=language-js]:before{content:"js"}div[class~=language-ts]:before{content:"ts"}div[class~=language-html]:before{content:"html"}div[class~=language-md]:before{content:"md"}div[class~=language-vue]:before{content:"vue"}div[class~=language-css]:before{content:"css"}div[class~=language-sass]:before{content:"sass"}div[class~=language-scss]:before{content:"scss"}div[class~=language-less]:before{content:"less"}div[class~=language-stylus]:before{content:"stylus"}div[class~=language-go]:before{content:"go"}div[class~=language-java]:before{content:"java"}div[class~=language-c]:before{content:"c"}div[class~=language-sh]:before{content:"sh"}div[class~=language-yaml]:before{content:"yaml"}div[class~=language-py]:before{content:"py"}div[class~=language-docker]:before{content:"docker"}div[class~=language-dockerfile]:before{content:"dockerfile"}div[class~=language-makefile]:before{content:"makefile"}div[class~=language-javascript]:before{content:"js"}div[class~=language-typescript]:before{content:"ts"}div[class~=language-markup]:before{content:"html"}div[class~=language-markdown]:before{content:"md"}div[class~=language-json]:before{content:"json"}div[class~=language-ruby]:before{content:"rb"}div[class~=language-python]:before{content:"py"}div[class~=language-bash]:before{content:"sh"}div[class~=language-php]:before{content:"php"}.custom-block .custom-block-title{font-weight:600;margin-bottom:-.4rem}.custom-block.danger,.custom-block.tip,.custom-block.warning{padding:.1rem 1.5rem;border-left-width:.5rem;border-left-style:solid;margin:1rem 0}.custom-block.tip{background-color:#f3f5f7;border-color:#42b983}.custom-block.warning{background-color:rgba(255,229,100,.3);border-color:#e7c000;color:#6b5900}.custom-block.warning .custom-block-title{color:#b29400}.custom-block.warning a{color:#2c3e50}.custom-block.danger{background-color:#ffe6e6;border-color:#c00;color:#4d0000}.custom-block.danger .custom-block-title{color:#900}.custom-block.danger a{color:#2c3e50}.arrow{display:inline-block;width:0;height:0}.arrow.up{border-bottom:6px solid #ccc}.arrow.down,.arrow.up{border-left:4px solid transparent;border-right:4px solid transparent}.arrow.down{border-top:6px solid #ccc}.arrow.right{border-left:6px solid #ccc}.arrow.left,.arrow.right{border-top:4px solid transparent;border-bottom:4px solid transparent}.arrow.left{border-right:6px solid #ccc}.theme-default-content:not(.custom){max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.theme-default-content:not(.custom){padding:2rem}}@media (max-width:419px){.theme-default-content:not(.custom){padding:1.5rem}}.table-of-contents .badge{vertical-align:middle}body,html{padding:0;margin:0;background-color:#fff}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:16px;color:#2c3e50}.page{padding-left:20rem}.navbar{z-index:20;right:0;height:3.6rem;background-color:#fff;box-sizing:border-box;border-bottom:1px solid #eaecef}.navbar,.sidebar-mask{position:fixed;top:0;left:0}.sidebar-mask{z-index:9;width:100vw;height:100vh;display:none}.sidebar{font-size:16px;background-color:#fff;width:20rem;position:fixed;z-index:10;margin:0;top:3.6rem;left:0;bottom:0;box-sizing:border-box;border-right:1px solid #eaecef;overflow-y:auto}.theme-default-content:not(.custom)>:first-child{margin-top:3.6rem}.theme-default-content:not(.custom) a:hover{text-decoration:underline}.theme-default-content:not(.custom) p.demo{padding:1rem 1.5rem;border:1px solid #ddd;border-radius:4px}.theme-default-content:not(.custom) img{max-width:100%}.theme-default-content.custom{padding:0;margin:0}.theme-default-content.custom img{max-width:100%}a{font-weight:500;text-decoration:none}a,p a code{color:#007af5}p a code{font-weight:400}kbd{background:#eee;border:.15rem solid #ddd;border-bottom:.25rem solid #ddd;border-radius:.15rem;padding:0 .15em}blockquote{font-size:1rem;color:#999;border-left:.2rem solid #dfe2e5;margin:1rem 0;padding:.25rem 0 .25rem 1rem}blockquote>p{margin:0}ol,ul{padding-left:1.2em}strong{font-weight:600}h1,h2,h3,h4,h5,h6{font-weight:600;line-height:1.25}.theme-default-content:not(.custom)>h1,.theme-default-content:not(.custom)>h2,.theme-default-content:not(.custom)>h3,.theme-default-content:not(.custom)>h4,.theme-default-content:not(.custom)>h5,.theme-default-content:not(.custom)>h6{margin-top:-3.1rem;padding-top:4.6rem;margin-bottom:0}.theme-default-content:not(.custom)>h1:first-child,.theme-default-content:not(.custom)>h2:first-child,.theme-default-content:not(.custom)>h3:first-child,.theme-default-content:not(.custom)>h4:first-child,.theme-default-content:not(.custom)>h5:first-child,.theme-default-content:not(.custom)>h6:first-child{margin-top:-1.5rem;margin-bottom:1rem}.theme-default-content:not(.custom)>h1:first-child+.custom-block,.theme-default-content:not(.custom)>h1:first-child+p,.theme-default-content:not(.custom)>h1:first-child+pre,.theme-default-content:not(.custom)>h2:first-child+.custom-block,.theme-default-content:not(.custom)>h2:first-child+p,.theme-default-content:not(.custom)>h2:first-child+pre,.theme-default-content:not(.custom)>h3:first-child+.custom-block,.theme-default-content:not(.custom)>h3:first-child+p,.theme-default-content:not(.custom)>h3:first-child+pre,.theme-default-content:not(.custom)>h4:first-child+.custom-block,.theme-default-content:not(.custom)>h4:first-child+p,.theme-default-content:not(.custom)>h4:first-child+pre,.theme-default-content:not(.custom)>h5:first-child+.custom-block,.theme-default-content:not(.custom)>h5:first-child+p,.theme-default-content:not(.custom)>h5:first-child+pre,.theme-default-content:not(.custom)>h6:first-child+.custom-block,.theme-default-content:not(.custom)>h6:first-child+p,.theme-default-content:not(.custom)>h6:first-child+pre{margin-top:2rem}h1:hover .header-anchor,h2:hover .header-anchor,h3:hover .header-anchor,h4:hover .header-anchor,h5:hover .header-anchor,h6:hover .header-anchor{opacity:1}h1{font-size:2.2rem}h2{font-size:1.65rem;padding-bottom:.3rem;border-bottom:1px solid #eaecef}h3{font-size:1.35rem}a.header-anchor{font-size:.85em;float:left;margin-left:-.87em;padding-right:.23em;margin-top:.125em;opacity:0}a.header-anchor:hover{text-decoration:none}.line-number,code,kbd{font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace}ol,p,ul{line-height:1.7}hr{border:0;border-top:1px solid #eaecef}table{border-collapse:collapse;margin:1rem 0;display:block;overflow-x:auto}tr{border-top:1px solid #dfe2e5}tr:nth-child(2n){background-color:#f6f8fa}td,th{border:1px solid #dfe2e5;padding:.6em 1em}.theme-container.sidebar-open .sidebar-mask{display:block}.theme-container.no-navbar .theme-default-content:not(.custom)>h1,.theme-container.no-navbar h2,.theme-container.no-navbar h3,.theme-container.no-navbar h4,.theme-container.no-navbar h5,.theme-container.no-navbar h6{margin-top:1.5rem;padding-top:0}.theme-container.no-navbar .sidebar{top:0}@media (min-width:720px){.theme-container.no-sidebar .sidebar{display:none}.theme-container.no-sidebar .page{padding-left:0}}@media (max-width:959px){.sidebar{font-size:15px;width:16.4rem}.page{padding-left:16.4rem}}@media (max-width:719px){.sidebar{top:0;padding-top:3.6rem;transform:translateX(-100%);transition:transform .2s ease}.page{padding-left:0}.theme-container.sidebar-open .sidebar{transform:translateX(0)}.theme-container.no-navbar .sidebar{padding-top:0}}@media (max-width:419px){h1{font-size:1.9rem}.theme-default-content div[class*=language-]{margin:.85rem -1.5rem;border-radius:0}}.content__default{max-width:1000px!important}p img{border:1px solid #d7dae2}.home{padding:3.6rem 2rem 0;max-width:960px;margin:0 auto;display:block}.home .hero{text-align:center}.home .hero img{max-width:100%;max-height:280px;display:block;margin:3rem auto 1.5rem}.home .hero h1{font-size:3rem}.home .hero .action,.home .hero .description,.home .hero h1{margin:1.8rem auto}.home .hero .description{max-width:35rem;font-size:1.6rem;line-height:1.3;color:#6a8bad}.home .hero .action-button{display:inline-block;font-size:1.2rem;color:#fff;background-color:#007af5;vertical-align:top;margin-left:.5rem;padding:.8rem 1.6rem;border-radius:4px;transition:background-color .1s ease;box-sizing:border-box;border-bottom:1px solid #006edd}.home .hero .action-button:hover{background-color:#1187ff;color:#fff}.home .hero .action-button2{color:#007af5;background-color:#fff;border:1px solid #007af5}.home .features{border-top:1px solid #eaecef;padding:1.2rem 0;margin-top:2.5rem;display:flex;flex-wrap:wrap;align-items:flex-start;align-content:stretch;justify-content:space-between}.home .feature{flex-grow:1;flex-basis:30%;max-width:30%}.home .feature h2{font-size:1.4rem;font-weight:500;border-bottom:none;padding-bottom:0;color:#3a5169}.home .feature p{color:#4e6e8e}.home .footer{padding:2.5rem;border-top:1px solid #eaecef;text-align:center;color:#4e6e8e}@media (max-width:719px){.home .features{flex-direction:column}.home .feature{max-width:100%;padding:0 2.5rem}}@media (max-width:419px){.home{padding-left:1.5rem;padding-right:1.5rem}.home .hero img{max-height:210px;margin:2rem auto 1.2rem}.home .hero h1{font-size:2rem}.home .hero .action,.home .hero .description,.home .hero h1{margin:1.2rem auto}.home .hero .description{font-size:1.2rem}.home .hero .action-button{font-size:1rem;padding:.6rem 1.2rem}.home .feature h2{font-size:1.25rem}}.badge[data-v-c13ee5b0]{display:inline-block;font-size:14px;height:18px;line-height:18px;border-radius:3px;padding:0 6px;color:#fff}.badge.green[data-v-c13ee5b0],.badge.tip[data-v-c13ee5b0],.badge[data-v-c13ee5b0]{background-color:#42b983}.badge.error[data-v-c13ee5b0]{background-color:#da5961}.badge.warn[data-v-c13ee5b0],.badge.warning[data-v-c13ee5b0],.badge.yellow[data-v-c13ee5b0]{background-color:#e7c000}.badge+.badge[data-v-c13ee5b0]{margin-left:5px} \ No newline at end of file diff --git a/docs/assets/img/image-20190723104717575.db9f16c5.png b/docs/assets/img/image-20190723104717575.db9f16c5.png deleted file mode 100644 index a75ad82c60b06de0378420f15343c7414affcb7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24446 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 VT(&12=#c;b002ovPDHLkV1l(F7K{J@ diff --git a/docs/assets/js/10.fbb1a35d.js b/docs/assets/js/10.27221018.js similarity index 85% rename from docs/assets/js/10.fbb1a35d.js rename to docs/assets/js/10.27221018.js index 2c0b3a4..8b41d59 100644 --- a/docs/assets/js/10.fbb1a35d.js +++ b/docs/assets/js/10.27221018.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[10],{290:function(t,e,a){t.exports=a.p+"assets/img/image-20190722223454676.b545b43f.png"},291:function(t,e,a){t.exports=a.p+"assets/img/image-20190722223551308.ed106a2a.png"},292:function(t,e,a){t.exports=a.p+"assets/img/image-20190722223605920.3e762b29.png"},293:function(t,e,a){t.exports=a.p+"assets/img/image-20190722231246540.ebf13194.png"},294:function(t,e,a){t.exports=a.p+"assets/img/image-20190722224029397.abc44209.png"},295:function(t,e,a){t.exports=a.p+"assets/img/image-20190722225347491.984fabae.png"},296:function(t,e,a){t.exports=a.p+"assets/img/image-20190722225454029.73400267.png"},297:function(t,e,a){t.exports=a.p+"assets/img/image-20190722230511430.ed459354.png"},367: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(290),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(291),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(292),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(293),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(294),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(295),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(296),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(297),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"},370: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/11.85cc1d1b.js b/docs/assets/js/11.85cc1d1b.js new file mode 100644 index 0000000..a6d98d1 --- /dev/null +++ b/docs/assets/js/11.85cc1d1b.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[11],{141:function(t,i,a){},143:function(t,i,a){},207:function(t,i,a){t.exports=a.p+"assets/img/kuboard_qq.45e78dbf.png"},208:function(t,i,a){t.exports=a.p+"assets/img/image-20190723104717575.f44900d3.png"},209:function(t,i,a){"use strict";var e=a(141);a.n(e).a},211:function(t,i,a){"use strict";var e=a(143);a.n(e).a},349:function(t,i,a){"use strict";var e=a(160),s=a(207),n=a.n(s),l=a(208),r=a.n(l),c={name:"Sidebar",props:["items"],components:{SidebarLinks:e.default},data:function(){return{kuboard_qq_img:n.a,demo_img:r.a}}},o=(a(209),a(0)),d=Object(o.a)(c,function(){var t=this,i=t.$createElement,a=t._self._c||i;return a("aside",{staticClass:"sidebar"},[t._t("top"),t._v(" "),a("SidebarLinks",{attrs:{depth:0,items:t.items}}),t._v(" "),t._t("bottom"),t._v(" "),a("div",{staticStyle:{"text-align":"center","margin-top":"5vh"}},[a("strong",[t._v("在线体验")]),t._v(" "),a("div",[a("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"}},[a("p",[a("img",{staticStyle:{width:"226px",height:"127px"},attrs:{src:t.demo_img}})])])]),t._v(" "),a("strong",[t._v("在线提问")]),t._v(" "),a("p",[a("img",{attrs:{src:t.kuboard_qq_img}})])])],2)},[],!1,null,null,null);i.a=d.exports},351:function(t,i,a){"use strict";a.r(i);a(38);var e={components:{ParentLayout:a(348).a},methods:{activeLinkStyle:function(t){return 0===this.$page.path.indexOf(t)?"border-bottom: 2px solid #0b85ff;":""}}},s=(a(211),a(0)),n=Object(s.a)(e,function(){var t=this,i=t.$createElement,a=t._self._c||i;return a("ParentLayout",[a("div",{attrs:{slot:"sidebar-top"},slot:"sidebar-top"},[a("div",{staticStyle:{"text-align":"center","margin-top":"20px"}},[a("div",{staticClass:"side-nav-item",style:t.activeLinkStyle("/overview/")+"margin-left: 0;"},[a("a",{staticClass:"nav-link",attrs:{href:"/overview/"}},[t._v("简介")])]),t._v(" "),a("div",{staticClass:"side-nav-item",style:t.activeLinkStyle("/install/")},[a("a",{staticClass:"nav-link router-link-exact-active router-link-active",attrs:{href:"/install/"}},[t._v("安装")])]),t._v(" "),a("div",{staticClass:"side-nav-item",style:t.activeLinkStyle("/guide/")},[a("a",{staticClass:"nav-link",attrs:{href:"/guide/"}},[t._v("使用")])]),t._v(" "),a("div",{staticClass:"side-nav-item",style:t.activeLinkStyle("/support/")},[a("a",{staticClass:"nav-link",attrs:{href:"/support/"}},[t._v("支持")])])])]),t._v(" "),a("div",{staticClass:"bottom-description",attrs:{slot:"page-bottom"},slot:"page-bottom"},[t._v("Copyright © 2019-present HuanQing Shao")])])},[],!1,null,"79c95b4d",null);i.default=n.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/11.e6d2ff21.js b/docs/assets/js/11.e6d2ff21.js deleted file mode 100644 index 4739a1b..0000000 --- a/docs/assets/js/11.e6d2ff21.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[11],{111:function(t,i,a){},113:function(t,i,a){},196:function(t,i,a){t.exports=a.p+"assets/img/kuboard_qq.45e78dbf.png"},197:function(t,i,a){t.exports=a.p+"assets/img/image-20190723104717575.db9f16c5.png"},198:function(t,i,a){"use strict";var e=a(111);a.n(e).a},200:function(t,i,a){"use strict";var e=a(113);a.n(e).a},338:function(t,i,a){"use strict";var e=a(141),s=a(196),n=a.n(s),l=a(197),r=a.n(l),c={name:"Sidebar",props:["items"],components:{SidebarLinks:e.default},data:function(){return{kuboard_qq_img:n.a,demo_img:r.a}}},o=(a(198),a(0)),v=Object(o.a)(c,function(){var t=this,i=t.$createElement,a=t._self._c||i;return a("aside",{staticClass:"sidebar"},[t._t("top"),t._v(" "),a("SidebarLinks",{attrs:{depth:0,items:t.items}}),t._v(" "),t._t("bottom"),t._v(" "),a("div",{staticStyle:{"text-align":"center","margin-top":"5vh"}},[a("strong",[t._v("在线体验")]),t._v(" "),a("div",[a("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"}},[a("p",[a("img",{attrs:{src:t.demo_img}})])])]),t._v(" "),a("strong",[t._v("在线提问")]),t._v(" "),a("p",[a("img",{attrs:{src:t.kuboard_qq_img}})])])],2)},[],!1,null,null,null);i.a=v.exports},341:function(t,i,a){"use strict";a.r(i);a(119);var e={components:{ParentLayout:a(337).a},methods:{activeLinkStyle:function(t){return 0===this.$page.path.indexOf(t)?"border-bottom: 2px solid #0b85ff;":""}}},s=(a(200),a(0)),n=Object(s.a)(e,function(){var t=this,i=t.$createElement,a=t._self._c||i;return a("ParentLayout",[a("div",{attrs:{slot:"sidebar-top"},slot:"sidebar-top"},[a("div",{staticStyle:{"text-align":"center","margin-top":"20px"}},[a("div",{staticClass:"side-nav-item",style:t.activeLinkStyle("/overview/")+"margin-left: 0;"},[a("a",{staticClass:"nav-link",attrs:{href:"/overview/"}},[t._v("简介")])]),t._v(" "),a("div",{staticClass:"side-nav-item",style:t.activeLinkStyle("/install/")},[a("a",{staticClass:"nav-link router-link-exact-active router-link-active",attrs:{href:"/install/"}},[t._v("安装")])]),t._v(" "),a("div",{staticClass:"side-nav-item",style:t.activeLinkStyle("/guide/")},[a("a",{staticClass:"nav-link",attrs:{href:"/guide/"}},[t._v("使用")])]),t._v(" "),a("div",{staticClass:"side-nav-item",style:t.activeLinkStyle("/support/")},[a("a",{staticClass:"nav-link",attrs:{href:"/support/"}},[t._v("支持")])])])]),t._v(" "),a("div",{staticClass:"bottom-description",attrs:{slot:"page-bottom"},slot:"page-bottom"},[t._v("Copyright © 2019-present HuanQing Shao")])])},[],!1,null,"79c95b4d",null);i.default=n.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/12.3bb144bb.js b/docs/assets/js/12.2de4cc18.js similarity index 76% rename from docs/assets/js/12.3bb144bb.js rename to docs/assets/js/12.2de4cc18.js index 44c48a0..93943a9 100644 --- a/docs/assets/js/12.3bb144bb.js +++ b/docs/assets/js/12.2de4cc18.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[12],{201:function(t,a,e){t.exports=e.p+"assets/img/image-20190723105606081.bc471512.png"},202:function(t,a,e){t.exports=e.p+"assets/img/image-20190723105644937.968b1660.png"},203:function(t,a,e){t.exports=e.p+"assets/img/image-20190723105722999.5b6c9bae.png"},204:function(t,a,e){t.exports=e.p+"assets/img/image-20190723105748435.1cb3ad0d.png"},205:function(t,a,e){t.exports=e.p+"assets/img/image-20190723105809872.61add376.png"},206:function(t,a,e){t.exports=e.p+"assets/img/image-20190723105830318.43414c56.png"},343: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(201),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(202),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(203),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(204),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(205),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(206),alt:"image-20190723105830318"}})])])},[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[12],{231:function(t,a,e){t.exports=e.p+"assets/img/image-20190723105606081.bc471512.png"},232:function(t,a,e){t.exports=e.p+"assets/img/image-20190723105644937.968b1660.png"},233:function(t,a,e){t.exports=e.p+"assets/img/image-20190723105722999.5b6c9bae.png"},234:function(t,a,e){t.exports=e.p+"assets/img/image-20190723105748435.1cb3ad0d.png"},235:function(t,a,e){t.exports=e.p+"assets/img/image-20190723105809872.61add376.png"},236:function(t,a,e){t.exports=e.p+"assets/img/image-20190723105830318.43414c56.png"},382: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(231),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(232),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(233),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(234),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(235),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(236),alt:"image-20190723105830318"}})])])},[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/13.d3d4e5f8.js b/docs/assets/js/13.2b6a1ee9.js similarity index 90% rename from docs/assets/js/13.d3d4e5f8.js rename to docs/assets/js/13.2b6a1ee9.js index 808f15b..1663f82 100644 --- a/docs/assets/js/13.d3d4e5f8.js +++ b/docs/assets/js/13.2b6a1ee9.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[13],{280:function(a,t,s){a.exports=s.p+"assets/img/image-20190721085144545.25f25dda.png"},281:function(a,t,s){a.exports=s.p+"assets/img/image-20190721090118542.46c31055.png"},282:function(a,t,s){a.exports=s.p+"assets/img/image-20190721090753742.28d009f3.png"},283:function(a,t,s){a.exports=s.p+"assets/img/image-20190721090840925.a5231632.png"},284:function(a,t,s){a.exports=s.p+"assets/img/image-20190721090935511.80fb3864.png"},285:function(a,t,s){a.exports=s.p+"assets/img/image-20190721091005130.330e9f1d.png"},361: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(280),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(281),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(282),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(283),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(284),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(285),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],{287:function(a,t,s){a.exports=s.p+"assets/img/image-20190721085144545.25f25dda.png"},288:function(a,t,s){a.exports=s.p+"assets/img/image-20190721090118542.46c31055.png"},289:function(a,t,s){a.exports=s.p+"assets/img/image-20190721090753742.28d009f3.png"},290:function(a,t,s){a.exports=s.p+"assets/img/image-20190721090840925.a5231632.png"},291:function(a,t,s){a.exports=s.p+"assets/img/image-20190721090935511.80fb3864.png"},292:function(a,t,s){a.exports=s.p+"assets/img/image-20190721091005130.330e9f1d.png"},366: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(287),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(288),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(289),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(290),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(291),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(292),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/14.09835c47.js b/docs/assets/js/14.09835c47.js deleted file mode 100644 index 5a81826..0000000 --- a/docs/assets/js/14.09835c47.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[14],{260:function(t,a,_){t.exports=_.p+"assets/img/image-20190721112353077.b907aa89.png"},261:function(t,a,_){t.exports=_.p+"assets/img/image-20190721112624128.7aa6b8f1.png"},262:function(t,a,_){t.exports=_.p+"assets/img/image-20190721113050608.97e0f110.png"},263:function(t,a,_){t.exports=_.p+"assets/img/image-20190721113155991.f3ecd62f.png"},351:function(t,a,_){"use strict";_.r(a);var v=_(0),e=Object(v.a)({},function(){var t=this,a=t.$createElement,v=t._self._c||a;return v("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[v("h1",{attrs:{id:"配置"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#配置","aria-hidden":"true"}},[t._v("#")]),t._v(" 配置")]),t._v(" "),v("p",[t._v("配置: Kubernetes ConfigMap")]),t._v(" "),v("h1",{attrs:{id:"查看配置列表"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#查看配置列表","aria-hidden":"true"}},[t._v("#")]),t._v(" 查看配置列表")]),t._v(" "),v("p",[t._v("假设您已进入名称空间界面,如下图所示:")]),t._v(" "),v("p",[v("img",{attrs:{src:_(70),alt:"image-20190721110355464"}})]),t._v(" "),v("p",[t._v("配置列表位于图中左侧中部,点击 "),v("em",[v("strong",[t._v("放大")])]),t._v(" 按钮,可以将列表显示到更大的区域,如下图所示:")]),t._v(" "),v("blockquote",[v("p",[t._v("点击 "),v("strong",[t._v("配置")]),t._v(" 可以刷新该列表")])]),t._v(" "),v("p",[v("img",{attrs:{src:_(260),alt:"image-20190721112353077"}})]),t._v(" "),v("h1",{attrs:{id:"创建配置"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#创建配置","aria-hidden":"true"}},[t._v("#")]),t._v(" 创建配置")]),t._v(" "),v("ul",[v("li",[v("p",[t._v("点击 "),v("em",[v("strong",[t._v("配置 / 创建")])])]),t._v(" "),v("p",[t._v("填写表单如下所示:")])])]),t._v(" "),v("table",[v("thead",[v("tr",[v("th",[t._v("字段名称")]),t._v(" "),v("th",[t._v("填写内容")]),t._v(" "),v("th",[t._v("说明")])])]),t._v(" "),v("tbody",[v("tr",[v("td",[t._v("名称")]),t._v(" "),v("td",[t._v("my-config-map")]),t._v(" "),v("td")]),t._v(" "),v("tr",[v("td",[t._v("配置标签 - 名称")]),t._v(" "),v("td",[t._v("my-config-map")]),t._v(" "),v("td")]),t._v(" "),v("tr",[v("td",[t._v("配置标签 - 内容")]),t._v(" "),v("td",[t._v("configmap")]),t._v(" "),v("td")]),t._v(" "),v("tr",[v("td",[t._v("配置数据 - 名称")]),t._v(" "),v("td",[t._v("EUREKA_URL")]),t._v(" "),v("td")]),t._v(" "),v("tr",[v("td",[t._v("配置数据 - 内容")]),t._v(" "),v("td",[t._v("http://cloud-eureka:9200/eureka")]),t._v(" "),v("td")])])]),t._v(" "),v("p",[v("img",{attrs:{src:_(261),alt:"image-20190721112624128"}})]),t._v(" "),v("ul",[v("li",[v("p",[t._v("点击 "),v("em",[v("strong",[t._v("保存")])])]),t._v(" "),v("p",[t._v("配置信息创建成功")])])]),t._v(" "),v("p",[v("img",{attrs:{src:_(262),alt:"image-20190721113050608"}})]),t._v(" "),v("h1",{attrs:{id:"查看-编辑-删除-配置"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#查看-编辑-删除-配置","aria-hidden":"true"}},[t._v("#")]),t._v(" 查看/编辑/删除 配置")]),t._v(" "),v("ul",[v("li",[t._v("点击列表中的 "),v("em",[v("strong",[t._v("my-config-map")])])])]),t._v(" "),v("p",[v("img",{attrs:{src:_(263),alt:"image-20190721113155991"}})]),t._v(" "),v("p",[t._v("编辑、删除操作可直接按照提示完成")])])},[],!1,null,null,null);a.default=e.exports},70:function(t,a,_){t.exports=_.p+"assets/img/image-20190721110355464.25f25dda.png"}}]); \ No newline at end of file diff --git a/docs/assets/js/14.6289070d.js b/docs/assets/js/14.6289070d.js new file mode 100644 index 0000000..90c1ac1 --- /dev/null +++ b/docs/assets/js/14.6289070d.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[14],{110:function(t,a,_){t.exports=_.p+"assets/img/image-20190721110355464.25f25dda.png"},271:function(t,a,_){t.exports=_.p+"assets/img/image-20190721112353077.b907aa89.png"},272:function(t,a,_){t.exports=_.p+"assets/img/image-20190721112624128.7aa6b8f1.png"},273:function(t,a,_){t.exports=_.p+"assets/img/image-20190721113050608.97e0f110.png"},274:function(t,a,_){t.exports=_.p+"assets/img/image-20190721113155991.f3ecd62f.png"},358:function(t,a,_){"use strict";_.r(a);var v=_(0),e=Object(v.a)({},function(){var t=this,a=t.$createElement,v=t._self._c||a;return v("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[v("h1",{attrs:{id:"配置"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#配置","aria-hidden":"true"}},[t._v("#")]),t._v(" 配置")]),t._v(" "),v("p",[t._v("配置: Kubernetes ConfigMap")]),t._v(" "),v("h1",{attrs:{id:"查看配置列表"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#查看配置列表","aria-hidden":"true"}},[t._v("#")]),t._v(" 查看配置列表")]),t._v(" "),v("p",[t._v("假设您已进入名称空间界面,如下图所示:")]),t._v(" "),v("p",[v("img",{attrs:{src:_(110),alt:"image-20190721110355464"}})]),t._v(" "),v("p",[t._v("配置列表位于图中左侧中部,点击 "),v("em",[v("strong",[t._v("放大")])]),t._v(" 按钮,可以将列表显示到更大的区域,如下图所示:")]),t._v(" "),v("blockquote",[v("p",[t._v("点击 "),v("strong",[t._v("配置")]),t._v(" 可以刷新该列表")])]),t._v(" "),v("p",[v("img",{attrs:{src:_(271),alt:"image-20190721112353077"}})]),t._v(" "),v("h1",{attrs:{id:"创建配置"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#创建配置","aria-hidden":"true"}},[t._v("#")]),t._v(" 创建配置")]),t._v(" "),v("ul",[v("li",[v("p",[t._v("点击 "),v("em",[v("strong",[t._v("配置 / 创建")])])]),t._v(" "),v("p",[t._v("填写表单如下所示:")])])]),t._v(" "),v("table",[v("thead",[v("tr",[v("th",[t._v("字段名称")]),t._v(" "),v("th",[t._v("填写内容")]),t._v(" "),v("th",[t._v("说明")])])]),t._v(" "),v("tbody",[v("tr",[v("td",[t._v("名称")]),t._v(" "),v("td",[t._v("my-config-map")]),t._v(" "),v("td")]),t._v(" "),v("tr",[v("td",[t._v("配置标签 - 名称")]),t._v(" "),v("td",[t._v("my-config-map")]),t._v(" "),v("td")]),t._v(" "),v("tr",[v("td",[t._v("配置标签 - 内容")]),t._v(" "),v("td",[t._v("configmap")]),t._v(" "),v("td")]),t._v(" "),v("tr",[v("td",[t._v("配置数据 - 名称")]),t._v(" "),v("td",[t._v("EUREKA_URL")]),t._v(" "),v("td")]),t._v(" "),v("tr",[v("td",[t._v("配置数据 - 内容")]),t._v(" "),v("td",[t._v("http://cloud-eureka:9200/eureka")]),t._v(" "),v("td")])])]),t._v(" "),v("p",[v("img",{attrs:{src:_(272),alt:"image-20190721112624128"}})]),t._v(" "),v("ul",[v("li",[v("p",[t._v("点击 "),v("em",[v("strong",[t._v("保存")])])]),t._v(" "),v("p",[t._v("配置信息创建成功")])])]),t._v(" "),v("p",[v("img",{attrs:{src:_(273),alt:"image-20190721113050608"}})]),t._v(" "),v("h1",{attrs:{id:"查看-编辑-删除-配置"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#查看-编辑-删除-配置","aria-hidden":"true"}},[t._v("#")]),t._v(" 查看/编辑/删除 配置")]),t._v(" "),v("ul",[v("li",[t._v("点击列表中的 "),v("em",[v("strong",[t._v("my-config-map")])])])]),t._v(" "),v("p",[v("img",{attrs:{src:_(274),alt:"image-20190721113155991"}})]),t._v(" "),v("p",[t._v("编辑、删除操作可直接按照提示完成")])])},[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/15.9f1bb8da.js b/docs/assets/js/15.9f1bb8da.js deleted file mode 100644 index 98f02e9..0000000 --- a/docs/assets/js/15.9f1bb8da.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[15],{286:function(t,a,v){t.exports=v.p+"assets/img/image-20190721113708689.f9b42a11.png"},287:function(t,a,v){t.exports=v.p+"assets/img/image-20190721113810235.59d55672.png"},288:function(t,a,v){t.exports=v.p+"assets/img/image-20190721114112644.526de44c.png"},289:function(t,a,v){t.exports=v.p+"assets/img/image-20190721114211751.e1a07115.png"},363:function(t,a,v){"use strict";v.r(a);var _=v(0),e=Object(_.a)({},function(){var t=this,a=t.$createElement,_=t._self._c||a;return _("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[_("h1",{attrs:{id:"存储卷声明"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#存储卷声明","aria-hidden":"true"}},[t._v("#")]),t._v(" 存储卷声明")]),t._v(" "),_("p",[t._v("存储卷声明: Kubernetes Persistent Volume Claim")]),t._v(" "),_("h1",{attrs:{id:"查看存储卷声明列表"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#查看存储卷声明列表","aria-hidden":"true"}},[t._v("#")]),t._v(" 查看存储卷声明列表")]),t._v(" "),_("p",[t._v("假设您已进入名称空间界面,如下图所示:")]),t._v(" "),_("p",[_("img",{attrs:{src:v(70),alt:"image-20190721110355464"}})]),t._v(" "),_("p",[t._v("存储卷声明列表位于图中左下角,点击 "),_("em",[_("strong",[t._v("放大")])]),t._v(" 按钮,可以将列表显示到更大的区域,如下图所示:")]),t._v(" "),_("blockquote",[_("p",[t._v("点击 "),_("strong",[t._v("存储卷声明")]),t._v(" 可以刷新该列表")])]),t._v(" "),_("p",[_("img",{attrs:{src:v(286),alt:"image-20190721113708689"}})]),t._v(" "),_("h1",{attrs:{id:"创建存储卷声明"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#创建存储卷声明","aria-hidden":"true"}},[t._v("#")]),t._v(" 创建存储卷声明")]),t._v(" "),_("ul",[_("li",[_("p",[t._v("点击 "),_("em",[_("strong",[t._v("存储卷声明 / 创建")])])]),t._v(" "),_("p",[t._v("填写表单如下:")])])]),t._v(" "),_("table",[_("thead",[_("tr",[_("th",[t._v("字段名称")]),t._v(" "),_("th",[t._v("填写内容")]),t._v(" "),_("th",[t._v("说明")])])]),t._v(" "),_("tbody",[_("tr",[_("td",[t._v("存储卷声明")]),t._v(" "),_("td",[t._v("my-pvc")]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",[t._v("存储类")]),t._v(" "),_("td",[t._v("cluster-storage")]),t._v(" "),_("td",[t._v("如果不存在,则需要提前 "),_("a",{attrs:{href:"./guide/cluster/storage?id=%E5%88%9B%E5%BB%BA%E5%AD%98%E5%82%A8%E7%B1%BB"}},[t._v("创建存储类")])])]),t._v(" "),_("tr",[_("td",[t._v("分配模式")]),t._v(" "),_("td",[t._v("动态分配")]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",[t._v("读写模式")]),t._v(" "),_("td",[t._v("可被多节点读写")]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",[t._v("总量")]),t._v(" "),_("td",[t._v("2Gi")]),t._v(" "),_("td")])])]),t._v(" "),_("p",[_("img",{attrs:{src:v(287),alt:"image-20190721113810235"}})]),t._v(" "),_("ul",[_("li",[_("p",[t._v("点击 "),_("em",[_("strong",[t._v("保存")])])]),t._v(" "),_("p",[t._v("存储卷声明创建成功")])])]),t._v(" "),_("p",[_("img",{attrs:{src:v(288),alt:"image-20190721114112644"}})]),t._v(" "),_("h1",{attrs:{id:"查看-编辑-删除-存储卷声明"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#查看-编辑-删除-存储卷声明","aria-hidden":"true"}},[t._v("#")]),t._v(" 查看/编辑/删除 存储卷声明")]),t._v(" "),_("ul",[_("li",[t._v("点击 "),_("em",[_("strong",[t._v("my-pvc")])])])]),t._v(" "),_("p",[_("img",{attrs:{src:v(289),alt:"image-20190721114211751"}})]),t._v(" "),_("p",[t._v("编辑、删除操作可直接按照提示完成")])])},[],!1,null,null,null);a.default=e.exports},70:function(t,a,v){t.exports=v.p+"assets/img/image-20190721110355464.25f25dda.png"}}]); \ No newline at end of file diff --git a/docs/assets/js/15.a3a371e3.js b/docs/assets/js/15.a3a371e3.js new file mode 100644 index 0000000..0d9da59 --- /dev/null +++ b/docs/assets/js/15.a3a371e3.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[15],{110:function(t,a,v){t.exports=v.p+"assets/img/image-20190721110355464.25f25dda.png"},293:function(t,a,v){t.exports=v.p+"assets/img/image-20190721113708689.f9b42a11.png"},294:function(t,a,v){t.exports=v.p+"assets/img/image-20190721113810235.59d55672.png"},295:function(t,a,v){t.exports=v.p+"assets/img/image-20190721114112644.526de44c.png"},296:function(t,a,v){t.exports=v.p+"assets/img/image-20190721114211751.e1a07115.png"},384:function(t,a,v){"use strict";v.r(a);var _=v(0),e=Object(_.a)({},function(){var t=this,a=t.$createElement,_=t._self._c||a;return _("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[_("h1",{attrs:{id:"存储卷声明"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#存储卷声明","aria-hidden":"true"}},[t._v("#")]),t._v(" 存储卷声明")]),t._v(" "),_("p",[t._v("存储卷声明: Kubernetes Persistent Volume Claim")]),t._v(" "),_("h1",{attrs:{id:"查看存储卷声明列表"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#查看存储卷声明列表","aria-hidden":"true"}},[t._v("#")]),t._v(" 查看存储卷声明列表")]),t._v(" "),_("p",[t._v("假设您已进入名称空间界面,如下图所示:")]),t._v(" "),_("p",[_("img",{attrs:{src:v(110),alt:"image-20190721110355464"}})]),t._v(" "),_("p",[t._v("存储卷声明列表位于图中左下角,点击 "),_("em",[_("strong",[t._v("放大")])]),t._v(" 按钮,可以将列表显示到更大的区域,如下图所示:")]),t._v(" "),_("blockquote",[_("p",[t._v("点击 "),_("strong",[t._v("存储卷声明")]),t._v(" 可以刷新该列表")])]),t._v(" "),_("p",[_("img",{attrs:{src:v(293),alt:"image-20190721113708689"}})]),t._v(" "),_("h1",{attrs:{id:"创建存储卷声明"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#创建存储卷声明","aria-hidden":"true"}},[t._v("#")]),t._v(" 创建存储卷声明")]),t._v(" "),_("ul",[_("li",[_("p",[t._v("点击 "),_("em",[_("strong",[t._v("存储卷声明 / 创建")])])]),t._v(" "),_("p",[t._v("填写表单如下:")])])]),t._v(" "),_("table",[_("thead",[_("tr",[_("th",[t._v("字段名称")]),t._v(" "),_("th",[t._v("填写内容")]),t._v(" "),_("th",[t._v("说明")])])]),t._v(" "),_("tbody",[_("tr",[_("td",[t._v("存储卷声明")]),t._v(" "),_("td",[t._v("my-pvc")]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",[t._v("存储类")]),t._v(" "),_("td",[t._v("cluster-storage")]),t._v(" "),_("td",[t._v("如果不存在,则需要提前 "),_("a",{attrs:{href:"./guide/cluster/storage?id=%E5%88%9B%E5%BB%BA%E5%AD%98%E5%82%A8%E7%B1%BB"}},[t._v("创建存储类")])])]),t._v(" "),_("tr",[_("td",[t._v("分配模式")]),t._v(" "),_("td",[t._v("动态分配")]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",[t._v("读写模式")]),t._v(" "),_("td",[t._v("可被多节点读写")]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",[t._v("总量")]),t._v(" "),_("td",[t._v("2Gi")]),t._v(" "),_("td")])])]),t._v(" "),_("p",[_("img",{attrs:{src:v(294),alt:"image-20190721113810235"}})]),t._v(" "),_("ul",[_("li",[_("p",[t._v("点击 "),_("em",[_("strong",[t._v("保存")])])]),t._v(" "),_("p",[t._v("存储卷声明创建成功")])])]),t._v(" "),_("p",[_("img",{attrs:{src:v(295),alt:"image-20190721114112644"}})]),t._v(" "),_("h1",{attrs:{id:"查看-编辑-删除-存储卷声明"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#查看-编辑-删除-存储卷声明","aria-hidden":"true"}},[t._v("#")]),t._v(" 查看/编辑/删除 存储卷声明")]),t._v(" "),_("ul",[_("li",[t._v("点击 "),_("em",[_("strong",[t._v("my-pvc")])])])]),t._v(" "),_("p",[_("img",{attrs:{src:v(296),alt:"image-20190721114211751"}})]),t._v(" "),_("p",[t._v("编辑、删除操作可直接按照提示完成")])])},[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/16.b4e44009.js b/docs/assets/js/16.b4e44009.js deleted file mode 100644 index 6411936..0000000 --- a/docs/assets/js/16.b4e44009.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[16],{276:function(t,e,r){t.exports=r.p+"assets/img/image-20190721110543437.8cbe188d.png"},277:function(t,e,r){t.exports=r.p+"assets/img/image-20190721111011798.b9cc73b4.png"},278:function(t,e,r){t.exports=r.p+"assets/img/image-20190721111540512.b0a58451.png"},279:function(t,e,r){t.exports=r.p+"assets/img/image-20190721111642221.f9c06dc3.png"},359:function(t,e,r){"use strict";r.r(e);var s=r(0),v=Object(s.a)({},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"secrets"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#secrets","aria-hidden":"true"}},[t._v("#")]),t._v(" Secrets")]),t._v(" "),s("h1",{attrs:{id:"查看-secrets-列表"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#查看-secrets-列表","aria-hidden":"true"}},[t._v("#")]),t._v(" 查看 Secrets 列表")]),t._v(" "),s("p",[t._v("假设您已进入名称空间界面,如下图所示:")]),t._v(" "),s("p",[s("img",{attrs:{src:r(70),alt:"image-20190721110355464"}})]),t._v(" "),s("p",[t._v("Secrets 列表位于图中左上角,点击 "),s("em",[s("strong",[t._v("放大")])]),t._v(" 按钮,可以将列表显示到更大的区域,如下图所示:")]),t._v(" "),s("blockquote",[s("p",[t._v("点击 "),s("strong",[t._v("Secrets")]),t._v(" 可以刷新该列表")])]),t._v(" "),s("p",[s("img",{attrs:{src:r(276),alt:"image-20190721110543437"}})]),t._v(" "),s("h1",{attrs:{id:"创建-secrets"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#创建-secrets","aria-hidden":"true"}},[t._v("#")]),t._v(" 创建 Secrets")]),t._v(" "),s("ul",[s("li",[s("p",[t._v("点击 "),s("em",[s("strong",[t._v("Secrets / 创建")])])]),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("my-docker-repository")]),t._v(" "),s("td",[t._v("Secrets的名称")])]),t._v(" "),s("tr",[s("td",[t._v("类型")]),t._v(" "),s("td",[t._v("docker仓库密码")]),t._v(" "),s("td")]),t._v(" "),s("tr",[s("td",[t._v("docker server")]),t._v(" "),s("td",[t._v("https://my-docker-repository.com")]),t._v(" "),s("td",[t._v("请填写 docker 仓库的全路径")])]),t._v(" "),s("tr",[s("td",[t._v("docker username")]),t._v(" "),s("td",[t._v("my-docker-user")]),t._v(" "),s("td")]),t._v(" "),s("tr",[s("td",[t._v("docker password")]),t._v(" "),s("td",[t._v("mypassword")]),t._v(" "),s("td")])])]),t._v(" "),s("p",[s("img",{attrs:{src:r(277),alt:"image-20190721111011798"}})]),t._v(" "),s("blockquote",[s("p",[t._v("当前 Kuboard 支持如下类型 Secrets 的创建:")]),t._v(" "),s("ul",[s("li",[t._v("docker仓库密码")]),t._v(" "),s("li",[t._v("当您的镜像存储在私有仓库时,您在创建工作负载时可能需要配置 imagePullSecrets 用来访问镜像仓库")]),t._v(" "),s("li",[t._v("Opaque")]),t._v(" "),s("li",[t._v("密码")]),t._v(" "),s("li",[t._v("TLS")]),t._v(" "),s("li",[t._v("当您为 Ingress 启用 HTTPS 时,您需要将域名的的 TLS 证书存入 Secrets")])])]),t._v(" "),s("ul",[s("li",[s("p",[t._v("点击保存")]),t._v(" "),s("p",[t._v("Secrets 创建成功,如下图所示:")])])]),t._v(" "),s("p",[s("img",{attrs:{src:r(278),alt:"image-20190721111540512"}})]),t._v(" "),s("h1",{attrs:{id:"查看-编辑-删除-secrets"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#查看-编辑-删除-secrets","aria-hidden":"true"}},[t._v("#")]),t._v(" 查看/编辑/删除 Secrets")]),t._v(" "),s("ul",[s("li",[t._v("点击 my-docker-repository")])]),t._v(" "),s("p",[s("img",{attrs:{src:r(279),alt:"image-20190721111642221"}})]),t._v(" "),s("p",[t._v("编辑、删除操作可直接按照提示完成")])])},[],!1,null,null,null);e.default=v.exports},70:function(t,e,r){t.exports=r.p+"assets/img/image-20190721110355464.25f25dda.png"}}]); \ No newline at end of file diff --git a/docs/assets/js/16.d995289b.js b/docs/assets/js/16.d995289b.js new file mode 100644 index 0000000..1e6417f --- /dev/null +++ b/docs/assets/js/16.d995289b.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[16],{110:function(t,e,r){t.exports=r.p+"assets/img/image-20190721110355464.25f25dda.png"},297:function(t,e,r){t.exports=r.p+"assets/img/image-20190721110543437.8cbe188d.png"},298:function(t,e,r){t.exports=r.p+"assets/img/image-20190721111011798.b9cc73b4.png"},299:function(t,e,r){t.exports=r.p+"assets/img/image-20190721111540512.b0a58451.png"},300:function(t,e,r){t.exports=r.p+"assets/img/image-20190721111642221.f9c06dc3.png"},369:function(t,e,r){"use strict";r.r(e);var s=r(0),v=Object(s.a)({},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"secrets"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#secrets","aria-hidden":"true"}},[t._v("#")]),t._v(" Secrets")]),t._v(" "),s("h1",{attrs:{id:"查看-secrets-列表"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#查看-secrets-列表","aria-hidden":"true"}},[t._v("#")]),t._v(" 查看 Secrets 列表")]),t._v(" "),s("p",[t._v("假设您已进入名称空间界面,如下图所示:")]),t._v(" "),s("p",[s("img",{attrs:{src:r(110),alt:"image-20190721110355464"}})]),t._v(" "),s("p",[t._v("Secrets 列表位于图中左上角,点击 "),s("em",[s("strong",[t._v("放大")])]),t._v(" 按钮,可以将列表显示到更大的区域,如下图所示:")]),t._v(" "),s("blockquote",[s("p",[t._v("点击 "),s("strong",[t._v("Secrets")]),t._v(" 可以刷新该列表")])]),t._v(" "),s("p",[s("img",{attrs:{src:r(297),alt:"image-20190721110543437"}})]),t._v(" "),s("h1",{attrs:{id:"创建-secrets"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#创建-secrets","aria-hidden":"true"}},[t._v("#")]),t._v(" 创建 Secrets")]),t._v(" "),s("ul",[s("li",[s("p",[t._v("点击 "),s("em",[s("strong",[t._v("Secrets / 创建")])])]),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("my-docker-repository")]),t._v(" "),s("td",[t._v("Secrets的名称")])]),t._v(" "),s("tr",[s("td",[t._v("类型")]),t._v(" "),s("td",[t._v("docker仓库密码")]),t._v(" "),s("td")]),t._v(" "),s("tr",[s("td",[t._v("docker server")]),t._v(" "),s("td",[t._v("https://my-docker-repository.com")]),t._v(" "),s("td",[t._v("请填写 docker 仓库的全路径")])]),t._v(" "),s("tr",[s("td",[t._v("docker username")]),t._v(" "),s("td",[t._v("my-docker-user")]),t._v(" "),s("td")]),t._v(" "),s("tr",[s("td",[t._v("docker password")]),t._v(" "),s("td",[t._v("mypassword")]),t._v(" "),s("td")])])]),t._v(" "),s("p",[s("img",{attrs:{src:r(298),alt:"image-20190721111011798"}})]),t._v(" "),s("blockquote",[s("p",[t._v("当前 Kuboard 支持如下类型 Secrets 的创建:")]),t._v(" "),s("ul",[s("li",[t._v("docker仓库密码")]),t._v(" "),s("li",[t._v("当您的镜像存储在私有仓库时,您在创建工作负载时可能需要配置 imagePullSecrets 用来访问镜像仓库")]),t._v(" "),s("li",[t._v("Opaque")]),t._v(" "),s("li",[t._v("密码")]),t._v(" "),s("li",[t._v("TLS")]),t._v(" "),s("li",[t._v("当您为 Ingress 启用 HTTPS 时,您需要将域名的的 TLS 证书存入 Secrets")])])]),t._v(" "),s("ul",[s("li",[s("p",[t._v("点击保存")]),t._v(" "),s("p",[t._v("Secrets 创建成功,如下图所示:")])])]),t._v(" "),s("p",[s("img",{attrs:{src:r(299),alt:"image-20190721111540512"}})]),t._v(" "),s("h1",{attrs:{id:"查看-编辑-删除-secrets"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#查看-编辑-删除-secrets","aria-hidden":"true"}},[t._v("#")]),t._v(" 查看/编辑/删除 Secrets")]),t._v(" "),s("ul",[s("li",[t._v("点击 my-docker-repository")])]),t._v(" "),s("p",[s("img",{attrs:{src:r(300),alt:"image-20190721111642221"}})]),t._v(" "),s("p",[t._v("编辑、删除操作可直接按照提示完成")])])},[],!1,null,null,null);e.default=v.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/17.1a84aa27.js b/docs/assets/js/17.1a84aa27.js deleted file mode 100644 index 5cfe02a..0000000 --- a/docs/assets/js/17.1a84aa27.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[17],{321:function(a,s,e){a.exports=e.p+"assets/img/image-20190718175957160.f5abe01a.png"},322:function(a,s,e){a.exports=e.p+"assets/img/image-20190715101542756.5934c00e.png"},323:function(a,s,e){a.exports=e.p+"assets/img/image-20190715193838012.eca23618.png"},372: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(321),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(71),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(72),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(322),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(323),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},71:function(a,s,e){a.exports=e.p+"assets/img/image-20190715085036593.ab4a32ff.png"},72:function(a,s,e){a.exports=e.p+"assets/img/image2019-07-15_09.01.21.1ac5bd70.png"}}]); \ No newline at end of file diff --git a/docs/assets/js/17.681350a4.js b/docs/assets/js/17.681350a4.js new file mode 100644 index 0000000..dfb0651 --- /dev/null +++ b/docs/assets/js/17.681350a4.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"},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/18.223def9a.js b/docs/assets/js/18.fe656110.js similarity index 94% rename from docs/assets/js/18.223def9a.js rename to docs/assets/js/18.fe656110.js index 28729ff..8d1ecad 100644 --- a/docs/assets/js/18.223def9a.js +++ b/docs/assets/js/18.fe656110.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[18],{298:function(a,t,s){a.exports=s.p+"assets/img/1563696697515.94512132.png"},299:function(a,t,s){a.exports=s.p+"assets/img/1563697667480.8c846298.png"},300:function(a,t,s){a.exports=s.p+"assets/img/1563698644736.d67b2e09.png"},301:function(a,t,s){a.exports=s.p+"assets/img/1563698714557.fa1eeb1c.png"},302:function(a,t,s){a.exports=s.p+"assets/img/1563698865448.2cbaf53a.png"},366: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:"在单机使用-kind-安装-kubernetes"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#在单机使用-kind-安装-kubernetes","aria-hidden":"true"}},[a._v("#")]),a._v(" 在单机使用 kind 安装 Kubernetes")]),a._v(" "),e("p",[a._v("本文旨在通过使用 kind 搭建本地 k8s 集群环境,为技术爱好者提供快速上手 Kuboard 的基本实践方式。")]),a._v(" "),e("h2",{attrs:{id:"环境简介"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#环境简介","aria-hidden":"true"}},[a._v("#")]),a._v(" 环境简介")]),a._v(" "),e("p",[a._v("本地搭建 k8s 集群需要 kind 工具及 docker 环境。")]),a._v(" "),e("p",[a._v("建议硬件配置:2核 cpu,8G 内存")]),a._v(" "),e("p",[a._v("ps: 以下均为在 Linux 平台实践,其他平台可参考文章中链接。")]),a._v(" "),e("h3",{attrs:{id:"kind-简介与安装"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#kind-简介与安装","aria-hidden":"true"}},[a._v("#")]),a._v(" kind 简介与安装")]),a._v(" "),e("p",[a._v("kind:https://kind.sigs.k8s.io/ 是一个使用 Docker 容器运行本地 Kubernetes 集群的工具。\nps:本文使用kind V0.4.0")]),a._v(" "),e("p",[a._v("安装:")]),a._v(" "),e("ul",[e("li",[e("p",[a._v("linux:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[a._v("curl")]),a._v(" -Lo ./kind-linux-amd64 https://github.com/kubernetes-sigs/kind/releases/download/v0.4.0/kind-linux-amd64\n"),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("chmod")]),a._v(" +x ./kind-linux-amd64\n"),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("mv")]),a._v(" ./kind-linux-amd64 /usr/local/bin/kind\n")])])])]),a._v(" "),e("li",[e("p",[a._v("win:")]),a._v(" "),e("div",{staticClass:"language-powershell extra-class"},[e("pre",{pre:!0,attrs:{class:"language-powershell"}},[e("code",[a._v("curl"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),a._v("exe "),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("-")]),a._v("Lo kind"),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("-")]),a._v("windows"),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("-")]),a._v("amd64"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),a._v("exe https:"),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("/")]),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("/")]),a._v("github"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),a._v("com"),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("/")]),a._v("kubernetes"),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("-")]),a._v("sigs"),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("/")]),a._v("kind"),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("/")]),a._v("releases"),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("/")]),a._v("download"),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("/")]),a._v("v0"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),a._v("4"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),a._v("0"),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("/")]),a._v("kind"),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("-")]),a._v("windows"),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("-")]),a._v("amd64\n"),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("Move-Item")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),a._v("\\kind"),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("-")]),a._v("windows"),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("-")]),a._v("amd64"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),a._v("exe c:\\some"),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("-")]),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("dir")]),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("-in")]),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("-")]),a._v("your"),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("-")]),a._v("PATH\\kind"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),a._v("exe\n")])])])]),a._v(" "),e("li",[e("p",[a._v("mac:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[a._v("curl")]),a._v(" -Lo ./kind-darwin-amd64 https://github.com/kubernetes-sigs/kind/releases/download/v0.4.0/kind-darwin-amd64\n"),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("chmod")]),a._v(" +x ./kind-darwin-amd64\n"),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("mv")]),a._v(" ./kind-darwin-amd64 /usr/local/bin/kind\n")])])])])]),a._v(" "),e("h3",{attrs:{id:"docker-环境"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#docker-环境","aria-hidden":"true"}},[a._v("#")]),a._v(" docker 环境")]),a._v(" "),e("p",[a._v("Kind 的主要功能目前需要有 Docker 环境的支持,可参考 Docker 官方文档:https://links.jianshu.com/go?to=https%3A%2F%2Fdocs.docker.com%2Finstall%2F 进行安装。")]),a._v(" "),e("h3",{attrs:{id:"kubectl-安装"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#kubectl-安装","aria-hidden":"true"}},[a._v("#")]),a._v(" kubectl 安装")]),a._v(" "),e("p",[a._v("kubectl https://kubernetes.io/docs/tasks/tools/install-kubectl/ 是 Kubernetes 命令行工具,可以在 Kubernetes 上部署和管理应用程序")]),a._v(" "),e("p",[a._v("Linux:")]),a._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[a._v("curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.15.0/bin/linux/amd64/kubectl\nchmod +x ./kubectl\nsudo mv ./kubectl /usr/local/bin/kubectl\n")])])]),e("p",[a._v("ps: 由于网络问题多次尝试可下载成功")]),a._v(" "),e("h2",{attrs:{id:"k8s-集群搭建"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#k8s-集群搭建","aria-hidden":"true"}},[a._v("#")]),a._v(" k8s 集群搭建")]),a._v(" "),e("h3",{attrs:{id:"准备-kind-搭建集群配置文件-kind-config-yaml"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#准备-kind-搭建集群配置文件-kind-config-yaml","aria-hidden":"true"}},[a._v("#")]),a._v(" 准备 kind 搭建集群配置文件 kind-config.yaml")]),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 key atrule"}},[a._v("kind")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" Cluster\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(" kind.sigs.k8s.io/v1alpha3\n"),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("nodes")]),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(" "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("role")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" control"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("-")]),a._v("plane\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("-")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("role")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" worker\n")])])]),e("h3",{attrs:{id:"使用-kind-搭建集群"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#使用-kind-搭建集群","aria-hidden":"true"}},[a._v("#")]),a._v(" 使用 kind 搭建集群")]),a._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[a._v("kind create cluster --config kind-config.yaml\n")])])]),e("h3",{attrs:{id:"创建成功"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#创建成功","aria-hidden":"true"}},[a._v("#")]),a._v(" 创建成功")]),a._v(" "),e("p",[e("img",{attrs:{src:s(298),alt:"1563696697515"}})]),a._v(" "),e("p",[a._v("按照提示配置环境变量")]),a._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[a._v('export KUBECONFIG="$(kind get kubeconfig-path --name="kind")"\n')])])]),e("p",[a._v("查看集群信息")]),a._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[a._v("kubectl cluster-info\n")])])]),e("p",[e("img",{attrs:{src:s(299),alt:"1563697667480"}})]),a._v(" "),e("h2",{attrs:{id:"kuboard-安装"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#kuboard-安装","aria-hidden":"true"}},[a._v("#")]),a._v(" kuboard 安装")]),a._v(" "),e("p",[a._v("官方安装地址:http://kuboard.cn/#/install/install-dashboard")]),a._v(" "),e("h3",{attrs:{id:"获取并修改-yaml-文件"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#获取并修改-yaml-文件","aria-hidden":"true"}},[a._v("#")]),a._v(" 获取并修改 yaml 文件")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[a._v("wget")]),a._v(" https://raw.githubusercontent.com/eip-work/eip-monitor-repository/master/dashboard/kuboard.yaml\n")])])]),e("p",[a._v("修改文件 kuboard.yaml 中 Ingress 的 host 为空")]),a._v(" "),e("h3",{attrs:{id:"执行安装"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#执行安装","aria-hidden":"true"}},[a._v("#")]),a._v(" 执行安装")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("kubectl apply -f kuboard.yaml \n")])])]),e("h3",{attrs:{id:"查看启动状态"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#查看启动状态","aria-hidden":"true"}},[a._v("#")]),a._v(" 查看启动状态")]),a._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[a._v("kubectl get pods -n kube-system --watch\n")])])]),e("p",[a._v("等待 kuboard 启动成功")]),a._v(" "),e("h3",{attrs:{id:"访问-kuboard-页面"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#访问-kuboard-页面","aria-hidden":"true"}},[a._v("#")]),a._v(" 访问 kuboard 页面")]),a._v(" "),e("p",[a._v("待启动成功后,需要做 80 端口转发,通过浏览器访问 kuboard")]),a._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[a._v("kubectl port-forward service/kuboard 9080:80 -n kube-system\n")])])]),e("p",[a._v("获取登录 token")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("kubectl -n kube-system describe secret "),e("span",{pre:!0,attrs:{class:"token variable"}},[e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$(")]),a._v("kubectl -n kube-system get secret "),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("grep")]),a._v(" kuboard-user "),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("awk")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[a._v("'{print "),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$1")]),a._v("}'")]),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v(")")])]),a._v(" \n")])])]),e("p",[e("img",{attrs:{src:s(300),alt:"1563698644736"}})]),a._v(" "),e("p",[a._v("浏览器中访问 http://localhost:9080")]),a._v(" "),e("p",[e("img",{attrs:{src:s(301),alt:"1563698714557"}})]),a._v(" "),e("p",[a._v("将获取的 token 复制到浏览器中,访问成功")]),a._v(" "),e("p",[e("img",{attrs:{src:s(302),alt:"1563698865448"}})])])},[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[18],{309:function(a,t,s){a.exports=s.p+"assets/img/1563696697515.94512132.png"},310:function(a,t,s){a.exports=s.p+"assets/img/1563697667480.8c846298.png"},311:function(a,t,s){a.exports=s.p+"assets/img/1563698644736.d67b2e09.png"},312:function(a,t,s){a.exports=s.p+"assets/img/1563698714557.fa1eeb1c.png"},313:function(a,t,s){a.exports=s.p+"assets/img/1563698865448.2cbaf53a.png"},376: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:"在单机使用-kind-安装-kubernetes"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#在单机使用-kind-安装-kubernetes","aria-hidden":"true"}},[a._v("#")]),a._v(" 在单机使用 kind 安装 Kubernetes")]),a._v(" "),e("p",[a._v("本文旨在通过使用 kind 搭建本地 k8s 集群环境,为技术爱好者提供快速上手 Kuboard 的基本实践方式。")]),a._v(" "),e("h2",{attrs:{id:"环境简介"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#环境简介","aria-hidden":"true"}},[a._v("#")]),a._v(" 环境简介")]),a._v(" "),e("p",[a._v("本地搭建 k8s 集群需要 kind 工具及 docker 环境。")]),a._v(" "),e("p",[a._v("建议硬件配置:2核 cpu,8G 内存")]),a._v(" "),e("p",[a._v("ps: 以下均为在 Linux 平台实践,其他平台可参考文章中链接。")]),a._v(" "),e("h3",{attrs:{id:"kind-简介与安装"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#kind-简介与安装","aria-hidden":"true"}},[a._v("#")]),a._v(" kind 简介与安装")]),a._v(" "),e("p",[a._v("kind:https://kind.sigs.k8s.io/ 是一个使用 Docker 容器运行本地 Kubernetes 集群的工具。\nps:本文使用kind V0.4.0")]),a._v(" "),e("p",[a._v("安装:")]),a._v(" "),e("ul",[e("li",[e("p",[a._v("linux:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[a._v("curl")]),a._v(" -Lo ./kind-linux-amd64 https://github.com/kubernetes-sigs/kind/releases/download/v0.4.0/kind-linux-amd64\n"),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("chmod")]),a._v(" +x ./kind-linux-amd64\n"),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("mv")]),a._v(" ./kind-linux-amd64 /usr/local/bin/kind\n")])])])]),a._v(" "),e("li",[e("p",[a._v("win:")]),a._v(" "),e("div",{staticClass:"language-powershell extra-class"},[e("pre",{pre:!0,attrs:{class:"language-powershell"}},[e("code",[a._v("curl"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),a._v("exe "),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("-")]),a._v("Lo kind"),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("-")]),a._v("windows"),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("-")]),a._v("amd64"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),a._v("exe https:"),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("/")]),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("/")]),a._v("github"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),a._v("com"),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("/")]),a._v("kubernetes"),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("-")]),a._v("sigs"),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("/")]),a._v("kind"),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("/")]),a._v("releases"),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("/")]),a._v("download"),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("/")]),a._v("v0"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),a._v("4"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),a._v("0"),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("/")]),a._v("kind"),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("-")]),a._v("windows"),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("-")]),a._v("amd64\n"),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("Move-Item")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),a._v("\\kind"),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("-")]),a._v("windows"),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("-")]),a._v("amd64"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),a._v("exe c:\\some"),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("-")]),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("dir")]),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("-in")]),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("-")]),a._v("your"),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("-")]),a._v("PATH\\kind"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),a._v("exe\n")])])])]),a._v(" "),e("li",[e("p",[a._v("mac:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[a._v("curl")]),a._v(" -Lo ./kind-darwin-amd64 https://github.com/kubernetes-sigs/kind/releases/download/v0.4.0/kind-darwin-amd64\n"),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("chmod")]),a._v(" +x ./kind-darwin-amd64\n"),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("mv")]),a._v(" ./kind-darwin-amd64 /usr/local/bin/kind\n")])])])])]),a._v(" "),e("h3",{attrs:{id:"docker-环境"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#docker-环境","aria-hidden":"true"}},[a._v("#")]),a._v(" docker 环境")]),a._v(" "),e("p",[a._v("Kind 的主要功能目前需要有 Docker 环境的支持,可参考 Docker 官方文档:https://links.jianshu.com/go?to=https%3A%2F%2Fdocs.docker.com%2Finstall%2F 进行安装。")]),a._v(" "),e("h3",{attrs:{id:"kubectl-安装"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#kubectl-安装","aria-hidden":"true"}},[a._v("#")]),a._v(" kubectl 安装")]),a._v(" "),e("p",[a._v("kubectl https://kubernetes.io/docs/tasks/tools/install-kubectl/ 是 Kubernetes 命令行工具,可以在 Kubernetes 上部署和管理应用程序")]),a._v(" "),e("p",[a._v("Linux:")]),a._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[a._v("curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.15.0/bin/linux/amd64/kubectl\nchmod +x ./kubectl\nsudo mv ./kubectl /usr/local/bin/kubectl\n")])])]),e("p",[a._v("ps: 由于网络问题多次尝试可下载成功")]),a._v(" "),e("h2",{attrs:{id:"k8s-集群搭建"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#k8s-集群搭建","aria-hidden":"true"}},[a._v("#")]),a._v(" k8s 集群搭建")]),a._v(" "),e("h3",{attrs:{id:"准备-kind-搭建集群配置文件-kind-config-yaml"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#准备-kind-搭建集群配置文件-kind-config-yaml","aria-hidden":"true"}},[a._v("#")]),a._v(" 准备 kind 搭建集群配置文件 kind-config.yaml")]),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 key atrule"}},[a._v("kind")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" Cluster\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(" kind.sigs.k8s.io/v1alpha3\n"),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("nodes")]),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(" "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("role")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" control"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("-")]),a._v("plane\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("-")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("role")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" worker\n")])])]),e("h3",{attrs:{id:"使用-kind-搭建集群"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#使用-kind-搭建集群","aria-hidden":"true"}},[a._v("#")]),a._v(" 使用 kind 搭建集群")]),a._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[a._v("kind create cluster --config kind-config.yaml\n")])])]),e("h3",{attrs:{id:"创建成功"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#创建成功","aria-hidden":"true"}},[a._v("#")]),a._v(" 创建成功")]),a._v(" "),e("p",[e("img",{attrs:{src:s(309),alt:"1563696697515"}})]),a._v(" "),e("p",[a._v("按照提示配置环境变量")]),a._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[a._v('export KUBECONFIG="$(kind get kubeconfig-path --name="kind")"\n')])])]),e("p",[a._v("查看集群信息")]),a._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[a._v("kubectl cluster-info\n")])])]),e("p",[e("img",{attrs:{src:s(310),alt:"1563697667480"}})]),a._v(" "),e("h2",{attrs:{id:"kuboard-安装"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#kuboard-安装","aria-hidden":"true"}},[a._v("#")]),a._v(" kuboard 安装")]),a._v(" "),e("p",[a._v("官方安装地址:http://kuboard.cn/#/install/install-dashboard")]),a._v(" "),e("h3",{attrs:{id:"获取并修改-yaml-文件"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#获取并修改-yaml-文件","aria-hidden":"true"}},[a._v("#")]),a._v(" 获取并修改 yaml 文件")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[a._v("wget")]),a._v(" https://raw.githubusercontent.com/eip-work/eip-monitor-repository/master/dashboard/kuboard.yaml\n")])])]),e("p",[a._v("修改文件 kuboard.yaml 中 Ingress 的 host 为空")]),a._v(" "),e("h3",{attrs:{id:"执行安装"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#执行安装","aria-hidden":"true"}},[a._v("#")]),a._v(" 执行安装")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("kubectl apply -f kuboard.yaml \n")])])]),e("h3",{attrs:{id:"查看启动状态"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#查看启动状态","aria-hidden":"true"}},[a._v("#")]),a._v(" 查看启动状态")]),a._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[a._v("kubectl get pods -n kube-system --watch\n")])])]),e("p",[a._v("等待 kuboard 启动成功")]),a._v(" "),e("h3",{attrs:{id:"访问-kuboard-页面"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#访问-kuboard-页面","aria-hidden":"true"}},[a._v("#")]),a._v(" 访问 kuboard 页面")]),a._v(" "),e("p",[a._v("待启动成功后,需要做 80 端口转发,通过浏览器访问 kuboard")]),a._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[a._v("kubectl port-forward service/kuboard 9080:80 -n kube-system\n")])])]),e("p",[a._v("获取登录 token")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("kubectl -n kube-system describe secret "),e("span",{pre:!0,attrs:{class:"token variable"}},[e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$(")]),a._v("kubectl -n kube-system get secret "),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("grep")]),a._v(" kuboard-user "),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("awk")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[a._v("'{print "),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$1")]),a._v("}'")]),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v(")")])]),a._v(" \n")])])]),e("p",[e("img",{attrs:{src:s(311),alt:"1563698644736"}})]),a._v(" "),e("p",[a._v("浏览器中访问 http://localhost:9080")]),a._v(" "),e("p",[e("img",{attrs:{src:s(312),alt:"1563698714557"}})]),a._v(" "),e("p",[a._v("将获取的 token 复制到浏览器中,访问成功")]),a._v(" "),e("p",[e("img",{attrs:{src:s(313),alt:"1563698865448"}})])])},[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/19.64794205.js b/docs/assets/js/19.64794205.js deleted file mode 100644 index 03b3b71..0000000 --- a/docs/assets/js/19.64794205.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[19],{116:function(e,r,a){e.exports=a.p+"assets/img/image-20190716234146419.bd87cdff.png"},305:function(e,r,a){e.exports=a.p+"assets/img/image-20190721154650916.3f63fdcb.jpg"},306:function(e,r,a){e.exports=a.p+"assets/img/image-20190723105039358.91eef75a.png"},307:function(e,r,a){e.exports=a.p+"assets/img/image-20190721000759925.bb32a332.png"},356: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(116),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(305),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(306),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(307),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(73),alt:"Kuboard QQ 群"}})])])},[],!1,null,null,null);r.default=s.exports},73:function(e,r,a){e.exports=a.p+"assets/img/kuboard_qq.45e78dbf.png"}}]); \ No newline at end of file diff --git a/docs/assets/js/19.883b60d2.js b/docs/assets/js/19.883b60d2.js new file mode 100644 index 0000000..389bfa6 --- /dev/null +++ b/docs/assets/js/19.883b60d2.js @@ -0,0 +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"},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/2.4586c502.js b/docs/assets/js/2.4586c502.js new file mode 100644 index 0000000..d007da9 --- /dev/null +++ b/docs/assets/js/2.4586c502.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[2],Array(104).concat([function(t,e,n){"use strict";n.d(e,"d",function(){return r}),n.d(e,"a",function(){return s}),n.d(e,"i",function(){return o}),n.d(e,"f",function(){return u}),n.d(e,"g",function(){return c}),n.d(e,"h",function(){return l}),n.d(e,"b",function(){return f}),n.d(e,"e",function(){return h}),n.d(e,"k",function(){return p}),n.d(e,"l",function(){return d}),n.d(e,"c",function(){return v}),n.d(e,"j",function(){return g});const r=/#.*$/,i=/\.(md|html)$/,s=/\/$/,o=/^(https?:|mailto:|tel:)/;function a(t){return decodeURI(t).replace(r,"").replace(i,"")}function u(t){return o.test(t)}function c(t){return/^mailto:/.test(t)}function l(t){return/^tel:/.test(t)}function f(t){if(u(t))return t;const e=t.match(r),n=e?e[0]:"",i=a(t);return s.test(i)?t:i+".html"+n}function h(t,e){const n=t.hash,i=function(t){const e=t.match(r);if(e)return e[0]}(e);return(!i||n===i)&&a(t.path)===a(e)}function p(t,e,n){if(u(e))return{type:"external",path:e};n&&(e=function(t,e,n){const r=t.charAt(0);if("/"===r)return t;if("?"===r||"#"===r)return e+t;const i=e.split("/");n&&i[i.length-1]||i.pop();const s=t.replace(/^\//,"").split("/");for(let t=0;t({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}(t);const a=o.sidebar||s.sidebar;if(a){const{base:t,config:n}=function(t,e){if(Array.isArray(e))return{base:"/",config:e};for(const r in e)if(0===(n=t,/(\.html|\/)$/.test(n)?n:n+"/").indexOf(encodeURI(r)))return{base:r,config:e[r]};var n;return{}}(e,a);return n?n.map(e=>(function t(e,n,r,i=1){if("string"==typeof e)return p(n,e,r);if(Array.isArray(e))return Object.assign(p(n,e[0],r),{title:e[1]});{i>3&&console.error("[vuepress] detected a too deep nested sidebar group.");const s=e.children||[];return 0===s.length&&e.path?Object.assign(p(n,e.path,r),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,children:s.map(e=>t(e,n,r,i+1)),collapsable:!1!==e.collapsable}}})(e,i,t)):[]}return[]}function v(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}function g(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},function(t,e,n){var r=n(154)("wks"),i=n(155),s=n(33).Symbol,o="function"==typeof s;(t.exports=function(t){return r[t]||(r[t]=o&&s[t]||(o?s:i)("Symbol."+t))}).store=r},function(t,e){t.exports={}},function(t,e,n){"use strict";var r=n(1),i=n(37)(3);r(r.P+r.F*!n(22)([].some,!0),"Array",{some:function(t){return i(this,t,arguments[1])}})},function(t,e){t.exports={}},function(t,e,n){var r=n(9).f,i=n(8),s=n(17)("toStringTag");t.exports=function(t,e,n){t&&!i(t=n?t:t.prototype,s)&&r(t,s,{configurable:!0,value:e})}},,,,,function(t,e,n){"use strict";n(115),n(116),n(107),n(124);var r=n(104),i={props:{item:{required:!0}},computed:{link:function(){return Object(r.b)(this.item.link)},exact:function(){var t=this;return this.$site.locales?Object.keys(this.$site.locales).some(function(e){return e===t.link}):"/"===this.link}},methods:{isExternal:r.f,isMailto:r.g,isTel:r.h}},s=n(0),o=Object(s.a)(i,function(){var t=this,e=t.$createElement,n=t._self._c||e;return t.isExternal(t.link)?n("a",{staticClass:"nav-link external",attrs:{href:t.link,target:t.isMailto(t.link)||t.isTel(t.link)?null:"_blank",rel:t.isMailto(t.link)||t.isTel(t.link)?null:"noopener noreferrer"}},[t._v("\n "+t._s(t.item.text)+"\n "),n("OutboundLink")],1):n("router-link",{staticClass:"nav-link",attrs:{to:t.link,exact:t.exact}},[t._v(t._s(t.item.text))])},[],!1,null,null,null);e.a=o.exports},function(t,e,n){for(var r=n(117),i=n(56),s=n(19),o=n(2),a=n(18),u=n(106),c=n(17),l=c("iterator"),f=c("toStringTag"),h=u.Array,p={CSSRuleList:!0,CSSStyleDeclaration:!1,CSSValueList:!1,ClientRectList:!1,DOMRectList:!1,DOMStringList:!1,DOMTokenList:!0,DataTransferItemList:!1,FileList:!1,HTMLAllCollection:!1,HTMLCollection:!1,HTMLFormElement:!1,HTMLSelectElement:!1,MediaList:!0,MimeTypeArray:!1,NamedNodeMap:!1,NodeList:!0,PaintRequestList:!1,Plugin:!1,PluginArray:!1,SVGLengthList:!1,SVGNumberList:!1,SVGPathSegList:!1,SVGPointList:!1,SVGStringList:!1,SVGTransformList:!1,SourceBufferList:!1,StyleSheetList:!0,TextTrackCueList:!1,TextTrackList:!1,TouchList:!1},d=i(p),v=0;v=t.length?(this._t=void 0,i(1)):i(0,"keys"==e?n:"values"==e?t[n]:[n,t[n]])},"values"),s.Arguments=s.Array,r("keys"),r("values"),r("entries")},function(t,e,n){var r=n(17)("unscopables"),i=Array.prototype;null==i[r]&&n(18)(i,r,{}),t.exports=function(t){i[r][t]=!0}},function(t,e){t.exports=function(t,e){return{value:e,done:!!t}}},function(t,e,n){"use strict";var r=n(61),i=n(1),s=n(19),o=n(18),a=n(106),u=n(121),c=n(109),l=n(122),f=n(17)("iterator"),h=!([].keys&&"next"in[].keys()),p=function(){return this};t.exports=function(t,e,n,d,v,g,m){u(n,e,d);var b,_,x,y=function(t){if(!h&&t in C)return C[t];switch(t){case"keys":case"values":return function(){return new n(this,t)}}return function(){return new n(this,t)}},k=e+" Iterator",L="values"==v,S=!1,C=t.prototype,$=C[f]||C["@@iterator"]||v&&C[v],w=$||y(v),O=v?L?y("entries"):w:void 0,T="Array"==e&&C.entries||$;if(T&&(x=l(T.call(new t)))!==Object.prototype&&x.next&&(c(x,k,!0),r||"function"==typeof x[f]||o(x,f,p)),L&&$&&"values"!==$.name&&(S=!0,w=function(){return $.call(this)}),r&&!m||!h&&!S&&C[f]||o(C,f,w),a[e]=w,a[k]=p,v)if(b={values:L?w:y("values"),keys:g?w:y("keys"),entries:O},m)for(_ in b)_ in C||s(C,_,b[_]);else i(i.P+i.F*(h||S),e,b);return b}},function(t,e,n){"use strict";var r=n(62),i=n(35),s=n(109),o={};n(18)(o,n(17)("iterator"),function(){return this}),t.exports=function(t,e,n){t.prototype=r(o,{next:i(1,n)}),s(t,e+" Iterator")}},function(t,e,n){var r=n(8),i=n(32),s=n(36)("IE_PROTO"),o=Object.prototype;t.exports=Object.getPrototypeOf||function(t){return t=i(t),r(t,s)?t[s]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?o:null}},function(t,e,n){var r=n(1),i=n(21),s=n(5);t.exports=function(t,e){var n=(i.Object||{})[t]||Object[t],o={};o[t]=e(n),r(r.S+r.F*s(function(){n(1)}),"Object",o)}},function(t,e,n){"use strict";n(125)("link",function(t){return function(e){return t(this,"a","href",e)}})},function(t,e,n){var r=n(1),i=n(5),s=n(7),o=/"/g,a=function(t,e,n,r){var i=String(s(t)),a="<"+e;return""!==n&&(a+=" "+n+'="'+String(r).replace(o,""")+'"'),a+">"+i+""};t.exports=function(t,e){var n={};n[t]=e(a),r(r.P+r.F*i(function(){var e=""[t]('"');return e!==e.toLowerCase()||e.split('"').length>3}),"String",n)}},function(t,e,n){},function(t,e,n){},function(t,e,n){},function(t,e){var n={}.toString;t.exports=function(t){return n.call(t).slice(8,-1)}},function(t,e){var n=Math.ceil,r=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?r:n)(t)}},function(t,e){t.exports=function(t){if(null==t)throw TypeError("Can't call method on "+t);return t}},function(t,e,n){var r=n(182),i=n(131);t.exports=function(t){return r(i(t))}},function(t,e,n){var r=n(154)("keys"),i=n(155);t.exports=function(t){return r[t]||(r[t]=i(t))}},function(t,e,n){},function(t,e,n){},function(t,e,n){},function(t,e,n){},function(t,e,n){},function(t,e,n){},function(t,e,n){},,function(t,e,n){},,,,,,,function(t,e,n){"use strict";var r=n(6),i=n(23),s=n(70),o=n(71);n(72)("match",1,function(t,e,n,a){return[function(n){var r=t(this),i=null==n?void 0:n[e];return void 0!==i?i.call(n,r):new RegExp(n)[e](String(r))},function(t){var e=a(n,t,this);if(e.done)return e.value;var u=r(t),c=String(this);if(!u.global)return o(u,c);var l=u.unicode;u.lastIndex=0;for(var f,h=[],p=0;null!==(f=o(u,c));){var d=String(f[0]);h[p]=d,""===d&&(u.lastIndex=s(c,i(u.lastIndex),l)),p++}return 0===p?null:h}]})},function(t,e,n){"use strict";var r=n(175)(!0);n(151)(String,"String",function(t){this._t=String(t),this._i=0},function(){var t,e=this._t,n=this._i;return n>=e.length?{value:void 0,done:!0}:(t=r(e,n),this._i+=t.length,{value:t,done:!1})})},function(t,e,n){"use strict";var r=n(152),i=n(58),s=n(176),o=n(57),a=n(108),u=n(177),c=n(157),l=n(186),f=n(105)("iterator"),h=!([].keys&&"next"in[].keys()),p=function(){return this};t.exports=function(t,e,n,d,v,g,m){u(n,e,d);var b,_,x,y=function(t){if(!h&&t in C)return C[t];switch(t){case"keys":case"values":return function(){return new n(this,t)}}return function(){return new n(this,t)}},k=e+" Iterator",L="values"==v,S=!1,C=t.prototype,$=C[f]||C["@@iterator"]||v&&C[v],w=$||y(v),O=v?L?y("entries"):w:void 0,T="Array"==e&&C.entries||$;if(T&&(x=l(T.call(new t)))!==Object.prototype&&x.next&&(c(x,k,!0),r||"function"==typeof x[f]||o(x,f,p)),L&&$&&"values"!==$.name&&(S=!0,w=function(){return $.call(this)}),r&&!m||!h&&!S&&C[f]||o(C,f,w),a[e]=w,a[k]=p,v)if(b={values:L?w:y("values"),keys:g?w:y("keys"),entries:O},m)for(_ in b)_ in C||s(C,_,b[_]);else i(i.P+i.F*(h||S),e,b);return b}},function(t,e){t.exports=!0},function(t,e,n){var r=n(130),i=Math.min;t.exports=function(t){return t>0?i(r(t),9007199254740991):0}},function(t,e,n){var r=n(31),i=n(33),s=i["__core-js_shared__"]||(i["__core-js_shared__"]={});(t.exports=function(t,e){return s[t]||(s[t]=void 0!==e?e:{})})("versions",[]).push({version:r.version,mode:n(152)?"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,n){var r=n(34).f,i=n(60),s=n(105)("toStringTag");t.exports=function(t,e,n){t&&!i(t=n?t:t.prototype,s)&&r(t,s,{configurable:!0,value:e})}},function(t,e,n){var r=n(131);t.exports=function(t){return Object(r(t))}},function(t,e,n){var r=n(129),i=n(105)("toStringTag"),s="Arguments"==r(function(){return arguments}());t.exports=function(t){var e,n,o;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(n=function(t,e){try{return t[e]}catch(t){}}(e=Object(t),i))?n:s?r(e):"Object"==(o=r(e))&&"function"==typeof e.callee?"Arguments":o}},function(t,e,n){"use strict";n.r(e);n(107);var r=n(104),i={name:"SidebarGroup",props:["item","open","collapsable","depth"],components:{DropdownTransition:n(161).a},beforeCreate:function(){this.$options.components.SidebarLinks=n(160).default},methods:{isActive:r.e}},s=(n(205),n(0)),o=Object(s.a)(i,function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("section",{staticClass:"sidebar-group",class:[{collapsable:t.collapsable,"is-sub-group":0!==t.depth},"depth-"+t.depth]},[t.item.path?n("router-link",{staticClass:"sidebar-heading clickable",class:{open:t.open,active:t.isActive(t.$route,t.item.path)},attrs:{to:t.item.path},nativeOn:{click:function(e){return t.$emit("toggle")}}},[n("span",[t._v(t._s(t.item.title))]),t._v(" "),t.collapsable?n("span",{staticClass:"arrow",class:t.open?"down":"right"}):t._e()]):n("p",{staticClass:"sidebar-heading",class:{open:t.open},on:{click:function(e){return t.$emit("toggle")}}},[n("span",[t._v(t._s(t.item.title))]),t._v(" "),t.collapsable?n("span",{staticClass:"arrow",class:t.open?"down":"right"}):t._e()]),t._v(" "),n("DropdownTransition",[t.open||!t.collapsable?n("SidebarLinks",{staticClass:"sidebar-group-items",attrs:{items:t.item.children,sidebarDepth:t.item.sidebarDepth,depth:t.depth+1}}):t._e()],1)],1)},[],!1,null,null,null).exports;n(64);function a(t,e,n,r){return t("router-link",{props:{to:e,activeClass:"",exactActiveClass:""},class:{active:r,"sidebar-link":!0}},n)}function u(t,e,n,i,s){var o=arguments.length>5&&void 0!==arguments[5]?arguments[5]:1;return!e||o>s?null:t("ul",{class:"sidebar-sub-headers"},e.map(function(e){var c=Object(r.e)(i,n+"#"+e.slug);return t("li",{class:"sidebar-sub-header"},[a(t,n+"#"+e.slug,e.title,c),u(t,e.children,n,i,s,o+1)])}))}var c={functional:!0,props:["item","sidebarDepth"],render:function(t,e){var n=e.parent,i=n.$page,s=(n.$site,n.$route),o=n.$themeConfig,c=n.$themeLocaleConfig,l=e.props,f=l.item,h=l.sidebarDepth,p=Object(r.e)(s,f.path),d="auto"===f.type?p||f.children.some(function(t){return Object(r.e)(s,f.basePath+"#"+t.slug)}):p,v="external"===f.type?function(t,e,n){return t("a",{attrs:{href:e,target:"_blank",rel:"noopener noreferrer"},class:{"sidebar-link":!0}},[n,t("OutboundLink")])}(t,f.path,f.title||f.path):a(t,f.path,f.title||f.path,d),g=i.frontmatter.sidebarDepth||h||c.sidebarDepth||o.sidebarDepth,m=null==g?1:g,b=c.displayAllHeaders||o.displayAllHeaders;return"auto"===f.type?[v,u(t,f.children,f.basePath,s,m)]:(d||b)&&f.headers&&!r.d.test(f.path)?[v,u(t,Object(r.c)(f.headers),f.path,s,m)]:v}};n(206);var l={name:"SidebarLinks",components:{SidebarGroup:o,SidebarLink:Object(s.a)(c,void 0,void 0,!1,null,null,null).exports},props:["items","depth","sidebarDepth"],data:function(){return{openGroupIndex:0}},created:function(){this.refreshIndex()},watch:{$route:function(){this.refreshIndex()}},methods:{refreshIndex:function(){var t=function(t,e){for(var n=0;n-1&&(this.openGroupIndex=t)},toggleGroup:function(t){this.openGroupIndex=t===this.openGroupIndex?-1:t},isActive:function(t){return Object(r.e)(this.$route,t.regularPath)}}},f=Object(s.a)(l,function(){var t=this,e=t.$createElement,n=t._self._c||e;return t.items.length?n("ul",{staticClass:"sidebar-links"},t._l(t.items,function(e,r){return n("li",{key:r},["group"===e.type?n("SidebarGroup",{attrs:{item:e,open:r===t.openGroupIndex,collapsable:e.collapsable||e.collapsible,depth:t.depth},on:{toggle:function(e){return t.toggleGroup(r)}}}):n("SidebarLink",{attrs:{sidebarDepth:t.sidebarDepth,item:e}})],1)}),0):t._e()},[],!1,null,null,null);e.default=f.exports},function(t,e,n){"use strict";var r={name:"DropdownTransition",methods:{setHeight:function(t){t.style.height=t.scrollHeight+"px"},unsetHeight:function(t){t.style.height=""}}},i=(n(200),n(0)),s=Object(i.a)(r,function(){var t=this.$createElement;return(this._self._c||t)("transition",{attrs:{name:"dropdown"},on:{enter:this.setHeight,"after-enter":this.unsetHeight,"before-leave":this.setHeight}},[this._t("default")],2)},[],!1,null,null,null);e.a=s.exports},function(t,e,n){"use strict";var r=n(126);n.n(r).a},function(t,e,n){"use strict";n(67)("trim",function(t){return function(){return t(this,3)}})},function(t,e,n){"use strict";var r=n(127);n.n(r).a},function(t,e,n){"use strict";var r=n(128);n.n(r).a},function(t,e,n){var r=n(2),i=n(65),s=n(9).f,o=n(66).f,a=n(167),u=n(73),c=r.RegExp,l=c,f=c.prototype,h=/a/g,p=/a/g,d=new c(h)!==h;if(n(3)&&(!d||n(5)(function(){return p[n(17)("match")]=!1,c(h)!=h||c(p)==p||"/a/i"!=c(h,"i")}))){c=function(t,e){var n=this instanceof c,r=a(t),s=void 0===e;return!n&&r&&t.constructor===c&&s?t:i(d?new l(r&&!s?t.source:t,e):l((r=t instanceof c)?t.source:t,r&&s?u.call(t):e),n?this:f,c)};for(var v=function(t){t in c||s(c,t,{configurable:!0,get:function(){return l[t]},set:function(e){l[t]=e}})},g=o(l),m=0;g.length>m;)v(g[m++]);f.constructor=c,c.prototype=f,n(19)(r,"RegExp",c)}n(168)("RegExp")},function(t,e,n){var r=n(4),i=n(10),s=n(17)("match");t.exports=function(t){var e;return r(t)&&(void 0!==(e=t[s])?!!e:"RegExp"==i(t))}},function(t,e,n){"use strict";var r=n(2),i=n(9),s=n(3),o=n(17)("species");t.exports=function(t){var e=r[t];s&&e&&!e[o]&&i.f(e,o,{configurable:!0,get:function(){return this}})}},function(t,e,n){t.exports=n(170)},function(t,e,n){n(171),t.exports=n(31).Array.isArray},function(t,e,n){var r=n(58);r(r.S,"Array",{isArray:n(172)})},function(t,e,n){var r=n(129);t.exports=Array.isArray||function(t){return"Array"==r(t)}},function(t,e,n){t.exports=n(174)},function(t,e,n){n(150),n(187),t.exports=n(31).Array.from},function(t,e,n){var r=n(130),i=n(131);t.exports=function(t){return function(e,n){var s,o,a=String(i(e)),u=r(n),c=a.length;return u<0||u>=c?t?"":void 0:(s=a.charCodeAt(u))<55296||s>56319||u+1===c||(o=a.charCodeAt(u+1))<56320||o>57343?t?a.charAt(u):s:t?a.slice(u,u+2):o-56320+(s-55296<<10)+65536}}},function(t,e,n){t.exports=n(57)},function(t,e,n){"use strict";var r=n(178),i=n(63),s=n(157),o={};n(57)(o,n(105)("iterator"),function(){return this}),t.exports=function(t,e,n){t.prototype=r(o,{next:i(1,n)}),s(t,e+" Iterator")}},function(t,e,n){var r=n(59),i=n(179),s=n(156),o=n(133)("IE_PROTO"),a=function(){},u=function(){var t,e=n(69)("iframe"),r=s.length;for(e.style.display="none",n(185).appendChild(e),e.src="javascript:",(t=e.contentWindow.document).open(),t.write(" +

    Copyright © 2019-present HuanQing Shao
    + diff --git a/docs/guide/cluster/namespace.html b/docs/guide/cluster/namespace.html index ce5e7a1..e3dc4d4 100644 --- a/docs/guide/cluster/namespace.html +++ b/docs/guide/cluster/namespace.html @@ -5,13 +5,13 @@ 名称空间管理 | Kuboard - - - - + + + + -

    名称空间管理

    创建名称空间

    前提

    必须具备如下条件:

    假设您已经进入了 Kuboard 界面,如下图所示:

    image-20190723105606081

    准备

    • 点击 创建 按钮,创建名称空间

    并填写:

    字段名称 填写内容 说明
    名称 example Kubernetes 的 namespace 名称

    image-20190723105644937

    • 点击 保存

    image-20190723105722999

    • 点击 应用

    image-20190723105748435

    • 点击 完成

      此时可在名称空间列表中查看到刚刚创建好的名称空间 example

    image-20190723105809872

    • 点击 example 名称空间

      点击 example 名称空间后,可进入该名称空间的页面。刚刚初始化的名称空间的界面布局如下图所示:

    image-20190723105830318

    更新时间: 2019-07-25 06:22:52
    Copyright © 2019-present HuanQing Shao
    + diff --git a/docs/guide/cluster/storage.html b/docs/guide/cluster/storage.html index ace36f0..ee4c388 100644 --- a/docs/guide/cluster/storage.html +++ b/docs/guide/cluster/storage.html @@ -5,13 +5,13 @@ 存储空间管理 | Kuboard - - - - + + + + -

    存储空间管理

    创建存储类

    前提

    必须具备如下条件:

    • Kubernetes 集群 (安装在阿里云,本文将使用阿里云的 NFS 服务作为存储资源,Kuboard 也可以运行在其他云环境或者私有环境中。)
    • 已在集群中安装 Kuboard

    在阿里云创建 NAS 服务

    如果您在其他 IaaS 供应商搭建了 Kubernetes 集群,请参考该 IaaS 供应商的文档,创建 NFS 服务。您也可以自行搭建 NFS 服务器,用来为 Kubernetes 集群提供存储资源。

    • 进入阿里云 文件存储 NAS 服务 控制台

    登录 www.aliyun.com 后,在控制台界面的产品与服务中选择 文件存储 NAS

    如下图所示

    image-20190717113807552

    • 文件存储 NAS 控制台中点击 创建文件系统

    image-20190717114304953

    • 填写表单
    字段名称 填写内容 说明
    地域 请选择您的 Kubernetes 集群所在的地域 文件系统所在地域
    存储类型 容量型 / 或 SSD型 测试目的,使用价格便宜的容量型即可
    协议类型 NFS 请选择NFS
    可用区 请选择您的 Kubernetes 集群所在的可用区 文件系统所在可用区
    存储包 如果当下没有存储包,可以后续绑定 不绑定存储包,将无法使用该文件系统

    image-20190717114354610

    • 点击 确定

    点击确定后,可查看到该文件系统已创建成功

    image-20190717115020848

    • 绑定存储包

    请自行在阿里云中为该文件系统绑定存储包,如果不绑定存储包,将无法使用该文件系统。

    • 点击刚创建文件系统的 管理 按钮

    image-20190717115403374

    • 点击 添加挂载点

    并填写表单

    字段名称 填写内容 说明
    挂载点类型 专有网络
    VPC网络 请选择您的 Kubernetes 集群所在的VPC
    交换机 请选择您的 Kubernetes 集群所在的交换机
    权限组 VPC默认权限组(全部允许) 请选择全部允许

    image-20190717115457614

    • 点击 确定

    点击确定后,将完成挂载点创建,如下图所示:

    image-20190717115829821

    • 获取 NFS 连接参数:

    在上图界面中,将 V4 Mount 的指令复制下来后,如下所示:

    +

    存储空间管理

    创建存储类

    前提

    必须具备如下条件:

    • Kubernetes 集群 (安装在阿里云,本文将使用阿里云的 NFS 服务作为存储资源,Kuboard 也可以运行在其他云环境或者私有环境中。)
    • 已在集群中安装 Kuboard

    在阿里云创建 NAS 服务

    如果您在其他 IaaS 供应商搭建了 Kubernetes 集群,请参考该 IaaS 供应商的文档,创建 NFS 服务。您也可以自行搭建 NFS 服务器,用来为 Kubernetes 集群提供存储资源。

    • 进入阿里云 文件存储 NAS 服务 控制台

    登录 www.aliyun.com 后,在控制台界面的产品与服务中选择 文件存储 NAS

    如下图所示

    image-20190717113807552

    • 文件存储 NAS 控制台中点击 创建文件系统

    image-20190717114304953

    • 填写表单
    字段名称 填写内容 说明
    地域 请选择您的 Kubernetes 集群所在的地域 文件系统所在地域
    存储类型 容量型 / 或 SSD型 测试目的,使用价格便宜的容量型即可
    协议类型 NFS 请选择NFS
    可用区 请选择您的 Kubernetes 集群所在的可用区 文件系统所在可用区
    存储包 如果当下没有存储包,可以后续绑定 不绑定存储包,将无法使用该文件系统

    image-20190717114354610

    • 点击 确定

    点击确定后,可查看到该文件系统已创建成功

    image-20190717115020848

    • 绑定存储包

    请自行在阿里云中为该文件系统绑定存储包,如果不绑定存储包,将无法使用该文件系统。

    • 点击刚创建文件系统的 管理 按钮

    image-20190717115403374

    • 点击 添加挂载点

    并填写表单

    字段名称 填写内容 说明
    挂载点类型 专有网络
    VPC网络 请选择您的 Kubernetes 集群所在的VPC
    交换机 请选择您的 Kubernetes 集群所在的交换机
    权限组 VPC默认权限组(全部允许) 请选择全部允许

    image-20190717115457614

    • 点击 确定

    点击确定后,将完成挂载点创建,如下图所示:

    image-20190717115829821

    • 获取 NFS 连接参数:

    在上图界面中,将 V4 Mount 的指令复制下来后,如下所示:

    sudo mount -t nfs -o vers=4,minorversion=0,noresvport 189344a39c-lex38.cn-beijing.nas.aliyuncs.com:/ /mnt

    其中红色字体的文字为 NFS Server 的地址,蓝色字体的文字为 NFS Path。如下表所示:

    字段名称 字段取值 说明
    NFS Server 189344a39c-lex38.cn-beijing.nas.aliyuncs.com
    NFS Path / NFS Server和NFS Path以冒号分隔

    在 Kuboard 创建存储类

    • 进入 Kuboard 集群概览页

      参考 访问 Kuboard

      如下图所示:

    image-20190723112105018

    • 点击 创建存储类

      填写表单

    字段名称 填写内容 说明
    名称 cluster-storage 填写你喜欢的名称
    限定名称空间 不填写 如果限定名称空间,
    则在 Kuboard 中,您只能在指定的名称空间中使用该存储类
    在 kubectl 中,不受影响
    存储类型 NFS 目前 Kuboard 只支持 NFS,将要增加其他类型的存储,如 CephFS、Cinder 等
    回收策略 回收后删除 当该存储类创建的 存储卷(Persistent Volume)被删除后,之前该存储卷中的文件可以被:回收后删除 / 回收后保留
    存储卷绑定模式 首次使用时绑定 即刻绑定:当 存储卷被创建时,就在 NFS 中为其分配空间,并绑定;
    首次使用时绑定: 在存储卷被第一次使用到时,才绑定

    image-20190723112143032

    • 点击 保存

    image-20190723112204681

    • 点击 应用

    image-20190723113250521

    • 点击 完成

      此时可在存储资源列表中查看到刚创建的存储类

    image-20190723113312360

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

    Copyright © 2019-present HuanQing Shao
    + diff --git a/docs/guide/diagonize/events.html b/docs/guide/diagonize/events.html index 5c28da0..d81a20d 100644 --- a/docs/guide/diagonize/events.html +++ b/docs/guide/diagonize/events.html @@ -5,13 +5,13 @@ 集群事件 | Kuboard - - - - + + + + -

    集群事件

    通过观察 KUberetes 集群事件,可以快速诊断部署时发生的问题。

    Kuboard 建立了与 kubernetes apiserver 的长连接,可以在第一时间将集群中的事件更新以通知的形式显示在 dashboad 上。

    错误事件提示

    如果存在与某一个工作负载相关的错误事件,名称空间界面中,将以红色显示该工作负载,如下图所示:

    image-20190721104153954

    全局事件

    查看全局事件

    在任何页面点击界面左上角的 事件 按钮,进入事件列表页:

    image-20190721101812895

    删除事件

    • 点击全局事件列表中的 类型 标签,

    image-20190721101954560

    • 点击 确定

    该事件已删除。如果事件对应的错误原因没有被解决,该事件又会在下一次 kubernetes 调度系统资源的时候重新出现。

    微服务上下文相关的事件

    打开工作负载页面,如下图所示:

    容器组信息中包含了与该容器组相关的所有集群事件。

    image-20190721103324863

    更新时间: 2019-07-25 06:22:52
    Copyright © 2019-present HuanQing Shao
    + diff --git a/docs/guide/diagonize/logs.html b/docs/guide/diagonize/logs.html index e006d65..9853dd5 100644 --- a/docs/guide/diagonize/logs.html +++ b/docs/guide/diagonize/logs.html @@ -5,13 +5,13 @@ 日志及终端 | Kuboard - - - - + + + + -

    日志及终端

    日志

    通过 Kuboard 可以实时跟踪容器的日志信息。

    假设您已经进入 工作负载 详情页,如下图所示:

    image-20190721104348908

    • 点击容器信息中的 日志 按钮

      可进入日志追踪界面,如下图所示:

    image-20190721104415732

    终端

    • 点击容器信息中的 终端 按钮

      可进入终端界面,如下图所示:

      • 在终端中,可以执行的 shell 命令取决于该容器预装的命令。许多容器为了精简自身的大小,只保留了最基本的命令。

      • 通常会进入终端执行如下诊断操作:

        • export 命令查看容器内的环境变量是否被正确设置
        • ping, curl 命令检查容器内与集群内其他服务,集群外服务的网络连通性
        • vi 命令,临时修改容器内应用程序的配置,并在容器内重启应用程序,以临时性的尝试修复问题,如果有效再将修改更新到应用程序代码或者 Dockerfile

    image-20190721104522870

    更新时间: 2019-07-25 06:22:52
    Copyright © 2019-present HuanQing Shao
    + diff --git a/docs/guide/diagonize/port-forward.html b/docs/guide/diagonize/port-forward.html index d6c2c94..3fcf764 100644 --- a/docs/guide/diagonize/port-forward.html +++ b/docs/guide/diagonize/port-forward.html @@ -5,13 +5,13 @@ 端口转发 | Kuboard - - - - + + + + -

    端口转发

    微服务环境中,各个服务都通过 TCP / UDP 端口的形式提供访问。按调用者所在位置、通信协议的形式来划分,大致有如下几种情况:

    调用者所在位置 通信协议 临时性 常见场景 推荐配置方式
    VPC外 http / https 日常性 用户从互联网(亦可能是公司内网)
    访问 web 页面,或者 restful 接口
    Kubernetes Ingress
    (可在Kuboard中直接配置 互联网入口
    VPC外 tcp / udp 临时性 例如,开发者临时需要访问数据库端口、Redis端口等; 在客户端所在机器配置 kubectl,
    通过 kubectl port-forwad 进行端口转发
    VPC外 tcp / udp 日常性 暂不讨论
    VPC内/集群外 http / https 日常性 通过接口网关为周边系统提供服务 Kubernetes Service NodePort
    (可在Kuboard中直接配置 访问方式/VPC内访问
    VPC内/集群外 tcp / udp 同上 同上
    集群内 http / https 日常性 场景1:Web层访问微服务网关
    场景2:微服务网关调用微服务,微服务之间的互相调用等。
    场景1:Kubernetes Service ClusterIP
    (可在Kuboard中直接配置 访问方式/集群内访问
    场景2:Spring Cloud中使用Eureka/Consul等服务发现
    (Kuboard中 访问方式/不配置
    集群内 tcp / udp 日常性 微服务访问数据库、微服务访问Redis等 Kubernetes Service ClusterIP
    (可在Kuboard中直接配置 访问方式/集群内访问

    Feature planned

    在作者使用 Kuboard 的运维实践中,有如下两个场景不能脱离 kubeadm / kubectl 命令行:

    • 初始化集群 / 向集群添加节点
    • 开发者临时需要访问数据库端口、Redis端口时,通过 kubectl port-forward 进行端口转发

    Kuboard 计划实现类似 kubectl port-forward 的功能,提高问题诊断过程中的便利性。

    更新时间: 2019-07-25 22:26:28
    Copyright © 2019-present HuanQing Shao
    + diff --git a/docs/guide/example/busybox.html b/docs/guide/example/busybox.html index 87b5ebc..4f2f6a2 100644 --- a/docs/guide/example/busybox.html +++ b/docs/guide/example/busybox.html @@ -5,13 +5,13 @@ 部署 busybox | Kuboard - - - - + + + + -

    部署 busybox

    前提

    必须具备如下条件:

    • Kubernetes 集群
    • 已在集群中安装 Kuboard

    假设您已经进入了 Kuboard 名称空间界面,如下图所示。可参考 创建名称空间

    image-20190723115721514

    部署 busybox

    查看 busybox 介绍

    Busybox 是一个非常小巧(不到5M)的容器,此处用它来展示如何将一个 docker image 通过 Kuboard 部署到 kubernetes 集群中。

    • 点击 创建工作负载按钮

      填写表单如下:

    字段名称 填写内容 说明
    服务类型 Deployment Kubernetes 的 Deployment 类型
    服务分层 中间件 生成的Kuberenetes对象以 cloud- 作为前缀,
    并显示在中间件分层中
    服务名称 busybox 显示在 Kuboard 中的名称
    副本数量 1 replicas
    容器名称 busybox
    镜像 busybox:1.29 hub.docker.com 中的 busybox 镜像
    Command sleep
    Command 3600

    image-20190723115852719

    • 完成表单填写后,点击 保存

      Kuboard 将对表单参数进行校验,通过后,方可执行对集群的变更操作。

    image-20190723115912645

    • 点击 应用

      Kuboard 执行对集群的变更操作,变更的过程中,产生的事件以通知消息的形式显示出来。

    image-20190723115940862

    验证工作负载

    • 点击 完成

      点击完成后,可查看工作负载的信息。该界面分成四个区域:

      • 页头区

        页头区包含对该工作负载(本案例中为 Deployment)的操作按钮。可执行的操作有:编辑 / 伸缩 / 刷新 / 删除

      • 工作负载基本信息

        基本信息区显示了工作负载的 基本信息运行时信息访问方式(Service)、互联网入口(Ingress)

      • 容器组列表

        容器组列表区显示了该当前对应的所有容器组(Pod),容器组列表区监听集群的动态变化,当您执行伸缩操作、或者删除容器组操作时,无需刷新,就可以查看到最新的容器组信息。

      • 容器组详情

        容器组详情区显示了当前选中容器组的信息,其中包括:

        • 容器组相关事件
        • 容器组基本信息,及删除容器组的操作按钮。(此区域还包括容器组相关的监控操作,监控模块在后续的章节中介绍)
        • 容器基本信息,及查看容器日志、打开容器终端的按钮。(此区域还包括容器相关的监控操作,监控模块在后续的章节中介绍)

    image-20190723120011972

    • 点击 终端

      此时打开了该容器的控制台,Kuboard 默认使用 /bin/bash 终端程序,而 busybox 镜像中并不包含 /bin/bash,因此您会看到一个如下图所示的错误提示:

    image-20190723120050894

    • 点击 切换到 /bin/sh

      点击屏幕左上角的 切换到 /bin/sh

    image-20190723120104474

    • 输入 export 并回车

      输入 export 并回车后,可查看该容器当前的环境变量。您也可以在终端中执行任何容器内部的命令。在您完成容器的部署之后,终端界面是非常有效的问题诊断工具之一。

    image-20190723120125425

    更新时间: 2019-07-25 22:26:28
    Copyright © 2019-present HuanQing Shao
    + diff --git a/docs/guide/example/import.html b/docs/guide/example/import.html index 85efdf8..eae11fa 100644 --- a/docs/guide/example/import.html +++ b/docs/guide/example/import.html @@ -5,13 +5,13 @@ 导入 example 微服务 | Kuboard - - - - + + + + -

    导入 example 微服务

    前提

    必须具备如下条件:

    • Kubernetes 集群 (安装在阿里云,本文将使用阿里云的 NFS 服务作为存储资源,Kuboard 也可以运行在其他云环境或者私有环境中。)
    • 已在集群中安装 Kuboard

    创建存储资源

    example中用到了存储卷声明,请在 Kuboard 中 创建存储类 ,否则不能完成 example 的导入操作。

    创建名称空间

    创建新的名称空间,用来导入 exmaple。可参考 创建名称空间

    假设您已经进入了 Kuboard 名称空间界面,如下图所示:

    image-20190723115721514

    导入 example

    在 Kuboard 中,您无需手写 yaml 文件,此 yaml 文件的内容生成步骤如下:

    • 通过 创建工作负载 完成微服务应用的部署
    • 通过 导出工作负载 将名称空间中的微服务配置导出到一个 yaml 文件中
    • 点击 导入工作负载 按钮

    image-20190723120730196

    • 点击 上传文件 按钮

      并选择刚才下载的 export_example.yaml 文件

    image-20190723120753533

    • 点击 下一步

      默认选择所有的工作负载

    image-20190723120832778

    • 点击 下一步

      默认选择所有要导入的配置,example中没有使用到配置信息

    image-20190723120912377

    • 点击 下一步

      默认选择所有 Secrets

    image-20190723120926747

    • 点击 下一步

      填写表单:

    字段名称 填写内容 说明
    数据卷类型 db-example-storage NFS:容器组直连NFS
    存储卷声明:容器组使用存储卷声明
    是否新建存储卷声明 创建新存储卷声明 使用已有存储卷声明:可以使用事先创建好的存储卷声明
    创建新存储卷声明:可以创建新存储卷声明
    分配模式 动态分配
    读写模式 可被多节点读写 只能被单节点读写、可被多节点只读、可被多节点读写
    总量 2Gi 2Gi代表 2G空间

    image-20190723120956821

    • 点击 下一步

      填写表单:

    字段名称 填写内容 说明
    cloud-eureka域名 cloud-eureka.example.demo.eip.work 使用您自己的域名,
    在测试环境建议使用如下域名格式:
    workloadname.namespace-name.cluster-name.domain.com
    该域名应该解析到您worker节点的外网地址,或者worker 节点 80/443 端口对应负载均衡服务器的外网地址。
    web-example web-example.example.demo.eip

    image-20190723121019167

    • 点击 下一步

    image-20190723121035917

    • 点击 确定

    image-20190723121055648

    • 点击 应用

    image-20190723121117514

    • 点击 完成

    image-20190723121132991

    • 点击 已完成

      可再名称空间中查看到刚才导入的 example 的所有工作负载及存储卷声明

    image-20190723121433809

    验证 web-example

    • 点击工作负载 web-example

    image-20190723121412027

    • 点击 互联网入口中的域名 http://web-example.example.demo.eip.work

      Example 部署成功

    image-20190717193548703

    web-example容器的日志中会出现如下异常,错误原因是,example使用了一个监控套件,该监控套件要求将容器注册到monitor-eureka中,当下我们并没有安装该监控套件。此错误并不影响 example 程序的使用。暂时忽略该异常。

    [DiscoveryClient-InstanceInfoReplicator-0] WARN com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient - Request execution failed with message: java.net.UnknownHostException: monitor-eureka
    +    

    导入 example 微服务

    前提

    必须具备如下条件:

    • Kubernetes 集群 (安装在阿里云,本文将使用阿里云的 NFS 服务作为存储资源,Kuboard 也可以运行在其他云环境或者私有环境中。)
    • 已在集群中安装 Kuboard

    创建存储资源

    example中用到了存储卷声明,请在 Kuboard 中 创建存储类 ,否则不能完成 example 的导入操作。

    创建名称空间

    创建新的名称空间,用来导入 exmaple。可参考 创建名称空间

    假设您已经进入了 Kuboard 名称空间界面,如下图所示:

    image-20190723115721514

    导入 example

    在 Kuboard 中,您无需手写 yaml 文件,此 yaml 文件的内容生成步骤如下:

    • 通过 创建工作负载 完成微服务应用的部署
    • 通过 导出工作负载 将名称空间中的微服务配置导出到一个 yaml 文件中
    • 点击 导入工作负载 按钮

    image-20190723120730196

    • 点击 上传文件 按钮

      并选择刚才下载的 export_example.yaml 文件

    image-20190723120753533

    • 点击 下一步

      默认选择所有的工作负载

    image-20190723120832778

    • 点击 下一步

      默认选择所有要导入的配置,example中没有使用到配置信息

    image-20190723120912377

    • 点击 下一步

      默认选择所有 Secrets

    image-20190723120926747

    • 点击 下一步

      填写表单:

    字段名称 填写内容 说明
    数据卷类型 db-example-storage NFS:容器组直连NFS
    存储卷声明:容器组使用存储卷声明
    是否新建存储卷声明 创建新存储卷声明 使用已有存储卷声明:可以使用事先创建好的存储卷声明
    创建新存储卷声明:可以创建新存储卷声明
    分配模式 动态分配
    读写模式 可被多节点读写 只能被单节点读写、可被多节点只读、可被多节点读写
    总量 2Gi 2Gi代表 2G空间

    image-20190723120956821

    • 点击 下一步

      填写表单:

    字段名称 填写内容 说明
    cloud-eureka域名 cloud-eureka.example.demo.eip.work 使用您自己的域名,
    在测试环境建议使用如下域名格式:
    workloadname.namespace-name.cluster-name.domain.com
    该域名应该解析到您worker节点的外网地址,或者worker 节点 80/443 端口对应负载均衡服务器的外网地址。
    web-example web-example.example.demo.eip

    image-20190723121019167

    • 点击 下一步

    image-20190723121035917

    • 点击 确定

    image-20190723121055648

    • 点击 应用

    image-20190723121117514

    • 点击 完成

    image-20190723121132991

    • 点击 已完成

      可再名称空间中查看到刚才导入的 example 的所有工作负载及存储卷声明

    image-20190723121433809

    验证 web-example

    • 点击工作负载 web-example

    image-20190723121412027

    • 点击 互联网入口中的域名 http://web-example.example.demo.eip.work

      Example 部署成功

    image-20190717193548703

    web-example容器的日志中会出现如下异常,错误原因是,example使用了一个监控套件,该监控套件要求将容器注册到monitor-eureka中,当下我们并没有安装该监控套件。此错误并不影响 example 程序的使用。暂时忽略该异常。

    [DiscoveryClient-InstanceInfoReplicator-0] WARN com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient - Request execution failed with message: java.net.UnknownHostException: monitor-eureka
     [DiscoveryClient-InstanceInfoReplicator-0] WARN com.netflix.discovery.DiscoveryClient - DiscoveryClient_WEB-ADMIN/web-example-7f668c75db-j7ncx - registration failed Cannot execute request on any known server
     com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server
             at com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient.execute(RetryableEurekaHttpClient.java:112)
    @@ -52,7 +52,7 @@ com.netflix.discovery.shared.transport.TransportException: Cannot execute reques
               监控 example (alpha)
             
             →
    -      

    Copyright © 2019-present HuanQing Shao
    - +

    Copyright © 2019-present HuanQing Shao
    + diff --git a/docs/guide/example/monitor.html b/docs/guide/example/monitor.html index e66206c..b8e9195 100644 --- a/docs/guide/example/monitor.html +++ b/docs/guide/example/monitor.html @@ -5,13 +5,13 @@ 监控 example (alpha) | Kuboard - - - - + + + + -

    监控 example (alpha)

    前提

    必须具备如下条件:

    !> 监控套件相关的功能目前处于 alpha 状态,虽然在实际投产项目中取得了非常好的效果,但是产品化封装还需要进一步改进。

    假设您已进入 example 名称空间,如下图所示:

    image-20190723121433809

    安装监控套件

    安装全局监控套件

    • 在 master 节点执行
    kubectl -n kube-system create secret generic etcd-certs --from-file=/etc/kubernetes/pki/etcd/server.crt --from-file=/etc/kubernetes/pki/etcd/server.key
    +    

    监控 example (alpha)

    前提

    必须具备如下条件:

    !> 监控套件相关的功能目前处于 alpha 状态,虽然在实际投产项目中取得了非常好的效果,但是产品化封装还需要进一步改进。

    假设您已进入 example 名称空间,如下图所示:

    image-20190723121433809

    安装监控套件

    安装全局监控套件

    • 在 master 节点执行
    kubectl -n kube-system create secret generic etcd-certs --from-file=/etc/kubernetes/pki/etcd/server.crt --from-file=/etc/kubernetes/pki/etcd/server.key
     
    • 将鼠标移到 设置 菜单

    image-20190723150525017

    • 点击 监控套件 - example

    image-20190723150616633

    • 点击 全局监控套件 / 查找并安装

    image-20190723150853277

    • 点击 资源层监控套件 / 安装

    image-20190723151045112

    • 点击 全局监控套件 / 资源层监控套件 / 安装

    image-20190723151103353

    • 根据向导提示,完成工作负载的导入

    image-20190723151339137

    • 点击 资源层监控套件 / 初始化

      由于下载镜像需要时间,您可能需要等待5-10分钟后,才能成功执行初始化。初始化成功的话,您将看到如下提示信息。

    image-20190723151357262

    安装名称空间监控套件

    • 点击 名称空间监控套件 example / 查找并安装

    image-20190723151422460

    • 重复前述过程,安装监控套件

      重复前述过程,完成如下监控套件的安装和初始化:

      • Pinpoint 监控套件
      • Prometheus 监控套件
      • 熔断及限流 Sentinel

      安装完成后,界面如下图所示:

    image-20190723151711230

    查看监控套件的工作负载

    • 点击 后退

      回到名称空间后,可查看到刚才安装监控套件时导入的监控层工作负载。

      全局监控套件安装在 kube-system 名称空间

    image-20190723151804727

    重启 example 容器组

    • 点击导航栏中的 容器组列表

      在筛选条件中选择

      • 展现层
      • 网关层
      • 服务层
      • 持久层
      • 中间件

      并点击刷新

      • Kuboard 创建工作负载时,默认将其 imagePullPolicy 设置为 Always

      • 删除容器组时,Kubernetes 将为该工作负载启动一个新的容器组,以尽可能地使工作负载的容器组数量等于该工作负载期望的副本数(replicas);

      • Kubernetes 在启动容器组时,根据 imagePullPolicy 的设置 Always,将会尝试从镜像仓库抓取最新镜像,这一特性,可以用于开发环境和测试环境的版本更新,因为您的 devops 系统肯能不会为 daily build 生成新的镜像标签;

      • 此处删除容器组的目的是,重新启动容器,以便容器中的监控探针能够检测到其对应监控套件的存在。

    image-20190723151845303

    • 在列表中选择

      选中如下容器组:

      • cloud-eureka-0

      • db-example-xxxxxx-xxxx

      • gateway-example-xxxxxx-xxxx

      • svc-example-xxxxxx-xxxx

      • web-example-xxxxxx-xxxx

    image-20190723151902003

    • 点击 删除 按钮

    image-20190723151914994

    • 点击 确定

    image-20190723151932871

    • 点击 应用

    image-20190723151951910

    • 等待,直到容器组调整完成

    image-20190723152020605

    • 点击 后退

    image-20190723152040219

    查看监控信息

    查看资源层监控信息

    • 点击 展现层 / web-example

      如果您在下图中没有看到 Nginx 监控容器组监控 等,请刷新您的页面,因为监控套件初始化之后需要刷新页面才能加载并显示。

    image-20190723152124196

    • 点击 所在节点监控

      可查看所在节点的资源使用情况监控信息

    image-20190718104156232

    查看中间件层监控信息

    查看 Nginx 监控

    • 点击 Nginx 监控

    image-20190718104729472

    查看 MySQL 监控

    • 返回 example 名称空间
    • 点击 持久层 / example db
    • 点击 MySQL 监控

    image-20190718105420599

    查看 JVM 监控

    • 返回 example 名称空间
    • 点击 微服务层 / example
    • 点击 Java 虚拟机监控

    image-20190718105641651

    查看链路追踪监控信息

    • 微服务层 / example 中点击 链路追踪

    image-20190718120957255

    image-20190718121133160

    更新时间: 2019-07-25 06:22:52
    Copyright © 2019-present HuanQing Shao
    - +

    Copyright © 2019-present HuanQing Shao
    + diff --git a/docs/guide/index.html b/docs/guide/index.html index aa9f99d..df03067 100644 --- a/docs/guide/index.html +++ b/docs/guide/index.html @@ -5,17 +5,17 @@ 使用手册 | Kuboard - - - - + + + + -

    使用手册

    Kuboard 的设计目标

    • 降低 Kubernetes 学习门槛,让初学者先把 Kubernetes 用起来,再逐步理解 Kubernetes 中的各种概念
    • 提高 Kubernetes 运维的便捷性,让资深 Kubernetes 运维人员脱离 kubectl 命令行,直接在 Kuboard 界面中完成日常运维工作

    熟悉 Kuboard 的最佳途径

    Kuboard 可用于

    • 管理 Kubernetes 集群
    • 管理部署于 Kubernetes 的微服务
    • 诊断集群中的问题
    • 监控部署于 Kubernetes 的微服务
    更新时间: 2019-07-25 06:22:52
    Copyright © 2019-present HuanQing Shao
    + diff --git a/docs/guide/monitor/apis.html b/docs/guide/monitor/apis.html index 6c5e5a6..9daff95 100644 --- a/docs/guide/monitor/apis.html +++ b/docs/guide/monitor/apis.html @@ -5,17 +5,17 @@ 自定义监控套件 | Kuboard - - - - + + + + -

    自定义监控套件

    文档建设中...

    • 请参考 监控 example (alpha) 体验 Kuboard 在监控套件方面的设想
    • 监控套件以插件的形式整合到 Kuboard,在不使用监控套件的情况下,Kuboard 的所有功能都可正常工作
    更新时间: 2019-07-25 06:22:52
    Copyright © 2019-present HuanQing Shao
    + diff --git a/docs/guide/monitor/index.html b/docs/guide/monitor/index.html index 3a3b0b0..c6ce386 100644 --- a/docs/guide/monitor/index.html +++ b/docs/guide/monitor/index.html @@ -5,13 +5,13 @@ 监控套件 | Kuboard - - - - + + + + -

    监控套件

    文档建设中...

    • 请参考 监控 example (alpha) 体验 Kuboard 在监控套件方面的设想
    • 监控套件以插件的形式整合到 Kuboard,在不使用监控套件的情况下,Kuboard 的所有功能都可正常工作
    更新时间: 2019-07-25 06:22:52
    Copyright © 2019-present HuanQing Shao
    + diff --git a/docs/guide/namespace/adjustion.html b/docs/guide/namespace/adjustion.html index 83e7de0..4d0b407 100644 --- a/docs/guide/namespace/adjustion.html +++ b/docs/guide/namespace/adjustion.html @@ -5,13 +5,13 @@ 日常调整 | Kuboard - - - - + + + + -

    日常调整

    前提

    必须具备如下条件:

    • Kubernetes 集群

    • 已在集群中安装 Kuboard

    假设您一进入 example 名称空间页面,如下图所示:

    image-20190720232405147

    批量删除容器组

    批量删除容器组特别适用于 开发测试环境的版本更新 场景,描述如下:

    • 开发/测试环境中,开发人员提交代码
    • DevOps环境自动构建出 docker 镜像,并将 docker 镜像推送到仓库; +

      日常调整

      前提

      必须具备如下条件:

      • Kubernetes 集群

      • 已在集群中安装 Kuboard

      假设您一进入 example 名称空间页面,如下图所示:

      image-20190720232405147

      批量删除容器组

      批量删除容器组特别适用于 开发测试环境的版本更新 场景,描述如下:

      • 开发/测试环境中,开发人员提交代码
      • DevOps环境自动构建出 docker 镜像,并将 docker 镜像推送到仓库;
        • 如果您的 devops 环境只在生成新的 branch 或者 tag 时,生成镜像的新 version,那么原镜像标签的实际镜像已发生改变。
      • 从 Kubernetes 中删除该镜像的 容器组
      • Kubernetes 创建新的 容器组,并且该容器组重新从镜像仓库拉取最新的镜像

      在 Kuboard 中,批量删除容器组 的操作步骤为:

      • 在名称空间页面点击 容器组列表

        • 选择要筛选的应用分层,并点击刷新,

        • 选择要删除的容器组

        如下图所示:

      image-20190720233322837

      • 点击 删除 按钮

      image-20190720233348284

      • 点击 确定

      image-20190720233412812

      • 点击 应用

      image-20190720233436465

      • 点击 完成

        并等待,直到 kubernetes 完成对容器组的调整操作

        Kuboard 会自动监听 kubernetes 执行此调整操作时的变化,您无需刷新页面,只要等待结果即可。

      image-20190720233512996

      批量调整镜像版本

      批量调整镜像版本适用于如下场景:

      • 需要更新容器所使用的镜像的版本号

        通常是经过测试的版本,且 DevOps 环境在构建镜像时,为其生成了新的版本号

      批量调整镜像版本的操作如下:

      • 在名称空间页面点击 调整镜像版本

      image-20190721000526434

      • 在要调整的镜像上点击 修改

        并填写新的镜像版本号,如下图所示:

      image-20190721000759925

      • 点击 执行变更

      image-20190721000822458

      • 点击 应用

      image-20190721000847954

      • 点击 完成

        此时会进入容器组列表界面,请等待 Kubernetes 完成对容器组的调整(无需刷新页面)

      image-20190721000919933

      批量调整工作负载的副本数

      调整容器镜像版本 的功能界面中,也可以用来调整工作负载的副本数,如下图所示:

      image-20190721100715898

      更新时间: 2019-07-25 06:22:52
      Copyright © 2019-present HuanQing Shao
      - +

    Copyright © 2019-present HuanQing Shao
    + diff --git a/docs/guide/namespace/configMap.html b/docs/guide/namespace/configMap.html index 01bab4b..99d3408 100644 --- a/docs/guide/namespace/configMap.html +++ b/docs/guide/namespace/configMap.html @@ -5,13 +5,13 @@ 配置 | Kuboard - - - - + + + + -

    配置

    配置: Kubernetes ConfigMap

    查看配置列表

    假设您已进入名称空间界面,如下图所示:

    image-20190721110355464

    配置列表位于图中左侧中部,点击 放大 按钮,可以将列表显示到更大的区域,如下图所示:

    点击 配置 可以刷新该列表

    image-20190721112353077

    创建配置

    • 点击 配置 / 创建

      填写表单如下所示:

    字段名称 填写内容 说明
    名称 my-config-map
    配置标签 - 名称 my-config-map
    配置标签 - 内容 configmap
    配置数据 - 名称 EUREKA_URL
    配置数据 - 内容 http://cloud-eureka:9200/eureka

    image-20190721112624128

    • 点击 保存

      配置信息创建成功

    image-20190721113050608

    查看/编辑/删除 配置

    • 点击列表中的 my-config-map

    image-20190721113155991

    编辑、删除操作可直接按照提示完成

    更新时间: 2019-07-25 06:22:52
    Copyright © 2019-present HuanQing Shao
    + diff --git a/docs/guide/namespace/index.html b/docs/guide/namespace/index.html index ed0197c..b73c789 100644 --- a/docs/guide/namespace/index.html +++ b/docs/guide/namespace/index.html @@ -5,13 +5,13 @@ 应用管理 | Kuboard - - - - + + + + -

    应用管理

    创建工作负载

    删除工作负载

    伸缩

    升级工作负载版本

    环境迁移

    导出

    导入

    更新时间: 2019-07-25 06:22:52
    Copyright © 2019-present HuanQing Shao
    - +

    应用管理

    创建工作负载

    删除工作负载

    伸缩

    升级工作负载版本

    环境迁移

    导出

    导入

    更新时间: 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 8e842c9..5af1f36 100644 --- a/docs/guide/namespace/multi-env.html +++ b/docs/guide/namespace/multi-env.html @@ -5,13 +5,13 @@ 多环境 | Kuboard - - - - + + + + -

    多环境

    在实际开发项目的过程中,我们必然会碰到如下场景:

    1. 创建一个开发环境,并在其中完成应用部署
    2. 创建一个测试环境,再次完成应用部署
    3. 创建一个准上线环境,再次完成应用部署
    4. 创建一个生产环境,再次完成应用部署

    当我们的微服务系统较为复杂时,一个环境中可能需要部署许多(几十个甚至更多)的微服务部署单元,这个时候,重复在多套环境中执行部署任务就会变得容易出错。

    Kuboard 针对这种场景,提供了导出配置、导入配置的功能,以便运维人员可以轻易的复制多套部署环境。

    导出配置

    前提

    必须满足如下条件:

    部署微服务过程中,您还可能用到 kuboard 的配置编辑功能、Secrets 编辑功能 等。

    假设您已完成微服务部署,并已进入 namespace 界面,如下图所示:

    image-20190721085144545

    操作步骤

    • 点击 导出工作负载
      • 选择要导出的分层
      • 点击 刷新
      • 选择要导出的工作负载

    image-20190721090118542

    • 点击 下一步

      选择要导出的配置(configMap)信息

    image-20190721090753742

    • 点击 下一步

      选择要导出的 Secrets

    image-20190721090840925

    • 点击 下一步

    image-20190721090935511

    • 点击 确定

    image-20190721091005130

    • 查看已导出文件

      导出文件的命名格式为 kuboard_namespace_date_time.yaml,例如:

      kuboard_example_2019_07_21_09_09_47.yaml

      导出文件的内容如下所示:

      ---
      +    

      多环境

      在实际开发项目的过程中,我们必然会碰到如下场景:

      1. 创建一个开发环境,并在其中完成应用部署
      2. 创建一个测试环境,再次完成应用部署
      3. 创建一个准上线环境,再次完成应用部署
      4. 创建一个生产环境,再次完成应用部署

      当我们的微服务系统较为复杂时,一个环境中可能需要部署许多(几十个甚至更多)的微服务部署单元,这个时候,重复在多套环境中执行部署任务就会变得容易出错。

      Kuboard 针对这种场景,提供了导出配置、导入配置的功能,以便运维人员可以轻易的复制多套部署环境。

      导出配置

      前提

      必须满足如下条件:

      部署微服务过程中,您还可能用到 kuboard 的配置编辑功能、Secrets 编辑功能 等。

      假设您已完成微服务部署,并已进入 namespace 界面,如下图所示:

      image-20190721085144545

      操作步骤

      • 点击 导出工作负载
        • 选择要导出的分层
        • 点击 刷新
        • 选择要导出的工作负载

      image-20190721090118542

      • 点击 下一步

        选择要导出的配置(configMap)信息

      image-20190721090753742

      • 点击 下一步

        选择要导出的 Secrets

      image-20190721090840925

      • 点击 下一步

      image-20190721090935511

      • 点击 确定

      image-20190721091005130

      • 查看已导出文件

        导出文件的命名格式为 kuboard_namespace_date_time.yaml,例如:

        kuboard_example_2019_07_21_09_09_47.yaml

        导出文件的内容如下所示:

        ---
         apiVersion: apps/v1
         kind: StatefulSet
         metadata:
        @@ -41,7 +41,7 @@
                   集群事件
                 
                 →
        -      

        Copyright © 2019-present HuanQing Shao
      - +

      Copyright © 2019-present HuanQing Shao
    + diff --git a/docs/guide/namespace/pvc.html b/docs/guide/namespace/pvc.html index fb2a1da..e6d93f1 100644 --- a/docs/guide/namespace/pvc.html +++ b/docs/guide/namespace/pvc.html @@ -5,13 +5,13 @@ 存储卷声明 | Kuboard - - - - + + + + -

    存储卷声明

    存储卷声明: Kubernetes Persistent Volume Claim

    查看存储卷声明列表

    假设您已进入名称空间界面,如下图所示:

    image-20190721110355464

    存储卷声明列表位于图中左下角,点击 放大 按钮,可以将列表显示到更大的区域,如下图所示:

    点击 存储卷声明 可以刷新该列表

    image-20190721113708689

    创建存储卷声明

    • 点击 存储卷声明 / 创建

      填写表单如下:

    字段名称 填写内容 说明
    存储卷声明 my-pvc
    存储类 cluster-storage 如果不存在,则需要提前 创建存储类
    分配模式 动态分配
    读写模式 可被多节点读写
    总量 2Gi

    image-20190721113810235

    • 点击 保存

      存储卷声明创建成功

    image-20190721114112644

    查看/编辑/删除 存储卷声明

    • 点击 my-pvc

    image-20190721114211751

    编辑、删除操作可直接按照提示完成

    更新时间: 2019-07-25 06:22:52
    Copyright © 2019-present HuanQing Shao
    + diff --git a/docs/guide/namespace/secrets.html b/docs/guide/namespace/secrets.html index 3699bcb..34cab91 100644 --- a/docs/guide/namespace/secrets.html +++ b/docs/guide/namespace/secrets.html @@ -5,13 +5,13 @@ Secrets | Kuboard - - - - + + + + -

    Secrets

    查看 Secrets 列表

    假设您已进入名称空间界面,如下图所示:

    image-20190721110355464

    Secrets 列表位于图中左上角,点击 放大 按钮,可以将列表显示到更大的区域,如下图所示:

    点击 Secrets 可以刷新该列表

    image-20190721110543437

    创建 Secrets

    • 点击 Secrets / 创建

      填写表单如下:

    字段名称 填写内容 说明
    名称 my-docker-repository Secrets的名称
    类型 docker仓库密码
    docker server https://my-docker-repository.com 请填写 docker 仓库的全路径
    docker username my-docker-user
    docker password mypassword

    image-20190721111011798

    当前 Kuboard 支持如下类型 Secrets 的创建:

    • docker仓库密码
    • 当您的镜像存储在私有仓库时,您在创建工作负载时可能需要配置 imagePullSecrets 用来访问镜像仓库
    • Opaque
    • 密码
    • TLS
    • 当您为 Ingress 启用 HTTPS 时,您需要将域名的的 TLS 证书存入 Secrets
    • 点击保存

      Secrets 创建成功,如下图所示:

    image-20190721111540512

    查看/编辑/删除 Secrets

    • 点击 my-docker-repository

    image-20190721111642221

    编辑、删除操作可直接按照提示完成

    更新时间: 2019-07-25 06:22:52
    Copyright © 2019-present HuanQing Shao
    + diff --git a/docs/guide/namespace/workload.html b/docs/guide/namespace/workload.html index 32180e0..ac030ab 100644 --- a/docs/guide/namespace/workload.html +++ b/docs/guide/namespace/workload.html @@ -5,13 +5,13 @@ 工作负载 | Kuboard - - - - + + + + -

    工作负载

    创建/查看/编辑工作负载

    请参考 创建 busybox

    伸缩

    伸缩操作,通过调整工作负载的 replicas 大小,来控制该工作负载运行容器组的数量。

    • 假设您已进入工作负载查看界面,如下图所示:

    image-20190722223454676

    • 点击 伸缩 按钮

      填写表单

      副本数: 目标容器组数量

    image-20190722223551308

    • 点击 确定 按钮

      等待,知道伸缩操作执行完毕。

    image-20190722223605920

    删除容器组

    • 点击 删除容器组 按钮

      可删除该容器组。

      • 容器组被删除之后,Kubernetes Workload Controller 将要重新创建一个容器组,用于替代被删除的容器组;被删除容器组原有的状态将丢失,新容器组重新从 镜像中加载启动;

      • Kuboard 的工作负载编辑器,默认将容器组的 imagePullPolicy 设置为 Alwarys,因此,每次在容器组启动的时候,Kubenetes 都会尝试从镜像仓库中抓取最新镜像;

    image-20190722231246540

    诊断问题

    在诊断工作负载的问题时,Kuboard主要提供三种手段:

    事件: Kubernetes 部署相关问题

    如下图所示,图中提示

    错误内容:Error: ErrImagePull 该容器组抓取镜像失败

    失败原因:pull access denied for busy-box, repository does not exist or may require 'docker login'

    对于这样的错误,需要技术人员检查:

    • 容器所在节点与镜像仓库之间的网络连通性
    • 容器镜像拼写是否正确
    • 如果为私有仓库,是否在工作负载编辑器中正确配置了 docker 仓库用户名密码

    !> Kuboard 监听了 Kubernetes 集群的事件变化,您无需刷新页面,即可在工作负载编辑器的容器组界面区域看到该容器相关的最新事件。

    通过 Kubernetes 事件所指示出来的问题,通常是集群本身配置的问题,或者是创建工作负载时的参数填写问题,解决这样的问题需要的是 Kubernetes 集群相关的知识和背景,通常运维人员可以独立解决此类问题

    image-20190722224029397

    日志: 容器运行时产生的错误

    如下图所示,假设您已进入工作负载查看界面:

    image-20190722225347491

    • 点击其中的 日志 按钮

    可查看该容器的运行时日志,如下图所示:

    image-20190722225454029

    容器运行时问题定位及解决

    日志所指示出来的错误,可能有两类原因:

    • 将其容器部署到 Kubernetes 时,参数配置填写错误
    • 容器内应用程序自身的 BUG

    无论是上述何种原因,运维人员如果请开发人员介入,一起排查这里问题,效果会好很多。

    终端: 通过交互式命令,在容器内诊断问题

    • 点击 终端 按钮

      可进入该容器的交互式命令界面

    image-20190722230511430

    适用场景

    在交互式终端里,运维人员可以:

    • 通过 ping / curl 等命令,测试网络连通性,测试 Kubernetes 的服务 DNS 解析是否正确
    • 通过 export 命令检查该容器的环境变量的设置是否正确

    开发人员 可以:

    • 通过 ls / cat / vi 等命令,查看该容器是否包含了最新的代码变更
    • 通过 vi 等命令,临时对容器中的配置文件进行修改,并在验证这种修改有效之后,才将其正式更新到代码库
    更新时间: 2019-07-25 06:22:52
    Copyright © 2019-present HuanQing Shao
    + diff --git a/docs/index.html b/docs/index.html index c6ff0ea..7707c1f 100644 --- a/docs/index.html +++ b/docs/index.html @@ -5,10 +5,10 @@ Kuboard - - - - + + + +

    Kuboard

    @@ -17,7 +17,7 @@ 在线体验 查看文档 →

    降低 Kubernetes 门槛

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

    直观显示微服务架构

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

    上下文关联监控

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

    - +
    + diff --git a/docs/install/index.html b/docs/install/index.html index 2506973..ec99e3e 100644 --- a/docs/install/index.html +++ b/docs/install/index.html @@ -5,17 +5,17 @@ 概述 | Kuboard - - - - + + + + -

    概述

    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
    Copyright © 2019-present HuanQing Shao
    + diff --git a/docs/install/install-common-ingress.html b/docs/install/install-common-ingress.html index c988384..0482f25 100644 --- a/docs/install/install-common-ingress.html +++ b/docs/install/install-common-ingress.html @@ -5,15 +5,15 @@ 安装 Ingress Controller | Kuboard - - - - + + + + -

    安装 Ingress Controller

    ingress官方文档:https://kubernetes.io/docs/concepts/services-networking/ingress/

    Ingress Controllers官网介绍:https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/

    本文中使用如下部署方式:https://kubernetes.github.io/ingress-nginx/deploy/baremetal/#using-a-self-provisioned-edge

    kubernetes支持多种Ingress Controllers,本文推荐使用

    https://github.com/nginxinc/kubernetes-ingress

    在 apple-master-a-1 上执行

    su - gitlab-runner
    +    

    安装 Ingress Controller

    ingress官方文档:https://kubernetes.io/docs/concepts/services-networking/ingress/

    Ingress Controllers官网介绍:https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/

    本文中使用如下部署方式:https://kubernetes.github.io/ingress-nginx/deploy/baremetal/#using-a-self-provisioned-edge

    kubernetes支持多种Ingress Controllers,本文推荐使用

    https://github.com/nginxinc/kubernetes-ingress

    在 apple-master-a-1 上执行

    su - gitlab-runner
     kubectl apply -f https://raw.githubusercontent.com/eip-work/eip-monitor-repository/master/dashboard/nginx-ingress.yaml
    -

    在IaaS云控制台完成如下配置(公网ELB

    创建负载均衡 ELB:

    ​ 监听器 1:80 / TCP, SOURCE_ADDRESS 会话保持

    ​ 服务器资源池 1: apple-worker-x-x 的所有节点的 80端口

    ​ 监听器 2:443 / TCP, SOURCE_ADDRESS 会话保持

    ​ 服务器资源池 2: apple-worker-x-x 的所有节点的443端口

    假设刚创建的负载均衡 ELB 的 IP 地址为: z.z.z.z

    配置域名解析

    将域名 *.apple.yourdomain.com 解析到地址负载均衡服务器 的 IP 地址 z.z.z.z

    验证配置

    在浏览器访问 a.apple.yourdomain.com,将得到 404 NotFound 错误页面

    更新时间: 2019-07-25 06:22:52
    Copyright © 2019-present HuanQing Shao
    - +

    在IaaS云控制台完成如下配置(公网ELB

    创建负载均衡 ELB:

    ​ 监听器 1:80 / TCP, SOURCE_ADDRESS 会话保持

    ​ 服务器资源池 1: apple-worker-x-x 的所有节点的 80端口

    ​ 监听器 2:443 / TCP, SOURCE_ADDRESS 会话保持

    ​ 服务器资源池 2: apple-worker-x-x 的所有节点的443端口

    假设刚创建的负载均衡 ELB 的 IP 地址为: z.z.z.z

    配置域名解析

    将域名 *.apple.yourdomain.com 解析到地址负载均衡服务器 的 IP 地址 z.z.z.z

    验证配置

    在浏览器访问 a.apple.yourdomain.com,将得到 404 NotFound 错误页面

    更新时间: 2019-07-25 06:22:52
    Copyright © 2019-present HuanQing Shao
    + diff --git a/docs/install/install-common-vm.html b/docs/install/install-common-vm.html index 76d2757..f7c3935 100644 --- a/docs/install/install-common-vm.html +++ b/docs/install/install-common-vm.html @@ -5,13 +5,13 @@ 制作标准机镜像 | Kuboard - - - - + + + + -

    制作标准机镜像

    通过使用标准机镜像,可以

    • 避免重复执行对测试机安装必要软件的过程
    • 以一种相对标准化的过程管理测试机的维护

    标准机镜像中预装了如下内容:

    • docker
    • gitlab-runner
    • kubernetes images

    本文档描述的安装过程已基于 centos 7.6 验证

    标准机镜像的制作过程描述如下:

    安装docker

    卸载旧版本

    sudo yum remove docker \
    +    

    制作标准机镜像

    通过使用标准机镜像,可以

    • 避免重复执行对测试机安装必要软件的过程
    • 以一种相对标准化的过程管理测试机的维护

    标准机镜像中预装了如下内容:

    • docker
    • gitlab-runner
    • kubernetes images

    本文档描述的安装过程已基于 centos 7.6 验证

    标准机镜像的制作过程描述如下:

    安装docker

    卸载旧版本

    sudo yum remove docker \
     	docker-client \
     	docker-client-latest \
     	docker-common \
    @@ -69,7 +69,7 @@ docker tag 8328bb49b652 k8s.gcr.io/kube-controller-manager:v1.15.0
     docker tag da86e6ba6ca1 k8s.gcr.io/pause:3.1
     docker tag eb516548c180 k8s.gcr.io/coredns:1.3.1
     docker tag 2c4adeb21b4f k8s.gcr.io/etcd:3.3.10
    -

    制作镜像

    请参考阿里云基于ECS 制作虚拟机镜像 的文档

    更新时间: 2019-07-25 06:22:52
    Copyright © 2019-present HuanQing Shao
    - +

    制作镜像

    请参考阿里云基于ECS 制作虚拟机镜像 的文档

    更新时间: 2019-07-25 06:22:52
    Copyright © 2019-present HuanQing Shao
    + diff --git a/docs/install/install-dashboard.html b/docs/install/install-dashboard.html index 89f37f1..726b0a7 100644 --- a/docs/install/install-dashboard.html +++ b/docs/install/install-dashboard.html @@ -5,35 +5,19 @@ 安装 kuboard | Kuboard - - - - + + + + -

    安装 kuboard

    前提

    安装 kuboard 时,假设您已经:

    • 已经有一个 kubernetes 集群
    • 拥有对该 kubernetes 集群执行 kubectl 命令时的所有权限

    如果没有 kubernetes 集群,可以有如下选项:

    领取阿里云最高2000元红包

    兼容性

    Kubernetes 版本 Kuboard 版本 兼容性 说明
    v1.15 v1.0.0-beta.10 😄 已验证
    v1.14 v1.0.0-beta.10 😄 已验证
    v1.13 v1.0.0-beta.10 😄 已验证
    v1.12 v1.0.0-beta.10 😐 Kubernetes Api 尚不支持 dryRun,
    忽略Kuboard在执行命令式的参数校验错误,可正常工作
    v1.11 v1.0.0-beta.10 😐 同上

    Kubernetes 安装方式

    • 部分用户使用二进制包的形式安装 Kubernetes,Kuboard 现在的版本不能在这类 Kubernetes 集群中正常工作,作者正在解决此问题。
    • 如果您是使用 kubeadm 安装的 Kubernetes 集群(Kubernetes 官方推荐的安装方式),请放心使用 Kuboard。
    • Kubeadm 相关资料请参考 https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/

    安装

    获取并修改yaml文件

    wget https://raw.githubusercontent.com/eip-work/eip-monitor-repository/master/dashboard/kuboard.yaml
    +    

    安装 kuboard

    前提

    安装 kuboard 时,假设您已经:

    • 已经有一个 kubernetes 集群
    • 拥有对该 kubernetes 集群执行 kubectl 命令时的所有权限

    如果没有 kubernetes 集群,可以有如下选项:

    领取阿里云最高2000元红包

    兼容性

    Kubernetes 版本 Kuboard 版本 兼容性 说明
    v1.15 v1.0.0-beta.10 😄 已验证
    v1.14 v1.0.0-beta.10 😄 已验证
    v1.13 v1.0.0-beta.10 😄 已验证
    v1.12 v1.0.0-beta.10 😐 Kubernetes Api v1.12 尚不支持 dryRun,
    忽略Kuboard在执行命令时的参数校验错误,可正常工作
    v1.11 v1.0.0-beta.10 😐 同上

    Kubernetes 安装方式

    • 部分用户使用二进制包的形式安装 Kubernetes,Kuboard 现在的版本不能在这类 Kubernetes 集群中正常工作,作者正在解决此问题。
    • 如果您是使用 kubeadm 安装的 Kubernetes 集群(Kubernetes 官方推荐的安装方式),请放心使用 Kuboard。
    • Kubeadm 相关资料请参考 https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/

    安装

    获取并修改yaml文件

    wget https://raw.githubusercontent.com/eip-work/eip-monitor-repository/master/dashboard/kuboard.yaml
     

    修改文件 kuboard.yaml 中 Ingress 的 host 为 kuboard.yourclustername.yourdomain.com

    执行安装

    kubectl apply -f kuboard.yaml 
    -

    获取 token

    获取管理员用户 token

    拥有的权限

    此Token拥有 ClusterAdmin 的权限,可以执行所有操作

    kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep kuboard-user | awk '{print $1}')   
    -

    执行完该命令后,可获得类似如下的输出:

    Name: admin-user-token-g8hxb
    -Namespace: kube-system
    -Labels: <none>
    -Annotations: [kubernetes.io/service-account.name](http://kubernetes.io/service-account.name): kuboard-user
    -[kubernetes.io/service-account.uid](http://kubernetes.io/service-account.uid): 948bb5e6-8cdc-11e9-b67e-fa163e5f7a0f
    -
    -Type: [kubernetes.io/service-account-token](http://kubernetes.io/service-account-token)
    -
    -Data
    -====
    -ca.crt: 1025 bytes
    -namespace: 11 bytes
    -token: eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLWc4aHhiIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiI5NDhiYjVlNi04Y2RjLTExZTktYjY3ZS1mYTE2M2U1ZjdhMGYiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06YWRtaW4tdXNlciJ9.DZ6dMTr8GExo5IH_vCWdB_MDfQaNognjfZKl0E5VW8vUFMVvALwo0BS-6Qsqpfxrlz87oE9yGVCpBYV0D00811bLhHIg-IR_MiBneadcqdQ_TGm_a0Pz0RbIzqJlRPiyMSxk1eXhmayfPn01upPdVCQj6D3vAY77dpcGplu3p5wE6vsNWAvrQ2d_V1KhR03IB1jJZkYwrI8FHCq_5YuzkPfHsgZ9MBQgH-jqqNXs6r8aoUZIbLsYcMHkin2vzRsMy_tjMCI9yXGiOqI-E5efTb-_KbDVwV5cbdqEIegdtYZ2J3mlrFQlmPGYTwFI8Ba9LleSYbCi4o0k74568KcN_w
    -

    获取只读用户的Token

    拥有的权限

    • view 可查看名称空间的内容
    • system:node 可查看节点信息
    • system:persistent-volume-provisioner 可查看存储类和存储卷声明的信息

    适用场景

    只读用户不能对集群的配置执行修改操作,非常适用于将开发环境中的 kuboard 只读权限分发给开发者,以便开发者可以便捷地诊断问题

    执行如下命令可以获得 只读用户 的 Token

    kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep kuboard-viewer | awk '{print $1}')   
    -

    访问 Kuboard

    通过域名访问

    在浏览器打开链接 http://kuboard.yourclustername.yourdomain.com (使用前面已修改的域名)

    输入前一步骤中获得的 token,可进入控制台界面

    通过 NodePort 访问

    kuboard Service 使用了 NodePort 的方式暴露服务,NodePort 为 32567;您可以按如下方式访问 kuboard

    http://any-of-your-node-ip:32567/
    -

    您也可以修改 kuboard.yaml 文件,使用自己定义的 NodePort 端口号

    更新时间: 2019-07-25 14:09:59

    获取 token

    您可以获得管理员用户、只读用户的Token

    访问 Kuboard

    您可以通过NodePort、Port-forward、域名三种方式访问 Kuboard

    更新时间: 2019-07-25 14:09:59
    Copyright © 2019-present HuanQing Shao
    - +

    Copyright © 2019-present HuanQing Shao
    + diff --git a/docs/install/install-k8s.html b/docs/install/install-k8s.html index 85a8fbf..458b466 100644 --- a/docs/install/install-k8s.html +++ b/docs/install/install-k8s.html @@ -5,13 +5,13 @@ 安装 Kubernetes 用于测试 | Kuboard - - - - + + + + -

    安装 Kubernetes 用于测试

    如果您想拥有一个供个人学习测试使用的 kubernetes 集群,推荐的做法是在阿里云采购如下配置:

    • 3台 2核4G 的ECS(突发性能实例 t5 ecs.t5-c1m2.large,或同等配置)
    • 100G EFS

    Kuboard 的在线 demo 环境使用的是如下拓扑结构,本文档描述了如何在阿里云完成该 demo 环境的搭建。(推荐阿里云是因为,阿里云是当下技术爱好者最容易接触到的云环境,拥有一个3节点 Kubernetes 集群,每天的成本不超过12元,且,停机状态下不收费,非常适合于技术爱好者学习时使用。)

    领取阿里云最高2000元红包

    Kuboard 在线体验 +

    安装 Kubernetes 用于测试

    如果您想拥有一个供个人学习测试使用的 kubernetes 集群,推荐的做法是在阿里云采购如下配置:

    • 3台 2核4G 的ECS(突发性能实例 t5 ecs.t5-c1m2.large,或同等配置)
    • 100G EFS

    Kuboard 的在线 demo 环境使用的是如下拓扑结构,本文档描述了如何在阿里云完成该 demo 环境的搭建。(推荐阿里云是因为,阿里云是当下技术爱好者最容易接触到的云环境,拥有一个3节点 Kubernetes 集群,每天的成本不超过12元,且,停机状态下不收费,非常适合于技术爱好者学习时使用。)

    领取阿里云最高2000元红包

    Kuboard 在线体验 为保证环境的稳定性,在线 Demo 中只提供只读权限。(请在PC浏览器中打开)

    image-20190718175957160

    制作标准机镜像

    通过使用标准机镜像,可以

    • 避免重复执行对测试机安装必要软件的过程
    • 以一种相对标准化的过程管理测试机的维护

    标准机镜像中预装了如下内容:

    • docker
    • gitlab-runner
    • kubernetes images

    本文档描述的安装过程已基于 centos 7.6 验证

    标准机镜像的制作过程描述如下:

    安装docker

    卸载旧版本

    sudo yum remove docker \
     	docker-client \
     	docker-client-latest \
    @@ -100,7 +100,7 @@ kubeadm join apiserver.demo:6443 --token mpf
               安装 Kubernetes
             
             →
    -      

    Copyright © 2019-present HuanQing Shao
    - +

    Copyright © 2019-present HuanQing Shao
    + diff --git a/docs/install/install-kind.html b/docs/install/install-kind.html index 9b42305..828bcae 100644 --- a/docs/install/install-kind.html +++ b/docs/install/install-kind.html @@ -5,13 +5,13 @@ 在单机使用 kind 安装 Kubernetes | Kuboard - - - - + + + + -

    在单机使用 kind 安装 Kubernetes

    本文旨在通过使用 kind 搭建本地 k8s 集群环境,为技术爱好者提供快速上手 Kuboard 的基本实践方式。

    环境简介

    本地搭建 k8s 集群需要 kind 工具及 docker 环境。

    建议硬件配置:2核 cpu,8G 内存

    ps: 以下均为在 Linux 平台实践,其他平台可参考文章中链接。

    kind 简介与安装

    kind:https://kind.sigs.k8s.io/ 是一个使用 Docker 容器运行本地 Kubernetes 集群的工具。 +

    在单机使用 kind 安装 Kubernetes

    本文旨在通过使用 kind 搭建本地 k8s 集群环境,为技术爱好者提供快速上手 Kuboard 的基本实践方式。

    环境简介

    本地搭建 k8s 集群需要 kind 工具及 docker 环境。

    建议硬件配置:2核 cpu,8G 内存

    ps: 以下均为在 Linux 平台实践,其他平台可参考文章中链接。

    kind 简介与安装

    kind:https://kind.sigs.k8s.io/ 是一个使用 Docker 容器运行本地 Kubernetes 集群的工具。 ps:本文使用kind V0.4.0

    安装:

    • linux:

      curl -Lo ./kind-linux-amd64 https://github.com/kubernetes-sigs/kind/releases/download/v0.4.0/kind-linux-amd64
       chmod +x ./kind-linux-amd64
       mv ./kind-linux-amd64 /usr/local/bin/kind
      @@ -36,7 +36,7 @@ sudo mv ./kubectl /usr/local/bin/kubectl
       

      查看启动状态

      kubectl get pods -n kube-system --watch
       

      等待 kuboard 启动成功

      访问 kuboard 页面

      待启动成功后,需要做 80 端口转发,通过浏览器访问 kuboard

      kubectl port-forward service/kuboard 9080:80 -n kube-system
       

      获取登录 token

      kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep kuboard-user | awk '{print $1}')   
      -

      1563698644736

      浏览器中访问 http://localhost:9080

      1563698714557

      将获取的 token 复制到浏览器中,访问成功

      1563698865448

    更新时间: 2019-07-25 06:22:52
    Copyright © 2019-present HuanQing Shao
    - +

    1563698644736

    浏览器中访问 http://localhost:9080

    1563698714557

    将获取的 token 复制到浏览器中,访问成功

    1563698865448

    更新时间: 2019-07-25 06:22:52
    Copyright © 2019-present HuanQing Shao
    + diff --git a/docs/install/install-kubernetes.html b/docs/install/install-kubernetes.html index 44afe85..22d15b5 100644 --- a/docs/install/install-kubernetes.html +++ b/docs/install/install-kubernetes.html @@ -5,13 +5,13 @@ 安装 Kubernetes | Kuboard - - - - + + + + -

    安装 Kubernetes

    介绍

    kubernetes 安装有多种选择,本文档描述的集群安装具备如下特点:

    • 使用 kubernetes 1.15.0
    • 三个 master 组成主节点集群,通过内网 loader balancer 实现负载均衡
    • 多个 worker 组成工作节点集群,通过外网 loader balancer 实现负载均衡
    • 使用 calico 作为网络插件
    • 使用 nginx-ingress 作为 kubernetes ingress controller

    领取阿里云最高2000元红包

    下图为 kubernetes 安装的拓扑图

    image-20190713075717350

    • 标准机用于制作 centos 镜像,该镜像预先安装了 docker / kubelet / kubectl / kubeadm, 并预先下载了 kubernetes 所需的 docker image
    • 跳板机用于通过 ssh 端口访问标准机、master 节点、worker 节点的 shell,如果您所使用的环境中,可以直接访问各节点的 shell,也可以无需跳板机
    • NAT y.y.y.y将 apiserver 的6443端口映射到外网,如果您始终只在 master 节点上执行 kubectl 命令,则无需做此映射
    • Load Balancer z.z.z.z 是 kubernetes 的 Ingress 外网映射,通常是必须的

    安装步骤

    制作标准机镜像

    通过使用标准机镜像,可以

    • 避免重复执行对测试机安装必要软件的过程
    • 以一种相对标准化的过程管理测试机的维护

    标准机镜像中预装了如下内容:

    • docker
    • gitlab-runner
    • kubernetes images

    本文档描述的安装过程已基于 centos 7.6 验证

    标准机镜像的制作过程描述如下:

    安装docker

    卸载旧版本

    sudo yum remove docker \
    +    

    安装 Kubernetes

    介绍

    kubernetes 安装有多种选择,本文档描述的集群安装具备如下特点:

    • 使用 kubernetes 1.15.0
    • 三个 master 组成主节点集群,通过内网 loader balancer 实现负载均衡
    • 多个 worker 组成工作节点集群,通过外网 loader balancer 实现负载均衡
    • 使用 calico 作为网络插件
    • 使用 nginx-ingress 作为 kubernetes ingress controller

    领取阿里云最高2000元红包

    下图为 kubernetes 安装的拓扑图

    image-20190713075717350

    • 标准机用于制作 centos 镜像,该镜像预先安装了 docker / kubelet / kubectl / kubeadm, 并预先下载了 kubernetes 所需的 docker image
    • 跳板机用于通过 ssh 端口访问标准机、master 节点、worker 节点的 shell,如果您所使用的环境中,可以直接访问各节点的 shell,也可以无需跳板机
    • NAT y.y.y.y将 apiserver 的6443端口映射到外网,如果您始终只在 master 节点上执行 kubectl 命令,则无需做此映射
    • Load Balancer z.z.z.z 是 kubernetes 的 Ingress 外网映射,通常是必须的

    安装步骤

    制作标准机镜像

    通过使用标准机镜像,可以

    • 避免重复执行对测试机安装必要软件的过程
    • 以一种相对标准化的过程管理测试机的维护

    标准机镜像中预装了如下内容:

    • docker
    • gitlab-runner
    • kubernetes images

    本文档描述的安装过程已基于 centos 7.6 验证

    标准机镜像的制作过程描述如下:

    安装docker

    卸载旧版本

    sudo yum remove docker \
     	docker-client \
     	docker-client-latest \
     	docker-common \
    @@ -118,7 +118,7 @@ kubectl apply -f https://raw.githubusercontent.com/eip-work/eip-monitor-reposito
               安装 kuboard
             
             →
    -      

    Copyright © 2019-present HuanQing Shao
    - +

    Copyright © 2019-present HuanQing Shao
    + diff --git a/docs/overview/concepts.html b/docs/overview/concepts.html index beb4491..8e20b22 100644 --- a/docs/overview/concepts.html +++ b/docs/overview/concepts.html @@ -5,13 +5,13 @@ 如何降低K8S学习门槛 🎉 | Kuboard - - - - + + + + -

    如何降低K8S学习门槛 🎉

    Kubernetes 学习门槛在哪儿

    学习 Kubernetes 之前,必须具备的知识储备:

    • Linux 基础
    • 网络基础
    • 容器技术,例如 https://www.docker.com/

    学习 Kubernetes 的过程中可能碰到的难关:

    • 理解 Kubenetes 为了实现容器编排而提出的各种抽象概念以及他们之间的关系:容器组(Pod)、存储卷(Volume)、存储卷声明(PVC)、Ingress、Service 等
    • 安装及配置 Kubernetes 环境
    • 编写和维护 Kubernetes Yaml 文件
    • 熟悉 kubectl 命令行工具中常用的 10 多个命令

    降低 Kubernetes 学习门槛

    Kuboard 为初学者学习 Kubernetes 时设计了如下学习路径:

    后续使用 Kuboard 进行 Kubernetes 运维时,学习者、使用者除了在极少数场景下需要依赖 kubectl 命令之外,完全可以使用 Kuboard 完成日常运维任务。

    日常的 Kubernetes 运维过程中,为了排查问题,您可能需要:

    • 使用 kubectl port-forward 命令实现 端口转发(已在 Kuboard 开发计划中)
    • 使用 kubectl cp 命令向容器中复制文件(极低频场景)

    本文后续章节介绍了 Kuboard 工作负载编辑器的设计,如果您能够大致理解当中的概念,说明您已经完全准备好了,可以开始自己的 Kubernetes 之旅。

    工作负载编辑器设计

    ​ 在向 Kubernetes 集群部署应用时,开发者或者运维团队必须花大量的时间去理解 Kubernetes 中各种对象的概念,并编写 Yaml 文件去描述 Kubernetes 对象以及他们之间的关系,然而,不同的人因为经验、视角的不同,对Kubernetes 中各对象之间关系的理解并不完全一致,也因此产生了一系列问题:

    • 由于理解的不到位,刚入门Kubernetes的技术人员在使用 Kubernetes 部署应用时经常性地受挫;
    • 由于理解方式的不一致,不同技术人员编写的 yaml 文件结构各不一样,降低了部署在后期的可维护性;
    • 由于部署数量的增加,导致 YAML 文件的数量和代码行数不断增长;

    ​ Kubernetes 官方提供的 Kubernetes Dashboard 充分意识到了 Kubernete 对象类型在种类上的多样性以及关系上的复杂性,到目前为止并没有在全功能 Dashboard 上做出过多努力,尤其是没有付出过多努力去打造工作负载的 UI 编辑器。在 Kubernetes Dashboard 中,如果想要对 Service、Deployment、StatefulSet、ConfigMap 等各种 Kubernetes 对象执行新增或者变更操作时,您必须编写 YAML 文件。从这个意义上来讲,截止到作者写这篇文章的时间点,Kubernetes 的官方 Dashboard 仍然是一个 “只读” 型 Dashboard,几乎所有的运维操作仍然需要技术人员去编写和维护冗长的 YAML 文件,并通过 kubectl 命令来完成。

    ​ 由于 Kubernetes YAML 文件复杂性,以及开发/运维团队在多环境复制(开发环境、测试环境、准上线环境、生产环境等)方面的普遍需求,Kubernetes 社区提出了各种各样的解决方案,例如 kustomize / helm chart 等,这些解决方案在解决一个问题的同时,又在另一方面增加了复杂度,为 Kubernetes 爱好者增加了新的学习门槛。

    ​ Kuboard 与 Kubernetes Dashboard 相同的是,架构上的简洁性。尤其是,使用 Kuboard 并不需要我们去学习和理解新的概念,而是和 Kuboard 一起,将 Kubernetes 对象中各种复杂的概念和关系梳理清楚,将各种知识点条理化,清晰化。在 Kuboard 的辅助下,轻松掌握 Kubernetes 的使用和运维,并利用 Kuboard 完成 Kubernetes 的日常运维工作。

    工作负载编辑器介绍

    ​ 为了降低 Kubernetes 的学习难度和使用难度,Kuboard 尝试对 Kubernetes 中管理的各种对象做了一个梳理,并以此为基础,设计了 Kuboard 工作负载编辑器。

    ​ Kuboard 工作负载编辑器以下图的方式理解和管理 Kubernetes 对象。

    image-20190722165648180

    上图中各概念与 Kuboard 工作负载编辑器界面的映射关系如下:

    image-20190722162249531

    1. 基本信息

    基本信息对应到 Kubernetes 的 Workload Controller,当前 Kuboard 工作负载编辑器已经支持了使用频率最高的几类 Workload Controller :

    • Deployment
    • StatefulSet
    • DaemonSet

    除此之外,Kubernetes 还有如下几类 Controller:

    • ReplicaSet (Kubernetes 官方推荐使用 Deployment 而不是 ReplicaSet)
    • ReplicationController (Kubernetes 官方推荐使用 Deployment 而不是 ReplicationController)
    • Garbage Collection
    • TTL controller For Finished Resources
    • Jobs
    • Cron Job

    Kuboard 未来将陆续支持 Garbage Collection,TTL Controller,Jobs 和 Cron Job。

    Kubernetes Workload Controller 主要用于:

    • 根据容器组模板的定义,创建和管理多个容器组
    • 处理容器组的复制和上线
    • 在集群范围内提供自修复能力

    例如:Workload Controller 起初在节点 A 上创建并运行了一个容器组 pod_a,当节点 A 出现故障不能正常工作时,Workload Controller 可以自动地在其他可用的节点上运行一个完全相同的容器组实例 pod_a' 以替代 pod_a。

    不同类型的 Workload Controller 在处理容器组时,会有各自不同的行为。

    请参考 https://kubernetes.io/docs/concepts/workloads/pods/pod-overview/#pods-and-controllers

    基本信息编辑器的界面如下图所示:

    image-20190722172356943

    字段名称 字段描述
    服务类型 即工作负载类型,
    当前支持: Deployment、StatefulSet、DaemonSet
    服务分层 决定了 Kuboard 将该工作负载展示在哪一个分层,同时,也确定了该工作负载名称的前缀,可选项有:
    * 展现层 web、网关层 gateway、服务层 svc、持久层 db、中间件层 cloud、监控层 monitor;
    * 默认层当前不可选择
    标签 用于确定 Service 的 labelSelector、Controller 的 labels、容器组的 labels
    服务描述 展示在 Kuboard 界面上的一段描述信息
    副本数量 对于 Deployment 和 StatefulSet 可以填写,决定了该控制器应该维持的容器组副本的数量

    2. 数据卷

    ​ 容器每次启动时,从镜像中初始化所有文件,后续对文件系统的修改、新增、删除操作的结果都是不能持久化的。当容器崩溃时, kubelet 重启该容器,但是原容器已经做的修改将丢失,因为每次启动容器,都是从镜像中初始化;此外,多个容器运行在同一个容器组中时,通常伴随着在不同容器之间共享文件的需求。

    ​ Kubernetes的抽象出了数据卷 Volume 的概念,以解决上述的问题。

    Kuboard 目前支持如下类型的数据卷:

    • NFS
    • 存储卷声明
    • emptyDir
    • 配置 ConfigMap
    • Secrets

    Kubernetes 支持的数据卷类型,请参考:https://kubernetes.io/docs/concepts/storage/volumes/#types-of-volumes

    Kuboard 认为当前支持的数据卷类型已经满足绝大多数应用场景,目前正在添加对更多类型数据卷的支持。

    ​ 容器组中的不同容器都可以通过挂载点引用该容器组加载的数据卷。Kuboard 工作负载编辑中,使用如下界面定义数据卷:

    image-20190722182005060

    字段名称 说明
    数据卷名称 如图中的 example-dataempty-dir
    数据卷类型
    数据卷详细信息 不同类型的数据卷需要填写的信息不尽相同,例如
    存储卷声明,需要选择事先已经在名称空间中创建好的存储卷声明
    NFS,需要填写 NFS Server 的地址,以及 NFS Path

    3. 身份信息

    身份信息区域主要为容器组定义两类信息:

    • imagePullSecrets,容器组调用镜像仓库接口抓取镜像时所使用的用户名密码。如果您使用了私有镜像仓库,您需要在此指定镜像仓库的用户名密码;如果您使用 docker 公共仓库,则无需填写 imagePullSecrets
    • ServiceAccount,容器组调用 kubernetes apiserver 时,所使用的身份信息

    Kuboard 工作负载编辑器中关于身份信息的编辑界面如下所示:

    image-20190722183329825

    4. 容器

    容器是我们真正应用程序镜像被加载和运行的地方,按照 Kubernetes 的设计,一个容器组 Pod 中可以包含多个容器 Container,这些容器被分为两类:

    • 初始化容器 +

      如何降低K8S学习门槛 🎉

      Kubernetes 学习门槛在哪儿

      学习 Kubernetes 之前,必须具备的知识储备:

      • Linux 基础
      • 网络基础
      • 容器技术,例如 https://www.docker.com/

      学习 Kubernetes 的过程中可能碰到的难关:

      • 理解 Kubenetes 为了实现容器编排而提出的各种抽象概念以及他们之间的关系:容器组(Pod)、存储卷(Volume)、存储卷声明(PVC)、Ingress、Service 等
      • 安装及配置 Kubernetes 环境
      • 编写和维护 Kubernetes Yaml 文件
      • 熟悉 kubectl 命令行工具中常用的 10 多个命令

      降低 Kubernetes 学习门槛

      Kuboard 为初学者学习 Kubernetes 时设计了如下学习路径:

      后续使用 Kuboard 进行 Kubernetes 运维时,学习者、使用者除了在极少数场景下需要依赖 kubectl 命令之外,完全可以使用 Kuboard 完成日常运维任务。

      日常的 Kubernetes 运维过程中,为了排查问题,您可能需要:

      • 使用 kubectl port-forward 命令实现 端口转发(已在 Kuboard 开发计划中)
      • 使用 kubectl cp 命令向容器中复制文件(极低频场景)

      本文后续章节介绍了 Kuboard 工作负载编辑器的设计,如果您能够大致理解当中的概念,说明您已经完全准备好了,可以开始自己的 Kubernetes 之旅。

      工作负载编辑器设计

      ​ 在向 Kubernetes 集群部署应用时,开发者或者运维团队必须花大量的时间去理解 Kubernetes 中各种对象的概念,并编写 Yaml 文件去描述 Kubernetes 对象以及他们之间的关系,然而,不同的人因为经验、视角的不同,对Kubernetes 中各对象之间关系的理解并不完全一致,也因此产生了一系列问题:

      • 由于理解的不到位,刚入门Kubernetes的技术人员在使用 Kubernetes 部署应用时经常性地受挫;
      • 由于理解方式的不一致,不同技术人员编写的 yaml 文件结构各不一样,降低了部署在后期的可维护性;
      • 由于部署数量的增加,导致 YAML 文件的数量和代码行数不断增长;

      ​ Kubernetes 官方提供的 Kubernetes Dashboard 充分意识到了 Kubernete 对象类型在种类上的多样性以及关系上的复杂性,到目前为止并没有在全功能 Dashboard 上做出过多努力,尤其是没有付出过多努力去打造工作负载的 UI 编辑器。在 Kubernetes Dashboard 中,如果想要对 Service、Deployment、StatefulSet、ConfigMap 等各种 Kubernetes 对象执行新增或者变更操作时,您必须编写 YAML 文件。从这个意义上来讲,截止到作者写这篇文章的时间点,Kubernetes 的官方 Dashboard 仍然是一个 “只读” 型 Dashboard,几乎所有的运维操作仍然需要技术人员去编写和维护冗长的 YAML 文件,并通过 kubectl 命令来完成。

      ​ 由于 Kubernetes YAML 文件复杂性,以及开发/运维团队在多环境复制(开发环境、测试环境、准上线环境、生产环境等)方面的普遍需求,Kubernetes 社区提出了各种各样的解决方案,例如 kustomize / helm chart 等,这些解决方案在解决一个问题的同时,又在另一方面增加了复杂度,为 Kubernetes 爱好者增加了新的学习门槛。

      ​ Kuboard 与 Kubernetes Dashboard 相同的是,架构上的简洁性。尤其是,使用 Kuboard 并不需要我们去学习和理解新的概念,而是和 Kuboard 一起,将 Kubernetes 对象中各种复杂的概念和关系梳理清楚,将各种知识点条理化,清晰化。在 Kuboard 的辅助下,轻松掌握 Kubernetes 的使用和运维,并利用 Kuboard 完成 Kubernetes 的日常运维工作。

      工作负载编辑器介绍

      ​ 为了降低 Kubernetes 的学习难度和使用难度,Kuboard 尝试对 Kubernetes 中管理的各种对象做了一个梳理,并以此为基础,设计了 Kuboard 工作负载编辑器。

      ​ Kuboard 工作负载编辑器以下图的方式理解和管理 Kubernetes 对象。

      image-20190722165648180

      上图中各概念与 Kuboard 工作负载编辑器界面的映射关系如下:

      image-20190722162249531

      1. 基本信息

      基本信息对应到 Kubernetes 的 Workload Controller,当前 Kuboard 工作负载编辑器已经支持了使用频率最高的几类 Workload Controller :

      • Deployment
      • StatefulSet
      • DaemonSet

      除此之外,Kubernetes 还有如下几类 Controller:

      • ReplicaSet (Kubernetes 官方推荐使用 Deployment 而不是 ReplicaSet)
      • ReplicationController (Kubernetes 官方推荐使用 Deployment 而不是 ReplicationController)
      • Garbage Collection
      • TTL controller For Finished Resources
      • Jobs
      • Cron Job

      Kuboard 未来将陆续支持 Garbage Collection,TTL Controller,Jobs 和 Cron Job。

      Kubernetes Workload Controller 主要用于:

      • 根据容器组模板的定义,创建和管理多个容器组
      • 处理容器组的复制和上线
      • 在集群范围内提供自修复能力

      例如:Workload Controller 起初在节点 A 上创建并运行了一个容器组 pod_a,当节点 A 出现故障不能正常工作时,Workload Controller 可以自动地在其他可用的节点上运行一个完全相同的容器组实例 pod_a' 以替代 pod_a。

      不同类型的 Workload Controller 在处理容器组时,会有各自不同的行为。

      请参考 https://kubernetes.io/docs/concepts/workloads/pods/pod-overview/#pods-and-controllers

      基本信息编辑器的界面如下图所示:

      image-20190722172356943

      字段名称 字段描述
      服务类型 即工作负载类型,
      当前支持: Deployment、StatefulSet、DaemonSet
      服务分层 决定了 Kuboard 将该工作负载展示在哪一个分层,同时,也确定了该工作负载名称的前缀,可选项有:
      * 展现层 web、网关层 gateway、服务层 svc、持久层 db、中间件层 cloud、监控层 monitor;
      * 默认层当前不可选择
      标签 用于确定 Service 的 labelSelector、Controller 的 labels、容器组的 labels
      服务描述 展示在 Kuboard 界面上的一段描述信息
      副本数量 对于 Deployment 和 StatefulSet 可以填写,决定了该控制器应该维持的容器组副本的数量

      2. 数据卷

      ​ 容器每次启动时,从镜像中初始化所有文件,后续对文件系统的修改、新增、删除操作的结果都是不能持久化的。当容器崩溃时, kubelet 重启该容器,但是原容器已经做的修改将丢失,因为每次启动容器,都是从镜像中初始化;此外,多个容器运行在同一个容器组中时,通常伴随着在不同容器之间共享文件的需求。

      ​ Kubernetes的抽象出了数据卷 Volume 的概念,以解决上述的问题。

      Kuboard 目前支持如下类型的数据卷:

      • NFS
      • 存储卷声明
      • emptyDir
      • 配置 ConfigMap
      • Secrets

      Kubernetes 支持的数据卷类型,请参考:https://kubernetes.io/docs/concepts/storage/volumes/#types-of-volumes

      Kuboard 认为当前支持的数据卷类型已经满足绝大多数应用场景,目前正在添加对更多类型数据卷的支持。

      ​ 容器组中的不同容器都可以通过挂载点引用该容器组加载的数据卷。Kuboard 工作负载编辑中,使用如下界面定义数据卷:

      image-20190722182005060

      字段名称 说明
      数据卷名称 如图中的 example-dataempty-dir
      数据卷类型
      数据卷详细信息 不同类型的数据卷需要填写的信息不尽相同,例如
      存储卷声明,需要选择事先已经在名称空间中创建好的存储卷声明
      NFS,需要填写 NFS Server 的地址,以及 NFS Path

      3. 身份信息

      身份信息区域主要为容器组定义两类信息:

      • imagePullSecrets,容器组调用镜像仓库接口抓取镜像时所使用的用户名密码。如果您使用了私有镜像仓库,您需要在此指定镜像仓库的用户名密码;如果您使用 docker 公共仓库,则无需填写 imagePullSecrets
      • ServiceAccount,容器组调用 kubernetes apiserver 时,所使用的身份信息

      Kuboard 工作负载编辑器中关于身份信息的编辑界面如下所示:

      image-20190722183329825

      4. 容器

      容器是我们真正应用程序镜像被加载和运行的地方,按照 Kubernetes 的设计,一个容器组 Pod 中可以包含多个容器 Container,这些容器被分为两类:

      • 初始化容器
        • 初始化容器总是执行后结束执行
        • 初始化容器按其定义的顺序执行,前一个初始化容器执行结束后,才开始后一个初始化容器的执行
        • 只有初始化容器执行成功后,容器组才启动工作容器
        • 请参考 https://kubernetes.io/docs/concepts/workloads/pods/init-containers/
      • 工作容器
        • 容器组可以包含一个或多个工作容器
        • https://kubernetes.io/docs/concepts/workloads/pods/pod-overview

      Kuborad中,定义容器的界面如下图所示:

      image-20190722183750444

      image-20190722184516447

      5. 访问方式

      ​ 访问方式,即 Kubernetes Service。

      请参考: https://kubernetes.io/docs/concepts/services-networking/service/

      ​ Kuboard 中,支持 ClusterIP(集群内访问) 以及 NodePort(VPC 内访问) 两种 Service 访问方式,您也可以不为该工作负载定义 Service 访问方式。访问方式的界面如下所示:

      image-20190722184943431

      6. 互联网入口

      ​ 互联网入口,即 Kubernetes Ingress。

      请参考: https://kubernetes.io/docs/concepts/services-networking/ingress/

      ​ Kuboard 并不限定您使用何种类型的 Ingress Controller, 但是 安装 Kubernetes 用于测试 文档中,推荐使用的 Ingress Controller 是 Nginx-Ingress

      ​ 在您使用 Nginx-Ingress 的情况下,要想确保您能按照互联网入口中定义的域名访问您的服务,请确保以下两点:

      • 域名解析指向 Kubernetes 集群中 Worker 节点对应的负载均衡的 IP 地址
        • 如果是测试环境,也可以只指向其中一台 Worker 节点的 IP 地址
      • 通过该域名,可以访问 Worker 节点的 80 端口 @@ -19,7 +19,7 @@ ←

      Copyright © 2019-present HuanQing Shao
      - +

    Copyright © 2019-present HuanQing Shao
    + diff --git a/docs/overview/index.html b/docs/overview/index.html index c283430..c8b8e3a 100644 --- a/docs/overview/index.html +++ b/docs/overview/index.html @@ -5,18 +5,18 @@ Kuboard | Kuboard - - - - + + + + -

    Kuboard

    A cool Kubernetes dashboard.

    Kuboard 可以有效降低 Kubernetes 初学者的学习门槛,对于有经验的用户,也是非常顺手的一款运维工具。已在多个项目中投产使用。

    Kuboard 的主要特点:

    • 场景化设计
    • 微服务分层显示
    • 微服务上下文监控

    image-20190716234146419

    Demo

    Kuboard 在线体验 +

    Kuboard

    A cool Kubernetes dashboard.

    Kuboard 可以有效降低 Kubernetes 初学者的学习门槛,对于有经验的用户,也是非常顺手的一款运维工具。已在多个项目中投产使用。

    Kuboard 的主要特点:

    • 场景化设计
    • 微服务分层显示
    • 微服务上下文监控

    image-20190716234146419

    Demo

    Kuboard 在线体验 为保证环境的稳定性,在线 Demo 中只提供只读权限。(请在PC浏览器中打开)

    Getting Started

    如何降低K8S学习门槛(必读)

    安装

    使用

    在线提问

    Kuboard 兴趣群二维码

    更新时间: 2019-07-25 06:22:52
    Copyright © 2019-present HuanQing Shao
    - +

    Copyright © 2019-present HuanQing Shao
    + diff --git a/docs/overview/why-kuboard.html b/docs/overview/why-kuboard.html index 803d2e1..c384f66 100644 --- a/docs/overview/why-kuboard.html +++ b/docs/overview/why-kuboard.html @@ -5,13 +5,13 @@ 为什么选择 Kuboard | Kuboard - - - - + + + + -

    为什么选择 Kuboard

    Kubernetes 已然是当下容器编排领域事实上的标准,各大云服务商都急于推出 Kubernetes 服务,互联网公司也纷纷跟进,将自己的应用容器化,并使用 Kubernetes 编排。

    在 Kubernetes 图形化工具方面,我们已经获得了极大的可选择空间:

    • 各云服务商自己推出的 Kubernetes 服务所搭载的管理控制台,例如 阿里云的 Kubernetes 服务,青云推出的 KubeSphere,其他云服务商的 CaaS 类服务
    • Kubernetes 官方的图形管理界面 Kubernetes Dashboard
    • 面向企业私有化部署的 Rancher

    什么场景下更适合选择 Kuboard 呢?

    Kubernetes 入门学习者

    ​ Kuboard类似于 Kubernetes Dashboard,是一款轻量级产品,按照 Kuboard 的文档,您可以很快地搭建一套学习 Kubernetes 用的集群环境,您也可以在自己已经有的集群上轻易地完成 Kuboard 的安装。

    ​ 对于 K8S 入门学习者来说,看了那么多 Kubernetes 文章,了解了许多的跟 apiserver、etcd、pod、container、service、ingress、storage class等各种概念,都不如比不上自己动手搭一套 K8S 环境,并在其上部署一套微服务应用的效果好。Kuboard 完全采用场景化的设计,操作过程更适合人们的思考方式。例如,集群概览的展示方式、名称空间的展示方式。

    集群概览

    在 Kuboard 中,集群概览的展现形式如下:

    ​ 计算资源、存储资源并列在集群概览的下层,上层则是运行于计算资源与存储资源上的名称空间(应用)。

    集群概览

    名称空间

    在 Kuboard 中,名称空间的展示形式如下:

    ​ 以微服务参考分层架构的形式,将所有的微服务分为如下几层:

    • 展现层 +

      为什么选择 Kuboard

      Kubernetes 已然是当下容器编排领域事实上的标准,各大云服务商都急于推出 Kubernetes 服务,互联网公司也纷纷跟进,将自己的应用容器化,并使用 Kubernetes 编排。

      在 Kubernetes 图形化工具方面,我们已经获得了极大的可选择空间:

      • 各云服务商自己推出的 Kubernetes 服务所搭载的管理控制台,例如 阿里云的 Kubernetes 服务,青云推出的 KubeSphere,其他云服务商的 CaaS 类服务
      • Kubernetes 官方的图形管理界面 Kubernetes Dashboard
      • 面向企业私有化部署的 Rancher

      什么场景下更适合选择 Kuboard 呢?

      Kubernetes 入门学习者

      ​ Kuboard类似于 Kubernetes Dashboard,是一款轻量级产品,按照 Kuboard 的文档,您可以很快地搭建一套学习 Kubernetes 用的集群环境,您也可以在自己已经有的集群上轻易地完成 Kuboard 的安装。

      ​ 对于 K8S 入门学习者来说,看了那么多 Kubernetes 文章,了解了许多的跟 apiserver、etcd、pod、container、service、ingress、storage class等各种概念,都不如比不上自己动手搭一套 K8S 环境,并在其上部署一套微服务应用的效果好。Kuboard 完全采用场景化的设计,操作过程更适合人们的思考方式。例如,集群概览的展示方式、名称空间的展示方式。

      集群概览

      在 Kuboard 中,集群概览的展现形式如下:

      ​ 计算资源、存储资源并列在集群概览的下层,上层则是运行于计算资源与存储资源上的名称空间(应用)。

      集群概览

      名称空间

      在 Kuboard 中,名称空间的展示形式如下:

      ​ 以微服务参考分层架构的形式,将所有的微服务分为如下几层:

      • 展现层
        • 终端用户访问的 Web 应用
      • API网关层
        • Spring Cloud Gateway / Zuul /Kong 等接口网关
      • 微服务层
        • Spring Boot 微服务,或 PHP / Python 实现的微服务
      • 持久层 @@ -25,7 +25,7 @@ 如何降低K8S学习门槛 🎉 → -

      Copyright © 2019-present HuanQing Shao
      - +

    Copyright © 2019-present HuanQing Shao
    + diff --git a/docs/support/index.html b/docs/support/index.html index 9e79de7..9e34a92 100644 --- a/docs/support/index.html +++ b/docs/support/index.html @@ -5,13 +5,13 @@ 提交问题 | Kuboard - - - - + + + + -

    提交问题

    提交 BUG 后,通常会在第二天得到 Kuboard 作者的答复。

    在线提问

    QQ 群

    kuboard_qq

    更新时间: 2019-07-25 06:22:52
    Copyright © 2019-present HuanQing Shao
    - +

    提交问题

    提交 BUG 后,通常会在第二天得到 Kuboard 作者的答复。

    在线提问

    QQ 群

    kuboard_qq

    更新时间: 2019-07-25 06:22:52
    Copyright © 2019-present HuanQing Shao
    + diff --git a/install/install-dashboard.md b/install/install-dashboard.md index a9701ae..aeda90f 100644 --- a/install/install-dashboard.md +++ b/install/install-dashboard.md @@ -26,7 +26,7 @@ | v1.15 | v1.0.0-beta.10 | 😄 | 已验证 | | v1.14 | v1.0.0-beta.10 | 😄 | 已验证 | | v1.13 | v1.0.0-beta.10 | 😄 | 已验证 | -| v1.12 | v1.0.0-beta.10 | 😐 | Kubernetes Api 尚不支持 dryRun,
    忽略Kuboard在执行命令式的参数校验错误,可正常工作 | +| v1.12 | v1.0.0-beta.10 | 😐 | Kubernetes Api v1.12 尚不支持 dryRun,
    忽略Kuboard在执行命令时的参数校验错误,可正常工作 | | v1.11 | v1.0.0-beta.10 | 😐 | 同上 | @@ -58,19 +58,26 @@ kubectl apply -f kuboard.yaml ## 获取 token -### 获取管理员用户 token +您可以获得管理员用户、只读用户的Token + +:::: tabs type:border-card + +::: tab 管理员用户 lazy **拥有的权限** -此Token拥有 ClusterAdmin 的权限,可以执行所有操作 +* 此Token拥有 ClusterAdmin 的权限,可以执行所有操作 + +**执行命令** ```bash kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep kuboard-user | awk '{print $1}') ``` -执行完该命令后,可获得类似如下的输出: +**输出** -``` +取输出信息中 token 字段 +```{13} Name: admin-user-token-g8hxb Namespace: kube-system Labels: @@ -86,8 +93,10 @@ namespace: 11 bytes token: eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLWc4aHhiIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiI5NDhiYjVlNi04Y2RjLTExZTktYjY3ZS1mYTE2M2U1ZjdhMGYiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06YWRtaW4tdXNlciJ9.DZ6dMTr8GExo5IH_vCWdB_MDfQaNognjfZKl0E5VW8vUFMVvALwo0BS-6Qsqpfxrlz87oE9yGVCpBYV0D00811bLhHIg-IR_MiBneadcqdQ_TGm_a0Pz0RbIzqJlRPiyMSxk1eXhmayfPn01upPdVCQj6D3vAY77dpcGplu3p5wE6vsNWAvrQ2d_V1KhR03IB1jJZkYwrI8FHCq_5YuzkPfHsgZ9MBQgH-jqqNXs6r8aoUZIbLsYcMHkin2vzRsMy_tjMCI9yXGiOqI-E5efTb-_KbDVwV5cbdqEIegdtYZ2J3mlrFQlmPGYTwFI8Ba9LleSYbCi4o0k74568KcN_w ``` +::: -### 获取只读用户的Token + +::: tab 只读用户 lazy **拥有的权限** @@ -99,31 +108,95 @@ token: eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2Nv 只读用户不能对集群的配置执行修改操作,非常适用于将开发环境中的 kuboard 只读权限分发给开发者,以便开发者可以便捷地诊断问题 +**执行命令** + 执行如下命令可以获得 只读用户 的 Token ```bash kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep kuboard-viewer | awk '{print $1}') ``` +**输出** + +取输出信息中 token 字段 +```{13} +Name: admin-user-token-g8hxb +Namespace: kube-system +Labels: +Annotations: [kubernetes.io/service-account.name](http://kubernetes.io/service-account.name): kuboard-viewer +[kubernetes.io/service-account.uid](http://kubernetes.io/service-account.uid): 948bb5e6-8cdc-11e9-b67e-fa163e5f7a0f + +Type: [kubernetes.io/service-account-token](http://kubernetes.io/service-account-token) + +Data +==== +ca.crt: 1025 bytes +namespace: 11 bytes +token: eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLWc4aHhiIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiI5NDhiYjVlNi04Y2RjLTExZTktYjY3ZS1mYTE2M2U1ZjdhMGYiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06YWRtaW4tdXNlciJ9.DZ6dMTr8GExo5IH_vCWdB_MDfQaNognjfZKl0E5VW8vUFMVvALwo0BS-6Qsqpfxrlz87oE9yGVCpBYV0D00811bLhHIg-IR_MiBneadcqdQ_TGm_a0Pz0RbIzqJlRPiyMSxk1eXhmayfPn01upPdVCQj6D3vAY77dpcGplu3p5wE6vsNWAvrQ2d_V1KhR03IB1jJZkYwrI8FHCq_5YuzkPfHsgZ9MBQgH-jqqNXs6r8aoUZIbLsYcMHkin2vzRsMy_tjMCI9yXGiOqI-E5efTb-_KbDVwV5cbdqEIegdtYZ2J3mlrFQlmPGYTwFI8Ba9LleSYbCi4o0k74568KcN_w +``` + +::: +:::: ## 访问 Kuboard -### 通过域名访问 +您可以通过NodePort、Port-forward、域名三种方式访问 Kuboard -在浏览器打开链接 http://kuboard.yourclustername.yourdomain.com (使用前面已修改的域名) +:::: tabs type:border-card + +::: tab 通过NodePort访问 lazy + +kuboard Service 使用了 NodePort 的方式暴露服务,NodePort 为 32567;您可以按如下方式访问 kuboard。(可以使用集群中任意节点的 IP 地址) + +` +http://any-of-your-node-ip:32567/ +` 输入前一步骤中获得的 token,可进入控制台界面 -### 通过 NodePort 访问 +::: tip +您也可以修改 kuboard.yaml 文件,使用自己定义的 NodePort 端口号 -kuboard Service 使用了 NodePort 的方式暴露服务,NodePort 为 32567;您可以按如下方式访问 kuboard -``` -http://any-of-your-node-ip:32567/ +::: + +::: tab 通过port-forward访问 lazy + +在您的客户端电脑中执行如下命令 + +```sh +kubectl port-forward service/kuboard 8080:80 -n kube-system ``` -> 您也可以修改 kuboard.yaml 文件,使用自己定义的 NodePort 端口号 +在浏览器打开链接 (请使用 kubectl 所在机器的IP地址) + +`http://localhost:8080` + +::: tip +需要您自行设定 kubectl 的配置 + + +::: + +::: tab 通过域名访问 lazy + +在浏览器打开链接 (请使用前面已修改的域名) + +`http://kuboard.yourclustername.yourdomain.com` + + +输入前一步骤中获得的 token,可进入控制台界面 + +::: tip +需要您 +* 正确安装 Ingress Controller +* 将您所使用的域名指向 Kubernetes 中的一个 Worker 节点(或者Ingress Controller所在机器的IP,不同类型的Ingress Controller配置不同) + +::: + +:::: + diff --git a/package-lock.json b/package-lock.json index c814f95..718a1da 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1580,6 +1580,16 @@ "integrity": "sha1-aALmJk79GMeQobDVF/DyYnvyyUo=", "dev": true }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npm.taobao.org/are-we-there-yet/download/are-we-there-yet-1.1.5.tgz", + "integrity": "sha1-SzXClE8GKov82mZBB2A1D+nd/CE=", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npm.taobao.org/argparse/download/argparse-1.0.10.tgz", @@ -1607,6 +1617,12 @@ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", "dev": true }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/array-find-index/download/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, "array-flatten": { "version": "2.1.2", "resolved": "https://registry.npm.taobao.org/array-flatten/download/array-flatten-2.1.2.tgz", @@ -1705,6 +1721,12 @@ "integrity": "sha1-tyfb+H12UWAvBvTUrDh/R9kbDL8=", "dev": true }, + "async-foreach": { + "version": "0.1.3", + "resolved": "https://registry.npm.taobao.org/async-foreach/download/async-foreach-0.1.3.tgz", + "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", + "dev": true + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npm.taobao.org/asynckit/download/asynckit-0.4.0.tgz", @@ -1881,6 +1903,15 @@ "integrity": "sha1-WYr+VHVbKGilMw0q/51Ou1Mgm2U=", "dev": true }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npm.taobao.org/block-stream/download/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "dev": true, + "requires": { + "inherits": "~2.0.0" + } + }, "bluebird": { "version": "3.5.5", "resolved": "https://registry.npm.taobao.org/bluebird/download/bluebird-3.5.5.tgz", @@ -2233,6 +2264,24 @@ "integrity": "sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA=", "dev": true }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/camelcase-keys/download/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + } + } + }, "caniuse-api": { "version": "3.0.0", "resolved": "https://registry.npm.taobao.org/caniuse-api/download/caniuse-api-3.0.0.tgz", @@ -2399,6 +2448,18 @@ } } }, + "clone-deep": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/clone-deep/download/clone-deep-2.0.2.tgz", + "integrity": "sha1-ANs6Hhc2VnMNEYjD1qztbX6pdxM=", + "dev": true, + "requires": { + "for-own": "^1.0.0", + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.0", + "shallow-clone": "^1.0.0" + } + }, "coa": { "version": "2.0.2", "resolved": "https://registry.npm.taobao.org/coa/download/coa-2.0.2.tgz", @@ -2568,6 +2629,12 @@ "date-now": "^0.1.4" } }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/console-control-strings/download/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true + }, "consolidate": { "version": "0.15.1", "resolved": "https://registry.npm.taobao.org/consolidate/download/consolidate-0.15.1.tgz", @@ -3000,6 +3067,15 @@ } } }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npm.taobao.org/currently-unhandled/download/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "^1.0.1" + } + }, "cyclist": { "version": "0.2.2", "resolved": "https://registry.npm.taobao.org/cyclist/download/cyclist-0.2.2.tgz", @@ -3177,6 +3253,12 @@ "dev": true, "optional": true }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/delegates/download/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true + }, "depd": { "version": "1.1.2", "resolved": "https://registry.npm.taobao.org/depd/download/depd-1.1.2.tgz", @@ -3993,6 +4075,15 @@ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", "dev": true }, + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/for-own/download/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, "foreach": { "version": "2.0.5", "resolved": "https://registry.npm.taobao.org/foreach/download/foreach-2.0.5.tgz", @@ -4624,18 +4715,83 @@ } } }, + "fstream": { + "version": "1.0.12", + "resolved": "https://registry.npm.taobao.org/fstream/download/fstream-1.0.12.tgz", + "integrity": "sha1-Touo7i1Ivk99DeUFRVVI6uWTIEU=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npm.taobao.org/function-bind/download/function-bind-1.1.1.tgz", "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=", "dev": true }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npm.taobao.org/gauge/download/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "gaze": { + "version": "1.1.3", + "resolved": "https://registry.npm.taobao.org/gaze/download/gaze-1.1.3.tgz", + "integrity": "sha1-xEFzPhO5J6yMD/C0w7Az8ogSkko=", + "dev": true, + "requires": { + "globule": "^1.0.0" + } + }, "get-caller-file": { "version": "1.0.3", "resolved": "https://registry.npm.taobao.org/get-caller-file/download/get-caller-file-1.0.3.tgz", "integrity": "sha1-+Xj6TJDR3+f/LWvtoqUV5xO9z0o=", "dev": true }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/get-stdin/download/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, "get-stream": { "version": "4.1.0", "resolved": "https://registry.npm.taobao.org/get-stream/download/get-stream-4.1.0.tgz", @@ -4733,6 +4889,17 @@ "slash": "^2.0.0" } }, + "globule": { + "version": "1.2.1", + "resolved": "https://registry.npm.taobao.org/globule/download/globule-1.2.1.tgz", + "integrity": "sha1-Xf+xsZHyLSB5epNptJ6rTpg5aW0=", + "dev": true, + "requires": { + "glob": "~7.1.1", + "lodash": "~4.17.10", + "minimatch": "~3.0.2" + } + }, "good-listener": { "version": "1.2.2", "resolved": "https://registry.npm.taobao.org/good-listener/download/good-listener-1.2.2.tgz", @@ -4813,6 +4980,12 @@ "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", "dev": true }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/has-unicode/download/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true + }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npm.taobao.org/has-value/download/has-value-1.0.0.tgz", @@ -4912,6 +5085,12 @@ } } }, + "hosted-git-info": { + "version": "2.7.1", + "resolved": "https://registry.npm.taobao.org/hosted-git-info/download/hosted-git-info-2.7.1.tgz", + "integrity": "sha1-l/I2l3vW4SVAiTD/bePuxigewEc=", + "dev": true + }, "hpack.js": { "version": "2.1.6", "resolved": "https://registry.npm.taobao.org/hpack.js/download/hpack.js-2.1.6.tgz", @@ -5161,6 +5340,21 @@ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, + "in-publish": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/in-publish/download/in-publish-2.0.0.tgz", + "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=", + "dev": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/indent-string/download/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, "indexes-of": { "version": "1.0.1", "resolved": "https://registry.npm.taobao.org/indexes-of/download/indexes-of-1.0.1.tgz", @@ -5356,6 +5550,15 @@ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/is-finite/download/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz", @@ -5481,6 +5684,12 @@ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npm.taobao.org/is-utf8/download/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npm.taobao.org/is-windows/download/is-windows-1.0.2.tgz", @@ -5523,6 +5732,12 @@ "integrity": "sha1-FC0RHzpuPa6PSpr9d9RYVbWpzOM=", "dev": true }, + "js-base64": { + "version": "2.5.1", + "resolved": "https://registry.npm.taobao.org/js-base64/download/js-base64-2.5.1.tgz", + "integrity": "sha1-Hvo57yxfeYC7F4St5KivLeMpESE=", + "dev": true + }, "js-levenshtein": { "version": "1.1.6", "resolved": "https://registry.npm.taobao.org/js-levenshtein/download/js-levenshtein-1.1.6.tgz", @@ -5657,6 +5872,36 @@ "uc.micro": "^1.0.1" } }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/load-json-file/download/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "dependencies": { + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npm.taobao.org/parse-json/download/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, "load-script": { "version": "1.0.0", "resolved": "https://registry.npm.taobao.org/load-script/download/load-script-1.0.0.tgz", @@ -5737,6 +5982,12 @@ "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", "dev": true }, + "lodash.tail": { + "version": "4.1.1", + "resolved": "https://registry.npm.taobao.org/lodash.tail/download/lodash.tail-4.1.1.tgz", + "integrity": "sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=", + "dev": true + }, "lodash.template": { "version": "4.5.0", "resolved": "https://registry.npm.taobao.org/lodash.template/download/lodash.template-4.5.0.tgz?cache=0&sync_timestamp=1562735319590&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flodash.template%2Fdownload%2Flodash.template-4.5.0.tgz", @@ -5783,6 +6034,16 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npm.taobao.org/loud-rejection/download/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, "lower-case": { "version": "1.1.4", "resolved": "https://registry.npm.taobao.org/lower-case/download/lower-case-1.1.4.tgz", @@ -5829,6 +6090,12 @@ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", "dev": true }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/map-obj/download/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, "map-visit": { "version": "1.0.0", "resolved": "https://registry.npm.taobao.org/map-visit/download/map-visit-1.0.0.tgz", @@ -5940,6 +6207,24 @@ "readable-stream": "^2.0.1" } }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npm.taobao.org/meow/download/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + } + }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npm.taobao.org/merge-descriptors/download/merge-descriptors-1.0.1.tgz", @@ -6120,6 +6405,24 @@ } } }, + "mixin-object": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/mixin-object/download/mixin-object-2.0.1.tgz", + "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", + "dev": true, + "requires": { + "for-in": "^0.1.3", + "is-extendable": "^0.1.1" + }, + "dependencies": { + "for-in": { + "version": "0.1.8", + "resolved": "https://registry.npm.taobao.org/for-in/download/for-in-0.1.8.tgz", + "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=", + "dev": true + } + } + }, "mkdirp": { "version": "0.5.1", "resolved": "https://registry.npm.taobao.org/mkdirp/download/mkdirp-0.5.1.tgz", @@ -6177,8 +6480,7 @@ "version": "2.14.0", "resolved": "https://registry.npm.taobao.org/nan/download/nan-2.14.0.tgz", "integrity": "sha1-eBj3IgJ7JFmobwKV1DTR/CM2xSw=", - "dev": true, - "optional": true + "dev": true }, "nanomatch": { "version": "1.2.13", @@ -6232,6 +6534,43 @@ "integrity": "sha1-bBUsNFzhHFL0ZcKr2VfoY5zWdN8=", "dev": true }, + "node-gyp": { + "version": "3.8.0", + "resolved": "https://registry.npm.taobao.org/node-gyp/download/node-gyp-3.8.0.tgz?cache=0&sync_timestamp=1563338026377&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnode-gyp%2Fdownload%2Fnode-gyp-3.8.0.tgz", + "integrity": "sha1-VAMEJhwzDoDQ1e3OJTpoyzlkIYw=", + "dev": true, + "requires": { + "fstream": "^1.0.0", + "glob": "^7.0.3", + "graceful-fs": "^4.1.2", + "mkdirp": "^0.5.0", + "nopt": "2 || 3", + "npmlog": "0 || 1 || 2 || 3 || 4", + "osenv": "0", + "request": "^2.87.0", + "rimraf": "2", + "semver": "~5.3.0", + "tar": "^2.0.0", + "which": "1" + }, + "dependencies": { + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npm.taobao.org/nopt/download/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "dev": true + } + } + }, "node-libs-browser": { "version": "2.2.1", "resolved": "https://registry.npm.taobao.org/node-libs-browser/download/node-libs-browser-2.2.1.tgz", @@ -6280,6 +6619,84 @@ "semver": "^5.3.0" } }, + "node-sass": { + "version": "4.12.0", + "resolved": "https://registry.npm.taobao.org/node-sass/download/node-sass-4.12.0.tgz", + "integrity": "sha1-CRT1MZMjgBFKMMxfpPpjIzol8Bc=", + "dev": true, + "requires": { + "async-foreach": "^0.1.3", + "chalk": "^1.1.1", + "cross-spawn": "^3.0.0", + "gaze": "^1.0.0", + "get-stdin": "^4.0.1", + "glob": "^7.0.3", + "in-publish": "^2.0.0", + "lodash": "^4.17.11", + "meow": "^3.7.0", + "mkdirp": "^0.5.1", + "nan": "^2.13.2", + "node-gyp": "^3.8.0", + "npmlog": "^4.0.0", + "request": "^2.88.0", + "sass-graph": "^2.2.4", + "stdout-stream": "^1.4.0", + "true-case-path": "^1.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "cross-spawn": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/cross-spawn/download/cross-spawn-3.0.1.tgz", + "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npm.taobao.org/lru-cache/download/lru-cache-4.1.5.tgz", + "integrity": "sha1-i75Q6oW+1ZvJ4z3KuCNe6bz0Q80=", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, "nopt": { "version": "1.0.10", "resolved": "https://registry.npm.taobao.org/nopt/download/nopt-1.0.10.tgz", @@ -6289,6 +6706,18 @@ "abbrev": "1" } }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npm.taobao.org/normalize-package-data/download/normalize-package-data-2.5.0.tgz", + "integrity": "sha1-5m2xg4sgDB38IzIl0SyzZSDiNKg=", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npm.taobao.org/normalize-path/download/normalize-path-3.0.0.tgz", @@ -6321,6 +6750,18 @@ "path-key": "^2.0.0" } }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npm.taobao.org/npmlog/download/npmlog-4.1.2.tgz", + "integrity": "sha1-CKfyqL9zRgR3mp76StXMcXq7lUs=", + "dev": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, "nprogress": { "version": "0.2.0", "resolved": "https://registry.npm.taobao.org/nprogress/download/nprogress-0.2.0.tgz", @@ -6513,6 +6954,12 @@ "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", "dev": true }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/os-homedir/download/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, "os-locale": { "version": "3.1.0", "resolved": "https://registry.npm.taobao.org/os-locale/download/os-locale-3.1.0.tgz?cache=0&sync_timestamp=1560274285880&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fos-locale%2Fdownload%2Fos-locale-3.1.0.tgz", @@ -6524,6 +6971,22 @@ "mem": "^4.0.0" } }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/os-tmpdir/download/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npm.taobao.org/osenv/download/osenv-0.1.5.tgz", + "integrity": "sha1-hc36+uso6Gd/QW4odZK18/SepBA=", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, "p-defer": { "version": "1.0.0", "resolved": "https://registry.npm.taobao.org/p-defer/download/p-defer-1.0.0.tgz", @@ -7692,6 +8155,67 @@ } } }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/read-pkg/download/read-pkg-1.1.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fread-pkg%2Fdownload%2Fread-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "dependencies": { + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/path-type/download/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/read-pkg-up/download/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/find-up/download/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/path-exists/download/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + } + } + }, "readable-stream": { "version": "2.3.6", "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.6.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freadable-stream%2Fdownload%2Freadable-stream-2.3.6.tgz", @@ -7718,6 +8242,16 @@ "readable-stream": "^2.0.2" } }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/redent/download/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, "reduce": { "version": "1.0.2", "resolved": "https://registry.npm.taobao.org/reduce/download/reduce-1.0.2.tgz", @@ -7871,6 +8405,15 @@ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", "dev": true }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/repeating/download/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, "request": { "version": "2.88.0", "resolved": "https://registry.npm.taobao.org/request/download/request-2.88.0.tgz", @@ -7931,6 +8474,12 @@ "integrity": "sha1-79qpjqdFEyTQkrKyFjpqHXqaIUc=", "dev": true }, + "resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npm.taobao.org/resize-observer-polyfill/download/resize-observer-polyfill-1.5.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fresize-observer-polyfill%2Fdownload%2Fresize-observer-polyfill-1.5.1.tgz", + "integrity": "sha1-DpAg3T0hAkRY1OvSfiPkAmmBBGQ=", + "dev": true + }, "resolve": { "version": "1.11.1", "resolved": "https://registry.npm.taobao.org/resolve/download/resolve-1.11.1.tgz", @@ -8034,6 +8583,145 @@ "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=", "dev": true }, + "sass-graph": { + "version": "2.2.4", + "resolved": "https://registry.npm.taobao.org/sass-graph/download/sass-graph-2.2.4.tgz", + "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", + "dev": true, + "requires": { + "glob": "^7.0.0", + "lodash": "^4.0.0", + "scss-tokenizer": "^0.2.3", + "yargs": "^7.0.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npm.taobao.org/cliui/download/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/invert-kv/download/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/lcid/download/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npm.taobao.org/os-locale/download/os-locale-1.4.0.tgz?cache=0&sync_timestamp=1560274285880&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fos-locale%2Fdownload%2Fos-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/which-module/download/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npm.taobao.org/y18n/download/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yargs": { + "version": "7.1.0", + "resolved": "https://registry.npm.taobao.org/yargs/download/yargs-7.1.0.tgz", + "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "dev": true, + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^5.0.0" + } + }, + "yargs-parser": { + "version": "5.0.0", + "resolved": "https://registry.npm.taobao.org/yargs-parser/download/yargs-parser-5.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fyargs-parser%2Fdownload%2Fyargs-parser-5.0.0.tgz", + "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", + "dev": true, + "requires": { + "camelcase": "^3.0.0" + } + } + } + }, + "sass-loader": { + "version": "7.1.0", + "resolved": "https://registry.npm.taobao.org/sass-loader/download/sass-loader-7.1.0.tgz", + "integrity": "sha1-Fv1ROMuLQkv4p1lSihly1yqtBp0=", + "dev": true, + "requires": { + "clone-deep": "^2.0.1", + "loader-utils": "^1.0.1", + "lodash.tail": "^4.1.1", + "neo-async": "^2.5.0", + "pify": "^3.0.0", + "semver": "^5.5.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/pify/download/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, "sax": { "version": "1.2.4", "resolved": "https://registry.npm.taobao.org/sax/download/sax-1.2.4.tgz", @@ -8051,6 +8739,27 @@ "ajv-keywords": "^3.1.0" } }, + "scss-tokenizer": { + "version": "0.2.3", + "resolved": "https://registry.npm.taobao.org/scss-tokenizer/download/scss-tokenizer-0.2.3.tgz", + "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", + "dev": true, + "requires": { + "js-base64": "^2.1.8", + "source-map": "^0.4.2" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, "section-matter": { "version": "1.0.0", "resolved": "https://registry.npm.taobao.org/section-matter/download/section-matter-1.0.0.tgz", @@ -8277,6 +8986,25 @@ "safe-buffer": "^5.0.1" } }, + "shallow-clone": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/shallow-clone/download/shallow-clone-1.0.0.tgz", + "integrity": "sha1-RIDNBuiC72iyrYij6lSDLixItXE=", + "dev": true, + "requires": { + "is-extendable": "^0.1.1", + "kind-of": "^5.0.0", + "mixin-object": "^2.0.1" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-5.1.0.tgz", + "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", + "dev": true + } + } + }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npm.taobao.org/shebang-command/download/shebang-command-1.2.0.tgz", @@ -8545,6 +9273,38 @@ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", "dev": true }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/spdx-correct/download/spdx-correct-3.1.0.tgz", + "integrity": "sha1-+4PlBERSaPFUsHTiGMh8ADzTHfQ=", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npm.taobao.org/spdx-exceptions/download/spdx-exceptions-2.2.0.tgz", + "integrity": "sha1-LqRQrudPKom/uUUZwH/Nb0EyKXc=", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/spdx-expression-parse/download/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha1-meEZt6XaAOBUkcn6M4t5BII7QdA=", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npm.taobao.org/spdx-license-ids/download/spdx-license-ids-3.0.5.tgz?cache=0&sync_timestamp=1562834220236&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fspdx-license-ids%2Fdownload%2Fspdx-license-ids-3.0.5.tgz", + "integrity": "sha1-NpS1gEVnpFjTyARYQqY1hjL2JlQ=", + "dev": true + }, "spdy": { "version": "4.0.0", "resolved": "https://registry.npm.taobao.org/spdy/download/spdy-4.0.0.tgz", @@ -8674,6 +9434,15 @@ "ci-info": "^1.6.0" } }, + "stdout-stream": { + "version": "1.4.1", + "resolved": "https://registry.npm.taobao.org/stdout-stream/download/stdout-stream-1.4.1.tgz", + "integrity": "sha1-WsF0zdXNcmEEqgwLK9g4FdjVNd4=", + "dev": true, + "requires": { + "readable-stream": "^2.0.1" + } + }, "stream-browserify": { "version": "2.0.2", "resolved": "https://registry.npm.taobao.org/stream-browserify/download/stream-browserify-2.0.2.tgz", @@ -8764,6 +9533,15 @@ "ansi-regex": "^2.0.0" } }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/strip-bom/download/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, "strip-bom-string": { "version": "1.0.0", "resolved": "https://registry.npm.taobao.org/strip-bom-string/download/strip-bom-string-1.0.0.tgz", @@ -8776,6 +9554,15 @@ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/strip-indent/download/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1" + } + }, "stylehacks": { "version": "4.0.3", "resolved": "https://registry.npm.taobao.org/stylehacks/download/stylehacks-4.0.3.tgz", @@ -8898,6 +9685,17 @@ "integrity": "sha1-ofzMBrWNth/XpF2i2kT186Pme6I=", "dev": true }, + "tar": { + "version": "2.2.2", + "resolved": "https://registry.npm.taobao.org/tar/download/tar-2.2.2.tgz", + "integrity": "sha1-DKiEhWLHKZuLRG/2pNYM27I+3EA=", + "dev": true, + "requires": { + "block-stream": "*", + "fstream": "^1.0.12", + "inherits": "2" + } + }, "terser": { "version": "4.1.2", "resolved": "https://registry.npm.taobao.org/terser/download/terser-4.1.2.tgz?cache=0&sync_timestamp=1562580696479&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fterser%2Fdownload%2Fterser-4.1.2.tgz", @@ -9095,12 +9893,27 @@ } } }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/trim-newlines/download/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + }, "trim-right": { "version": "1.0.1", "resolved": "https://registry.npm.taobao.org/trim-right/download/trim-right-1.0.1.tgz", "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", "dev": true }, + "true-case-path": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/true-case-path/download/true-case-path-1.0.3.tgz", + "integrity": "sha1-+BO1qMhrQNpZYGcisUTjIleZ9H0=", + "dev": true, + "requires": { + "glob": "^7.1.2" + } + }, "tslib": { "version": "1.10.0", "resolved": "https://registry.npm.taobao.org/tslib/download/tslib-1.10.0.tgz", @@ -9431,6 +10244,16 @@ "integrity": "sha1-G0r0lV6zB3xQHCOHL8ZROBFYcTE=", "dev": true }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npm.taobao.org/validate-npm-package-license/download/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha1-/JH2uce6FchX9MssXe/uw51PQQo=", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, "vary": { "version": "1.1.2", "resolved": "https://registry.npm.taobao.org/vary/download/vary-1.1.2.tgz", @@ -9619,6 +10442,12 @@ } } }, + "vuepress-plugin-baidu-autopush": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/vuepress-plugin-baidu-autopush/download/vuepress-plugin-baidu-autopush-1.0.1.tgz", + "integrity": "sha1-5QQhcPBaWFxKOPh24B/0cGzYL74=", + "dev": true + }, "vuepress-plugin-container": { "version": "2.0.2", "resolved": "https://registry.npm.taobao.org/vuepress-plugin-container/download/vuepress-plugin-container-2.0.2.tgz", @@ -9628,6 +10457,29 @@ "markdown-it-container": "^2.0.0" } }, + "vuepress-plugin-element-tabs": { + "version": "0.1.8", + "resolved": "https://registry.npm.taobao.org/vuepress-plugin-element-tabs/download/vuepress-plugin-element-tabs-0.1.8.tgz", + "integrity": "sha1-E6emn9P+EyWk0OZJx//1cWQFGNU=", + "dev": true, + "requires": { + "node-sass": "^4.11.0", + "resize-observer-polyfill": "^1.5.1", + "sass-loader": "^7.1.0" + } + }, + "vuepress-plugin-reading-progress": { + "version": "1.0.7", + "resolved": "https://registry.npm.taobao.org/vuepress-plugin-reading-progress/download/vuepress-plugin-reading-progress-1.0.7.tgz", + "integrity": "sha1-mieIZrUoDkRyJleZRe3tMFW6SM4=", + "dev": true + }, + "vuepress-plugin-seo": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/vuepress-plugin-seo/-/vuepress-plugin-seo-0.1.2.tgz", + "integrity": "sha512-Tv3ihNl3pDX5krqq9r2X9rFKUVR8ssLvcKcu1P4ABP8/b3vC06St/UTe5QucgKzuphlIJkbRSOQ7n7yf6jMCRw==", + "dev": true + }, "watchpack": { "version": "1.6.0", "resolved": "https://registry.npm.taobao.org/watchpack/download/watchpack-1.6.0.tgz?cache=0&sync_timestamp=1562782917067&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwatchpack%2Fdownload%2Fwatchpack-1.6.0.tgz", @@ -9887,6 +10739,15 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npm.taobao.org/wide-align/download/wide-align-1.1.3.tgz", + "integrity": "sha1-rgdOa9wMFKQx6ATmJFScYzsABFc=", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, "worker-farm": { "version": "1.7.0", "resolved": "https://registry.npm.taobao.org/worker-farm/download/worker-farm-1.7.0.tgz", diff --git a/package.json b/package.json index b59088c..4a1f6ad 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,10 @@ "@vuepress/plugin-medium-zoom": "^1.0.0-rc.1", "@vuepress/plugin-nprogress": "^1.0.2", "date-fns": "^1.30.1", - "vuepress": "^1.0.2" + "vuepress": "^1.0.2", + "vuepress-plugin-baidu-autopush": "^1.0.1", + "vuepress-plugin-element-tabs": "^0.1.8", + "vuepress-plugin-reading-progress": "^1.0.7", + "vuepress-plugin-seo": "^0.1.2" } }