diff --git a/.gitignore b/.gitignore index 354b059..8a536f6 100644 --- a/.gitignore +++ b/.gitignore @@ -29,4 +29,5 @@ HELP.md .vscode/ /node_modules/ -/.vuepress/dist/ \ No newline at end of file +/.vuepress/dist/ +/docs/ \ No newline at end of file diff --git a/.vuepress/theme/layouts/Layout.vue b/.vuepress/theme/layouts/Layout.vue index c2d9d38..9e88b11 100644 --- a/.vuepress/theme/layouts/Layout.vue +++ b/.vuepress/theme/layouts/Layout.vue @@ -6,7 +6,7 @@ 简介
- 安装 + 安装
使用 diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..497f0cc --- /dev/null +++ b/Dockerfile @@ -0,0 +1,14 @@ +FROM nginx:1.17.1 + +COPY docker/entrypoint.sh /entrypoint.sh +RUN rm -f /etc/nginx/nginx.conf \ + && rm -f /etc/nginx/conf.d/default.conf +COPY docker/nginx.80.conf /etc/nginx/conf.d/nginx.80.conf +COPY docker/nginx.conf /etc/nginx/nginx.conf +LABEL maintainer="shaohq@foxmail.com" + +EXPOSE 80 + +COPY ./docs /usr/share/nginx/html + +ENTRYPOINT ["nginx", "-g", "daemon off;"] diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..ed71c3d --- /dev/null +++ b/build.sh @@ -0,0 +1,16 @@ +#!/bin/bash +datetime=`date +%Y%m%d-%H%M%S` +echo $datetime +tag=eipwork/kuboard-press + +npm install --registry=https://registry.npm.taobao.org +npm run docs:build + +docker build -t $tag:latest . + + +if test $datetime != ""; then + docker push $tag:latest + docker tag $tag:latest $tag:$datetime + docker push $tag:$datetime +fi diff --git a/docker/dnsmasq.conf b/docker/dnsmasq.conf new file mode 100644 index 0000000..5202c67 --- /dev/null +++ b/docker/dnsmasq.conf @@ -0,0 +1 @@ +user=root diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh new file mode 100755 index 0000000..67fc82e --- /dev/null +++ b/docker/entrypoint.sh @@ -0,0 +1,8 @@ +#!/bin/sh +echo "start dnsmasq" +service dnsmasq start +echo ${KUBERNETES_SERVICE_HOST}:${KUBERNETES_SERVICE_PORT_HTTPS} +sed -i s/KUBERNETES_SERVICE_HOST/${KUBERNETES_SERVICE_HOST}/g /etc/nginx/conf.d/nginx.80.conf +sed -i s/KUBERNETES_SERVICE_PORT_HTTPS/${KUBERNETES_SERVICE_PORT_HTTPS}/g /etc/nginx/conf.d/nginx.80.conf +echo "start nginx" +nginx -g "daemon off;" \ No newline at end of file diff --git a/docker/nginx.80.conf b/docker/nginx.80.conf new file mode 100644 index 0000000..497251f --- /dev/null +++ b/docker/nginx.80.conf @@ -0,0 +1,13 @@ +server { + listen 80; + + location / { + root /usr/share/nginx/html; + index index.html index.htm; + } + + error_page 500 502 503 504 /50x.html; + location /50x.html { + root /usr/share/nginx/html; + } +} diff --git a/docker/nginx.conf b/docker/nginx.conf new file mode 100644 index 0000000..f27d914 --- /dev/null +++ b/docker/nginx.conf @@ -0,0 +1,38 @@ +user root; +worker_processes 1; + +error_log /var/log/nginx/error.log warn; +pid /var/run/nginx.pid; + +events { + worker_connections 1024; +} + +http { + include /etc/nginx/mime.types; + default_type application/octet-stream; + + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for"'; + + access_log /var/log/nginx/access.log main; + + sendfile on; + #tcp_nopush on; + + keepalive_timeout 65; + + client_header_buffer_size 16k; + large_client_header_buffers 4 16k; + + gzip on; + gzip_min_length 1k; + gzip_buffers 4 16k; + gzip_comp_level 9; + gzip_types text/plain application/json application/javascript application/x-javascript text/css application/xml text/javascript; + gzip_vary off; + gzip_disable "MSIE [1-6]\."; + + include /etc/nginx/conf.d/*.conf; +} \ No newline at end of file diff --git a/docs/.nojekyll b/docs/.nojekyll deleted file mode 100644 index e69de29..0000000 diff --git a/docs/404.html b/docs/404.html deleted file mode 100644 index e9bd49a..0000000 --- a/docs/404.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - Kuboard - - - - - - - -

404

Looks like we've got some broken links.
Take me home.
- - - diff --git a/docs/CNAME b/docs/CNAME deleted file mode 100644 index e0429f7..0000000 --- a/docs/CNAME +++ /dev/null @@ -1 +0,0 @@ -kuboard.cn \ No newline at end of file diff --git a/docs/assets/css/0.styles.10e5d9a9.css b/docs/assets/css/0.styles.10e5d9a9.css deleted file mode 100644 index dc09a35..0000000 --- a/docs/assets/css/0.styles.10e5d9a9.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}.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-73c41bb9]{text-align:center;font-size:.8rem;color:#909399;margin-top:2rem}.side-nav-item[data-v-73c41bb9]{margin-bottom:-2px;margin-left:15px;display:inline-block;line-height:1.4rem;white-space:nowrap;font-size:1rem;cursor:pointer}.side-nav-item a[data-v-73c41bb9]{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:#606266;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:#606266;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:#606266}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/03d07039d9fc80c0f692d6176f65936e.7af9fab5.gif b/docs/assets/img/03d07039d9fc80c0f692d6176f65936e.7af9fab5.gif deleted file mode 100644 index 7bb9a2e..0000000 Binary files a/docs/assets/img/03d07039d9fc80c0f692d6176f65936e.7af9fab5.gif and /dev/null differ diff --git a/docs/assets/img/d7ce07842371eab180725bab5164ec17.d58ea9cc.png b/docs/assets/img/d7ce07842371eab180725bab5164ec17.d58ea9cc.png deleted file mode 100644 index 78bafcd..0000000 Binary files a/docs/assets/img/d7ce07842371eab180725bab5164ec17.d58ea9cc.png and /dev/null differ diff --git a/docs/assets/img/e7a273fcdc03d2417b354b60c253552f.19ae82d9.gif b/docs/assets/img/e7a273fcdc03d2417b354b60c253552f.19ae82d9.gif deleted file mode 100644 index cf5fe9a..0000000 Binary files a/docs/assets/img/e7a273fcdc03d2417b354b60c253552f.19ae82d9.gif and /dev/null differ diff --git a/docs/assets/img/image-20190713075717350.df5244cd.png b/docs/assets/img/image-20190713075717350.df5244cd.png deleted file mode 100644 index cee4fbf..0000000 Binary files a/docs/assets/img/image-20190713075717350.df5244cd.png and /dev/null differ diff --git a/docs/assets/img/image-20190715085036593.55559549.png b/docs/assets/img/image-20190715085036593.55559549.png deleted file mode 100644 index b69b26b..0000000 Binary files a/docs/assets/img/image-20190715085036593.55559549.png and /dev/null differ diff --git a/docs/assets/img/image-20190715101542756.5934c00e.png b/docs/assets/img/image-20190715101542756.5934c00e.png deleted file mode 100644 index 2bc13ea..0000000 Binary files a/docs/assets/img/image-20190715101542756.5934c00e.png and /dev/null differ diff --git a/docs/assets/img/image-20190715193838012.eca23618.png b/docs/assets/img/image-20190715193838012.eca23618.png deleted file mode 100644 index 8cb1220..0000000 Binary files a/docs/assets/img/image-20190715193838012.eca23618.png and /dev/null differ diff --git a/docs/assets/img/image-20190716234146419.bd87cdff.png b/docs/assets/img/image-20190716234146419.bd87cdff.png deleted file mode 100644 index ea23c7a..0000000 Binary files a/docs/assets/img/image-20190716234146419.bd87cdff.png and /dev/null differ diff --git a/docs/assets/img/image-20190717113807552.b3fe5f7d.png b/docs/assets/img/image-20190717113807552.b3fe5f7d.png deleted file mode 100644 index ea7910c..0000000 Binary files a/docs/assets/img/image-20190717113807552.b3fe5f7d.png and /dev/null differ diff --git a/docs/assets/img/image-20190717114304953.854b47d8.png b/docs/assets/img/image-20190717114304953.854b47d8.png deleted file mode 100644 index 13b3024..0000000 Binary files a/docs/assets/img/image-20190717114304953.854b47d8.png and /dev/null differ diff --git a/docs/assets/img/image-20190717114354610.6d522c25.png b/docs/assets/img/image-20190717114354610.6d522c25.png deleted file mode 100644 index 2d0db33..0000000 Binary files a/docs/assets/img/image-20190717114354610.6d522c25.png and /dev/null differ diff --git a/docs/assets/img/image-20190717115020848.eec5a17e.png b/docs/assets/img/image-20190717115020848.eec5a17e.png deleted file mode 100644 index 4ea8829..0000000 Binary files a/docs/assets/img/image-20190717115020848.eec5a17e.png and /dev/null differ diff --git a/docs/assets/img/image-20190717115403374.48894c27.png b/docs/assets/img/image-20190717115403374.48894c27.png deleted file mode 100644 index 834c14f..0000000 Binary files a/docs/assets/img/image-20190717115403374.48894c27.png and /dev/null differ diff --git a/docs/assets/img/image-20190717115457614.c7f0d044.png b/docs/assets/img/image-20190717115457614.c7f0d044.png deleted file mode 100644 index 557d66d..0000000 Binary files a/docs/assets/img/image-20190717115457614.c7f0d044.png and /dev/null differ diff --git a/docs/assets/img/image-20190717115829821.63b81f36.png b/docs/assets/img/image-20190717115829821.63b81f36.png deleted file mode 100644 index 15569c0..0000000 Binary files a/docs/assets/img/image-20190717115829821.63b81f36.png and /dev/null differ diff --git a/docs/assets/img/image-20190717193548703.5167e3b9.png b/docs/assets/img/image-20190717193548703.5167e3b9.png deleted file mode 100644 index f5e901d..0000000 Binary files a/docs/assets/img/image-20190717193548703.5167e3b9.png and /dev/null differ diff --git a/docs/assets/img/image-20190718104156232.8f0c70ed.png b/docs/assets/img/image-20190718104156232.8f0c70ed.png deleted file mode 100644 index 69eec3a..0000000 Binary files a/docs/assets/img/image-20190718104156232.8f0c70ed.png and /dev/null differ diff --git a/docs/assets/img/image-20190718104729472.ef92267c.png b/docs/assets/img/image-20190718104729472.ef92267c.png deleted file mode 100644 index a277dcf..0000000 Binary files a/docs/assets/img/image-20190718104729472.ef92267c.png and /dev/null differ diff --git a/docs/assets/img/image-20190718105420599.71e5df51.png b/docs/assets/img/image-20190718105420599.71e5df51.png deleted file mode 100644 index c88b2e5..0000000 Binary files a/docs/assets/img/image-20190718105420599.71e5df51.png and /dev/null differ diff --git a/docs/assets/img/image-20190718105641651.16549369.png b/docs/assets/img/image-20190718105641651.16549369.png deleted file mode 100644 index 2f9909b..0000000 Binary files a/docs/assets/img/image-20190718105641651.16549369.png and /dev/null differ diff --git a/docs/assets/img/image-20190718120957255.0e01130f.png b/docs/assets/img/image-20190718120957255.0e01130f.png deleted file mode 100644 index 0f117a1..0000000 Binary files a/docs/assets/img/image-20190718120957255.0e01130f.png and /dev/null differ diff --git a/docs/assets/img/image-20190718121133160.0d0a8e13.png b/docs/assets/img/image-20190718121133160.0d0a8e13.png deleted file mode 100644 index 0430aef..0000000 Binary files a/docs/assets/img/image-20190718121133160.0d0a8e13.png and /dev/null differ diff --git a/docs/assets/img/image-20190720224950653.857d1b1e.png b/docs/assets/img/image-20190720224950653.857d1b1e.png deleted file mode 100644 index cd62d89..0000000 Binary files a/docs/assets/img/image-20190720224950653.857d1b1e.png and /dev/null differ diff --git a/docs/assets/img/image-20190720225123111.c2b02f0c.png b/docs/assets/img/image-20190720225123111.c2b02f0c.png deleted file mode 100644 index 0d4b3c7..0000000 Binary files a/docs/assets/img/image-20190720225123111.c2b02f0c.png and /dev/null differ diff --git a/docs/assets/img/image-20190720225222622.2081299f.png b/docs/assets/img/image-20190720225222622.2081299f.png deleted file mode 100644 index 9e6ab74..0000000 Binary files a/docs/assets/img/image-20190720225222622.2081299f.png and /dev/null differ diff --git a/docs/assets/img/image-20190720232405147.8fc011f9.png b/docs/assets/img/image-20190720232405147.8fc011f9.png deleted file mode 100644 index 3dd78b6..0000000 Binary files a/docs/assets/img/image-20190720232405147.8fc011f9.png and /dev/null differ diff --git a/docs/assets/img/image-20190720233322837.998be85a.png b/docs/assets/img/image-20190720233322837.998be85a.png deleted file mode 100644 index 341ea73..0000000 Binary files a/docs/assets/img/image-20190720233322837.998be85a.png and /dev/null differ diff --git a/docs/assets/img/image-20190720233348284.2360801d.png b/docs/assets/img/image-20190720233348284.2360801d.png deleted file mode 100644 index 24c2461..0000000 Binary files a/docs/assets/img/image-20190720233348284.2360801d.png and /dev/null differ diff --git a/docs/assets/img/image-20190720233412812.4f5ce20f.png b/docs/assets/img/image-20190720233412812.4f5ce20f.png deleted file mode 100644 index ade4860..0000000 Binary files a/docs/assets/img/image-20190720233412812.4f5ce20f.png and /dev/null differ diff --git a/docs/assets/img/image-20190720233436465.6d8cf61e.png b/docs/assets/img/image-20190720233436465.6d8cf61e.png deleted file mode 100644 index b41262a..0000000 Binary files a/docs/assets/img/image-20190720233436465.6d8cf61e.png and /dev/null differ diff --git a/docs/assets/img/image-20190720233512996.d7ba2b19.png b/docs/assets/img/image-20190720233512996.d7ba2b19.png deleted file mode 100644 index 9d0d90c..0000000 Binary files a/docs/assets/img/image-20190720233512996.d7ba2b19.png and /dev/null differ diff --git a/docs/assets/img/image-20190721000526434.cfdf2d30.png b/docs/assets/img/image-20190721000526434.cfdf2d30.png deleted file mode 100644 index e22304a..0000000 Binary files a/docs/assets/img/image-20190721000526434.cfdf2d30.png and /dev/null differ diff --git a/docs/assets/img/image-20190721000759925.bb32a332.png b/docs/assets/img/image-20190721000759925.bb32a332.png deleted file mode 100644 index fc41650..0000000 Binary files a/docs/assets/img/image-20190721000759925.bb32a332.png and /dev/null differ diff --git a/docs/assets/img/image-20190721000822458.5797bca7.png b/docs/assets/img/image-20190721000822458.5797bca7.png deleted file mode 100644 index a9b5874..0000000 Binary files a/docs/assets/img/image-20190721000822458.5797bca7.png and /dev/null differ diff --git a/docs/assets/img/image-20190721000847954.6f05e4b8.png b/docs/assets/img/image-20190721000847954.6f05e4b8.png deleted file mode 100644 index 953d580..0000000 Binary files a/docs/assets/img/image-20190721000847954.6f05e4b8.png and /dev/null differ diff --git a/docs/assets/img/image-20190721000919933.3a1d313e.png b/docs/assets/img/image-20190721000919933.3a1d313e.png deleted file mode 100644 index 5f2364c..0000000 Binary files a/docs/assets/img/image-20190721000919933.3a1d313e.png and /dev/null differ diff --git a/docs/assets/img/image-20190721085144545.25f25dda.png b/docs/assets/img/image-20190721085144545.25f25dda.png deleted file mode 100644 index 11cce03..0000000 Binary files a/docs/assets/img/image-20190721085144545.25f25dda.png and /dev/null differ diff --git a/docs/assets/img/image-20190721090118542.46c31055.png b/docs/assets/img/image-20190721090118542.46c31055.png deleted file mode 100644 index 50f89bf..0000000 Binary files a/docs/assets/img/image-20190721090118542.46c31055.png and /dev/null differ diff --git a/docs/assets/img/image-20190721090753742.28d009f3.png b/docs/assets/img/image-20190721090753742.28d009f3.png deleted file mode 100644 index 7eebc36..0000000 Binary files a/docs/assets/img/image-20190721090753742.28d009f3.png and /dev/null differ diff --git a/docs/assets/img/image-20190721090840925.a5231632.png b/docs/assets/img/image-20190721090840925.a5231632.png deleted file mode 100644 index 158664d..0000000 Binary files a/docs/assets/img/image-20190721090840925.a5231632.png and /dev/null differ diff --git a/docs/assets/img/image-20190721090935511.80fb3864.png b/docs/assets/img/image-20190721090935511.80fb3864.png deleted file mode 100644 index e6effa7..0000000 Binary files a/docs/assets/img/image-20190721090935511.80fb3864.png and /dev/null differ diff --git a/docs/assets/img/image-20190721091005130.330e9f1d.png b/docs/assets/img/image-20190721091005130.330e9f1d.png deleted file mode 100644 index f5f638f..0000000 Binary files a/docs/assets/img/image-20190721091005130.330e9f1d.png and /dev/null differ diff --git a/docs/assets/img/image-20190721100715898.f0faa9aa.png b/docs/assets/img/image-20190721100715898.f0faa9aa.png deleted file mode 100644 index 1164f2b..0000000 Binary files a/docs/assets/img/image-20190721100715898.f0faa9aa.png and /dev/null differ diff --git a/docs/assets/img/image-20190721101812895.8f059471.png b/docs/assets/img/image-20190721101812895.8f059471.png deleted file mode 100644 index 32d8844..0000000 Binary files a/docs/assets/img/image-20190721101812895.8f059471.png and /dev/null differ diff --git a/docs/assets/img/image-20190721101954560.176c574c.png b/docs/assets/img/image-20190721101954560.176c574c.png deleted file mode 100644 index 6a9c046..0000000 Binary files a/docs/assets/img/image-20190721101954560.176c574c.png and /dev/null differ diff --git a/docs/assets/img/image-20190721103324863.72744076.png b/docs/assets/img/image-20190721103324863.72744076.png deleted file mode 100644 index abc8eda..0000000 Binary files a/docs/assets/img/image-20190721103324863.72744076.png and /dev/null differ diff --git a/docs/assets/img/image-20190721104153954.74fb88ec.png b/docs/assets/img/image-20190721104153954.74fb88ec.png deleted file mode 100644 index 430b397..0000000 Binary files a/docs/assets/img/image-20190721104153954.74fb88ec.png and /dev/null differ diff --git a/docs/assets/img/image-20190721104348908.ce6e526d.png b/docs/assets/img/image-20190721104348908.ce6e526d.png deleted file mode 100644 index a13fd50..0000000 Binary files a/docs/assets/img/image-20190721104348908.ce6e526d.png and /dev/null differ diff --git a/docs/assets/img/image-20190721104415732.07ea4278.png b/docs/assets/img/image-20190721104415732.07ea4278.png deleted file mode 100644 index 70a557d..0000000 Binary files a/docs/assets/img/image-20190721104415732.07ea4278.png and /dev/null differ diff --git a/docs/assets/img/image-20190721104522870.6c74e0bb.png b/docs/assets/img/image-20190721104522870.6c74e0bb.png deleted file mode 100644 index bee3115..0000000 Binary files a/docs/assets/img/image-20190721104522870.6c74e0bb.png and /dev/null differ diff --git a/docs/assets/img/image-20190721110355464.25f25dda.png b/docs/assets/img/image-20190721110355464.25f25dda.png deleted file mode 100644 index 11cce03..0000000 Binary files a/docs/assets/img/image-20190721110355464.25f25dda.png and /dev/null differ diff --git a/docs/assets/img/image-20190721110543437.8cbe188d.png b/docs/assets/img/image-20190721110543437.8cbe188d.png deleted file mode 100644 index 04b26eb..0000000 Binary files a/docs/assets/img/image-20190721110543437.8cbe188d.png and /dev/null differ diff --git a/docs/assets/img/image-20190721111011798.b9cc73b4.png b/docs/assets/img/image-20190721111011798.b9cc73b4.png deleted file mode 100644 index b648c4a..0000000 Binary files a/docs/assets/img/image-20190721111011798.b9cc73b4.png and /dev/null differ diff --git a/docs/assets/img/image-20190721111540512.b0a58451.png b/docs/assets/img/image-20190721111540512.b0a58451.png deleted file mode 100644 index 8fd7e75..0000000 Binary files a/docs/assets/img/image-20190721111540512.b0a58451.png and /dev/null differ diff --git a/docs/assets/img/image-20190721111642221.f9c06dc3.png b/docs/assets/img/image-20190721111642221.f9c06dc3.png deleted file mode 100644 index 3a27ad8..0000000 Binary files a/docs/assets/img/image-20190721111642221.f9c06dc3.png and /dev/null differ diff --git a/docs/assets/img/image-20190721112353077.b907aa89.png b/docs/assets/img/image-20190721112353077.b907aa89.png deleted file mode 100644 index 70bc857..0000000 Binary files a/docs/assets/img/image-20190721112353077.b907aa89.png and /dev/null differ diff --git a/docs/assets/img/image-20190721112624128.7aa6b8f1.png b/docs/assets/img/image-20190721112624128.7aa6b8f1.png deleted file mode 100644 index 3081248..0000000 Binary files a/docs/assets/img/image-20190721112624128.7aa6b8f1.png and /dev/null differ diff --git a/docs/assets/img/image-20190721113050608.97e0f110.png b/docs/assets/img/image-20190721113050608.97e0f110.png deleted file mode 100644 index 97df555..0000000 Binary files a/docs/assets/img/image-20190721113050608.97e0f110.png and /dev/null differ diff --git a/docs/assets/img/image-20190721113155991.f3ecd62f.png b/docs/assets/img/image-20190721113155991.f3ecd62f.png deleted file mode 100644 index fe000fe..0000000 Binary files a/docs/assets/img/image-20190721113155991.f3ecd62f.png and /dev/null differ diff --git a/docs/assets/img/image-20190721113708689.f9b42a11.png b/docs/assets/img/image-20190721113708689.f9b42a11.png deleted file mode 100644 index c1449c2..0000000 Binary files a/docs/assets/img/image-20190721113708689.f9b42a11.png and /dev/null differ diff --git a/docs/assets/img/image-20190721113810235.59d55672.png b/docs/assets/img/image-20190721113810235.59d55672.png deleted file mode 100644 index f9e3d4f..0000000 Binary files a/docs/assets/img/image-20190721113810235.59d55672.png and /dev/null differ diff --git a/docs/assets/img/image-20190721114112644.526de44c.png b/docs/assets/img/image-20190721114112644.526de44c.png deleted file mode 100644 index 3abb2ab..0000000 Binary files a/docs/assets/img/image-20190721114112644.526de44c.png and /dev/null differ diff --git a/docs/assets/img/image-20190721114211751.e1a07115.png b/docs/assets/img/image-20190721114211751.e1a07115.png deleted file mode 100644 index 5ebf339..0000000 Binary files a/docs/assets/img/image-20190721114211751.e1a07115.png and /dev/null differ diff --git a/docs/assets/img/image-20190721154650916.3f63fdcb.jpg b/docs/assets/img/image-20190721154650916.3f63fdcb.jpg deleted file mode 100644 index f8f2dd7..0000000 Binary files a/docs/assets/img/image-20190721154650916.3f63fdcb.jpg and /dev/null differ diff --git a/docs/assets/img/image-20190722162249531.e826dfb9.png b/docs/assets/img/image-20190722162249531.e826dfb9.png deleted file mode 100644 index 73fc18f..0000000 Binary files a/docs/assets/img/image-20190722162249531.e826dfb9.png and /dev/null differ diff --git a/docs/assets/img/image-20190722165648180.fe018998.png b/docs/assets/img/image-20190722165648180.fe018998.png deleted file mode 100644 index 4d965f3..0000000 Binary files a/docs/assets/img/image-20190722165648180.fe018998.png and /dev/null differ diff --git a/docs/assets/img/image-20190722172356943.9a901574.png b/docs/assets/img/image-20190722172356943.9a901574.png deleted file mode 100644 index 4483c6b..0000000 Binary files a/docs/assets/img/image-20190722172356943.9a901574.png and /dev/null differ diff --git a/docs/assets/img/image-20190722182005060.8e560b34.png b/docs/assets/img/image-20190722182005060.8e560b34.png deleted file mode 100644 index 0a2ed93..0000000 Binary files a/docs/assets/img/image-20190722182005060.8e560b34.png and /dev/null differ diff --git a/docs/assets/img/image-20190722183329825.63739750.png b/docs/assets/img/image-20190722183329825.63739750.png deleted file mode 100644 index 2004c11..0000000 Binary files a/docs/assets/img/image-20190722183329825.63739750.png and /dev/null differ diff --git a/docs/assets/img/image-20190722183750444.973f7dfa.png b/docs/assets/img/image-20190722183750444.973f7dfa.png deleted file mode 100644 index ddd2c37..0000000 Binary files a/docs/assets/img/image-20190722183750444.973f7dfa.png and /dev/null differ diff --git a/docs/assets/img/image-20190722184943431.f2f72e7c.png b/docs/assets/img/image-20190722184943431.f2f72e7c.png deleted file mode 100644 index d1f846e..0000000 Binary files a/docs/assets/img/image-20190722184943431.f2f72e7c.png and /dev/null differ diff --git a/docs/assets/img/image-20190722185113938.4d31e54b.png b/docs/assets/img/image-20190722185113938.4d31e54b.png deleted file mode 100644 index d45db33..0000000 Binary files a/docs/assets/img/image-20190722185113938.4d31e54b.png and /dev/null differ diff --git a/docs/assets/img/image-20190722223454676.b545b43f.png b/docs/assets/img/image-20190722223454676.b545b43f.png deleted file mode 100644 index 59a4ad9..0000000 Binary files a/docs/assets/img/image-20190722223454676.b545b43f.png and /dev/null differ diff --git a/docs/assets/img/image-20190722223551308.ed106a2a.png b/docs/assets/img/image-20190722223551308.ed106a2a.png deleted file mode 100644 index ca8208a..0000000 Binary files a/docs/assets/img/image-20190722223551308.ed106a2a.png and /dev/null differ diff --git a/docs/assets/img/image-20190722223605920.3e762b29.png b/docs/assets/img/image-20190722223605920.3e762b29.png deleted file mode 100644 index 8e1ca62..0000000 Binary files a/docs/assets/img/image-20190722223605920.3e762b29.png and /dev/null differ diff --git a/docs/assets/img/image-20190722224029397.abc44209.png b/docs/assets/img/image-20190722224029397.abc44209.png deleted file mode 100644 index c103044..0000000 Binary files a/docs/assets/img/image-20190722224029397.abc44209.png and /dev/null differ diff --git a/docs/assets/img/image-20190722225347491.984fabae.png b/docs/assets/img/image-20190722225347491.984fabae.png deleted file mode 100644 index e1f974b..0000000 Binary files a/docs/assets/img/image-20190722225347491.984fabae.png and /dev/null differ diff --git a/docs/assets/img/image-20190722225454029.73400267.png b/docs/assets/img/image-20190722225454029.73400267.png deleted file mode 100644 index add9c7a..0000000 Binary files a/docs/assets/img/image-20190722225454029.73400267.png and /dev/null differ diff --git a/docs/assets/img/image-20190722230511430.ed459354.png b/docs/assets/img/image-20190722230511430.ed459354.png deleted file mode 100644 index 79b674d..0000000 Binary files a/docs/assets/img/image-20190722230511430.ed459354.png and /dev/null differ diff --git a/docs/assets/img/image-20190722231246540.ebf13194.png b/docs/assets/img/image-20190722231246540.ebf13194.png deleted file mode 100644 index bbd9b02..0000000 Binary files a/docs/assets/img/image-20190722231246540.ebf13194.png and /dev/null differ diff --git a/docs/assets/img/image-20190723104717575.f44900d3.png b/docs/assets/img/image-20190723104717575.f44900d3.png deleted file mode 100644 index 4fb805a..0000000 Binary files a/docs/assets/img/image-20190723104717575.f44900d3.png and /dev/null differ diff --git a/docs/assets/img/image-20190723105039358.91eef75a.png b/docs/assets/img/image-20190723105039358.91eef75a.png deleted file mode 100644 index 877a9b8..0000000 Binary files a/docs/assets/img/image-20190723105039358.91eef75a.png and /dev/null differ diff --git a/docs/assets/img/image-20190723105606081.bc471512.png b/docs/assets/img/image-20190723105606081.bc471512.png deleted file mode 100644 index 41bd8fe..0000000 Binary files a/docs/assets/img/image-20190723105606081.bc471512.png and /dev/null differ diff --git a/docs/assets/img/image-20190723105644937.968b1660.png b/docs/assets/img/image-20190723105644937.968b1660.png deleted file mode 100644 index fcb1554..0000000 Binary files a/docs/assets/img/image-20190723105644937.968b1660.png and /dev/null differ diff --git a/docs/assets/img/image-20190723105722999.5b6c9bae.png b/docs/assets/img/image-20190723105722999.5b6c9bae.png deleted file mode 100644 index 46e5148..0000000 Binary files a/docs/assets/img/image-20190723105722999.5b6c9bae.png and /dev/null differ diff --git a/docs/assets/img/image-20190723105748435.1cb3ad0d.png b/docs/assets/img/image-20190723105748435.1cb3ad0d.png deleted file mode 100644 index 13274ed..0000000 Binary files a/docs/assets/img/image-20190723105748435.1cb3ad0d.png and /dev/null differ diff --git a/docs/assets/img/image-20190723105809872.61add376.png b/docs/assets/img/image-20190723105809872.61add376.png deleted file mode 100644 index 9aefe57..0000000 Binary files a/docs/assets/img/image-20190723105809872.61add376.png and /dev/null differ diff --git a/docs/assets/img/image-20190723105830318.43414c56.png b/docs/assets/img/image-20190723105830318.43414c56.png deleted file mode 100644 index e8789e1..0000000 Binary files a/docs/assets/img/image-20190723105830318.43414c56.png and /dev/null differ diff --git a/docs/assets/img/image-20190723112105018.a27c638f.png b/docs/assets/img/image-20190723112105018.a27c638f.png deleted file mode 100644 index a96c3ea..0000000 Binary files a/docs/assets/img/image-20190723112105018.a27c638f.png and /dev/null differ diff --git a/docs/assets/img/image-20190723112143032.7a5220bd.png b/docs/assets/img/image-20190723112143032.7a5220bd.png deleted file mode 100644 index 2ef85c9..0000000 Binary files a/docs/assets/img/image-20190723112143032.7a5220bd.png and /dev/null differ diff --git a/docs/assets/img/image-20190723112204681.8279ca8f.png b/docs/assets/img/image-20190723112204681.8279ca8f.png deleted file mode 100644 index f8976db..0000000 Binary files a/docs/assets/img/image-20190723112204681.8279ca8f.png and /dev/null differ diff --git a/docs/assets/img/image-20190723113250521.3b80f3d2.png b/docs/assets/img/image-20190723113250521.3b80f3d2.png deleted file mode 100644 index dfe0bd5..0000000 Binary files a/docs/assets/img/image-20190723113250521.3b80f3d2.png and /dev/null differ diff --git a/docs/assets/img/image-20190723113312360.a3a51c0c.png b/docs/assets/img/image-20190723113312360.a3a51c0c.png deleted file mode 100644 index 323f663..0000000 Binary files a/docs/assets/img/image-20190723113312360.a3a51c0c.png and /dev/null differ diff --git a/docs/assets/img/image-20190723115721514.bf981ef3.png b/docs/assets/img/image-20190723115721514.bf981ef3.png deleted file mode 100644 index 79274cd..0000000 Binary files a/docs/assets/img/image-20190723115721514.bf981ef3.png and /dev/null differ diff --git a/docs/assets/img/image-20190723115852719.f1658660.png b/docs/assets/img/image-20190723115852719.f1658660.png deleted file mode 100644 index 7f24868..0000000 Binary files a/docs/assets/img/image-20190723115852719.f1658660.png and /dev/null differ diff --git a/docs/assets/img/image-20190723115912645.393d67ff.png b/docs/assets/img/image-20190723115912645.393d67ff.png deleted file mode 100644 index cdb7918..0000000 Binary files a/docs/assets/img/image-20190723115912645.393d67ff.png and /dev/null differ diff --git a/docs/assets/img/image-20190723115940862.dfeacc57.png b/docs/assets/img/image-20190723115940862.dfeacc57.png deleted file mode 100644 index a933609..0000000 Binary files a/docs/assets/img/image-20190723115940862.dfeacc57.png and /dev/null differ diff --git a/docs/assets/img/image-20190723120011972.0f0914c5.png b/docs/assets/img/image-20190723120011972.0f0914c5.png deleted file mode 100644 index 6cbe1b4..0000000 Binary files a/docs/assets/img/image-20190723120011972.0f0914c5.png and /dev/null differ diff --git a/docs/assets/img/image-20190723120050894.9b1d6350.png b/docs/assets/img/image-20190723120050894.9b1d6350.png deleted file mode 100644 index bc5bc3e..0000000 Binary files a/docs/assets/img/image-20190723120050894.9b1d6350.png and /dev/null differ diff --git a/docs/assets/img/image-20190723120104474.617a620a.png b/docs/assets/img/image-20190723120104474.617a620a.png deleted file mode 100644 index 949e9a2..0000000 Binary files a/docs/assets/img/image-20190723120104474.617a620a.png and /dev/null differ diff --git a/docs/assets/img/image-20190723120125425.a46d7874.png b/docs/assets/img/image-20190723120125425.a46d7874.png deleted file mode 100644 index ee0cb2a..0000000 Binary files a/docs/assets/img/image-20190723120125425.a46d7874.png and /dev/null differ diff --git a/docs/assets/img/image-20190723120730196.9793d8ec.png b/docs/assets/img/image-20190723120730196.9793d8ec.png deleted file mode 100644 index 001fb09..0000000 Binary files a/docs/assets/img/image-20190723120730196.9793d8ec.png and /dev/null differ diff --git a/docs/assets/img/image-20190723120753533.081b6d6b.png b/docs/assets/img/image-20190723120753533.081b6d6b.png deleted file mode 100644 index 57750e6..0000000 Binary files a/docs/assets/img/image-20190723120753533.081b6d6b.png and /dev/null differ diff --git a/docs/assets/img/image-20190723120832778.e154bccd.png b/docs/assets/img/image-20190723120832778.e154bccd.png deleted file mode 100644 index 9c69f9b..0000000 Binary files a/docs/assets/img/image-20190723120832778.e154bccd.png and /dev/null differ diff --git a/docs/assets/img/image-20190723120912377.e1404406.png b/docs/assets/img/image-20190723120912377.e1404406.png deleted file mode 100644 index d8c0582..0000000 Binary files a/docs/assets/img/image-20190723120912377.e1404406.png and /dev/null differ diff --git a/docs/assets/img/image-20190723120926747.c9754776.png b/docs/assets/img/image-20190723120926747.c9754776.png deleted file mode 100644 index b91d0c9..0000000 Binary files a/docs/assets/img/image-20190723120926747.c9754776.png and /dev/null differ diff --git a/docs/assets/img/image-20190723120956821.69bcdbbe.png b/docs/assets/img/image-20190723120956821.69bcdbbe.png deleted file mode 100644 index fa5b4d7..0000000 Binary files a/docs/assets/img/image-20190723120956821.69bcdbbe.png and /dev/null differ diff --git a/docs/assets/img/image-20190723121019167.81af1060.png b/docs/assets/img/image-20190723121019167.81af1060.png deleted file mode 100644 index 600eed0..0000000 Binary files a/docs/assets/img/image-20190723121019167.81af1060.png and /dev/null differ diff --git a/docs/assets/img/image-20190723121035917.8a2b1320.png b/docs/assets/img/image-20190723121035917.8a2b1320.png deleted file mode 100644 index 22d4167..0000000 Binary files a/docs/assets/img/image-20190723121035917.8a2b1320.png and /dev/null differ diff --git a/docs/assets/img/image-20190723121055648.2c6ba8d1.png b/docs/assets/img/image-20190723121055648.2c6ba8d1.png deleted file mode 100644 index ff75167..0000000 Binary files a/docs/assets/img/image-20190723121055648.2c6ba8d1.png and /dev/null differ diff --git a/docs/assets/img/image-20190723121117514.ef774d3a.png b/docs/assets/img/image-20190723121117514.ef774d3a.png deleted file mode 100644 index c090edc..0000000 Binary files a/docs/assets/img/image-20190723121117514.ef774d3a.png and /dev/null differ diff --git a/docs/assets/img/image-20190723121132991.69146097.png b/docs/assets/img/image-20190723121132991.69146097.png deleted file mode 100644 index 19a7654..0000000 Binary files a/docs/assets/img/image-20190723121132991.69146097.png and /dev/null differ diff --git a/docs/assets/img/image-20190723121412027.6888452e.png b/docs/assets/img/image-20190723121412027.6888452e.png deleted file mode 100644 index 788ec2d..0000000 Binary files a/docs/assets/img/image-20190723121412027.6888452e.png and /dev/null differ diff --git a/docs/assets/img/image-20190723121433809.7a1b4b00.png b/docs/assets/img/image-20190723121433809.7a1b4b00.png deleted file mode 100644 index 6b16089..0000000 Binary files a/docs/assets/img/image-20190723121433809.7a1b4b00.png and /dev/null differ diff --git a/docs/assets/img/image-20190723150525017.378015c8.png b/docs/assets/img/image-20190723150525017.378015c8.png deleted file mode 100644 index cbb704c..0000000 Binary files a/docs/assets/img/image-20190723150525017.378015c8.png and /dev/null differ diff --git a/docs/assets/img/image-20190723150616633.17a9797e.png b/docs/assets/img/image-20190723150616633.17a9797e.png deleted file mode 100644 index dcdf8c3..0000000 Binary files a/docs/assets/img/image-20190723150616633.17a9797e.png and /dev/null differ diff --git a/docs/assets/img/image-20190723150853277.c168bc57.png b/docs/assets/img/image-20190723150853277.c168bc57.png deleted file mode 100644 index 26c2237..0000000 Binary files a/docs/assets/img/image-20190723150853277.c168bc57.png and /dev/null differ diff --git a/docs/assets/img/image-20190723151045112.5329884a.png b/docs/assets/img/image-20190723151045112.5329884a.png deleted file mode 100644 index 5938540..0000000 Binary files a/docs/assets/img/image-20190723151045112.5329884a.png and /dev/null differ diff --git a/docs/assets/img/image-20190723151103353.3c29b906.png b/docs/assets/img/image-20190723151103353.3c29b906.png deleted file mode 100644 index 28a0acf..0000000 Binary files a/docs/assets/img/image-20190723151103353.3c29b906.png and /dev/null differ diff --git a/docs/assets/img/image-20190723151339137.5f756564.png b/docs/assets/img/image-20190723151339137.5f756564.png deleted file mode 100644 index 54af897..0000000 Binary files a/docs/assets/img/image-20190723151339137.5f756564.png and /dev/null differ diff --git a/docs/assets/img/image-20190723151357262.e79d2b6c.png b/docs/assets/img/image-20190723151357262.e79d2b6c.png deleted file mode 100644 index 4252791..0000000 Binary files a/docs/assets/img/image-20190723151357262.e79d2b6c.png and /dev/null differ diff --git a/docs/assets/img/image-20190723151422460.f02b1a28.png b/docs/assets/img/image-20190723151422460.f02b1a28.png deleted file mode 100644 index 6ca2bc7..0000000 Binary files a/docs/assets/img/image-20190723151422460.f02b1a28.png and /dev/null differ diff --git a/docs/assets/img/image-20190723151711230.c3dd4c41.png b/docs/assets/img/image-20190723151711230.c3dd4c41.png deleted file mode 100644 index f0c8cba..0000000 Binary files a/docs/assets/img/image-20190723151711230.c3dd4c41.png and /dev/null differ diff --git a/docs/assets/img/image-20190723151804727.287fa561.png b/docs/assets/img/image-20190723151804727.287fa561.png deleted file mode 100644 index 988eaa9..0000000 Binary files a/docs/assets/img/image-20190723151804727.287fa561.png and /dev/null differ diff --git a/docs/assets/img/image-20190723151845303.f2b8415a.png b/docs/assets/img/image-20190723151845303.f2b8415a.png deleted file mode 100644 index 031a446..0000000 Binary files a/docs/assets/img/image-20190723151845303.f2b8415a.png and /dev/null differ diff --git a/docs/assets/img/image-20190723151902003.1ef39b19.png b/docs/assets/img/image-20190723151902003.1ef39b19.png deleted file mode 100644 index a929719..0000000 Binary files a/docs/assets/img/image-20190723151902003.1ef39b19.png and /dev/null differ diff --git a/docs/assets/img/image-20190723151914994.fa026f01.png b/docs/assets/img/image-20190723151914994.fa026f01.png deleted file mode 100644 index 0b02440..0000000 Binary files a/docs/assets/img/image-20190723151914994.fa026f01.png and /dev/null differ diff --git a/docs/assets/img/image-20190723151932871.cbc894da.png b/docs/assets/img/image-20190723151932871.cbc894da.png deleted file mode 100644 index b41157c..0000000 Binary files a/docs/assets/img/image-20190723151932871.cbc894da.png and /dev/null differ diff --git a/docs/assets/img/image-20190723151951910.c3248933.png b/docs/assets/img/image-20190723151951910.c3248933.png deleted file mode 100644 index 38d5402..0000000 Binary files a/docs/assets/img/image-20190723151951910.c3248933.png and /dev/null differ diff --git a/docs/assets/img/image-20190723152020605.31eccc82.png b/docs/assets/img/image-20190723152020605.31eccc82.png deleted file mode 100644 index ab5a3ec..0000000 Binary files a/docs/assets/img/image-20190723152020605.31eccc82.png and /dev/null differ diff --git a/docs/assets/img/image-20190723152040219.45660f67.png b/docs/assets/img/image-20190723152040219.45660f67.png deleted file mode 100644 index 96e5820..0000000 Binary files a/docs/assets/img/image-20190723152040219.45660f67.png and /dev/null differ diff --git a/docs/assets/img/image-20190723152124196.9ef1af43.png b/docs/assets/img/image-20190723152124196.9ef1af43.png deleted file mode 100644 index e0be55e..0000000 Binary files a/docs/assets/img/image-20190723152124196.9ef1af43.png and /dev/null differ diff --git a/docs/assets/img/image-20190726214032585.f5bc62e4.png b/docs/assets/img/image-20190726214032585.f5bc62e4.png deleted file mode 100644 index 6ca243a..0000000 Binary files a/docs/assets/img/image-20190726214032585.f5bc62e4.png and /dev/null differ diff --git a/docs/assets/img/image-20190728145108904.8f9c0d1d.png b/docs/assets/img/image-20190728145108904.8f9c0d1d.png deleted file mode 100644 index e69013a..0000000 Binary files a/docs/assets/img/image-20190728145108904.8f9c0d1d.png and /dev/null differ diff --git a/docs/assets/img/image-20190728220831126.b579017f.png b/docs/assets/img/image-20190728220831126.b579017f.png deleted file mode 100644 index 0274821..0000000 Binary files a/docs/assets/img/image-20190728220831126.b579017f.png and /dev/null differ diff --git a/docs/assets/img/image-20190729071443225.13b42ed9.png b/docs/assets/img/image-20190729071443225.13b42ed9.png deleted file mode 100644 index c75c03f..0000000 Binary files a/docs/assets/img/image-20190729071443225.13b42ed9.png and /dev/null differ diff --git a/docs/assets/img/image-20190729071954323.13b88af4.png b/docs/assets/img/image-20190729071954323.13b88af4.png deleted file mode 100644 index 45e53a9..0000000 Binary files a/docs/assets/img/image-20190729071954323.13b88af4.png and /dev/null differ diff --git a/docs/assets/img/image2019-07-15_09.01.21.0e0d34f2.png b/docs/assets/img/image2019-07-15_09.01.21.0e0d34f2.png deleted file mode 100644 index 192045b..0000000 Binary files a/docs/assets/img/image2019-07-15_09.01.21.0e0d34f2.png and /dev/null differ diff --git a/docs/assets/img/image2019-6-10_15-36-29.2870ee7d.png b/docs/assets/img/image2019-6-10_15-36-29.2870ee7d.png deleted file mode 100644 index 8d8973c..0000000 Binary files a/docs/assets/img/image2019-6-10_15-36-29.2870ee7d.png and /dev/null differ diff --git a/docs/assets/img/kuboard_qq.45e78dbf.png b/docs/assets/img/kuboard_qq.45e78dbf.png deleted file mode 100644 index ab3123e..0000000 Binary files a/docs/assets/img/kuboard_qq.45e78dbf.png and /dev/null differ diff --git a/docs/assets/img/search.83621669.svg b/docs/assets/img/search.83621669.svg deleted file mode 100644 index 03d8391..0000000 --- a/docs/assets/img/search.83621669.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/assets/js/10.95ba08b2.js b/docs/assets/js/10.95ba08b2.js deleted file mode 100644 index 0405d2e..0000000 --- a/docs/assets/js/10.95ba08b2.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[10],{315:function(t,e,a){t.exports=a.p+"assets/img/image-20190722223454676.b545b43f.png"},316:function(t,e,a){t.exports=a.p+"assets/img/image-20190722223551308.ed106a2a.png"},317:function(t,e,a){t.exports=a.p+"assets/img/image-20190722223605920.3e762b29.png"},318:function(t,e,a){t.exports=a.p+"assets/img/image-20190722231246540.ebf13194.png"},319:function(t,e,a){t.exports=a.p+"assets/img/image-20190722224029397.abc44209.png"},320:function(t,e,a){t.exports=a.p+"assets/img/image-20190722225347491.984fabae.png"},321:function(t,e,a){t.exports=a.p+"assets/img/image-20190722225454029.73400267.png"},322:function(t,e,a){t.exports=a.p+"assets/img/image-20190722230511430.ed459354.png"},380: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(315),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(316),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(317),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(318),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(319),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(320),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(321),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(322),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.32fc5ebf.js b/docs/assets/js/11.32fc5ebf.js deleted file mode 100644 index ac6a930..0000000 --- a/docs/assets/js/11.32fc5ebf.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[11],{141:function(t,e,i){},143:function(t,e,i){},208:function(t,e,i){t.exports=i.p+"assets/img/kuboard_qq.45e78dbf.png"},209:function(t,e,i){t.exports=i.p+"assets/img/image-20190723104717575.f44900d3.png"},210:function(t,e,i){"use strict";var s=i(141);i.n(s).a},212:function(t,e,i){"use strict";var s=i(143);i.n(s).a},353:function(t,e,i){"use strict";var s=i(161),a=i(208),n=i.n(a),r=i(209),o=i.n(r),l={name:"Sidebar",props:["items"],components:{SidebarLinks:s.default},data:function(){return{kuboard_qq_img:n.a,demo_img:o.a}}},c=(i(210),i(0)),v=Object(c.a)(l,function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("aside",{staticClass:"sidebar"},[t._t("top"),t._v(" "),i("SidebarLinks",{attrs:{depth:0,items:t.items}}),t._v(" "),t._t("bottom"),t._v(" "),i("div",{staticStyle:{"text-align":"center","margin-top":"5vh"}},[i("strong",[t._v("在线体验")]),t._v(" "),i("div",[i("a",{attrs:{target:"_blank",href:"http://demo.eip.work/#/login?isReadOnly=true&token="+t.$site.themeConfig.kuboardToken}},[i("p",[i("img",{staticStyle:{width:"226px",height:"127px"},attrs:{src:t.demo_img}})])])]),t._v(" "),t._m(0),t._v(" "),i("strong",[t._v("在线提问")]),t._v(" "),i("p",[i("img",{attrs:{src:t.kuboard_qq_img}})])])],2)},[function(){var t=this.$createElement,e=this._self._c||t;return e("p",[e("strong",[e("a",{attrs:{href:"https://github.com/shaohq/kuboard-issues/issues",target:"_blank"}},[this._v("提交 BUG")])])])}],!1,null,null,null);e.a=v.exports},356:function(t,e,i){"use strict";i.r(e);i(38);var s={components:{ParentLayout:i(352).a},methods:{activeLinkStyle:function(t){return 0===this.$page.path.indexOf(t)?"border-bottom: 2px solid #0b85ff;":""}}},a=(i(212),i(0)),n=Object(a.a)(s,function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("ParentLayout",[i("div",{attrs:{slot:"sidebar-top"},slot:"sidebar-top"},[i("div",{staticStyle:{"text-align":"center","margin-top":"20px"}},[i("div",{staticClass:"side-nav-item",style:t.activeLinkStyle("/overview/")+"margin-left: 0;"},[i("a",{staticClass:"nav-link",attrs:{href:"/overview/"}},[t._v("简介")])]),t._v(" "),i("div",{staticClass:"side-nav-item",style:t.activeLinkStyle("/install/")},[i("a",{staticClass:"nav-link router-link-exact-active router-link-active",attrs:{href:"/install/install-dashboard"}},[t._v("安装")])]),t._v(" "),i("div",{staticClass:"side-nav-item",style:t.activeLinkStyle("/guide/")},[i("a",{staticClass:"nav-link",attrs:{href:"/guide/"}},[t._v("使用")])]),t._v(" "),i("div",{staticClass:"side-nav-item",style:t.activeLinkStyle("/micro-service/")},[i("a",{staticClass:"nav-link",attrs:{href:"/micro-service/spring-cloud/"}},[t._v("微服务")])])])]),t._v(" "),i("div",{staticClass:"bottom-description",attrs:{slot:"page-bottom"},slot:"page-bottom"},[t._v("Copyright © 2019-present Huanqing Shao | 京ICP备19008693号-2")])])},[],!1,null,"73c41bb9",null);e.default=n.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/12.fd26a3df.js b/docs/assets/js/12.fd26a3df.js deleted file mode 100644 index 4370f05..0000000 --- a/docs/assets/js/12.fd26a3df.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[12],{216:function(t,a,e){t.exports=e.p+"assets/img/image-20190723105606081.bc471512.png"},217:function(t,a,e){t.exports=e.p+"assets/img/image-20190723105644937.968b1660.png"},218:function(t,a,e){t.exports=e.p+"assets/img/image-20190723105722999.5b6c9bae.png"},219:function(t,a,e){t.exports=e.p+"assets/img/image-20190723105748435.1cb3ad0d.png"},220:function(t,a,e){t.exports=e.p+"assets/img/image-20190723105809872.61add376.png"},221:function(t,a,e){t.exports=e.p+"assets/img/image-20190723105830318.43414c56.png"},377: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(216),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(217),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(218),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(219),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(220),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(221),alt:"image-20190723105830318"}})])])},[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/13.5ae79232.js b/docs/assets/js/13.5ae79232.js deleted file mode 100644 index 11a7206..0000000 --- a/docs/assets/js/13.5ae79232.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[13],{301:function(a,t,s){a.exports=s.p+"assets/img/image-20190721085144545.25f25dda.png"},302:function(a,t,s){a.exports=s.p+"assets/img/image-20190721090118542.46c31055.png"},303:function(a,t,s){a.exports=s.p+"assets/img/image-20190721090753742.28d009f3.png"},304:function(a,t,s){a.exports=s.p+"assets/img/image-20190721090840925.a5231632.png"},305:function(a,t,s){a.exports=s.p+"assets/img/image-20190721090935511.80fb3864.png"},306:function(a,t,s){a.exports=s.p+"assets/img/image-20190721091005130.330e9f1d.png"},374: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(301),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(302),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(303),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(304),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(305),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(306),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.71b75ecf.js b/docs/assets/js/14.71b75ecf.js deleted file mode 100644 index acf1bae..0000000 --- a/docs/assets/js/14.71b75ecf.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[14],{327:function(e,A,t){e.exports=t.p+"assets/img/d7ce07842371eab180725bab5164ec17.d58ea9cc.png"},328:function(e,A){e.exports="data:image/png;base64,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"},329:function(e,A){e.exports="data:image/png;base64,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"},330:function(e,A){e.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAhCAYAAAC4JqlRAAAKQWlDQ1BJQ0MgUHJvZmlsZQAASA2dlndUU9kWh8+9N73QEiIgJfQaegkg0jtIFQRRiUmAUAKGhCZ2RAVGFBEpVmRUwAFHhyJjRRQLg4Ji1wnyEFDGwVFEReXdjGsJ7601896a/cdZ39nnt9fZZ+9917oAUPyCBMJ0WAGANKFYFO7rwVwSE8vE9wIYEAEOWAHA4WZmBEf4RALU/L09mZmoSMaz9u4ugGS72yy/UCZz1v9/kSI3QyQGAApF1TY8fiYX5QKUU7PFGTL/BMr0lSkyhjEyFqEJoqwi48SvbPan5iu7yZiXJuShGlnOGbw0noy7UN6aJeGjjAShXJgl4GejfAdlvVRJmgDl9yjT0/icTAAwFJlfzOcmoWyJMkUUGe6J8gIACJTEObxyDov5OWieAHimZ+SKBIlJYqYR15hp5ejIZvrxs1P5YjErlMNN4Yh4TM/0tAyOMBeAr2+WRQElWW2ZaJHtrRzt7VnW5mj5v9nfHn5T/T3IevtV8Sbsz55BjJ5Z32zsrC+9FgD2JFqbHbO+lVUAtG0GQOXhrE/vIADyBQC03pzzHoZsXpLE4gwnC4vs7GxzAZ9rLivoN/ufgm/Kv4Y595nL7vtWO6YXP4EjSRUzZUXlpqemS0TMzAwOl89k/fcQ/+PAOWnNycMsnJ/AF/GF6FVR6JQJhIlou4U8gViQLmQKhH/V4X8YNicHGX6daxRodV8AfYU5ULhJB8hvPQBDIwMkbj96An3rWxAxCsi+vGitka9zjzJ6/uf6Hwtcim7hTEEiU+b2DI9kciWiLBmj34RswQISkAd0oAo0gS4wAixgDRyAM3AD3iAAhIBIEAOWAy5IAmlABLJBPtgACkEx2AF2g2pwANSBetAEToI2cAZcBFfADXALDIBHQAqGwUswAd6BaQiC8BAVokGqkBakD5lC1hAbWgh5Q0FQOBQDxUOJkBCSQPnQJqgYKoOqoUNQPfQjdBq6CF2D+qAH0CA0Bv0BfYQRmALTYQ3YALaA2bA7HAhHwsvgRHgVnAcXwNvhSrgWPg63whfhG/AALIVfwpMIQMgIA9FGWAgb8URCkFgkAREha5EipAKpRZqQDqQbuY1IkXHkAwaHoWGYGBbGGeOHWYzhYlZh1mJKMNWYY5hWTBfmNmYQM4H5gqVi1bGmWCesP3YJNhGbjS3EVmCPYFuwl7ED2GHsOxwOx8AZ4hxwfrgYXDJuNa4Etw/XjLuA68MN4SbxeLwq3hTvgg/Bc/BifCG+Cn8cfx7fjx/GvyeQCVoEa4IPIZYgJGwkVBAaCOcI/YQRwjRRgahPdCKGEHnEXGIpsY7YQbxJHCZOkxRJhiQXUiQpmbSBVElqIl0mPSa9IZPJOmRHchhZQF5PriSfIF8lD5I/UJQoJhRPShxFQtlOOUq5QHlAeUOlUg2obtRYqpi6nVpPvUR9Sn0vR5Mzl/OX48mtk6uRa5Xrl3slT5TXl3eXXy6fJ18hf0r+pvy4AlHBQMFTgaOwVqFG4bTCPYVJRZqilWKIYppiiWKD4jXFUSW8koGStxJPqUDpsNIlpSEaQtOledK4tE20Otpl2jAdRzek+9OT6cX0H+i99AllJWVb5SjlHOUa5bPKUgbCMGD4M1IZpYyTjLuMj/M05rnP48/bNq9pXv+8KZX5Km4qfJUilWaVAZWPqkxVb9UU1Z2qbapP1DBqJmphatlq+9Uuq43Pp893ns+dXzT/5PyH6rC6iXq4+mr1w+o96pMamhq+GhkaVRqXNMY1GZpumsma5ZrnNMe0aFoLtQRa5VrntV4wlZnuzFRmJbOLOaGtru2nLdE+pN2rPa1jqLNYZ6NOs84TXZIuWzdBt1y3U3dCT0svWC9fr1HvoT5Rn62fpL9Hv1t/ysDQINpgi0GbwaihiqG/YZ5ho+FjI6qRq9Eqo1qjO8Y4Y7ZxivE+41smsImdSZJJjclNU9jU3lRgus+0zwxr5mgmNKs1u8eisNxZWaxG1qA5wzzIfKN5m/krCz2LWIudFt0WXyztLFMt6ywfWSlZBVhttOqw+sPaxJprXWN9x4Zq42Ozzqbd5rWtqS3fdr/tfTuaXbDdFrtOu8/2DvYi+yb7MQc9h3iHvQ732HR2KLuEfdUR6+jhuM7xjOMHJ3snsdNJp9+dWc4pzg3OowsMF/AX1C0YctFx4bgccpEuZC6MX3hwodRV25XjWuv6zE3Xjed2xG3E3dg92f24+ysPSw+RR4vHlKeT5xrPC16Il69XkVevt5L3Yu9q76c+Oj6JPo0+E752vqt9L/hh/QL9dvrd89fw5/rX+08EOASsCegKpARGBFYHPgsyCRIFdQTDwQHBu4IfL9JfJFzUFgJC/EN2hTwJNQxdFfpzGC4sNKwm7Hm4VXh+eHcELWJFREPEu0iPyNLIR4uNFksWd0bJR8VF1UdNRXtFl0VLl1gsWbPkRoxajCCmPRYfGxV7JHZyqffS3UuH4+ziCuPuLjNclrPs2nK15anLz66QX8FZcSoeGx8d3xD/iRPCqeVMrvRfuXflBNeTu4f7kufGK+eN8V34ZfyRBJeEsoTRRJfEXYljSa5JFUnjAk9BteB1sl/ygeSplJCUoykzqdGpzWmEtPi000IlYYqwK10zPSe9L8M0ozBDuspp1e5VE6JA0ZFMKHNZZruYjv5M9UiMJJslg1kLs2qy3mdHZZ/KUcwR5vTkmuRuyx3J88n7fjVmNXd1Z752/ob8wTXuaw6thdauXNu5Tnddwbrh9b7rj20gbUjZ8MtGy41lG99uit7UUaBRsL5gaLPv5sZCuUJR4b0tzlsObMVsFWzt3WazrWrblyJe0fViy+KK4k8l3JLr31l9V/ndzPaE7b2l9qX7d+B2CHfc3em681iZYlle2dCu4F2t5czyovK3u1fsvlZhW3FgD2mPZI+0MqiyvUqvakfVp+qk6oEaj5rmvep7t+2d2sfb17/fbX/TAY0DxQc+HhQcvH/I91BrrUFtxWHc4azDz+ui6rq/Z39ff0TtSPGRz0eFR6XHwo911TvU1zeoN5Q2wo2SxrHjccdv/eD1Q3sTq+lQM6O5+AQ4ITnx4sf4H++eDDzZeYp9qukn/Z/2ttBailqh1tzWibakNml7THvf6YDTnR3OHS0/m/989Iz2mZqzymdLz5HOFZybOZ93fvJCxoXxi4kXhzpXdD66tOTSna6wrt7LgZevXvG5cqnbvfv8VZerZ645XTt9nX297Yb9jdYeu56WX+x+aem172296XCz/ZbjrY6+BX3n+l37L972un3ljv+dGwOLBvruLr57/17cPel93v3RB6kPXj/Mejj9aP1j7OOiJwpPKp6qP6391fjXZqm99Oyg12DPs4hnj4a4Qy//lfmvT8MFz6nPK0a0RupHrUfPjPmM3Xqx9MXwy4yX0+OFvyn+tveV0auffnf7vWdiycTwa9HrmT9K3qi+OfrW9m3nZOjk03dp76anit6rvj/2gf2h+2P0x5Hp7E/4T5WfjT93fAn88ngmbWbm3/eE8/syOll+AAAACXBIWXMAAAsTAAALEwEAmpwYAAAB1WlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS40LjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx0aWZmOkNvbXByZXNzaW9uPjE8L3RpZmY6Q29tcHJlc3Npb24+CiAgICAgICAgIDx0aWZmOlBob3RvbWV0cmljSW50ZXJwcmV0YXRpb24+MjwvdGlmZjpQaG90b21ldHJpY0ludGVycHJldGF0aW9uPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KOXS2agAAAWdJREFUWAntk91NhUAUhC8WYB92YQEWYQhWYLQKW4AnOrAA+7AGn3khAXeu+ZIJOfws8mAim9x7dmfnzAy7cLmc4zyB/34CxdwBtG172/f9+3R/HMfPsiyfhDdN8zoMw12aflVV9TLlblmHAeq6fi6K4m1NIAW59qcgI1ww1mv1JiIk84cIn2IYuynYlDu3DgM4WeL8HGeO4d4QqwEwWqq/CXFIAIXbGyJ8CZPYR9K8l3Du4CoIpH6wSOuwE0AcYzcFg+M1DNB13aOTcucYbgkRXoEMEck1dz4BXAsM3mwAEbyRhtyKoWuBSSu8AkycCJZbMXathOklv47FAGJ440/Lsf+LV+BWPIljW+Y8gPeDqX9zAJFdROu1gZH3gdGbFUBNLoZIVDFyPpjzswOo2UVdjDlGzgODQ90VQM0ujpgqRr4P5jzmuwNIwE20xshxMO1HY/UzjJrAXNzn0T7YWc8TOE/gz53AN34Bn5aWTdpfAAAAAElFTkSuQmCC"},331:function(e,A,t){e.exports=t.p+"assets/img/03d07039d9fc80c0f692d6176f65936e.7af9fab5.gif"},332:function(e,A,t){e.exports=t.p+"assets/img/e7a273fcdc03d2417b354b60c253552f.19ae82d9.gif"},376:function(e,A,t){"use strict";t.r(A);var r=t(0),l=Object(r.a)({},function(){var e=this,A=e.$createElement,r=e._self._c||A;return r("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[r("h1",{attrs:{id:"十分钟带你理解kubernetes核心概念"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#十分钟带你理解kubernetes核心概念","aria-hidden":"true"}},[e._v("#")]),e._v(" 十分钟带你理解Kubernetes核心概念")]),e._v(" "),r("blockquote",[r("p",[e._v("转载信息:")]),e._v(" "),r("p",[r("a",{attrs:{href:"http://www.dockone.io/article/932",target:"_blank",rel:"noopener noreferrer"}},[e._v("译文链接"),r("OutboundLink")],1),e._v(" 译者:崔婧雯")]),e._v(" "),r("p",[r("a",{attrs:{href:"http://omerio.com/2015/12/18/learn-the-kubernetes-key-concepts-in-10-minutes/",target:"_blank",rel:"noopener noreferrer"}},[e._v("原文链接"),r("OutboundLink")],1),e._v(" 作者:Omer Dawelbeit")])]),e._v(" "),r("p",[e._v("本文将会简单介绍Kubernetes的核心概念。因为这些定义可以在Kubernetes的文档中找到,所以文章也会避免用大段的枯燥的文字介绍。相反,我们会使用一些图表(其中一些是动画)和示例来解释这些概念。我们发现一些概念(比如Service)如果没有图表的辅助就很难全面地理解。在合适的地方我们也会提供Kubernetes文档的链接以便读者深入学习。")]),e._v(" "),r("h2",{attrs:{id:"什么是kubernetes?"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#什么是kubernetes?","aria-hidden":"true"}},[e._v("#")]),e._v(" 什么是Kubernetes?")]),e._v(" "),r("p",[e._v("Kubernetes(k8s)是自动化容器操作的开源平台,这些操作包括部署,调度和节点集群间扩展。如果你曾经用过Docker容器技术部署容器,那么可以将Docker看成Kubernetes内部使用的低级别组件。Kubernetes不仅仅支持Docker,还支持Rocket,这是另一种容器技术。\n使用Kubernetes可以:")]),e._v(" "),r("ul",[r("li",[e._v("自动化容器的部署和复制")]),e._v(" "),r("li",[e._v("随时扩展或收缩容器规模")]),e._v(" "),r("li",[e._v("将容器组织成组,并且提供容器间的负载均衡")]),e._v(" "),r("li",[e._v("很容易地升级应用程序容器的新版本")]),e._v(" "),r("li",[e._v("提供容器弹性,如果容器失效就替换它,等等...")])]),e._v(" "),r("h2",{attrs:{id:"集群"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#集群","aria-hidden":"true"}},[e._v("#")]),e._v(" 集群")]),e._v(" "),r("p",[e._v("集群是一组节点,这些节点可以是物理服务器或者虚拟机,之上安装了Kubernetes平台。下图展示这样的集群。注意该图为了强调核心概念有所简化。这里可以看到一个典型的Kubernetes架构图。")]),e._v(" "),r("p",[r("img",{attrs:{src:t(327),alt:"1.png"}})]),e._v(" "),r("p",[e._v("上图可以看到如下组件,使用特别的图标表示Service和Label:")]),e._v(" "),r("ul",[r("li",[e._v("PodContainer(容器)")]),e._v(" "),r("li",[e._v("Label("),r("img",{attrs:{src:t(328),alt:"label"}}),e._v(")(标签)")]),e._v(" "),r("li",[e._v("Replication Controller(复制控制器)")]),e._v(" "),r("li",[e._v("Service("),r("img",{attrs:{src:t(329),alt:"enter image description here"}}),e._v(")(服务)")]),e._v(" "),r("li",[e._v("Node(节点)")]),e._v(" "),r("li",[e._v("Kubernetes Master(Kubernetes主节点)")])]),e._v(" "),r("h2",{attrs:{id:"pod"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#pod","aria-hidden":"true"}},[e._v("#")]),e._v(" Pod")]),e._v(" "),r("p",[r("a",{attrs:{href:"https://kubernetes.io/docs/concepts/workloads/pods/pod-overview/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Pod"),r("OutboundLink")],1),e._v("(上图绿色方框)安排在节点上,包含一组容器和卷。同一个Pod里的容器共享同一个网络命名空间,可以使用localhost互相通信。Pod是短暂的,不是持续性实体。你可能会有这些问题:")]),e._v(" "),r("ul",[r("li",[e._v("如果Pod是短暂的,那么我怎么才能持久化容器数据使其能够跨重启而存在呢? 是的,Kubernetes支持 "),r("em",[r("strong",[e._v("卷")])]),e._v(" 的概念,因此可以使用持久化的卷类型。")]),e._v(" "),r("li",[e._v("是否手动创建Pod,如果想要创建同一个容器的多份拷贝,需要一个个分别创建出来么?可以手动创建单个Pod,但是也可以使用Replication Controller使用Pod模板创建出多份拷贝,下文会详细介绍。")]),e._v(" "),r("li",[e._v("如果Pod是短暂的,那么重启时IP地址可能会改变,那么怎么才能从前端容器正确可靠地指向后台容器呢?这时可以使用Service,下文会详细介绍。")])]),e._v(" "),r("h2",{attrs:{id:"label"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#label","aria-hidden":"true"}},[e._v("#")]),e._v(" Label")]),e._v(" "),r("p",[e._v("正如图所示,一些Pod有Label("),r("img",{attrs:{src:t(330),alt:"enter image description here"}}),e._v(')。一个Label是attach到Pod的一对键/值对,用来传递用户定义的属性。比如,你可能创建了一个"tier"和“app”标签,通过Label('),r("strong",[e._v("tier=frontend, app=myapp")]),e._v(")来标记前端Pod容器,使用Label("),r("strong",[e._v("tier=backend, app=myapp")]),e._v(")标记后台Pod。然后可以使用 "),r("a",{attrs:{href:"https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Selectors"),r("OutboundLink")],1),e._v(" 选择带有特定Label的Pod,并且将Service或者Replication Controller应用到上面。")]),e._v(" "),r("h2",{attrs:{id:"replication-controller"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#replication-controller","aria-hidden":"true"}},[e._v("#")]),e._v(" Replication Controller")]),e._v(" "),r("p",[r("em",[e._v("是否手动创建Pod,如果想要创建同一个容器的多份拷贝,需要一个个分别创建出来么,能否将Pods划到逻辑组里?")])]),e._v(" "),r("p",[e._v("Replication Controller确保任意时间都有指定数量的Pod“副本”在运行。如果为某个Pod创建了Replication Controller并且指定3个副本,它会创建3个Pod,并且持续监控它们。如果某个Pod不响应,那么Replication Controller会替换它,保持总数为3.如下面的动画所示:")]),e._v(" "),r("p",[r("img",{attrs:{src:t(331),alt:"2.gif"}})]),e._v(" "),r("p",[e._v("如果之前不响应的Pod恢复了,现在就有4个Pod了,那么Replication Controller会将其中一个终止保持总数为3。如果在运行中将副本总数改为5,Replication Controller会立刻启动2个新Pod,保证总数为5。还可以按照这样的方式缩小Pod,这个特性在执行滚动 "),r("a",{attrs:{href:"https://kubernetes.io/docs/concepts/workloads/controllers/replicationcontroller/#rolling_updates",target:"_blank",rel:"noopener noreferrer"}},[e._v("升级"),r("OutboundLink")],1),e._v(" 时很有用。")]),e._v(" "),r("p",[e._v("当创建Replication Controller时,需要指定两个东西:")]),e._v(" "),r("ol",[r("li",[e._v("Pod模板:用来创建Pod副本的模板")]),e._v(" "),r("li",[e._v("Label:Replication Controller需要监控的Pod的标签。现在已经创建了Pod的一些副本,那么在这些副本上如何均衡负载呢?我们需要的是Service。")])]),e._v(" "),r("div",{staticClass:"tip custom-block"},[r("p",[e._v("最新 Kubernetes 版本里,推荐使用 Deployment")])]),e._v(" "),r("h2",{attrs:{id:"service"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#service","aria-hidden":"true"}},[e._v("#")]),e._v(" Service")]),e._v(" "),r("p",[r("em",[e._v("如果Pods是短暂的,那么重启时IP地址可能会改变,怎么才能从前端容器正确可靠地指向后台容器呢?")]),e._v(" "),r("a",{attrs:{href:"https://kubernetes.io/docs/concepts/services-networking/service/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Service"),r("OutboundLink")],1),e._v(" "),r("strong",[e._v("抽象")]),e._v("\n现在,假定有2个后台Pod,并且定义后台Service的名称为‘backend-service’,lable选择器为()。 的Service会完成如下两件重要的事情:")]),e._v(" "),r("ul",[r("li",[e._v("会为Service创建一个本地集群的DNS入口,因此前端Pod只需要DNS查找主机名为 ‘backend-service’,就能够解析出前端应用程序可用的IP地址。")]),e._v(" "),r("li",[e._v("现在前端已经得到了后台服务的IP地址,但是它应该访问2个后台Pod的哪一个呢?Service在这2个后台Pod之间提供透明的负载均衡,会将请求分发给其中的任意一个(如下面的动画所示)。通过每个Node上运行的代理(kube-proxy)完成。")])]),e._v(" "),r("p",[e._v("下述动画展示了Service的功能。注意该图作了很多简化。如果不进入网络配置,那么达到透明的负载均衡目标所涉及的底层网络和路由相对先进。如果有兴趣,有更深入的介绍。")]),e._v(" "),r("p",[r("img",{attrs:{src:t(332),alt:"3.gif"}})]),e._v(" "),r("p",[e._v("每个节点都运行如下Kubernetes关键组件:")]),e._v(" "),r("ul",[r("li",[e._v("Kubelet:是主节点代理。")]),e._v(" "),r("li",[e._v("Kube-proxy:Service使用其将链接路由到Pod,如上文所述。")]),e._v(" "),r("li",[e._v("Docker或Rocket:Kubernetes使用的容器技术来创建容器。")])]),e._v(" "),r("h3",{attrs:{id:"kubernetes-master"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#kubernetes-master","aria-hidden":"true"}},[e._v("#")]),e._v(" Kubernetes Master")]),e._v(" "),r("p",[e._v("集群拥有一个Kubernetes Master(紫色方框)。Kubernetes Master提供集群的独特视角,并且拥有一系列组件,比如Kubernetes API Server。API Server提供可以用来和集群交互的REST端点。master节点包括用来创建和复制Pod的Replication Controller。")])])},[],!1,null,null,null);A.default=l.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/15.f69e0361.js b/docs/assets/js/15.f69e0361.js deleted file mode 100644 index c40e082..0000000 --- a/docs/assets/js/15.f69e0361.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[15],{111:function(t,a,_){t.exports=_.p+"assets/img/image-20190721110355464.25f25dda.png"},297:function(t,a,_){t.exports=_.p+"assets/img/image-20190721112353077.b907aa89.png"},298:function(t,a,_){t.exports=_.p+"assets/img/image-20190721112624128.7aa6b8f1.png"},299:function(t,a,_){t.exports=_.p+"assets/img/image-20190721113050608.97e0f110.png"},300:function(t,a,_){t.exports=_.p+"assets/img/image-20190721113155991.f3ecd62f.png"},372: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:_(111),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:_(297),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:_(298),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:_(299),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:_(300),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/16.b573c9f3.js b/docs/assets/js/16.b573c9f3.js deleted file mode 100644 index 1b7ae93..0000000 --- a/docs/assets/js/16.b573c9f3.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[16],{111:function(t,a,v){t.exports=v.p+"assets/img/image-20190721110355464.25f25dda.png"},307:function(t,a,v){t.exports=v.p+"assets/img/image-20190721113708689.f9b42a11.png"},308:function(t,a,v){t.exports=v.p+"assets/img/image-20190721113810235.59d55672.png"},309:function(t,a,v){t.exports=v.p+"assets/img/image-20190721114112644.526de44c.png"},310:function(t,a,v){t.exports=v.p+"assets/img/image-20190721114211751.e1a07115.png"},375: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(111),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(307),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(308),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(309),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(310),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/17.da6085e6.js b/docs/assets/js/17.da6085e6.js deleted file mode 100644 index 4788e4a..0000000 --- a/docs/assets/js/17.da6085e6.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[17],{111:function(t,e,r){t.exports=r.p+"assets/img/image-20190721110355464.25f25dda.png"},311:function(t,e,r){t.exports=r.p+"assets/img/image-20190721110543437.8cbe188d.png"},312:function(t,e,r){t.exports=r.p+"assets/img/image-20190721111011798.b9cc73b4.png"},313:function(t,e,r){t.exports=r.p+"assets/img/image-20190721111540512.b0a58451.png"},314:function(t,e,r){t.exports=r.p+"assets/img/image-20190721111642221.f9c06dc3.png"},378: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(111),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(311),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(312),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(313),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(314),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/18.14596f73.js b/docs/assets/js/18.14596f73.js deleted file mode 100644 index 710ae7c..0000000 --- a/docs/assets/js/18.14596f73.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[18],{112:function(s,t,e){s.exports=e.p+"assets/img/image-20190715085036593.55559549.png"},113:function(s,t,e){s.exports=e.p+"assets/img/image2019-07-15_09.01.21.0e0d34f2.png"},336:function(s,t,e){s.exports=e.p+"assets/img/image-20190726214032585.f5bc62e4.png"},337:function(s,t,e){s.exports=e.p+"assets/img/image-20190715101542756.5934c00e.png"},338:function(s,t,e){s.exports=e.p+"assets/img/image-20190715193838012.eca23618.png"},360:function(s,t,e){"use strict";e.r(t);var a=e(0),r=Object(a.a)({},function(){var s=this,t=s.$createElement,a=s._self._c||t;return a("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[a("h1",{attrs:{id:"安装-kubernetes-单master节点"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#安装-kubernetes-单master节点","aria-hidden":"true"}},[s._v("#")]),s._v(" 安装 Kubernetes 单Master节点")]),s._v(" "),a("p",[s._v("对于 Kubernetes 初学者,推荐在阿里云采购如下配置:")]),s._v(" "),a("ul",[a("li",[s._v("3台 2核4G 的ECS(突发性能实例 t5 ecs.t5-c1m2.large或同等配置,单台约 0.4元/小时,停机时不收费)")]),s._v(" "),a("li",[s._v("Cent OS 7.6")])]),s._v(" "),a("p",[a("a",{attrs:{href:"https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=obezo3pg",target:"_blank",rel:"noopener noreferrer"}},[s._v("领取阿里云最高2000元红包"),a("OutboundLink")],1)]),s._v(" "),a("p",[s._v("Kuboard 的 Live Demo 环境使用的是如下拓扑结构,本文档描述了如何在完成该 demo 环境的搭建。")]),s._v(" "),a("p",[s._v("完成安装后,对应的软件版本为:")]),s._v(" "),a("ul",[a("li",[s._v("Kubernetes v1.15.0")]),s._v(" "),a("li",[s._v("Docker 18.09.7")])]),s._v(" "),a("p",[a("img",{attrs:{src:e(336),alt:"image-20190726214032585"}})]),s._v(" "),a("h2",{attrs:{id:"制作标准机镜像"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#制作标准机镜像","aria-hidden":"true"}},[s._v("#")]),s._v(" 制作标准机镜像")]),s._v(" "),a("p",[s._v("通过使用标准机镜像,可以")]),s._v(" "),a("ul",[a("li",[a("strong",[s._v("避免重复执行对测试机安装必要软件的过程")])]),s._v(" "),a("li",[a("strong",[s._v("以一种相对标准化的过程管理测试机的维护")])])]),s._v(" "),a("p",[s._v("标准机镜像中预装了如下内容:")]),s._v(" "),a("ul",[a("li",[s._v("docker")]),s._v(" "),a("li",[s._v("nfs-utils")]),s._v(" "),a("li",[s._v("kubernetes images")])]),s._v(" "),a("div",{staticClass:"tip custom-block"},[a("ul",[a("li",[s._v("您也可以不制作标准机镜像,而是在三台机器上都执行 "),a("em",[a("strong",[s._v("制作标准机镜像")])]),s._v(" 中的所有操作步骤")])])]),s._v(" "),a("p",[a("strong",[s._v("标准机镜像的制作过程描述如下:")])]),s._v(" "),a("h3",{attrs:{id:"安装docker"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#安装docker","aria-hidden":"true"}},[s._v("#")]),s._v(" 安装docker")]),s._v(" "),a("p",[a("strong",[s._v("卸载旧版本")])]),s._v(" "),a("div",{staticClass:"language-sh extra-class"},[a("pre",{pre:!0,attrs:{class:"language-sh"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 在 master 节点和 worker 节点都要执行")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" yum remove docker "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n\tdocker-client "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n\tdocker-client-latest "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n\tdocker-common "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n\tdocker-latest "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n\tdocker-latest-logrotate "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n\tdocker-logrotate "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n\tdocker-selinux "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n\tdocker-engine-selinux "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n\tdocker-engine\n")])])]),a("p",[a("strong",[s._v("下载依赖包及安装包")])]),s._v(" "),a("div",{staticClass:"language-sh extra-class"},[a("pre",{pre:!0,attrs:{class:"language-sh"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 在 master 节点和 worker 节点都要执行")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("wget")]),s._v(" https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("wget")]),s._v(" https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-cli-18.09.7-3.el7.x86_64.rpm\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("wget")]),s._v(" https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-18.09.7-3.el7.x86_64.rpm\n")])])]),a("p",[a("strong",[s._v("安装")])]),s._v(" "),a("div",{staticClass:"language-sh extra-class"},[a("pre",{pre:!0,attrs:{class:"language-sh"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 在 master 节点和 worker 节点都要执行")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" yum "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" -y containerd.io-1.2.6-3.3.el7.x86_64.rpm\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" yum "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" -y docker-ce-cli-18.09.7-3.el7.x86_64.rpm\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" yum "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" -y docker-ce-18.09.7-3.el7.x86_64.rpm\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" systemctl "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("enable")]),s._v(" docker\n")])])]),a("p",[a("strong",[s._v("启动 docker 服务")])]),s._v(" "),a("div",{staticClass:"language-sh extra-class"},[a("pre",{pre:!0,attrs:{class:"language-sh"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 在 master 节点和 worker 节点都要执行")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" systemctl start docker\n")])])]),a("p",[a("strong",[s._v("检查 docker 版本")])]),s._v(" "),a("div",{staticClass:"language-sh extra-class"},[a("pre",{pre:!0,attrs:{class:"language-sh"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 在 master 节点和 worker 节点都要执行")]),s._v("\ndocker version\n")])])]),a("blockquote",[a("p",[a("strong",[s._v("参考文档")])]),s._v(" "),a("p",[s._v("https://docs.docker.com/install/linux/docker-ce/centos/")]),s._v(" "),a("p",[s._v("https://docs.docker.com/install/linux/linux-postinstall/")])]),s._v(" "),a("h3",{attrs:{id:"安装-nfs-utils"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#安装-nfs-utils","aria-hidden":"true"}},[s._v("#")]),s._v(" 安装 nfs-utils")]),s._v(" "),a("p",[a("strong",[s._v("执行安装命令")])]),s._v(" "),a("div",{staticClass:"language-sh extra-class"},[a("pre",{pre:!0,attrs:{class:"language-sh"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 在 master 节点和 worker 节点都要执行")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" yum "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" -y nfs-utils\n")])])]),a("p",[s._v("必须先安装 nfs-utils 才能挂载 nfs 网络存储")]),s._v(" "),a("h3",{attrs:{id:"k8s基本配置"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#k8s基本配置","aria-hidden":"true"}},[s._v("#")]),s._v(" K8S基本配置")]),s._v(" "),a("p",[a("strong",[s._v("配置K8S的yum源")])]),s._v(" "),a("div",{staticClass:"language-sh extra-class"},[a("pre",{pre:!0,attrs:{class:"language-sh"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 在 master 节点和 worker 节点都要执行")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("cat")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<<")]),s._v("EOF "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" /etc/yum.repos.d/kubernetes.repo\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("kubernetes"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("name")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("Kubernetes\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("baseurl")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("enabled")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("gpgcheck")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("repo_gpgcheck")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("gpgkey")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._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")])])]),a("p",[a("strong",[s._v("关闭 防火墙、SeLinux、swap")])]),s._v(" "),a("div",{staticClass:"language-sh extra-class"},[a("pre",{pre:!0,attrs:{class:"language-sh"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 在 master 节点和 worker 节点都要执行")]),s._v("\nsystemctl stop firewalld\nsystemctl disable firewalld\n\nsetenforce "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("sed")]),s._v(" -i "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"s/SELINUX=enforcing/SELINUX=disabled/g"')]),s._v(" /etc/selinux/config\n\nswapoff -a\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("yes")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("cp")]),s._v(" /etc/fstab /etc/fstab_bak\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("cat")]),s._v(" /etc/fstab_bak "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("grep")]),s._v(" -v swap "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" /etc/fstab\n")])])]),a("p",[a("strong",[s._v("修改 /etc/sysctl.conf")])]),s._v(" "),a("div",{staticClass:"language-sh extra-class"},[a("pre",{pre:!0,attrs:{class:"language-sh"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 在 master 节点和 worker 节点都要执行")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("vim")]),s._v(" /etc/sysctl.conf\n")])])]),a("p",[s._v("向其中添加")]),s._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[s._v("net.ipv4.ip_forward = 1\nnet.bridge.bridge-nf-call-ip6tables = 1\nnet.bridge.bridge-nf-call-iptables = 1\n")])])]),a("p",[s._v("如下图所示")]),s._v(" "),a("p",[a("img",{attrs:{src:e(112),alt:"image-20190715085036593",title:":size=600x445"}})]),s._v(" "),a("p",[s._v("执行命令以应用")]),s._v(" "),a("div",{staticClass:"language-sh extra-class"},[a("pre",{pre:!0,attrs:{class:"language-sh"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 在 master 节点和 worker 节点都要执行")]),s._v("\nsysctl -p\n")])])]),a("p",[a("strong",[s._v("安装kubelet、kubeadm、kubectl")])]),s._v(" "),a("div",{staticClass:"language-sh extra-class"},[a("pre",{pre:!0,attrs:{class:"language-sh"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 在 master 节点和 worker 节点都要执行")]),s._v("\nyum "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" -y kubelet-1.15.0 kubeadm-1.15.0 kubectl-1.15.0\n")])])]),a("p",[a("strong",[s._v("修改docker Cgroup Driver为systemd")])]),s._v(" "),a("div",{staticClass:"language-sh extra-class"},[a("pre",{pre:!0,attrs:{class:"language-sh"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 在 master 节点和 worker 节点都要执行")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("vim")]),s._v(" /usr/lib/systemd/system/docker.service\n")])])]),a("p",[s._v("向其中添加")]),s._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[s._v("--exec-opt native.cgroupdriver=systemd\n")])])]),a("p",[s._v("如下图所示")]),s._v(" "),a("p",[a("img",{attrs:{src:e(113),alt:"屏幕快照 2019-07-15 09.01.21",title:":size=1000x326"}})]),s._v(" "),a("p",[s._v("重启 docker")]),s._v(" "),a("div",{staticClass:"language-sh extra-class"},[a("pre",{pre:!0,attrs:{class:"language-sh"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 在 master 节点和 worker 节点都要执行")]),s._v("\nsystemctl daemon-reload\nsystemctl restart docker\n")])])]),a("p",[a("strong",[s._v("启动kubelet")])]),s._v(" "),a("div",{staticClass:"language-sh extra-class"},[a("pre",{pre:!0,attrs:{class:"language-sh"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 在 master 节点和 worker 节点都要执行")]),s._v("\nsystemctl "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("enable")]),s._v(" kubelet "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" systemctl start kubelet\n")])])]),a("p",[a("strong",[s._v("加载 kubernetes 镜像")])]),s._v(" "),a("p",[s._v("由于k8s服务相关镜像在国外镜像源,国内无法访问")]),s._v(" "),a("p",[s._v("执行以下命令添加docker k8s国内镜像源")]),s._v(" "),a("div",{staticClass:"language-sh extra-class"},[a("pre",{pre:!0,attrs:{class:"language-sh"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 在 master 节点和 worker 节点都要执行")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("curl")]),s._v(" -sSL https://get.daocloud.io/daotools/set_mirror.sh "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("sh")]),s._v(" -s http://f1361db2.m.daocloud.io\n\nsystemctl restart docker\n")])])]),a("p",[a("strong",[s._v("拉取k8s相关镜像")])]),s._v(" "),a("div",{staticClass:"language-sh extra-class"},[a("pre",{pre:!0,attrs:{class:"language-sh"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 在 master 节点和 worker 节点都要执行")]),s._v("\ndocker 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")])])]),a("p",[a("strong",[s._v("更改镜像名为k8s官网镜像")])]),s._v(" "),a("div",{staticClass:"language-sh extra-class"},[a("pre",{pre:!0,attrs:{class:"language-sh"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 在 master 节点和 worker 节点都要执行")]),s._v("\ndocker 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")])])]),a("p",[a("strong",[s._v("制作镜像")])]),s._v(" "),a("p",[s._v("请参考阿里云基于ECS "),a("a",{attrs:{href:"https://help.aliyun.com/document_detail/35109.html?spm=5176.2020520101.0.0.75fc4df5mtdFmV",target:"_blank",rel:"noopener noreferrer"}},[s._v("制作虚拟机镜像"),a("OutboundLink")],1),s._v(" 的文档")]),s._v(" "),a("h2",{attrs:{id:"初始化-master-节点"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#初始化-master-节点","aria-hidden":"true"}},[s._v("#")]),s._v(" 初始化 master 节点")]),s._v(" "),a("div",{staticClass:"tip custom-block"},[a("p",[s._v("以 root 身份在 demo-master-a-1 机器上执行")])]),s._v(" "),a("p",[a("strong",[s._v("配置 apiserver.demo 的域名")])]),s._v(" "),a("div",{staticClass:"language-sh extra-class"},[a("pre",{pre:!0,attrs:{class:"language-sh"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 只在 master 节点执行")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("echo")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"x.x.x.x apiserver.demo"')]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">>")]),s._v(" /etc/hosts\n")])])]),a("div",{staticClass:"warning custom-block"},[a("p",[s._v("请替换其中的 x.x.x.x 为您的 demo-master-a-1 的实际 ip 地址")])]),s._v(" "),a("p",[a("strong",[s._v("创建 ./kubeadm-config.yaml")])]),s._v(" "),a("div",{staticClass:"language-sh extra-class"},[a("pre",{pre:!0,attrs:{class:"language-sh"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 只在 master 节点执行")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("vim")]),s._v(" ./kubeadm-config.yaml\n")])])]),a("div",{staticClass:"language-yaml extra-class"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("apiVersion")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" kubeadm.k8s.io/v1beta1\n"),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("kind")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" ClusterConfiguration\n"),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("kubernetesVersion")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" v1.15.0\n"),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("controlPlaneEndpoint")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"apiserver.demo:6443"')]),s._v("\n\n")])])]),a("p",[a("strong",[s._v("初始化 apiserver")])]),s._v(" "),a("div",{staticClass:"language-sh extra-class"},[a("pre",{pre:!0,attrs:{class:"language-sh"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 只在 master 节点执行")]),s._v("\nkubeadm init --config"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("kubeadm-config.yaml --upload-certs\n")])])]),a("p",[s._v("执行结果如下图所示:")]),s._v(" "),a("p",[a("img",{attrs:{src:e(337),alt:"image-20190715101542756",title:":size=800x388"}})]),s._v(" "),a("p",[a("strong",[s._v("初始化 root 用户的 kubectl 配置")])]),s._v(" "),a("div",{staticClass:"language-sh extra-class"},[a("pre",{pre:!0,attrs:{class:"language-sh"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 只在 master 节点执行")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("rm")]),s._v(" -rf /root/.kube/\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("mkdir")]),s._v(" /root/.kube/\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("cp")]),s._v(" -i /etc/kubernetes/admin.conf /root/.kube/config\n")])])]),a("p",[a("strong",[s._v("安装 calico")])]),s._v(" "),a("div",{staticClass:"language-sh extra-class"},[a("pre",{pre:!0,attrs:{class:"language-sh"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 只在 master 节点执行")]),s._v("\nkubectl apply -f https://docs.projectcalico.org/v3.6/getting-started/kubernetes/installation/hosted/kubernetes-datastore/calico-networking/1.7/calico.yaml\n")])])]),a("blockquote",[a("p",[s._v("安装calico, 请参考https://docs.projectcalico.org/v3.6/getting-started/kubernetes/")])]),s._v(" "),a("p",[a("strong",[s._v("等待calico安装就绪:")])]),s._v(" "),a("p",[s._v("执行如下命令,等待 3-10 分钟,直到所有的容器组处于 Running 状态")]),s._v(" "),a("div",{staticClass:"language-sh extra-class"},[a("pre",{pre:!0,attrs:{class:"language-sh"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 只在 master 节点执行")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("watch")]),s._v(" kubectl get pod -n kube-system\n")])])]),a("p",[a("strong",[s._v("检查 master 初始化结果")])]),s._v(" "),a("p",[s._v("在 master 节点 demo-master-a-1 上执行")]),s._v(" "),a("div",{staticClass:"language-sh extra-class"},[a("pre",{pre:!0,attrs:{class:"language-sh"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 只在 master 节点执行")]),s._v("\nkubectl get nodes\n")])])]),a("h2",{attrs:{id:"初始化-worker节点"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#初始化-worker节点","aria-hidden":"true"}},[s._v("#")]),s._v(" 初始化 worker节点")]),s._v(" "),a("h3",{attrs:{id:"获得-join命令参数"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#获得-join命令参数","aria-hidden":"true"}},[s._v("#")]),s._v(" 获得 join命令参数")]),s._v(" "),a("p",[a("strong",[s._v("在 master 节点 demo-master-a-1 节点执行")])]),s._v(" "),a("div",{staticClass:"language-sh extra-class"},[a("pre",{pre:!0,attrs:{class:"language-sh"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 只在 master 节点执行")]),s._v("\nkubeadm token create --print-join-command\n")])])]),a("p",[s._v("可获取kubeadm join 命令及参数,如下所示")]),s._v(" "),a("div",{staticClass:"language-sh extra-class"},[a("pre",{pre:!0,attrs:{class:"language-sh"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# kubeadm token create 命令的输出")]),s._v("\nkubeadm "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("join")]),s._v(" apiserver.demo:6443 --token mpfjma.4vjjg8flqihor4vt --discovery-token-ca-cert-hash sha256:6f7a8e40a810323672de5eee6f4d19aa2dbdb38411845a1bf5dd63485c43d303\n")])])]),a("h3",{attrs:{id:"初始化worker"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#初始化worker","aria-hidden":"true"}},[s._v("#")]),s._v(" 初始化worker")]),s._v(" "),a("p",[a("strong",[s._v("针对所有的 worker 节点执行")])]),s._v(" "),a("div",{staticClass:"language-sh extra-class"},[a("pre",{pre:!0,attrs:{class:"language-sh"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 只在 worker 节点执行")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("echo")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"x.x.x.x apiserver.demo"')]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">>")]),s._v(" /etc/hosts\nkubeadm "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("join")]),s._v(" apiserver.demo:6443 --token mpfjma.4vjjg8flqihor4vt --discovery-token-ca-cert-hash sha256:6f7a8e40a810323672de5eee6f4d19aa2dbdb38411845a1bf5dd63485c43d303\n")])])]),a("div",{staticClass:"tip custom-block"},[a("ul",[a("li",[s._v("将 x.x.x.x 替换为 demo-master-a-1 的实际 ip")]),s._v(" "),a("li",[s._v("将 kubeadm join 命令后的参数替换为上一个步骤中实际从 demo-master-a-1 节点获得的参数")])])]),s._v(" "),a("h3",{attrs:{id:"检查初始化结果"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#检查初始化结果","aria-hidden":"true"}},[s._v("#")]),s._v(" 检查初始化结果")]),s._v(" "),a("p",[s._v("在 master 节点 demo-master-a-1 上执行")]),s._v(" "),a("div",{staticClass:"language-sh extra-class"},[a("pre",{pre:!0,attrs:{class:"language-sh"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 只在 master 节点执行")]),s._v("\nkubectl get nodes\n")])])]),a("p",[a("img",{attrs:{src:e(338),alt:"image-20190715193838012"}})]),s._v(" "),a("h2",{attrs:{id:"移除-worker-节点"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#移除-worker-节点","aria-hidden":"true"}},[s._v("#")]),s._v(" 移除 worker 节点")]),s._v(" "),a("div",{staticClass:"warning custom-block"},[a("p",[s._v("正常情况下,您无需移除 worker 节点,如果添加到集群出错,您可以移除 worker 节点,再重新尝试添加")])]),s._v(" "),a("p",[s._v("在准备移除的 worker 节点上执行")]),s._v(" "),a("div",{staticClass:"language-sh extra-class"},[a("pre",{pre:!0,attrs:{class:"language-sh"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 只在 worker 节点执行")]),s._v("\nkubeadm reset\n")])])]),a("p",[s._v("在 master 节点 demo-master-a-1 上执行")]),s._v(" "),a("div",{staticClass:"language-sh extra-class"},[a("pre",{pre:!0,attrs:{class:"language-sh"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 只在 master 节点执行")]),s._v("\nkubectl delete node demo-worker-x-x\n")])])]),a("div",{staticClass:"tip custom-block"},[a("ul",[a("li",[s._v("将 demo-worker-x-x 替换为要移除的 worker 节点的名字")]),s._v(" "),a("li",[s._v("worker 节点的名字可以通过在节点 demo-master-a-1 上执行 kubectl get nodes 命令获得")])])]),s._v(" "),a("h2",{attrs:{id:"安装-ingress-controller"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#安装-ingress-controller","aria-hidden":"true"}},[s._v("#")]),s._v(" 安装 Ingress Controller")]),s._v(" "),a("blockquote",[a("p",[s._v("Ingress官方文档:https://kubernetes.io/docs/concepts/services-networking/ingress/")]),s._v(" "),a("p",[s._v("Ingress Controllers官网介绍:https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/")]),s._v(" "),a("p",[s._v("本文中使用如下部署方式:https://kubernetes.github.io/ingress-nginx/deploy/baremetal/#using-a-self-provisioned-edge")]),s._v(" "),a("p",[s._v("kubernetes支持多种Ingress Controllers,本文推荐使用 https://github.com/nginxinc/kubernetes-ingress")])]),s._v(" "),a("p",[a("strong",[s._v("在 demo-master-a-1 上执行")])]),s._v(" "),a("div",{staticClass:"language-sh extra-class"},[a("pre",{pre:!0,attrs:{class:"language-sh"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 只在 master 节点执行")]),s._v("\nkubectl apply -f https://raw.githubusercontent.com/eip-work/eip-monitor-repository/master/dashboard/nginx-ingress.yaml\n")])])]),a("p",[a("strong",[s._v("配置域名解析")])]),s._v(" "),a("p",[s._v("将域名 *.demo.yourdomain.com 解析到 demo-worker-a-2 的 IP 地址 z.z.z.z (也可以是 demo-worker-a-1 的地址 y.y.y.y)")]),s._v(" "),a("div",{staticClass:"tip custom-block"},[a("p",[s._v("由于需要申请域名,过程会比较繁琐,有如下两种替代方案:")]),s._v(" "),a("ul",[a("li",[s._v("在您的客户端机器(访问部署在K8S上的 web 应用的浏览器所在的机器)设置 hosts 配置;")]),s._v(" "),a("li",[s._v("暂时放弃域名的配置,临时使用 NodePort 或者 "),a("code",[s._v("kubectl port-forward")]),s._v(" 的方式访问部署在 K8S 上的 web 应用")])])]),s._v(" "),a("p",[a("strong",[s._v("验证配置")])]),s._v(" "),a("p",[s._v("在浏览器访问 a.demo.yourdomain.com,将得到 404 NotFound 错误页面")]),s._v(" "),a("h2",{attrs:{id:"下一步"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#下一步","aria-hidden":"true"}},[s._v("#")]),s._v(" 下一步")]),s._v(" "),a("p",[s._v("🎉 🎉 🎉")]),s._v(" "),a("p",[s._v("您已经完成了 Kubernetes 集群的安装,下一步请:")]),s._v(" "),a("p",[a("a",{attrs:{href:"/install/install-dashboard"}},[s._v("安装 Kuboard")])])])},[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/19.99531f86.js b/docs/assets/js/19.99531f86.js deleted file mode 100644 index 35e1387..0000000 --- a/docs/assets/js/19.99531f86.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[19],{106: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-20190728145108904.8f9c0d1d.png"},333:function(e,r,a){e.exports=a.p+"assets/img/image-20190721154650916.3f63fdcb.jpg"},334:function(e,r,a){e.exports=a.p+"assets/img/image-20190723105039358.91eef75a.png"},335:function(e,r,a){e.exports=a.p+"assets/img/image-20190721000759925.bb32a332.png"},363: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(333),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(334),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(335),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(106),alt:"Kuboard QQ 群"}})])])},[],!1,null,null,null);r.default=s.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/2.dd0e1f2c.js b/docs/assets/js/2.dd0e1f2c.js deleted file mode 100644 index e96bfa4..0000000 --- a/docs/assets/js/2.dd0e1f2c.js +++ /dev/null @@ -1 +0,0 @@ -(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(108),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(107),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(107),u=n(121),c=n(110),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(110),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(183),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(176)(!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(177),o=n(57),a=n(109),u=n(178),c=n(157),l=n(187),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(108);var r=n(104),i={name:"SidebarGroup",props:["item","open","collapsable","depth"],components:{DropdownTransition:n(162).a},beforeCreate:function(){this.$options.components.SidebarLinks=n(161).default},methods:{isActive:r.e}},s=(n(206),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(207);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(201),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(168),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(169)("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(171)},function(t,e,n){n(172),t.exports=n(31).Array.isArray},function(t,e,n){var r=n(58);r(r.S,"Array",{isArray:n(173)})},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(175)},function(t,e,n){n(150),n(188),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(179),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(180),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(186).appendChild(e),e.src="javascript:",(t=e.contentWindow.document).open(),t.write("
Copyright © 2019-present Huanqing Shao | 京ICP备19008693号-2
- - - diff --git a/docs/guide/cluster/computing.html b/docs/guide/cluster/computing.html deleted file mode 100644 index e4320d2..0000000 --- a/docs/guide/cluster/computing.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - 计算资源管理 | Kuboard - - - - - - - -

计算资源管理

前提

必须具备如下条件:

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

添加节点

集群完成安装后,可以随时向集群中添加计算节点,请参考 初始化 worker 节点

查看节点

登录 Kuboard 之后,即可看到集群中的计算资源列表,在左下角,如下图所示:

image-20190720224950653

  • 点击 demo-worker002 可查看该节点的详细信息,如下图所示:

image-20190720225123111

移除节点

  • 点击 节点 详情页上方的 删除

    并确认要删除的节点的名称后,即可删除该节点

image-20190720225222622

  • 此时只是从 kubenetes 集群的配置中删除了该节点,该节点上的工作负载将被自动迁移到其他可用节点上。如果重启该节点对应的 linux 操作系统,该节点会重新注册到集群中来。

  • 要想彻底删除该节点,您还需要登录该节点所在机器的 linux 终端,并以 root 身份执行如下命令

    kubadm reset
    -
Copyright © 2019-present Huanqing Shao | 京ICP备19008693号-2
- - - diff --git a/docs/guide/cluster/namespace.html b/docs/guide/cluster/namespace.html deleted file mode 100644 index b66f4b8..0000000 --- a/docs/guide/cluster/namespace.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - 名称空间管理 | Kuboard - - - - - - - -

名称空间管理

创建名称空间

前提

必须具备如下条件:

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

image-20190723105606081

准备

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

并填写:

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

image-20190723105644937

  • 点击 保存

image-20190723105722999

  • 点击 应用

image-20190723105748435

  • 点击 完成

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

image-20190723105809872

  • 点击 example 名称空间

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

image-20190723105830318

Copyright © 2019-present Huanqing Shao | 京ICP备19008693号-2
- - - diff --git a/docs/guide/cluster/storage.html b/docs/guide/cluster/storage.html deleted file mode 100644 index f45e62c..0000000 --- a/docs/guide/cluster/storage.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - 存储空间管理 | 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 的指令复制下来后,如下所示:

-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

Copyright © 2019-present Huanqing Shao | 京ICP备19008693号-2
- - - diff --git a/docs/guide/diagonize/events.html b/docs/guide/diagonize/events.html deleted file mode 100644 index df06b71..0000000 --- a/docs/guide/diagonize/events.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - 集群事件 | Kuboard - - - - - - - -

集群事件

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

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

错误事件提示

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

image-20190721104153954

全局事件

查看全局事件

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

image-20190721101812895

删除事件

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

image-20190721101954560

  • 点击 确定

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

微服务上下文相关的事件

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

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

image-20190721103324863

Copyright © 2019-present Huanqing Shao | 京ICP备19008693号-2
- - - diff --git a/docs/guide/diagonize/logs.html b/docs/guide/diagonize/logs.html deleted file mode 100644 index 3dd1fbd..0000000 --- a/docs/guide/diagonize/logs.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - 日志及终端 | Kuboard - - - - - - - -

日志及终端

日志

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

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

image-20190721104348908

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

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

image-20190721104415732

终端

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

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

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

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

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

image-20190721104522870

Copyright © 2019-present Huanqing Shao | 京ICP备19008693号-2
- - - diff --git a/docs/guide/diagonize/port-forward.html b/docs/guide/diagonize/port-forward.html deleted file mode 100644 index 675fe30..0000000 --- a/docs/guide/diagonize/port-forward.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - 端口转发 | 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 的功能,提高问题诊断过程中的便利性。

Copyright © 2019-present Huanqing Shao | 京ICP备19008693号-2
- - - diff --git a/docs/guide/example/busybox.html b/docs/guide/example/busybox.html deleted file mode 100644 index f944aba..0000000 --- a/docs/guide/example/busybox.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - 部署 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

Copyright © 2019-present Huanqing Shao | 京ICP备19008693号-2
- - - diff --git a/docs/guide/example/import.html b/docs/guide/example/import.html deleted file mode 100644 index ebd2cde..0000000 --- a/docs/guide/example/import.html +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - 导入 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
-[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)
-        at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.register(EurekaHttpClientDecorator.java:56)
-        at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator$1.execute(EurekaHttpClientDecorator.java:59)
-        at com.netflix.discovery.shared.transport.decorator.SessionedEurekaHttpClient.execute(SessionedEurekaHttpClient.java:77)
-        at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.register(EurekaHttpClientDecorator.java:56)
-        at com.netflix.discovery.DiscoveryClient.register(DiscoveryClient.java:829)
-        at com.netflix.discovery.InstanceInfoReplicator.run(InstanceInfoReplicator.java:121)
-        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
-        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
-        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
-        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
-        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
-        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
-        at java.lang.Thread.run(Thread.java:748)
-
Copyright © 2019-present Huanqing Shao | 京ICP备19008693号-2
- - - diff --git a/docs/guide/example/monitor.html b/docs/guide/example/monitor.html deleted file mode 100644 index 9f42872..0000000 --- a/docs/guide/example/monitor.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - 监控 example | 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
-
  • 将鼠标移到 设置 菜单

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

Copyright © 2019-present Huanqing Shao | 京ICP备19008693号-2
- - - diff --git a/docs/guide/index.html b/docs/guide/index.html deleted file mode 100644 index bb6a604..0000000 --- a/docs/guide/index.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - 使用手册 | Kuboard - - - - - - - -

使用手册

Kuboard 的设计目标

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

熟悉 Kuboard 的最佳途径

Kuboard 可用于

  • 管理 Kubernetes 集群
  • 管理部署于 Kubernetes 的微服务
  • 诊断集群中的问题
  • 监控部署于 Kubernetes 的微服务
Copyright © 2019-present Huanqing Shao | 京ICP备19008693号-2
- - - diff --git a/docs/guide/monitor/apis.html b/docs/guide/monitor/apis.html deleted file mode 100644 index ef93270..0000000 --- a/docs/guide/monitor/apis.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - 自定义监控套件 | Kuboard - - - - - - - -

自定义监控套件 alpha

文档建设中...

  • 请参考 监控 example alpha 体验 Kuboard 在监控套件方面的设想
  • 监控套件以插件的形式整合到 Kuboard,在不使用监控套件的情况下,Kuboard 的所有功能都可正常工作
Copyright © 2019-present Huanqing Shao | 京ICP备19008693号-2
- - - diff --git a/docs/guide/monitor/index.html b/docs/guide/monitor/index.html deleted file mode 100644 index 0046012..0000000 --- a/docs/guide/monitor/index.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - 监控套件 | Kuboard - - - - - - - -

监控套件 alpha

文档建设中...

  • 请参考 监控 example alpha 体验 Kuboard 在监控套件方面的设想
  • 监控套件以插件的形式整合到 Kuboard,在不使用监控套件的情况下,Kuboard 的所有功能都可正常工作
Copyright © 2019-present Huanqing Shao | 京ICP备19008693号-2
- - - diff --git a/docs/guide/namespace/adjustion.html b/docs/guide/namespace/adjustion.html deleted file mode 100644 index 790fb83..0000000 --- a/docs/guide/namespace/adjustion.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - 日常调整 | Kuboard - - - - - - - -

日常调整

前提

必须具备如下条件:

  • 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

Copyright © 2019-present Huanqing Shao | 京ICP备19008693号-2
- - - diff --git a/docs/guide/namespace/configMap.html b/docs/guide/namespace/configMap.html deleted file mode 100644 index 738cdd1..0000000 --- a/docs/guide/namespace/configMap.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - 配置 | 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

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

Copyright © 2019-present Huanqing Shao | 京ICP备19008693号-2
- - - diff --git a/docs/guide/namespace/index.html b/docs/guide/namespace/index.html deleted file mode 100644 index 74dbac4..0000000 --- a/docs/guide/namespace/index.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - 应用管理 | Kuboard - - - - - - - -

应用管理

创建工作负载

删除工作负载

伸缩

升级工作负载版本

环境迁移

导出

导入

Copyright © 2019-present Huanqing Shao | 京ICP备19008693号-2
- - - diff --git a/docs/guide/namespace/multi-env.html b/docs/guide/namespace/multi-env.html deleted file mode 100644 index 7a041de..0000000 --- a/docs/guide/namespace/multi-env.html +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - 多环境 | 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

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

    ---
    -apiVersion: apps/v1
    -kind: StatefulSet
    -metadata:
    -  namespace: example
    -  name: cloud-eureka
    -  annotations:
    -    k8s.eip.work/workload: cloud-eureka
    -    k8s.eip.work/displayName: 服务注册
    -    k8s.eip.work/service: ClusterIP
    -    k8s.eip.work/ingress: 'true'
    -  labels:
    -    k8s.eip.work/layer: cloud
    -    k8s.eip.work/name: cloud-eureka
    -spec:
    -  selector:
    -    matchLabels:
    -      k8s.eip.work/layer: cloud
    -      k8s.eip.work/name: cloud-eureka
    -  template:
    -    metadata:
    -    ...
    -

该文件可以通过 kubectl apply -f 命令直接执行,但是建议使用 kuboard 进行导入,以便在导入时在线编辑在特定于新环境的配置信息。

导入配置

前提

您已经通过 kuboard 导出了配置文件,或者从别处获取到 kuboard 导出的配置文件

操作步骤

请参考 导入 example 微服务

Copyright © 2019-present Huanqing Shao | 京ICP备19008693号-2
- - - diff --git a/docs/guide/namespace/pvc.html b/docs/guide/namespace/pvc.html deleted file mode 100644 index 6bb1383..0000000 --- a/docs/guide/namespace/pvc.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - 存储卷声明 | Kuboard - - - - - - - -

存储卷声明

存储卷声明: Kubernetes Persistent Volume Claim

查看存储卷声明列表

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

image-20190721110355464

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

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

image-20190721113708689

创建存储卷声明

  • 点击 存储卷声明 / 创建

    填写表单如下:

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

image-20190721113810235

  • 点击 保存

    存储卷声明创建成功

image-20190721114112644

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

  • 点击 my-pvc

image-20190721114211751

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

Copyright © 2019-present Huanqing Shao | 京ICP备19008693号-2
- - - diff --git a/docs/guide/namespace/secrets.html b/docs/guide/namespace/secrets.html deleted file mode 100644 index 34034ac..0000000 --- a/docs/guide/namespace/secrets.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - 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

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

Copyright © 2019-present Huanqing Shao | 京ICP备19008693号-2
- - - diff --git a/docs/guide/namespace/workload.html b/docs/guide/namespace/workload.html deleted file mode 100644 index a4382d8..0000000 --- a/docs/guide/namespace/workload.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - 工作负载 | 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 等命令,临时对容器中的配置文件进行修改,并在验证这种修改有效之后,才将其正式更新到代码库
Copyright © 2019-present Huanqing Shao | 京ICP备19008693号-2
- - - diff --git a/docs/index.html b/docs/index.html deleted file mode 100644 index a935454..0000000 --- a/docs/index.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - Kuboard - - - - - - - -

Kuboard

- A cool Kubernetes Dashboard -

- 在线体验 - 开始使用 →

降低 Kubernetes 门槛

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

直观显示微服务架构

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

上下文关联监控

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

- - - diff --git a/docs/install/index.html b/docs/install/index.html deleted file mode 100644 index 17b9213..0000000 --- a/docs/install/index.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - 概述 | Kuboard - - - - - - - -

概述

已经有 Kubernetes 集群,请直接 安装 Kuboard

还没有 Kubernetes 集群:


在线提问

Kuboard 兴趣群二维码

Copyright © 2019-present Huanqing Shao | 京ICP备19008693号-2
- - - diff --git a/docs/install/install-common-ingress.html b/docs/install/install-common-ingress.html deleted file mode 100644 index 4d2b36f..0000000 --- a/docs/install/install-common-ingress.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - 安装 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
-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 错误页面

Copyright © 2019-present Huanqing Shao | 京ICP备19008693号-2
- - - diff --git a/docs/install/install-common-vm.html b/docs/install/install-common-vm.html deleted file mode 100644 index 33ef863..0000000 --- a/docs/install/install-common-vm.html +++ /dev/null @@ -1,75 +0,0 @@ - - - - - - 制作标准机镜像 | Kuboard - - - - - - - -

制作标准机镜像

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

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

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

  • docker
  • gitlab-runner
  • kubernetes images

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

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

安装docker

卸载旧版本

sudo yum remove docker \
-	docker-client \
-	docker-client-latest \
-	docker-common \
-	docker-latest \
-	docker-latest-logrotate \
-	docker-logrotate \
-	docker-selinux \
-	docker-engine-selinux \
-	docker-engine
-

下载依赖包及安装包

wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm
-
-wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-cli-18.09.7-3.el7.x86_64.rpm
-
-wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-18.09.7-3.el7.x86_64.rpm
-

安装

sudo yum install -y containerd.io-1.2.6-3.3.el7.x86_64.rpm
-sudo yum install -y docker-ce-cli-18.09.7-3.el7.x86_64.rpm
-sudo yum install -y docker-ce-18.09.7-3.el7.x86_64.rpm
-sudo systemctl enable docker
-

启动 docker 服务

sudo systemctl start docker
-

检查 docker 版本

docker version
-

参考文档

https://docs.docker.com/install/linux/docker-ce/centos/

https://docs.docker.com/install/linux/linux-postinstall/

安装 nfs-utils

执行安装命令

sudo yum install nfs-utils
-

必须先安装 nfs-utils 才能挂载 nfs 网络存储

K8S基本配置

配置K8S的yum源

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
-[kubernetes]
-name=Kubernetes
-baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
-enabled=1
-gpgcheck=0
-repo_gpgcheck=0
-gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
-        http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
-EOF
-

关闭swap、防火墙

swapoff -a
-

关闭SeLinux

setenforce 0
-

修改 /etc/sysctl.conf

vim /etc/sysctl.conf

向其中添加

net.ipv4.ip_forward = 1
-net.bridge.bridge-nf-call-ip6tables = 1
-net.bridge.bridge-nf-call-iptables = 1
-

如下图所示

image-20190715085036593

安装kubelet、kubeadm、kubectl

yum install -y kubelet-1.15.0 kubeadm-1.15.0 kubectl-1.15.0
-

修改docker Cgroup Driver为systemd

vim /usr/lib/systemd/system/docker.service

向其中他添加

--exec-opt native.cgroupdriver=systemd

如下图所示

屏幕快照 2019-07-15 09.01.21

重启 docker

systemctl daemon-reload
-systemctl restart docker
-

启动kubelet

systemctl enable kubelet && systemctl start kubelet
-

加载 kubernetes 镜像

由于k8s服务相关镜像在国外镜像源,国内无法访问

执行以下命令添加docker k8s国内镜像源

curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
-
-systemctl restart docker
-

拉取k8s相关镜像

docker pull mirrorgooglecontainers/kube-apiserver:v1.15.0
-docker pull mirrorgooglecontainers/kube-controller-manager:v1.15.0
-docker pull mirrorgooglecontainers/kube-scheduler:v1.15.0
-docker pull mirrorgooglecontainers/kube-proxy:v1.15.0
-docker pull mirrorgooglecontainers/pause:3.1
-docker pull mirrorgooglecontainers/etcd:3.3.10
-docker pull coredns/coredns:1.3.1
-

更改镜像名为k8s官网镜像

docker tag d235b23c3570 k8s.gcr.io/kube-proxy:v1.15.0
-docker tag 201c7a840312 k8s.gcr.io/kube-apiserver:v1.15.0
-docker tag 2d3813851e87 k8s.gcr.io/kube-scheduler:v1.15.0
-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 制作虚拟机镜像 的文档

Copyright © 2019-present Huanqing Shao | 京ICP备19008693号-2
- - - diff --git a/docs/install/install-dashboard copy.html b/docs/install/install-dashboard copy.html deleted file mode 100644 index 7715713..0000000 --- a/docs/install/install-dashboard copy.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - 安装 Kuboard | Kuboard - - - - - - - -

安装 Kuboard

前提

安装 Kuboard 时,假设您已经有一个 Kubernetes 集群

如果没有 Kubernetes 集群:

碰到问题? 在线提问

Kuboard 兴趣群二维码

兼容性

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

安装

获取并修改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

访问 Kuboard

您可以通过NodePort、port-forward、域名三种方式当中的任意一种访问 Kuboard

下一步

Copyright © 2019-present Huanqing Shao | 京ICP备19008693号-2
- - - diff --git a/docs/install/install-dashboard-diagonize-kube-dns.html b/docs/install/install-dashboard-diagonize-kube-dns.html deleted file mode 100644 index a9f16a4..0000000 --- a/docs/install/install-dashboard-diagonize-kube-dns.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - 创建 kube-dns Service | Kuboard - - - - - - - -

创建 kube-dns Service

Copyright © 2019-present Huanqing Shao | 京ICP备19008693号-2
- - - diff --git a/docs/install/install-dashboard-diagonize.html b/docs/install/install-dashboard-diagonize.html deleted file mode 100644 index 885739e..0000000 --- a/docs/install/install-dashboard-diagonize.html +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - 安装 Kuboard 失败时如何诊断 | Kuboard - - - - - - - -

安装 Kuboard 失败时如何诊断

少数情况下,您可能会碰到安装 Kuboard 失败的情况,请按照如下步骤进行诊断

诊断步骤

检查 Kuboard 容器组状态

执行命令

kubectl get pods -n kube-system
-

输出结果如下所示:

NAME                                          READY   STATUS    RESTARTS   AGE
-calico-kube-controllers-7c4d64d599-67hkh      1/1     Running   0          13h
-calico-node-9sf77                             1/1     Running   3          8d
-calico-node-p8sxb                             1/1     Running   2          8d
-calico-node-w472g                             1/1     Running   3          8d
-coredns-5c98db65d4-9hwnj                      1/1     Running   3          8d
-coredns-5c98db65d4-dr86j                      1/1     Running   3          8d
-etcd-demo-master-a-1                          1/1     Running   3          8d
-kube-apiserver-demo-master-a-1                1/1     Running   3          8d
-kube-controller-manager-demo-master-a-1       1/1     Running   3          8d
-kube-proxy-4tfrx                              1/1     Running   2          8d
-kube-proxy-ps676                              1/1     Running   2          8d
-kube-proxy-x8v4p                              1/1     Running   3          8d
-kube-scheduler-demo-master-a-1                1/1     Running   3          8d
-kuboard-7bb8d57995-nkqzw                      1/1     Running   0          2d20h
-

根据 Kubernetes 安装方式不同、节点数量不同,您得到的输出结果会与样例结果有差异

请对结果做如下检查:

  • kuboard-xxxxxxxxxx-xxxxx 的 STATUS 是否为 Runnning

检查 Kuboard 容器组日志

执行命令,请使用实际 kuboard 容器组的名称替换命令中的 kuboard-xxxxxxxxxx-xxxxx

kubectl logs -f kuboard-xxxxxxxxxx-xxxxx -n kube-system
-

如果您得到如下错误信息: host not found in resolver "kube-dns.kube-system.svc.cluster.local"

2019/07/26 23:09:33 [emerg] 1#1: host not found in resolver "kube-dns.kube-system.svc.cluster.local" in /etc/nginx/conf.d/nginx.80.conf:36
-nginx: [emerg] host not found in resolver "kube-dns.kube-system.svc.cluster.local" in /etc/nginx/conf.d/nginx.80.conf:36
-

创建 kube-dns Service

Copyright © 2019-present Huanqing Shao | 京ICP备19008693号-2
- - - diff --git a/docs/install/install-dashboard-upgrade.html b/docs/install/install-dashboard-upgrade.html deleted file mode 100644 index 7e25a61..0000000 --- a/docs/install/install-dashboard-upgrade.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - 升级 Kuboard | Kuboard - - - - - - - -

升级 Kuboard

最新版本

版本: v1.0.0-beta.13

发布日期: 2019-07-28

查看更新日志

latest 标签升级

按照 安装 Kuboard 文档完成 Kuboard 安装后,您使用的 Kuboard 镜像是 latest 标签。每次 Kuboard 版本更新后,latest 标签对应的镜像也更新为最新版本。您需要执行下述操作,以完成 latest 镜像更新:

  • 安装 Kuboard 时,指定了 Kuboard 的 imagePullPolicy 为 Always。
  • 在您的生产环境中,请避免使用 latest 标签,以确保版本的稳定性。
  • 进入 Kuboard 首页,完成登录,进入 Kuboard 集群概览

  • 点击 名称空间 / kube-system 进入 kube-system 名称空间

  • 点击 容器组列表 按钮

  • 勾选 监控 筛选项,点击刷新

    选择 kuboard-xxxxxxxxxx-xxxxx 容器组,如下图所示:

image-20190729071443225

  • 点击 删除 按钮

    点击 应用 按钮

    点击 完成 按钮

    等待容器组调整完毕

  • 刷新浏览器页面

  • 验证版本更新结果

    如下图所示

image-20190729071954323

指定版本升级

  • 进入 Kuboard 首页,完成登录,进入 Kuboard 集群概览

  • 点击 名称空间 / kube-system 进入 kube-system 名称空间

  • 点击 调整镜像版本 按钮

  • 勾选 监控 筛选项,点击刷新

    并修改 Deployment / Kuboard 的镜像版本为您要升级到的目标版本,如下图所示

image-20190728220831126

  • 点击 执行变更

    点击 应用

    点击 完成

    等待容器组调整完毕。

  • 刷新浏览器页面

  • 验证版本更新结果

    如下图所示

image-20190729071954323

Copyright © 2019-present Huanqing Shao | 京ICP备19008693号-2
- - - diff --git a/docs/install/install-dashboard.html b/docs/install/install-dashboard.html deleted file mode 100644 index cb0512d..0000000 --- a/docs/install/install-dashboard.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - 安装 Kuboard | Kuboard - - - - - - - -

安装 Kuboard

前提

安装 Kuboard 时,假设您已经有一个 Kubernetes 集群

如果没有 Kubernetes 集群:

碰到问题? 在线提问

Kuboard 兴趣群二维码

兼容性

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

安装

获取 Token

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

访问 Kuboard

您可以通过NodePort、port-forward 两种方式当中的任意一种访问 Kuboard

下一步

Copyright © 2019-present Huanqing Shao | 京ICP备19008693号-2
- - - diff --git a/docs/install/install-k8s.html b/docs/install/install-k8s.html deleted file mode 100644 index ee0f984..0000000 --- a/docs/install/install-k8s.html +++ /dev/null @@ -1,141 +0,0 @@ - - - - - - 安装 Kubernetes 单Master节点 | Kuboard - - - - - - - -

安装 Kubernetes 单Master节点

对于 Kubernetes 初学者,推荐在阿里云采购如下配置:

  • 3台 2核4G 的ECS(突发性能实例 t5 ecs.t5-c1m2.large或同等配置,单台约 0.4元/小时,停机时不收费)
  • Cent OS 7.6

领取阿里云最高2000元红包

Kuboard 的 Live Demo 环境使用的是如下拓扑结构,本文档描述了如何在完成该 demo 环境的搭建。

完成安装后,对应的软件版本为:

  • Kubernetes v1.15.0
  • Docker 18.09.7

image-20190726214032585

制作标准机镜像

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

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

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

  • docker
  • nfs-utils
  • kubernetes images
  • 您也可以不制作标准机镜像,而是在三台机器上都执行 制作标准机镜像 中的所有操作步骤

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

安装docker

卸载旧版本

# 在 master 节点和 worker 节点都要执行
-sudo yum remove docker \
-	docker-client \
-	docker-client-latest \
-	docker-common \
-	docker-latest \
-	docker-latest-logrotate \
-	docker-logrotate \
-	docker-selinux \
-	docker-engine-selinux \
-	docker-engine
-

下载依赖包及安装包

# 在 master 节点和 worker 节点都要执行
-wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm
-wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-cli-18.09.7-3.el7.x86_64.rpm
-wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-18.09.7-3.el7.x86_64.rpm
-

安装

# 在 master 节点和 worker 节点都要执行
-sudo yum install -y containerd.io-1.2.6-3.3.el7.x86_64.rpm
-sudo yum install -y docker-ce-cli-18.09.7-3.el7.x86_64.rpm
-sudo yum install -y docker-ce-18.09.7-3.el7.x86_64.rpm
-sudo systemctl enable docker
-

启动 docker 服务

# 在 master 节点和 worker 节点都要执行
-sudo systemctl start docker
-

检查 docker 版本

# 在 master 节点和 worker 节点都要执行
-docker version
-

参考文档

https://docs.docker.com/install/linux/docker-ce/centos/

https://docs.docker.com/install/linux/linux-postinstall/

安装 nfs-utils

执行安装命令

# 在 master 节点和 worker 节点都要执行
-sudo yum install -y nfs-utils
-

必须先安装 nfs-utils 才能挂载 nfs 网络存储

K8S基本配置

配置K8S的yum源

# 在 master 节点和 worker 节点都要执行
-cat <<EOF > /etc/yum.repos.d/kubernetes.repo
-[kubernetes]
-name=Kubernetes
-baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
-enabled=1
-gpgcheck=0
-repo_gpgcheck=0
-gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
-       http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
-EOF
-

关闭 防火墙、SeLinux、swap

# 在 master 节点和 worker 节点都要执行
-systemctl stop firewalld
-systemctl disable firewalld
-
-setenforce 0
-sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
-
-swapoff -a
-yes | cp /etc/fstab /etc/fstab_bak
-cat /etc/fstab_bak |grep -v swap > /etc/fstab
-

修改 /etc/sysctl.conf

# 在 master 节点和 worker 节点都要执行
-vim /etc/sysctl.conf
-

向其中添加

net.ipv4.ip_forward = 1
-net.bridge.bridge-nf-call-ip6tables = 1
-net.bridge.bridge-nf-call-iptables = 1
-

如下图所示

image-20190715085036593

执行命令以应用

# 在 master 节点和 worker 节点都要执行
-sysctl -p
-

安装kubelet、kubeadm、kubectl

# 在 master 节点和 worker 节点都要执行
-yum install -y kubelet-1.15.0 kubeadm-1.15.0 kubectl-1.15.0
-

修改docker Cgroup Driver为systemd

# 在 master 节点和 worker 节点都要执行
-vim /usr/lib/systemd/system/docker.service
-

向其中添加

--exec-opt native.cgroupdriver=systemd
-

如下图所示

屏幕快照 2019-07-15 09.01.21

重启 docker

# 在 master 节点和 worker 节点都要执行
-systemctl daemon-reload
-systemctl restart docker
-

启动kubelet

# 在 master 节点和 worker 节点都要执行
-systemctl enable kubelet && systemctl start kubelet
-

加载 kubernetes 镜像

由于k8s服务相关镜像在国外镜像源,国内无法访问

执行以下命令添加docker k8s国内镜像源

# 在 master 节点和 worker 节点都要执行
-curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
-
-systemctl restart docker
-

拉取k8s相关镜像

# 在 master 节点和 worker 节点都要执行
-docker pull mirrorgooglecontainers/kube-apiserver:v1.15.0
-docker pull mirrorgooglecontainers/kube-controller-manager:v1.15.0
-docker pull mirrorgooglecontainers/kube-scheduler:v1.15.0
-docker pull mirrorgooglecontainers/kube-proxy:v1.15.0
-docker pull mirrorgooglecontainers/pause:3.1
-docker pull mirrorgooglecontainers/etcd:3.3.10
-docker pull coredns/coredns:1.3.1
-

更改镜像名为k8s官网镜像

# 在 master 节点和 worker 节点都要执行
-docker tag d235b23c3570 k8s.gcr.io/kube-proxy:v1.15.0
-docker tag 201c7a840312 k8s.gcr.io/kube-apiserver:v1.15.0
-docker tag 2d3813851e87 k8s.gcr.io/kube-scheduler:v1.15.0
-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 制作虚拟机镜像 的文档

初始化 master 节点

以 root 身份在 demo-master-a-1 机器上执行

配置 apiserver.demo 的域名

# 只在 master 节点执行
-echo "x.x.x.x  apiserver.demo" >> /etc/hosts
-

请替换其中的 x.x.x.x 为您的 demo-master-a-1 的实际 ip 地址

创建 ./kubeadm-config.yaml

# 只在 master 节点执行
-vim ./kubeadm-config.yaml
-
apiVersion: kubeadm.k8s.io/v1beta1
-kind: ClusterConfiguration
-kubernetesVersion: v1.15.0
-controlPlaneEndpoint: "apiserver.demo:6443"
-
-

初始化 apiserver

# 只在 master 节点执行
-kubeadm init --config=kubeadm-config.yaml --upload-certs
-

执行结果如下图所示:

image-20190715101542756

初始化 root 用户的 kubectl 配置

# 只在 master 节点执行
-rm -rf /root/.kube/
-mkdir /root/.kube/
-cp -i /etc/kubernetes/admin.conf /root/.kube/config
-

安装 calico

# 只在 master 节点执行
-kubectl apply -f https://docs.projectcalico.org/v3.6/getting-started/kubernetes/installation/hosted/kubernetes-datastore/calico-networking/1.7/calico.yaml
-

安装calico, 请参考https://docs.projectcalico.org/v3.6/getting-started/kubernetes/

等待calico安装就绪:

执行如下命令,等待 3-10 分钟,直到所有的容器组处于 Running 状态

# 只在 master 节点执行
-watch kubectl get pod -n kube-system
-

检查 master 初始化结果

在 master 节点 demo-master-a-1 上执行

# 只在 master 节点执行
-kubectl get nodes
-

初始化 worker节点

获得 join命令参数

在 master 节点 demo-master-a-1 节点执行

# 只在 master 节点执行
-kubeadm token create --print-join-command
-

可获取kubeadm join 命令及参数,如下所示

# kubeadm token create 命令的输出
-kubeadm join apiserver.demo:6443 --token mpfjma.4vjjg8flqihor4vt     --discovery-token-ca-cert-hash sha256:6f7a8e40a810323672de5eee6f4d19aa2dbdb38411845a1bf5dd63485c43d303
-

初始化worker

针对所有的 worker 节点执行

# 只在 worker 节点执行
-echo "x.x.x.x  apiserver.demo" >> /etc/hosts
-kubeadm join apiserver.demo:6443 --token mpfjma.4vjjg8flqihor4vt     --discovery-token-ca-cert-hash sha256:6f7a8e40a810323672de5eee6f4d19aa2dbdb38411845a1bf5dd63485c43d303
-
  • 将 x.x.x.x 替换为 demo-master-a-1 的实际 ip
  • 将 kubeadm join 命令后的参数替换为上一个步骤中实际从 demo-master-a-1 节点获得的参数

检查初始化结果

在 master 节点 demo-master-a-1 上执行

# 只在 master 节点执行
-kubectl get nodes
-

image-20190715193838012

移除 worker 节点

正常情况下,您无需移除 worker 节点,如果添加到集群出错,您可以移除 worker 节点,再重新尝试添加

在准备移除的 worker 节点上执行

# 只在 worker 节点执行
-kubeadm reset
-

在 master 节点 demo-master-a-1 上执行

# 只在 master 节点执行
-kubectl delete node demo-worker-x-x
-
  • 将 demo-worker-x-x 替换为要移除的 worker 节点的名字
  • worker 节点的名字可以通过在节点 demo-master-a-1 上执行 kubectl get nodes 命令获得

安装 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

在 demo-master-a-1 上执行

# 只在 master 节点执行
-kubectl apply -f https://raw.githubusercontent.com/eip-work/eip-monitor-repository/master/dashboard/nginx-ingress.yaml
-

配置域名解析

将域名 *.demo.yourdomain.com 解析到 demo-worker-a-2 的 IP 地址 z.z.z.z (也可以是 demo-worker-a-1 的地址 y.y.y.y)

由于需要申请域名,过程会比较繁琐,有如下两种替代方案:

  • 在您的客户端机器(访问部署在K8S上的 web 应用的浏览器所在的机器)设置 hosts 配置;
  • 暂时放弃域名的配置,临时使用 NodePort 或者 kubectl port-forward 的方式访问部署在 K8S 上的 web 应用

验证配置

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

下一步

🎉 🎉 🎉

您已经完成了 Kubernetes 集群的安装,下一步请:

安装 Kuboard

Copyright © 2019-present Huanqing Shao | 京ICP备19008693号-2
- - - diff --git a/docs/install/install-kubectl.html b/docs/install/install-kubectl.html deleted file mode 100644 index b40e5ad..0000000 --- a/docs/install/install-kubectl.html +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - 从客户端电脑远程管理 Kubernetes | Kuboard - - - - - - - -

从客户端电脑远程管理 Kubernetes

日常工作中,您可能需要在自己的笔记本电脑上执行 kubectl 命令管理远程 Linux 服务器上的 Kubernetes 集群。

从客户端电脑使用 kubectl 远程管理 Kubernetes,这个步骤并不是使用 Kuboard 的必要步骤。可以忽略

在客户端电脑安装 kubectl

Kubernetes 官网文档参照 安装 kubectl 安装时,经常会失败,因为国内访问 google 的镜像仓库存在问题。

请参考下述内容,完成 kubectl 的安装

获取 kubectl config 文件

如果您参考 安装 Kubernetes 单Master节点安装 Kubernetes 高可用 完成了 Kubernetes 安装,请在 demo-master-a-1 节点上执行如下命令

cat /etc/kubernetes/admin.conf
-

输出内容如下所示:





 















apiVersion: v1
-clusters:
-- cluster:
-    certificate-authority-data: LS0tLS1CRxpJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN5RENDQWJDZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRFNU1EY3hPREEzTURFMU1Gb1hEVEk1TURjeE5UQTNNREUxTUZvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWxfY05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTUlvCit1TDVvWWFaMUc5UVR2SS9Cd0RNWWNNOTVqVkdNN2E1eWZIQWtBTVptOThWNGdDamNTd0NhOWFEbHJOKzliSUkKK054OXc3L0phdG1mb1ZwYlNoZ3dqc0lBT3QrTXlxQTh1WFVvMXlwSGFBd2NkaXhYbk81ZlVRRTlKN2xDbm9NZApKM0RYNmhNWnVmNmxwRVVBK2JkaVVTYzdkOEFKVDRpSm41bDAyL21pd3hRZUJweWwzQXFGVUZUQTQxUlNLbnBECjBuTzdoaEk3cE02aUVUTVBSa29lZkZrcHFtSEhqd0g5MGZQVzhETGgwdG5ENUlTM0VUUlVjMDdHbms0ZWh1OWMKamNhRXoxK1Roe3JhcWFTRmpTdUVSMGxhU3BYOXQyd3k1S3NxZFVBRkQySGNDK0Y1eUsvTXppL2krS01FdTM0SQpiTHJNUy90L3lta1V5RTQ3T3FrQ0F3RUFBYU1qTUNFd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZ0QU1CQWY4d0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFFbXRORFVVZ2FhRWs3Z0lSMnE1MkRxZ21FRkMKZW1xR21rT3U5UERvVmZ0Z0Nva3VBUXEzZzBVdzA3cTJTQnhSZzJDNzQ2Y08wbkdURFZlL2ecXNmeVBFK2RFbApPQWJmQ3R1QUlKTHVQWDB6OVBUdDBKekhobnk1ODk5RE81ODdLMm5VdXd3S01xeEYvdWRHMUNtWUkza2g2cS9RCmN0WDI5RjlhTWhDRXluWU1lVU5EUVQ4cGN0TkOpNm4rYjg0NDlmMU5RWG9kVzM0TVRrL25pd3JuQ3pDUUE5M0wKR3YxelhRL2pwTTZVeVo5dU9ZNWEzK096UjJCTzRtZ2RiL0xoam5rL0hxTGs5RUszZmhJak5Tc2h0RWsrf9NpVApPQ3JTQkRHVk5ueHIzeGRwYzltRWNCeDlQdVBqVE1ER1ZkYlowUlZHbGVVODN3dVpUaTdJdUZaR2Jicz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
-    server: https://apiserver.demo:6443
-  name: kubernetes
-contexts:
-- context:
-    cluster: kubernetes
-    user: kubernetes-admin
-  name: kubernetes-admin@kubernetes
-current-context: kubernetes-admin@kubernetes
-kind: Config
-preferences: {}
-users:
-- name: kubernetes-admin
-  user:
-    client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM4akNDQxxRxZ0F3SUJBZ0lJY0JpMFhjUWJNWm93RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB4T1RBM01UZ3dOekF4TlRCYUZ3MHlNREEzTVRjd056QXhOVEZhTURReApGekFWQmdOVkJBb1REbk41YzNSbGJUcHRZWE4wWlhKek1Sa3dGd1lEVlFRREV4QnJkV0psY201bGRHVnpMV0ZrCmJXbHVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQW9CYzZvMHRCekIyRUlldW4KcmhONTVoaU1EaEplcUpxMWxlT3VUSjRic0dqVnlrQVJQVCtGZDlTR3llRjNFZS9NS1ZBcUQ4ZzRXeHNoTTRrdAp1dnVNalNTeit3bnMySnR2TWtJWStLT2FhZFBFSUx6U3dyamxucGRQbjMvQmtTbjc1SnVzRWFLR0NCN0c5Skk3CnJOK3lkc2ZLT29KQTE1ak8vR2VvdC90UGpWNGQ4MldCbVltWitSa1labW43STFPOHh4aFpjVDNDT0QxeVp3OS8KTjBYVnZQYkFzY1QweU91ZG5JMWpFQ3p1cHdKWnZRTENiMEJHb1MxSGxpVDFnL1o0WjBuYW5LdythYkdXamptNQpGbmZTZ2JQblNzOTI5NWNzQW5KQy9MRXZFTE90NEUxQkVHa2JkZTBuNXJnKzhKVjhDOWFPWkFOxhP2aU5iMExuCkdpQ2p6UUlEQVFBQm95Y3dKVEFPQmdOVkhROEJBZjhFQkFNQ0JhQXdFd1lEVlIwbEJBd3dDZ1lJS3dZQkJRVUgKQXdJd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFJYnd3RFJ6VExUbXNrV3R0NEZLbG1xK0NNYTRWZUFqL2x4bQpuaEdITTlTaXpFR1VDRDJ5UjEyQUV0YUdka0R5KzNuT3Q3aS9Db3Jwcm5ocnkwZHMzck81Q3BvMXAwdHNyQnZ5CkRiM1dDTDRkN2x0alplNklZQ0xGNmJCVkJmejJjY0FpZEdieW1UaVhwQU5pK25hOE8wZ3NBTmNUS1JaNG1nNDgKUXpWQktlUnZZWnhwcEV5T2JoelI2NTVoRE1aR3AzdG5pQW9NL3Z6QjA3R2dybzAxVTAvaUVOQnZaeG10S2RxRApFY0JVTzJRTHh3QlZaMFlMb0p2MmJWSTVMYWdmRDNwVFVDQ3A5MURGcDAwbmVHRUM0cDZmQXJwSG9YWU8yYVIyCjZtbEREdVhGNmg2Um53frkxU3N6MWZtSXVzZ2FXaHZUaGgrVGxQVVVTclFkZnQ2S0d4bz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
-    client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb2dJQkFBS0NBUUVBb0JjNm8wdEJ6QjJFSWV1bnJoTjU1aGlNRGhKZXFKcTFsZU91VEo0YnNHalZ5a0FSClBUK0ZkOVNHeWVGM0VlL01LVkFxRDhnNFd4c2hNNGt0dXZ1TWpTU3ord25zMkp0dk1rSVkrS09hYWRQRUlMelMKd3JqbG5wZFBuMy9Ca1NuNzVKdXNFYUtHQ0I3RzlKSTdyTit5ZHNmS09vSkExNWpPL0dlb3QvdFBqVjRkODJXQgptWW1aK1JrWVptbjdJMU84eHhoWmNUM0NPRDF5Wnc5L04wWFZ2UGJBc2NUMHlPdWRuSTFqRUN6dXB3Slp2UUxDCmIwQkdvUzFIbGlUMWcvWjRaMG5hbkt3K2FiR1dqam01Rm5mU2diUG5TczkyOTVjc0FuSkMvTEV2RUxPdDRFMUIKRUdrYmRlMG41cmcrOEpWOEM5YU9aQU5NRHZpTmIwTG5HaUNqelFJREFRQUJBb0lCQUFPOHh4ZXMyQnBsemdIawp1SU50M1Bpc05naldFUE9xdVBhSTNEYlpzaGZLT3NOLy8yY0lwcHNIa1NZQlo0QTVzdkI3K0o5cHN6Y2RTUWNrCityWlV6UkUyZkNVdU5DTlNiYVXsdXVTREhVVy9OZUwxeFkzYU56SWVvak05RGszUFJ4d3RMalV6TUNIY1poU3IKblUwSjQrYTEvMWlpVmRVeXNoSmVjU2ZxYkE4R3pBUlpLUjlYdDZlU01qQXZqdlp4QUtVMVFYWDlHL3JPNnRqUwpXNjJ5aTlkaG5vYjRBR3ovTlhmN29JZld0dW9SUTcxOFdmxm5kZWZYeVp6MnNwc3V4ZGttRUtrQW9qZ2NqbjI3CnRCeFBlUFcveWRqQ3IzTTA3WGVWVDAyaG5UQXptVnFtcUFhbG5rYkpqT0Z5dkQxNE5Cck9Lc2FoK21CUkZLTUEKSjErdUlZRUNnWUVBeTNCZGMrNTJ0SkhGQm8vL1BjU0FMOHhRQVZXTjFoakZ1Nk1BY2Q5WVF6NkhWNWdDYU1oQwpUWFZrNmt5TC9qcEdYS1E1MmVpbTBrOFUvYWc2VXVlV0Uzek45ZDJ3ci9oeDljUjFLUUxmMlpJUmNrN3ZTRUhnEct0ejFWVlhMRDZBTHlKeThGRHhMbFV0ZGRJb3R6YUNOM1d2UXhybTRYV2pCYi82UnBDQTlWLzBDZ1lFQXlYUEcKaldxdXEvYnFCMlphMGNpVUh5NnJIbGQrRVBKNXg0cWlRc0JaUnpZK085TmxuajJnaU5lcU9mRHVjeU5yQ2JBRwo2RkRSTkMrdG9TVVVpWWhtNmgyeXpuc3JOS0pQbHdqN2VGQ1JadFFSb0ErSHpWajBaTnRuQjBNRnhzcUsyeTdSClGnVVlXWmRaTmJSSFVyeTJ0VFk3RHM5UHlITncyU2p5ZERJd3ZCRUNnWUFOczYyM3B6SDdpMjNYdVU4Vm0raCsKVDZaNzBJVlREQ3dWTFM5VWZCUjN3dmhlbi9CWm1sTk00RUZCdnBJWE4xbVIxOFhGdFhPMjZuaWhkUGtvcUV4bApWNXlQbUxUVHhVbjNvWm02ZjJVUVJGUkVmS2lGRjFyR3lYY0VubGlrM3NTc2FGSUtrdDBNV3gwYVFrdy9jemJhCjJPNGcxRlZraFMreUdWVTUxcW9MQ1FLQmdDOHdwN3BJMjFIOUxTVStuTmUzbkxzUk81U0gra2dPQk9qeFdNRTYKUGErb3pUdEdjZTkza0R0K0NhbzQvaUtLa1hCYmc4SzM2OG5Gd1c2V09SRmVtbjBOSisybWZLQi94UlVrVFlRSgptNFh5OTQzL0ZWak5GYkxxa2wvcEcxbE42T2tmTm5rRCtBaEVvK2tvcWc4cTljSE5TbGhWeCtLMDZDSjJyUlQ3CkROK0JBb0dB63h1R3g5OHc0MENESWlHWmhDWGY0ZTRxTllWdVhTcm9YTDVpeWFKTDZka3BLSE9UUk5VSlBmSVYKZ1FDMy9rN0xYZkFjbTNqTktSS1huQ2cveWxTd2N6RjFGYkZKb1hjNW9ackc5TE8yQXNSdGcxanByN1ZpRlZNYwo0LzB5cEFSTmJqRzA4Y0I5bzBrbVBjUVExUHd4Q05EeXVONVRQYzRKejN3OHR5SnhTN289Ci0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg==
-

配置 kubectl 客户端

在客户端电脑完成如下配置,即可远程管理 Kubernetes 集群

Copyright © 2019-present Huanqing Shao | 京ICP备19008693号-2
- - - diff --git a/docs/install/install-kubernetes.html b/docs/install/install-kubernetes.html deleted file mode 100644 index 4a55a98..0000000 --- a/docs/install/install-kubernetes.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - 安装 Kubernetes 高可用 | Kuboard - - - - - - - -

安装 Kubernetes 高可用

推荐初学者按照 安装Kubernetes 单Master节点 文档进行 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 \
-	docker-latest \
-	docker-latest-logrotate \
-	docker-logrotate \
-	docker-selinux \
-	docker-engine-selinux \
-	docker-engine
-

下载依赖包及安装包

wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm
-
-wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-cli-18.09.7-3.el7.x86_64.rpm
-
-wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-18.09.7-3.el7.x86_64.rpm
-

安装

sudo yum install -y containerd.io-1.2.6-3.3.el7.x86_64.rpm
-sudo yum install -y docker-ce-cli-18.09.7-3.el7.x86_64.rpm
-sudo yum install -y docker-ce-18.09.7-3.el7.x86_64.rpm
-sudo systemctl enable docker
-

启动 docker 服务

sudo systemctl start docker
-

检查 docker 版本

docker version
-

参考文档

https://docs.docker.com/install/linux/docker-ce/centos/

https://docs.docker.com/install/linux/linux-postinstall/

安装 nfs-utils

执行安装命令

sudo yum install nfs-utils
-

必须先安装 nfs-utils 才能挂载 nfs 网络存储

K8S基本配置

配置K8S的yum源

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
-[kubernetes]
-name=Kubernetes
-baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
-enabled=1
-gpgcheck=0
-repo_gpgcheck=0
-gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
-        http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
-EOF
-

关闭swap、防火墙

swapoff -a
-

关闭SeLinux

setenforce 0
-

修改 /etc/sysctl.conf

vim /etc/sysctl.conf

向其中添加

net.ipv4.ip_forward = 1
-net.bridge.bridge-nf-call-ip6tables = 1
-net.bridge.bridge-nf-call-iptables = 1
-

如下图所示

image-20190715085036593

安装kubelet、kubeadm、kubectl

yum install -y kubelet-1.15.0 kubeadm-1.15.0 kubectl-1.15.0
-

修改docker Cgroup Driver为systemd

vim /usr/lib/systemd/system/docker.service

向其中他添加

--exec-opt native.cgroupdriver=systemd

如下图所示

屏幕快照 2019-07-15 09.01.21

重启 docker

systemctl daemon-reload
-systemctl restart docker
-

启动kubelet

systemctl enable kubelet && systemctl start kubelet
-

加载 kubernetes 镜像

由于k8s服务相关镜像在国外镜像源,国内无法访问

执行以下命令添加docker k8s国内镜像源

curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
-
-systemctl restart docker
-

拉取k8s相关镜像

docker pull mirrorgooglecontainers/kube-apiserver:v1.15.0
-docker pull mirrorgooglecontainers/kube-controller-manager:v1.15.0
-docker pull mirrorgooglecontainers/kube-scheduler:v1.15.0
-docker pull mirrorgooglecontainers/kube-proxy:v1.15.0
-docker pull mirrorgooglecontainers/pause:3.1
-docker pull mirrorgooglecontainers/etcd:3.3.10
-docker pull coredns/coredns:1.3.1
-

更改镜像名为k8s官网镜像

docker tag d235b23c3570 k8s.gcr.io/kube-proxy:v1.15.0
-docker tag 201c7a840312 k8s.gcr.io/kube-apiserver:v1.15.0
-docker tag 2d3813851e87 k8s.gcr.io/kube-scheduler:v1.15.0
-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 制作虚拟机镜像 的文档

初始化API Server

创建 ApiServer 的 ELB(私网)

监听端口:6443 / TCP

后端资源组:包含 apple-master-a-1, apple-master-b-1, apple-master-b-2

后端端口:6443

开启 按源地址保持会话

假设完成创建以后,ELB的 ip 地址为 x.x.x.x

初始化第一个master节点

在 apple-master-a-1机器上执行

配置 apiserver.apple 的域名

sudo -i
-echo "x.x.x.x  apiserver.apple" >> /etc/hosts
-

请替换其中的 x.x.x.x 为您的负载均衡服务器的实际 ip 地址

创建 /root/k8s/kubeadm-config.yaml

apiVersion: kubeadm.k8s.io/v1beta1
-kind: ClusterConfiguration
-kubernetesVersion: v1.14.3
-controlPlaneEndpoint: "apiserver.apple:6443"
-
-

初始化 apiserver

kubeadm init --config=/root/k8s/kubeadm-config.yaml --upload-certs
-
-

执行结果如下图所示:

image2019-6-10_15-36-29

初始化 gitlab-runner 用户的 kubectl 配置

rm -rf /home/gitlab-runner/.kube/
-mkdir /home/gitlab-runner/.kube/
-cp -i /etc/kubernetes/admin.conf /home/gitlab-runner/.kube/config
-chown -R gitlab-runner:gitlab-runner /home/gitlab-runner/.kube
-

安装 calico

(需要在安全组–ServerFarm需要为集群服务器器端口6443建立安全组规则)

su - gitlab-runner
-kubectl apply -f \
-		https://docs.projectcalico.org/v3.6/getting-started/kubernetes/installation/hosted/kubernetes-datastore/calico-networking/1.7/calico.yaml
-

安装calico, 请参考https://docs.projectcalico.org/v3.6/getting-started/kubernetes/

等待calico安装就绪:

执行如下命令,等待3-10分钟,直到所有的容器组处于 Running 状态

watch kubectl get pod -n kube-system
-

初始化第二、三个master节点

在 apple-master-b-1 和 apple-master-b-2 机器上执行

sudo -i
-echo "x.x.x.x  apiserver.apple" >> /etc/hosts
-

执行 (以下命令行在初始化 apple-master-a-1 时,被打印在控制台上,执行时应该使用控制台打印出的命令参数)

kubeadm join apiserver.apple:6443 --token ejwx62.vqwog6il5p83uk7y \
---discovery-token-ca-cert-hash sha256:6f7a8e40a810323672de5eee6f4d19aa2dbdb38411845a1bf5dd63485c43d303 \
---experimental-control-plane --certificate-key 70eb87e62f052d2d5de759969d5b42f372d0ad798f98df38f7fe73efdf63a13c
-

检查 apiserver初始化结果

在第一个master节点 apple-master-a-1 上执行

sudo -i
-su - gitlab-runner
-kubectl get nodes
-

初始化 worker节点

获得 join命令参数

在第一个master节点 apple-master-a-1 节点执行

sudo -i
-kubeadm token create --print-join-command
-

可获取kubeadm join 命令及参数,如下所示

kubeadm join apiserver.apple:6443 --token mpfjma.4vjjg8flqihor4vt     --discovery-token-ca-cert-hash sha256:6f7a8e40a810323672de5eee6f4d19aa2dbdb38411845a1bf5dd63485c43d303
-

初始化worker

针对所有的 worker 节点执行

sudo -i
-echo "x.x.x.x  apiserver.apple" >> /etc/hosts
-kubeadm join apiserver.apple:6443 --token mpfjma.4vjjg8flqihor4vt     --discovery-token-ca-cert-hash sha256:6f7a8e40a810323672de5eee6f4d19aa2dbdb38411845a1bf5dd63485c43d303
-
  • 将 x.x.x.x 替换为 loader balancer 的实际 ip

  • 将 kubeadm join 命令后的参数替换为上一个步骤中实际从 apple-master-a-1 节点获得的参数

检查 apiserver初始化结果

在第一个master节点 apple-master-a-1 上执行

sudo -i
-su - gitlab-runner
-kubectl get nodes
-

移除 worker 节点

正常情况下,您无需移除 worker 节点

在准备移除的 worker 节点上执行

sudo -i	
-kubeadm reset
-

在第一个 master 节点 apple-master-a-1 上执行

sudo -i
-su - gitlab-runner
-kubectl delete node apple-worker-x-x
-
  • 将 apple-worker-x-x 替换为要移除的 worker 节点的名字
  • worker 节点的名字可以通过在第一个 master 节点 apple-master-a-1 上执行 kubectl get nodes 命令获得

安装 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 错误页面

Copyright © 2019-present Huanqing Shao | 京ICP备19008693号-2
- - - diff --git a/docs/kuboard_example.yaml b/docs/kuboard_example.yaml deleted file mode 100644 index 5b7a7ab..0000000 --- a/docs/kuboard_example.yaml +++ /dev/null @@ -1,360 +0,0 @@ - ---- -apiVersion: apps/v1 -kind: StatefulSet -metadata: - namespace: example - name: cloud-eureka - annotations: - k8s.eip.work/workload: cloud-eureka - k8s.eip.work/displayName: 服务注册 - k8s.eip.work/service: ClusterIP - k8s.eip.work/ingress: 'true' - labels: - k8s.eip.work/layer: cloud - k8s.eip.work/name: cloud-eureka -spec: - selector: - matchLabels: - k8s.eip.work/layer: cloud - k8s.eip.work/name: cloud-eureka - template: - metadata: - labels: - k8s.eip.work/layer: cloud - k8s.eip.work/name: cloud-eureka - spec: - imagePullSecrets: - - {} - initContainers: [] - containers: - - image: 'eipsample/example-cloud-eureka:v1.0.0-alpha.1' - imagePullPolicy: Always - name: cloud-eureka - volumeMounts: [] - resources: {} - env: - - name: CLOUD_EUREKA_DEFAULT_ZONE - value: 'http://cloud-eureka-0:9200/eureka' - volumes: [] - replicas: 1 - volumeClaimTemplates: [] - serviceName: cloud-eureka - ---- -apiVersion: v1 -kind: Service -metadata: - namespace: example - name: cloud-eureka - annotations: - k8s.eip.work/workload: cloud-eureka - k8s.eip.work/displayName: 服务注册 - labels: - k8s.eip.work/layer: cloud - k8s.eip.work/name: cloud-eureka -spec: - selector: - k8s.eip.work/layer: cloud - k8s.eip.work/name: cloud-eureka - type: ClusterIP - ports: - - port: 9200 - targetPort: 9200 - protocol: TCP - name: mtfsyi - nodePort: 0 - ---- -apiVersion: networking.k8s.io/v1beta1 -kind: Ingress -metadata: - namespace: example - name: cloud-eureka - annotations: - k8s.eip.work/workload: cloud-eureka - k8s.eip.work/displayName: 服务注册 - labels: - k8s.eip.work/layer: cloud - k8s.eip.work/name: cloud-eureka -spec: - rules: - - host: cloud-eureka.example.demo.eip.work - http: - paths: - - path: / - backend: - serviceName: cloud-eureka - servicePort: mtfsyi - ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - namespace: example - name: db-example - annotations: - k8s.eip.work/workload: db-example - k8s.eip.work/displayName: db-example - k8s.eip.work/service: ClusterIP - k8s.eip.work/ingress: 'false' - labels: - k8s.eip.work/layer: db - k8s.eip.work/name: db-example -spec: - selector: - matchLabels: - k8s.eip.work/layer: db - k8s.eip.work/name: db-example - template: - metadata: - labels: - k8s.eip.work/layer: db - k8s.eip.work/name: db-example - spec: - imagePullSecrets: - - {} - initContainers: [] - containers: - - image: 'eipsample/example-db-example:v1.0.0-alpha.1' - imagePullPolicy: Always - name: db-example - volumeMounts: - - name: db-example-storage - mountPath: /var/lib/mysql - subPath: mysql - resources: {} - env: - - name: MYSQL_ROOT_PASSWORD - value: 'soqjdke4#es' - volumes: - - name: db-example-storage - persistentVolumeClaim: - claimName: db-example-storage - replicas: 1 - ---- -apiVersion: v1 -kind: Service -metadata: - namespace: example - name: db-example - annotations: - k8s.eip.work/workload: db-example - k8s.eip.work/displayName: db-example - labels: - k8s.eip.work/layer: db - k8s.eip.work/name: db-example -spec: - selector: - k8s.eip.work/layer: db - k8s.eip.work/name: db-example - type: ClusterIP - ports: - - port: 3306 - targetPort: 3306 - protocol: TCP - name: fp6ksw - nodePort: 0 - ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - namespace: example - name: gateway-example - annotations: - k8s.eip.work/workload: gateway-example - k8s.eip.work/displayName: gateway-example - k8s.eip.work/service: ClusterIP - k8s.eip.work/ingress: 'false' - labels: - k8s.eip.work/layer: gateway - k8s.eip.work/name: gateway-example -spec: - selector: - matchLabels: - k8s.eip.work/layer: gateway - k8s.eip.work/name: gateway-example - template: - metadata: - labels: - k8s.eip.work/layer: gateway - k8s.eip.work/name: gateway-example - spec: - imagePullSecrets: - - {} - initContainers: [] - containers: - - image: 'eipsample/example-gateway-example:v1.0.0-alpha.1' - imagePullPolicy: Always - name: gateway-example - volumeMounts: [] - resources: {} - env: - - name: CLOUD_EUREKA_DEFAULT_ZONE - value: 'http://cloud-eureka:9200/eureka' - - name: SPRING_PROFILES_ACTIVE - value: example - volumes: [] - replicas: 1 - ---- -apiVersion: v1 -kind: Service -metadata: - namespace: example - name: gateway-example - annotations: - k8s.eip.work/workload: gateway-example - k8s.eip.work/displayName: gateway-example - labels: - k8s.eip.work/layer: gateway - k8s.eip.work/name: gateway-example -spec: - selector: - k8s.eip.work/layer: gateway - k8s.eip.work/name: gateway-example - type: ClusterIP - ports: - - port: 9201 - targetPort: 9201 - protocol: TCP - name: pdmd3y - nodePort: 0 - ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - namespace: example - name: svc-example - annotations: - k8s.eip.work/workload: svc-example - k8s.eip.work/displayName: svc-example - k8s.eip.work/service: none - k8s.eip.work/ingress: 'false' - labels: - k8s.eip.work/layer: svc - k8s.eip.work/name: svc-example -spec: - selector: - matchLabels: - k8s.eip.work/layer: svc - k8s.eip.work/name: svc-example - template: - metadata: - labels: - k8s.eip.work/layer: svc - k8s.eip.work/name: svc-example - spec: - imagePullSecrets: - - {} - initContainers: [] - containers: - - image: 'eipsample/example-svc-example:v1.0.0-alpha.1' - imagePullPolicy: Always - name: svc-example - volumeMounts: [] - resources: {} - env: - - name: CLOUD_EUREKA_DEFAULT_ZONE - value: 'http://cloud-eureka:9200/eureka' - - name: DB_EXAMPLE_URL - value: >- - jdbc:mysql://db-example:3306/eip_db_example?characterEncoding=utf8&useSSL=false - - name: DB_EXAMPLE_USERNAME - value: eip_user - - name: DB_EXAMPLE_PASSWORD - value: 1qaz2wsx - - name: snowflake.dataCenterId - value: '1' - - name: csp.sentinel.dashboard.server - value: monitor-sentinel - volumes: [] - replicas: 1 - ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - namespace: example - name: web-example - annotations: - k8s.eip.work/workload: web-example - k8s.eip.work/displayName: web-example - k8s.eip.work/service: ClusterIP - k8s.eip.work/ingress: 'true' - labels: - k8s.eip.work/layer: web - k8s.eip.work/name: web-example -spec: - selector: - matchLabels: - k8s.eip.work/layer: web - k8s.eip.work/name: web-example - template: - metadata: - labels: - k8s.eip.work/layer: web - k8s.eip.work/name: web-example - spec: - imagePullSecrets: - - {} - initContainers: [] - containers: - - image: 'eipsample/example-web-example:v1.0.0-alpha.1' - imagePullPolicy: Always - name: web-example - volumeMounts: [] - resources: {} - env: [] - volumes: [] - replicas: 1 - ---- -apiVersion: v1 -kind: Service -metadata: - namespace: example - name: web-example - annotations: - k8s.eip.work/workload: web-example - k8s.eip.work/displayName: web-example - labels: - k8s.eip.work/layer: web - k8s.eip.work/name: web-example -spec: - selector: - k8s.eip.work/layer: web - k8s.eip.work/name: web-example - type: ClusterIP - ports: - - port: 80 - targetPort: 80 - protocol: TCP - name: mawfrp - nodePort: 0 - ---- -apiVersion: networking.k8s.io/v1beta1 -kind: Ingress -metadata: - namespace: example - name: web-example - annotations: - k8s.eip.work/workload: web-example - k8s.eip.work/displayName: we-example - labels: - k8s.eip.work/layer: web - k8s.eip.work/name: web-example -spec: - rules: - - host: web-example.example.demo.eip.work - http: - paths: - - path: / - backend: - serviceName: web-example - servicePort: mawfrp - diff --git a/docs/micro-service/spring-cloud/cloud-eureka.html b/docs/micro-service/spring-cloud/cloud-eureka.html deleted file mode 100644 index 1b7134e..0000000 --- a/docs/micro-service/spring-cloud/cloud-eureka.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - 部署 cloud-eureka | Kuboard - - - - - - - -

部署 cloud-eureka

Copyright © 2019-present Huanqing Shao | 京ICP备19008693号-2
- - - diff --git a/docs/micro-service/spring-cloud/index.html b/docs/micro-service/spring-cloud/index.html deleted file mode 100644 index f480029..0000000 --- a/docs/micro-service/spring-cloud/index.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - Spring Cloud on Kubernetes | Kuboard - - - - - - - -

Spring Cloud on Kubernetes

使用 Kuboard 完成 Spring Cloud 微服务应用的部署。

Copyright © 2019-present Huanqing Shao | 京ICP备19008693号-2
- - - diff --git a/docs/overview.png b/docs/overview.png deleted file mode 100644 index b8cf8b5..0000000 Binary files a/docs/overview.png and /dev/null differ diff --git a/docs/overview/change-log-on-the-way.html b/docs/overview/change-log-on-the-way.html deleted file mode 100644 index a412a3f..0000000 --- a/docs/overview/change-log-on-the-way.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - v1.0.0-beta.13 | Kuboard - - - - - - - -

v1.0.0-beta.13

发布日期

2019-

优化

  • 创建 namespace/configmap/secrets/pvc/deployment/Service/Ingress 等 K8S 对象时,对表单中的名字等字段做 trim() 操作

BUG 修复

Copyright © 2019-present Huanqing Shao | 京ICP备19008693号-2
- - - diff --git a/docs/overview/change-log.html b/docs/overview/change-log.html deleted file mode 100644 index c3e4eed..0000000 --- a/docs/overview/change-log.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - 更新日志 | Kuboard - - - - - - - -

更新日志

v1.0.0-beta.13

发布日期

2019-07-28

优化

  • 调整主题色
  • 查看 Kuboard 版本信息
  • 一次删除 Deployment 下所有的错误事件 (# 1)

BUG 修复

  • Kubernetes 二进制安装时, Kuboard 无法启动
  • Kubernetes 中缺少 kube-dns Service 时, Kuboard 无法启动
Copyright © 2019-present Huanqing Shao | 京ICP备19008693号-2
- - - diff --git a/docs/overview/concepts.html b/docs/overview/concepts.html deleted file mode 100644 index 19a3254..0000000 --- a/docs/overview/concepts.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - 如何降低 Kubernetes 学习门槛 | Kuboard - - - - - - - -

如何降低 Kubernetes 学习门槛

Kubernetes 学习门槛在哪儿

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

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

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

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

降低 Kubernetes 学习门槛

学习路线

单纯地按章节学习 Linux 基础知识、网络知识、容器技术等,每一块儿的基础入门书籍就有几百页之多。作者认为,最好的学习方法是在实践中学习,碰到问题时去寻求答案,解决问题后去反思总结。这种学习方法趣味性强,得来的知识也最为牢靠,如果选对了方向,所学知识通常也是工作中实用性最高的知识。读了100页 K8S 文档,也不如安装一遍 K8S

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

进阶路线:

  • 在 Kubernetes 中部署 Spring Cloud 微服务应用

快速入门

​ 在向 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 爱好者增加了新的学习门槛。

入门利器

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

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

image-20190722165648180

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

image-20190722162249531

1. 基本信息

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

  • Deployment
  • StatefulSet
  • DaemonSet

Kuboard 将陆续支持其他低频使用的 Controller: 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 端口 -
    • 如果您启用了 HTTPS,请同时确保通过该域名可以访问 Worker 节点的 443 端口

​ Kuboard 中,定义互联网入口的界面如下所示:

image-20190722185113938

Copyright © 2019-present Huanqing Shao | 京ICP备19008693号-2
- - - diff --git a/docs/overview/index.html b/docs/overview/index.html deleted file mode 100644 index 6f1f697..0000000 --- a/docs/overview/index.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - Kuboard 简介 | Kuboard - - - - - - - -

Kuboard 简介

A cool Kubernetes dashboard.

Kuboard 可以有效降低 Kubernetes 初学者的学习门槛,对于有经验的用户,也是非常顺手的一款运维工具。

Kuboard 的主要特点:

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

image-20190716234146419

在线体验

- Kuboard 在线体验 -

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

开始使用

Kubernetes 初学者

单纯地按章节学习 Linux 基础知识、网络知识、容器技术等,每一块儿的基础入门书籍就有几百页之多。

最好的学习方法是在 实践中学习,碰到问题时去寻求答案,解决问题 之后 总结反思。这种学习方法趣味性强,得来的知识也最为牢靠,所学知识通常也是工作中实用性最高的。

读 100 页 K8S 文档,不如把 K8S 安装一遍

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

Kubernetes 有经验者

作为资深的 Kubernetes 用户,您一定有如下痛苦:

  • Yaml 复杂繁多
    • Yaml 文件冗长、繁多
    • 编写和维护 YAML 文件耗费了大量的时间
  • 多环境
    • 准备了开发环境,又要维护测试环境、准上线环境、生产环境
  • kubectl 命令复杂难记
    • 反复执行 kubectl 命令,与集群的交互界面始终处于片段化的信息中,需要连续好几个命令才能诊断问题

Kuboard 为您的这些痛苦提供了极佳的解决方案,请立刻开始:

Kubernetes + Spring Cloud

使用 Kuboard 在 Kubernetes 上部署 Spring Cloud 微服务:(正在编写文档,准备好后,请通知我

Kubernetes + Devops

正在编写文档,准备好后,请通知我

在线提问

Kuboard 兴趣群二维码

Copyright © 2019-present Huanqing Shao | 京ICP备19008693号-2
- - - diff --git a/docs/overview/k8s-core-concepts.html b/docs/overview/k8s-core-concepts.html deleted file mode 100644 index 0fb6dde..0000000 --- a/docs/overview/k8s-core-concepts.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - 十分钟带你理解Kubernetes核心概念 | Kuboard - - - - - - - -

十分钟带你理解Kubernetes核心概念

转载信息:

译文链接 译者:崔婧雯

原文链接 作者:Omer Dawelbeit

本文将会简单介绍Kubernetes的核心概念。因为这些定义可以在Kubernetes的文档中找到,所以文章也会避免用大段的枯燥的文字介绍。相反,我们会使用一些图表(其中一些是动画)和示例来解释这些概念。我们发现一些概念(比如Service)如果没有图表的辅助就很难全面地理解。在合适的地方我们也会提供Kubernetes文档的链接以便读者深入学习。

什么是Kubernetes?

Kubernetes(k8s)是自动化容器操作的开源平台,这些操作包括部署,调度和节点集群间扩展。如果你曾经用过Docker容器技术部署容器,那么可以将Docker看成Kubernetes内部使用的低级别组件。Kubernetes不仅仅支持Docker,还支持Rocket,这是另一种容器技术。 -使用Kubernetes可以:

  • 自动化容器的部署和复制
  • 随时扩展或收缩容器规模
  • 将容器组织成组,并且提供容器间的负载均衡
  • 很容易地升级应用程序容器的新版本
  • 提供容器弹性,如果容器失效就替换它,等等...

集群

集群是一组节点,这些节点可以是物理服务器或者虚拟机,之上安装了Kubernetes平台。下图展示这样的集群。注意该图为了强调核心概念有所简化。这里可以看到一个典型的Kubernetes架构图。

1.png

上图可以看到如下组件,使用特别的图标表示Service和Label:

  • PodContainer(容器)
  • Label(label)(标签)
  • Replication Controller(复制控制器)
  • Service(enter image description here)(服务)
  • Node(节点)
  • Kubernetes Master(Kubernetes主节点)

Pod

Pod(上图绿色方框)安排在节点上,包含一组容器和卷。同一个Pod里的容器共享同一个网络命名空间,可以使用localhost互相通信。Pod是短暂的,不是持续性实体。你可能会有这些问题:

  • 如果Pod是短暂的,那么我怎么才能持久化容器数据使其能够跨重启而存在呢? 是的,Kubernetes支持 的概念,因此可以使用持久化的卷类型。
  • 是否手动创建Pod,如果想要创建同一个容器的多份拷贝,需要一个个分别创建出来么?可以手动创建单个Pod,但是也可以使用Replication Controller使用Pod模板创建出多份拷贝,下文会详细介绍。
  • 如果Pod是短暂的,那么重启时IP地址可能会改变,那么怎么才能从前端容器正确可靠地指向后台容器呢?这时可以使用Service,下文会详细介绍。

Label

正如图所示,一些Pod有Label(enter image description here)。一个Label是attach到Pod的一对键/值对,用来传递用户定义的属性。比如,你可能创建了一个"tier"和“app”标签,通过Label(tier=frontend, app=myapp)来标记前端Pod容器,使用Label(tier=backend, app=myapp)标记后台Pod。然后可以使用 Selectors 选择带有特定Label的Pod,并且将Service或者Replication Controller应用到上面。

Replication Controller

是否手动创建Pod,如果想要创建同一个容器的多份拷贝,需要一个个分别创建出来么,能否将Pods划到逻辑组里?

Replication Controller确保任意时间都有指定数量的Pod“副本”在运行。如果为某个Pod创建了Replication Controller并且指定3个副本,它会创建3个Pod,并且持续监控它们。如果某个Pod不响应,那么Replication Controller会替换它,保持总数为3.如下面的动画所示:

2.gif

如果之前不响应的Pod恢复了,现在就有4个Pod了,那么Replication Controller会将其中一个终止保持总数为3。如果在运行中将副本总数改为5,Replication Controller会立刻启动2个新Pod,保证总数为5。还可以按照这样的方式缩小Pod,这个特性在执行滚动 升级 时很有用。

当创建Replication Controller时,需要指定两个东西:

  1. Pod模板:用来创建Pod副本的模板
  2. Label:Replication Controller需要监控的Pod的标签。现在已经创建了Pod的一些副本,那么在这些副本上如何均衡负载呢?我们需要的是Service。

最新 Kubernetes 版本里,推荐使用 Deployment

Service

如果Pods是短暂的,那么重启时IP地址可能会改变,怎么才能从前端容器正确可靠地指向后台容器呢? Service 抽象 -现在,假定有2个后台Pod,并且定义后台Service的名称为‘backend-service’,lable选择器为()。 的Service会完成如下两件重要的事情:

  • 会为Service创建一个本地集群的DNS入口,因此前端Pod只需要DNS查找主机名为 ‘backend-service’,就能够解析出前端应用程序可用的IP地址。
  • 现在前端已经得到了后台服务的IP地址,但是它应该访问2个后台Pod的哪一个呢?Service在这2个后台Pod之间提供透明的负载均衡,会将请求分发给其中的任意一个(如下面的动画所示)。通过每个Node上运行的代理(kube-proxy)完成。

下述动画展示了Service的功能。注意该图作了很多简化。如果不进入网络配置,那么达到透明的负载均衡目标所涉及的底层网络和路由相对先进。如果有兴趣,有更深入的介绍。

3.gif

每个节点都运行如下Kubernetes关键组件:

  • Kubelet:是主节点代理。
  • Kube-proxy:Service使用其将链接路由到Pod,如上文所述。
  • Docker或Rocket:Kubernetes使用的容器技术来创建容器。

Kubernetes Master

集群拥有一个Kubernetes Master(紫色方框)。Kubernetes Master提供集群的独特视角,并且拥有一系列组件,比如Kubernetes API Server。API Server提供可以用来和集群交互的REST端点。master节点包括用来创建和复制Pod的Replication Controller。

Copyright © 2019-present Huanqing Shao | 京ICP备19008693号-2
- - - diff --git a/docs/overview/support.html b/docs/overview/support.html deleted file mode 100644 index 20403cc..0000000 --- a/docs/overview/support.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - 支持 | Kuboard - - - - - - - -

支持

提交 BUG

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

在线提问

QQ 群

kuboard_qq

Copyright © 2019-present Huanqing Shao | 京ICP备19008693号-2
- - - diff --git a/docs/overview/why-kuboard.html b/docs/overview/why-kuboard.html deleted file mode 100644 index 880cba6..0000000 --- a/docs/overview/why-kuboard.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - 为什么选择 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 实现的微服务
  • 持久层 -
    • MySQL 数据库等(开发及测试环境里,将MySQL部署于 Kubernetes 可以极大地降低环境维护的任务量)
  • 中间件层 -
    • 消息队列
    • 服务注册 Eureka / Zookeeper / Consul 等
  • 监控层 -
    • Prometheus + Grafana
    • Pinpooint 等

image-20190721154650916

​ 更为贴心的,当某一个工作负载存在部署方面的问题时, Kuboard 将以红色高亮出该工作负载,并配有合适的方式辅助用户定位错误信息。

无需手写 Yaml

​ 学习 Kubernetes 时,需要花费许多的时间,在理解一个概念之后,模仿着写一个 yaml 文件,再使用 kubectl 应用该文件。

​ 使用 Kuboard 提供的工作负载编辑器,可以直观的完成应用的部署

image-20190723105039358

Kubernetes 日常运维人员

​ kubectl 的命令敲了许多遍了?yaml 文件越来越多,结构越来越复杂?又要部署一套测试环境,用来进行 UAT 测试?

纯图形界面运维 Kubernetes

在作者的日常运维工作中,除了 kubectl port-forward 还需要回到命令行界面以外,其他运维任务已经全部在 Kuboard 中轻松完成。更让人期待的是,Kuboard 作者还计划实现 port-forward 的功能,如此一来,作者日后就完全不再需要使用 kubectl 了。

多环境复制

为了能够是你的一套 yaml 文件适应多种部署(开发环境、测试环境、UAT环境、生产环境),您一定尝试过各种办法,例如 helmer chart, kustomize, kubectl apply -k directory_name,但是您本来可以更轻松地完成这样的任务的。

Kuboard 提供了 工作负载导出和导入的功能,0 yaml文件,轻松复制多个环境。

应用升级

Kuboard 提供批量修改容器镜像版本的功能,轻松升级应用程序的版本。

image-20190721000759925

0 侵入性

​ Rancher 为了支持多云管理(MeSos,Docker Swarm,Kubernetes等),引入了一系列复杂的概念,又需要新增安装 Rancher Server、Rancher Agent等,本来学习 Kubernetes 已然不堪重负,Rancher再把多云整合到一起来,无疑又增加了学习和使用的复杂性。如果您只是打算使用 Kubernetes 的话,也许并不需要选择 Rancher 这样重量级的产品。Kuboard 仅仅依赖于原生 Kubernetes,可以运行在各种公有云、私有云上,您也可以自己基于物理机、vsphere、vmware等已经有的基础设施搭建 Kubernetes,轻松实现现有 Infrastructure 的容器化改造。

更多资料

Kuboard 官网 http://kuboard.cn

Kuboard QQ 群

Kuboard QQ 群

Copyright © 2019-present Huanqing Shao | 京ICP备19008693号-2
- - - diff --git a/guide/README.md b/guide/README.md index e498320..9d43e12 100644 --- a/guide/README.md +++ b/guide/README.md @@ -9,15 +9,15 @@ * 创建一个最简单的工作负载 - [创建 busybox](example/busybox) + [创建 busybox](example/busybox.html) * 导入一套最简单的 Spring Cloud 微服务工作负载 - [导入 example](example/import) + [导入 example](example/import.html) * 根据微服务上下文查看监控结果 - [在微服务上下文中监控 example](example/monitor) + [在微服务上下文中监控 example](example/monitor.html) **Kuboard 可用于** diff --git a/guide/cluster/namespace.md b/guide/cluster/namespace.md index 6ec440f..a718b70 100644 --- a/guide/cluster/namespace.md +++ b/guide/cluster/namespace.md @@ -8,7 +8,7 @@ * Kubernetes 集群 * 已在集群中安装 Kuboard -* 已进入 Kuboard 操作界面 [安装并进入 Kuboard](/install/install-dashboard) +* 已进入 Kuboard 操作界面 [安装并进入 Kuboard](/install/install-dashboard.html) diff --git a/guide/example/import.md b/guide/example/import.md index 5c851e8..fe45642 100644 --- a/guide/example/import.md +++ b/guide/example/import.md @@ -9,11 +9,11 @@ ## 创建存储资源 -example中用到了存储卷声明,请在 Kuboard 中 [创建存储类](/guide/cluster/storage?id=创建存储类) ,否则不能完成 example 的导入操作。 +example中用到了存储卷声明,请在 Kuboard 中 [创建存储类](/guide/cluster/storage.html?id=创建存储类) ,否则不能完成 example 的导入操作。 ## 创建名称空间 -创建新的名称空间,用来导入 exmaple。可参考 [创建名称空间](/guide/cluster/namespace?id=创建名称空间) +创建新的名称空间,用来导入 exmaple。可参考 [创建名称空间](/guide/cluster/namespace.html?id=创建名称空间) 假设您已经进入了 Kuboard 名称空间界面,如下图所示: diff --git a/guide/example/monitor.md b/guide/example/monitor.md index 37013b9..0971807 100644 --- a/guide/example/monitor.md +++ b/guide/example/monitor.md @@ -6,7 +6,7 @@ 必须具备如下条件: -* 已完成 [导入 example 微服务](/guide/example/import) +* 已完成 [导入 example 微服务](/guide/example/import.html) ::: warning diff --git a/guide/monitor/README.md b/guide/monitor/README.md index 4ad2ca3..26f92d2 100644 --- a/guide/monitor/README.md +++ b/guide/monitor/README.md @@ -2,5 +2,5 @@ 文档建设中... -> * 请参考 [监控 example](/guide/example/monitor) 体验 Kuboard 在监控套件方面的设想 +> * 请参考 [监控 example](/guide/example/monitor.html) 体验 Kuboard 在监控套件方面的设想 > * 监控套件以插件的形式整合到 Kuboard,在不使用监控套件的情况下,Kuboard 的所有功能都可正常工作 \ No newline at end of file diff --git a/guide/monitor/apis.md b/guide/monitor/apis.md index 9e4e625..7215929 100644 --- a/guide/monitor/apis.md +++ b/guide/monitor/apis.md @@ -2,5 +2,5 @@ 文档建设中... -> * 请参考 [监控 example](/guide/example/monitor) 体验 Kuboard 在监控套件方面的设想 +> * 请参考 [监控 example](/guide/example/monitor.html) 体验 Kuboard 在监控套件方面的设想 > * 监控套件以插件的形式整合到 Kuboard,在不使用监控套件的情况下,Kuboard 的所有功能都可正常工作 \ No newline at end of file diff --git a/guide/namespace/multi-env.md b/guide/namespace/multi-env.md index 52344ed..55915c6 100644 --- a/guide/namespace/multi-env.md +++ b/guide/namespace/multi-env.md @@ -23,7 +23,7 @@ Kuboard 针对这种场景,提供了导出配置、导入配置的功能,以 必须满足如下条件: -* 您已经通过 kuboard 的 [创建工作负载](/guide/namespace/workload) 功能完成了微服务的部署。 +* 您已经通过 kuboard 的 [创建工作负载](/guide/namespace/workload.html) 功能完成了微服务的部署。 > 部署微服务过程中,您还可能用到 kuboard 的配置编辑功能、Secrets 编辑功能 等。 diff --git a/guide/namespace/workload.md b/guide/namespace/workload.md index f2201c8..a50625d 100644 --- a/guide/namespace/workload.md +++ b/guide/namespace/workload.md @@ -6,7 +6,7 @@ -请参考 [创建 busybox](/guide/example/busybox) +请参考 [创建 busybox](/guide/example/busybox.html) diff --git a/install/install-dashboard.md b/install/install-dashboard.md index c1753ac..b058fab 100644 --- a/install/install-dashboard.md +++ b/install/install-dashboard.md @@ -6,8 +6,8 @@ 如果没有 Kubernetes 集群: -* 初学者, 请参考 [安装 Kubernetes 单Master节点](install-k8s) -* 用于生产,请参考 [安装 Kubernetes 高可用](install-kubernetes) +* 初学者, 请参考 [安装 Kubernetes 单Master节点](install-k8s.html) +* 用于生产,请参考 [安装 Kubernetes 高可用](install-kubernetes.html) 碰到问题? **在线提问** @@ -181,6 +181,6 @@ kubectl port-forward service/kuboard 8080:80 -n kube-system **下一步** -- 使用 Kuboard 工作负载编辑器 [创建 busybox](/guide/example/busybox) (10分钟) +- 使用 Kuboard 工作负载编辑器 [创建 busybox](/guide/example/busybox.html) (10分钟) -- 尝试 Kuboard 设计的其他 example [使用 Kuboard](/guide/index) +- 尝试 Kuboard 设计的其他 example [使用 Kuboard](/guide/index.html) diff --git a/install/install-k8s.assets/image-20190731135811556.png b/install/install-k8s.assets/image-20190731135811556.png new file mode 100644 index 0000000..716f43e Binary files /dev/null and b/install/install-k8s.assets/image-20190731135811556.png differ diff --git a/install/install-k8s.md b/install/install-k8s.md index 7fe0317..dc56c2a 100644 --- a/install/install-k8s.md +++ b/install/install-k8s.md @@ -15,7 +15,7 @@ Kuboard 的 Live Demo 环境使用的是如下拓扑结构,本文档描述了 * Kubernetes v1.15.0 * Docker 18.09.7 -![image-20190726214032585](./install-k8s.assets/image-20190726214032585.png) +![image-20190731135811556](./install-k8s.assets/image-20190731135811556.png) ## 制作标准机镜像 diff --git a/install/install-kubernetes.md b/install/install-kubernetes.md index 91491f0..0a80af8 100644 --- a/install/install-kubernetes.md +++ b/install/install-kubernetes.md @@ -1,7 +1,7 @@ # 安装 Kubernetes 高可用 ::: tip -推荐初学者按照 [安装Kubernetes 单Master节点](install-k8s) 文档进行 Kubernetes 集群搭建 +推荐初学者按照 [安装Kubernetes 单Master节点](install-k8s.html) 文档进行 Kubernetes 集群搭建 ::: # 介绍 diff --git a/overview/README.md b/overview/README.md index 33664c2..edcbb6f 100644 --- a/overview/README.md +++ b/overview/README.md @@ -45,13 +45,13 @@ Kuboard 的主要特点: Kuboard 为 Kubernetes 初学者设计了如下学习路径: * **Kubernetes 入门** - * [安装 Kubernetes 单Master节点](/install/install-k8s) (1小时,初学者也许需要更多) - * [安装 Kuboard](/install/install-dashboard) (5分钟) - * 使用 Kuboard [创建 busybox](/guide/example/busybox) (10分钟) - * [导入 example 微服务应用](/guide/example/import) (15分钟) + * [安装 Kubernetes 单Master节点](/install/install-k8s.html) (1小时,初学者也许需要更多) + * [安装 Kuboard](/install/install-dashboard.html) (5分钟) + * 使用 Kuboard [创建 busybox](/guide/example/busybox.html) (10分钟) + * [导入 example 微服务应用](/guide/example/import.html) (15分钟) * **Kubernetes 进阶** - * [十分钟带你理解Kubernetes核心概念](k8s-core-concepts) + * [十分钟带你理解Kubernetes核心概念](k8s-core-concepts.html) * 集成 DevOps * 安装高可用 Kubernetes 集群 @@ -69,17 +69,17 @@ Kuboard 为 Kubernetes 初学者设计了如下学习路径: Kuboard 为您的这些痛苦提供了极佳的解决方案,请立刻开始: -* [安装 Kuboard](/install/install-dashboard) (5分钟) -* 使用 Kuboard [创建 busybox](/guide/example/busybox) (10分钟) -* [导入 example 微服务应用](/guide/example/import) (15分钟) -* [在微服务上下文中监控 example](/guide/example/monitor) (15分钟) +* [安装 Kuboard](/install/install-dashboard.html) (5分钟) +* 使用 Kuboard [创建 busybox](/guide/example/busybox.html) (10分钟) +* [导入 example 微服务应用](/guide/example/import.html) (15分钟) +* [在微服务上下文中监控 example](/guide/example/monitor.html) (15分钟) ### Kubernetes + Spring Cloud 使用 Kuboard 在 Kubernetes 上部署 Spring Cloud 微服务:(正在编写文档,[准备好后,请通知我](https://www.wjx.top/jq/43409534.aspx)) -* [概述](/micro-service/spring-cloud/) -* [部署服务注册中心](/micro-service/spring-cloud/cloud-eureka) +* [概述](/micro-service/spring-cloud/index.html) +* [部署服务注册中心](/micro-service/spring-cloud/cloud-eureka.html) * [部署数据库(用于测试)] * [部署微服务] * [部署服务网关] diff --git a/overview/concepts.assets/image-20190722165648180.png b/overview/concepts.assets/image-20190722165648180.png deleted file mode 100644 index 4d965f3..0000000 Binary files a/overview/concepts.assets/image-20190722165648180.png and /dev/null differ diff --git a/overview/concepts.assets/image-20190731134333772.png b/overview/concepts.assets/image-20190731134333772.png new file mode 100644 index 0000000..b3c90d4 Binary files /dev/null and b/overview/concepts.assets/image-20190731134333772.png differ diff --git a/overview/concepts.md b/overview/concepts.md index 648ad2b..d6d5e98 100644 --- a/overview/concepts.md +++ b/overview/concepts.md @@ -49,7 +49,7 @@ Kuboard 为初学者学习 Kubernetes 时设计了如下学习路径: Kuboard 工作负载编辑器以下图的方式理解和管理 Kubernetes 对象。 -![image-20190722165648180](./concepts.assets/image-20190722165648180.png) +![image-20190731134333772](./concepts.assets/image-20190731134333772.png) diff --git a/rp/kuboard.rp b/rp/kuboard.rp index 71dd5f1..4d9a882 100644 Binary files a/rp/kuboard.rp and b/rp/kuboard.rp differ