diff --git a/.vuepress/components/HomePage.vue b/.vuepress/components/HomePage.vue index 79e4409..822d152 100644 --- a/.vuepress/components/HomePage.vue +++ b/.vuepress/components/HomePage.vue @@ -121,6 +121,7 @@ export default { border-bottom 1px solid darken($accentColor, 10%) &:hover background-color lighten($accentColor, 10%) + color #fff .action-button2 color $accentColor background-color #ffffff diff --git a/docs/404.html b/docs/404.html index a026a04..3b7f340 100644 --- a/docs/404.html +++ b/docs/404.html @@ -7,11 +7,11 @@ - - + + -

404

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

404

There's nothing here.
Take me home.
+ diff --git a/docs/assets/css/0.styles.15c89faf.css b/docs/assets/css/0.styles.c7091ac7.css similarity index 93% rename from docs/assets/css/0.styles.15c89faf.css rename to docs/assets/css/0.styles.c7091ac7.css index 55b9ed3..d6bc0b7 100644 --- a/docs/assets/css/0.styles.15c89faf.css +++ b/docs/assets/css/0.styles.c7091ac7.css @@ -1 +1 @@ -#nprogress{pointer-events:none}#nprogress .bar{background:#007af5;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px #007af5,0 0 5px #007af5;opacity:1;transform:rotate(3deg) translateY(-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border-color:#007af5 transparent transparent #007af5;border-style:solid;border-width:2px;border-radius:50%;-webkit-animation:nprogress-spinner .4s linear infinite;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@-webkit-keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.go-to-top[data-v-67a9666a]{cursor:pointer;position:fixed;bottom:2rem;right:2.5rem;width:2rem;color:#007af5;z-index:1}.go-to-top[data-v-67a9666a]:hover{color:#45a2ff}@media (max-width:959px){.go-to-top[data-v-67a9666a]{display:none}}.fade-enter-active[data-v-67a9666a],.fade-leave-active[data-v-67a9666a]{transition:opacity .3s}.fade-enter[data-v-67a9666a],.fade-leave-to[data-v-67a9666a]{opacity:0}.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}.header-description[data-v-52439287]{padding:0;text-align:center}.theme-default-content code{color:#476582;padding:.25rem .5rem;margin:0;font-size:.85em;background-color:rgba(27,31,35,.05);border-radius:3px}.theme-default-content code .token.deleted{color:#ec5975}.theme-default-content code .token.inserted{color:#007af5}.theme-default-content pre,.theme-default-content pre[class*=language-]{line-height:1.4;padding:1.25rem 1.5rem;margin:.85rem 0;background-color:#282c34;border-radius:6px;overflow:auto}.theme-default-content pre[class*=language-] code,.theme-default-content pre code{color:#fff;padding:0;background-color:transparent;border-radius:0}div[class*=language-]{position:relative;background-color:#282c34;border-radius:6px}div[class*=language-] .highlight-lines{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;padding-top:1.3rem;position:absolute;top:0;left:0;width:100%;line-height:1.4}div[class*=language-] .highlight-lines .highlighted{background-color:rgba(0,0,0,.66)}div[class*=language-] pre,div[class*=language-] pre[class*=language-]{background:transparent;position:relative;z-index:1}div[class*=language-]:before{position:absolute;z-index:3;top:.8em;right:1em;font-size:.75rem;color:hsla(0,0%,100%,.4)}div[class*=language-]:not(.line-numbers-mode) .line-numbers-wrapper{display:none}div[class*=language-].line-numbers-mode .highlight-lines .highlighted{position:relative}div[class*=language-].line-numbers-mode .highlight-lines .highlighted:before{content:" ";position:absolute;z-index:3;left:0;top:0;display:block;width:3.5rem;height:100%;background-color:rgba(0,0,0,.66)}div[class*=language-].line-numbers-mode pre{padding-left:4.5rem;vertical-align:middle}div[class*=language-].line-numbers-mode .line-numbers-wrapper{position:absolute;top:0;width:3.5rem;text-align:center;color:hsla(0,0%,100%,.3);padding:1.25rem 0;line-height:1.4}div[class*=language-].line-numbers-mode .line-numbers-wrapper .line-number,div[class*=language-].line-numbers-mode .line-numbers-wrapper br{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}div[class*=language-].line-numbers-mode .line-numbers-wrapper .line-number{position:relative;z-index:4;font-size:.85em}div[class*=language-].line-numbers-mode:after{content:"";position:absolute;z-index:2;top:0;left:0;width:3.5rem;height:100%;border-radius:6px 0 0 6px;border-right:1px solid rgba(0,0,0,.66);background-color:#282c34}div[class~=language-js]:before{content:"js"}div[class~=language-ts]:before{content:"ts"}div[class~=language-html]:before{content:"html"}div[class~=language-md]:before{content:"md"}div[class~=language-vue]:before{content:"vue"}div[class~=language-css]:before{content:"css"}div[class~=language-sass]:before{content:"sass"}div[class~=language-scss]:before{content:"scss"}div[class~=language-less]:before{content:"less"}div[class~=language-stylus]:before{content:"stylus"}div[class~=language-go]:before{content:"go"}div[class~=language-java]:before{content:"java"}div[class~=language-c]:before{content:"c"}div[class~=language-sh]:before{content:"sh"}div[class~=language-yaml]:before{content:"yaml"}div[class~=language-py]:before{content:"py"}div[class~=language-docker]:before{content:"docker"}div[class~=language-dockerfile]:before{content:"dockerfile"}div[class~=language-makefile]:before{content:"makefile"}div[class~=language-javascript]:before{content:"js"}div[class~=language-typescript]:before{content:"ts"}div[class~=language-markup]:before{content:"html"}div[class~=language-markdown]:before{content:"md"}div[class~=language-json]:before{content:"json"}div[class~=language-ruby]:before{content:"rb"}div[class~=language-python]:before{content:"py"}div[class~=language-bash]:before{content:"sh"}div[class~=language-php]:before{content:"php"}.custom-block .custom-block-title{font-weight:600;margin-bottom:-.4rem}.custom-block.danger,.custom-block.tip,.custom-block.warning{padding:.1rem 1.5rem;border-left-width:.5rem;border-left-style:solid;margin:1rem 0}.custom-block.tip{background-color:#f3f5f7;border-color:#42b983}.custom-block.warning{background-color:rgba(255,229,100,.3);border-color:#e7c000;color:#6b5900}.custom-block.warning .custom-block-title{color:#b29400}.custom-block.warning a{color:#2c3e50}.custom-block.danger{background-color:#ffe6e6;border-color:#c00;color:#4d0000}.custom-block.danger .custom-block-title{color:#900}.custom-block.danger a{color:#2c3e50}.arrow{display:inline-block;width:0;height:0}.arrow.up{border-bottom:6px solid #ccc}.arrow.down,.arrow.up{border-left:4px solid transparent;border-right:4px solid transparent}.arrow.down{border-top:6px solid #ccc}.arrow.right{border-left:6px solid #ccc}.arrow.left,.arrow.right{border-top:4px solid transparent;border-bottom:4px solid transparent}.arrow.left{border-right:6px solid #ccc}.theme-default-content:not(.custom){max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.theme-default-content:not(.custom){padding:2rem}}@media (max-width:419px){.theme-default-content:not(.custom){padding:1.5rem}}.table-of-contents .badge{vertical-align:middle}body,html{padding:0;margin:0;background-color:#fff}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:16px;color:#2c3e50}.page{padding-left:20rem}.navbar{z-index:20;right:0;height:3.6rem;background-color:#fff;box-sizing:border-box;border-bottom:1px solid #eaecef}.navbar,.sidebar-mask{position:fixed;top:0;left:0}.sidebar-mask{z-index:9;width:100vw;height:100vh;display:none}.sidebar{font-size:16px;background-color:#fff;width:20rem;position:fixed;z-index:10;margin:0;top:3.6rem;left:0;bottom:0;box-sizing:border-box;border-right:1px solid #eaecef;overflow-y:auto}.theme-default-content:not(.custom)>:first-child{margin-top:3.6rem}.theme-default-content:not(.custom) a:hover{text-decoration:underline}.theme-default-content:not(.custom) p.demo{padding:1rem 1.5rem;border:1px solid #ddd;border-radius:4px}.theme-default-content:not(.custom) img{max-width:100%}.theme-default-content.custom{padding:0;margin:0}.theme-default-content.custom img{max-width:100%}a{font-weight:500;text-decoration:none}a,p a code{color:#007af5}p a code{font-weight:400}kbd{background:#eee;border:.15rem solid #ddd;border-bottom:.25rem solid #ddd;border-radius:.15rem;padding:0 .15em}blockquote{font-size:1rem;color:#999;border-left:.2rem solid #dfe2e5;margin:1rem 0;padding:.25rem 0 .25rem 1rem}blockquote>p{margin:0}ol,ul{padding-left:1.2em}strong{font-weight:600}h1,h2,h3,h4,h5,h6{font-weight:600;line-height:1.25}.theme-default-content:not(.custom)>h1,.theme-default-content:not(.custom)>h2,.theme-default-content:not(.custom)>h3,.theme-default-content:not(.custom)>h4,.theme-default-content:not(.custom)>h5,.theme-default-content:not(.custom)>h6{margin-top:-3.1rem;padding-top:4.6rem;margin-bottom:0}.theme-default-content:not(.custom)>h1:first-child,.theme-default-content:not(.custom)>h2:first-child,.theme-default-content:not(.custom)>h3:first-child,.theme-default-content:not(.custom)>h4:first-child,.theme-default-content:not(.custom)>h5:first-child,.theme-default-content:not(.custom)>h6:first-child{margin-top:-1.5rem;margin-bottom:1rem}.theme-default-content:not(.custom)>h1:first-child+.custom-block,.theme-default-content:not(.custom)>h1:first-child+p,.theme-default-content:not(.custom)>h1:first-child+pre,.theme-default-content:not(.custom)>h2:first-child+.custom-block,.theme-default-content:not(.custom)>h2:first-child+p,.theme-default-content:not(.custom)>h2:first-child+pre,.theme-default-content:not(.custom)>h3:first-child+.custom-block,.theme-default-content:not(.custom)>h3:first-child+p,.theme-default-content:not(.custom)>h3:first-child+pre,.theme-default-content:not(.custom)>h4:first-child+.custom-block,.theme-default-content:not(.custom)>h4:first-child+p,.theme-default-content:not(.custom)>h4:first-child+pre,.theme-default-content:not(.custom)>h5:first-child+.custom-block,.theme-default-content:not(.custom)>h5:first-child+p,.theme-default-content:not(.custom)>h5:first-child+pre,.theme-default-content:not(.custom)>h6:first-child+.custom-block,.theme-default-content:not(.custom)>h6:first-child+p,.theme-default-content:not(.custom)>h6:first-child+pre{margin-top:2rem}h1:hover .header-anchor,h2:hover .header-anchor,h3:hover .header-anchor,h4:hover .header-anchor,h5:hover .header-anchor,h6:hover .header-anchor{opacity:1}h1{font-size:2.2rem}h2{font-size:1.65rem;padding-bottom:.3rem;border-bottom:1px solid #eaecef}h3{font-size:1.35rem}a.header-anchor{font-size:.85em;float:left;margin-left:-.87em;padding-right:.23em;margin-top:.125em;opacity:0}a.header-anchor:hover{text-decoration:none}.line-number,code,kbd{font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace}ol,p,ul{line-height:1.7}hr{border:0;border-top:1px solid #eaecef}table{border-collapse:collapse;margin:1rem 0;display:block;overflow-x:auto}tr{border-top:1px solid #dfe2e5}tr:nth-child(2n){background-color:#f6f8fa}td,th{border:1px solid #dfe2e5;padding:.6em 1em}.theme-container.sidebar-open .sidebar-mask{display:block}.theme-container.no-navbar .theme-default-content:not(.custom)>h1,.theme-container.no-navbar h2,.theme-container.no-navbar h3,.theme-container.no-navbar h4,.theme-container.no-navbar h5,.theme-container.no-navbar h6{margin-top:1.5rem;padding-top:0}.theme-container.no-navbar .sidebar{top:0}@media (min-width:720px){.theme-container.no-sidebar .sidebar{display:none}.theme-container.no-sidebar .page{padding-left:0}}@media (max-width:959px){.sidebar{font-size:15px;width:16.4rem}.page{padding-left:16.4rem}}@media (max-width:719px){.sidebar{top:0;padding-top:3.6rem;transform:translateX(-100%);transition:transform .2s ease}.page{padding-left:0}.theme-container.sidebar-open .sidebar{transform:translateX(0)}.theme-container.no-navbar .sidebar{padding-top:0}}@media (max-width:419px){h1{font-size:1.9rem}.theme-default-content div[class*=language-]{margin:.85rem -1.5rem;border-radius:0}}.content__default{max-width:1000px!important}p img{border:1px solid #d7dae2}.home{padding:3.6rem 2rem 0;max-width:960px;margin:0 auto;display:block}.home .hero{text-align:center}.home .hero img{max-width:100%;max-height:280px;display:block;margin:3rem auto 1.5rem}.home .hero h1{font-size:3rem}.home .hero .action,.home .hero .description,.home .hero h1{margin:1.8rem auto}.home .hero .description{max-width:35rem;font-size:1.6rem;line-height:1.3;color:#6a8bad}.home .hero .action-button{display:inline-block;font-size:1.2rem;color:#fff;background-color:#007af5;vertical-align:top;margin-left:.5rem;padding:.8rem 1.6rem;border-radius:4px;transition:background-color .1s ease;box-sizing:border-box;border-bottom:1px solid #006edd}.home .hero .action-button:hover{background-color:#1187ff}.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 +#nprogress{pointer-events:none}#nprogress .bar{background:#007af5;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px #007af5,0 0 5px #007af5;opacity:1;transform:rotate(3deg) translateY(-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border-color:#007af5 transparent transparent #007af5;border-style:solid;border-width:2px;border-radius:50%;-webkit-animation:nprogress-spinner .4s linear infinite;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@-webkit-keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.go-to-top[data-v-67a9666a]{cursor:pointer;position:fixed;bottom:2rem;right:2.5rem;width:2rem;color:#007af5;z-index:1}.go-to-top[data-v-67a9666a]:hover{color:#45a2ff}@media (max-width:959px){.go-to-top[data-v-67a9666a]{display:none}}.fade-enter-active[data-v-67a9666a],.fade-leave-active[data-v-67a9666a]{transition:opacity .3s}.fade-enter[data-v-67a9666a],.fade-leave-to[data-v-67a9666a]{opacity:0}.icon.outbound{color:#aaa;vertical-align:middle;top:-1px}.icon.outbound,.search-box{display:inline-block;position:relative}.search-box{margin-right:1rem}.search-box input{cursor:text;width:10rem;height:2rem;color:#4e6e8e;display:inline-block;border:1px solid #cfd4db;border-radius:2rem;font-size:.9rem;line-height:2rem;padding:0 .5rem 0 2rem;outline:none;transition:all .2s ease;background:#fff url(/assets/img/search.83621669.svg) .6rem .5rem no-repeat;background-size:1rem}.search-box input:focus{cursor:auto;border-color:#007af5}.search-box .suggestions{background:#fff;width:20rem;position:absolute;top:1.5rem;border:1px solid #cfd4db;border-radius:6px;padding:.4rem;list-style-type:none}.search-box .suggestions.align-right{right:0}.search-box .suggestion{line-height:1.4;padding:.4rem .6rem;border-radius:4px;cursor:pointer}.search-box .suggestion a{white-space:normal;color:#5d82a6}.search-box .suggestion a .page-title{font-weight:600}.search-box .suggestion a .header{font-size:.9em;margin-left:.25em}.search-box .suggestion.focused{background-color:#f3f4f5}.search-box .suggestion.focused a{color:#007af5}@media (max-width:959px){.search-box input{cursor:pointer;width:0;border-color:transparent;position:relative}.search-box input:focus{cursor:text;left:0;width:10rem}}@media (-ms-high-contrast:none){.search-box input{height:2rem}}@media (max-width:959px) and (min-width:719px){.search-box .suggestions{left:0}}@media (max-width:719px){.search-box{margin-right:0}.search-box input{left:1rem}.search-box .suggestions{right:0}}@media (max-width:419px){.search-box .suggestions{width:calc(100vw - 4rem)}.search-box input:focus{width:8rem}}.sidebar-button{cursor:pointer;display:none;width:1.25rem;height:1.25rem;position:absolute;padding:.6rem;top:.6rem;left:1rem}.sidebar-button .icon{display:block;width:1.25rem;height:1.25rem}@media (max-width:719px){.sidebar-button{display:block}}.dropdown-enter,.dropdown-leave-to{height:0!important}.dropdown-wrapper{cursor:pointer}.dropdown-wrapper .dropdown-title{display:block}.dropdown-wrapper .dropdown-title:hover{border-color:transparent}.dropdown-wrapper .dropdown-title .arrow{vertical-align:middle;margin-top:-1px;margin-left:.4rem}.dropdown-wrapper .nav-dropdown .dropdown-item{color:inherit;line-height:1.7rem}.dropdown-wrapper .nav-dropdown .dropdown-item h4{margin:.45rem 0 0;border-top:1px solid #eee;padding:.45rem 1.5rem 0 1.25rem}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem-wrapper{padding:0;list-style:none}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem-wrapper .dropdown-subitem{font-size:.9em}.dropdown-wrapper .nav-dropdown .dropdown-item a{display:block;line-height:1.7rem;position:relative;border-bottom:none;font-weight:400;margin-bottom:0;padding:0 1.5rem 0 1.25rem}.dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active,.dropdown-wrapper .nav-dropdown .dropdown-item a:hover{color:#007af5}.dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active:after{content:"";width:0;height:0;border-left:5px solid #007af5;border-top:3px solid transparent;border-bottom:3px solid transparent;position:absolute;top:calc(50% - 2px);left:9px}.dropdown-wrapper .nav-dropdown .dropdown-item:first-child h4{margin-top:0;padding-top:0;border-top:0}@media (max-width:719px){.dropdown-wrapper.open .dropdown-title{margin-bottom:.5rem}.dropdown-wrapper .nav-dropdown{transition:height .1s ease-out;overflow:hidden}.dropdown-wrapper .nav-dropdown .dropdown-item h4{border-top:0;margin-top:0;padding-top:0}.dropdown-wrapper .nav-dropdown .dropdown-item>a,.dropdown-wrapper .nav-dropdown .dropdown-item h4{font-size:15px;line-height:2rem}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem{font-size:14px;padding-left:1rem}}@media (min-width:719px){.dropdown-wrapper{height:1.8rem}.dropdown-wrapper:hover .nav-dropdown{display:block!important}.dropdown-wrapper .dropdown-title .arrow{border-left:4px solid transparent;border-right:4px solid transparent;border-top:6px solid #ccc;border-bottom:0}.dropdown-wrapper .nav-dropdown{display:none;height:auto!important;box-sizing:border-box;max-height:calc(100vh - 2.7rem);overflow-y:auto;position:absolute;top:100%;right:0;background-color:#fff;padding:.6rem 0;border:1px solid;border-color:#ddd #ddd #ccc;text-align:left;border-radius:.25rem;white-space:nowrap;margin:0}}.nav-links{display:inline-block}.nav-links a{line-height:1.4rem;color:inherit}.nav-links a.router-link-active,.nav-links a:hover{color:#007af5}.nav-links .nav-item{position:relative;display:inline-block;margin-left:1.5rem;line-height:2rem}.nav-links .nav-item:first-child{margin-left:0}.nav-links .repo-link{margin-left:1.5rem}@media (max-width:719px){.nav-links .nav-item,.nav-links .repo-link{margin-left:0}}@media (min-width:719px){.nav-links a.router-link-active,.nav-links a:hover{color:#2c3e50}.nav-item>a:not(.external).router-link-active,.nav-item>a:not(.external):hover{margin-bottom:-2px;border-bottom:2px solid #0b85ff}}.navbar{padding:.7rem 1.5rem;line-height:2.2rem}.navbar a,.navbar img,.navbar span{display:inline-block}.navbar .logo{height:2.2rem;min-width:2.2rem;margin-right:.8rem;vertical-align:top}.navbar .site-name{font-size:1.3rem;font-weight:600;color:#2c3e50;position:relative}.navbar .links{padding-left:1.5rem;box-sizing:border-box;background-color:#fff;white-space:nowrap;font-size:.9rem;position:absolute;right:1.5rem;top:.7rem;display:flex}.navbar .links .search-box{flex:0 0 auto;vertical-align:top}@media (max-width:719px){.navbar{padding-left:4rem}.navbar .can-hide{display:none}.navbar .links{padding-left:1.5rem}}.page-edit,.page-nav{max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.page-edit,.page-nav{padding:2rem}}@media (max-width:419px){.page-edit,.page-nav{padding:1.5rem}}.page{padding-bottom:2rem;display:block}.page-edit{padding-top:1rem;padding-bottom:1rem;overflow:auto}.page-edit .edit-link{display:inline-block}.page-edit .edit-link a{color:#4e6e8e;margin-right:.25rem}.page-edit .last-updated{float:right;font-size:.9em}.page-edit .last-updated .prefix{font-weight:500;color:#4e6e8e}.page-edit .last-updated .time{font-weight:400;color:#aaa}.page-nav{padding-top:1rem;padding-bottom:0}.page-nav .inner{min-height:2rem;margin-top:0;border-top:1px solid #eaecef;padding-top:1rem;overflow:auto}.page-nav .next{float:right}@media (max-width:719px){.page-edit .edit-link{margin-bottom:.5rem}.page-edit .last-updated{font-size:.8em;float:none;text-align:left}}.sidebar-group .sidebar-group{padding-left:.5em}.sidebar-group:not(.collapsable) .sidebar-heading:not(.clickable){cursor:auto;color:inherit}.sidebar-group.is-sub-group{padding-left:0}.sidebar-group.is-sub-group>.sidebar-heading{font-size:.95em;line-height:1.4;font-weight:400;padding-left:2rem}.sidebar-group.is-sub-group>.sidebar-heading:not(.clickable){opacity:.5}.sidebar-group.is-sub-group>.sidebar-group-items{padding-left:1rem}.sidebar-group.is-sub-group>.sidebar-group-items>li>.sidebar-link{font-size:.95em;border-left:none}.sidebar-group.depth-2>.sidebar-heading{border-left:none}.sidebar-heading{color:#2c3e50;transition:color .15s ease;cursor:pointer;font-size:1.1em;font-weight:700;padding:.35rem 1.5rem .35rem 1.25rem;width:100%;box-sizing:border-box;margin:0;border-left:.25rem solid transparent}.sidebar-heading.open,.sidebar-heading:hover{color:inherit}.sidebar-heading .arrow{position:relative;top:-.12em;left:.5em}.sidebar-heading.clickable.active{font-weight:600;color:#007af5;border-left-color:#007af5}.sidebar-heading.clickable:hover{color:#007af5}.sidebar-group-items{transition:height .1s ease-out;font-size:.95em;overflow:hidden}.sidebar .sidebar-sub-headers{padding-left:1rem;font-size:.95em}a.sidebar-link{font-size:1em;font-weight:400;display:inline-block;color:#2c3e50;border-left:.25rem solid transparent;padding:.35rem 1rem .35rem 1.25rem;line-height:1.4;width:100%;box-sizing:border-box}a.sidebar-link:hover{color:#007af5}a.sidebar-link.active{font-weight:600;color:#007af5;border-left-color:#007af5}.sidebar-group a.sidebar-link{padding-left:2rem}.sidebar-sub-headers a.sidebar-link{padding-top:.25rem;padding-bottom:.25rem;border-left:none}.sidebar-sub-headers a.sidebar-link.active{font-weight:500}.sidebar ul{padding:0;margin:0;list-style-type:none}.sidebar a{display:inline-block}.sidebar .nav-links{display:none;border-bottom:1px solid #eaecef;padding:.5rem 0 .75rem}.sidebar .nav-links a{font-weight:600}.sidebar .nav-links .nav-item,.sidebar .nav-links .repo-link{display:block;line-height:1.25rem;font-size:1.1em;padding:.5rem 0 .5rem 1.5rem}.sidebar>.sidebar-links{padding:1.5rem 0}.sidebar>.sidebar-links>li>a.sidebar-link{font-size:1.1em;line-height:1.7;font-weight:700}.sidebar>.sidebar-links>li:not(:first-child){margin-top:.75rem}@media (max-width:719px){.sidebar .nav-links{display:block}.sidebar .nav-links .dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active:after{top:calc(1rem - 2px)}.sidebar>.sidebar-links{padding:1rem 0}}code[class*=language-],pre[class*=language-]{color:#ccc;background:none;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#2d2d2d}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.block-comment,.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#999}.token.punctuation{color:#ccc}.token.attr-name,.token.deleted,.token.namespace,.token.tag{color:#e2777a}.token.function-name{color:#6196cc}.token.boolean,.token.function,.token.number{color:#f08d49}.token.class-name,.token.constant,.token.property,.token.symbol{color:#f8c555}.token.atrule,.token.builtin,.token.important,.token.keyword,.token.selector{color:#cc99cd}.token.attr-value,.token.char,.token.regex,.token.string,.token.variable{color:#7ec699}.token.entity,.token.operator,.token.url{color:#67cdcc}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.inserted{color:green}.header-description[data-v-52439287]{padding:0;text-align:center}.theme-default-content code{color:#476582;padding:.25rem .5rem;margin:0;font-size:.85em;background-color:rgba(27,31,35,.05);border-radius:3px}.theme-default-content code .token.deleted{color:#ec5975}.theme-default-content code .token.inserted{color:#007af5}.theme-default-content pre,.theme-default-content pre[class*=language-]{line-height:1.4;padding:1.25rem 1.5rem;margin:.85rem 0;background-color:#282c34;border-radius:6px;overflow:auto}.theme-default-content pre[class*=language-] code,.theme-default-content pre code{color:#fff;padding:0;background-color:transparent;border-radius:0}div[class*=language-]{position:relative;background-color:#282c34;border-radius:6px}div[class*=language-] .highlight-lines{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;padding-top:1.3rem;position:absolute;top:0;left:0;width:100%;line-height:1.4}div[class*=language-] .highlight-lines .highlighted{background-color:rgba(0,0,0,.66)}div[class*=language-] pre,div[class*=language-] pre[class*=language-]{background:transparent;position:relative;z-index:1}div[class*=language-]:before{position:absolute;z-index:3;top:.8em;right:1em;font-size:.75rem;color:hsla(0,0%,100%,.4)}div[class*=language-]:not(.line-numbers-mode) .line-numbers-wrapper{display:none}div[class*=language-].line-numbers-mode .highlight-lines .highlighted{position:relative}div[class*=language-].line-numbers-mode .highlight-lines .highlighted:before{content:" ";position:absolute;z-index:3;left:0;top:0;display:block;width:3.5rem;height:100%;background-color:rgba(0,0,0,.66)}div[class*=language-].line-numbers-mode pre{padding-left:4.5rem;vertical-align:middle}div[class*=language-].line-numbers-mode .line-numbers-wrapper{position:absolute;top:0;width:3.5rem;text-align:center;color:hsla(0,0%,100%,.3);padding:1.25rem 0;line-height:1.4}div[class*=language-].line-numbers-mode .line-numbers-wrapper .line-number,div[class*=language-].line-numbers-mode .line-numbers-wrapper br{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}div[class*=language-].line-numbers-mode .line-numbers-wrapper .line-number{position:relative;z-index:4;font-size:.85em}div[class*=language-].line-numbers-mode:after{content:"";position:absolute;z-index:2;top:0;left:0;width:3.5rem;height:100%;border-radius:6px 0 0 6px;border-right:1px solid rgba(0,0,0,.66);background-color:#282c34}div[class~=language-js]:before{content:"js"}div[class~=language-ts]:before{content:"ts"}div[class~=language-html]:before{content:"html"}div[class~=language-md]:before{content:"md"}div[class~=language-vue]:before{content:"vue"}div[class~=language-css]:before{content:"css"}div[class~=language-sass]:before{content:"sass"}div[class~=language-scss]:before{content:"scss"}div[class~=language-less]:before{content:"less"}div[class~=language-stylus]:before{content:"stylus"}div[class~=language-go]:before{content:"go"}div[class~=language-java]:before{content:"java"}div[class~=language-c]:before{content:"c"}div[class~=language-sh]:before{content:"sh"}div[class~=language-yaml]:before{content:"yaml"}div[class~=language-py]:before{content:"py"}div[class~=language-docker]:before{content:"docker"}div[class~=language-dockerfile]:before{content:"dockerfile"}div[class~=language-makefile]:before{content:"makefile"}div[class~=language-javascript]:before{content:"js"}div[class~=language-typescript]:before{content:"ts"}div[class~=language-markup]:before{content:"html"}div[class~=language-markdown]:before{content:"md"}div[class~=language-json]:before{content:"json"}div[class~=language-ruby]:before{content:"rb"}div[class~=language-python]:before{content:"py"}div[class~=language-bash]:before{content:"sh"}div[class~=language-php]:before{content:"php"}.custom-block .custom-block-title{font-weight:600;margin-bottom:-.4rem}.custom-block.danger,.custom-block.tip,.custom-block.warning{padding:.1rem 1.5rem;border-left-width:.5rem;border-left-style:solid;margin:1rem 0}.custom-block.tip{background-color:#f3f5f7;border-color:#42b983}.custom-block.warning{background-color:rgba(255,229,100,.3);border-color:#e7c000;color:#6b5900}.custom-block.warning .custom-block-title{color:#b29400}.custom-block.warning a{color:#2c3e50}.custom-block.danger{background-color:#ffe6e6;border-color:#c00;color:#4d0000}.custom-block.danger .custom-block-title{color:#900}.custom-block.danger a{color:#2c3e50}.arrow{display:inline-block;width:0;height:0}.arrow.up{border-bottom:6px solid #ccc}.arrow.down,.arrow.up{border-left:4px solid transparent;border-right:4px solid transparent}.arrow.down{border-top:6px solid #ccc}.arrow.right{border-left:6px solid #ccc}.arrow.left,.arrow.right{border-top:4px solid transparent;border-bottom:4px solid transparent}.arrow.left{border-right:6px solid #ccc}.theme-default-content:not(.custom){max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.theme-default-content:not(.custom){padding:2rem}}@media (max-width:419px){.theme-default-content:not(.custom){padding:1.5rem}}.table-of-contents .badge{vertical-align:middle}body,html{padding:0;margin:0;background-color:#fff}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:16px;color:#2c3e50}.page{padding-left:20rem}.navbar{z-index:20;right:0;height:3.6rem;background-color:#fff;box-sizing:border-box;border-bottom:1px solid #eaecef}.navbar,.sidebar-mask{position:fixed;top:0;left:0}.sidebar-mask{z-index:9;width:100vw;height:100vh;display:none}.sidebar{font-size:16px;background-color:#fff;width:20rem;position:fixed;z-index:10;margin:0;top:3.6rem;left:0;bottom:0;box-sizing:border-box;border-right:1px solid #eaecef;overflow-y:auto}.theme-default-content:not(.custom)>:first-child{margin-top:3.6rem}.theme-default-content:not(.custom) a:hover{text-decoration:underline}.theme-default-content:not(.custom) p.demo{padding:1rem 1.5rem;border:1px solid #ddd;border-radius:4px}.theme-default-content:not(.custom) img{max-width:100%}.theme-default-content.custom{padding:0;margin:0}.theme-default-content.custom img{max-width:100%}a{font-weight:500;text-decoration:none}a,p a code{color:#007af5}p a code{font-weight:400}kbd{background:#eee;border:.15rem solid #ddd;border-bottom:.25rem solid #ddd;border-radius:.15rem;padding:0 .15em}blockquote{font-size:1rem;color:#999;border-left:.2rem solid #dfe2e5;margin:1rem 0;padding:.25rem 0 .25rem 1rem}blockquote>p{margin:0}ol,ul{padding-left:1.2em}strong{font-weight:600}h1,h2,h3,h4,h5,h6{font-weight:600;line-height:1.25}.theme-default-content:not(.custom)>h1,.theme-default-content:not(.custom)>h2,.theme-default-content:not(.custom)>h3,.theme-default-content:not(.custom)>h4,.theme-default-content:not(.custom)>h5,.theme-default-content:not(.custom)>h6{margin-top:-3.1rem;padding-top:4.6rem;margin-bottom:0}.theme-default-content:not(.custom)>h1:first-child,.theme-default-content:not(.custom)>h2:first-child,.theme-default-content:not(.custom)>h3:first-child,.theme-default-content:not(.custom)>h4:first-child,.theme-default-content:not(.custom)>h5:first-child,.theme-default-content:not(.custom)>h6:first-child{margin-top:-1.5rem;margin-bottom:1rem}.theme-default-content:not(.custom)>h1:first-child+.custom-block,.theme-default-content:not(.custom)>h1:first-child+p,.theme-default-content:not(.custom)>h1:first-child+pre,.theme-default-content:not(.custom)>h2:first-child+.custom-block,.theme-default-content:not(.custom)>h2:first-child+p,.theme-default-content:not(.custom)>h2:first-child+pre,.theme-default-content:not(.custom)>h3:first-child+.custom-block,.theme-default-content:not(.custom)>h3:first-child+p,.theme-default-content:not(.custom)>h3:first-child+pre,.theme-default-content:not(.custom)>h4:first-child+.custom-block,.theme-default-content:not(.custom)>h4:first-child+p,.theme-default-content:not(.custom)>h4:first-child+pre,.theme-default-content:not(.custom)>h5:first-child+.custom-block,.theme-default-content:not(.custom)>h5:first-child+p,.theme-default-content:not(.custom)>h5:first-child+pre,.theme-default-content:not(.custom)>h6:first-child+.custom-block,.theme-default-content:not(.custom)>h6:first-child+p,.theme-default-content:not(.custom)>h6:first-child+pre{margin-top:2rem}h1:hover .header-anchor,h2:hover .header-anchor,h3:hover .header-anchor,h4:hover .header-anchor,h5:hover .header-anchor,h6:hover .header-anchor{opacity:1}h1{font-size:2.2rem}h2{font-size:1.65rem;padding-bottom:.3rem;border-bottom:1px solid #eaecef}h3{font-size:1.35rem}a.header-anchor{font-size:.85em;float:left;margin-left:-.87em;padding-right:.23em;margin-top:.125em;opacity:0}a.header-anchor:hover{text-decoration:none}.line-number,code,kbd{font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace}ol,p,ul{line-height:1.7}hr{border:0;border-top:1px solid #eaecef}table{border-collapse:collapse;margin:1rem 0;display:block;overflow-x:auto}tr{border-top:1px solid #dfe2e5}tr:nth-child(2n){background-color:#f6f8fa}td,th{border:1px solid #dfe2e5;padding:.6em 1em}.theme-container.sidebar-open .sidebar-mask{display:block}.theme-container.no-navbar .theme-default-content:not(.custom)>h1,.theme-container.no-navbar h2,.theme-container.no-navbar h3,.theme-container.no-navbar h4,.theme-container.no-navbar h5,.theme-container.no-navbar h6{margin-top:1.5rem;padding-top:0}.theme-container.no-navbar .sidebar{top:0}@media (min-width:720px){.theme-container.no-sidebar .sidebar{display:none}.theme-container.no-sidebar .page{padding-left:0}}@media (max-width:959px){.sidebar{font-size:15px;width:16.4rem}.page{padding-left:16.4rem}}@media (max-width:719px){.sidebar{top:0;padding-top:3.6rem;transform:translateX(-100%);transition:transform .2s ease}.page{padding-left:0}.theme-container.sidebar-open .sidebar{transform:translateX(0)}.theme-container.no-navbar .sidebar{padding-top:0}}@media (max-width:419px){h1{font-size:1.9rem}.theme-default-content div[class*=language-]{margin:.85rem -1.5rem;border-radius:0}}.content__default{max-width:1000px!important}p img{border:1px solid #d7dae2}.home{padding:3.6rem 2rem 0;max-width:960px;margin:0 auto;display:block}.home .hero{text-align:center}.home .hero img{max-width:100%;max-height:280px;display:block;margin:3rem auto 1.5rem}.home .hero h1{font-size:3rem}.home .hero .action,.home .hero .description,.home .hero h1{margin:1.8rem auto}.home .hero .description{max-width:35rem;font-size:1.6rem;line-height:1.3;color:#6a8bad}.home .hero .action-button{display:inline-block;font-size:1.2rem;color:#fff;background-color:#007af5;vertical-align:top;margin-left:.5rem;padding:.8rem 1.6rem;border-radius:4px;transition:background-color .1s ease;box-sizing:border-box;border-bottom:1px solid #006edd}.home .hero .action-button:hover{background-color:#1187ff;color:#fff}.home .hero .action-button2{color:#007af5;background-color:#fff;border:1px solid #007af5}.home .features{border-top:1px solid #eaecef;padding:1.2rem 0;margin-top:2.5rem;display:flex;flex-wrap:wrap;align-items:flex-start;align-content:stretch;justify-content:space-between}.home .feature{flex-grow:1;flex-basis:30%;max-width:30%}.home .feature h2{font-size:1.4rem;font-weight:500;border-bottom:none;padding-bottom:0;color:#3a5169}.home .feature p{color:#4e6e8e}.home .footer{padding:2.5rem;border-top:1px solid #eaecef;text-align:center;color:#4e6e8e}@media (max-width:719px){.home .features{flex-direction:column}.home .feature{max-width:100%;padding:0 2.5rem}}@media (max-width:419px){.home{padding-left:1.5rem;padding-right:1.5rem}.home .hero img{max-height:210px;margin:2rem auto 1.2rem}.home .hero h1{font-size:2rem}.home .hero .action,.home .hero .description,.home .hero h1{margin:1.2rem auto}.home .hero .description{font-size:1.2rem}.home .hero .action-button{font-size:1rem;padding:.6rem 1.2rem}.home .feature h2{font-size:1.25rem}}.badge[data-v-c13ee5b0]{display:inline-block;font-size:14px;height:18px;line-height:18px;border-radius:3px;padding:0 6px;color:#fff}.badge.green[data-v-c13ee5b0],.badge.tip[data-v-c13ee5b0],.badge[data-v-c13ee5b0]{background-color:#42b983}.badge.error[data-v-c13ee5b0]{background-color:#da5961}.badge.warn[data-v-c13ee5b0],.badge.warning[data-v-c13ee5b0],.badge.yellow[data-v-c13ee5b0]{background-color:#e7c000}.badge+.badge[data-v-c13ee5b0]{margin-left:5px} \ No newline at end of file diff --git a/docs/assets/js/10.be635e5f.js b/docs/assets/js/10.fd424b02.js similarity index 85% rename from docs/assets/js/10.be635e5f.js rename to docs/assets/js/10.fd424b02.js index d508561..cab09e7 100644 --- a/docs/assets/js/10.be635e5f.js +++ b/docs/assets/js/10.fd424b02.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[10],{280:function(t,e,a){t.exports=a.p+"assets/img/image-20190722223454676.b545b43f.png"},281:function(t,e,a){t.exports=a.p+"assets/img/image-20190722223551308.ed106a2a.png"},282:function(t,e,a){t.exports=a.p+"assets/img/image-20190722223605920.3e762b29.png"},283:function(t,e,a){t.exports=a.p+"assets/img/image-20190722231246540.ebf13194.png"},284:function(t,e,a){t.exports=a.p+"assets/img/image-20190722224029397.abc44209.png"},285:function(t,e,a){t.exports=a.p+"assets/img/image-20190722225347491.984fabae.png"},286:function(t,e,a){t.exports=a.p+"assets/img/image-20190722225454029.73400267.png"},287:function(t,e,a){t.exports=a.p+"assets/img/image-20190722230511430.ed459354.png"},359: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(280),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(281),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(282),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(283),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(284),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(285),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(286),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(287),alt:"image-20190722230511430"}})]),t._v(" "),r("p",[r("strong",[t._v("适用场景")])]),t._v(" "),r("p",[t._v("在交互式终端里,"),r("strong",[t._v("运维人员")]),t._v("可以:")]),t._v(" "),r("ul",[r("li",[t._v("通过 ping / curl 等命令,测试网络连通性,测试 Kubernetes 的服务 DNS 解析是否正确")]),t._v(" "),r("li",[t._v("通过 export 命令检查该容器的环境变量的设置是否正确")])]),t._v(" "),r("p",[r("strong",[t._v("开发人员")]),t._v(" 可以:")]),t._v(" "),r("ul",[r("li",[t._v("通过 ls / cat / vi 等命令,查看该容器是否包含了最新的代码变更")]),t._v(" "),r("li",[t._v("通过 vi 等命令,临时对容器中的配置文件进行修改,并在验证这种修改有效之后,才将其正式更新到代码库")])])])},[],!1,null,null,null);e.default=s.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[10],{288:function(t,e,a){t.exports=a.p+"assets/img/image-20190722223454676.b545b43f.png"},289:function(t,e,a){t.exports=a.p+"assets/img/image-20190722223551308.ed106a2a.png"},290:function(t,e,a){t.exports=a.p+"assets/img/image-20190722223605920.3e762b29.png"},291:function(t,e,a){t.exports=a.p+"assets/img/image-20190722231246540.ebf13194.png"},292:function(t,e,a){t.exports=a.p+"assets/img/image-20190722224029397.abc44209.png"},293:function(t,e,a){t.exports=a.p+"assets/img/image-20190722225347491.984fabae.png"},294:function(t,e,a){t.exports=a.p+"assets/img/image-20190722225454029.73400267.png"},295:function(t,e,a){t.exports=a.p+"assets/img/image-20190722230511430.ed459354.png"},363: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(288),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(289),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(290),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(291),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(292),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(293),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(294),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(295),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.21588a93.js b/docs/assets/js/11.1e5f40b3.js similarity index 76% rename from docs/assets/js/11.21588a93.js rename to docs/assets/js/11.1e5f40b3.js index b7458b1..0fda721 100644 --- a/docs/assets/js/11.21588a93.js +++ b/docs/assets/js/11.1e5f40b3.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[11],{199:function(t,a,e){t.exports=e.p+"assets/img/image-20190723105606081.bc471512.png"},200:function(t,a,e){t.exports=e.p+"assets/img/image-20190723105644937.968b1660.png"},201:function(t,a,e){t.exports=e.p+"assets/img/image-20190723105722999.5b6c9bae.png"},202:function(t,a,e){t.exports=e.p+"assets/img/image-20190723105748435.1cb3ad0d.png"},203:function(t,a,e){t.exports=e.p+"assets/img/image-20190723105809872.61add376.png"},204:function(t,a,e){t.exports=e.p+"assets/img/image-20190723105830318.43414c56.png"},342: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(199),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(200),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(201),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(202),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(203),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(204),alt:"image-20190723105830318"}})])])},[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[11],{202:function(t,a,e){t.exports=e.p+"assets/img/image-20190723105606081.bc471512.png"},203:function(t,a,e){t.exports=e.p+"assets/img/image-20190723105644937.968b1660.png"},204:function(t,a,e){t.exports=e.p+"assets/img/image-20190723105722999.5b6c9bae.png"},205:function(t,a,e){t.exports=e.p+"assets/img/image-20190723105748435.1cb3ad0d.png"},206:function(t,a,e){t.exports=e.p+"assets/img/image-20190723105809872.61add376.png"},207:function(t,a,e){t.exports=e.p+"assets/img/image-20190723105830318.43414c56.png"},340: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(202),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(203),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(204),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(205),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(206),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(207),alt:"image-20190723105830318"}})])])},[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/12.08ca4d2d.js b/docs/assets/js/12.d8b0bf97.js similarity index 90% rename from docs/assets/js/12.08ca4d2d.js rename to docs/assets/js/12.d8b0bf97.js index a7ab881..2c30c50 100644 --- a/docs/assets/js/12.08ca4d2d.js +++ b/docs/assets/js/12.d8b0bf97.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[12],{274:function(a,t,s){a.exports=s.p+"assets/img/image-20190721085144545.25f25dda.png"},275:function(a,t,s){a.exports=s.p+"assets/img/image-20190721090118542.46c31055.png"},276:function(a,t,s){a.exports=s.p+"assets/img/image-20190721090753742.28d009f3.png"},277:function(a,t,s){a.exports=s.p+"assets/img/image-20190721090840925.a5231632.png"},278:function(a,t,s){a.exports=s.p+"assets/img/image-20190721090935511.80fb3864.png"},279:function(a,t,s){a.exports=s.p+"assets/img/image-20190721091005130.330e9f1d.png"},357: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(274),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(275),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(276),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(277),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(278),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(279),alt:"image-20190721091005130"}})]),a._v(" "),e("ul",[e("li",[e("p",[a._v("查看已导出文件")]),a._v(" "),e("p",[a._v("导出文件的命名格式为 kuboard_namespace_date_time.yaml,例如:")]),a._v(" "),e("p",[a._v("kuboard_example_2019_07_21_09_09_47.yaml")]),a._v(" "),e("p",[a._v("导出文件的内容如下所示:")]),a._v(" "),e("div",{staticClass:"language-yaml extra-class"},[e("pre",{pre:!0,attrs:{class:"language-yaml"}},[e("code",[e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("---")]),a._v("\n"),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("apiVersion")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" apps/v1\n"),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("kind")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" StatefulSet\n"),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("metadata")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("namespace")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" example\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("name")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" cloud"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("-")]),a._v("eureka\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("annotations")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("k8s.eip.work/workload")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" cloud"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("-")]),a._v("eureka\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("k8s.eip.work/displayName")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" 服务注册\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("k8s.eip.work/service")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" ClusterIP\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("k8s.eip.work/ingress")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[a._v("'true'")]),a._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("labels")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("k8s.eip.work/layer")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" cloud\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("k8s.eip.work/name")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" cloud"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("-")]),a._v("eureka\n"),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("spec")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("selector")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("matchLabels")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("k8s.eip.work/layer")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" cloud\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("k8s.eip.work/name")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" cloud"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("-")]),a._v("eureka\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("template")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("metadata")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("...")]),a._v("\n")])])])])]),a._v(" "),e("blockquote",[e("p",[a._v("该文件可以通过 kubectl apply -f 命令直接执行,但是建议使用 kuboard 进行导入,以便在导入时在线编辑在特定于新环境的配置信息。")])]),a._v(" "),e("h2",{attrs:{id:"导入配置"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#导入配置","aria-hidden":"true"}},[a._v("#")]),a._v(" 导入配置")]),a._v(" "),e("h3",{attrs:{id:"前提-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#前提-2","aria-hidden":"true"}},[a._v("#")]),a._v(" 前提")]),a._v(" "),e("p",[a._v("您已经通过 kuboard 导出了配置文件,或者从别处获取到 kuboard 导出的配置文件")]),a._v(" "),e("h3",{attrs:{id:"操作步骤-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#操作步骤-2","aria-hidden":"true"}},[a._v("#")]),a._v(" 操作步骤")]),a._v(" "),e("p",[a._v("请参考 "),e("a",{attrs:{href:"/guide/example/import"}},[a._v("导入 example 微服务")])])])},[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[12],{278:function(a,t,s){a.exports=s.p+"assets/img/image-20190721085144545.25f25dda.png"},279:function(a,t,s){a.exports=s.p+"assets/img/image-20190721090118542.46c31055.png"},280:function(a,t,s){a.exports=s.p+"assets/img/image-20190721090753742.28d009f3.png"},281:function(a,t,s){a.exports=s.p+"assets/img/image-20190721090840925.a5231632.png"},282:function(a,t,s){a.exports=s.p+"assets/img/image-20190721090935511.80fb3864.png"},283:function(a,t,s){a.exports=s.p+"assets/img/image-20190721091005130.330e9f1d.png"},359: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(278),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(279),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(280),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(281),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(282),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(283),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/13.149fa666.js b/docs/assets/js/13.ae7c4f6d.js similarity index 83% rename from docs/assets/js/13.149fa666.js rename to docs/assets/js/13.ae7c4f6d.js index 939ac02..62042ae 100644 --- a/docs/assets/js/13.149fa666.js +++ b/docs/assets/js/13.ae7c4f6d.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[13],{258:function(t,a,_){t.exports=_.p+"assets/img/image-20190721112353077.b907aa89.png"},259:function(t,a,_){t.exports=_.p+"assets/img/image-20190721112624128.7aa6b8f1.png"},260:function(t,a,_){t.exports=_.p+"assets/img/image-20190721113050608.97e0f110.png"},261:function(t,a,_){t.exports=_.p+"assets/img/image-20190721113155991.f3ecd62f.png"},349:function(t,a,_){"use strict";_.r(a);var v=_(0),e=Object(v.a)({},function(){var t=this,a=t.$createElement,v=t._self._c||a;return v("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[v("h1",{attrs:{id:"配置"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#配置","aria-hidden":"true"}},[t._v("#")]),t._v(" 配置")]),t._v(" "),v("p",[t._v("配置: Kubernetes ConfigMap")]),t._v(" "),v("h1",{attrs:{id:"查看配置列表"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#查看配置列表","aria-hidden":"true"}},[t._v("#")]),t._v(" 查看配置列表")]),t._v(" "),v("p",[t._v("假设您已进入名称空间界面,如下图所示:")]),t._v(" "),v("p",[v("img",{attrs:{src:_(70),alt:"image-20190721110355464"}})]),t._v(" "),v("p",[t._v("配置列表位于图中左侧中部,点击 "),v("em",[v("strong",[t._v("放大")])]),t._v(" 按钮,可以将列表显示到更大的区域,如下图所示:")]),t._v(" "),v("blockquote",[v("p",[t._v("点击 "),v("strong",[t._v("配置")]),t._v(" 可以刷新该列表")])]),t._v(" "),v("p",[v("img",{attrs:{src:_(258),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:_(259),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:_(260),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:_(261),alt:"image-20190721113155991"}})]),t._v(" "),v("p",[t._v("编辑、删除操作可直接按照提示完成")])])},[],!1,null,null,null);a.default=e.exports},70:function(t,a,_){t.exports=_.p+"assets/img/image-20190721110355464.25f25dda.png"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[13],{270:function(t,a,_){t.exports=_.p+"assets/img/image-20190721112353077.b907aa89.png"},271:function(t,a,_){t.exports=_.p+"assets/img/image-20190721112624128.7aa6b8f1.png"},272:function(t,a,_){t.exports=_.p+"assets/img/image-20190721113050608.97e0f110.png"},273:function(t,a,_){t.exports=_.p+"assets/img/image-20190721113155991.f3ecd62f.png"},370:function(t,a,_){"use strict";_.r(a);var v=_(0),e=Object(v.a)({},function(){var t=this,a=t.$createElement,v=t._self._c||a;return v("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[v("h1",{attrs:{id:"配置"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#配置","aria-hidden":"true"}},[t._v("#")]),t._v(" 配置")]),t._v(" "),v("p",[t._v("配置: Kubernetes ConfigMap")]),t._v(" "),v("h1",{attrs:{id:"查看配置列表"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#查看配置列表","aria-hidden":"true"}},[t._v("#")]),t._v(" 查看配置列表")]),t._v(" "),v("p",[t._v("假设您已进入名称空间界面,如下图所示:")]),t._v(" "),v("p",[v("img",{attrs:{src:_(70),alt:"image-20190721110355464"}})]),t._v(" "),v("p",[t._v("配置列表位于图中左侧中部,点击 "),v("em",[v("strong",[t._v("放大")])]),t._v(" 按钮,可以将列表显示到更大的区域,如下图所示:")]),t._v(" "),v("blockquote",[v("p",[t._v("点击 "),v("strong",[t._v("配置")]),t._v(" 可以刷新该列表")])]),t._v(" "),v("p",[v("img",{attrs:{src:_(270),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:_(271),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:_(272),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:_(273),alt:"image-20190721113155991"}})]),t._v(" "),v("p",[t._v("编辑、删除操作可直接按照提示完成")])])},[],!1,null,null,null);a.default=e.exports},70:function(t,a,_){t.exports=_.p+"assets/img/image-20190721110355464.25f25dda.png"}}]); \ No newline at end of file diff --git a/docs/assets/js/14.577db88a.js b/docs/assets/js/14.36062872.js similarity index 84% rename from docs/assets/js/14.577db88a.js rename to docs/assets/js/14.36062872.js index cdf495a..cedd276 100644 --- a/docs/assets/js/14.577db88a.js +++ b/docs/assets/js/14.36062872.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[14],{292:function(t,a,v){t.exports=v.p+"assets/img/image-20190721113708689.f9b42a11.png"},293:function(t,a,v){t.exports=v.p+"assets/img/image-20190721113810235.59d55672.png"},294:function(t,a,v){t.exports=v.p+"assets/img/image-20190721114112644.526de44c.png"},295:function(t,a,v){t.exports=v.p+"assets/img/image-20190721114211751.e1a07115.png"},363:function(t,a,v){"use strict";v.r(a);var _=v(0),e=Object(_.a)({},function(){var t=this,a=t.$createElement,_=t._self._c||a;return _("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[_("h1",{attrs:{id:"存储卷声明"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#存储卷声明","aria-hidden":"true"}},[t._v("#")]),t._v(" 存储卷声明")]),t._v(" "),_("p",[t._v("存储卷声明: Kubernetes Persistent Volume Claim")]),t._v(" "),_("h1",{attrs:{id:"查看存储卷声明列表"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#查看存储卷声明列表","aria-hidden":"true"}},[t._v("#")]),t._v(" 查看存储卷声明列表")]),t._v(" "),_("p",[t._v("假设您已进入名称空间界面,如下图所示:")]),t._v(" "),_("p",[_("img",{attrs:{src:v(70),alt:"image-20190721110355464"}})]),t._v(" "),_("p",[t._v("存储卷声明列表位于图中左下角,点击 "),_("em",[_("strong",[t._v("放大")])]),t._v(" 按钮,可以将列表显示到更大的区域,如下图所示:")]),t._v(" "),_("blockquote",[_("p",[t._v("点击 "),_("strong",[t._v("存储卷声明")]),t._v(" 可以刷新该列表")])]),t._v(" "),_("p",[_("img",{attrs:{src:v(292),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(293),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(294),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(295),alt:"image-20190721114211751"}})]),t._v(" "),_("p",[t._v("编辑、删除操作可直接按照提示完成")])])},[],!1,null,null,null);a.default=e.exports},70:function(t,a,v){t.exports=v.p+"assets/img/image-20190721110355464.25f25dda.png"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[14],{274:function(t,a,v){t.exports=v.p+"assets/img/image-20190721113708689.f9b42a11.png"},275:function(t,a,v){t.exports=v.p+"assets/img/image-20190721113810235.59d55672.png"},276:function(t,a,v){t.exports=v.p+"assets/img/image-20190721114112644.526de44c.png"},277:function(t,a,v){t.exports=v.p+"assets/img/image-20190721114211751.e1a07115.png"},357:function(t,a,v){"use strict";v.r(a);var _=v(0),e=Object(_.a)({},function(){var t=this,a=t.$createElement,_=t._self._c||a;return _("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[_("h1",{attrs:{id:"存储卷声明"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#存储卷声明","aria-hidden":"true"}},[t._v("#")]),t._v(" 存储卷声明")]),t._v(" "),_("p",[t._v("存储卷声明: Kubernetes Persistent Volume Claim")]),t._v(" "),_("h1",{attrs:{id:"查看存储卷声明列表"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#查看存储卷声明列表","aria-hidden":"true"}},[t._v("#")]),t._v(" 查看存储卷声明列表")]),t._v(" "),_("p",[t._v("假设您已进入名称空间界面,如下图所示:")]),t._v(" "),_("p",[_("img",{attrs:{src:v(70),alt:"image-20190721110355464"}})]),t._v(" "),_("p",[t._v("存储卷声明列表位于图中左下角,点击 "),_("em",[_("strong",[t._v("放大")])]),t._v(" 按钮,可以将列表显示到更大的区域,如下图所示:")]),t._v(" "),_("blockquote",[_("p",[t._v("点击 "),_("strong",[t._v("存储卷声明")]),t._v(" 可以刷新该列表")])]),t._v(" "),_("p",[_("img",{attrs:{src:v(274),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(275),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(276),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(277),alt:"image-20190721114211751"}})]),t._v(" "),_("p",[t._v("编辑、删除操作可直接按照提示完成")])])},[],!1,null,null,null);a.default=e.exports},70:function(t,a,v){t.exports=v.p+"assets/img/image-20190721110355464.25f25dda.png"}}]); \ No newline at end of file diff --git a/docs/assets/js/15.305d72ec.js b/docs/assets/js/15.c7017780.js similarity index 87% rename from docs/assets/js/15.305d72ec.js rename to docs/assets/js/15.c7017780.js index f7dfe82..94ffe9e 100644 --- a/docs/assets/js/15.305d72ec.js +++ b/docs/assets/js/15.c7017780.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[15],{288:function(t,e,r){t.exports=r.p+"assets/img/image-20190721110543437.8cbe188d.png"},289:function(t,e,r){t.exports=r.p+"assets/img/image-20190721111011798.b9cc73b4.png"},290:function(t,e,r){t.exports=r.p+"assets/img/image-20190721111540512.b0a58451.png"},291:function(t,e,r){t.exports=r.p+"assets/img/image-20190721111642221.f9c06dc3.png"},361:function(t,e,r){"use strict";r.r(e);var s=r(0),v=Object(s.a)({},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"secrets"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#secrets","aria-hidden":"true"}},[t._v("#")]),t._v(" Secrets")]),t._v(" "),s("h1",{attrs:{id:"查看-secrets-列表"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#查看-secrets-列表","aria-hidden":"true"}},[t._v("#")]),t._v(" 查看 Secrets 列表")]),t._v(" "),s("p",[t._v("假设您已进入名称空间界面,如下图所示:")]),t._v(" "),s("p",[s("img",{attrs:{src:r(70),alt:"image-20190721110355464"}})]),t._v(" "),s("p",[t._v("Secrets 列表位于图中左上角,点击 "),s("em",[s("strong",[t._v("放大")])]),t._v(" 按钮,可以将列表显示到更大的区域,如下图所示:")]),t._v(" "),s("blockquote",[s("p",[t._v("点击 "),s("strong",[t._v("Secrets")]),t._v(" 可以刷新该列表")])]),t._v(" "),s("p",[s("img",{attrs:{src:r(288),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(289),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(290),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(291),alt:"image-20190721111642221"}})]),t._v(" "),s("p",[t._v("编辑、删除操作可直接按照提示完成")])])},[],!1,null,null,null);e.default=v.exports},70:function(t,e,r){t.exports=r.p+"assets/img/image-20190721110355464.25f25dda.png"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[15],{284:function(t,e,r){t.exports=r.p+"assets/img/image-20190721110543437.8cbe188d.png"},285:function(t,e,r){t.exports=r.p+"assets/img/image-20190721111011798.b9cc73b4.png"},286:function(t,e,r){t.exports=r.p+"assets/img/image-20190721111540512.b0a58451.png"},287:function(t,e,r){t.exports=r.p+"assets/img/image-20190721111642221.f9c06dc3.png"},361:function(t,e,r){"use strict";r.r(e);var s=r(0),v=Object(s.a)({},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"secrets"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#secrets","aria-hidden":"true"}},[t._v("#")]),t._v(" Secrets")]),t._v(" "),s("h1",{attrs:{id:"查看-secrets-列表"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#查看-secrets-列表","aria-hidden":"true"}},[t._v("#")]),t._v(" 查看 Secrets 列表")]),t._v(" "),s("p",[t._v("假设您已进入名称空间界面,如下图所示:")]),t._v(" "),s("p",[s("img",{attrs:{src:r(70),alt:"image-20190721110355464"}})]),t._v(" "),s("p",[t._v("Secrets 列表位于图中左上角,点击 "),s("em",[s("strong",[t._v("放大")])]),t._v(" 按钮,可以将列表显示到更大的区域,如下图所示:")]),t._v(" "),s("blockquote",[s("p",[t._v("点击 "),s("strong",[t._v("Secrets")]),t._v(" 可以刷新该列表")])]),t._v(" "),s("p",[s("img",{attrs:{src:r(284),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(285),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(286),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(287),alt:"image-20190721111642221"}})]),t._v(" "),s("p",[t._v("编辑、删除操作可直接按照提示完成")])])},[],!1,null,null,null);e.default=v.exports},70:function(t,e,r){t.exports=r.p+"assets/img/image-20190721110355464.25f25dda.png"}}]); \ No newline at end of file diff --git a/docs/assets/js/19.5c694c00.js b/docs/assets/js/19.26371729.js similarity index 82% rename from docs/assets/js/19.5c694c00.js rename to docs/assets/js/19.26371729.js index 90682f6..7510a3f 100644 --- a/docs/assets/js/19.5c694c00.js +++ b/docs/assets/js/19.26371729.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[19],{223:function(t,a,e){t.exports=e.p+"assets/img/image-20190721104153954.74fb88ec.png"},224:function(t,a,e){t.exports=e.p+"assets/img/image-20190721101812895.8f059471.png"},225:function(t,a,e){t.exports=e.p+"assets/img/image-20190721101954560.176c574c.png"},226:function(t,a,e){t.exports=e.p+"assets/img/image-20190721103324863.72744076.png"},367:function(t,a,e){"use strict";e.r(a);var r=e(0),s=Object(r.a)({},function(){var t=this,a=t.$createElement,r=t._self._c||a;return r("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[r("h1",{attrs:{id:"集群事件"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#集群事件","aria-hidden":"true"}},[t._v("#")]),t._v(" 集群事件")]),t._v(" "),r("p",[t._v("通过观察 KUberetes 集群事件,可以快速诊断部署时发生的问题。")]),t._v(" "),r("p",[t._v("Kuboard 建立了与 kubernetes apiserver 的长连接,可以在第一时间将集群中的事件更新以通知的形式显示在 dashboad 上。")]),t._v(" "),r("h2",{attrs:{id:"错误事件提示"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#错误事件提示","aria-hidden":"true"}},[t._v("#")]),t._v(" 错误事件提示")]),t._v(" "),r("p",[t._v("如果存在与某一个工作负载相关的错误事件,名称空间界面中,将以红色显示该工作负载,如下图所示:")]),t._v(" "),r("p",[r("img",{attrs:{src:e(223),alt:"image-20190721104153954"}})]),t._v(" "),r("h2",{attrs:{id:"全局事件"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#全局事件","aria-hidden":"true"}},[t._v("#")]),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("p",[t._v("在任何页面点击界面左上角的 "),r("em",[r("strong",[t._v("事件")])]),t._v(" 按钮,进入事件列表页:")]),t._v(" "),r("p",[r("img",{attrs:{src:e(224),alt:"image-20190721101812895"}})]),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",[t._v("点击全局事件列表中的 "),r("em",[r("strong",[t._v("类型")])]),t._v(" 标签,")])]),t._v(" "),r("p",[r("img",{attrs:{src:e(225),alt:"image-20190721101954560"}})]),t._v(" "),r("ul",[r("li",[t._v("点击 "),r("em",[r("strong",[t._v("确定")])])])]),t._v(" "),r("p",[t._v("该事件已删除。如果事件对应的错误原因没有被解决,该事件又会在下一次 kubernetes 调度系统资源的时候重新出现。")]),t._v(" "),r("h2",{attrs:{id:"微服务上下文相关的事件"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#微服务上下文相关的事件","aria-hidden":"true"}},[t._v("#")]),t._v(" 微服务上下文相关的事件")]),t._v(" "),r("p",[t._v("打开工作负载页面,如下图所示:")]),t._v(" "),r("p",[t._v("容器组信息中包含了与该容器组相关的所有集群事件。")]),t._v(" "),r("p",[r("img",{attrs:{src:e(226),alt:"image-20190721103324863"}})])])},[],!1,null,null,null);a.default=s.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[19],{220:function(t,a,e){t.exports=e.p+"assets/img/image-20190721104153954.74fb88ec.png"},221:function(t,a,e){t.exports=e.p+"assets/img/image-20190721101812895.8f059471.png"},222:function(t,a,e){t.exports=e.p+"assets/img/image-20190721101954560.176c574c.png"},223:function(t,a,e){t.exports=e.p+"assets/img/image-20190721103324863.72744076.png"},353:function(t,a,e){"use strict";e.r(a);var r=e(0),s=Object(r.a)({},function(){var t=this,a=t.$createElement,r=t._self._c||a;return r("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[r("h1",{attrs:{id:"集群事件"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#集群事件","aria-hidden":"true"}},[t._v("#")]),t._v(" 集群事件")]),t._v(" "),r("p",[t._v("通过观察 KUberetes 集群事件,可以快速诊断部署时发生的问题。")]),t._v(" "),r("p",[t._v("Kuboard 建立了与 kubernetes apiserver 的长连接,可以在第一时间将集群中的事件更新以通知的形式显示在 dashboad 上。")]),t._v(" "),r("h2",{attrs:{id:"错误事件提示"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#错误事件提示","aria-hidden":"true"}},[t._v("#")]),t._v(" 错误事件提示")]),t._v(" "),r("p",[t._v("如果存在与某一个工作负载相关的错误事件,名称空间界面中,将以红色显示该工作负载,如下图所示:")]),t._v(" "),r("p",[r("img",{attrs:{src:e(220),alt:"image-20190721104153954"}})]),t._v(" "),r("h2",{attrs:{id:"全局事件"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#全局事件","aria-hidden":"true"}},[t._v("#")]),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("p",[t._v("在任何页面点击界面左上角的 "),r("em",[r("strong",[t._v("事件")])]),t._v(" 按钮,进入事件列表页:")]),t._v(" "),r("p",[r("img",{attrs:{src:e(221),alt:"image-20190721101812895"}})]),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",[t._v("点击全局事件列表中的 "),r("em",[r("strong",[t._v("类型")])]),t._v(" 标签,")])]),t._v(" "),r("p",[r("img",{attrs:{src:e(222),alt:"image-20190721101954560"}})]),t._v(" "),r("ul",[r("li",[t._v("点击 "),r("em",[r("strong",[t._v("确定")])])])]),t._v(" "),r("p",[t._v("该事件已删除。如果事件对应的错误原因没有被解决,该事件又会在下一次 kubernetes 调度系统资源的时候重新出现。")]),t._v(" "),r("h2",{attrs:{id:"微服务上下文相关的事件"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#微服务上下文相关的事件","aria-hidden":"true"}},[t._v("#")]),t._v(" 微服务上下文相关的事件")]),t._v(" "),r("p",[t._v("打开工作负载页面,如下图所示:")]),t._v(" "),r("p",[t._v("容器组信息中包含了与该容器组相关的所有集群事件。")]),t._v(" "),r("p",[r("img",{attrs:{src:e(223),alt:"image-20190721103324863"}})])])},[],!1,null,null,null);a.default=s.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/20.f0411e4e.js b/docs/assets/js/20.97946d47.js similarity index 98% rename from docs/assets/js/20.f0411e4e.js rename to docs/assets/js/20.97946d47.js index 4618a53..71d5a46 100644 --- a/docs/assets/js/20.f0411e4e.js +++ b/docs/assets/js/20.97946d47.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[20],{331:function(a,s,e){a.exports=e.p+"assets/img/image-20190713075717350.df5244cd.png"},332:function(a,s,e){a.exports=e.p+"assets/img/image2019-6-10_15-36-29.2870ee7d.png"},346:function(a,s,e){"use strict";e.r(s);var t=e(0),r=Object(t.a)({},function(){var a=this,s=a.$createElement,t=a._self._c||s;return t("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[t("h1",{attrs:{id:"安装-kubernetes"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#安装-kubernetes","aria-hidden":"true"}},[a._v("#")]),a._v(" 安装 Kubernetes")]),a._v(" "),t("h1",{attrs:{id:"介绍"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#介绍","aria-hidden":"true"}},[a._v("#")]),a._v(" 介绍")]),a._v(" "),t("p",[a._v("kubernetes 安装有多种选择,本文档描述的集群安装具备如下特点:")]),a._v(" "),t("ul",[t("li",[a._v("使用 kubernetes 1.15.0")]),a._v(" "),t("li",[a._v("三个 master 组成主节点集群,通过内网 loader balancer 实现负载均衡")]),a._v(" "),t("li",[a._v("多个 worker 组成工作节点集群,通过外网 loader balancer 实现负载均衡")]),a._v(" "),t("li",[a._v("使用 calico 作为网络插件")]),a._v(" "),t("li",[a._v("使用 nginx-ingress 作为 kubernetes ingress controller")])]),a._v(" "),t("p",[t("a",{attrs:{href:"https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=obezo3pg",target:"_blank",rel:"noopener noreferrer"}},[a._v("领取阿里云最高2000元红包"),t("OutboundLink")],1)]),a._v(" "),t("p",[a._v("下图为 kubernetes 安装的拓扑图")]),a._v(" "),t("p",[t("img",{attrs:{src:e(331),alt:"image-20190713075717350"}})]),a._v(" "),t("ul",[t("li",[a._v("标准机用于制作 centos 镜像,该镜像预先安装了 docker / kubelet / kubectl / kubeadm, 并预先下载了 kubernetes 所需的 docker image")]),a._v(" "),t("li",[a._v("跳板机用于通过 ssh 端口访问标准机、master 节点、worker 节点的 shell,如果您所使用的环境中,可以直接访问各节点的 shell,也可以无需跳板机")]),a._v(" "),t("li",[a._v("NAT y.y.y.y将 apiserver 的6443端口映射到外网,如果您始终只在 master 节点上执行 kubectl 命令,则无需做此映射")]),a._v(" "),t("li",[a._v("Load Balancer z.z.z.z 是 kubernetes 的 Ingress 外网映射,通常是必须的")])]),a._v(" "),t("h1",{attrs:{id:"安装步骤"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#安装步骤","aria-hidden":"true"}},[a._v("#")]),a._v(" 安装步骤")]),a._v(" "),t("h2",{attrs:{id:"制作标准机镜像"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#制作标准机镜像","aria-hidden":"true"}},[a._v("#")]),a._v(" 制作标准机镜像")]),a._v(" "),t("p",[a._v("通过使用标准机镜像,可以")]),a._v(" "),t("ul",[t("li",[t("strong",[a._v("避免重复执行对测试机安装必要软件的过程")])]),a._v(" "),t("li",[t("strong",[a._v("以一种相对标准化的过程管理测试机的维护")])])]),a._v(" "),t("p",[a._v("标准机镜像中预装了如下内容:")]),a._v(" "),t("ul",[t("li",[a._v("docker")]),a._v(" "),t("li",[a._v("gitlab-runner")]),a._v(" "),t("li",[a._v("kubernetes images")])]),a._v(" "),t("p",[a._v("本文档描述的安装过程已基于 centos 7.6 验证")]),a._v(" "),t("p",[a._v("标准机镜像的制作过程描述如下:")]),a._v(" "),t("h3",{attrs:{id:"安装docker"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#安装docker","aria-hidden":"true"}},[a._v("#")]),a._v(" 安装docker")]),a._v(" "),t("p",[t("strong",[a._v("卸载旧版本")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" yum remove docker "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n\tdocker-client "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n\tdocker-client-latest "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n\tdocker-common "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n\tdocker-latest "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n\tdocker-latest-logrotate "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n\tdocker-logrotate "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n\tdocker-selinux "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n\tdocker-engine-selinux "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n\tdocker-engine\n")])])]),t("p",[t("strong",[a._v("下载依赖包及安装包")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("wget")]),a._v(" https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm\n\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("wget")]),a._v(" https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-cli-18.09.7-3.el7.x86_64.rpm\n\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("wget")]),a._v(" https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-18.09.7-3.el7.x86_64.rpm\n")])])]),t("p",[t("strong",[a._v("安装")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" yum "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("install")]),a._v(" -y containerd.io-1.2.6-3.3.el7.x86_64.rpm\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" yum "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("install")]),a._v(" -y docker-ce-cli-18.09.7-3.el7.x86_64.rpm\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" yum "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("install")]),a._v(" -y docker-ce-18.09.7-3.el7.x86_64.rpm\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" systemctl "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("enable")]),a._v(" docker\n")])])]),t("p",[t("strong",[a._v("启动 docker 服务")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" systemctl start docker\n")])])]),t("p",[t("strong",[a._v("检查 docker 版本")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("docker version\n")])])]),t("p",[t("strong",[a._v("参考文档")])]),a._v(" "),t("p",[a._v("https://docs.docker.com/install/linux/docker-ce/centos/")]),a._v(" "),t("p",[a._v("https://docs.docker.com/install/linux/linux-postinstall/")]),a._v(" "),t("h3",{attrs:{id:"安装-nfs-utils"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#安装-nfs-utils","aria-hidden":"true"}},[a._v("#")]),a._v(" 安装 nfs-utils")]),a._v(" "),t("p",[t("strong",[a._v("执行安装命令")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" yum "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("install")]),a._v(" nfs-utils\n")])])]),t("p",[a._v("必须先安装 nfs-utils 才能挂载 nfs 网络存储")]),a._v(" "),t("h3",{attrs:{id:"k8s基本配置"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#k8s基本配置","aria-hidden":"true"}},[a._v("#")]),a._v(" K8S基本配置")]),a._v(" "),t("p",[t("strong",[a._v("配置K8S的yum源")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("cat")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("<<")]),a._v("EOF "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v(">")]),a._v(" /etc/yum.repos.d/kubernetes.repo\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),a._v("kubernetes"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("name")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("Kubernetes\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("baseurl")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("enabled")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("1")]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("gpgcheck")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("0")]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("repo_gpgcheck")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("0")]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("gpgkey")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg\n http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg\nEOF\n")])])]),t("p",[t("strong",[a._v("关闭swap、防火墙")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("swapoff -a\n")])])]),t("p",[t("strong",[a._v("关闭SeLinux")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("setenforce "),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("0")]),a._v("\n")])])]),t("p",[t("strong",[a._v("修改 /etc/sysctl.conf")])]),a._v(" "),t("p",[t("code",[a._v("vim /etc/sysctl.conf")])]),a._v(" "),t("p",[a._v("向其中添加")]),a._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[a._v("net.ipv4.ip_forward = 1\nnet.bridge.bridge-nf-call-ip6tables = 1\nnet.bridge.bridge-nf-call-iptables = 1\n")])])]),t("p",[a._v("如下图所示")]),a._v(" "),t("p",[t("img",{attrs:{src:e(72),alt:"image-20190715085036593",title:":size=600x445"}})]),a._v(" "),t("p",[t("strong",[a._v("安装kubelet、kubeadm、kubectl")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("yum "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("install")]),a._v(" -y kubelet-1.15.0 kubeadm-1.15.0 kubectl-1.15.0\n")])])]),t("p",[t("strong",[a._v("修改docker Cgroup Driver为systemd")])]),a._v(" "),t("p",[t("code",[a._v("vim /usr/lib/systemd/system/docker.service")])]),a._v(" "),t("p",[a._v("向其中他添加")]),a._v(" "),t("p",[t("code",[a._v("--exec-opt native.cgroupdriver=systemd")])]),a._v(" "),t("p",[a._v("如下图所示")]),a._v(" "),t("p",[t("img",{attrs:{src:e(73),alt:"屏幕快照 2019-07-15 09.01.21",title:":size=1000x326"}})]),a._v(" "),t("p",[a._v("重启 docker")]),a._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[a._v("systemctl daemon-reload\nsystemctl restart docker\n")])])]),t("p",[t("strong",[a._v("启动kubelet")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("systemctl "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("enable")]),a._v(" kubelet "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("&&")]),a._v(" systemctl start kubelet\n")])])]),t("p",[t("strong",[a._v("加载 kubernetes 镜像")])]),a._v(" "),t("p",[a._v("由于k8s服务相关镜像在国外镜像源,国内无法访问")]),a._v(" "),t("p",[a._v("执行以下命令添加docker k8s国内镜像源")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("curl")]),a._v(" -sSL https://get.daocloud.io/daotools/set_mirror.sh "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sh")]),a._v(" -s http://f1361db2.m.daocloud.io\n\nsystemctl restart docker\n")])])]),t("p",[t("strong",[a._v("拉取k8s相关镜像")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("docker pull mirrorgooglecontainers/kube-apiserver:v1.15.0\ndocker pull mirrorgooglecontainers/kube-controller-manager:v1.15.0\ndocker pull mirrorgooglecontainers/kube-scheduler:v1.15.0\ndocker pull mirrorgooglecontainers/kube-proxy:v1.15.0\ndocker pull mirrorgooglecontainers/pause:3.1\ndocker pull mirrorgooglecontainers/etcd:3.3.10\ndocker pull coredns/coredns:1.3.1\n")])])]),t("p",[t("strong",[a._v("更改镜像名为k8s官网镜像")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("docker tag d235b23c3570 k8s.gcr.io/kube-proxy:v1.15.0\ndocker tag 201c7a840312 k8s.gcr.io/kube-apiserver:v1.15.0\ndocker tag 2d3813851e87 k8s.gcr.io/kube-scheduler:v1.15.0\ndocker tag 8328bb49b652 k8s.gcr.io/kube-controller-manager:v1.15.0\ndocker tag da86e6ba6ca1 k8s.gcr.io/pause:3.1\ndocker tag eb516548c180 k8s.gcr.io/coredns:1.3.1\ndocker tag 2c4adeb21b4f k8s.gcr.io/etcd:3.3.10\n")])])]),t("p",[t("strong",[a._v("制作镜像")])]),a._v(" "),t("p",[a._v("请参考阿里云基于ECS "),t("a",{attrs:{href:"https://help.aliyun.com/document_detail/35109.html?spm=5176.2020520101.0.0.75fc4df5mtdFmV",target:"_blank",rel:"noopener noreferrer"}},[a._v("制作虚拟机镜像"),t("OutboundLink")],1),a._v(" 的文档")]),a._v(" "),t("h2",{attrs:{id:"初始化api-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#初始化api-server","aria-hidden":"true"}},[a._v("#")]),a._v(" 初始化API Server")]),a._v(" "),t("h3",{attrs:{id:"创建-apiserver-的-elb(私网)"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#创建-apiserver-的-elb(私网)","aria-hidden":"true"}},[a._v("#")]),a._v(" 创建 ApiServer 的 ELB(私网)")]),a._v(" "),t("p",[a._v("监听端口:6443 / TCP")]),a._v(" "),t("p",[a._v("后端资源组:包含 apple-master-a-1, apple-master-b-1, apple-master-b-2")]),a._v(" "),t("p",[a._v("后端端口:6443")]),a._v(" "),t("p",[a._v("开启 按源地址保持会话")]),a._v(" "),t("p",[a._v("假设完成创建以后,ELB的 ip 地址为 x.x.x.x")]),a._v(" "),t("h3",{attrs:{id:"初始化第一个master节点"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#初始化第一个master节点","aria-hidden":"true"}},[a._v("#")]),a._v(" 初始化第一个master节点")]),a._v(" "),t("p",[a._v("在 apple-master-a-1机器上执行")]),a._v(" "),t("p",[t("strong",[a._v("配置 apiserver.apple 的域名")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" -i\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("echo")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"x.x.x.x apiserver.apple"')]),a._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v(">>")]),a._v(" /etc/hosts\n")])])]),t("blockquote",[t("p",[a._v("请替换其中的 x.x.x.x 为您的负载均衡服务器的实际 ip 地址")])]),a._v(" "),t("p",[t("strong",[a._v("创建 /root/k8s/kubeadm-config.yaml")])]),a._v(" "),t("div",{staticClass:"language-yaml extra-class"},[t("pre",{pre:!0,attrs:{class:"language-yaml"}},[t("code",[t("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("apiVersion")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" kubeadm.k8s.io/v1beta1\n"),t("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("kind")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" ClusterConfiguration\n"),t("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("kubernetesVersion")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" v1.14.3\n"),t("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("controlPlaneEndpoint")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"apiserver.apple:6443"')]),a._v("\n\n")])])]),t("p",[t("strong",[a._v("初始化 apiserver")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("kubeadm init --config"),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("/root/k8s/kubeadm-config.yaml --upload-certs\n\n")])])]),t("p",[a._v("执行结果如下图所示:")]),a._v(" "),t("p",[t("img",{attrs:{src:e(332),alt:"image2019-6-10_15-36-29"}})]),a._v(" "),t("p",[t("strong",[a._v("初始化 gitlab-runner 用户的 kubectl 配置")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("rm")]),a._v(" -rf /home/gitlab-runner/.kube/\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("mkdir")]),a._v(" /home/gitlab-runner/.kube/\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("cp")]),a._v(" -i /etc/kubernetes/admin.conf /home/gitlab-runner/.kube/config\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("chown")]),a._v(" -R gitlab-runner:gitlab-runner /home/gitlab-runner/.kube\n")])])]),t("p",[t("strong",[a._v("安装 calico")])]),a._v(" "),t("p",[a._v("(需要在安全组–ServerFarm需要为集群服务器器端口6443建立安全组规则)")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("su")]),a._v(" - gitlab-runner\nkubectl apply -f "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n\t\thttps://docs.projectcalico.org/v3.6/getting-started/kubernetes/installation/hosted/kubernetes-datastore/calico-networking/1.7/calico.yaml\n")])])]),t("blockquote",[t("p",[a._v("安装calico, 请参考https://docs.projectcalico.org/v3.6/getting-started/kubernetes/")])]),a._v(" "),t("p",[t("strong",[a._v("等待calico安装就绪:")])]),a._v(" "),t("p",[a._v("执行如下命令,等待3-10分钟,直到所有的容器组处于 Running 状态")]),a._v(" "),t("div",{staticClass:"language-sh extra-class"},[t("pre",{pre:!0,attrs:{class:"language-sh"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("watch")]),a._v(" kubectl get pod -n kube-system\n")])])]),t("h3",{attrs:{id:"初始化第二、三个master节点"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#初始化第二、三个master节点","aria-hidden":"true"}},[a._v("#")]),a._v(" 初始化第二、三个master节点")]),a._v(" "),t("p",[a._v("在 apple-master-b-1 和 apple-master-b-2 机器上执行")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" -i\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("echo")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"x.x.x.x apiserver.apple"')]),a._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v(">>")]),a._v(" /etc/hosts\n")])])]),t("p",[a._v("执行 (以下命令行在初始化 apple-master-a-1 时,被打印在控制台上,执行时应该使用控制台打印出的命令参数)")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("kubeadm "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("join")]),a._v(" apiserver.apple:6443 --token ejwx62.vqwog6il5p83uk7y "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n--discovery-token-ca-cert-hash sha256:6f7a8e40a810323672de5eee6f4d19aa2dbdb38411845a1bf5dd63485c43d303 "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n--experimental-control-plane --certificate-key 70eb87e62f052d2d5de759969d5b42f372d0ad798f98df38f7fe73efdf63a13c\n")])])]),t("h3",{attrs:{id:"检查-apiserver初始化结果"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#检查-apiserver初始化结果","aria-hidden":"true"}},[a._v("#")]),a._v(" 检查 apiserver初始化结果")]),a._v(" "),t("p",[a._v("在第一个master节点 apple-master-a-1 上执行")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" -i\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("su")]),a._v(" - gitlab-runner\nkubectl get nodes\n")])])]),t("h2",{attrs:{id:"初始化-worker节点"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#初始化-worker节点","aria-hidden":"true"}},[a._v("#")]),a._v(" 初始化 worker节点")]),a._v(" "),t("h3",{attrs:{id:"获得-join命令参数"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#获得-join命令参数","aria-hidden":"true"}},[a._v("#")]),a._v(" 获得 join命令参数")]),a._v(" "),t("p",[t("strong",[a._v("在第一个master节点 apple-master-a-1 节点执行")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" -i\nkubeadm token create --print-join-command\n")])])]),t("p",[a._v("可获取kubeadm join 命令及参数,如下所示")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("kubeadm "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("join")]),a._v(" apiserver.apple:6443 --token mpfjma.4vjjg8flqihor4vt --discovery-token-ca-cert-hash sha256:6f7a8e40a810323672de5eee6f4d19aa2dbdb38411845a1bf5dd63485c43d303\n")])])]),t("h3",{attrs:{id:"初始化worker"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#初始化worker","aria-hidden":"true"}},[a._v("#")]),a._v(" 初始化worker")]),a._v(" "),t("p",[t("strong",[a._v("针对所有的 worker 节点执行")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" -i\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("echo")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"x.x.x.x apiserver.apple"')]),a._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v(">>")]),a._v(" /etc/hosts\nkubeadm "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("join")]),a._v(" apiserver.apple:6443 --token mpfjma.4vjjg8flqihor4vt --discovery-token-ca-cert-hash sha256:6f7a8e40a810323672de5eee6f4d19aa2dbdb38411845a1bf5dd63485c43d303\n")])])]),t("blockquote",[t("ul",[t("li",[t("p",[a._v("将 x.x.x.x 替换为 loader balancer 的实际 ip")])]),a._v(" "),t("li",[t("p",[a._v("将 kubeadm join 命令后的参数替换为上一个步骤中实际从 apple-master-a-1 节点获得的参数")])])])]),a._v(" "),t("h3",{attrs:{id:"检查-apiserver初始化结果-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#检查-apiserver初始化结果-2","aria-hidden":"true"}},[a._v("#")]),a._v(" 检查 apiserver初始化结果")]),a._v(" "),t("p",[a._v("在第一个master节点 apple-master-a-1 上执行")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" -i\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("su")]),a._v(" - gitlab-runner\nkubectl get nodes\n")])])]),t("h2",{attrs:{id:"移除-worker-节点"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#移除-worker-节点","aria-hidden":"true"}},[a._v("#")]),a._v(" 移除 worker 节点")]),a._v(" "),t("blockquote",[t("p",[a._v("正常情况下,您无需移除 worker 节点")])]),a._v(" "),t("p",[a._v("在准备移除的 worker 节点上执行")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" -i\t\nkubeadm reset\n")])])]),t("p",[a._v("在第一个 master 节点 apple-master-a-1 上执行")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" -i\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("su")]),a._v(" - gitlab-runner\nkubectl delete node apple-worker-x-x\n")])])]),t("blockquote",[t("ul",[t("li",[a._v("将 apple-worker-x-x 替换为要移除的 worker 节点的名字")]),a._v(" "),t("li",[a._v("worker 节点的名字可以通过在第一个 master 节点 apple-master-a-1 上执行 kubectl get nodes 命令获得")])])]),a._v(" "),t("h2",{attrs:{id:"安装-ingress-controller"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#安装-ingress-controller","aria-hidden":"true"}},[a._v("#")]),a._v(" 安装 Ingress Controller")]),a._v(" "),t("blockquote",[t("p",[a._v("ingress官方文档:https://kubernetes.io/docs/concepts/services-networking/ingress/")]),a._v(" "),t("p",[a._v("Ingress Controllers官网介绍:"),t("a",{attrs:{href:"https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/",target:"_blank",rel:"noopener noreferrer"}},[a._v("https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/"),t("OutboundLink")],1)]),a._v(" "),t("p",[a._v("本文中使用如下部署方式:https://kubernetes.github.io/ingress-nginx/deploy/baremetal/#using-a-self-provisioned-edge")]),a._v(" "),t("p",[a._v("kubernetes支持多种Ingress Controllers,本文推荐使用")]),a._v(" "),t("p",[a._v("https://github.com/nginxinc/kubernetes-ingress")])]),a._v(" "),t("h3",{attrs:{id:"在-apple-master-a-1-上执行"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#在-apple-master-a-1-上执行","aria-hidden":"true"}},[a._v("#")]),a._v(" 在 apple-master-a-1 上执行")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("su")]),a._v(" - gitlab-runner\nkubectl apply -f https://raw.githubusercontent.com/eip-work/eip-monitor-repository/master/dashboard/nginx-ingress.yaml\n")])])]),t("h3",{attrs:{id:"在iaas云控制台完成如下配置(公网elb)"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#在iaas云控制台完成如下配置(公网elb)","aria-hidden":"true"}},[a._v("#")]),a._v(" 在IaaS云控制台完成如下配置("),t("strong",[a._v("公网ELB")]),a._v(")")]),a._v(" "),t("p",[a._v("创建负载均衡 ELB:")]),a._v(" "),t("p",[a._v("​ 监听器 1:80 / TCP, SOURCE_ADDRESS 会话保持")]),a._v(" "),t("p",[a._v("​ 服务器资源池 1: apple-worker-x-x 的所有节点的 80端口")]),a._v(" "),t("p",[a._v("​ 监听器 2:443 / TCP, SOURCE_ADDRESS 会话保持")]),a._v(" "),t("p",[a._v("​ 服务器资源池 2: apple-worker-x-x 的所有节点的443端口")]),a._v(" "),t("p",[a._v("假设刚创建的负载均衡 ELB 的 IP 地址为: z.z.z.z")]),a._v(" "),t("h3",{attrs:{id:"配置域名解析"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#配置域名解析","aria-hidden":"true"}},[a._v("#")]),a._v(" 配置域名解析")]),a._v(" "),t("p",[a._v("将域名 *.apple.yourdomain.com 解析到地址负载均衡服务器 的 IP 地址 z.z.z.z")]),a._v(" "),t("h3",{attrs:{id:"验证配置"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#验证配置","aria-hidden":"true"}},[a._v("#")]),a._v(" 验证配置")]),a._v(" "),t("p",[a._v("在浏览器访问 a.apple.yourdomain.com,将得到 404 NotFound 错误页面")])])},[],!1,null,null,null);s.default=r.exports},72:function(a,s,e){a.exports=e.p+"assets/img/image-20190715085036593.ab4a32ff.png"},73:function(a,s,e){a.exports=e.p+"assets/img/image2019-07-15_09.01.21.1ac5bd70.png"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[20],{322:function(a,s,e){a.exports=e.p+"assets/img/image-20190713075717350.df5244cd.png"},323:function(a,s,e){a.exports=e.p+"assets/img/image2019-6-10_15-36-29.2870ee7d.png"},348:function(a,s,e){"use strict";e.r(s);var t=e(0),r=Object(t.a)({},function(){var a=this,s=a.$createElement,t=a._self._c||s;return t("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[t("h1",{attrs:{id:"安装-kubernetes"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#安装-kubernetes","aria-hidden":"true"}},[a._v("#")]),a._v(" 安装 Kubernetes")]),a._v(" "),t("h1",{attrs:{id:"介绍"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#介绍","aria-hidden":"true"}},[a._v("#")]),a._v(" 介绍")]),a._v(" "),t("p",[a._v("kubernetes 安装有多种选择,本文档描述的集群安装具备如下特点:")]),a._v(" "),t("ul",[t("li",[a._v("使用 kubernetes 1.15.0")]),a._v(" "),t("li",[a._v("三个 master 组成主节点集群,通过内网 loader balancer 实现负载均衡")]),a._v(" "),t("li",[a._v("多个 worker 组成工作节点集群,通过外网 loader balancer 实现负载均衡")]),a._v(" "),t("li",[a._v("使用 calico 作为网络插件")]),a._v(" "),t("li",[a._v("使用 nginx-ingress 作为 kubernetes ingress controller")])]),a._v(" "),t("p",[t("a",{attrs:{href:"https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=obezo3pg",target:"_blank",rel:"noopener noreferrer"}},[a._v("领取阿里云最高2000元红包"),t("OutboundLink")],1)]),a._v(" "),t("p",[a._v("下图为 kubernetes 安装的拓扑图")]),a._v(" "),t("p",[t("img",{attrs:{src:e(322),alt:"image-20190713075717350"}})]),a._v(" "),t("ul",[t("li",[a._v("标准机用于制作 centos 镜像,该镜像预先安装了 docker / kubelet / kubectl / kubeadm, 并预先下载了 kubernetes 所需的 docker image")]),a._v(" "),t("li",[a._v("跳板机用于通过 ssh 端口访问标准机、master 节点、worker 节点的 shell,如果您所使用的环境中,可以直接访问各节点的 shell,也可以无需跳板机")]),a._v(" "),t("li",[a._v("NAT y.y.y.y将 apiserver 的6443端口映射到外网,如果您始终只在 master 节点上执行 kubectl 命令,则无需做此映射")]),a._v(" "),t("li",[a._v("Load Balancer z.z.z.z 是 kubernetes 的 Ingress 外网映射,通常是必须的")])]),a._v(" "),t("h1",{attrs:{id:"安装步骤"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#安装步骤","aria-hidden":"true"}},[a._v("#")]),a._v(" 安装步骤")]),a._v(" "),t("h2",{attrs:{id:"制作标准机镜像"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#制作标准机镜像","aria-hidden":"true"}},[a._v("#")]),a._v(" 制作标准机镜像")]),a._v(" "),t("p",[a._v("通过使用标准机镜像,可以")]),a._v(" "),t("ul",[t("li",[t("strong",[a._v("避免重复执行对测试机安装必要软件的过程")])]),a._v(" "),t("li",[t("strong",[a._v("以一种相对标准化的过程管理测试机的维护")])])]),a._v(" "),t("p",[a._v("标准机镜像中预装了如下内容:")]),a._v(" "),t("ul",[t("li",[a._v("docker")]),a._v(" "),t("li",[a._v("gitlab-runner")]),a._v(" "),t("li",[a._v("kubernetes images")])]),a._v(" "),t("p",[a._v("本文档描述的安装过程已基于 centos 7.6 验证")]),a._v(" "),t("p",[a._v("标准机镜像的制作过程描述如下:")]),a._v(" "),t("h3",{attrs:{id:"安装docker"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#安装docker","aria-hidden":"true"}},[a._v("#")]),a._v(" 安装docker")]),a._v(" "),t("p",[t("strong",[a._v("卸载旧版本")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" yum remove docker "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n\tdocker-client "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n\tdocker-client-latest "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n\tdocker-common "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n\tdocker-latest "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n\tdocker-latest-logrotate "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n\tdocker-logrotate "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n\tdocker-selinux "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n\tdocker-engine-selinux "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n\tdocker-engine\n")])])]),t("p",[t("strong",[a._v("下载依赖包及安装包")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("wget")]),a._v(" https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm\n\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("wget")]),a._v(" https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-cli-18.09.7-3.el7.x86_64.rpm\n\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("wget")]),a._v(" https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-18.09.7-3.el7.x86_64.rpm\n")])])]),t("p",[t("strong",[a._v("安装")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" yum "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("install")]),a._v(" -y containerd.io-1.2.6-3.3.el7.x86_64.rpm\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" yum "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("install")]),a._v(" -y docker-ce-cli-18.09.7-3.el7.x86_64.rpm\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" yum "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("install")]),a._v(" -y docker-ce-18.09.7-3.el7.x86_64.rpm\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" systemctl "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("enable")]),a._v(" docker\n")])])]),t("p",[t("strong",[a._v("启动 docker 服务")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" systemctl start docker\n")])])]),t("p",[t("strong",[a._v("检查 docker 版本")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("docker version\n")])])]),t("p",[t("strong",[a._v("参考文档")])]),a._v(" "),t("p",[a._v("https://docs.docker.com/install/linux/docker-ce/centos/")]),a._v(" "),t("p",[a._v("https://docs.docker.com/install/linux/linux-postinstall/")]),a._v(" "),t("h3",{attrs:{id:"安装-nfs-utils"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#安装-nfs-utils","aria-hidden":"true"}},[a._v("#")]),a._v(" 安装 nfs-utils")]),a._v(" "),t("p",[t("strong",[a._v("执行安装命令")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" yum "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("install")]),a._v(" nfs-utils\n")])])]),t("p",[a._v("必须先安装 nfs-utils 才能挂载 nfs 网络存储")]),a._v(" "),t("h3",{attrs:{id:"k8s基本配置"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#k8s基本配置","aria-hidden":"true"}},[a._v("#")]),a._v(" K8S基本配置")]),a._v(" "),t("p",[t("strong",[a._v("配置K8S的yum源")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("cat")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("<<")]),a._v("EOF "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v(">")]),a._v(" /etc/yum.repos.d/kubernetes.repo\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),a._v("kubernetes"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("name")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("Kubernetes\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("baseurl")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("enabled")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("1")]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("gpgcheck")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("0")]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("repo_gpgcheck")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("0")]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("gpgkey")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg\n http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg\nEOF\n")])])]),t("p",[t("strong",[a._v("关闭swap、防火墙")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("swapoff -a\n")])])]),t("p",[t("strong",[a._v("关闭SeLinux")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("setenforce "),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("0")]),a._v("\n")])])]),t("p",[t("strong",[a._v("修改 /etc/sysctl.conf")])]),a._v(" "),t("p",[t("code",[a._v("vim /etc/sysctl.conf")])]),a._v(" "),t("p",[a._v("向其中添加")]),a._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[a._v("net.ipv4.ip_forward = 1\nnet.bridge.bridge-nf-call-ip6tables = 1\nnet.bridge.bridge-nf-call-iptables = 1\n")])])]),t("p",[a._v("如下图所示")]),a._v(" "),t("p",[t("img",{attrs:{src:e(72),alt:"image-20190715085036593",title:":size=600x445"}})]),a._v(" "),t("p",[t("strong",[a._v("安装kubelet、kubeadm、kubectl")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("yum "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("install")]),a._v(" -y kubelet-1.15.0 kubeadm-1.15.0 kubectl-1.15.0\n")])])]),t("p",[t("strong",[a._v("修改docker Cgroup Driver为systemd")])]),a._v(" "),t("p",[t("code",[a._v("vim /usr/lib/systemd/system/docker.service")])]),a._v(" "),t("p",[a._v("向其中他添加")]),a._v(" "),t("p",[t("code",[a._v("--exec-opt native.cgroupdriver=systemd")])]),a._v(" "),t("p",[a._v("如下图所示")]),a._v(" "),t("p",[t("img",{attrs:{src:e(73),alt:"屏幕快照 2019-07-15 09.01.21",title:":size=1000x326"}})]),a._v(" "),t("p",[a._v("重启 docker")]),a._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[a._v("systemctl daemon-reload\nsystemctl restart docker\n")])])]),t("p",[t("strong",[a._v("启动kubelet")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("systemctl "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("enable")]),a._v(" kubelet "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("&&")]),a._v(" systemctl start kubelet\n")])])]),t("p",[t("strong",[a._v("加载 kubernetes 镜像")])]),a._v(" "),t("p",[a._v("由于k8s服务相关镜像在国外镜像源,国内无法访问")]),a._v(" "),t("p",[a._v("执行以下命令添加docker k8s国内镜像源")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("curl")]),a._v(" -sSL https://get.daocloud.io/daotools/set_mirror.sh "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sh")]),a._v(" -s http://f1361db2.m.daocloud.io\n\nsystemctl restart docker\n")])])]),t("p",[t("strong",[a._v("拉取k8s相关镜像")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("docker pull mirrorgooglecontainers/kube-apiserver:v1.15.0\ndocker pull mirrorgooglecontainers/kube-controller-manager:v1.15.0\ndocker pull mirrorgooglecontainers/kube-scheduler:v1.15.0\ndocker pull mirrorgooglecontainers/kube-proxy:v1.15.0\ndocker pull mirrorgooglecontainers/pause:3.1\ndocker pull mirrorgooglecontainers/etcd:3.3.10\ndocker pull coredns/coredns:1.3.1\n")])])]),t("p",[t("strong",[a._v("更改镜像名为k8s官网镜像")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("docker tag d235b23c3570 k8s.gcr.io/kube-proxy:v1.15.0\ndocker tag 201c7a840312 k8s.gcr.io/kube-apiserver:v1.15.0\ndocker tag 2d3813851e87 k8s.gcr.io/kube-scheduler:v1.15.0\ndocker tag 8328bb49b652 k8s.gcr.io/kube-controller-manager:v1.15.0\ndocker tag da86e6ba6ca1 k8s.gcr.io/pause:3.1\ndocker tag eb516548c180 k8s.gcr.io/coredns:1.3.1\ndocker tag 2c4adeb21b4f k8s.gcr.io/etcd:3.3.10\n")])])]),t("p",[t("strong",[a._v("制作镜像")])]),a._v(" "),t("p",[a._v("请参考阿里云基于ECS "),t("a",{attrs:{href:"https://help.aliyun.com/document_detail/35109.html?spm=5176.2020520101.0.0.75fc4df5mtdFmV",target:"_blank",rel:"noopener noreferrer"}},[a._v("制作虚拟机镜像"),t("OutboundLink")],1),a._v(" 的文档")]),a._v(" "),t("h2",{attrs:{id:"初始化api-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#初始化api-server","aria-hidden":"true"}},[a._v("#")]),a._v(" 初始化API Server")]),a._v(" "),t("h3",{attrs:{id:"创建-apiserver-的-elb(私网)"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#创建-apiserver-的-elb(私网)","aria-hidden":"true"}},[a._v("#")]),a._v(" 创建 ApiServer 的 ELB(私网)")]),a._v(" "),t("p",[a._v("监听端口:6443 / TCP")]),a._v(" "),t("p",[a._v("后端资源组:包含 apple-master-a-1, apple-master-b-1, apple-master-b-2")]),a._v(" "),t("p",[a._v("后端端口:6443")]),a._v(" "),t("p",[a._v("开启 按源地址保持会话")]),a._v(" "),t("p",[a._v("假设完成创建以后,ELB的 ip 地址为 x.x.x.x")]),a._v(" "),t("h3",{attrs:{id:"初始化第一个master节点"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#初始化第一个master节点","aria-hidden":"true"}},[a._v("#")]),a._v(" 初始化第一个master节点")]),a._v(" "),t("p",[a._v("在 apple-master-a-1机器上执行")]),a._v(" "),t("p",[t("strong",[a._v("配置 apiserver.apple 的域名")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" -i\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("echo")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"x.x.x.x apiserver.apple"')]),a._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v(">>")]),a._v(" /etc/hosts\n")])])]),t("blockquote",[t("p",[a._v("请替换其中的 x.x.x.x 为您的负载均衡服务器的实际 ip 地址")])]),a._v(" "),t("p",[t("strong",[a._v("创建 /root/k8s/kubeadm-config.yaml")])]),a._v(" "),t("div",{staticClass:"language-yaml extra-class"},[t("pre",{pre:!0,attrs:{class:"language-yaml"}},[t("code",[t("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("apiVersion")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" kubeadm.k8s.io/v1beta1\n"),t("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("kind")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" ClusterConfiguration\n"),t("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("kubernetesVersion")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" v1.14.3\n"),t("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("controlPlaneEndpoint")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"apiserver.apple:6443"')]),a._v("\n\n")])])]),t("p",[t("strong",[a._v("初始化 apiserver")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("kubeadm init --config"),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("/root/k8s/kubeadm-config.yaml --upload-certs\n\n")])])]),t("p",[a._v("执行结果如下图所示:")]),a._v(" "),t("p",[t("img",{attrs:{src:e(323),alt:"image2019-6-10_15-36-29"}})]),a._v(" "),t("p",[t("strong",[a._v("初始化 gitlab-runner 用户的 kubectl 配置")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("rm")]),a._v(" -rf /home/gitlab-runner/.kube/\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("mkdir")]),a._v(" /home/gitlab-runner/.kube/\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("cp")]),a._v(" -i /etc/kubernetes/admin.conf /home/gitlab-runner/.kube/config\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("chown")]),a._v(" -R gitlab-runner:gitlab-runner /home/gitlab-runner/.kube\n")])])]),t("p",[t("strong",[a._v("安装 calico")])]),a._v(" "),t("p",[a._v("(需要在安全组–ServerFarm需要为集群服务器器端口6443建立安全组规则)")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("su")]),a._v(" - gitlab-runner\nkubectl apply -f "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n\t\thttps://docs.projectcalico.org/v3.6/getting-started/kubernetes/installation/hosted/kubernetes-datastore/calico-networking/1.7/calico.yaml\n")])])]),t("blockquote",[t("p",[a._v("安装calico, 请参考https://docs.projectcalico.org/v3.6/getting-started/kubernetes/")])]),a._v(" "),t("p",[t("strong",[a._v("等待calico安装就绪:")])]),a._v(" "),t("p",[a._v("执行如下命令,等待3-10分钟,直到所有的容器组处于 Running 状态")]),a._v(" "),t("div",{staticClass:"language-sh extra-class"},[t("pre",{pre:!0,attrs:{class:"language-sh"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("watch")]),a._v(" kubectl get pod -n kube-system\n")])])]),t("h3",{attrs:{id:"初始化第二、三个master节点"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#初始化第二、三个master节点","aria-hidden":"true"}},[a._v("#")]),a._v(" 初始化第二、三个master节点")]),a._v(" "),t("p",[a._v("在 apple-master-b-1 和 apple-master-b-2 机器上执行")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" -i\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("echo")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"x.x.x.x apiserver.apple"')]),a._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v(">>")]),a._v(" /etc/hosts\n")])])]),t("p",[a._v("执行 (以下命令行在初始化 apple-master-a-1 时,被打印在控制台上,执行时应该使用控制台打印出的命令参数)")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("kubeadm "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("join")]),a._v(" apiserver.apple:6443 --token ejwx62.vqwog6il5p83uk7y "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n--discovery-token-ca-cert-hash sha256:6f7a8e40a810323672de5eee6f4d19aa2dbdb38411845a1bf5dd63485c43d303 "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n--experimental-control-plane --certificate-key 70eb87e62f052d2d5de759969d5b42f372d0ad798f98df38f7fe73efdf63a13c\n")])])]),t("h3",{attrs:{id:"检查-apiserver初始化结果"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#检查-apiserver初始化结果","aria-hidden":"true"}},[a._v("#")]),a._v(" 检查 apiserver初始化结果")]),a._v(" "),t("p",[a._v("在第一个master节点 apple-master-a-1 上执行")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" -i\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("su")]),a._v(" - gitlab-runner\nkubectl get nodes\n")])])]),t("h2",{attrs:{id:"初始化-worker节点"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#初始化-worker节点","aria-hidden":"true"}},[a._v("#")]),a._v(" 初始化 worker节点")]),a._v(" "),t("h3",{attrs:{id:"获得-join命令参数"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#获得-join命令参数","aria-hidden":"true"}},[a._v("#")]),a._v(" 获得 join命令参数")]),a._v(" "),t("p",[t("strong",[a._v("在第一个master节点 apple-master-a-1 节点执行")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" -i\nkubeadm token create --print-join-command\n")])])]),t("p",[a._v("可获取kubeadm join 命令及参数,如下所示")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("kubeadm "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("join")]),a._v(" apiserver.apple:6443 --token mpfjma.4vjjg8flqihor4vt --discovery-token-ca-cert-hash sha256:6f7a8e40a810323672de5eee6f4d19aa2dbdb38411845a1bf5dd63485c43d303\n")])])]),t("h3",{attrs:{id:"初始化worker"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#初始化worker","aria-hidden":"true"}},[a._v("#")]),a._v(" 初始化worker")]),a._v(" "),t("p",[t("strong",[a._v("针对所有的 worker 节点执行")])]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" -i\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("echo")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"x.x.x.x apiserver.apple"')]),a._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v(">>")]),a._v(" /etc/hosts\nkubeadm "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("join")]),a._v(" apiserver.apple:6443 --token mpfjma.4vjjg8flqihor4vt --discovery-token-ca-cert-hash sha256:6f7a8e40a810323672de5eee6f4d19aa2dbdb38411845a1bf5dd63485c43d303\n")])])]),t("blockquote",[t("ul",[t("li",[t("p",[a._v("将 x.x.x.x 替换为 loader balancer 的实际 ip")])]),a._v(" "),t("li",[t("p",[a._v("将 kubeadm join 命令后的参数替换为上一个步骤中实际从 apple-master-a-1 节点获得的参数")])])])]),a._v(" "),t("h3",{attrs:{id:"检查-apiserver初始化结果-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#检查-apiserver初始化结果-2","aria-hidden":"true"}},[a._v("#")]),a._v(" 检查 apiserver初始化结果")]),a._v(" "),t("p",[a._v("在第一个master节点 apple-master-a-1 上执行")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" -i\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("su")]),a._v(" - gitlab-runner\nkubectl get nodes\n")])])]),t("h2",{attrs:{id:"移除-worker-节点"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#移除-worker-节点","aria-hidden":"true"}},[a._v("#")]),a._v(" 移除 worker 节点")]),a._v(" "),t("blockquote",[t("p",[a._v("正常情况下,您无需移除 worker 节点")])]),a._v(" "),t("p",[a._v("在准备移除的 worker 节点上执行")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" -i\t\nkubeadm reset\n")])])]),t("p",[a._v("在第一个 master 节点 apple-master-a-1 上执行")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" -i\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("su")]),a._v(" - gitlab-runner\nkubectl delete node apple-worker-x-x\n")])])]),t("blockquote",[t("ul",[t("li",[a._v("将 apple-worker-x-x 替换为要移除的 worker 节点的名字")]),a._v(" "),t("li",[a._v("worker 节点的名字可以通过在第一个 master 节点 apple-master-a-1 上执行 kubectl get nodes 命令获得")])])]),a._v(" "),t("h2",{attrs:{id:"安装-ingress-controller"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#安装-ingress-controller","aria-hidden":"true"}},[a._v("#")]),a._v(" 安装 Ingress Controller")]),a._v(" "),t("blockquote",[t("p",[a._v("ingress官方文档:https://kubernetes.io/docs/concepts/services-networking/ingress/")]),a._v(" "),t("p",[a._v("Ingress Controllers官网介绍:"),t("a",{attrs:{href:"https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/",target:"_blank",rel:"noopener noreferrer"}},[a._v("https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/"),t("OutboundLink")],1)]),a._v(" "),t("p",[a._v("本文中使用如下部署方式:https://kubernetes.github.io/ingress-nginx/deploy/baremetal/#using-a-self-provisioned-edge")]),a._v(" "),t("p",[a._v("kubernetes支持多种Ingress Controllers,本文推荐使用")]),a._v(" "),t("p",[a._v("https://github.com/nginxinc/kubernetes-ingress")])]),a._v(" "),t("h3",{attrs:{id:"在-apple-master-a-1-上执行"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#在-apple-master-a-1-上执行","aria-hidden":"true"}},[a._v("#")]),a._v(" 在 apple-master-a-1 上执行")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("su")]),a._v(" - gitlab-runner\nkubectl apply -f https://raw.githubusercontent.com/eip-work/eip-monitor-repository/master/dashboard/nginx-ingress.yaml\n")])])]),t("h3",{attrs:{id:"在iaas云控制台完成如下配置(公网elb)"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#在iaas云控制台完成如下配置(公网elb)","aria-hidden":"true"}},[a._v("#")]),a._v(" 在IaaS云控制台完成如下配置("),t("strong",[a._v("公网ELB")]),a._v(")")]),a._v(" "),t("p",[a._v("创建负载均衡 ELB:")]),a._v(" "),t("p",[a._v("​ 监听器 1:80 / TCP, SOURCE_ADDRESS 会话保持")]),a._v(" "),t("p",[a._v("​ 服务器资源池 1: apple-worker-x-x 的所有节点的 80端口")]),a._v(" "),t("p",[a._v("​ 监听器 2:443 / TCP, SOURCE_ADDRESS 会话保持")]),a._v(" "),t("p",[a._v("​ 服务器资源池 2: apple-worker-x-x 的所有节点的443端口")]),a._v(" "),t("p",[a._v("假设刚创建的负载均衡 ELB 的 IP 地址为: z.z.z.z")]),a._v(" "),t("h3",{attrs:{id:"配置域名解析"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#配置域名解析","aria-hidden":"true"}},[a._v("#")]),a._v(" 配置域名解析")]),a._v(" "),t("p",[a._v("将域名 *.apple.yourdomain.com 解析到地址负载均衡服务器 的 IP 地址 z.z.z.z")]),a._v(" "),t("h3",{attrs:{id:"验证配置"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#验证配置","aria-hidden":"true"}},[a._v("#")]),a._v(" 验证配置")]),a._v(" "),t("p",[a._v("在浏览器访问 a.apple.yourdomain.com,将得到 404 NotFound 错误页面")])])},[],!1,null,null,null);s.default=r.exports},72:function(a,s,e){a.exports=e.p+"assets/img/image-20190715085036593.ab4a32ff.png"},73:function(a,s,e){a.exports=e.p+"assets/img/image2019-07-15_09.01.21.1ac5bd70.png"}}]); \ No newline at end of file diff --git a/docs/assets/js/21.66416221.js b/docs/assets/js/21.cbb547c5.js similarity index 85% rename from docs/assets/js/21.66416221.js rename to docs/assets/js/21.cbb547c5.js index 6250b9f..b35272f 100644 --- a/docs/assets/js/21.66416221.js +++ b/docs/assets/js/21.cbb547c5.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[21],{217:function(t,a,e){t.exports=e.p+"assets/img/image-20190720224950653.857d1b1e.png"},218:function(t,a,e){t.exports=e.p+"assets/img/image-20190720225123111.c2b02f0c.png"},219:function(t,a,e){t.exports=e.p+"assets/img/image-20190720225222622.2081299f.png"},340:function(t,a,e){"use strict";e.r(a);var r=e(0),s=Object(r.a)({},function(){var t=this,a=t.$createElement,r=t._self._c||a;return r("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[r("h1",{attrs:{id:"计算资源管理"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#计算资源管理","aria-hidden":"true"}},[t._v("#")]),t._v(" 计算资源管理")]),t._v(" "),r("h2",{attrs:{id:"前提"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#前提","aria-hidden":"true"}},[t._v("#")]),t._v(" 前提")]),t._v(" "),r("p",[t._v("必须具备如下条件:")]),t._v(" "),r("ul",[r("li",[t._v("Kubernetes 集群")]),t._v(" "),r("li",[t._v("已在集群中安装 Kuboard")])]),t._v(" "),r("h2",{attrs:{id:"添加节点"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#添加节点","aria-hidden":"true"}},[t._v("#")]),t._v(" 添加节点")]),t._v(" "),r("p",[t._v("集群完成安装后,可以随时向集群中添加计算节点,请参考 "),r("router-link",{attrs:{to:"/install/install-k8s.html#初始化-worker节点"}},[t._v("初始化 worker 节点")])],1),t._v(" "),r("h2",{attrs:{id:"查看节点"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#查看节点","aria-hidden":"true"}},[t._v("#")]),t._v(" 查看节点")]),t._v(" "),r("p",[t._v("登录 Kuboard 之后,即可看到集群中的计算资源列表,在左下角,如下图所示:")]),t._v(" "),r("p",[r("img",{attrs:{src:e(217),alt:"image-20190720224950653"}})]),t._v(" "),r("ul",[r("li",[t._v("点击 "),r("em",[r("strong",[t._v("demo-worker002")])]),t._v(" 可查看该节点的详细信息,如下图所示:")])]),t._v(" "),r("p",[r("img",{attrs:{src:e(218),alt:"image-20190720225123111"}})]),t._v(" "),r("h2",{attrs:{id:"移除节点"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#移除节点","aria-hidden":"true"}},[t._v("#")]),t._v(" 移除节点")]),t._v(" "),r("ul",[r("li",[r("p",[t._v("点击 "),r("em",[r("strong",[t._v("节点")])]),t._v(" 详情页上方的 "),r("em",[r("strong",[t._v("删除")])])]),t._v(" "),r("p",[t._v("并确认要删除的节点的名称后,即可删除该节点")])])]),t._v(" "),r("p",[r("img",{attrs:{src:e(219),alt:"image-20190720225222622"}})]),t._v(" "),r("blockquote",[r("ul",[r("li",[r("p",[t._v("此时只是从 kubenetes 集群的配置中删除了该节点,该节点上的工作负载将被自动迁移到其他可用节点上。如果重启该节点对应的 linux 操作系统,该节点会重新注册到集群中来。")])]),t._v(" "),r("li",[r("p",[t._v("要想彻底删除该节点,您还需要登录该节点所在机器的 linux 终端,并以 root 身份执行如下命令")]),t._v(" "),r("div",{staticClass:"language-bash extra-class"},[r("pre",{pre:!0,attrs:{class:"language-bash"}},[r("code",[t._v("kubadm reset\n")])])])])])])])},[],!1,null,null,null);a.default=s.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[21],{199:function(t,a,e){t.exports=e.p+"assets/img/image-20190720224950653.857d1b1e.png"},200:function(t,a,e){t.exports=e.p+"assets/img/image-20190720225123111.c2b02f0c.png"},201:function(t,a,e){t.exports=e.p+"assets/img/image-20190720225222622.2081299f.png"},355:function(t,a,e){"use strict";e.r(a);var r=e(0),s=Object(r.a)({},function(){var t=this,a=t.$createElement,r=t._self._c||a;return r("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[r("h1",{attrs:{id:"计算资源管理"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#计算资源管理","aria-hidden":"true"}},[t._v("#")]),t._v(" 计算资源管理")]),t._v(" "),r("h2",{attrs:{id:"前提"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#前提","aria-hidden":"true"}},[t._v("#")]),t._v(" 前提")]),t._v(" "),r("p",[t._v("必须具备如下条件:")]),t._v(" "),r("ul",[r("li",[t._v("Kubernetes 集群")]),t._v(" "),r("li",[t._v("已在集群中安装 Kuboard")])]),t._v(" "),r("h2",{attrs:{id:"添加节点"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#添加节点","aria-hidden":"true"}},[t._v("#")]),t._v(" 添加节点")]),t._v(" "),r("p",[t._v("集群完成安装后,可以随时向集群中添加计算节点,请参考 "),r("router-link",{attrs:{to:"/install/install-k8s.html#初始化-worker节点"}},[t._v("初始化 worker 节点")])],1),t._v(" "),r("h2",{attrs:{id:"查看节点"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#查看节点","aria-hidden":"true"}},[t._v("#")]),t._v(" 查看节点")]),t._v(" "),r("p",[t._v("登录 Kuboard 之后,即可看到集群中的计算资源列表,在左下角,如下图所示:")]),t._v(" "),r("p",[r("img",{attrs:{src:e(199),alt:"image-20190720224950653"}})]),t._v(" "),r("ul",[r("li",[t._v("点击 "),r("em",[r("strong",[t._v("demo-worker002")])]),t._v(" 可查看该节点的详细信息,如下图所示:")])]),t._v(" "),r("p",[r("img",{attrs:{src:e(200),alt:"image-20190720225123111"}})]),t._v(" "),r("h2",{attrs:{id:"移除节点"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#移除节点","aria-hidden":"true"}},[t._v("#")]),t._v(" 移除节点")]),t._v(" "),r("ul",[r("li",[r("p",[t._v("点击 "),r("em",[r("strong",[t._v("节点")])]),t._v(" 详情页上方的 "),r("em",[r("strong",[t._v("删除")])])]),t._v(" "),r("p",[t._v("并确认要删除的节点的名称后,即可删除该节点")])])]),t._v(" "),r("p",[r("img",{attrs:{src:e(201),alt:"image-20190720225222622"}})]),t._v(" "),r("blockquote",[r("ul",[r("li",[r("p",[t._v("此时只是从 kubenetes 集群的配置中删除了该节点,该节点上的工作负载将被自动迁移到其他可用节点上。如果重启该节点对应的 linux 操作系统,该节点会重新注册到集群中来。")])]),t._v(" "),r("li",[r("p",[t._v("要想彻底删除该节点,您还需要登录该节点所在机器的 linux 终端,并以 root 身份执行如下命令")]),t._v(" "),r("div",{staticClass:"language-bash extra-class"},[r("pre",{pre:!0,attrs:{class:"language-bash"}},[r("code",[t._v("kubadm reset\n")])])])])])])])},[],!1,null,null,null);a.default=s.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/22.20cf9e1e.js b/docs/assets/js/22.9fbb021a.js similarity index 83% rename from docs/assets/js/22.20cf9e1e.js rename to docs/assets/js/22.9fbb021a.js index 2a2c817..4796ec0 100644 --- a/docs/assets/js/22.20cf9e1e.js +++ b/docs/assets/js/22.9fbb021a.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[22],{220:function(t,e,a){t.exports=a.p+"assets/img/image-20190721104348908.ce6e526d.png"},221:function(t,e,a){t.exports=a.p+"assets/img/image-20190721104415732.07ea4278.png"},222:function(t,e,a){t.exports=a.p+"assets/img/image-20190721104522870.6c74e0bb.png"},353:function(t,e,a){"use strict";a.r(e);var s=a(0),r=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:"日志及终端"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#日志及终端","aria-hidden":"true"}},[t._v("#")]),t._v(" 日志及终端")]),t._v(" "),s("h1",{attrs:{id:"日志"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#日志","aria-hidden":"true"}},[t._v("#")]),t._v(" 日志")]),t._v(" "),s("p",[t._v("通过 Kuboard 可以实时跟踪容器的日志信息。")]),t._v(" "),s("p",[t._v("假设您已经进入 "),s("em",[s("strong",[t._v("工作负载")])]),t._v(" 详情页,如下图所示:")]),t._v(" "),s("p",[s("img",{attrs:{src:a(220),alt:"image-20190721104348908"}})]),t._v(" "),s("ul",[s("li",[s("p",[t._v("点击容器信息中的 "),s("em",[s("strong",[t._v("日志")])]),t._v(" 按钮")]),t._v(" "),s("p",[t._v("可进入日志追踪界面,如下图所示:")])])]),t._v(" "),s("p",[s("img",{attrs:{src:a(221),alt:"image-20190721104415732"}})]),t._v(" "),s("h1",{attrs:{id:"终端"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#终端","aria-hidden":"true"}},[t._v("#")]),t._v(" 终端")]),t._v(" "),s("ul",[s("li",[s("p",[t._v("点击容器信息中的 "),s("em",[s("strong",[t._v("终端")])]),t._v(" 按钮")]),t._v(" "),s("p",[t._v("可进入终端界面,如下图所示:")]),t._v(" "),s("blockquote",[s("ul",[s("li",[s("p",[t._v("在终端中,可以执行的 shell 命令取决于该容器预装的命令。许多容器为了精简自身的大小,只保留了最基本的命令。")])]),t._v(" "),s("li",[s("p",[t._v("通常会进入终端执行如下诊断操作:")]),t._v(" "),s("ul",[s("li",[t._v("export 命令查看容器内的环境变量是否被正确设置")]),t._v(" "),s("li",[t._v("ping, curl 命令检查容器内与集群内其他服务,集群外服务的网络连通性")]),t._v(" "),s("li",[t._v("vi 命令,临时修改容器内应用程序的配置,并在容器内重启应用程序,以临时性的尝试修复问题,如果有效再将修改更新到应用程序代码或者 Dockerfile")])])])])])])]),t._v(" "),s("p",[s("img",{attrs:{src:a(222),alt:"image-20190721104522870"}})])])},[],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[22],{224:function(t,e,a){t.exports=a.p+"assets/img/image-20190721104348908.ce6e526d.png"},225:function(t,e,a){t.exports=a.p+"assets/img/image-20190721104415732.07ea4278.png"},226:function(t,e,a){t.exports=a.p+"assets/img/image-20190721104522870.6c74e0bb.png"},350:function(t,e,a){"use strict";a.r(e);var s=a(0),r=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:"日志及终端"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#日志及终端","aria-hidden":"true"}},[t._v("#")]),t._v(" 日志及终端")]),t._v(" "),s("h1",{attrs:{id:"日志"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#日志","aria-hidden":"true"}},[t._v("#")]),t._v(" 日志")]),t._v(" "),s("p",[t._v("通过 Kuboard 可以实时跟踪容器的日志信息。")]),t._v(" "),s("p",[t._v("假设您已经进入 "),s("em",[s("strong",[t._v("工作负载")])]),t._v(" 详情页,如下图所示:")]),t._v(" "),s("p",[s("img",{attrs:{src:a(224),alt:"image-20190721104348908"}})]),t._v(" "),s("ul",[s("li",[s("p",[t._v("点击容器信息中的 "),s("em",[s("strong",[t._v("日志")])]),t._v(" 按钮")]),t._v(" "),s("p",[t._v("可进入日志追踪界面,如下图所示:")])])]),t._v(" "),s("p",[s("img",{attrs:{src:a(225),alt:"image-20190721104415732"}})]),t._v(" "),s("h1",{attrs:{id:"终端"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#终端","aria-hidden":"true"}},[t._v("#")]),t._v(" 终端")]),t._v(" "),s("ul",[s("li",[s("p",[t._v("点击容器信息中的 "),s("em",[s("strong",[t._v("终端")])]),t._v(" 按钮")]),t._v(" "),s("p",[t._v("可进入终端界面,如下图所示:")]),t._v(" "),s("blockquote",[s("ul",[s("li",[s("p",[t._v("在终端中,可以执行的 shell 命令取决于该容器预装的命令。许多容器为了精简自身的大小,只保留了最基本的命令。")])]),t._v(" "),s("li",[s("p",[t._v("通常会进入终端执行如下诊断操作:")]),t._v(" "),s("ul",[s("li",[t._v("export 命令查看容器内的环境变量是否被正确设置")]),t._v(" "),s("li",[t._v("ping, curl 命令检查容器内与集群内其他服务,集群外服务的网络连通性")]),t._v(" "),s("li",[t._v("vi 命令,临时修改容器内应用程序的配置,并在容器内重启应用程序,以临时性的尝试修复问题,如果有效再将修改更新到应用程序代码或者 Dockerfile")])])])])])])]),t._v(" "),s("p",[s("img",{attrs:{src:a(226),alt:"image-20190721104522870"}})])])},[],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/26.019b8a95.js b/docs/assets/js/26.e53df7f0.js similarity index 99% rename from docs/assets/js/26.019b8a95.js rename to docs/assets/js/26.e53df7f0.js index afccdf8..4f56fbb 100644 --- a/docs/assets/js/26.019b8a95.js +++ b/docs/assets/js/26.e53df7f0.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[26],{364:function(s,t,a){"use strict";a.r(t);var e=a(0),r=Object(e.a)({},function(){var s=this,t=s.$createElement,e=s._self._c||t;return e("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[e("h2",{attrs:{id:"制作标准机镜像"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#制作标准机镜像","aria-hidden":"true"}},[s._v("#")]),s._v(" 制作标准机镜像")]),s._v(" "),e("p",[s._v("通过使用标准机镜像,可以")]),s._v(" "),e("ul",[e("li",[e("strong",[s._v("避免重复执行对测试机安装必要软件的过程")])]),s._v(" "),e("li",[e("strong",[s._v("以一种相对标准化的过程管理测试机的维护")])])]),s._v(" "),e("p",[s._v("标准机镜像中预装了如下内容:")]),s._v(" "),e("ul",[e("li",[s._v("docker")]),s._v(" "),e("li",[s._v("gitlab-runner")]),s._v(" "),e("li",[s._v("kubernetes images")])]),s._v(" "),e("p",[s._v("本文档描述的安装过程已基于 centos 7.6 验证")]),s._v(" "),e("p",[s._v("标准机镜像的制作过程描述如下:")]),s._v(" "),e("h3",{attrs:{id:"安装docker"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#安装docker","aria-hidden":"true"}},[s._v("#")]),s._v(" 安装docker")]),s._v(" "),e("p",[e("strong",[s._v("卸载旧版本")])]),s._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" yum remove docker "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n\tdocker-client "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n\tdocker-client-latest "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n\tdocker-common "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n\tdocker-latest "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n\tdocker-latest-logrotate "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n\tdocker-logrotate "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n\tdocker-selinux "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n\tdocker-engine-selinux "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n\tdocker-engine\n")])])]),e("p",[e("strong",[s._v("下载依赖包及安装包")])]),s._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[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\n"),e("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\n"),e("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")])])]),e("p",[e("strong",[s._v("安装")])]),s._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" yum "),e("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"),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" yum "),e("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"),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" yum "),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" -y docker-ce-18.09.7-3.el7.x86_64.rpm\n"),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" systemctl "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("enable")]),s._v(" docker\n")])])]),e("p",[e("strong",[s._v("启动 docker 服务")])]),s._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" systemctl start docker\n")])])]),e("p",[e("strong",[s._v("检查 docker 版本")])]),s._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[s._v("docker version\n")])])]),e("p",[e("strong",[s._v("参考文档")])]),s._v(" "),e("p",[s._v("https://docs.docker.com/install/linux/docker-ce/centos/")]),s._v(" "),e("p",[s._v("https://docs.docker.com/install/linux/linux-postinstall/")]),s._v(" "),e("h3",{attrs:{id:"安装-nfs-utils"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#安装-nfs-utils","aria-hidden":"true"}},[s._v("#")]),s._v(" 安装 nfs-utils")]),s._v(" "),e("p",[e("strong",[s._v("执行安装命令")])]),s._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" yum "),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" nfs-utils\n")])])]),e("p",[s._v("必须先安装 nfs-utils 才能挂载 nfs 网络存储")]),s._v(" "),e("h3",{attrs:{id:"k8s基本配置"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#k8s基本配置","aria-hidden":"true"}},[s._v("#")]),s._v(" K8S基本配置")]),s._v(" "),e("p",[e("strong",[s._v("配置K8S的yum源")])]),s._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[s._v("cat")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<<")]),s._v("EOF "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" /etc/yum.repos.d/kubernetes.repo\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("kubernetes"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("name")]),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("Kubernetes\n"),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("baseurl")]),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64\n"),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("enabled")]),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("gpgcheck")]),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("repo_gpgcheck")]),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("gpgkey")]),e("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")])])]),e("p",[e("strong",[s._v("关闭swap、防火墙")])]),s._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[s._v("swapoff -a\n")])])]),e("p",[e("strong",[s._v("关闭SeLinux")])]),s._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[s._v("setenforce "),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v("\n")])])]),e("p",[e("strong",[s._v("修改 /etc/sysctl.conf")])]),s._v(" "),e("p",[e("code",[s._v("vim /etc/sysctl.conf")])]),s._v(" "),e("p",[s._v("向其中添加")]),s._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[s._v("net.ipv4.ip_forward = 1\nnet.bridge.bridge-nf-call-ip6tables = 1\nnet.bridge.bridge-nf-call-iptables = 1\n")])])]),e("p",[s._v("如下图所示")]),s._v(" "),e("p",[e("img",{attrs:{src:a(72),alt:"image-20190715085036593",title:":size=600x445"}})]),s._v(" "),e("p",[e("strong",[s._v("安装kubelet、kubeadm、kubectl")])]),s._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[s._v("yum "),e("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")])])]),e("p",[e("strong",[s._v("修改docker Cgroup Driver为systemd")])]),s._v(" "),e("p",[e("code",[s._v("vim /usr/lib/systemd/system/docker.service")])]),s._v(" "),e("p",[s._v("向其中他添加")]),s._v(" "),e("p",[e("code",[s._v("--exec-opt native.cgroupdriver=systemd")])]),s._v(" "),e("p",[s._v("如下图所示")]),s._v(" "),e("p",[e("img",{attrs:{src:a(73),alt:"屏幕快照 2019-07-15 09.01.21",title:":size=1000x326"}})]),s._v(" "),e("p",[s._v("重启 docker")]),s._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[s._v("systemctl daemon-reload\nsystemctl restart docker\n")])])]),e("p",[e("strong",[s._v("启动kubelet")])]),s._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[s._v("systemctl "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("enable")]),s._v(" kubelet "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" systemctl start kubelet\n")])])]),e("p",[e("strong",[s._v("加载 kubernetes 镜像")])]),s._v(" "),e("p",[s._v("由于k8s服务相关镜像在国外镜像源,国内无法访问")]),s._v(" "),e("p",[s._v("执行以下命令添加docker k8s国内镜像源")]),s._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[s._v("curl")]),s._v(" -sSL https://get.daocloud.io/daotools/set_mirror.sh "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("sh")]),s._v(" -s http://f1361db2.m.daocloud.io\n\nsystemctl restart docker\n")])])]),e("p",[e("strong",[s._v("拉取k8s相关镜像")])]),s._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[s._v("docker pull mirrorgooglecontainers/kube-apiserver:v1.15.0\ndocker pull mirrorgooglecontainers/kube-controller-manager:v1.15.0\ndocker pull mirrorgooglecontainers/kube-scheduler:v1.15.0\ndocker pull mirrorgooglecontainers/kube-proxy:v1.15.0\ndocker pull mirrorgooglecontainers/pause:3.1\ndocker pull mirrorgooglecontainers/etcd:3.3.10\ndocker pull coredns/coredns:1.3.1\n")])])]),e("p",[e("strong",[s._v("更改镜像名为k8s官网镜像")])]),s._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[s._v("docker tag d235b23c3570 k8s.gcr.io/kube-proxy:v1.15.0\ndocker tag 201c7a840312 k8s.gcr.io/kube-apiserver:v1.15.0\ndocker tag 2d3813851e87 k8s.gcr.io/kube-scheduler:v1.15.0\ndocker tag 8328bb49b652 k8s.gcr.io/kube-controller-manager:v1.15.0\ndocker tag da86e6ba6ca1 k8s.gcr.io/pause:3.1\ndocker tag eb516548c180 k8s.gcr.io/coredns:1.3.1\ndocker tag 2c4adeb21b4f k8s.gcr.io/etcd:3.3.10\n")])])]),e("p",[e("strong",[s._v("制作镜像")])]),s._v(" "),e("p",[s._v("请参考阿里云基于ECS "),e("a",{attrs:{href:"https://help.aliyun.com/document_detail/35109.html?spm=5176.2020520101.0.0.75fc4df5mtdFmV",target:"_blank",rel:"noopener noreferrer"}},[s._v("制作虚拟机镜像"),e("OutboundLink")],1),s._v(" 的文档")])])},[],!1,null,null,null);t.default=r.exports},72:function(s,t,a){s.exports=a.p+"assets/img/image-20190715085036593.ab4a32ff.png"},73:function(s,t,a){s.exports=a.p+"assets/img/image2019-07-15_09.01.21.1ac5bd70.png"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[26],{362:function(s,t,a){"use strict";a.r(t);var e=a(0),r=Object(e.a)({},function(){var s=this,t=s.$createElement,e=s._self._c||t;return e("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[e("h2",{attrs:{id:"制作标准机镜像"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#制作标准机镜像","aria-hidden":"true"}},[s._v("#")]),s._v(" 制作标准机镜像")]),s._v(" "),e("p",[s._v("通过使用标准机镜像,可以")]),s._v(" "),e("ul",[e("li",[e("strong",[s._v("避免重复执行对测试机安装必要软件的过程")])]),s._v(" "),e("li",[e("strong",[s._v("以一种相对标准化的过程管理测试机的维护")])])]),s._v(" "),e("p",[s._v("标准机镜像中预装了如下内容:")]),s._v(" "),e("ul",[e("li",[s._v("docker")]),s._v(" "),e("li",[s._v("gitlab-runner")]),s._v(" "),e("li",[s._v("kubernetes images")])]),s._v(" "),e("p",[s._v("本文档描述的安装过程已基于 centos 7.6 验证")]),s._v(" "),e("p",[s._v("标准机镜像的制作过程描述如下:")]),s._v(" "),e("h3",{attrs:{id:"安装docker"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#安装docker","aria-hidden":"true"}},[s._v("#")]),s._v(" 安装docker")]),s._v(" "),e("p",[e("strong",[s._v("卸载旧版本")])]),s._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" yum remove docker "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n\tdocker-client "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n\tdocker-client-latest "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n\tdocker-common "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n\tdocker-latest "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n\tdocker-latest-logrotate "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n\tdocker-logrotate "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n\tdocker-selinux "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n\tdocker-engine-selinux "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n\tdocker-engine\n")])])]),e("p",[e("strong",[s._v("下载依赖包及安装包")])]),s._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[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\n"),e("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\n"),e("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")])])]),e("p",[e("strong",[s._v("安装")])]),s._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" yum "),e("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"),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" yum "),e("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"),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" yum "),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" -y docker-ce-18.09.7-3.el7.x86_64.rpm\n"),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" systemctl "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("enable")]),s._v(" docker\n")])])]),e("p",[e("strong",[s._v("启动 docker 服务")])]),s._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" systemctl start docker\n")])])]),e("p",[e("strong",[s._v("检查 docker 版本")])]),s._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[s._v("docker version\n")])])]),e("p",[e("strong",[s._v("参考文档")])]),s._v(" "),e("p",[s._v("https://docs.docker.com/install/linux/docker-ce/centos/")]),s._v(" "),e("p",[s._v("https://docs.docker.com/install/linux/linux-postinstall/")]),s._v(" "),e("h3",{attrs:{id:"安装-nfs-utils"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#安装-nfs-utils","aria-hidden":"true"}},[s._v("#")]),s._v(" 安装 nfs-utils")]),s._v(" "),e("p",[e("strong",[s._v("执行安装命令")])]),s._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" yum "),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" nfs-utils\n")])])]),e("p",[s._v("必须先安装 nfs-utils 才能挂载 nfs 网络存储")]),s._v(" "),e("h3",{attrs:{id:"k8s基本配置"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#k8s基本配置","aria-hidden":"true"}},[s._v("#")]),s._v(" K8S基本配置")]),s._v(" "),e("p",[e("strong",[s._v("配置K8S的yum源")])]),s._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[s._v("cat")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<<")]),s._v("EOF "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" /etc/yum.repos.d/kubernetes.repo\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("kubernetes"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("name")]),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("Kubernetes\n"),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("baseurl")]),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64\n"),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("enabled")]),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("gpgcheck")]),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("repo_gpgcheck")]),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("gpgkey")]),e("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")])])]),e("p",[e("strong",[s._v("关闭swap、防火墙")])]),s._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[s._v("swapoff -a\n")])])]),e("p",[e("strong",[s._v("关闭SeLinux")])]),s._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[s._v("setenforce "),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v("\n")])])]),e("p",[e("strong",[s._v("修改 /etc/sysctl.conf")])]),s._v(" "),e("p",[e("code",[s._v("vim /etc/sysctl.conf")])]),s._v(" "),e("p",[s._v("向其中添加")]),s._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[s._v("net.ipv4.ip_forward = 1\nnet.bridge.bridge-nf-call-ip6tables = 1\nnet.bridge.bridge-nf-call-iptables = 1\n")])])]),e("p",[s._v("如下图所示")]),s._v(" "),e("p",[e("img",{attrs:{src:a(72),alt:"image-20190715085036593",title:":size=600x445"}})]),s._v(" "),e("p",[e("strong",[s._v("安装kubelet、kubeadm、kubectl")])]),s._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[s._v("yum "),e("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")])])]),e("p",[e("strong",[s._v("修改docker Cgroup Driver为systemd")])]),s._v(" "),e("p",[e("code",[s._v("vim /usr/lib/systemd/system/docker.service")])]),s._v(" "),e("p",[s._v("向其中他添加")]),s._v(" "),e("p",[e("code",[s._v("--exec-opt native.cgroupdriver=systemd")])]),s._v(" "),e("p",[s._v("如下图所示")]),s._v(" "),e("p",[e("img",{attrs:{src:a(73),alt:"屏幕快照 2019-07-15 09.01.21",title:":size=1000x326"}})]),s._v(" "),e("p",[s._v("重启 docker")]),s._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[s._v("systemctl daemon-reload\nsystemctl restart docker\n")])])]),e("p",[e("strong",[s._v("启动kubelet")])]),s._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[s._v("systemctl "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("enable")]),s._v(" kubelet "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" systemctl start kubelet\n")])])]),e("p",[e("strong",[s._v("加载 kubernetes 镜像")])]),s._v(" "),e("p",[s._v("由于k8s服务相关镜像在国外镜像源,国内无法访问")]),s._v(" "),e("p",[s._v("执行以下命令添加docker k8s国内镜像源")]),s._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[s._v("curl")]),s._v(" -sSL https://get.daocloud.io/daotools/set_mirror.sh "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("sh")]),s._v(" -s http://f1361db2.m.daocloud.io\n\nsystemctl restart docker\n")])])]),e("p",[e("strong",[s._v("拉取k8s相关镜像")])]),s._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[s._v("docker pull mirrorgooglecontainers/kube-apiserver:v1.15.0\ndocker pull mirrorgooglecontainers/kube-controller-manager:v1.15.0\ndocker pull mirrorgooglecontainers/kube-scheduler:v1.15.0\ndocker pull mirrorgooglecontainers/kube-proxy:v1.15.0\ndocker pull mirrorgooglecontainers/pause:3.1\ndocker pull mirrorgooglecontainers/etcd:3.3.10\ndocker pull coredns/coredns:1.3.1\n")])])]),e("p",[e("strong",[s._v("更改镜像名为k8s官网镜像")])]),s._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[s._v("docker tag d235b23c3570 k8s.gcr.io/kube-proxy:v1.15.0\ndocker tag 201c7a840312 k8s.gcr.io/kube-apiserver:v1.15.0\ndocker tag 2d3813851e87 k8s.gcr.io/kube-scheduler:v1.15.0\ndocker tag 8328bb49b652 k8s.gcr.io/kube-controller-manager:v1.15.0\ndocker tag da86e6ba6ca1 k8s.gcr.io/pause:3.1\ndocker tag eb516548c180 k8s.gcr.io/coredns:1.3.1\ndocker tag 2c4adeb21b4f k8s.gcr.io/etcd:3.3.10\n")])])]),e("p",[e("strong",[s._v("制作镜像")])]),s._v(" "),e("p",[s._v("请参考阿里云基于ECS "),e("a",{attrs:{href:"https://help.aliyun.com/document_detail/35109.html?spm=5176.2020520101.0.0.75fc4df5mtdFmV",target:"_blank",rel:"noopener noreferrer"}},[s._v("制作虚拟机镜像"),e("OutboundLink")],1),s._v(" 的文档")])])},[],!1,null,null,null);t.default=r.exports},72:function(s,t,a){s.exports=a.p+"assets/img/image-20190715085036593.ab4a32ff.png"},73:function(s,t,a){s.exports=a.p+"assets/img/image2019-07-15_09.01.21.1ac5bd70.png"}}]); \ No newline at end of file diff --git a/docs/assets/js/3.2c5ad9c2.js b/docs/assets/js/3.2473b0ea.js similarity index 100% rename from docs/assets/js/3.2c5ad9c2.js rename to docs/assets/js/3.2473b0ea.js diff --git a/docs/assets/js/30.ffe73adf.js b/docs/assets/js/30.bc5a57ef.js similarity index 78% rename from docs/assets/js/30.ffe73adf.js rename to docs/assets/js/30.bc5a57ef.js index e663516..db37a61 100644 --- a/docs/assets/js/30.ffe73adf.js +++ b/docs/assets/js/30.bc5a57ef.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[30],{341:function(t,e,n){"use strict";n.r(e);var s=n(0),l=Object(s.a)({},function(){var t=this.$createElement;return(this._self._c||t)("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}})},[],!1,null,null,null);e.default=l.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[30],{342:function(t,e,n){"use strict";n.r(e);var s=n(0),l=Object(s.a)({},function(){var t=this.$createElement;return(this._self._c||t)("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}})},[],!1,null,null,null);e.default=l.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/31.49f7b7d5.js b/docs/assets/js/31.62f77581.js similarity index 96% rename from docs/assets/js/31.49f7b7d5.js rename to docs/assets/js/31.62f77581.js index 394fd79..75e86b0 100644 --- a/docs/assets/js/31.49f7b7d5.js +++ b/docs/assets/js/31.62f77581.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[31],{344:function(e,t,r){"use strict";r.r(t);var s=r(0),v=Object(s.a)({},function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[r("h1",{attrs:{id:"使用手册"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#使用手册","aria-hidden":"true"}},[e._v("#")]),e._v(" 使用手册")]),e._v(" "),r("p",[r("strong",[e._v("Kuboard 的设计目标")])]),e._v(" "),r("ul",[r("li",[e._v("降低 Kubernetes 学习门槛,让初学者先把 Kubernetes 用起来,再逐步理解 Kubernetes 中的各种概念")]),e._v(" "),r("li",[e._v("提高 Kubernetes 运维的便捷性,让资深 Kubernetes 运维人员脱离 kubectl 命令行,直接在 Kuboard 界面中完成日常运维工作")])]),e._v(" "),r("p",[r("strong",[e._v("熟悉 Kuboard 的最佳途径")])]),e._v(" "),r("ul",[r("li",[r("p",[e._v("创建一个最简单的工作负载")]),e._v(" "),r("p",[r("a",{attrs:{href:"example/busybox"}},[e._v("创建 busybox")])])]),e._v(" "),r("li",[r("p",[e._v("导入一套最简单的 Spring Cloud 微服务工作负载")]),e._v(" "),r("p",[r("a",{attrs:{href:"example/import"}},[e._v("导入 example")])])]),e._v(" "),r("li",[r("p",[e._v("根据微服务上下文查看监控结果")]),e._v(" "),r("p",[r("a",{attrs:{href:"example/monitor"}},[e._v("在微服务上下文中监控 example")])])])]),e._v(" "),r("p",[r("strong",[e._v("Kuboard 可用于")])]),e._v(" "),r("ul",[r("li",[e._v("管理 Kubernetes 集群")]),e._v(" "),r("li",[e._v("管理部署于 Kubernetes 的微服务")]),e._v(" "),r("li",[e._v("诊断集群中的问题")]),e._v(" "),r("li",[e._v("监控部署于 Kubernetes 的微服务")])])])},[],!1,null,null,null);t.default=v.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[31],{341:function(e,t,r){"use strict";r.r(t);var s=r(0),v=Object(s.a)({},function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[r("h1",{attrs:{id:"使用手册"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#使用手册","aria-hidden":"true"}},[e._v("#")]),e._v(" 使用手册")]),e._v(" "),r("p",[r("strong",[e._v("Kuboard 的设计目标")])]),e._v(" "),r("ul",[r("li",[e._v("降低 Kubernetes 学习门槛,让初学者先把 Kubernetes 用起来,再逐步理解 Kubernetes 中的各种概念")]),e._v(" "),r("li",[e._v("提高 Kubernetes 运维的便捷性,让资深 Kubernetes 运维人员脱离 kubectl 命令行,直接在 Kuboard 界面中完成日常运维工作")])]),e._v(" "),r("p",[r("strong",[e._v("熟悉 Kuboard 的最佳途径")])]),e._v(" "),r("ul",[r("li",[r("p",[e._v("创建一个最简单的工作负载")]),e._v(" "),r("p",[r("a",{attrs:{href:"example/busybox"}},[e._v("创建 busybox")])])]),e._v(" "),r("li",[r("p",[e._v("导入一套最简单的 Spring Cloud 微服务工作负载")]),e._v(" "),r("p",[r("a",{attrs:{href:"example/import"}},[e._v("导入 example")])])]),e._v(" "),r("li",[r("p",[e._v("根据微服务上下文查看监控结果")]),e._v(" "),r("p",[r("a",{attrs:{href:"example/monitor"}},[e._v("在微服务上下文中监控 example")])])])]),e._v(" "),r("p",[r("strong",[e._v("Kuboard 可用于")])]),e._v(" "),r("ul",[r("li",[e._v("管理 Kubernetes 集群")]),e._v(" "),r("li",[e._v("管理部署于 Kubernetes 的微服务")]),e._v(" "),r("li",[e._v("诊断集群中的问题")]),e._v(" "),r("li",[e._v("监控部署于 Kubernetes 的微服务")])])])},[],!1,null,null,null);t.default=v.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/32.007c82b6.js b/docs/assets/js/32.58e97b69.js similarity index 98% rename from docs/assets/js/32.007c82b6.js rename to docs/assets/js/32.58e97b69.js index 37cfc2e..05bea91 100644 --- a/docs/assets/js/32.007c82b6.js +++ b/docs/assets/js/32.58e97b69.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[32],{350:function(t,v,_){"use strict";_.r(v);var r=_(0),e=Object(r.a)({},function(){var t=this,v=t.$createElement,_=t._self._c||v;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("微服务环境中,各个服务都通过 TCP / UDP 端口的形式提供访问。按调用者所在位置、通信协议的形式来划分,大致有如下几种情况:")]),t._v(" "),_("table",[_("thead",[_("tr",[_("th",[t._v("调用者所在位置")]),t._v(" "),_("th",[t._v("通信协议")]),t._v(" "),_("th",[t._v("临时性")]),t._v(" "),_("th",[t._v("常见场景")]),t._v(" "),_("th",[t._v("推荐配置方式")])])]),t._v(" "),_("tbody",[_("tr",[_("td",[t._v("VPC外")]),t._v(" "),_("td",[t._v("http / https")]),t._v(" "),_("td",[t._v("日常性")]),t._v(" "),_("td",[t._v("用户从互联网(亦可能是公司内网)"),_("br"),t._v("访问 web 页面,或者 restful 接口")]),t._v(" "),_("td",[t._v("Kubernetes Ingress"),_("br"),t._v("(可在Kuboard中直接配置***互联网入口*** )")])]),t._v(" "),_("tr",[_("td",[t._v("VPC外")]),t._v(" "),_("td",[t._v("tcp / udp")]),t._v(" "),_("td",[t._v("临时性")]),t._v(" "),_("td",[t._v("例如,开发者临时需要访问数据库端口、Redis端口等;")]),t._v(" "),_("td",[t._v("在客户端所在机器配置 kubectl,"),_("br"),t._v("并"),_("span",{staticStyle:{color:"#F56C6C"}},[t._v("通过 kubectl port-forwad 进行端口转发")])])]),t._v(" "),_("tr",[_("td",[t._v("VPC外")]),t._v(" "),_("td",[t._v("tcp / udp")]),t._v(" "),_("td",[t._v("日常性")]),t._v(" "),_("td",[t._v("暂不讨论")]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",[t._v("VPC内/集群外")]),t._v(" "),_("td",[t._v("http / https")]),t._v(" "),_("td",[t._v("日常性")]),t._v(" "),_("td",[t._v("通过接口网关为周边系统提供服务")]),t._v(" "),_("td",[t._v("Kubernetes Service NodePort"),_("br"),t._v("(可在Kuboard中直接配置***访问方式/VPC内访问*** )")])]),t._v(" "),_("tr",[_("td",[t._v("VPC内/集群外")]),t._v(" "),_("td",[t._v("tcp / udp")]),t._v(" "),_("td",[t._v("同上")]),t._v(" "),_("td",[t._v("同上")]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",[t._v("集群内")]),t._v(" "),_("td",[t._v("http / https")]),t._v(" "),_("td",[t._v("日常性")]),t._v(" "),_("td",[_("strong",[t._v("场景1")]),t._v(":Web层访问微服务网关"),_("br"),_("strong",[t._v("场景2")]),t._v(":微服务网关调用微服务,微服务之间的互相调用等。")]),t._v(" "),_("td",[_("strong",[t._v("场景1")]),t._v(":Kubernetes Service ClusterIP "),_("br"),t._v("(可在Kuboard中直接配置 "),_("em",[_("strong",[t._v("访问方式/集群内访问")])]),t._v(" )"),_("br"),_("strong",[t._v("场景2")]),t._v(":Spring Cloud中使用Eureka/Consul等服务发现"),_("br"),t._v("(Kuboard中 "),_("em",[_("strong",[t._v("访问方式/不配置")])]),t._v(" )")])]),t._v(" "),_("tr",[_("td",[t._v("集群内")]),t._v(" "),_("td",[t._v("tcp / udp")]),t._v(" "),_("td",[t._v("日常性")]),t._v(" "),_("td",[t._v("微服务访问数据库、微服务访问Redis等")]),t._v(" "),_("td",[t._v("Kubernetes Service ClusterIP "),_("br"),t._v("(可在Kuboard中直接配置 "),_("em",[_("strong",[t._v("访问方式/集群内访问")])]),t._v(" )")])])])]),t._v(" "),_("h2",{attrs:{id:"feature-planned"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#feature-planned","aria-hidden":"true"}},[t._v("#")]),t._v(" Feature planned")]),t._v(" "),_("p",[t._v("在作者使用 Kuboard 的运维实践中,有如下两个场景不能脱离 kubeadm / kubectl 命令行:")]),t._v(" "),_("ul",[_("li",[t._v("初始化集群 / 向集群添加节点")]),t._v(" "),_("li",[t._v("开发者临时需要访问数据库端口、Redis端口时,通过 kubectl port-forward 进行端口转发")])]),t._v(" "),_("p",[t._v("Kuboard 计划实现类似 kubectl port-forward 的功能,提高问题诊断过程中的便利性。")])])},[],!1,null,null,null);v.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[32],{368:function(t,v,_){"use strict";_.r(v);var r=_(0),e=Object(r.a)({},function(){var t=this,v=t.$createElement,_=t._self._c||v;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("微服务环境中,各个服务都通过 TCP / UDP 端口的形式提供访问。按调用者所在位置、通信协议的形式来划分,大致有如下几种情况:")]),t._v(" "),_("table",[_("thead",[_("tr",[_("th",[t._v("调用者所在位置")]),t._v(" "),_("th",[t._v("通信协议")]),t._v(" "),_("th",[t._v("临时性")]),t._v(" "),_("th",[t._v("常见场景")]),t._v(" "),_("th",[t._v("推荐配置方式")])])]),t._v(" "),_("tbody",[_("tr",[_("td",[t._v("VPC外")]),t._v(" "),_("td",[t._v("http / https")]),t._v(" "),_("td",[t._v("日常性")]),t._v(" "),_("td",[t._v("用户从互联网(亦可能是公司内网)"),_("br"),t._v("访问 web 页面,或者 restful 接口")]),t._v(" "),_("td",[t._v("Kubernetes Ingress"),_("br"),t._v("(可在Kuboard中直接配置***互联网入口*** )")])]),t._v(" "),_("tr",[_("td",[t._v("VPC外")]),t._v(" "),_("td",[t._v("tcp / udp")]),t._v(" "),_("td",[t._v("临时性")]),t._v(" "),_("td",[t._v("例如,开发者临时需要访问数据库端口、Redis端口等;")]),t._v(" "),_("td",[t._v("在客户端所在机器配置 kubectl,"),_("br"),t._v("并"),_("span",{staticStyle:{color:"#F56C6C"}},[t._v("通过 kubectl port-forwad 进行端口转发")])])]),t._v(" "),_("tr",[_("td",[t._v("VPC外")]),t._v(" "),_("td",[t._v("tcp / udp")]),t._v(" "),_("td",[t._v("日常性")]),t._v(" "),_("td",[t._v("暂不讨论")]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",[t._v("VPC内/集群外")]),t._v(" "),_("td",[t._v("http / https")]),t._v(" "),_("td",[t._v("日常性")]),t._v(" "),_("td",[t._v("通过接口网关为周边系统提供服务")]),t._v(" "),_("td",[t._v("Kubernetes Service NodePort"),_("br"),t._v("(可在Kuboard中直接配置***访问方式/VPC内访问*** )")])]),t._v(" "),_("tr",[_("td",[t._v("VPC内/集群外")]),t._v(" "),_("td",[t._v("tcp / udp")]),t._v(" "),_("td",[t._v("同上")]),t._v(" "),_("td",[t._v("同上")]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",[t._v("集群内")]),t._v(" "),_("td",[t._v("http / https")]),t._v(" "),_("td",[t._v("日常性")]),t._v(" "),_("td",[_("strong",[t._v("场景1")]),t._v(":Web层访问微服务网关"),_("br"),_("strong",[t._v("场景2")]),t._v(":微服务网关调用微服务,微服务之间的互相调用等。")]),t._v(" "),_("td",[_("strong",[t._v("场景1")]),t._v(":Kubernetes Service ClusterIP "),_("br"),t._v("(可在Kuboard中直接配置 "),_("em",[_("strong",[t._v("访问方式/集群内访问")])]),t._v(" )"),_("br"),_("strong",[t._v("场景2")]),t._v(":Spring Cloud中使用Eureka/Consul等服务发现"),_("br"),t._v("(Kuboard中 "),_("em",[_("strong",[t._v("访问方式/不配置")])]),t._v(" )")])]),t._v(" "),_("tr",[_("td",[t._v("集群内")]),t._v(" "),_("td",[t._v("tcp / udp")]),t._v(" "),_("td",[t._v("日常性")]),t._v(" "),_("td",[t._v("微服务访问数据库、微服务访问Redis等")]),t._v(" "),_("td",[t._v("Kubernetes Service ClusterIP "),_("br"),t._v("(可在Kuboard中直接配置 "),_("em",[_("strong",[t._v("访问方式/集群内访问")])]),t._v(" )")])])])]),t._v(" "),_("h2",{attrs:{id:"feature-planned"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#feature-planned","aria-hidden":"true"}},[t._v("#")]),t._v(" Feature planned")]),t._v(" "),_("p",[t._v("在作者使用 Kuboard 的运维实践中,有如下两个场景不能脱离 kubeadm / kubectl 命令行:")]),t._v(" "),_("ul",[_("li",[t._v("初始化集群 / 向集群添加节点")]),t._v(" "),_("li",[t._v("开发者临时需要访问数据库端口、Redis端口时,通过 kubectl port-forward 进行端口转发")])]),t._v(" "),_("p",[t._v("Kuboard 计划实现类似 kubectl port-forward 的功能,提高问题诊断过程中的便利性。")])])},[],!1,null,null,null);v.default=e.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/33.559772c6.js b/docs/assets/js/33.ea911d54.js similarity index 92% rename from docs/assets/js/33.559772c6.js rename to docs/assets/js/33.ea911d54.js index a898c36..c3a2ee0 100644 --- a/docs/assets/js/33.559772c6.js +++ b/docs/assets/js/33.ea911d54.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[33],{345:function(t,e,a){"use strict";a.r(e);var r=a(0),l=Object(r.a)({},function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"监控套件"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#监控套件","aria-hidden":"true"}},[t._v("#")]),t._v(" 监控套件")]),t._v(" "),a("p",[t._v("文档建设中...")]),t._v(" "),a("blockquote",[a("ul",[a("li",[t._v("请参考 "),a("a",{attrs:{href:"/guide/example/monitor"}},[t._v("监控 example (alpha)")]),t._v(" 体验 Kuboard 在监控套件方面的设想")]),t._v(" "),a("li",[t._v("监控套件以插件的形式整合到 Kuboard,在不使用监控套件的情况下,Kuboard 的所有功能都可正常工作")])])])])},[],!1,null,null,null);e.default=l.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[33],{343:function(t,e,a){"use strict";a.r(e);var r=a(0),l=Object(r.a)({},function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"监控套件"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#监控套件","aria-hidden":"true"}},[t._v("#")]),t._v(" 监控套件")]),t._v(" "),a("p",[t._v("文档建设中...")]),t._v(" "),a("blockquote",[a("ul",[a("li",[t._v("请参考 "),a("a",{attrs:{href:"/guide/example/monitor"}},[t._v("监控 example (alpha)")]),t._v(" 体验 Kuboard 在监控套件方面的设想")]),t._v(" "),a("li",[t._v("监控套件以插件的形式整合到 Kuboard,在不使用监控套件的情况下,Kuboard 的所有功能都可正常工作")])])])])},[],!1,null,null,null);e.default=l.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/34.43b34f81.js b/docs/assets/js/34.3199a59b.js similarity index 92% rename from docs/assets/js/34.43b34f81.js rename to docs/assets/js/34.3199a59b.js index df7d9a3..c61bb7a 100644 --- a/docs/assets/js/34.43b34f81.js +++ b/docs/assets/js/34.3199a59b.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[34],{368:function(t,e,a){"use strict";a.r(e);var r=a(0),l=Object(r.a)({},function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"自定义监控套件"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#自定义监控套件","aria-hidden":"true"}},[t._v("#")]),t._v(" 自定义监控套件")]),t._v(" "),a("p",[t._v("文档建设中...")]),t._v(" "),a("blockquote",[a("ul",[a("li",[t._v("请参考 "),a("a",{attrs:{href:"/guide/example/monitor"}},[t._v("监控 example (alpha)")]),t._v(" 体验 Kuboard 在监控套件方面的设想")]),t._v(" "),a("li",[t._v("监控套件以插件的形式整合到 Kuboard,在不使用监控套件的情况下,Kuboard 的所有功能都可正常工作")])])])])},[],!1,null,null,null);e.default=l.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[34],{345:function(t,e,a){"use strict";a.r(e);var r=a(0),l=Object(r.a)({},function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"自定义监控套件"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#自定义监控套件","aria-hidden":"true"}},[t._v("#")]),t._v(" 自定义监控套件")]),t._v(" "),a("p",[t._v("文档建设中...")]),t._v(" "),a("blockquote",[a("ul",[a("li",[t._v("请参考 "),a("a",{attrs:{href:"/guide/example/monitor"}},[t._v("监控 example (alpha)")]),t._v(" 体验 Kuboard 在监控套件方面的设想")]),t._v(" "),a("li",[t._v("监控套件以插件的形式整合到 Kuboard,在不使用监控套件的情况下,Kuboard 的所有功能都可正常工作")])])])])},[],!1,null,null,null);e.default=l.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/37.8abd72a4.js b/docs/assets/js/37.3189d1af.js similarity index 99% rename from docs/assets/js/37.8abd72a4.js rename to docs/assets/js/37.3189d1af.js index 4b29420..f92b880 100644 --- a/docs/assets/js/37.8abd72a4.js +++ b/docs/assets/js/37.3189d1af.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[37],{362:function(t,e,a){"use strict";a.r(e);var s=a(0),r=Object(s.a)({},function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"安装-kuboard"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#安装-kuboard","aria-hidden":"true"}},[t._v("#")]),t._v(" 安装 kuboard")]),t._v(" "),a("h2",{attrs:{id:"前提"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#前提","aria-hidden":"true"}},[t._v("#")]),t._v(" 前提")]),t._v(" "),a("p",[t._v("安装 kuboard 时,假设您已经:")]),t._v(" "),a("ul",[a("li",[t._v("已经有一个 kubernetes 集群")]),t._v(" "),a("li",[t._v("拥有对该 kubernetes 集群执行 kubectl 命令时的所有权限")])]),t._v(" "),a("p",[t._v("如果没有 kubernetes 集群,可以有如下选项:")]),t._v(" "),a("ul",[a("li",[t._v("通过 阿里云 创建 kubernetes 容器服务,并获得和配置 kubectl 的访问参数")]),t._v(" "),a("li",[t._v("参考 "),a("a",{attrs:{href:"install-k8s"}},[t._v("安装 kubernetes 用于测试")])]),t._v(" "),a("li",[t._v("或参考 "),a("a",{attrs:{href:"install-kubernetes"}},[t._v("安装 kubernetes 高可用")])])]),t._v(" "),a("p",[a("a",{attrs:{href:"https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=obezo3pg",target:"_blank",rel:"noopener noreferrer"}},[t._v("领取阿里云最高2000元红包"),a("OutboundLink")],1)]),t._v(" "),a("h2",{attrs:{id:"兼容性"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#兼容性","aria-hidden":"true"}},[t._v("#")]),t._v(" 兼容性")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Kubernetes 版本")]),t._v(" "),a("th",[t._v("Kuboard 版本")]),t._v(" "),a("th",[t._v("兼容性")]),t._v(" "),a("th",[t._v("说明")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[t._v("v1.15")]),t._v(" "),a("td",[t._v("v1.0.0-beta.10")]),t._v(" "),a("td",[a("span",{staticStyle:{"font-size":"24px"}},[t._v("😄")])]),t._v(" "),a("td",[t._v("已验证")])]),t._v(" "),a("tr",[a("td",[t._v("v1.14")]),t._v(" "),a("td",[t._v("v1.0.0-beta.10")]),t._v(" "),a("td",[a("span",{staticStyle:{"font-size":"24px"}},[t._v("😄")])]),t._v(" "),a("td",[t._v("已验证")])]),t._v(" "),a("tr",[a("td",[t._v("v1.13")]),t._v(" "),a("td",[t._v("v1.0.0-beta.10")]),t._v(" "),a("td",[a("span",{staticStyle:{"font-size":"24px"}},[t._v("😄")])]),t._v(" "),a("td",[t._v("已验证")])]),t._v(" "),a("tr",[a("td",[t._v("v1.12")]),t._v(" "),a("td",[t._v("v1.0.0-beta.10")]),t._v(" "),a("td",[a("span",{staticStyle:{"font-size":"24px"}},[t._v("😐")])]),t._v(" "),a("td",[t._v("Kubernetes Api 尚不支持 dryRun,"),a("br"),t._v("忽略Kuboard在执行命令式的参数校验错误,可正常工作")])]),t._v(" "),a("tr",[a("td",[t._v("v1.11")]),t._v(" "),a("td",[t._v("v1.0.0-beta.10")]),t._v(" "),a("td",[a("span",{staticStyle:{"font-size":"24px"}},[t._v("😐")])]),t._v(" "),a("td",[t._v("同上")])])])]),t._v(" "),a("div",{staticClass:"warning custom-block"},[a("p",[a("strong",[t._v("Kubernetes 安装方式")])]),t._v(" "),a("ul",[a("li",[t._v("部分用户使用二进制包的形式安装 Kubernetes,Kuboard 现在的版本不能在这类 Kubernetes 集群中正常工作,作者正在解决此问题。")]),t._v(" "),a("li",[t._v("如果您是使用 kubeadm 安装的 Kubernetes 集群(Kubernetes 官方推荐的安装方式),请放心使用 Kuboard。")]),t._v(" "),a("li",[t._v("Kubeadm 相关资料请参考 https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/")])])]),t._v(" "),a("h2",{attrs:{id:"安装"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#安装","aria-hidden":"true"}},[t._v("#")]),t._v(" 安装")]),t._v(" "),a("p",[a("strong",[t._v("获取并修改yaml文件")])]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("wget")]),t._v(" https://raw.githubusercontent.com/eip-work/eip-monitor-repository/master/dashboard/kuboard.yaml\n")])])]),a("p",[t._v("修改文件 kuboard.yaml 中 Ingress 的 host 为 kuboard.yourclustername.yourdomain.com")]),t._v(" "),a("p",[a("strong",[t._v("执行安装")])]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[t._v("kubectl apply -f kuboard.yaml \n")])])]),a("h2",{attrs:{id:"获取-token"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#获取-token","aria-hidden":"true"}},[t._v("#")]),t._v(" 获取 token")]),t._v(" "),a("h3",{attrs:{id:"获取管理员用户-token"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#获取管理员用户-token","aria-hidden":"true"}},[t._v("#")]),t._v(" 获取管理员用户 token")]),t._v(" "),a("p",[a("strong",[t._v("拥有的权限")])]),t._v(" "),a("p",[t._v("此Token拥有 ClusterAdmin 的权限,可以执行所有操作")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[t._v("kubectl -n kube-system describe secret "),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$(")]),t._v("kubectl -n kube-system get secret "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("grep")]),t._v(" kuboard-user "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("awk")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'{print "),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$1")]),t._v("}'")]),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v(")")])]),t._v(" \n")])])]),a("p",[t._v("执行完该命令后,可获得类似如下的输出:")]),t._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v("Name: admin-user-token-g8hxb\nNamespace: kube-system\nLabels: \nAnnotations: [kubernetes.io/service-account.name](http://kubernetes.io/service-account.name): kuboard-user\n[kubernetes.io/service-account.uid](http://kubernetes.io/service-account.uid): 948bb5e6-8cdc-11e9-b67e-fa163e5f7a0f\n\nType: [kubernetes.io/service-account-token](http://kubernetes.io/service-account-token)\n\nData\n====\nca.crt: 1025 bytes\nnamespace: 11 bytes\ntoken: eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLWc4aHhiIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiI5NDhiYjVlNi04Y2RjLTExZTktYjY3ZS1mYTE2M2U1ZjdhMGYiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06YWRtaW4tdXNlciJ9.DZ6dMTr8GExo5IH_vCWdB_MDfQaNognjfZKl0E5VW8vUFMVvALwo0BS-6Qsqpfxrlz87oE9yGVCpBYV0D00811bLhHIg-IR_MiBneadcqdQ_TGm_a0Pz0RbIzqJlRPiyMSxk1eXhmayfPn01upPdVCQj6D3vAY77dpcGplu3p5wE6vsNWAvrQ2d_V1KhR03IB1jJZkYwrI8FHCq_5YuzkPfHsgZ9MBQgH-jqqNXs6r8aoUZIbLsYcMHkin2vzRsMy_tjMCI9yXGiOqI-E5efTb-_KbDVwV5cbdqEIegdtYZ2J3mlrFQlmPGYTwFI8Ba9LleSYbCi4o0k74568KcN_w\n")])])]),a("h3",{attrs:{id:"获取只读用户的token"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#获取只读用户的token","aria-hidden":"true"}},[t._v("#")]),t._v(" 获取只读用户的Token")]),t._v(" "),a("p",[a("strong",[t._v("拥有的权限")])]),t._v(" "),a("ul",[a("li",[t._v("view 可查看名称空间的内容")]),t._v(" "),a("li",[t._v("system:node 可查看节点信息")]),t._v(" "),a("li",[t._v("system:persistent-volume-provisioner 可查看存储类和存储卷声明的信息")])]),t._v(" "),a("p",[a("strong",[t._v("适用场景")])]),t._v(" "),a("p",[t._v("只读用户不能对集群的配置执行修改操作,非常适用于将开发环境中的 kuboard 只读权限分发给开发者,以便开发者可以便捷地诊断问题")]),t._v(" "),a("p",[t._v("执行如下命令可以获得 "),a("span",{staticStyle:{color:"#F56C6C","font-weight":"500"}},[t._v("只读用户")]),t._v(" 的 Token")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[t._v("kubectl -n kube-system describe secret "),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$(")]),t._v("kubectl -n kube-system get secret "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("grep")]),t._v(" kuboard-viewer "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("awk")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'{print "),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$1")]),t._v("}'")]),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v(")")])]),t._v(" \n")])])]),a("h2",{attrs:{id:"访问-kuboard"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#访问-kuboard","aria-hidden":"true"}},[t._v("#")]),t._v(" 访问 Kuboard")]),t._v(" "),a("h3",{attrs:{id:"通过域名访问"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#通过域名访问","aria-hidden":"true"}},[t._v("#")]),t._v(" 通过域名访问")]),t._v(" "),a("p",[t._v("在浏览器打开链接 http://kuboard.yourclustername.yourdomain.com (使用前面已修改的域名)")]),t._v(" "),a("p",[t._v("输入前一步骤中获得的 token,可进入控制台界面")]),t._v(" "),a("h3",{attrs:{id:"通过-nodeport-访问"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#通过-nodeport-访问","aria-hidden":"true"}},[t._v("#")]),t._v(" 通过 NodePort 访问")]),t._v(" "),a("p",[t._v("kuboard Service 使用了 NodePort 的方式暴露服务,NodePort 为 32567;您可以按如下方式访问 kuboard")]),t._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v("http://any-of-your-node-ip:32567/\n")])])]),a("blockquote",[a("p",[t._v("您也可以修改 kuboard.yaml 文件,使用自己定义的 NodePort 端口号")])])])},[],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[37],{364:function(t,e,a){"use strict";a.r(e);var s=a(0),r=Object(s.a)({},function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"安装-kuboard"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#安装-kuboard","aria-hidden":"true"}},[t._v("#")]),t._v(" 安装 kuboard")]),t._v(" "),a("h2",{attrs:{id:"前提"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#前提","aria-hidden":"true"}},[t._v("#")]),t._v(" 前提")]),t._v(" "),a("p",[t._v("安装 kuboard 时,假设您已经:")]),t._v(" "),a("ul",[a("li",[t._v("已经有一个 kubernetes 集群")]),t._v(" "),a("li",[t._v("拥有对该 kubernetes 集群执行 kubectl 命令时的所有权限")])]),t._v(" "),a("p",[t._v("如果没有 kubernetes 集群,可以有如下选项:")]),t._v(" "),a("ul",[a("li",[t._v("通过 阿里云 创建 kubernetes 容器服务,并获得和配置 kubectl 的访问参数")]),t._v(" "),a("li",[t._v("参考 "),a("a",{attrs:{href:"install-k8s"}},[t._v("安装 kubernetes 用于测试")])]),t._v(" "),a("li",[t._v("或参考 "),a("a",{attrs:{href:"install-kubernetes"}},[t._v("安装 kubernetes 高可用")])])]),t._v(" "),a("p",[a("a",{attrs:{href:"https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=obezo3pg",target:"_blank",rel:"noopener noreferrer"}},[t._v("领取阿里云最高2000元红包"),a("OutboundLink")],1)]),t._v(" "),a("h2",{attrs:{id:"兼容性"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#兼容性","aria-hidden":"true"}},[t._v("#")]),t._v(" 兼容性")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Kubernetes 版本")]),t._v(" "),a("th",[t._v("Kuboard 版本")]),t._v(" "),a("th",[t._v("兼容性")]),t._v(" "),a("th",[t._v("说明")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[t._v("v1.15")]),t._v(" "),a("td",[t._v("v1.0.0-beta.10")]),t._v(" "),a("td",[a("span",{staticStyle:{"font-size":"24px"}},[t._v("😄")])]),t._v(" "),a("td",[t._v("已验证")])]),t._v(" "),a("tr",[a("td",[t._v("v1.14")]),t._v(" "),a("td",[t._v("v1.0.0-beta.10")]),t._v(" "),a("td",[a("span",{staticStyle:{"font-size":"24px"}},[t._v("😄")])]),t._v(" "),a("td",[t._v("已验证")])]),t._v(" "),a("tr",[a("td",[t._v("v1.13")]),t._v(" "),a("td",[t._v("v1.0.0-beta.10")]),t._v(" "),a("td",[a("span",{staticStyle:{"font-size":"24px"}},[t._v("😄")])]),t._v(" "),a("td",[t._v("已验证")])]),t._v(" "),a("tr",[a("td",[t._v("v1.12")]),t._v(" "),a("td",[t._v("v1.0.0-beta.10")]),t._v(" "),a("td",[a("span",{staticStyle:{"font-size":"24px"}},[t._v("😐")])]),t._v(" "),a("td",[t._v("Kubernetes Api 尚不支持 dryRun,"),a("br"),t._v("忽略Kuboard在执行命令式的参数校验错误,可正常工作")])]),t._v(" "),a("tr",[a("td",[t._v("v1.11")]),t._v(" "),a("td",[t._v("v1.0.0-beta.10")]),t._v(" "),a("td",[a("span",{staticStyle:{"font-size":"24px"}},[t._v("😐")])]),t._v(" "),a("td",[t._v("同上")])])])]),t._v(" "),a("div",{staticClass:"warning custom-block"},[a("p",[a("strong",[t._v("Kubernetes 安装方式")])]),t._v(" "),a("ul",[a("li",[t._v("部分用户使用二进制包的形式安装 Kubernetes,Kuboard 现在的版本不能在这类 Kubernetes 集群中正常工作,作者正在解决此问题。")]),t._v(" "),a("li",[t._v("如果您是使用 kubeadm 安装的 Kubernetes 集群(Kubernetes 官方推荐的安装方式),请放心使用 Kuboard。")]),t._v(" "),a("li",[t._v("Kubeadm 相关资料请参考 https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/")])])]),t._v(" "),a("h2",{attrs:{id:"安装"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#安装","aria-hidden":"true"}},[t._v("#")]),t._v(" 安装")]),t._v(" "),a("p",[a("strong",[t._v("获取并修改yaml文件")])]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("wget")]),t._v(" https://raw.githubusercontent.com/eip-work/eip-monitor-repository/master/dashboard/kuboard.yaml\n")])])]),a("p",[t._v("修改文件 kuboard.yaml 中 Ingress 的 host 为 kuboard.yourclustername.yourdomain.com")]),t._v(" "),a("p",[a("strong",[t._v("执行安装")])]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[t._v("kubectl apply -f kuboard.yaml \n")])])]),a("h2",{attrs:{id:"获取-token"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#获取-token","aria-hidden":"true"}},[t._v("#")]),t._v(" 获取 token")]),t._v(" "),a("h3",{attrs:{id:"获取管理员用户-token"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#获取管理员用户-token","aria-hidden":"true"}},[t._v("#")]),t._v(" 获取管理员用户 token")]),t._v(" "),a("p",[a("strong",[t._v("拥有的权限")])]),t._v(" "),a("p",[t._v("此Token拥有 ClusterAdmin 的权限,可以执行所有操作")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[t._v("kubectl -n kube-system describe secret "),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$(")]),t._v("kubectl -n kube-system get secret "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("grep")]),t._v(" kuboard-user "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("awk")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'{print "),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$1")]),t._v("}'")]),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v(")")])]),t._v(" \n")])])]),a("p",[t._v("执行完该命令后,可获得类似如下的输出:")]),t._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v("Name: admin-user-token-g8hxb\nNamespace: kube-system\nLabels: \nAnnotations: [kubernetes.io/service-account.name](http://kubernetes.io/service-account.name): kuboard-user\n[kubernetes.io/service-account.uid](http://kubernetes.io/service-account.uid): 948bb5e6-8cdc-11e9-b67e-fa163e5f7a0f\n\nType: [kubernetes.io/service-account-token](http://kubernetes.io/service-account-token)\n\nData\n====\nca.crt: 1025 bytes\nnamespace: 11 bytes\ntoken: eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLWc4aHhiIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiI5NDhiYjVlNi04Y2RjLTExZTktYjY3ZS1mYTE2M2U1ZjdhMGYiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06YWRtaW4tdXNlciJ9.DZ6dMTr8GExo5IH_vCWdB_MDfQaNognjfZKl0E5VW8vUFMVvALwo0BS-6Qsqpfxrlz87oE9yGVCpBYV0D00811bLhHIg-IR_MiBneadcqdQ_TGm_a0Pz0RbIzqJlRPiyMSxk1eXhmayfPn01upPdVCQj6D3vAY77dpcGplu3p5wE6vsNWAvrQ2d_V1KhR03IB1jJZkYwrI8FHCq_5YuzkPfHsgZ9MBQgH-jqqNXs6r8aoUZIbLsYcMHkin2vzRsMy_tjMCI9yXGiOqI-E5efTb-_KbDVwV5cbdqEIegdtYZ2J3mlrFQlmPGYTwFI8Ba9LleSYbCi4o0k74568KcN_w\n")])])]),a("h3",{attrs:{id:"获取只读用户的token"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#获取只读用户的token","aria-hidden":"true"}},[t._v("#")]),t._v(" 获取只读用户的Token")]),t._v(" "),a("p",[a("strong",[t._v("拥有的权限")])]),t._v(" "),a("ul",[a("li",[t._v("view 可查看名称空间的内容")]),t._v(" "),a("li",[t._v("system:node 可查看节点信息")]),t._v(" "),a("li",[t._v("system:persistent-volume-provisioner 可查看存储类和存储卷声明的信息")])]),t._v(" "),a("p",[a("strong",[t._v("适用场景")])]),t._v(" "),a("p",[t._v("只读用户不能对集群的配置执行修改操作,非常适用于将开发环境中的 kuboard 只读权限分发给开发者,以便开发者可以便捷地诊断问题")]),t._v(" "),a("p",[t._v("执行如下命令可以获得 "),a("span",{staticStyle:{color:"#F56C6C","font-weight":"500"}},[t._v("只读用户")]),t._v(" 的 Token")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[t._v("kubectl -n kube-system describe secret "),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$(")]),t._v("kubectl -n kube-system get secret "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("grep")]),t._v(" kuboard-viewer "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("awk")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'{print "),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$1")]),t._v("}'")]),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v(")")])]),t._v(" \n")])])]),a("h2",{attrs:{id:"访问-kuboard"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#访问-kuboard","aria-hidden":"true"}},[t._v("#")]),t._v(" 访问 Kuboard")]),t._v(" "),a("h3",{attrs:{id:"通过域名访问"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#通过域名访问","aria-hidden":"true"}},[t._v("#")]),t._v(" 通过域名访问")]),t._v(" "),a("p",[t._v("在浏览器打开链接 http://kuboard.yourclustername.yourdomain.com (使用前面已修改的域名)")]),t._v(" "),a("p",[t._v("输入前一步骤中获得的 token,可进入控制台界面")]),t._v(" "),a("h3",{attrs:{id:"通过-nodeport-访问"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#通过-nodeport-访问","aria-hidden":"true"}},[t._v("#")]),t._v(" 通过 NodePort 访问")]),t._v(" "),a("p",[t._v("kuboard Service 使用了 NodePort 的方式暴露服务,NodePort 为 32567;您可以按如下方式访问 kuboard")]),t._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v("http://any-of-your-node-ip:32567/\n")])])]),a("blockquote",[a("p",[t._v("您也可以修改 kuboard.yaml 文件,使用自己定义的 NodePort 端口号")])])])},[],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/4.ef0d1cff.js b/docs/assets/js/4.d67535c6.js similarity index 75% rename from docs/assets/js/4.ef0d1cff.js rename to docs/assets/js/4.d67535c6.js index 80fa673..9376c34 100644 --- a/docs/assets/js/4.ef0d1cff.js +++ b/docs/assets/js/4.d67535c6.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[4],{114:function(a,t,e){a.exports=e.p+"assets/img/image-20190723121433809.7a1b4b00.png"},227:function(a,t,e){a.exports=e.p+"assets/img/image-20190723150525017.378015c8.png"},228:function(a,t,e){a.exports=e.p+"assets/img/image-20190723150616633.17a9797e.png"},229:function(a,t,e){a.exports=e.p+"assets/img/image-20190723150853277.c168bc57.png"},230:function(a,t,e){a.exports=e.p+"assets/img/image-20190723151045112.5329884a.png"},231:function(a,t,e){a.exports=e.p+"assets/img/image-20190723151103353.3c29b906.png"},232:function(a,t,e){a.exports=e.p+"assets/img/image-20190723151339137.5f756564.png"},233:function(a,t,e){a.exports=e.p+"assets/img/image-20190723151357262.e79d2b6c.png"},234:function(a,t,e){a.exports=e.p+"assets/img/image-20190723151422460.f02b1a28.png"},235:function(a,t,e){a.exports=e.p+"assets/img/image-20190723151711230.c3dd4c41.png"},236:function(a,t,e){a.exports=e.p+"assets/img/image-20190723151804727.287fa561.png"},237:function(a,t,e){a.exports=e.p+"assets/img/image-20190723151845303.f2b8415a.png"},238:function(a,t,e){a.exports=e.p+"assets/img/image-20190723151902003.1ef39b19.png"},239:function(a,t,e){a.exports=e.p+"assets/img/image-20190723151914994.fa026f01.png"},240:function(a,t,e){a.exports=e.p+"assets/img/image-20190723151932871.cbc894da.png"},241:function(a,t,e){a.exports=e.p+"assets/img/image-20190723151951910.c3248933.png"},242:function(a,t,e){a.exports=e.p+"assets/img/image-20190723152020605.31eccc82.png"},243:function(a,t,e){a.exports=e.p+"assets/img/image-20190723152040219.45660f67.png"},244:function(a,t,e){a.exports=e.p+"assets/img/image-20190723152124196.9ef1af43.png"},245:function(a,t,e){a.exports=e.p+"assets/img/image-20190718104156232.8f0c70ed.png"},246:function(a,t,e){a.exports=e.p+"assets/img/image-20190718104729472.ef92267c.png"},247:function(a,t,e){a.exports=e.p+"assets/img/image-20190718105420599.71e5df51.png"},248:function(a,t,e){a.exports=e.p+"assets/img/image-20190718105641651.16549369.png"},249:function(a,t,e){a.exports=e.p+"assets/img/image-20190718120957255.0e01130f.png"},250:function(a,t,e){a.exports=e.p+"assets/img/image-20190718121133160.0d0a8e13.png"},343:function(a,t,e){"use strict";e.r(t);var s=e(0),i=Object(s.a)({},function(){var a=this,t=a.$createElement,s=a._self._c||t;return s("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[s("h1",{attrs:{id:"监控-example-alpha"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#监控-example-alpha","aria-hidden":"true"}},[a._v("#")]),a._v(" 监控 example (alpha)")]),a._v(" "),s("h2",{attrs:{id:"前提"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#前提","aria-hidden":"true"}},[a._v("#")]),a._v(" 前提")]),a._v(" "),s("p",[a._v("必须具备如下条件:")]),a._v(" "),s("ul",[s("li",[a._v("已完成 "),s("a",{attrs:{href:"/guide/example/import"}},[a._v("导入 example 微服务")])])]),a._v(" "),s("p",[a._v("!> 监控套件相关的功能目前处于 alpha 状态,虽然在实际投产项目中取得了非常好的效果,但是产品化封装还需要进一步改进。")]),a._v(" "),s("p",[a._v("假设您已进入 example 名称空间,如下图所示:")]),a._v(" "),s("p",[s("img",{attrs:{src:e(114),alt:"image-20190723121433809"}})]),a._v(" "),s("h2",{attrs:{id:"安装监控套件"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#安装监控套件","aria-hidden":"true"}},[a._v("#")]),a._v(" 安装监控套件")]),a._v(" "),s("h3",{attrs:{id:"安装全局监控套件"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#安装全局监控套件","aria-hidden":"true"}},[a._v("#")]),a._v(" 安装全局监控套件")]),a._v(" "),s("ul",[s("li",[a._v("在 master 节点执行")])]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[a._v("kubectl -n kube-system create secret generic etcd-certs --from-file"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("/etc/kubernetes/pki/etcd/server.crt --from-file"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("/etc/kubernetes/pki/etcd/server.key\n")])])]),s("ul",[s("li",[a._v("将鼠标移到 "),s("em",[s("strong",[a._v("设置")])]),a._v(" 菜单")])]),a._v(" "),s("p",[s("img",{attrs:{src:e(227),alt:"image-20190723150525017"}})]),a._v(" "),s("ul",[s("li",[a._v("点击 "),s("em",[s("strong",[a._v("监控套件 - example")])])])]),a._v(" "),s("p",[s("img",{attrs:{src:e(228),alt:"image-20190723150616633"}})]),a._v(" "),s("ul",[s("li",[a._v("点击 "),s("em",[s("strong",[a._v("全局监控套件 / 查找并安装")])])])]),a._v(" "),s("p",[s("img",{attrs:{src:e(229),alt:"image-20190723150853277"}})]),a._v(" "),s("ul",[s("li",[a._v("点击 "),s("em",[s("strong",[a._v("资源层监控套件 / 安装")])])])]),a._v(" "),s("p",[s("img",{attrs:{src:e(230),alt:"image-20190723151045112"}})]),a._v(" "),s("ul",[s("li",[a._v("点击 "),s("em",[s("strong",[a._v("全局监控套件 / 资源层监控套件 / 安装")])])])]),a._v(" "),s("p",[s("img",{attrs:{src:e(231),alt:"image-20190723151103353"}})]),a._v(" "),s("ul",[s("li",[a._v("根据向导提示,完成工作负载的导入")])]),a._v(" "),s("p",[s("img",{attrs:{src:e(232),alt:"image-20190723151339137"}})]),a._v(" "),s("ul",[s("li",[s("p",[a._v("点击 "),s("em",[s("strong",[a._v("资源层监控套件 / 初始化")])])]),a._v(" "),s("p",[a._v("由于下载镜像需要时间,您可能需要等待5-10分钟后,才能成功执行初始化。初始化成功的话,您将看到如下提示信息。")])])]),a._v(" "),s("p",[s("img",{attrs:{src:e(233),alt:"image-20190723151357262"}})]),a._v(" "),s("h3",{attrs:{id:"安装名称空间监控套件"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#安装名称空间监控套件","aria-hidden":"true"}},[a._v("#")]),a._v(" 安装名称空间监控套件")]),a._v(" "),s("ul",[s("li",[a._v("点击 "),s("em",[s("strong",[a._v("名称空间监控套件 example / 查找并安装")])])])]),a._v(" "),s("p",[s("img",{attrs:{src:e(234),alt:"image-20190723151422460"}})]),a._v(" "),s("ul",[s("li",[s("p",[a._v("重复前述过程,安装监控套件")]),a._v(" "),s("p",[a._v("重复前述过程,完成如下监控套件的安装和初始化:")]),a._v(" "),s("ul",[s("li",[a._v("Pinpoint 监控套件")]),a._v(" "),s("li",[a._v("Prometheus 监控套件")]),a._v(" "),s("li",[a._v("熔断及限流 Sentinel")])]),a._v(" "),s("p",[a._v("安装完成后,界面如下图所示:")])])]),a._v(" "),s("p",[s("img",{attrs:{src:e(235),alt:"image-20190723151711230"}})]),a._v(" "),s("h3",{attrs:{id:"查看监控套件的工作负载"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#查看监控套件的工作负载","aria-hidden":"true"}},[a._v("#")]),a._v(" 查看监控套件的工作负载")]),a._v(" "),s("ul",[s("li",[s("p",[a._v("点击 "),s("em",[s("strong",[a._v("后退")])])]),a._v(" "),s("p",[a._v("回到名称空间后,可查看到刚才安装监控套件时导入的监控层工作负载。")]),a._v(" "),s("blockquote",[s("p",[a._v("全局监控套件安装在 kube-system 名称空间")])])])]),a._v(" "),s("p",[s("img",{attrs:{src:e(236),alt:"image-20190723151804727"}})]),a._v(" "),s("h2",{attrs:{id:"重启-example-容器组"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#重启-example-容器组","aria-hidden":"true"}},[a._v("#")]),a._v(" 重启 example 容器组")]),a._v(" "),s("ul",[s("li",[s("p",[a._v("点击导航栏中的 "),s("em",[s("strong",[a._v("容器组列表")])])]),a._v(" "),s("p",[a._v("在筛选条件中选择")]),a._v(" "),s("ul",[s("li",[a._v("展现层")]),a._v(" "),s("li",[a._v("网关层")]),a._v(" "),s("li",[a._v("服务层")]),a._v(" "),s("li",[a._v("持久层")]),a._v(" "),s("li",[a._v("中间件")])]),a._v(" "),s("p",[a._v("并点击刷新")]),a._v(" "),s("blockquote",[s("ul",[s("li",[s("p",[a._v("Kuboard 创建工作负载时,默认将其 imagePullPolicy 设置为 "),s("strong",[a._v("Always")]),a._v(";")])]),a._v(" "),s("li",[s("p",[a._v("删除容器组时,Kubernetes 将为该工作负载启动一个新的容器组,以尽可能地使工作负载的容器组数量等于该工作负载期望的副本数(replicas);")])]),a._v(" "),s("li",[s("p",[a._v("Kubernetes 在启动容器组时,根据 imagePullPolicy 的设置 Always,将会尝试从镜像仓库抓取最新镜像,这一特性,可以用于开发环境和测试环境的版本更新,因为您的 devops 系统肯能不会为 daily build 生成新的镜像标签;")])]),a._v(" "),s("li",[s("p",[a._v("此处删除容器组的目的是,重新启动容器,以便容器中的监控探针能够检测到其对应监控套件的存在。")])])])])])]),a._v(" "),s("p",[s("img",{attrs:{src:e(237),alt:"image-20190723151845303"}})]),a._v(" "),s("ul",[s("li",[s("p",[a._v("在列表中选择")]),a._v(" "),s("p",[a._v("选中如下容器组:")]),a._v(" "),s("ul",[s("li",[s("p",[a._v("cloud-eureka-0")])]),a._v(" "),s("li",[s("p",[a._v("db-example-xxxxxx-xxxx")])]),a._v(" "),s("li",[s("p",[a._v("gateway-example-xxxxxx-xxxx")])]),a._v(" "),s("li",[s("p",[a._v("svc-example-xxxxxx-xxxx")])]),a._v(" "),s("li",[s("p",[a._v("web-example-xxxxxx-xxxx")])])])])]),a._v(" "),s("p",[s("img",{attrs:{src:e(238),alt:"image-20190723151902003"}})]),a._v(" "),s("ul",[s("li",[a._v("点击 "),s("em",[s("strong",[a._v("删除")])]),a._v(" 按钮")])]),a._v(" "),s("p",[s("img",{attrs:{src:e(239),alt:"image-20190723151914994"}})]),a._v(" "),s("ul",[s("li",[a._v("点击 "),s("em",[s("strong",[a._v("确定")])])])]),a._v(" "),s("p",[s("img",{attrs:{src:e(240),alt:"image-20190723151932871"}})]),a._v(" "),s("ul",[s("li",[a._v("点击 "),s("em",[s("strong",[a._v("应用")])])])]),a._v(" "),s("p",[s("img",{attrs:{src:e(241),alt:"image-20190723151951910"}})]),a._v(" "),s("ul",[s("li",[a._v("等待,直到容器组调整完成")])]),a._v(" "),s("p",[s("img",{attrs:{src:e(242),alt:"image-20190723152020605"}})]),a._v(" "),s("ul",[s("li",[a._v("点击 "),s("em",[s("strong",[a._v("后退")])])])]),a._v(" "),s("p",[s("img",{attrs:{src:e(243),alt:"image-20190723152040219"}})]),a._v(" "),s("h2",{attrs:{id:"查看监控信息"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#查看监控信息","aria-hidden":"true"}},[a._v("#")]),a._v(" 查看监控信息")]),a._v(" "),s("h3",{attrs:{id:"查看资源层监控信息"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#查看资源层监控信息","aria-hidden":"true"}},[a._v("#")]),a._v(" 查看资源层监控信息")]),a._v(" "),s("ul",[s("li",[s("p",[a._v("点击 "),s("em",[s("strong",[a._v("展现层 / web-example")])])]),a._v(" "),s("p",[a._v("如果您在下图中没有看到 "),s("em",[s("strong",[a._v("Nginx 监控")])]),a._v(", "),s("em",[s("strong",[a._v("容器组监控")])]),a._v(" 等,请刷新您的页面,因为监控套件初始化之后需要刷新页面才能加载并显示。")])])]),a._v(" "),s("p",[s("img",{attrs:{src:e(244),alt:"image-20190723152124196"}})]),a._v(" "),s("ul",[s("li",[s("p",[a._v("点击 "),s("em",[s("strong",[a._v("所在节点监控")])])]),a._v(" "),s("p",[a._v("可查看所在节点的资源使用情况监控信息")])])]),a._v(" "),s("p",[s("img",{attrs:{src:e(245),alt:"image-20190718104156232"}})]),a._v(" "),s("h3",{attrs:{id:"查看中间件层监控信息"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#查看中间件层监控信息","aria-hidden":"true"}},[a._v("#")]),a._v(" 查看中间件层监控信息")]),a._v(" "),s("h4",{attrs:{id:"查看-nginx-监控"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#查看-nginx-监控","aria-hidden":"true"}},[a._v("#")]),a._v(" 查看 Nginx 监控")]),a._v(" "),s("ul",[s("li",[a._v("点击 Nginx 监控")])]),a._v(" "),s("p",[s("img",{attrs:{src:e(246),alt:"image-20190718104729472"}})]),a._v(" "),s("h4",{attrs:{id:"查看-mysql-监控"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#查看-mysql-监控","aria-hidden":"true"}},[a._v("#")]),a._v(" 查看 MySQL 监控")]),a._v(" "),s("ul",[s("li",[a._v("返回 "),s("em",[s("strong",[a._v("example")])]),a._v(" 名称空间")]),a._v(" "),s("li",[a._v("点击 "),s("em",[s("strong",[a._v("持久层 / example db")])])]),a._v(" "),s("li",[a._v("点击 "),s("em",[s("strong",[a._v("MySQL 监控")])])])]),a._v(" "),s("p",[s("img",{attrs:{src:e(247),alt:"image-20190718105420599"}})]),a._v(" "),s("h4",{attrs:{id:"查看-jvm-监控"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#查看-jvm-监控","aria-hidden":"true"}},[a._v("#")]),a._v(" 查看 JVM 监控")]),a._v(" "),s("ul",[s("li",[a._v("返回 "),s("em",[s("strong",[a._v("example")])]),a._v(" 名称空间")]),a._v(" "),s("li",[a._v("点击 "),s("em",[s("strong",[a._v("微服务层 / example")])])]),a._v(" "),s("li",[a._v("点击 "),s("em",[s("strong",[a._v("Java 虚拟机监控")])])])]),a._v(" "),s("p",[s("img",{attrs:{src:e(248),alt:"image-20190718105641651"}})]),a._v(" "),s("h3",{attrs:{id:"查看链路追踪监控信息"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#查看链路追踪监控信息","aria-hidden":"true"}},[a._v("#")]),a._v(" 查看链路追踪监控信息")]),a._v(" "),s("ul",[s("li",[a._v("在 "),s("em",[s("strong",[a._v("微服务层 / example")])]),a._v(" 中点击 "),s("em",[s("strong",[a._v("链路追踪")])])])]),a._v(" "),s("p",[s("img",{attrs:{src:e(249),alt:"image-20190718120957255"}})]),a._v(" "),s("p",[s("img",{attrs:{src:e(250),alt:"image-20190718121133160"}})])])},[],!1,null,null,null);t.default=i.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[4],{115:function(a,t,e){a.exports=e.p+"assets/img/image-20190723121433809.7a1b4b00.png"},234:function(a,t,e){a.exports=e.p+"assets/img/image-20190723150525017.378015c8.png"},235:function(a,t,e){a.exports=e.p+"assets/img/image-20190723150616633.17a9797e.png"},236:function(a,t,e){a.exports=e.p+"assets/img/image-20190723150853277.c168bc57.png"},237:function(a,t,e){a.exports=e.p+"assets/img/image-20190723151045112.5329884a.png"},238:function(a,t,e){a.exports=e.p+"assets/img/image-20190723151103353.3c29b906.png"},239:function(a,t,e){a.exports=e.p+"assets/img/image-20190723151339137.5f756564.png"},240:function(a,t,e){a.exports=e.p+"assets/img/image-20190723151357262.e79d2b6c.png"},241:function(a,t,e){a.exports=e.p+"assets/img/image-20190723151422460.f02b1a28.png"},242:function(a,t,e){a.exports=e.p+"assets/img/image-20190723151711230.c3dd4c41.png"},243:function(a,t,e){a.exports=e.p+"assets/img/image-20190723151804727.287fa561.png"},244:function(a,t,e){a.exports=e.p+"assets/img/image-20190723151845303.f2b8415a.png"},245:function(a,t,e){a.exports=e.p+"assets/img/image-20190723151902003.1ef39b19.png"},246:function(a,t,e){a.exports=e.p+"assets/img/image-20190723151914994.fa026f01.png"},247:function(a,t,e){a.exports=e.p+"assets/img/image-20190723151932871.cbc894da.png"},248:function(a,t,e){a.exports=e.p+"assets/img/image-20190723151951910.c3248933.png"},249:function(a,t,e){a.exports=e.p+"assets/img/image-20190723152020605.31eccc82.png"},250:function(a,t,e){a.exports=e.p+"assets/img/image-20190723152040219.45660f67.png"},251:function(a,t,e){a.exports=e.p+"assets/img/image-20190723152124196.9ef1af43.png"},252:function(a,t,e){a.exports=e.p+"assets/img/image-20190718104156232.8f0c70ed.png"},253:function(a,t,e){a.exports=e.p+"assets/img/image-20190718104729472.ef92267c.png"},254:function(a,t,e){a.exports=e.p+"assets/img/image-20190718105420599.71e5df51.png"},255:function(a,t,e){a.exports=e.p+"assets/img/image-20190718105641651.16549369.png"},256:function(a,t,e){a.exports=e.p+"assets/img/image-20190718120957255.0e01130f.png"},257:function(a,t,e){a.exports=e.p+"assets/img/image-20190718121133160.0d0a8e13.png"},347:function(a,t,e){"use strict";e.r(t);var s=e(0),i=Object(s.a)({},function(){var a=this,t=a.$createElement,s=a._self._c||t;return s("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[s("h1",{attrs:{id:"监控-example-alpha"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#监控-example-alpha","aria-hidden":"true"}},[a._v("#")]),a._v(" 监控 example (alpha)")]),a._v(" "),s("h2",{attrs:{id:"前提"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#前提","aria-hidden":"true"}},[a._v("#")]),a._v(" 前提")]),a._v(" "),s("p",[a._v("必须具备如下条件:")]),a._v(" "),s("ul",[s("li",[a._v("已完成 "),s("a",{attrs:{href:"/guide/example/import"}},[a._v("导入 example 微服务")])])]),a._v(" "),s("p",[a._v("!> 监控套件相关的功能目前处于 alpha 状态,虽然在实际投产项目中取得了非常好的效果,但是产品化封装还需要进一步改进。")]),a._v(" "),s("p",[a._v("假设您已进入 example 名称空间,如下图所示:")]),a._v(" "),s("p",[s("img",{attrs:{src:e(115),alt:"image-20190723121433809"}})]),a._v(" "),s("h2",{attrs:{id:"安装监控套件"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#安装监控套件","aria-hidden":"true"}},[a._v("#")]),a._v(" 安装监控套件")]),a._v(" "),s("h3",{attrs:{id:"安装全局监控套件"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#安装全局监控套件","aria-hidden":"true"}},[a._v("#")]),a._v(" 安装全局监控套件")]),a._v(" "),s("ul",[s("li",[a._v("在 master 节点执行")])]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[a._v("kubectl -n kube-system create secret generic etcd-certs --from-file"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("/etc/kubernetes/pki/etcd/server.crt --from-file"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("/etc/kubernetes/pki/etcd/server.key\n")])])]),s("ul",[s("li",[a._v("将鼠标移到 "),s("em",[s("strong",[a._v("设置")])]),a._v(" 菜单")])]),a._v(" "),s("p",[s("img",{attrs:{src:e(234),alt:"image-20190723150525017"}})]),a._v(" "),s("ul",[s("li",[a._v("点击 "),s("em",[s("strong",[a._v("监控套件 - example")])])])]),a._v(" "),s("p",[s("img",{attrs:{src:e(235),alt:"image-20190723150616633"}})]),a._v(" "),s("ul",[s("li",[a._v("点击 "),s("em",[s("strong",[a._v("全局监控套件 / 查找并安装")])])])]),a._v(" "),s("p",[s("img",{attrs:{src:e(236),alt:"image-20190723150853277"}})]),a._v(" "),s("ul",[s("li",[a._v("点击 "),s("em",[s("strong",[a._v("资源层监控套件 / 安装")])])])]),a._v(" "),s("p",[s("img",{attrs:{src:e(237),alt:"image-20190723151045112"}})]),a._v(" "),s("ul",[s("li",[a._v("点击 "),s("em",[s("strong",[a._v("全局监控套件 / 资源层监控套件 / 安装")])])])]),a._v(" "),s("p",[s("img",{attrs:{src:e(238),alt:"image-20190723151103353"}})]),a._v(" "),s("ul",[s("li",[a._v("根据向导提示,完成工作负载的导入")])]),a._v(" "),s("p",[s("img",{attrs:{src:e(239),alt:"image-20190723151339137"}})]),a._v(" "),s("ul",[s("li",[s("p",[a._v("点击 "),s("em",[s("strong",[a._v("资源层监控套件 / 初始化")])])]),a._v(" "),s("p",[a._v("由于下载镜像需要时间,您可能需要等待5-10分钟后,才能成功执行初始化。初始化成功的话,您将看到如下提示信息。")])])]),a._v(" "),s("p",[s("img",{attrs:{src:e(240),alt:"image-20190723151357262"}})]),a._v(" "),s("h3",{attrs:{id:"安装名称空间监控套件"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#安装名称空间监控套件","aria-hidden":"true"}},[a._v("#")]),a._v(" 安装名称空间监控套件")]),a._v(" "),s("ul",[s("li",[a._v("点击 "),s("em",[s("strong",[a._v("名称空间监控套件 example / 查找并安装")])])])]),a._v(" "),s("p",[s("img",{attrs:{src:e(241),alt:"image-20190723151422460"}})]),a._v(" "),s("ul",[s("li",[s("p",[a._v("重复前述过程,安装监控套件")]),a._v(" "),s("p",[a._v("重复前述过程,完成如下监控套件的安装和初始化:")]),a._v(" "),s("ul",[s("li",[a._v("Pinpoint 监控套件")]),a._v(" "),s("li",[a._v("Prometheus 监控套件")]),a._v(" "),s("li",[a._v("熔断及限流 Sentinel")])]),a._v(" "),s("p",[a._v("安装完成后,界面如下图所示:")])])]),a._v(" "),s("p",[s("img",{attrs:{src:e(242),alt:"image-20190723151711230"}})]),a._v(" "),s("h3",{attrs:{id:"查看监控套件的工作负载"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#查看监控套件的工作负载","aria-hidden":"true"}},[a._v("#")]),a._v(" 查看监控套件的工作负载")]),a._v(" "),s("ul",[s("li",[s("p",[a._v("点击 "),s("em",[s("strong",[a._v("后退")])])]),a._v(" "),s("p",[a._v("回到名称空间后,可查看到刚才安装监控套件时导入的监控层工作负载。")]),a._v(" "),s("blockquote",[s("p",[a._v("全局监控套件安装在 kube-system 名称空间")])])])]),a._v(" "),s("p",[s("img",{attrs:{src:e(243),alt:"image-20190723151804727"}})]),a._v(" "),s("h2",{attrs:{id:"重启-example-容器组"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#重启-example-容器组","aria-hidden":"true"}},[a._v("#")]),a._v(" 重启 example 容器组")]),a._v(" "),s("ul",[s("li",[s("p",[a._v("点击导航栏中的 "),s("em",[s("strong",[a._v("容器组列表")])])]),a._v(" "),s("p",[a._v("在筛选条件中选择")]),a._v(" "),s("ul",[s("li",[a._v("展现层")]),a._v(" "),s("li",[a._v("网关层")]),a._v(" "),s("li",[a._v("服务层")]),a._v(" "),s("li",[a._v("持久层")]),a._v(" "),s("li",[a._v("中间件")])]),a._v(" "),s("p",[a._v("并点击刷新")]),a._v(" "),s("blockquote",[s("ul",[s("li",[s("p",[a._v("Kuboard 创建工作负载时,默认将其 imagePullPolicy 设置为 "),s("strong",[a._v("Always")]),a._v(";")])]),a._v(" "),s("li",[s("p",[a._v("删除容器组时,Kubernetes 将为该工作负载启动一个新的容器组,以尽可能地使工作负载的容器组数量等于该工作负载期望的副本数(replicas);")])]),a._v(" "),s("li",[s("p",[a._v("Kubernetes 在启动容器组时,根据 imagePullPolicy 的设置 Always,将会尝试从镜像仓库抓取最新镜像,这一特性,可以用于开发环境和测试环境的版本更新,因为您的 devops 系统肯能不会为 daily build 生成新的镜像标签;")])]),a._v(" "),s("li",[s("p",[a._v("此处删除容器组的目的是,重新启动容器,以便容器中的监控探针能够检测到其对应监控套件的存在。")])])])])])]),a._v(" "),s("p",[s("img",{attrs:{src:e(244),alt:"image-20190723151845303"}})]),a._v(" "),s("ul",[s("li",[s("p",[a._v("在列表中选择")]),a._v(" "),s("p",[a._v("选中如下容器组:")]),a._v(" "),s("ul",[s("li",[s("p",[a._v("cloud-eureka-0")])]),a._v(" "),s("li",[s("p",[a._v("db-example-xxxxxx-xxxx")])]),a._v(" "),s("li",[s("p",[a._v("gateway-example-xxxxxx-xxxx")])]),a._v(" "),s("li",[s("p",[a._v("svc-example-xxxxxx-xxxx")])]),a._v(" "),s("li",[s("p",[a._v("web-example-xxxxxx-xxxx")])])])])]),a._v(" "),s("p",[s("img",{attrs:{src:e(245),alt:"image-20190723151902003"}})]),a._v(" "),s("ul",[s("li",[a._v("点击 "),s("em",[s("strong",[a._v("删除")])]),a._v(" 按钮")])]),a._v(" "),s("p",[s("img",{attrs:{src:e(246),alt:"image-20190723151914994"}})]),a._v(" "),s("ul",[s("li",[a._v("点击 "),s("em",[s("strong",[a._v("确定")])])])]),a._v(" "),s("p",[s("img",{attrs:{src:e(247),alt:"image-20190723151932871"}})]),a._v(" "),s("ul",[s("li",[a._v("点击 "),s("em",[s("strong",[a._v("应用")])])])]),a._v(" "),s("p",[s("img",{attrs:{src:e(248),alt:"image-20190723151951910"}})]),a._v(" "),s("ul",[s("li",[a._v("等待,直到容器组调整完成")])]),a._v(" "),s("p",[s("img",{attrs:{src:e(249),alt:"image-20190723152020605"}})]),a._v(" "),s("ul",[s("li",[a._v("点击 "),s("em",[s("strong",[a._v("后退")])])])]),a._v(" "),s("p",[s("img",{attrs:{src:e(250),alt:"image-20190723152040219"}})]),a._v(" "),s("h2",{attrs:{id:"查看监控信息"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#查看监控信息","aria-hidden":"true"}},[a._v("#")]),a._v(" 查看监控信息")]),a._v(" "),s("h3",{attrs:{id:"查看资源层监控信息"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#查看资源层监控信息","aria-hidden":"true"}},[a._v("#")]),a._v(" 查看资源层监控信息")]),a._v(" "),s("ul",[s("li",[s("p",[a._v("点击 "),s("em",[s("strong",[a._v("展现层 / web-example")])])]),a._v(" "),s("p",[a._v("如果您在下图中没有看到 "),s("em",[s("strong",[a._v("Nginx 监控")])]),a._v(", "),s("em",[s("strong",[a._v("容器组监控")])]),a._v(" 等,请刷新您的页面,因为监控套件初始化之后需要刷新页面才能加载并显示。")])])]),a._v(" "),s("p",[s("img",{attrs:{src:e(251),alt:"image-20190723152124196"}})]),a._v(" "),s("ul",[s("li",[s("p",[a._v("点击 "),s("em",[s("strong",[a._v("所在节点监控")])])]),a._v(" "),s("p",[a._v("可查看所在节点的资源使用情况监控信息")])])]),a._v(" "),s("p",[s("img",{attrs:{src:e(252),alt:"image-20190718104156232"}})]),a._v(" "),s("h3",{attrs:{id:"查看中间件层监控信息"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#查看中间件层监控信息","aria-hidden":"true"}},[a._v("#")]),a._v(" 查看中间件层监控信息")]),a._v(" "),s("h4",{attrs:{id:"查看-nginx-监控"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#查看-nginx-监控","aria-hidden":"true"}},[a._v("#")]),a._v(" 查看 Nginx 监控")]),a._v(" "),s("ul",[s("li",[a._v("点击 Nginx 监控")])]),a._v(" "),s("p",[s("img",{attrs:{src:e(253),alt:"image-20190718104729472"}})]),a._v(" "),s("h4",{attrs:{id:"查看-mysql-监控"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#查看-mysql-监控","aria-hidden":"true"}},[a._v("#")]),a._v(" 查看 MySQL 监控")]),a._v(" "),s("ul",[s("li",[a._v("返回 "),s("em",[s("strong",[a._v("example")])]),a._v(" 名称空间")]),a._v(" "),s("li",[a._v("点击 "),s("em",[s("strong",[a._v("持久层 / example db")])])]),a._v(" "),s("li",[a._v("点击 "),s("em",[s("strong",[a._v("MySQL 监控")])])])]),a._v(" "),s("p",[s("img",{attrs:{src:e(254),alt:"image-20190718105420599"}})]),a._v(" "),s("h4",{attrs:{id:"查看-jvm-监控"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#查看-jvm-监控","aria-hidden":"true"}},[a._v("#")]),a._v(" 查看 JVM 监控")]),a._v(" "),s("ul",[s("li",[a._v("返回 "),s("em",[s("strong",[a._v("example")])]),a._v(" 名称空间")]),a._v(" "),s("li",[a._v("点击 "),s("em",[s("strong",[a._v("微服务层 / example")])])]),a._v(" "),s("li",[a._v("点击 "),s("em",[s("strong",[a._v("Java 虚拟机监控")])])])]),a._v(" "),s("p",[s("img",{attrs:{src:e(255),alt:"image-20190718105641651"}})]),a._v(" "),s("h3",{attrs:{id:"查看链路追踪监控信息"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#查看链路追踪监控信息","aria-hidden":"true"}},[a._v("#")]),a._v(" 查看链路追踪监控信息")]),a._v(" "),s("ul",[s("li",[a._v("在 "),s("em",[s("strong",[a._v("微服务层 / example")])]),a._v(" 中点击 "),s("em",[s("strong",[a._v("链路追踪")])])])]),a._v(" "),s("p",[s("img",{attrs:{src:e(256),alt:"image-20190718120957255"}})]),a._v(" "),s("p",[s("img",{attrs:{src:e(257),alt:"image-20190718121133160"}})])])},[],!1,null,null,null);t.default=i.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/5.6d5ad21c.js b/docs/assets/js/5.fd2c19b9.js similarity index 85% rename from docs/assets/js/5.6d5ad21c.js rename to docs/assets/js/5.fd2c19b9.js index 726355f..2a94121 100644 --- a/docs/assets/js/5.6d5ad21c.js +++ b/docs/assets/js/5.fd2c19b9.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[5],{114:function(e,t,a){e.exports=a.p+"assets/img/image-20190723121433809.7a1b4b00.png"},115:function(e,t,a){e.exports=a.p+"assets/img/image-20190723115721514.bf981ef3.png"},318:function(e,t,a){e.exports=a.p+"assets/img/image-20190723120730196.9793d8ec.png"},319:function(e,t,a){e.exports=a.p+"assets/img/image-20190723120753533.081b6d6b.png"},320:function(e,t,a){e.exports=a.p+"assets/img/image-20190723120832778.e154bccd.png"},321:function(e,t,a){e.exports=a.p+"assets/img/image-20190723120912377.e1404406.png"},322:function(e,t,a){e.exports=a.p+"assets/img/image-20190723120926747.c9754776.png"},323:function(e,t,a){e.exports=a.p+"assets/img/image-20190723120956821.69bcdbbe.png"},324:function(e,t,a){e.exports=a.p+"assets/img/image-20190723121019167.81af1060.png"},325:function(e,t,a){e.exports=a.p+"assets/img/image-20190723121035917.8a2b1320.png"},326:function(e,t,a){e.exports=a.p+"assets/img/image-20190723121055648.2c6ba8d1.png"},327:function(e,t,a){e.exports=a.p+"assets/img/image-20190723121117514.ef774d3a.png"},328:function(e,t,a){e.exports=a.p+"assets/img/image-20190723121132991.69146097.png"},329:function(e,t,a){e.exports=a.p+"assets/img/image-20190723121412027.6888452e.png"},330:function(e,t,a){e.exports=a.p+"assets/img/image-20190717193548703.5167e3b9.png"},348:function(e,t,a){"use strict";a.r(t);var r=a(0),o=Object(r.a)({},function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[r("h1",{attrs:{id:"导入-example-微服务"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#导入-example-微服务","aria-hidden":"true"}},[e._v("#")]),e._v(" 导入 example 微服务")]),e._v(" "),r("h2",{attrs:{id:"前提"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#前提","aria-hidden":"true"}},[e._v("#")]),e._v(" 前提")]),e._v(" "),r("p",[e._v("必须具备如下条件:")]),e._v(" "),r("ul",[r("li",[e._v("Kubernetes 集群 (安装在阿里云,本文将使用阿里云的 NFS 服务作为存储资源,Kuboard 也可以运行在其他云环境或者私有环境中。)")]),e._v(" "),r("li",[e._v("已在集群中安装 Kuboard")])]),e._v(" "),r("h2",{attrs:{id:"创建存储资源"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#创建存储资源","aria-hidden":"true"}},[e._v("#")]),e._v(" 创建存储资源")]),e._v(" "),r("p",[e._v("example中用到了存储卷声明,请在 Kuboard 中 "),r("a",{attrs:{href:"/guide/cluster/storage?id=%E5%88%9B%E5%BB%BA%E5%AD%98%E5%82%A8%E7%B1%BB"}},[e._v("创建存储类")]),e._v(" ,否则不能完成 example 的导入操作。")]),e._v(" "),r("h2",{attrs:{id:"创建名称空间"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#创建名称空间","aria-hidden":"true"}},[e._v("#")]),e._v(" 创建名称空间")]),e._v(" "),r("p",[e._v("创建新的名称空间,用来导入 exmaple。可参考 "),r("a",{attrs:{href:"/guide/cluster/namespace?id=%E5%88%9B%E5%BB%BA%E5%90%8D%E7%A7%B0%E7%A9%BA%E9%97%B4"}},[e._v("创建名称空间")])]),e._v(" "),r("p",[e._v("假设您已经进入了 Kuboard 名称空间界面,如下图所示:")]),e._v(" "),r("p",[r("img",{attrs:{src:a(115),alt:"image-20190723115721514"}})]),e._v(" "),r("h2",{attrs:{id:"导入-example"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#导入-example","aria-hidden":"true"}},[e._v("#")]),e._v(" 导入 example")]),e._v(" "),r("ul",[r("li",[e._v("下载 "),r("a",{attrs:{href:e.$withBase("/kuboard_example.yaml"),download:"kuboard_example.yaml"}},[e._v("kuboard_example.yaml")]),e._v(" 文件")])]),e._v(" "),r("blockquote",[r("p",[e._v("在 Kuboard 中,您无需手写 yaml 文件,此 yaml 文件的内容生成步骤如下:")]),e._v(" "),r("ul",[r("li",[e._v("通过 "),r("a",{attrs:{href:"busybox"}},[e._v("创建工作负载")]),e._v(" 完成微服务应用的部署")]),e._v(" "),r("li",[e._v("通过 "),r("strong",[e._v("导出工作负载")]),e._v(" 将名称空间中的微服务配置导出到一个 yaml 文件中")])])]),e._v(" "),r("ul",[r("li",[e._v("点击 "),r("em",[r("strong",[e._v("导入工作负载")])]),e._v(" 按钮")])]),e._v(" "),r("p",[r("img",{attrs:{src:a(318),alt:"image-20190723120730196"}})]),e._v(" "),r("ul",[r("li",[r("p",[e._v("点击 "),r("em",[r("strong",[e._v("上传文件")])]),e._v(" 按钮")]),e._v(" "),r("p",[e._v("并选择刚才下载的 export_example.yaml 文件")])])]),e._v(" "),r("p",[r("img",{attrs:{src:a(319),alt:"image-20190723120753533"}})]),e._v(" "),r("ul",[r("li",[r("p",[e._v("点击 "),r("em",[r("strong",[e._v("下一步")])])]),e._v(" "),r("p",[e._v("默认选择所有的工作负载")])])]),e._v(" "),r("p",[r("img",{attrs:{src:a(320),alt:"image-20190723120832778"}})]),e._v(" "),r("ul",[r("li",[r("p",[e._v("点击***下一步***")]),e._v(" "),r("p",[e._v("默认选择所有要导入的配置,example中没有使用到配置信息")])])]),e._v(" "),r("p",[r("img",{attrs:{src:a(321),alt:"image-20190723120912377"}})]),e._v(" "),r("ul",[r("li",[r("p",[e._v("点击 "),r("em",[r("strong",[e._v("下一步")])])]),e._v(" "),r("p",[e._v("默认选择所有 Secrets")])])]),e._v(" "),r("p",[r("img",{attrs:{src:a(322),alt:"image-20190723120926747"}})]),e._v(" "),r("ul",[r("li",[r("p",[e._v("点击***下一步***")]),e._v(" "),r("p",[e._v("填写表单:")])])]),e._v(" "),r("table",[r("thead",[r("tr",[r("th",[e._v("字段名称")]),e._v(" "),r("th",[e._v("填写内容")]),e._v(" "),r("th",[e._v("说明")])])]),e._v(" "),r("tbody",[r("tr",[r("td",[e._v("数据卷类型")]),e._v(" "),r("td",[e._v("db-example-storage")]),e._v(" "),r("td",[e._v("NFS:容器组直连NFS"),r("br"),e._v("存储卷声明:容器组使用存储卷声明")])]),e._v(" "),r("tr",[r("td",[e._v("是否新建存储卷声明")]),e._v(" "),r("td",[e._v("创建新存储卷声明")]),e._v(" "),r("td",[e._v("使用已有存储卷声明:可以使用事先创建好的存储卷声明"),r("br"),e._v("创建新存储卷声明:可以创建新存储卷声明")])]),e._v(" "),r("tr",[r("td",[e._v("分配模式")]),e._v(" "),r("td",[e._v("动态分配")]),e._v(" "),r("td")]),e._v(" "),r("tr",[r("td",[e._v("读写模式")]),e._v(" "),r("td",[e._v("可被多节点读写")]),e._v(" "),r("td",[e._v("只能被单节点读写、可被多节点只读、可被多节点读写")])]),e._v(" "),r("tr",[r("td",[e._v("总量")]),e._v(" "),r("td",[e._v("2Gi")]),e._v(" "),r("td",[e._v("2Gi代表 2G空间")])])])]),e._v(" "),r("p",[r("img",{attrs:{src:a(323),alt:"image-20190723120956821"}})]),e._v(" "),r("ul",[r("li",[r("p",[e._v("点击***下一步***")]),e._v(" "),r("p",[e._v("填写表单:")])])]),e._v(" "),r("table",[r("thead",[r("tr",[r("th",[e._v("字段名称")]),e._v(" "),r("th",[e._v("填写内容")]),e._v(" "),r("th",[e._v("说明")])])]),e._v(" "),r("tbody",[r("tr",[r("td",[e._v("cloud-eureka域名")]),e._v(" "),r("td",[e._v("cloud-eureka.example.demo.eip.work")]),e._v(" "),r("td",[e._v("使用您自己的域名,"),r("br"),e._v("在测试环境建议使用如下域名格式:"),r("br"),e._v("workloadname.namespace-name.cluster-name.domain.com"),r("br"),e._v("该域名应该解析到您worker节点的外网地址,或者worker 节点 80/443 端口对应负载均衡服务器的外网地址。")])]),e._v(" "),r("tr",[r("td",[e._v("web-example")]),e._v(" "),r("td",[e._v("web-example.example.demo.eip")]),e._v(" "),r("td")])])]),e._v(" "),r("p",[r("img",{attrs:{src:a(324),alt:"image-20190723121019167"}})]),e._v(" "),r("ul",[r("li",[e._v("点击***下一步***")])]),e._v(" "),r("p",[r("img",{attrs:{src:a(325),alt:"image-20190723121035917"}})]),e._v(" "),r("ul",[r("li",[e._v("点击 "),r("em",[r("strong",[e._v("确定")])])])]),e._v(" "),r("p",[r("img",{attrs:{src:a(326),alt:"image-20190723121055648"}})]),e._v(" "),r("ul",[r("li",[e._v("点击 "),r("em",[r("strong",[e._v("应用")])])])]),e._v(" "),r("p",[r("img",{attrs:{src:a(327),alt:"image-20190723121117514"}})]),e._v(" "),r("ul",[r("li",[e._v("点击 "),r("em",[r("strong",[e._v("完成")])])])]),e._v(" "),r("p",[r("img",{attrs:{src:a(328),alt:"image-20190723121132991"}})]),e._v(" "),r("ul",[r("li",[r("p",[e._v("点击 "),r("em",[r("strong",[e._v("已完成")])])]),e._v(" "),r("p",[e._v("可再名称空间中查看到刚才导入的 example 的所有工作负载及存储卷声明")])])]),e._v(" "),r("p",[r("img",{attrs:{src:a(114),alt:"image-20190723121433809"}})]),e._v(" "),r("h2",{attrs:{id:"验证-web-example"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#验证-web-example","aria-hidden":"true"}},[e._v("#")]),e._v(" 验证 web-example")]),e._v(" "),r("ul",[r("li",[e._v("点击工作负载 "),r("em",[r("strong",[e._v("web-example")])])])]),e._v(" "),r("p",[r("img",{attrs:{src:a(329),alt:"image-20190723121412027"}})]),e._v(" "),r("ul",[r("li",[r("p",[e._v("点击 互联网入口中的域名 "),r("em",[r("strong",[e._v("http://web-example.example.demo.eip.work")])])]),e._v(" "),r("p",[r("strong",[e._v("Example 部署成功")])])])]),e._v(" "),r("p",[r("img",{attrs:{src:a(330),alt:"image-20190717193548703"}})]),e._v(" "),r("blockquote",[r("p",[e._v("web-example容器的日志中会出现如下异常,错误原因是,example使用了一个监控套件,该监控套件要求将容器注册到monitor-eureka中,当下我们并没有安装该监控套件。此错误并不影响 example 程序的使用。暂时忽略该异常。")]),e._v(" "),r("div",{staticClass:"language- extra-class"},[r("pre",{pre:!0,attrs:{class:"language-text"}},[r("code",[e._v("[DiscoveryClient-InstanceInfoReplicator-0] WARN com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient - Request execution failed with message: java.net.UnknownHostException: monitor-eureka\n[DiscoveryClient-InstanceInfoReplicator-0] WARN com.netflix.discovery.DiscoveryClient - DiscoveryClient_WEB-ADMIN/web-example-7f668c75db-j7ncx - registration failed Cannot execute request on any known server\ncom.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server\n at com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient.execute(RetryableEurekaHttpClient.java:112)\n at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.register(EurekaHttpClientDecorator.java:56)\n at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator$1.execute(EurekaHttpClientDecorator.java:59)\n at com.netflix.discovery.shared.transport.decorator.SessionedEurekaHttpClient.execute(SessionedEurekaHttpClient.java:77)\n at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.register(EurekaHttpClientDecorator.java:56)\n at com.netflix.discovery.DiscoveryClient.register(DiscoveryClient.java:829)\n at com.netflix.discovery.InstanceInfoReplicator.run(InstanceInfoReplicator.java:121)\n at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)\n at java.util.concurrent.FutureTask.run(FutureTask.java:266)\n at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)\n at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)\n at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)\n at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)\n at java.lang.Thread.run(Thread.java:748)\n[DiscoveryClient-InstanceInfoReplicator-0] WARN com.netflix.discovery.InstanceInfoReplicator - There was a problem with the instance info replicator\ncom.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server\n at com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient.execute(RetryableEurekaHttpClient.java:112)\n at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.register(EurekaHttpClientDecorator.java:56)\n at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator$1.execute(EurekaHttpClientDecorator.java:59)\n at com.netflix.discovery.shared.transport.decorator.SessionedEurekaHttpClient.execute(SessionedEurekaHttpClient.java:77)\n at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.register(EurekaHttpClientDecorator.java:56)\n at com.netflix.discovery.DiscoveryClient.register(DiscoveryClient.java:829)\n at com.netflix.discovery.InstanceInfoReplicator.run(InstanceInfoReplicator.java:121)\n at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)\n at java.util.concurrent.FutureTask.run(FutureTask.java:266)\n at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)\n at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)\n at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)\n at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)\n at java.lang.Thread.run(Thread.java:748)\n")])])])])])},[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[5],{114:function(e,t,a){e.exports=a.p+"assets/img/image-20190723115721514.bf981ef3.png"},115:function(e,t,a){e.exports=a.p+"assets/img/image-20190723121433809.7a1b4b00.png"},309:function(e,t,a){e.exports=a.p+"assets/img/image-20190723120730196.9793d8ec.png"},310:function(e,t,a){e.exports=a.p+"assets/img/image-20190723120753533.081b6d6b.png"},311:function(e,t,a){e.exports=a.p+"assets/img/image-20190723120832778.e154bccd.png"},312:function(e,t,a){e.exports=a.p+"assets/img/image-20190723120912377.e1404406.png"},313:function(e,t,a){e.exports=a.p+"assets/img/image-20190723120926747.c9754776.png"},314:function(e,t,a){e.exports=a.p+"assets/img/image-20190723120956821.69bcdbbe.png"},315:function(e,t,a){e.exports=a.p+"assets/img/image-20190723121019167.81af1060.png"},316:function(e,t,a){e.exports=a.p+"assets/img/image-20190723121035917.8a2b1320.png"},317:function(e,t,a){e.exports=a.p+"assets/img/image-20190723121055648.2c6ba8d1.png"},318:function(e,t,a){e.exports=a.p+"assets/img/image-20190723121117514.ef774d3a.png"},319:function(e,t,a){e.exports=a.p+"assets/img/image-20190723121132991.69146097.png"},320:function(e,t,a){e.exports=a.p+"assets/img/image-20190723121412027.6888452e.png"},321:function(e,t,a){e.exports=a.p+"assets/img/image-20190717193548703.5167e3b9.png"},369:function(e,t,a){"use strict";a.r(t);var r=a(0),o=Object(r.a)({},function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[r("h1",{attrs:{id:"导入-example-微服务"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#导入-example-微服务","aria-hidden":"true"}},[e._v("#")]),e._v(" 导入 example 微服务")]),e._v(" "),r("h2",{attrs:{id:"前提"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#前提","aria-hidden":"true"}},[e._v("#")]),e._v(" 前提")]),e._v(" "),r("p",[e._v("必须具备如下条件:")]),e._v(" "),r("ul",[r("li",[e._v("Kubernetes 集群 (安装在阿里云,本文将使用阿里云的 NFS 服务作为存储资源,Kuboard 也可以运行在其他云环境或者私有环境中。)")]),e._v(" "),r("li",[e._v("已在集群中安装 Kuboard")])]),e._v(" "),r("h2",{attrs:{id:"创建存储资源"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#创建存储资源","aria-hidden":"true"}},[e._v("#")]),e._v(" 创建存储资源")]),e._v(" "),r("p",[e._v("example中用到了存储卷声明,请在 Kuboard 中 "),r("a",{attrs:{href:"/guide/cluster/storage?id=%E5%88%9B%E5%BB%BA%E5%AD%98%E5%82%A8%E7%B1%BB"}},[e._v("创建存储类")]),e._v(" ,否则不能完成 example 的导入操作。")]),e._v(" "),r("h2",{attrs:{id:"创建名称空间"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#创建名称空间","aria-hidden":"true"}},[e._v("#")]),e._v(" 创建名称空间")]),e._v(" "),r("p",[e._v("创建新的名称空间,用来导入 exmaple。可参考 "),r("a",{attrs:{href:"/guide/cluster/namespace?id=%E5%88%9B%E5%BB%BA%E5%90%8D%E7%A7%B0%E7%A9%BA%E9%97%B4"}},[e._v("创建名称空间")])]),e._v(" "),r("p",[e._v("假设您已经进入了 Kuboard 名称空间界面,如下图所示:")]),e._v(" "),r("p",[r("img",{attrs:{src:a(114),alt:"image-20190723115721514"}})]),e._v(" "),r("h2",{attrs:{id:"导入-example"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#导入-example","aria-hidden":"true"}},[e._v("#")]),e._v(" 导入 example")]),e._v(" "),r("ul",[r("li",[e._v("下载 "),r("a",{attrs:{href:e.$withBase("/kuboard_example.yaml"),download:"kuboard_example.yaml"}},[e._v("kuboard_example.yaml")]),e._v(" 文件")])]),e._v(" "),r("blockquote",[r("p",[e._v("在 Kuboard 中,您无需手写 yaml 文件,此 yaml 文件的内容生成步骤如下:")]),e._v(" "),r("ul",[r("li",[e._v("通过 "),r("a",{attrs:{href:"busybox"}},[e._v("创建工作负载")]),e._v(" 完成微服务应用的部署")]),e._v(" "),r("li",[e._v("通过 "),r("strong",[e._v("导出工作负载")]),e._v(" 将名称空间中的微服务配置导出到一个 yaml 文件中")])])]),e._v(" "),r("ul",[r("li",[e._v("点击 "),r("em",[r("strong",[e._v("导入工作负载")])]),e._v(" 按钮")])]),e._v(" "),r("p",[r("img",{attrs:{src:a(309),alt:"image-20190723120730196"}})]),e._v(" "),r("ul",[r("li",[r("p",[e._v("点击 "),r("em",[r("strong",[e._v("上传文件")])]),e._v(" 按钮")]),e._v(" "),r("p",[e._v("并选择刚才下载的 export_example.yaml 文件")])])]),e._v(" "),r("p",[r("img",{attrs:{src:a(310),alt:"image-20190723120753533"}})]),e._v(" "),r("ul",[r("li",[r("p",[e._v("点击 "),r("em",[r("strong",[e._v("下一步")])])]),e._v(" "),r("p",[e._v("默认选择所有的工作负载")])])]),e._v(" "),r("p",[r("img",{attrs:{src:a(311),alt:"image-20190723120832778"}})]),e._v(" "),r("ul",[r("li",[r("p",[e._v("点击***下一步***")]),e._v(" "),r("p",[e._v("默认选择所有要导入的配置,example中没有使用到配置信息")])])]),e._v(" "),r("p",[r("img",{attrs:{src:a(312),alt:"image-20190723120912377"}})]),e._v(" "),r("ul",[r("li",[r("p",[e._v("点击 "),r("em",[r("strong",[e._v("下一步")])])]),e._v(" "),r("p",[e._v("默认选择所有 Secrets")])])]),e._v(" "),r("p",[r("img",{attrs:{src:a(313),alt:"image-20190723120926747"}})]),e._v(" "),r("ul",[r("li",[r("p",[e._v("点击***下一步***")]),e._v(" "),r("p",[e._v("填写表单:")])])]),e._v(" "),r("table",[r("thead",[r("tr",[r("th",[e._v("字段名称")]),e._v(" "),r("th",[e._v("填写内容")]),e._v(" "),r("th",[e._v("说明")])])]),e._v(" "),r("tbody",[r("tr",[r("td",[e._v("数据卷类型")]),e._v(" "),r("td",[e._v("db-example-storage")]),e._v(" "),r("td",[e._v("NFS:容器组直连NFS"),r("br"),e._v("存储卷声明:容器组使用存储卷声明")])]),e._v(" "),r("tr",[r("td",[e._v("是否新建存储卷声明")]),e._v(" "),r("td",[e._v("创建新存储卷声明")]),e._v(" "),r("td",[e._v("使用已有存储卷声明:可以使用事先创建好的存储卷声明"),r("br"),e._v("创建新存储卷声明:可以创建新存储卷声明")])]),e._v(" "),r("tr",[r("td",[e._v("分配模式")]),e._v(" "),r("td",[e._v("动态分配")]),e._v(" "),r("td")]),e._v(" "),r("tr",[r("td",[e._v("读写模式")]),e._v(" "),r("td",[e._v("可被多节点读写")]),e._v(" "),r("td",[e._v("只能被单节点读写、可被多节点只读、可被多节点读写")])]),e._v(" "),r("tr",[r("td",[e._v("总量")]),e._v(" "),r("td",[e._v("2Gi")]),e._v(" "),r("td",[e._v("2Gi代表 2G空间")])])])]),e._v(" "),r("p",[r("img",{attrs:{src:a(314),alt:"image-20190723120956821"}})]),e._v(" "),r("ul",[r("li",[r("p",[e._v("点击***下一步***")]),e._v(" "),r("p",[e._v("填写表单:")])])]),e._v(" "),r("table",[r("thead",[r("tr",[r("th",[e._v("字段名称")]),e._v(" "),r("th",[e._v("填写内容")]),e._v(" "),r("th",[e._v("说明")])])]),e._v(" "),r("tbody",[r("tr",[r("td",[e._v("cloud-eureka域名")]),e._v(" "),r("td",[e._v("cloud-eureka.example.demo.eip.work")]),e._v(" "),r("td",[e._v("使用您自己的域名,"),r("br"),e._v("在测试环境建议使用如下域名格式:"),r("br"),e._v("workloadname.namespace-name.cluster-name.domain.com"),r("br"),e._v("该域名应该解析到您worker节点的外网地址,或者worker 节点 80/443 端口对应负载均衡服务器的外网地址。")])]),e._v(" "),r("tr",[r("td",[e._v("web-example")]),e._v(" "),r("td",[e._v("web-example.example.demo.eip")]),e._v(" "),r("td")])])]),e._v(" "),r("p",[r("img",{attrs:{src:a(315),alt:"image-20190723121019167"}})]),e._v(" "),r("ul",[r("li",[e._v("点击***下一步***")])]),e._v(" "),r("p",[r("img",{attrs:{src:a(316),alt:"image-20190723121035917"}})]),e._v(" "),r("ul",[r("li",[e._v("点击 "),r("em",[r("strong",[e._v("确定")])])])]),e._v(" "),r("p",[r("img",{attrs:{src:a(317),alt:"image-20190723121055648"}})]),e._v(" "),r("ul",[r("li",[e._v("点击 "),r("em",[r("strong",[e._v("应用")])])])]),e._v(" "),r("p",[r("img",{attrs:{src:a(318),alt:"image-20190723121117514"}})]),e._v(" "),r("ul",[r("li",[e._v("点击 "),r("em",[r("strong",[e._v("完成")])])])]),e._v(" "),r("p",[r("img",{attrs:{src:a(319),alt:"image-20190723121132991"}})]),e._v(" "),r("ul",[r("li",[r("p",[e._v("点击 "),r("em",[r("strong",[e._v("已完成")])])]),e._v(" "),r("p",[e._v("可再名称空间中查看到刚才导入的 example 的所有工作负载及存储卷声明")])])]),e._v(" "),r("p",[r("img",{attrs:{src:a(115),alt:"image-20190723121433809"}})]),e._v(" "),r("h2",{attrs:{id:"验证-web-example"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#验证-web-example","aria-hidden":"true"}},[e._v("#")]),e._v(" 验证 web-example")]),e._v(" "),r("ul",[r("li",[e._v("点击工作负载 "),r("em",[r("strong",[e._v("web-example")])])])]),e._v(" "),r("p",[r("img",{attrs:{src:a(320),alt:"image-20190723121412027"}})]),e._v(" "),r("ul",[r("li",[r("p",[e._v("点击 互联网入口中的域名 "),r("em",[r("strong",[e._v("http://web-example.example.demo.eip.work")])])]),e._v(" "),r("p",[r("strong",[e._v("Example 部署成功")])])])]),e._v(" "),r("p",[r("img",{attrs:{src:a(321),alt:"image-20190717193548703"}})]),e._v(" "),r("blockquote",[r("p",[e._v("web-example容器的日志中会出现如下异常,错误原因是,example使用了一个监控套件,该监控套件要求将容器注册到monitor-eureka中,当下我们并没有安装该监控套件。此错误并不影响 example 程序的使用。暂时忽略该异常。")]),e._v(" "),r("div",{staticClass:"language- extra-class"},[r("pre",{pre:!0,attrs:{class:"language-text"}},[r("code",[e._v("[DiscoveryClient-InstanceInfoReplicator-0] WARN com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient - Request execution failed with message: java.net.UnknownHostException: monitor-eureka\n[DiscoveryClient-InstanceInfoReplicator-0] WARN com.netflix.discovery.DiscoveryClient - DiscoveryClient_WEB-ADMIN/web-example-7f668c75db-j7ncx - registration failed Cannot execute request on any known server\ncom.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server\n at com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient.execute(RetryableEurekaHttpClient.java:112)\n at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.register(EurekaHttpClientDecorator.java:56)\n at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator$1.execute(EurekaHttpClientDecorator.java:59)\n at com.netflix.discovery.shared.transport.decorator.SessionedEurekaHttpClient.execute(SessionedEurekaHttpClient.java:77)\n at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.register(EurekaHttpClientDecorator.java:56)\n at com.netflix.discovery.DiscoveryClient.register(DiscoveryClient.java:829)\n at com.netflix.discovery.InstanceInfoReplicator.run(InstanceInfoReplicator.java:121)\n at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)\n at java.util.concurrent.FutureTask.run(FutureTask.java:266)\n at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)\n at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)\n at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)\n at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)\n at java.lang.Thread.run(Thread.java:748)\n[DiscoveryClient-InstanceInfoReplicator-0] WARN com.netflix.discovery.InstanceInfoReplicator - There was a problem with the instance info replicator\ncom.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server\n at com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient.execute(RetryableEurekaHttpClient.java:112)\n at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.register(EurekaHttpClientDecorator.java:56)\n at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator$1.execute(EurekaHttpClientDecorator.java:59)\n at com.netflix.discovery.shared.transport.decorator.SessionedEurekaHttpClient.execute(SessionedEurekaHttpClient.java:77)\n at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.register(EurekaHttpClientDecorator.java:56)\n at com.netflix.discovery.DiscoveryClient.register(DiscoveryClient.java:829)\n at com.netflix.discovery.InstanceInfoReplicator.run(InstanceInfoReplicator.java:121)\n at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)\n at java.util.concurrent.FutureTask.run(FutureTask.java:266)\n at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)\n at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)\n at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)\n at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)\n at java.lang.Thread.run(Thread.java:748)\n")])])])])])},[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/6.3a6dfa89.js b/docs/assets/js/6.208e5735.js similarity index 83% rename from docs/assets/js/6.3a6dfa89.js rename to docs/assets/js/6.208e5735.js index 3b8de7d..f49f0e3 100644 --- a/docs/assets/js/6.3a6dfa89.js +++ b/docs/assets/js/6.208e5735.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[6],{205:function(t,v,_){t.exports=_.p+"assets/img/image-20190717113807552.b3fe5f7d.png"},206:function(t,v,_){t.exports=_.p+"assets/img/image-20190717114304953.854b47d8.png"},207:function(t,v,_){t.exports=_.p+"assets/img/image-20190717114354610.6d522c25.png"},208:function(t,v,_){t.exports=_.p+"assets/img/image-20190717115020848.eec5a17e.png"},209:function(t,v,_){t.exports=_.p+"assets/img/image-20190717115403374.48894c27.png"},210:function(t,v,_){t.exports=_.p+"assets/img/image-20190717115457614.c7f0d044.png"},211:function(t,v,_){t.exports=_.p+"assets/img/image-20190717115829821.63b81f36.png"},212:function(t,v,_){t.exports=_.p+"assets/img/image-20190723112105018.a27c638f.png"},213:function(t,v,_){t.exports=_.p+"assets/img/image-20190723112143032.7a5220bd.png"},214:function(t,v,_){t.exports=_.p+"assets/img/image-20190723112204681.8279ca8f.png"},215:function(t,v,_){t.exports=_.p+"assets/img/image-20190723113250521.3b80f3d2.png"},216:function(t,v,_){t.exports=_.p+"assets/img/image-20190723113312360.a3a51c0c.png"},355:function(t,v,_){"use strict";_.r(v);var a=_(0),r=Object(a.a)({},function(){var t=this,v=t.$createElement,a=t._self._c||v;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"存储空间管理"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#存储空间管理","aria-hidden":"true"}},[t._v("#")]),t._v(" 存储空间管理")]),t._v(" "),a("h2",{attrs:{id:"创建存储类"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#创建存储类","aria-hidden":"true"}},[t._v("#")]),t._v(" 创建存储类")]),t._v(" "),a("p",[t._v("前提")]),t._v(" "),a("p",[t._v("必须具备如下条件:")]),t._v(" "),a("ul",[a("li",[t._v("Kubernetes 集群 (安装在阿里云,本文将使用阿里云的 NFS 服务作为存储资源,Kuboard 也可以运行在其他云环境或者私有环境中。)")]),t._v(" "),a("li",[t._v("已在集群中安装 Kuboard")])]),t._v(" "),a("h3",{attrs:{id:"在阿里云创建-nas-服务"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#在阿里云创建-nas-服务","aria-hidden":"true"}},[t._v("#")]),t._v(" 在阿里云创建 NAS 服务")]),t._v(" "),a("p",[t._v("如果您在其他 IaaS 供应商搭建了 Kubernetes 集群,请参考该 IaaS 供应商的文档,创建 NFS 服务。您也可以自行搭建 NFS 服务器,用来为 Kubernetes 集群提供存储资源。")]),t._v(" "),a("ul",[a("li",[t._v("进入阿里云 "),a("em",[a("strong",[t._v("文件存储 NAS 服务")])]),t._v(" 控制台")])]),t._v(" "),a("p",[t._v("登录 www.aliyun.com 后,在控制台界面的产品与服务中选择 "),a("em",[a("strong",[t._v("文件存储 NAS")])])]),t._v(" "),a("p",[t._v("如下图所示")]),t._v(" "),a("p",[a("img",{attrs:{src:_(205),alt:"image-20190717113807552"}})]),t._v(" "),a("ul",[a("li",[t._v("在 "),a("em",[a("strong",[t._v("文件存储 NAS")])]),t._v(" 控制台中点击 "),a("em",[a("strong",[t._v("创建文件系统")])])])]),t._v(" "),a("p",[a("img",{attrs:{src:_(206),alt:"image-20190717114304953"}})]),t._v(" "),a("ul",[a("li",[t._v("填写表单")])]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("字段名称")]),t._v(" "),a("th",[t._v("填写内容")]),t._v(" "),a("th",[t._v("说明")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[t._v("地域")]),t._v(" "),a("td",[t._v("请选择您的 Kubernetes 集群所在的地域")]),t._v(" "),a("td",[t._v("文件系统所在地域")])]),t._v(" "),a("tr",[a("td",[t._v("存储类型")]),t._v(" "),a("td",[t._v("容量型 / 或 SSD型")]),t._v(" "),a("td",[t._v("测试目的,使用价格便宜的容量型即可")])]),t._v(" "),a("tr",[a("td",[t._v("协议类型")]),t._v(" "),a("td",[t._v("NFS")]),t._v(" "),a("td",[t._v("请选择NFS")])]),t._v(" "),a("tr",[a("td",[t._v("可用区")]),t._v(" "),a("td",[t._v("请选择您的 Kubernetes 集群所在的可用区")]),t._v(" "),a("td",[t._v("文件系统所在可用区")])]),t._v(" "),a("tr",[a("td",[t._v("存储包")]),t._v(" "),a("td",[t._v("如果当下没有存储包,可以后续绑定")]),t._v(" "),a("td",[t._v("不绑定存储包,将无法使用该文件系统")])])])]),t._v(" "),a("p",[a("img",{attrs:{src:_(207),alt:"image-20190717114354610"}})]),t._v(" "),a("ul",[a("li",[t._v("点击 "),a("em",[a("strong",[t._v("确定")])])])]),t._v(" "),a("p",[t._v("点击确定后,可查看到该文件系统已创建成功")]),t._v(" "),a("p",[a("img",{attrs:{src:_(208),alt:"image-20190717115020848"}})]),t._v(" "),a("ul",[a("li",[t._v("绑定存储包")])]),t._v(" "),a("p",[t._v("请自行在阿里云中为该文件系统绑定存储包,如果不绑定存储包,将无法使用该文件系统。")]),t._v(" "),a("ul",[a("li",[t._v("点击刚创建文件系统的 "),a("em",[a("strong",[t._v("管理")])]),t._v(" 按钮")])]),t._v(" "),a("p",[a("img",{attrs:{src:_(209),alt:"image-20190717115403374"}})]),t._v(" "),a("ul",[a("li",[t._v("点击 "),a("em",[a("strong",[t._v("添加挂载点")])])])]),t._v(" "),a("p",[t._v("并填写表单")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("字段名称")]),t._v(" "),a("th",[t._v("填写内容")]),t._v(" "),a("th",[t._v("说明")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[t._v("挂载点类型")]),t._v(" "),a("td",[t._v("专有网络")]),t._v(" "),a("td")]),t._v(" "),a("tr",[a("td",[t._v("VPC网络")]),t._v(" "),a("td",[t._v("请选择您的 Kubernetes 集群所在的VPC")]),t._v(" "),a("td")]),t._v(" "),a("tr",[a("td",[t._v("交换机")]),t._v(" "),a("td",[t._v("请选择您的 Kubernetes 集群所在的交换机")]),t._v(" "),a("td")]),t._v(" "),a("tr",[a("td",[t._v("权限组")]),t._v(" "),a("td",[t._v("VPC默认权限组(全部允许)")]),t._v(" "),a("td",[t._v("请选择全部允许")])])])]),t._v(" "),a("p",[a("img",{attrs:{src:_(210),alt:"image-20190717115457614"}})]),t._v(" "),a("ul",[a("li",[t._v("点击 "),a("em",[a("strong",[t._v("确定")])])])]),t._v(" "),a("p",[t._v("点击确定后,将完成挂载点创建,如下图所示:")]),t._v(" "),a("p",[a("img",{attrs:{src:_(211),alt:"image-20190717115829821"}})]),t._v(" "),a("ul",[a("li",[t._v("获取 NFS 连接参数:")])]),t._v(" "),a("p",[t._v("在上图界面中,将 "),a("em",[a("strong",[t._v("V4 Mount")])]),t._v(" 的指令复制下来后,如下所示:")]),t._v(" "),a("div",{staticStyle:{"font-family":"Monaco,Menlo,Consolas,Bitstream Vera Sans Mono,monospace",padding:"20px","background-color":"rgb(244, 244, 245)","border-radius":"4px"}},[t._v("\nsudo mount -t nfs -o vers=4,minorversion=0,noresvport "),a("span",{staticStyle:{color:"red","background-color":"rgb(254, 240, 240)"}},[t._v("189344a39c-lex38.cn-beijing.nas.aliyuncs.com")]),t._v(":"),a("span",{staticStyle:{color:"blue","background-color":"rgb(217, 236, 255)"}},[t._v("/")]),t._v(" /mnt\n")]),t._v(" "),a("p",[t._v("其中红色字体的文字为 NFS Server 的地址,蓝色字体的文字为 NFS Path。如下表所示:")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("字段名称")]),t._v(" "),a("th",[t._v("字段取值")]),t._v(" "),a("th",[t._v("说明")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[t._v("NFS Server")]),t._v(" "),a("td",[t._v("189344a39c-lex38.cn-beijing.nas.aliyuncs.com")]),t._v(" "),a("td")]),t._v(" "),a("tr",[a("td",[t._v("NFS Path")]),t._v(" "),a("td",[t._v("/")]),t._v(" "),a("td",[t._v("NFS Server和NFS Path以冒号分隔")])])])]),t._v(" "),a("h3",{attrs:{id:"在-kuboard-创建存储类"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#在-kuboard-创建存储类","aria-hidden":"true"}},[t._v("#")]),t._v(" 在 Kuboard 创建存储类")]),t._v(" "),a("ul",[a("li",[a("p",[t._v("进入 Kuboard "),a("em",[a("strong",[t._v("集群概览页")])])]),t._v(" "),a("p",[t._v("参考 "),a("a",{attrs:{href:"install/install-dashboard?id=%E8%AE%BF%E9%97%AE"}},[t._v("访问 Kuboard")])]),t._v(" "),a("p",[t._v("如下图所示:")])])]),t._v(" "),a("p",[a("img",{attrs:{src:_(212),alt:"image-20190723112105018"}})]),t._v(" "),a("ul",[a("li",[a("p",[t._v("点击 "),a("em",[a("strong",[t._v("创建存储类")])])]),t._v(" "),a("p",[t._v("填写表单")])])]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("字段名称")]),t._v(" "),a("th",[t._v("填写内容")]),t._v(" "),a("th",[t._v("说明")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[t._v("名称")]),t._v(" "),a("td",[t._v("cluster-storage")]),t._v(" "),a("td",[t._v("填写你喜欢的名称")])]),t._v(" "),a("tr",[a("td",[t._v("限定名称空间")]),t._v(" "),a("td",[t._v("不填写")]),t._v(" "),a("td",[t._v("如果限定名称空间,"),a("br"),t._v("则在 Kuboard 中,您只能在指定的名称空间中使用该存储类"),a("br"),t._v("在 kubectl 中,不受影响")])]),t._v(" "),a("tr",[a("td",[t._v("存储类型")]),t._v(" "),a("td",[t._v("NFS")]),t._v(" "),a("td",[t._v("目前 Kuboard 只支持 NFS,将要增加其他类型的存储,如 CephFS、Cinder 等")])]),t._v(" "),a("tr",[a("td",[t._v("回收策略")]),t._v(" "),a("td",[t._v("回收后删除")]),t._v(" "),a("td",[t._v("当该存储类创建的 存储卷(Persistent Volume)被删除后,之前该存储卷中的文件可以被:回收后删除 / 回收后保留")])]),t._v(" "),a("tr",[a("td",[t._v("存储卷绑定模式")]),t._v(" "),a("td",[t._v("首次使用时绑定")]),t._v(" "),a("td",[t._v("即刻绑定:当 存储卷被创建时,就在 NFS 中为其分配空间,并绑定;"),a("br"),t._v("首次使用时绑定: 在存储卷被第一次使用到时,才绑定")])])])]),t._v(" "),a("p",[a("img",{attrs:{src:_(213),alt:"image-20190723112143032"}})]),t._v(" "),a("ul",[a("li",[t._v("点击 "),a("em",[a("strong",[t._v("保存")])])])]),t._v(" "),a("p",[a("img",{attrs:{src:_(214),alt:"image-20190723112204681"}})]),t._v(" "),a("ul",[a("li",[t._v("点击 "),a("em",[a("strong",[t._v("应用")])])])]),t._v(" "),a("p",[a("img",{attrs:{src:_(215),alt:"image-20190723113250521"}})]),t._v(" "),a("ul",[a("li",[a("p",[t._v("点击 "),a("em",[a("strong",[t._v("完成")])])]),t._v(" "),a("p",[t._v("此时可在存储资源列表中查看到刚创建的存储类")])])]),t._v(" "),a("p",[a("img",{attrs:{src:_(216),alt:"image-20190723113312360"}})])])},[],!1,null,null,null);v.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[6],{208:function(t,v,_){t.exports=_.p+"assets/img/image-20190717113807552.b3fe5f7d.png"},209:function(t,v,_){t.exports=_.p+"assets/img/image-20190717114304953.854b47d8.png"},210:function(t,v,_){t.exports=_.p+"assets/img/image-20190717114354610.6d522c25.png"},211:function(t,v,_){t.exports=_.p+"assets/img/image-20190717115020848.eec5a17e.png"},212:function(t,v,_){t.exports=_.p+"assets/img/image-20190717115403374.48894c27.png"},213:function(t,v,_){t.exports=_.p+"assets/img/image-20190717115457614.c7f0d044.png"},214:function(t,v,_){t.exports=_.p+"assets/img/image-20190717115829821.63b81f36.png"},215:function(t,v,_){t.exports=_.p+"assets/img/image-20190723112105018.a27c638f.png"},216:function(t,v,_){t.exports=_.p+"assets/img/image-20190723112143032.7a5220bd.png"},217:function(t,v,_){t.exports=_.p+"assets/img/image-20190723112204681.8279ca8f.png"},218:function(t,v,_){t.exports=_.p+"assets/img/image-20190723113250521.3b80f3d2.png"},219:function(t,v,_){t.exports=_.p+"assets/img/image-20190723113312360.a3a51c0c.png"},344:function(t,v,_){"use strict";_.r(v);var a=_(0),r=Object(a.a)({},function(){var t=this,v=t.$createElement,a=t._self._c||v;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"存储空间管理"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#存储空间管理","aria-hidden":"true"}},[t._v("#")]),t._v(" 存储空间管理")]),t._v(" "),a("h2",{attrs:{id:"创建存储类"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#创建存储类","aria-hidden":"true"}},[t._v("#")]),t._v(" 创建存储类")]),t._v(" "),a("p",[t._v("前提")]),t._v(" "),a("p",[t._v("必须具备如下条件:")]),t._v(" "),a("ul",[a("li",[t._v("Kubernetes 集群 (安装在阿里云,本文将使用阿里云的 NFS 服务作为存储资源,Kuboard 也可以运行在其他云环境或者私有环境中。)")]),t._v(" "),a("li",[t._v("已在集群中安装 Kuboard")])]),t._v(" "),a("h3",{attrs:{id:"在阿里云创建-nas-服务"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#在阿里云创建-nas-服务","aria-hidden":"true"}},[t._v("#")]),t._v(" 在阿里云创建 NAS 服务")]),t._v(" "),a("p",[t._v("如果您在其他 IaaS 供应商搭建了 Kubernetes 集群,请参考该 IaaS 供应商的文档,创建 NFS 服务。您也可以自行搭建 NFS 服务器,用来为 Kubernetes 集群提供存储资源。")]),t._v(" "),a("ul",[a("li",[t._v("进入阿里云 "),a("em",[a("strong",[t._v("文件存储 NAS 服务")])]),t._v(" 控制台")])]),t._v(" "),a("p",[t._v("登录 www.aliyun.com 后,在控制台界面的产品与服务中选择 "),a("em",[a("strong",[t._v("文件存储 NAS")])])]),t._v(" "),a("p",[t._v("如下图所示")]),t._v(" "),a("p",[a("img",{attrs:{src:_(208),alt:"image-20190717113807552"}})]),t._v(" "),a("ul",[a("li",[t._v("在 "),a("em",[a("strong",[t._v("文件存储 NAS")])]),t._v(" 控制台中点击 "),a("em",[a("strong",[t._v("创建文件系统")])])])]),t._v(" "),a("p",[a("img",{attrs:{src:_(209),alt:"image-20190717114304953"}})]),t._v(" "),a("ul",[a("li",[t._v("填写表单")])]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("字段名称")]),t._v(" "),a("th",[t._v("填写内容")]),t._v(" "),a("th",[t._v("说明")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[t._v("地域")]),t._v(" "),a("td",[t._v("请选择您的 Kubernetes 集群所在的地域")]),t._v(" "),a("td",[t._v("文件系统所在地域")])]),t._v(" "),a("tr",[a("td",[t._v("存储类型")]),t._v(" "),a("td",[t._v("容量型 / 或 SSD型")]),t._v(" "),a("td",[t._v("测试目的,使用价格便宜的容量型即可")])]),t._v(" "),a("tr",[a("td",[t._v("协议类型")]),t._v(" "),a("td",[t._v("NFS")]),t._v(" "),a("td",[t._v("请选择NFS")])]),t._v(" "),a("tr",[a("td",[t._v("可用区")]),t._v(" "),a("td",[t._v("请选择您的 Kubernetes 集群所在的可用区")]),t._v(" "),a("td",[t._v("文件系统所在可用区")])]),t._v(" "),a("tr",[a("td",[t._v("存储包")]),t._v(" "),a("td",[t._v("如果当下没有存储包,可以后续绑定")]),t._v(" "),a("td",[t._v("不绑定存储包,将无法使用该文件系统")])])])]),t._v(" "),a("p",[a("img",{attrs:{src:_(210),alt:"image-20190717114354610"}})]),t._v(" "),a("ul",[a("li",[t._v("点击 "),a("em",[a("strong",[t._v("确定")])])])]),t._v(" "),a("p",[t._v("点击确定后,可查看到该文件系统已创建成功")]),t._v(" "),a("p",[a("img",{attrs:{src:_(211),alt:"image-20190717115020848"}})]),t._v(" "),a("ul",[a("li",[t._v("绑定存储包")])]),t._v(" "),a("p",[t._v("请自行在阿里云中为该文件系统绑定存储包,如果不绑定存储包,将无法使用该文件系统。")]),t._v(" "),a("ul",[a("li",[t._v("点击刚创建文件系统的 "),a("em",[a("strong",[t._v("管理")])]),t._v(" 按钮")])]),t._v(" "),a("p",[a("img",{attrs:{src:_(212),alt:"image-20190717115403374"}})]),t._v(" "),a("ul",[a("li",[t._v("点击 "),a("em",[a("strong",[t._v("添加挂载点")])])])]),t._v(" "),a("p",[t._v("并填写表单")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("字段名称")]),t._v(" "),a("th",[t._v("填写内容")]),t._v(" "),a("th",[t._v("说明")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[t._v("挂载点类型")]),t._v(" "),a("td",[t._v("专有网络")]),t._v(" "),a("td")]),t._v(" "),a("tr",[a("td",[t._v("VPC网络")]),t._v(" "),a("td",[t._v("请选择您的 Kubernetes 集群所在的VPC")]),t._v(" "),a("td")]),t._v(" "),a("tr",[a("td",[t._v("交换机")]),t._v(" "),a("td",[t._v("请选择您的 Kubernetes 集群所在的交换机")]),t._v(" "),a("td")]),t._v(" "),a("tr",[a("td",[t._v("权限组")]),t._v(" "),a("td",[t._v("VPC默认权限组(全部允许)")]),t._v(" "),a("td",[t._v("请选择全部允许")])])])]),t._v(" "),a("p",[a("img",{attrs:{src:_(213),alt:"image-20190717115457614"}})]),t._v(" "),a("ul",[a("li",[t._v("点击 "),a("em",[a("strong",[t._v("确定")])])])]),t._v(" "),a("p",[t._v("点击确定后,将完成挂载点创建,如下图所示:")]),t._v(" "),a("p",[a("img",{attrs:{src:_(214),alt:"image-20190717115829821"}})]),t._v(" "),a("ul",[a("li",[t._v("获取 NFS 连接参数:")])]),t._v(" "),a("p",[t._v("在上图界面中,将 "),a("em",[a("strong",[t._v("V4 Mount")])]),t._v(" 的指令复制下来后,如下所示:")]),t._v(" "),a("div",{staticStyle:{"font-family":"Monaco,Menlo,Consolas,Bitstream Vera Sans Mono,monospace",padding:"20px","background-color":"rgb(244, 244, 245)","border-radius":"4px"}},[t._v("\nsudo mount -t nfs -o vers=4,minorversion=0,noresvport "),a("span",{staticStyle:{color:"red","background-color":"rgb(254, 240, 240)"}},[t._v("189344a39c-lex38.cn-beijing.nas.aliyuncs.com")]),t._v(":"),a("span",{staticStyle:{color:"blue","background-color":"rgb(217, 236, 255)"}},[t._v("/")]),t._v(" /mnt\n")]),t._v(" "),a("p",[t._v("其中红色字体的文字为 NFS Server 的地址,蓝色字体的文字为 NFS Path。如下表所示:")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("字段名称")]),t._v(" "),a("th",[t._v("字段取值")]),t._v(" "),a("th",[t._v("说明")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[t._v("NFS Server")]),t._v(" "),a("td",[t._v("189344a39c-lex38.cn-beijing.nas.aliyuncs.com")]),t._v(" "),a("td")]),t._v(" "),a("tr",[a("td",[t._v("NFS Path")]),t._v(" "),a("td",[t._v("/")]),t._v(" "),a("td",[t._v("NFS Server和NFS Path以冒号分隔")])])])]),t._v(" "),a("h3",{attrs:{id:"在-kuboard-创建存储类"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#在-kuboard-创建存储类","aria-hidden":"true"}},[t._v("#")]),t._v(" 在 Kuboard 创建存储类")]),t._v(" "),a("ul",[a("li",[a("p",[t._v("进入 Kuboard "),a("em",[a("strong",[t._v("集群概览页")])])]),t._v(" "),a("p",[t._v("参考 "),a("a",{attrs:{href:"install/install-dashboard?id=%E8%AE%BF%E9%97%AE"}},[t._v("访问 Kuboard")])]),t._v(" "),a("p",[t._v("如下图所示:")])])]),t._v(" "),a("p",[a("img",{attrs:{src:_(215),alt:"image-20190723112105018"}})]),t._v(" "),a("ul",[a("li",[a("p",[t._v("点击 "),a("em",[a("strong",[t._v("创建存储类")])])]),t._v(" "),a("p",[t._v("填写表单")])])]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("字段名称")]),t._v(" "),a("th",[t._v("填写内容")]),t._v(" "),a("th",[t._v("说明")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[t._v("名称")]),t._v(" "),a("td",[t._v("cluster-storage")]),t._v(" "),a("td",[t._v("填写你喜欢的名称")])]),t._v(" "),a("tr",[a("td",[t._v("限定名称空间")]),t._v(" "),a("td",[t._v("不填写")]),t._v(" "),a("td",[t._v("如果限定名称空间,"),a("br"),t._v("则在 Kuboard 中,您只能在指定的名称空间中使用该存储类"),a("br"),t._v("在 kubectl 中,不受影响")])]),t._v(" "),a("tr",[a("td",[t._v("存储类型")]),t._v(" "),a("td",[t._v("NFS")]),t._v(" "),a("td",[t._v("目前 Kuboard 只支持 NFS,将要增加其他类型的存储,如 CephFS、Cinder 等")])]),t._v(" "),a("tr",[a("td",[t._v("回收策略")]),t._v(" "),a("td",[t._v("回收后删除")]),t._v(" "),a("td",[t._v("当该存储类创建的 存储卷(Persistent Volume)被删除后,之前该存储卷中的文件可以被:回收后删除 / 回收后保留")])]),t._v(" "),a("tr",[a("td",[t._v("存储卷绑定模式")]),t._v(" "),a("td",[t._v("首次使用时绑定")]),t._v(" "),a("td",[t._v("即刻绑定:当 存储卷被创建时,就在 NFS 中为其分配空间,并绑定;"),a("br"),t._v("首次使用时绑定: 在存储卷被第一次使用到时,才绑定")])])])]),t._v(" "),a("p",[a("img",{attrs:{src:_(216),alt:"image-20190723112143032"}})]),t._v(" "),a("ul",[a("li",[t._v("点击 "),a("em",[a("strong",[t._v("保存")])])])]),t._v(" "),a("p",[a("img",{attrs:{src:_(217),alt:"image-20190723112204681"}})]),t._v(" "),a("ul",[a("li",[t._v("点击 "),a("em",[a("strong",[t._v("应用")])])])]),t._v(" "),a("p",[a("img",{attrs:{src:_(218),alt:"image-20190723113250521"}})]),t._v(" "),a("ul",[a("li",[a("p",[t._v("点击 "),a("em",[a("strong",[t._v("完成")])])]),t._v(" "),a("p",[t._v("此时可在存储资源列表中查看到刚创建的存储类")])])]),t._v(" "),a("p",[a("img",{attrs:{src:_(219),alt:"image-20190723113312360"}})])])},[],!1,null,null,null);v.default=r.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/7.17c88a71.js b/docs/assets/js/7.4bbee534.js similarity index 75% rename from docs/assets/js/7.17c88a71.js rename to docs/assets/js/7.4bbee534.js index be15c1e..81deb2f 100644 --- a/docs/assets/js/7.17c88a71.js +++ b/docs/assets/js/7.4bbee534.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[7],{262:function(t,e,s){t.exports=s.p+"assets/img/image-20190720232405147.8fc011f9.png"},263:function(t,e,s){t.exports=s.p+"assets/img/image-20190720233322837.998be85a.png"},264:function(t,e,s){t.exports=s.p+"assets/img/image-20190720233348284.2360801d.png"},265:function(t,e,s){t.exports=s.p+"assets/img/image-20190720233412812.4f5ce20f.png"},266:function(t,e,s){t.exports=s.p+"assets/img/image-20190720233436465.6d8cf61e.png"},267:function(t,e,s){t.exports=s.p+"assets/img/image-20190720233512996.d7ba2b19.png"},268:function(t,e,s){t.exports=s.p+"assets/img/image-20190721000526434.cfdf2d30.png"},269:function(t,e,s){t.exports=s.p+"assets/img/image-20190721000759925.bb32a332.png"},270:function(t,e,s){t.exports=s.p+"assets/img/image-20190721000822458.5797bca7.png"},271:function(t,e,s){t.exports=s.p+"assets/img/image-20190721000847954.6f05e4b8.png"},272:function(t,e,s){t.exports=s.p+"assets/img/image-20190721000919933.3a1d313e.png"},273:function(t,e,s){t.exports=s.p+"assets/img/image-20190721100715898.f0faa9aa.png"},370:function(t,e,s){"use strict";s.r(e);var a=s(0),v=Object(a.a)({},function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"日常调整"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#日常调整","aria-hidden":"true"}},[t._v("#")]),t._v(" 日常调整")]),t._v(" "),a("h2",{attrs:{id:"前提"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#前提","aria-hidden":"true"}},[t._v("#")]),t._v(" 前提")]),t._v(" "),a("p",[t._v("必须具备如下条件:")]),t._v(" "),a("ul",[a("li",[a("p",[t._v("Kubernetes 集群")])]),t._v(" "),a("li",[a("p",[t._v("已在集群中安装 Kuboard")])])]),t._v(" "),a("p",[t._v("假设您一进入 "),a("em",[a("strong",[t._v("example")])]),t._v(" 名称空间页面,如下图所示:")]),t._v(" "),a("p",[a("img",{attrs:{src:s(262),alt:"image-20190720232405147"}})]),t._v(" "),a("h2",{attrs:{id:"批量删除容器组"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#批量删除容器组","aria-hidden":"true"}},[t._v("#")]),t._v(" 批量删除容器组")]),t._v(" "),a("p",[t._v("批量删除容器组特别适用于 "),a("strong",[t._v("开发测试环境的版本更新")]),t._v(" 场景,描述如下:")]),t._v(" "),a("ul",[a("li",[t._v("开发/测试环境中,开发人员提交代码")]),t._v(" "),a("li",[t._v("DevOps环境自动构建出 docker 镜像,并将 docker 镜像推送到仓库;\n"),a("ul",[a("li",[t._v("如果您的 devops 环境只在生成新的 branch 或者 tag 时,生成镜像的新 version,那么原镜像标签的实际镜像已发生改变。")])])]),t._v(" "),a("li",[t._v("从 Kubernetes 中删除该镜像的 容器组")]),t._v(" "),a("li",[t._v("Kubernetes 创建新的 容器组,并且该容器组重新从镜像仓库拉取最新的镜像")])]),t._v(" "),a("p",[t._v("在 Kuboard 中,"),a("em",[a("strong",[t._v("批量删除容器组")])]),t._v(" 的操作步骤为:")]),t._v(" "),a("ul",[a("li",[a("p",[t._v("在名称空间页面点击 "),a("em",[a("strong",[t._v("容器组列表")])])]),t._v(" "),a("ul",[a("li",[a("p",[t._v("选择要筛选的应用分层,并点击刷新,")])]),t._v(" "),a("li",[a("p",[t._v("选择要删除的容器组")])])]),t._v(" "),a("p",[t._v("如下图所示:")])])]),t._v(" "),a("p",[a("img",{attrs:{src:s(263),alt:"image-20190720233322837"}})]),t._v(" "),a("ul",[a("li",[t._v("点击 "),a("em",[a("strong",[t._v("删除")])]),t._v(" 按钮")])]),t._v(" "),a("p",[a("img",{attrs:{src:s(264),alt:"image-20190720233348284"}})]),t._v(" "),a("ul",[a("li",[t._v("点击 "),a("em",[a("strong",[t._v("确定")])])])]),t._v(" "),a("p",[a("img",{attrs:{src:s(265),alt:"image-20190720233412812"}})]),t._v(" "),a("ul",[a("li",[t._v("点击 "),a("em",[a("strong",[t._v("应用")])])])]),t._v(" "),a("p",[a("img",{attrs:{src:s(266),alt:"image-20190720233436465"}})]),t._v(" "),a("ul",[a("li",[a("p",[t._v("点击 "),a("em",[a("strong",[t._v("完成")])])]),t._v(" "),a("p",[t._v("并等待,直到 kubernetes 完成对容器组的调整操作")]),t._v(" "),a("blockquote",[a("p",[t._v("Kuboard 会自动监听 kubernetes 执行此调整操作时的变化,您无需刷新页面,只要等待结果即可。")])])])]),t._v(" "),a("p",[a("img",{attrs:{src:s(267),alt:"image-20190720233512996"}})]),t._v(" "),a("h2",{attrs:{id:"批量调整镜像版本"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#批量调整镜像版本","aria-hidden":"true"}},[t._v("#")]),t._v(" 批量调整镜像版本")]),t._v(" "),a("p",[t._v("批量调整镜像版本适用于如下场景:")]),t._v(" "),a("ul",[a("li",[a("p",[t._v("需要更新容器所使用的镜像的版本号")]),t._v(" "),a("p",[t._v("通常是经过测试的版本,且 DevOps 环境在构建镜像时,为其生成了新的版本号")])])]),t._v(" "),a("p",[t._v("批量调整镜像版本的操作如下:")]),t._v(" "),a("ul",[a("li",[t._v("在名称空间页面点击 "),a("em",[a("strong",[t._v("调整镜像版本")])])])]),t._v(" "),a("p",[a("img",{attrs:{src:s(268),alt:"image-20190721000526434"}})]),t._v(" "),a("ul",[a("li",[a("p",[t._v("在要调整的镜像上点击 "),a("em",[a("strong",[t._v("修改")])])]),t._v(" "),a("p",[t._v("并填写新的镜像版本号,如下图所示:")])])]),t._v(" "),a("p",[a("img",{attrs:{src:s(269),alt:"image-20190721000759925"}})]),t._v(" "),a("ul",[a("li",[t._v("点击 "),a("em",[a("strong",[t._v("执行变更")])])])]),t._v(" "),a("p",[a("img",{attrs:{src:s(270),alt:"image-20190721000822458"}})]),t._v(" "),a("ul",[a("li",[t._v("点击 "),a("em",[a("strong",[t._v("应用")])])])]),t._v(" "),a("p",[a("img",{attrs:{src:s(271),alt:"image-20190721000847954"}})]),t._v(" "),a("ul",[a("li",[a("p",[t._v("点击 "),a("em",[a("strong",[t._v("完成")])])]),t._v(" "),a("p",[t._v("此时会进入容器组列表界面,请等待 Kubernetes 完成对容器组的调整(无需刷新页面)")])])]),t._v(" "),a("p",[a("img",{attrs:{src:s(272),alt:"image-20190721000919933"}})]),t._v(" "),a("h2",{attrs:{id:"批量调整工作负载的副本数"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#批量调整工作负载的副本数","aria-hidden":"true"}},[t._v("#")]),t._v(" 批量调整工作负载的副本数")]),t._v(" "),a("p",[a("em",[a("strong",[t._v("调整容器镜像版本")])]),t._v(" 的功能界面中,也可以用来调整工作负载的副本数,如下图所示:")]),t._v(" "),a("p",[a("img",{attrs:{src:s(273),alt:"image-20190721100715898"}})])])},[],!1,null,null,null);e.default=v.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[7],{258:function(t,e,s){t.exports=s.p+"assets/img/image-20190720232405147.8fc011f9.png"},259:function(t,e,s){t.exports=s.p+"assets/img/image-20190720233322837.998be85a.png"},260:function(t,e,s){t.exports=s.p+"assets/img/image-20190720233348284.2360801d.png"},261:function(t,e,s){t.exports=s.p+"assets/img/image-20190720233412812.4f5ce20f.png"},262:function(t,e,s){t.exports=s.p+"assets/img/image-20190720233436465.6d8cf61e.png"},263:function(t,e,s){t.exports=s.p+"assets/img/image-20190720233512996.d7ba2b19.png"},264:function(t,e,s){t.exports=s.p+"assets/img/image-20190721000526434.cfdf2d30.png"},265:function(t,e,s){t.exports=s.p+"assets/img/image-20190721000759925.bb32a332.png"},266:function(t,e,s){t.exports=s.p+"assets/img/image-20190721000822458.5797bca7.png"},267:function(t,e,s){t.exports=s.p+"assets/img/image-20190721000847954.6f05e4b8.png"},268:function(t,e,s){t.exports=s.p+"assets/img/image-20190721000919933.3a1d313e.png"},269:function(t,e,s){t.exports=s.p+"assets/img/image-20190721100715898.f0faa9aa.png"},349:function(t,e,s){"use strict";s.r(e);var a=s(0),v=Object(a.a)({},function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"日常调整"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#日常调整","aria-hidden":"true"}},[t._v("#")]),t._v(" 日常调整")]),t._v(" "),a("h2",{attrs:{id:"前提"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#前提","aria-hidden":"true"}},[t._v("#")]),t._v(" 前提")]),t._v(" "),a("p",[t._v("必须具备如下条件:")]),t._v(" "),a("ul",[a("li",[a("p",[t._v("Kubernetes 集群")])]),t._v(" "),a("li",[a("p",[t._v("已在集群中安装 Kuboard")])])]),t._v(" "),a("p",[t._v("假设您一进入 "),a("em",[a("strong",[t._v("example")])]),t._v(" 名称空间页面,如下图所示:")]),t._v(" "),a("p",[a("img",{attrs:{src:s(258),alt:"image-20190720232405147"}})]),t._v(" "),a("h2",{attrs:{id:"批量删除容器组"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#批量删除容器组","aria-hidden":"true"}},[t._v("#")]),t._v(" 批量删除容器组")]),t._v(" "),a("p",[t._v("批量删除容器组特别适用于 "),a("strong",[t._v("开发测试环境的版本更新")]),t._v(" 场景,描述如下:")]),t._v(" "),a("ul",[a("li",[t._v("开发/测试环境中,开发人员提交代码")]),t._v(" "),a("li",[t._v("DevOps环境自动构建出 docker 镜像,并将 docker 镜像推送到仓库;\n"),a("ul",[a("li",[t._v("如果您的 devops 环境只在生成新的 branch 或者 tag 时,生成镜像的新 version,那么原镜像标签的实际镜像已发生改变。")])])]),t._v(" "),a("li",[t._v("从 Kubernetes 中删除该镜像的 容器组")]),t._v(" "),a("li",[t._v("Kubernetes 创建新的 容器组,并且该容器组重新从镜像仓库拉取最新的镜像")])]),t._v(" "),a("p",[t._v("在 Kuboard 中,"),a("em",[a("strong",[t._v("批量删除容器组")])]),t._v(" 的操作步骤为:")]),t._v(" "),a("ul",[a("li",[a("p",[t._v("在名称空间页面点击 "),a("em",[a("strong",[t._v("容器组列表")])])]),t._v(" "),a("ul",[a("li",[a("p",[t._v("选择要筛选的应用分层,并点击刷新,")])]),t._v(" "),a("li",[a("p",[t._v("选择要删除的容器组")])])]),t._v(" "),a("p",[t._v("如下图所示:")])])]),t._v(" "),a("p",[a("img",{attrs:{src:s(259),alt:"image-20190720233322837"}})]),t._v(" "),a("ul",[a("li",[t._v("点击 "),a("em",[a("strong",[t._v("删除")])]),t._v(" 按钮")])]),t._v(" "),a("p",[a("img",{attrs:{src:s(260),alt:"image-20190720233348284"}})]),t._v(" "),a("ul",[a("li",[t._v("点击 "),a("em",[a("strong",[t._v("确定")])])])]),t._v(" "),a("p",[a("img",{attrs:{src:s(261),alt:"image-20190720233412812"}})]),t._v(" "),a("ul",[a("li",[t._v("点击 "),a("em",[a("strong",[t._v("应用")])])])]),t._v(" "),a("p",[a("img",{attrs:{src:s(262),alt:"image-20190720233436465"}})]),t._v(" "),a("ul",[a("li",[a("p",[t._v("点击 "),a("em",[a("strong",[t._v("完成")])])]),t._v(" "),a("p",[t._v("并等待,直到 kubernetes 完成对容器组的调整操作")]),t._v(" "),a("blockquote",[a("p",[t._v("Kuboard 会自动监听 kubernetes 执行此调整操作时的变化,您无需刷新页面,只要等待结果即可。")])])])]),t._v(" "),a("p",[a("img",{attrs:{src:s(263),alt:"image-20190720233512996"}})]),t._v(" "),a("h2",{attrs:{id:"批量调整镜像版本"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#批量调整镜像版本","aria-hidden":"true"}},[t._v("#")]),t._v(" 批量调整镜像版本")]),t._v(" "),a("p",[t._v("批量调整镜像版本适用于如下场景:")]),t._v(" "),a("ul",[a("li",[a("p",[t._v("需要更新容器所使用的镜像的版本号")]),t._v(" "),a("p",[t._v("通常是经过测试的版本,且 DevOps 环境在构建镜像时,为其生成了新的版本号")])])]),t._v(" "),a("p",[t._v("批量调整镜像版本的操作如下:")]),t._v(" "),a("ul",[a("li",[t._v("在名称空间页面点击 "),a("em",[a("strong",[t._v("调整镜像版本")])])])]),t._v(" "),a("p",[a("img",{attrs:{src:s(264),alt:"image-20190721000526434"}})]),t._v(" "),a("ul",[a("li",[a("p",[t._v("在要调整的镜像上点击 "),a("em",[a("strong",[t._v("修改")])])]),t._v(" "),a("p",[t._v("并填写新的镜像版本号,如下图所示:")])])]),t._v(" "),a("p",[a("img",{attrs:{src:s(265),alt:"image-20190721000759925"}})]),t._v(" "),a("ul",[a("li",[t._v("点击 "),a("em",[a("strong",[t._v("执行变更")])])])]),t._v(" "),a("p",[a("img",{attrs:{src:s(266),alt:"image-20190721000822458"}})]),t._v(" "),a("ul",[a("li",[t._v("点击 "),a("em",[a("strong",[t._v("应用")])])])]),t._v(" "),a("p",[a("img",{attrs:{src:s(267),alt:"image-20190721000847954"}})]),t._v(" "),a("ul",[a("li",[a("p",[t._v("点击 "),a("em",[a("strong",[t._v("完成")])])]),t._v(" "),a("p",[t._v("此时会进入容器组列表界面,请等待 Kubernetes 完成对容器组的调整(无需刷新页面)")])])]),t._v(" "),a("p",[a("img",{attrs:{src:s(268),alt:"image-20190721000919933"}})]),t._v(" "),a("h2",{attrs:{id:"批量调整工作负载的副本数"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#批量调整工作负载的副本数","aria-hidden":"true"}},[t._v("#")]),t._v(" 批量调整工作负载的副本数")]),t._v(" "),a("p",[a("em",[a("strong",[t._v("调整容器镜像版本")])]),t._v(" 的功能界面中,也可以用来调整工作负载的副本数,如下图所示:")]),t._v(" "),a("p",[a("img",{attrs:{src:s(269),alt:"image-20190721100715898"}})])])},[],!1,null,null,null);e.default=v.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/8.5729daee.js b/docs/assets/js/8.536d7578.js similarity index 95% rename from docs/assets/js/8.5729daee.js rename to docs/assets/js/8.536d7578.js index bd8883a..3e452e5 100644 --- a/docs/assets/js/8.5729daee.js +++ b/docs/assets/js/8.536d7578.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[8],{309:function(e,t,r){e.exports=r.p+"assets/img/image-20190722165648180.fe018998.png"},310:function(e,t,r){e.exports=r.p+"assets/img/image-20190722162249531.e826dfb9.png"},311:function(e,t,r){e.exports=r.p+"assets/img/image-20190722172356943.9a901574.png"},312:function(e,t,r){e.exports=r.p+"assets/img/image-20190722182005060.8e560b34.png"},313:function(e,t,r){e.exports=r.p+"assets/img/image-20190722183329825.63739750.png"},314:function(e,t,r){e.exports=r.p+"assets/img/image-20190722183750444.973f7dfa.png"},315:function(e,t){e.exports="data:image/png;base64,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"},316:function(e,t,r){e.exports=r.p+"assets/img/image-20190722184943431.f2f72e7c.png"},317:function(e,t,r){e.exports=r.p+"assets/img/image-20190722185113938.4d31e54b.png"},369:function(e,t,r){"use strict";r.r(t);var s=r(0),v=Object(s.a)({},function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[s("h1",{attrs:{id:"如何降低k8s学习门槛"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#如何降低k8s学习门槛","aria-hidden":"true"}},[e._v("#")]),e._v(" 如何降低K8S学习门槛 🎉")]),e._v(" "),s("h2",{attrs:{id:"kubernetes-学习门槛在哪儿"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#kubernetes-学习门槛在哪儿","aria-hidden":"true"}},[e._v("#")]),e._v(" Kubernetes 学习门槛在哪儿")]),e._v(" "),s("p",[e._v("学习 Kubernetes 之前,必须具备的知识储备:")]),e._v(" "),s("ul",[s("li",[e._v("Linux 基础")]),e._v(" "),s("li",[e._v("网络基础")]),e._v(" "),s("li",[e._v("容器技术,例如 https://www.docker.com/")])]),e._v(" "),s("p",[e._v("学习 Kubernetes 的过程中可能碰到的难关:")]),e._v(" "),s("ul",[s("li",[e._v("理解 Kubenetes 为了实现容器编排而提出的各种抽象概念以及他们之间的关系:容器组(Pod)、存储卷(Volume)、存储卷声明(PVC)、Ingress、Service 等")]),e._v(" "),s("li",[e._v("安装及配置 Kubernetes 环境")]),e._v(" "),s("li",[e._v("编写和维护 Kubernetes Yaml 文件")]),e._v(" "),s("li",[e._v("熟悉 kubectl 命令行工具中常用的 10 多个命令")])]),e._v(" "),s("h2",{attrs:{id:"降低-kubernetes-学习门槛"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#降低-kubernetes-学习门槛","aria-hidden":"true"}},[e._v("#")]),e._v(" 降低 Kubernetes 学习门槛")]),e._v(" "),s("p",[e._v("Kuboard 为初学者学习 Kubernetes 时设计了如下学习路径:")]),e._v(" "),s("ul",[s("li",[e._v("跟随文档 "),s("a",{attrs:{href:"/install/install-k8s"}},[e._v("安装 Kubernetes 用于测试")]),e._v(" 快速安装一个可以练习使用的 Kubernetes 环境,(初学者也许要花费2小时或更多)")]),e._v(" "),s("li",[e._v("跟随文档 "),s("a",{attrs:{href:"/install/install-dashboard"}},[e._v("安装 Kuboard")]),e._v(" (5分钟)")]),e._v(" "),s("li",[e._v("使用 Kuboard 工作负载编辑器 "),s("a",{attrs:{href:"/guide/example/busybox"}},[e._v("创建 busybox")]),e._v(" (10分钟)")]),e._v(" "),s("li",[e._v("尝试 Kuboard 设计的其他 example "),s("a",{attrs:{href:"/guide/index"}},[e._v("使用 Kuboard")])])]),e._v(" "),s("p",[e._v("后续使用 Kuboard 进行 Kubernetes 运维时,学习者、使用者除了在极少数场景下需要依赖 kubectl 命令之外,完全可以使用 Kuboard 完成日常运维任务。")]),e._v(" "),s("blockquote",[s("p",[e._v("日常的 Kubernetes 运维过程中,为了排查问题,您可能需要:")]),e._v(" "),s("ul",[s("li",[e._v("使用 kubectl port-forward 命令实现 "),s("a",{attrs:{href:"/guide/diagonize/port-forward"}},[e._v("端口转发")]),e._v("(已在 Kuboard 开发计划中)")]),e._v(" "),s("li",[e._v("使用 kubectl cp 命令向容器中复制文件(极低频场景)")])])]),e._v(" "),s("p",[e._v("本文后续章节介绍了 Kuboard 工作负载编辑器的设计,如果您能够大致理解当中的概念,说明您已经完全准备好了,可以开始自己的 Kubernetes 之旅。")]),e._v(" "),s("h2",{attrs:{id:"工作负载编辑器设计"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#工作负载编辑器设计","aria-hidden":"true"}},[e._v("#")]),e._v(" 工作负载编辑器设计")]),e._v(" "),s("p",[e._v("​\t\t在向 Kubernetes 集群部署应用时,开发者或者运维团队必须花大量的时间去理解 Kubernetes 中各种对象的概念,并编写 Yaml 文件去描述 Kubernetes 对象以及他们之间的关系,然而,不同的人因为经验、视角的不同,对Kubernetes 中各对象之间关系的理解并不完全一致,也因此产生了一系列问题:")]),e._v(" "),s("ul",[s("li",[e._v("由于理解的不到位,刚入门Kubernetes的技术人员在使用 Kubernetes 部署应用时经常性地受挫;")]),e._v(" "),s("li",[e._v("由于理解方式的不一致,不同技术人员编写的 yaml 文件结构各不一样,降低了部署在后期的可维护性;")]),e._v(" "),s("li",[e._v("由于部署数量的增加,导致 YAML 文件的数量和代码行数不断增长;")])]),e._v(" "),s("p",[e._v("​\t\tKubernetes 官方提供的 Kubernetes Dashboard 充分意识到了 Kubernete 对象类型在种类上的多样性以及关系上的复杂性,到目前为止并没有在全功能 Dashboard 上做出过多努力,尤其是没有付出过多努力去打造工作负载的 UI 编辑器。在 Kubernetes Dashboard 中,如果想要对 Service、Deployment、StatefulSet、ConfigMap 等各种 Kubernetes 对象执行新增或者变更操作时,您必须编写 YAML 文件。从这个意义上来讲,截止到作者写这篇文章的时间点,Kubernetes 的官方 Dashboard 仍然是一个 “只读” 型 Dashboard,几乎所有的运维操作仍然需要技术人员去编写和维护冗长的 YAML 文件,并通过 kubectl 命令来完成。")]),e._v(" "),s("p",[e._v("​\t\t由于 Kubernetes YAML 文件复杂性,以及开发/运维团队在多环境复制(开发环境、测试环境、准上线环境、生产环境等)方面的普遍需求,Kubernetes 社区提出了各种各样的解决方案,例如 kustomize / helm chart 等,这些解决方案在解决一个问题的同时,又在另一方面增加了复杂度,为 Kubernetes 爱好者增加了新的学习门槛。")]),e._v(" "),s("p",[e._v("​\t\tKuboard 与 Kubernetes Dashboard 相同的是,架构上的简洁性。尤其是,使用 Kuboard 并不需要我们去学习和理解新的概念,而是和 Kuboard 一起,将 Kubernetes 对象中各种复杂的概念和关系梳理清楚,将各种知识点条理化,清晰化。在 Kuboard 的辅助下,轻松掌握 Kubernetes 的使用和运维,并利用 Kuboard 完成 Kubernetes 的日常运维工作。")]),e._v(" "),s("h2",{attrs:{id:"工作负载编辑器介绍"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#工作负载编辑器介绍","aria-hidden":"true"}},[e._v("#")]),e._v(" 工作负载编辑器介绍")]),e._v(" "),s("p",[e._v("​\t\t为了降低 Kubernetes 的学习难度和使用难度,Kuboard 尝试对 Kubernetes 中管理的各种对象做了一个梳理,并以此为基础,设计了 Kuboard 工作负载编辑器。")]),e._v(" "),s("p",[e._v("​\t\tKuboard 工作负载编辑器以下图的方式理解和管理 Kubernetes 对象。")]),e._v(" "),s("p",[s("img",{attrs:{src:r(309),alt:"image-20190722165648180"}})]),e._v(" "),s("p",[e._v("上图中各概念与 Kuboard 工作负载编辑器界面的映射关系如下:")]),e._v(" "),s("p",[s("img",{attrs:{src:r(310),alt:"image-20190722162249531"}})]),e._v(" "),s("h3",{attrs:{id:"_1-基本信息"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_1-基本信息","aria-hidden":"true"}},[e._v("#")]),e._v(" 1. 基本信息")]),e._v(" "),s("p",[e._v("基本信息对应到 Kubernetes 的 Workload Controller,当前 Kuboard 工作负载编辑器已经支持了使用频率最高的几类 Workload Controller :")]),e._v(" "),s("ul",[s("li",[e._v("Deployment")]),e._v(" "),s("li",[e._v("StatefulSet")]),e._v(" "),s("li",[e._v("DaemonSet")])]),e._v(" "),s("p",[e._v("除此之外,Kubernetes 还有如下几类 Controller:")]),e._v(" "),s("ul",[s("li",[e._v("ReplicaSet (Kubernetes 官方推荐使用 Deployment 而不是 ReplicaSet)")]),e._v(" "),s("li",[e._v("ReplicationController (Kubernetes 官方推荐使用 Deployment 而不是 ReplicationController)")]),e._v(" "),s("li",[e._v("Garbage Collection")]),e._v(" "),s("li",[e._v("TTL controller For Finished Resources")]),e._v(" "),s("li",[e._v("Jobs")]),e._v(" "),s("li",[e._v("Cron Job")])]),e._v(" "),s("p",[e._v("Kuboard 未来将陆续支持 Garbage Collection,TTL Controller,Jobs 和 Cron Job。")]),e._v(" "),s("p",[e._v("Kubernetes Workload Controller 主要用于:")]),e._v(" "),s("ul",[s("li",[e._v("根据容器组模板的定义,创建和管理多个容器组")]),e._v(" "),s("li",[e._v("处理容器组的复制和上线")]),e._v(" "),s("li",[e._v("在集群范围内提供自修复能力")])]),e._v(" "),s("blockquote",[s("p",[e._v("例如:Workload Controller 起初在节点 A 上创建并运行了一个容器组 pod_a,当节点 A 出现故障不能正常工作时,Workload Controller 可以自动地在其他可用的节点上运行一个完全相同的容器组实例 pod_a' 以替代 pod_a。")]),e._v(" "),s("p",[e._v("不同类型的 Workload Controller 在处理容器组时,会有各自不同的行为。")])]),e._v(" "),s("blockquote",[s("p",[e._v("请参考 https://kubernetes.io/docs/concepts/workloads/pods/pod-overview/#pods-and-controllers")])]),e._v(" "),s("p",[e._v("基本信息编辑器的界面如下图所示:")]),e._v(" "),s("p",[s("img",{attrs:{src:r(311),alt:"image-20190722172356943"}})]),e._v(" "),s("table",[s("thead",[s("tr",[s("th",[e._v("字段名称")]),e._v(" "),s("th",[e._v("字段描述")])])]),e._v(" "),s("tbody",[s("tr",[s("td",[e._v("服务类型")]),e._v(" "),s("td",[e._v("即工作负载类型,"),s("br"),e._v("当前支持: Deployment、StatefulSet、DaemonSet")])]),e._v(" "),s("tr",[s("td",[e._v("服务分层")]),e._v(" "),s("td",[e._v("决定了 Kuboard 将该工作负载展示在哪一个分层,同时,也确定了该工作负载名称的前缀,可选项有:"),s("br"),e._v("* 展现层 web、网关层 gateway、服务层 svc、持久层 db、中间件层 cloud、监控层 monitor;"),s("br"),e._v("* 默认层当前不可选择")])]),e._v(" "),s("tr",[s("td",[e._v("标签")]),e._v(" "),s("td",[e._v("用于确定 Service 的 labelSelector、Controller 的 labels、容器组的 labels")])]),e._v(" "),s("tr",[s("td",[e._v("服务描述")]),e._v(" "),s("td",[e._v("展示在 Kuboard 界面上的一段描述信息")])]),e._v(" "),s("tr",[s("td",[e._v("副本数量")]),e._v(" "),s("td",[e._v("对于 Deployment 和 StatefulSet 可以填写,决定了该控制器应该维持的容器组副本的数量")])])])]),e._v(" "),s("h3",{attrs:{id:"_2-数据卷"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_2-数据卷","aria-hidden":"true"}},[e._v("#")]),e._v(" 2. 数据卷")]),e._v(" "),s("p",[e._v("​\t\t容器每次启动时,从镜像中初始化所有文件,后续对文件系统的修改、新增、删除操作的结果都是不能持久化的。当容器崩溃时, kubelet 重启该容器,但是原容器已经做的修改将丢失,因为每次启动容器,都是从镜像中初始化;此外,多个容器运行在同一个容器组中时,通常伴随着在不同容器之间共享文件的需求。")]),e._v(" "),s("p",[e._v("​\t\tKubernetes的抽象出了数据卷 Volume 的概念,以解决上述的问题。")]),e._v(" "),s("p",[e._v("​\t\t"),s("strong",[e._v("Kuboard 目前支持如下类型的数据卷:")])]),e._v(" "),s("ul",[s("li",[e._v("NFS")]),e._v(" "),s("li",[e._v("存储卷声明")]),e._v(" "),s("li",[e._v("emptyDir")]),e._v(" "),s("li",[e._v("配置 ConfigMap")]),e._v(" "),s("li",[e._v("Secrets")])]),e._v(" "),s("blockquote",[s("p",[e._v("Kubernetes 支持的数据卷类型,请参考:https://kubernetes.io/docs/concepts/storage/volumes/#types-of-volumes")]),e._v(" "),s("p",[e._v("Kuboard 认为当前支持的数据卷类型已经满足绝大多数应用场景,目前正在添加对更多类型数据卷的支持。")])]),e._v(" "),s("p",[e._v("​\t\t容器组中的不同容器都可以通过挂载点引用该容器组加载的数据卷。Kuboard 工作负载编辑中,使用如下界面定义数据卷:")]),e._v(" "),s("p",[s("img",{attrs:{src:r(312),alt:"image-20190722182005060"}})]),e._v(" "),s("table",[s("thead",[s("tr",[s("th",[e._v("字段名称")]),e._v(" "),s("th",[e._v("说明")])])]),e._v(" "),s("tbody",[s("tr",[s("td",[e._v("数据卷名称")]),e._v(" "),s("td",[e._v("如图中的 "),s("em",[s("strong",[e._v("example-data")])]),e._v(" 、 "),s("em",[s("strong",[e._v("empty-dir")])])])]),e._v(" "),s("tr",[s("td",[e._v("数据卷类型")]),e._v(" "),s("td")]),e._v(" "),s("tr",[s("td",[e._v("数据卷详细信息")]),e._v(" "),s("td",[e._v("不同类型的数据卷需要填写的信息不尽相同,例如"),s("br"),e._v("存储卷声明,需要选择事先已经在名称空间中创建好的存储卷声明"),s("br"),e._v("NFS,需要填写 NFS Server 的地址,以及 NFS Path")])])])]),e._v(" "),s("h3",{attrs:{id:"_3-身份信息"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_3-身份信息","aria-hidden":"true"}},[e._v("#")]),e._v(" 3. 身份信息")]),e._v(" "),s("p",[e._v("身份信息区域主要为容器组定义两类信息:")]),e._v(" "),s("ul",[s("li",[e._v("imagePullSecrets,容器组调用镜像仓库接口抓取镜像时所使用的用户名密码。如果您使用了私有镜像仓库,您需要在此指定镜像仓库的用户名密码;如果您使用 docker 公共仓库,则无需填写 imagePullSecrets")]),e._v(" "),s("li",[e._v("ServiceAccount,容器组调用 kubernetes apiserver 时,所使用的身份信息")])]),e._v(" "),s("p",[e._v("Kuboard 工作负载编辑器中关于身份信息的编辑界面如下所示:")]),e._v(" "),s("p",[s("img",{attrs:{src:r(313),alt:"image-20190722183329825"}})]),e._v(" "),s("h3",{attrs:{id:"_4-容器"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_4-容器","aria-hidden":"true"}},[e._v("#")]),e._v(" 4. 容器")]),e._v(" "),s("p",[e._v("容器是我们真正应用程序镜像被加载和运行的地方,按照 Kubernetes 的设计,一个容器组 Pod 中可以包含多个容器 Container,这些容器被分为两类:")]),e._v(" "),s("ul",[s("li",[e._v("初始化容器\n"),s("ul",[s("li",[e._v("初始化容器总是执行后结束执行")]),e._v(" "),s("li",[e._v("初始化容器按其定义的顺序执行,前一个初始化容器执行结束后,才开始后一个初始化容器的执行")]),e._v(" "),s("li",[e._v("只有初始化容器执行成功后,容器组才启动工作容器")]),e._v(" "),s("li",[e._v("请参考 https://kubernetes.io/docs/concepts/workloads/pods/init-containers/")])])]),e._v(" "),s("li",[e._v("工作容器\n"),s("ul",[s("li",[e._v("容器组可以包含一个或多个工作容器")]),e._v(" "),s("li",[e._v("https://kubernetes.io/docs/concepts/workloads/pods/pod-overview")])])])]),e._v(" "),s("p",[e._v("Kuborad中,定义容器的界面如下图所示:")]),e._v(" "),s("p",[s("img",{attrs:{src:r(314),alt:"image-20190722183750444"}})]),e._v(" "),s("p",[s("img",{attrs:{src:r(315),alt:"image-20190722184516447"}})]),e._v(" "),s("h3",{attrs:{id:"_5-访问方式"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_5-访问方式","aria-hidden":"true"}},[e._v("#")]),e._v(" 5. 访问方式")]),e._v(" "),s("p",[e._v("​\t\t访问方式,即 Kubernetes Service。")]),e._v(" "),s("blockquote",[s("p",[e._v("请参考: https://kubernetes.io/docs/concepts/services-networking/service/")])]),e._v(" "),s("p",[e._v("​\t\tKuboard 中,支持 ClusterIP(集群内访问) 以及 NodePort(VPC 内访问) 两种 Service 访问方式,您也可以不为该工作负载定义 Service 访问方式。访问方式的界面如下所示:")]),e._v(" "),s("p",[s("img",{attrs:{src:r(316),alt:"image-20190722184943431"}})]),e._v(" "),s("h3",{attrs:{id:"_6-互联网入口"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_6-互联网入口","aria-hidden":"true"}},[e._v("#")]),e._v(" 6. 互联网入口")]),e._v(" "),s("p",[e._v("​\t\t互联网入口,即 Kubernetes Ingress。")]),e._v(" "),s("blockquote",[s("p",[e._v("请参考: https://kubernetes.io/docs/concepts/services-networking/ingress/")])]),e._v(" "),s("p",[e._v("​\t\tKuboard 并不限定您使用何种类型的 "),s("a",{attrs:{href:"https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Ingress Controller"),s("OutboundLink")],1),e._v(", 但是 "),s("a",{attrs:{href:"/install/install-k8s"}},[e._v("安装 Kubernetes 用于测试")]),e._v(" 文档中,推荐使用的 Ingress Controller 是 "),s("a",{attrs:{href:"https://github.com/nginxinc/kubernetes-ingress",target:"_blank",rel:"noopener noreferrer"}},[e._v("Nginx-Ingress"),s("OutboundLink")],1),e._v("。")]),e._v(" "),s("p",[e._v("​\t\t在您使用 Nginx-Ingress 的情况下,要想确保您能按照互联网入口中定义的域名访问您的服务,请确保以下两点:")]),e._v(" "),s("ul",[s("li",[e._v("域名解析指向 Kubernetes 集群中 Worker 节点对应的负载均衡的 IP 地址\n"),s("ul",[s("li",[e._v("如果是测试环境,也可以只指向其中一台 Worker 节点的 IP 地址")])])]),e._v(" "),s("li",[e._v("通过该域名,可以访问 Worker 节点的 80 端口\n"),s("ul",[s("li",[e._v("如果您启用了 HTTPS,请同时确保通过该域名可以访问 Worker 节点的 443 端口")])])])]),e._v(" "),s("p",[e._v("​\t\tKuboard 中,定义互联网入口的界面如下所示:")]),e._v(" "),s("p",[s("img",{attrs:{src:r(317),alt:"image-20190722185113938"}})])])},[],!1,null,null,null);t.default=v.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[8],{324:function(e,t,r){e.exports=r.p+"assets/img/image-20190722165648180.fe018998.png"},325:function(e,t,r){e.exports=r.p+"assets/img/image-20190722162249531.e826dfb9.png"},326:function(e,t,r){e.exports=r.p+"assets/img/image-20190722172356943.9a901574.png"},327:function(e,t,r){e.exports=r.p+"assets/img/image-20190722182005060.8e560b34.png"},328:function(e,t,r){e.exports=r.p+"assets/img/image-20190722183329825.63739750.png"},329:function(e,t,r){e.exports=r.p+"assets/img/image-20190722183750444.973f7dfa.png"},330:function(e,t){e.exports="data:image/png;base64,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"},331:function(e,t,r){e.exports=r.p+"assets/img/image-20190722184943431.f2f72e7c.png"},332:function(e,t,r){e.exports=r.p+"assets/img/image-20190722185113938.4d31e54b.png"},346:function(e,t,r){"use strict";r.r(t);var s=r(0),v=Object(s.a)({},function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[s("h1",{attrs:{id:"如何降低k8s学习门槛"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#如何降低k8s学习门槛","aria-hidden":"true"}},[e._v("#")]),e._v(" 如何降低K8S学习门槛 🎉")]),e._v(" "),s("h2",{attrs:{id:"kubernetes-学习门槛在哪儿"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#kubernetes-学习门槛在哪儿","aria-hidden":"true"}},[e._v("#")]),e._v(" Kubernetes 学习门槛在哪儿")]),e._v(" "),s("p",[e._v("学习 Kubernetes 之前,必须具备的知识储备:")]),e._v(" "),s("ul",[s("li",[e._v("Linux 基础")]),e._v(" "),s("li",[e._v("网络基础")]),e._v(" "),s("li",[e._v("容器技术,例如 https://www.docker.com/")])]),e._v(" "),s("p",[e._v("学习 Kubernetes 的过程中可能碰到的难关:")]),e._v(" "),s("ul",[s("li",[e._v("理解 Kubenetes 为了实现容器编排而提出的各种抽象概念以及他们之间的关系:容器组(Pod)、存储卷(Volume)、存储卷声明(PVC)、Ingress、Service 等")]),e._v(" "),s("li",[e._v("安装及配置 Kubernetes 环境")]),e._v(" "),s("li",[e._v("编写和维护 Kubernetes Yaml 文件")]),e._v(" "),s("li",[e._v("熟悉 kubectl 命令行工具中常用的 10 多个命令")])]),e._v(" "),s("h2",{attrs:{id:"降低-kubernetes-学习门槛"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#降低-kubernetes-学习门槛","aria-hidden":"true"}},[e._v("#")]),e._v(" 降低 Kubernetes 学习门槛")]),e._v(" "),s("p",[e._v("Kuboard 为初学者学习 Kubernetes 时设计了如下学习路径:")]),e._v(" "),s("ul",[s("li",[e._v("跟随文档 "),s("a",{attrs:{href:"/install/install-k8s"}},[e._v("安装 Kubernetes 用于测试")]),e._v(" 快速安装一个可以练习使用的 Kubernetes 环境,(初学者也许要花费2小时或更多)")]),e._v(" "),s("li",[e._v("跟随文档 "),s("a",{attrs:{href:"/install/install-dashboard"}},[e._v("安装 Kuboard")]),e._v(" (5分钟)")]),e._v(" "),s("li",[e._v("使用 Kuboard 工作负载编辑器 "),s("a",{attrs:{href:"/guide/example/busybox"}},[e._v("创建 busybox")]),e._v(" (10分钟)")]),e._v(" "),s("li",[e._v("尝试 Kuboard 设计的其他 example "),s("a",{attrs:{href:"/guide/index"}},[e._v("使用 Kuboard")])])]),e._v(" "),s("p",[e._v("后续使用 Kuboard 进行 Kubernetes 运维时,学习者、使用者除了在极少数场景下需要依赖 kubectl 命令之外,完全可以使用 Kuboard 完成日常运维任务。")]),e._v(" "),s("blockquote",[s("p",[e._v("日常的 Kubernetes 运维过程中,为了排查问题,您可能需要:")]),e._v(" "),s("ul",[s("li",[e._v("使用 kubectl port-forward 命令实现 "),s("a",{attrs:{href:"/guide/diagonize/port-forward"}},[e._v("端口转发")]),e._v("(已在 Kuboard 开发计划中)")]),e._v(" "),s("li",[e._v("使用 kubectl cp 命令向容器中复制文件(极低频场景)")])])]),e._v(" "),s("p",[e._v("本文后续章节介绍了 Kuboard 工作负载编辑器的设计,如果您能够大致理解当中的概念,说明您已经完全准备好了,可以开始自己的 Kubernetes 之旅。")]),e._v(" "),s("h2",{attrs:{id:"工作负载编辑器设计"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#工作负载编辑器设计","aria-hidden":"true"}},[e._v("#")]),e._v(" 工作负载编辑器设计")]),e._v(" "),s("p",[e._v("​\t\t在向 Kubernetes 集群部署应用时,开发者或者运维团队必须花大量的时间去理解 Kubernetes 中各种对象的概念,并编写 Yaml 文件去描述 Kubernetes 对象以及他们之间的关系,然而,不同的人因为经验、视角的不同,对Kubernetes 中各对象之间关系的理解并不完全一致,也因此产生了一系列问题:")]),e._v(" "),s("ul",[s("li",[e._v("由于理解的不到位,刚入门Kubernetes的技术人员在使用 Kubernetes 部署应用时经常性地受挫;")]),e._v(" "),s("li",[e._v("由于理解方式的不一致,不同技术人员编写的 yaml 文件结构各不一样,降低了部署在后期的可维护性;")]),e._v(" "),s("li",[e._v("由于部署数量的增加,导致 YAML 文件的数量和代码行数不断增长;")])]),e._v(" "),s("p",[e._v("​\t\tKubernetes 官方提供的 Kubernetes Dashboard 充分意识到了 Kubernete 对象类型在种类上的多样性以及关系上的复杂性,到目前为止并没有在全功能 Dashboard 上做出过多努力,尤其是没有付出过多努力去打造工作负载的 UI 编辑器。在 Kubernetes Dashboard 中,如果想要对 Service、Deployment、StatefulSet、ConfigMap 等各种 Kubernetes 对象执行新增或者变更操作时,您必须编写 YAML 文件。从这个意义上来讲,截止到作者写这篇文章的时间点,Kubernetes 的官方 Dashboard 仍然是一个 “只读” 型 Dashboard,几乎所有的运维操作仍然需要技术人员去编写和维护冗长的 YAML 文件,并通过 kubectl 命令来完成。")]),e._v(" "),s("p",[e._v("​\t\t由于 Kubernetes YAML 文件复杂性,以及开发/运维团队在多环境复制(开发环境、测试环境、准上线环境、生产环境等)方面的普遍需求,Kubernetes 社区提出了各种各样的解决方案,例如 kustomize / helm chart 等,这些解决方案在解决一个问题的同时,又在另一方面增加了复杂度,为 Kubernetes 爱好者增加了新的学习门槛。")]),e._v(" "),s("p",[e._v("​\t\tKuboard 与 Kubernetes Dashboard 相同的是,架构上的简洁性。尤其是,使用 Kuboard 并不需要我们去学习和理解新的概念,而是和 Kuboard 一起,将 Kubernetes 对象中各种复杂的概念和关系梳理清楚,将各种知识点条理化,清晰化。在 Kuboard 的辅助下,轻松掌握 Kubernetes 的使用和运维,并利用 Kuboard 完成 Kubernetes 的日常运维工作。")]),e._v(" "),s("h2",{attrs:{id:"工作负载编辑器介绍"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#工作负载编辑器介绍","aria-hidden":"true"}},[e._v("#")]),e._v(" 工作负载编辑器介绍")]),e._v(" "),s("p",[e._v("​\t\t为了降低 Kubernetes 的学习难度和使用难度,Kuboard 尝试对 Kubernetes 中管理的各种对象做了一个梳理,并以此为基础,设计了 Kuboard 工作负载编辑器。")]),e._v(" "),s("p",[e._v("​\t\tKuboard 工作负载编辑器以下图的方式理解和管理 Kubernetes 对象。")]),e._v(" "),s("p",[s("img",{attrs:{src:r(324),alt:"image-20190722165648180"}})]),e._v(" "),s("p",[e._v("上图中各概念与 Kuboard 工作负载编辑器界面的映射关系如下:")]),e._v(" "),s("p",[s("img",{attrs:{src:r(325),alt:"image-20190722162249531"}})]),e._v(" "),s("h3",{attrs:{id:"_1-基本信息"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_1-基本信息","aria-hidden":"true"}},[e._v("#")]),e._v(" 1. 基本信息")]),e._v(" "),s("p",[e._v("基本信息对应到 Kubernetes 的 Workload Controller,当前 Kuboard 工作负载编辑器已经支持了使用频率最高的几类 Workload Controller :")]),e._v(" "),s("ul",[s("li",[e._v("Deployment")]),e._v(" "),s("li",[e._v("StatefulSet")]),e._v(" "),s("li",[e._v("DaemonSet")])]),e._v(" "),s("p",[e._v("除此之外,Kubernetes 还有如下几类 Controller:")]),e._v(" "),s("ul",[s("li",[e._v("ReplicaSet (Kubernetes 官方推荐使用 Deployment 而不是 ReplicaSet)")]),e._v(" "),s("li",[e._v("ReplicationController (Kubernetes 官方推荐使用 Deployment 而不是 ReplicationController)")]),e._v(" "),s("li",[e._v("Garbage Collection")]),e._v(" "),s("li",[e._v("TTL controller For Finished Resources")]),e._v(" "),s("li",[e._v("Jobs")]),e._v(" "),s("li",[e._v("Cron Job")])]),e._v(" "),s("p",[e._v("Kuboard 未来将陆续支持 Garbage Collection,TTL Controller,Jobs 和 Cron Job。")]),e._v(" "),s("p",[e._v("Kubernetes Workload Controller 主要用于:")]),e._v(" "),s("ul",[s("li",[e._v("根据容器组模板的定义,创建和管理多个容器组")]),e._v(" "),s("li",[e._v("处理容器组的复制和上线")]),e._v(" "),s("li",[e._v("在集群范围内提供自修复能力")])]),e._v(" "),s("blockquote",[s("p",[e._v("例如:Workload Controller 起初在节点 A 上创建并运行了一个容器组 pod_a,当节点 A 出现故障不能正常工作时,Workload Controller 可以自动地在其他可用的节点上运行一个完全相同的容器组实例 pod_a' 以替代 pod_a。")]),e._v(" "),s("p",[e._v("不同类型的 Workload Controller 在处理容器组时,会有各自不同的行为。")])]),e._v(" "),s("blockquote",[s("p",[e._v("请参考 https://kubernetes.io/docs/concepts/workloads/pods/pod-overview/#pods-and-controllers")])]),e._v(" "),s("p",[e._v("基本信息编辑器的界面如下图所示:")]),e._v(" "),s("p",[s("img",{attrs:{src:r(326),alt:"image-20190722172356943"}})]),e._v(" "),s("table",[s("thead",[s("tr",[s("th",[e._v("字段名称")]),e._v(" "),s("th",[e._v("字段描述")])])]),e._v(" "),s("tbody",[s("tr",[s("td",[e._v("服务类型")]),e._v(" "),s("td",[e._v("即工作负载类型,"),s("br"),e._v("当前支持: Deployment、StatefulSet、DaemonSet")])]),e._v(" "),s("tr",[s("td",[e._v("服务分层")]),e._v(" "),s("td",[e._v("决定了 Kuboard 将该工作负载展示在哪一个分层,同时,也确定了该工作负载名称的前缀,可选项有:"),s("br"),e._v("* 展现层 web、网关层 gateway、服务层 svc、持久层 db、中间件层 cloud、监控层 monitor;"),s("br"),e._v("* 默认层当前不可选择")])]),e._v(" "),s("tr",[s("td",[e._v("标签")]),e._v(" "),s("td",[e._v("用于确定 Service 的 labelSelector、Controller 的 labels、容器组的 labels")])]),e._v(" "),s("tr",[s("td",[e._v("服务描述")]),e._v(" "),s("td",[e._v("展示在 Kuboard 界面上的一段描述信息")])]),e._v(" "),s("tr",[s("td",[e._v("副本数量")]),e._v(" "),s("td",[e._v("对于 Deployment 和 StatefulSet 可以填写,决定了该控制器应该维持的容器组副本的数量")])])])]),e._v(" "),s("h3",{attrs:{id:"_2-数据卷"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_2-数据卷","aria-hidden":"true"}},[e._v("#")]),e._v(" 2. 数据卷")]),e._v(" "),s("p",[e._v("​\t\t容器每次启动时,从镜像中初始化所有文件,后续对文件系统的修改、新增、删除操作的结果都是不能持久化的。当容器崩溃时, kubelet 重启该容器,但是原容器已经做的修改将丢失,因为每次启动容器,都是从镜像中初始化;此外,多个容器运行在同一个容器组中时,通常伴随着在不同容器之间共享文件的需求。")]),e._v(" "),s("p",[e._v("​\t\tKubernetes的抽象出了数据卷 Volume 的概念,以解决上述的问题。")]),e._v(" "),s("p",[e._v("​\t\t"),s("strong",[e._v("Kuboard 目前支持如下类型的数据卷:")])]),e._v(" "),s("ul",[s("li",[e._v("NFS")]),e._v(" "),s("li",[e._v("存储卷声明")]),e._v(" "),s("li",[e._v("emptyDir")]),e._v(" "),s("li",[e._v("配置 ConfigMap")]),e._v(" "),s("li",[e._v("Secrets")])]),e._v(" "),s("blockquote",[s("p",[e._v("Kubernetes 支持的数据卷类型,请参考:https://kubernetes.io/docs/concepts/storage/volumes/#types-of-volumes")]),e._v(" "),s("p",[e._v("Kuboard 认为当前支持的数据卷类型已经满足绝大多数应用场景,目前正在添加对更多类型数据卷的支持。")])]),e._v(" "),s("p",[e._v("​\t\t容器组中的不同容器都可以通过挂载点引用该容器组加载的数据卷。Kuboard 工作负载编辑中,使用如下界面定义数据卷:")]),e._v(" "),s("p",[s("img",{attrs:{src:r(327),alt:"image-20190722182005060"}})]),e._v(" "),s("table",[s("thead",[s("tr",[s("th",[e._v("字段名称")]),e._v(" "),s("th",[e._v("说明")])])]),e._v(" "),s("tbody",[s("tr",[s("td",[e._v("数据卷名称")]),e._v(" "),s("td",[e._v("如图中的 "),s("em",[s("strong",[e._v("example-data")])]),e._v(" 、 "),s("em",[s("strong",[e._v("empty-dir")])])])]),e._v(" "),s("tr",[s("td",[e._v("数据卷类型")]),e._v(" "),s("td")]),e._v(" "),s("tr",[s("td",[e._v("数据卷详细信息")]),e._v(" "),s("td",[e._v("不同类型的数据卷需要填写的信息不尽相同,例如"),s("br"),e._v("存储卷声明,需要选择事先已经在名称空间中创建好的存储卷声明"),s("br"),e._v("NFS,需要填写 NFS Server 的地址,以及 NFS Path")])])])]),e._v(" "),s("h3",{attrs:{id:"_3-身份信息"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_3-身份信息","aria-hidden":"true"}},[e._v("#")]),e._v(" 3. 身份信息")]),e._v(" "),s("p",[e._v("身份信息区域主要为容器组定义两类信息:")]),e._v(" "),s("ul",[s("li",[e._v("imagePullSecrets,容器组调用镜像仓库接口抓取镜像时所使用的用户名密码。如果您使用了私有镜像仓库,您需要在此指定镜像仓库的用户名密码;如果您使用 docker 公共仓库,则无需填写 imagePullSecrets")]),e._v(" "),s("li",[e._v("ServiceAccount,容器组调用 kubernetes apiserver 时,所使用的身份信息")])]),e._v(" "),s("p",[e._v("Kuboard 工作负载编辑器中关于身份信息的编辑界面如下所示:")]),e._v(" "),s("p",[s("img",{attrs:{src:r(328),alt:"image-20190722183329825"}})]),e._v(" "),s("h3",{attrs:{id:"_4-容器"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_4-容器","aria-hidden":"true"}},[e._v("#")]),e._v(" 4. 容器")]),e._v(" "),s("p",[e._v("容器是我们真正应用程序镜像被加载和运行的地方,按照 Kubernetes 的设计,一个容器组 Pod 中可以包含多个容器 Container,这些容器被分为两类:")]),e._v(" "),s("ul",[s("li",[e._v("初始化容器\n"),s("ul",[s("li",[e._v("初始化容器总是执行后结束执行")]),e._v(" "),s("li",[e._v("初始化容器按其定义的顺序执行,前一个初始化容器执行结束后,才开始后一个初始化容器的执行")]),e._v(" "),s("li",[e._v("只有初始化容器执行成功后,容器组才启动工作容器")]),e._v(" "),s("li",[e._v("请参考 https://kubernetes.io/docs/concepts/workloads/pods/init-containers/")])])]),e._v(" "),s("li",[e._v("工作容器\n"),s("ul",[s("li",[e._v("容器组可以包含一个或多个工作容器")]),e._v(" "),s("li",[e._v("https://kubernetes.io/docs/concepts/workloads/pods/pod-overview")])])])]),e._v(" "),s("p",[e._v("Kuborad中,定义容器的界面如下图所示:")]),e._v(" "),s("p",[s("img",{attrs:{src:r(329),alt:"image-20190722183750444"}})]),e._v(" "),s("p",[s("img",{attrs:{src:r(330),alt:"image-20190722184516447"}})]),e._v(" "),s("h3",{attrs:{id:"_5-访问方式"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_5-访问方式","aria-hidden":"true"}},[e._v("#")]),e._v(" 5. 访问方式")]),e._v(" "),s("p",[e._v("​\t\t访问方式,即 Kubernetes Service。")]),e._v(" "),s("blockquote",[s("p",[e._v("请参考: https://kubernetes.io/docs/concepts/services-networking/service/")])]),e._v(" "),s("p",[e._v("​\t\tKuboard 中,支持 ClusterIP(集群内访问) 以及 NodePort(VPC 内访问) 两种 Service 访问方式,您也可以不为该工作负载定义 Service 访问方式。访问方式的界面如下所示:")]),e._v(" "),s("p",[s("img",{attrs:{src:r(331),alt:"image-20190722184943431"}})]),e._v(" "),s("h3",{attrs:{id:"_6-互联网入口"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_6-互联网入口","aria-hidden":"true"}},[e._v("#")]),e._v(" 6. 互联网入口")]),e._v(" "),s("p",[e._v("​\t\t互联网入口,即 Kubernetes Ingress。")]),e._v(" "),s("blockquote",[s("p",[e._v("请参考: https://kubernetes.io/docs/concepts/services-networking/ingress/")])]),e._v(" "),s("p",[e._v("​\t\tKuboard 并不限定您使用何种类型的 "),s("a",{attrs:{href:"https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Ingress Controller"),s("OutboundLink")],1),e._v(", 但是 "),s("a",{attrs:{href:"/install/install-k8s"}},[e._v("安装 Kubernetes 用于测试")]),e._v(" 文档中,推荐使用的 Ingress Controller 是 "),s("a",{attrs:{href:"https://github.com/nginxinc/kubernetes-ingress",target:"_blank",rel:"noopener noreferrer"}},[e._v("Nginx-Ingress"),s("OutboundLink")],1),e._v("。")]),e._v(" "),s("p",[e._v("​\t\t在您使用 Nginx-Ingress 的情况下,要想确保您能按照互联网入口中定义的域名访问您的服务,请确保以下两点:")]),e._v(" "),s("ul",[s("li",[e._v("域名解析指向 Kubernetes 集群中 Worker 节点对应的负载均衡的 IP 地址\n"),s("ul",[s("li",[e._v("如果是测试环境,也可以只指向其中一台 Worker 节点的 IP 地址")])])]),e._v(" "),s("li",[e._v("通过该域名,可以访问 Worker 节点的 80 端口\n"),s("ul",[s("li",[e._v("如果您启用了 HTTPS,请同时确保通过该域名可以访问 Worker 节点的 443 端口")])])])]),e._v(" "),s("p",[e._v("​\t\tKuboard 中,定义互联网入口的界面如下所示:")]),e._v(" "),s("p",[s("img",{attrs:{src:r(332),alt:"image-20190722185113938"}})])])},[],!1,null,null,null);t.default=v.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/9.90b294ab.js b/docs/assets/js/9.7574eeb5.js similarity index 85% rename from docs/assets/js/9.90b294ab.js rename to docs/assets/js/9.7574eeb5.js index e40f4c7..3b6b960 100644 --- a/docs/assets/js/9.90b294ab.js +++ b/docs/assets/js/9.7574eeb5.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[9],{115:function(t,_,v){t.exports=v.p+"assets/img/image-20190723115721514.bf981ef3.png"},251:function(t,_,v){t.exports=v.p+"assets/img/image-20190723115852719.f1658660.png"},252:function(t,_,v){t.exports=v.p+"assets/img/image-20190723115912645.393d67ff.png"},253:function(t,_,v){t.exports=v.p+"assets/img/image-20190723115940862.dfeacc57.png"},254:function(t,_,v){t.exports=v.p+"assets/img/image-20190723120011972.0f0914c5.png"},255:function(t,_,v){t.exports=v.p+"assets/img/image-20190723120050894.9b1d6350.png"},256:function(t,_,v){t.exports=v.p+"assets/img/image-20190723120104474.617a620a.png"},257:function(t,_,v){t.exports=v.p+"assets/img/image-20190723120125425.a46d7874.png"},347:function(t,_,v){"use strict";v.r(_);var e=v(0),s=Object(e.a)({},function(){var t=this,_=t.$createElement,e=t._self._c||_;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"部署-busybox"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#部署-busybox","aria-hidden":"true"}},[t._v("#")]),t._v(" 部署 busybox")]),t._v(" "),e("h2",{attrs:{id:"前提"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#前提","aria-hidden":"true"}},[t._v("#")]),t._v(" 前提")]),t._v(" "),e("p",[t._v("必须具备如下条件:")]),t._v(" "),e("ul",[e("li",[t._v("Kubernetes 集群")]),t._v(" "),e("li",[t._v("已在集群中安装 Kuboard")])]),t._v(" "),e("p",[t._v("假设您已经进入了 Kuboard 名称空间界面,如下图所示。可参考 "),e("router-link",{attrs:{to:"/guide/cluster/namespace.html#创建名称空间"}},[t._v("创建名称空间")])],1),t._v(" "),e("p",[e("img",{attrs:{src:v(115),alt:"image-20190723115721514"}})]),t._v(" "),e("h2",{attrs:{id:"部署-busybox-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#部署-busybox-2","aria-hidden":"true"}},[t._v("#")]),t._v(" 部署 busybox")]),t._v(" "),e("p",[e("a",{attrs:{href:"https://hub.docker.com/_/busybox",target:"_blank",rel:"noopener noreferrer"}},[t._v("查看 busybox 介绍"),e("OutboundLink")],1)]),t._v(" "),e("p",[t._v("Busybox 是一个非常小巧(不到5M)的容器,此处用它来展示如何将一个 docker image 通过 Kuboard 部署到 kubernetes 集群中。")]),t._v(" "),e("ul",[e("li",[e("p",[t._v("点击 "),e("em",[e("strong",[t._v("创建工作负载按钮")])])]),t._v(" "),e("p",[t._v("填写表单如下:")])])]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("字段名称")]),t._v(" "),e("th",[t._v("填写内容")]),t._v(" "),e("th",[t._v("说明")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("服务类型")]),t._v(" "),e("td",[t._v("Deployment")]),t._v(" "),e("td",[t._v("Kubernetes 的 Deployment 类型")])]),t._v(" "),e("tr",[e("td",[t._v("服务分层")]),t._v(" "),e("td",[t._v("中间件")]),t._v(" "),e("td",[t._v("生成的Kuberenetes对象以 cloud- 作为前缀,"),e("br"),t._v("并显示在中间件分层中")])]),t._v(" "),e("tr",[e("td",[t._v("服务名称")]),t._v(" "),e("td",[t._v("busybox")]),t._v(" "),e("td",[t._v("显示在 Kuboard 中的名称")])]),t._v(" "),e("tr",[e("td",[t._v("副本数量")]),t._v(" "),e("td",[t._v("1")]),t._v(" "),e("td",[t._v("replicas")])]),t._v(" "),e("tr",[e("td",[t._v("容器名称")]),t._v(" "),e("td",[t._v("busybox")]),t._v(" "),e("td")]),t._v(" "),e("tr",[e("td",[t._v("镜像")]),t._v(" "),e("td",[t._v("busybox:1.29")]),t._v(" "),e("td",[t._v("hub.docker.com 中的 busybox 镜像")])]),t._v(" "),e("tr",[e("td",[t._v("Command")]),t._v(" "),e("td",[t._v("sleep")]),t._v(" "),e("td")]),t._v(" "),e("tr",[e("td",[t._v("Command")]),t._v(" "),e("td",[t._v("3600")]),t._v(" "),e("td")])])]),t._v(" "),e("p",[e("img",{attrs:{src:v(251),alt:"image-20190723115852719"}})]),t._v(" "),e("ul",[e("li",[e("p",[t._v("完成表单填写后,点击***保存***")]),t._v(" "),e("p",[t._v("Kuboard 将对表单参数进行校验,通过后,方可执行对集群的变更操作。")])])]),t._v(" "),e("p",[e("img",{attrs:{src:v(252),alt:"image-20190723115912645"}})]),t._v(" "),e("ul",[e("li",[e("p",[t._v("点击***应用***")]),t._v(" "),e("p",[t._v("Kuboard 执行对集群的变更操作,变更的过程中,产生的事件以通知消息的形式显示出来。")])])]),t._v(" "),e("p",[e("img",{attrs:{src:v(253),alt:"image-20190723115940862"}})]),t._v(" "),e("h2",{attrs:{id:"验证工作负载"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#验证工作负载","aria-hidden":"true"}},[t._v("#")]),t._v(" 验证工作负载")]),t._v(" "),e("ul",[e("li",[e("p",[t._v("点击***完成***")]),t._v(" "),e("p",[t._v("点击完成后,可查看工作负载的信息。该界面分成四个区域:")]),t._v(" "),e("ul",[e("li",[e("p",[t._v("页头区")]),t._v(" "),e("p",[t._v("页头区包含对该工作负载(本案例中为 Deployment)的操作按钮。可执行的操作有:"),e("em",[e("strong",[t._v("编辑")])]),t._v(" / "),e("em",[e("strong",[t._v("伸缩")])]),t._v(" / "),e("em",[e("strong",[t._v("刷新")])]),t._v(" / "),e("em",[e("strong",[t._v("删除")])])])]),t._v(" "),e("li",[e("p",[t._v("工作负载基本信息")]),t._v(" "),e("p",[t._v("基本信息区显示了工作负载的 "),e("em",[e("strong",[t._v("基本信息")])]),t._v(" 、"),e("em",[e("strong",[t._v("运行时信息")])]),t._v("、"),e("em",[e("strong",[t._v("访问方式")])]),t._v("(Service)、"),e("em",[e("strong",[t._v("互联网入口")])]),t._v("(Ingress)")])]),t._v(" "),e("li",[e("p",[t._v("容器组列表")]),t._v(" "),e("p",[t._v("容器组列表区显示了该当前对应的所有容器组(Pod),容器组列表区监听集群的动态变化,当您执行伸缩操作、或者删除容器组操作时,无需刷新,就可以查看到最新的容器组信息。")])]),t._v(" "),e("li",[e("p",[t._v("容器组详情")]),t._v(" "),e("p",[t._v("容器组详情区显示了当前选中容器组的信息,其中包括:")]),t._v(" "),e("ul",[e("li",[t._v("容器组相关事件")]),t._v(" "),e("li",[t._v("容器组基本信息,及删除容器组的操作按钮。(此区域还包括容器组相关的监控操作,监控模块在后续的章节中介绍)")]),t._v(" "),e("li",[t._v("容器基本信息,及查看容器日志、打开容器终端的按钮。(此区域还包括容器相关的监控操作,监控模块在后续的章节中介绍)")])])])])])]),t._v(" "),e("p",[e("img",{attrs:{src:v(254),alt:"image-20190723120011972"}})]),t._v(" "),e("ul",[e("li",[e("p",[t._v("点击***终端***")]),t._v(" "),e("p",[t._v("此时打开了该容器的控制台,Kuboard 默认使用 /bin/bash 终端程序,而 busybox 镜像中并不包含 /bin/bash,因此您会看到一个如下图所示的错误提示:")])])]),t._v(" "),e("p",[e("img",{attrs:{src:v(255),alt:"image-20190723120050894"}})]),t._v(" "),e("ul",[e("li",[e("p",[t._v("点击***切换到 /bin/sh***")]),t._v(" "),e("p",[t._v("点击屏幕左上角的 "),e("em",[e("strong",[t._v("切换到 /bin/sh")])])])])]),t._v(" "),e("p",[e("img",{attrs:{src:v(256),alt:"image-20190723120104474"}})]),t._v(" "),e("ul",[e("li",[e("p",[t._v("输入 "),e("em",[t._v("export")]),t._v(" 并回车")]),t._v(" "),e("p",[t._v("输入 "),e("em",[t._v("export")]),t._v(" 并回车后,可查看该容器当前的环境变量。您也可以在终端中执行任何容器内部的命令。在您完成容器的部署之后,终端界面是非常有效的问题诊断工具之一。")])])]),t._v(" "),e("p",[e("img",{attrs:{src:v(257),alt:"image-20190723120125425"}})])])},[],!1,null,null,null);_.default=s.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[9],{114:function(t,_,v){t.exports=v.p+"assets/img/image-20190723115721514.bf981ef3.png"},227:function(t,_,v){t.exports=v.p+"assets/img/image-20190723115852719.f1658660.png"},228:function(t,_,v){t.exports=v.p+"assets/img/image-20190723115912645.393d67ff.png"},229:function(t,_,v){t.exports=v.p+"assets/img/image-20190723115940862.dfeacc57.png"},230:function(t,_,v){t.exports=v.p+"assets/img/image-20190723120011972.0f0914c5.png"},231:function(t,_,v){t.exports=v.p+"assets/img/image-20190723120050894.9b1d6350.png"},232:function(t,_,v){t.exports=v.p+"assets/img/image-20190723120104474.617a620a.png"},233:function(t,_,v){t.exports=v.p+"assets/img/image-20190723120125425.a46d7874.png"},367:function(t,_,v){"use strict";v.r(_);var e=v(0),s=Object(e.a)({},function(){var t=this,_=t.$createElement,e=t._self._c||_;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"部署-busybox"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#部署-busybox","aria-hidden":"true"}},[t._v("#")]),t._v(" 部署 busybox")]),t._v(" "),e("h2",{attrs:{id:"前提"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#前提","aria-hidden":"true"}},[t._v("#")]),t._v(" 前提")]),t._v(" "),e("p",[t._v("必须具备如下条件:")]),t._v(" "),e("ul",[e("li",[t._v("Kubernetes 集群")]),t._v(" "),e("li",[t._v("已在集群中安装 Kuboard")])]),t._v(" "),e("p",[t._v("假设您已经进入了 Kuboard 名称空间界面,如下图所示。可参考 "),e("router-link",{attrs:{to:"/guide/cluster/namespace.html#创建名称空间"}},[t._v("创建名称空间")])],1),t._v(" "),e("p",[e("img",{attrs:{src:v(114),alt:"image-20190723115721514"}})]),t._v(" "),e("h2",{attrs:{id:"部署-busybox-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#部署-busybox-2","aria-hidden":"true"}},[t._v("#")]),t._v(" 部署 busybox")]),t._v(" "),e("p",[e("a",{attrs:{href:"https://hub.docker.com/_/busybox",target:"_blank",rel:"noopener noreferrer"}},[t._v("查看 busybox 介绍"),e("OutboundLink")],1)]),t._v(" "),e("p",[t._v("Busybox 是一个非常小巧(不到5M)的容器,此处用它来展示如何将一个 docker image 通过 Kuboard 部署到 kubernetes 集群中。")]),t._v(" "),e("ul",[e("li",[e("p",[t._v("点击 "),e("em",[e("strong",[t._v("创建工作负载按钮")])])]),t._v(" "),e("p",[t._v("填写表单如下:")])])]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("字段名称")]),t._v(" "),e("th",[t._v("填写内容")]),t._v(" "),e("th",[t._v("说明")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("服务类型")]),t._v(" "),e("td",[t._v("Deployment")]),t._v(" "),e("td",[t._v("Kubernetes 的 Deployment 类型")])]),t._v(" "),e("tr",[e("td",[t._v("服务分层")]),t._v(" "),e("td",[t._v("中间件")]),t._v(" "),e("td",[t._v("生成的Kuberenetes对象以 cloud- 作为前缀,"),e("br"),t._v("并显示在中间件分层中")])]),t._v(" "),e("tr",[e("td",[t._v("服务名称")]),t._v(" "),e("td",[t._v("busybox")]),t._v(" "),e("td",[t._v("显示在 Kuboard 中的名称")])]),t._v(" "),e("tr",[e("td",[t._v("副本数量")]),t._v(" "),e("td",[t._v("1")]),t._v(" "),e("td",[t._v("replicas")])]),t._v(" "),e("tr",[e("td",[t._v("容器名称")]),t._v(" "),e("td",[t._v("busybox")]),t._v(" "),e("td")]),t._v(" "),e("tr",[e("td",[t._v("镜像")]),t._v(" "),e("td",[t._v("busybox:1.29")]),t._v(" "),e("td",[t._v("hub.docker.com 中的 busybox 镜像")])]),t._v(" "),e("tr",[e("td",[t._v("Command")]),t._v(" "),e("td",[t._v("sleep")]),t._v(" "),e("td")]),t._v(" "),e("tr",[e("td",[t._v("Command")]),t._v(" "),e("td",[t._v("3600")]),t._v(" "),e("td")])])]),t._v(" "),e("p",[e("img",{attrs:{src:v(227),alt:"image-20190723115852719"}})]),t._v(" "),e("ul",[e("li",[e("p",[t._v("完成表单填写后,点击***保存***")]),t._v(" "),e("p",[t._v("Kuboard 将对表单参数进行校验,通过后,方可执行对集群的变更操作。")])])]),t._v(" "),e("p",[e("img",{attrs:{src:v(228),alt:"image-20190723115912645"}})]),t._v(" "),e("ul",[e("li",[e("p",[t._v("点击***应用***")]),t._v(" "),e("p",[t._v("Kuboard 执行对集群的变更操作,变更的过程中,产生的事件以通知消息的形式显示出来。")])])]),t._v(" "),e("p",[e("img",{attrs:{src:v(229),alt:"image-20190723115940862"}})]),t._v(" "),e("h2",{attrs:{id:"验证工作负载"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#验证工作负载","aria-hidden":"true"}},[t._v("#")]),t._v(" 验证工作负载")]),t._v(" "),e("ul",[e("li",[e("p",[t._v("点击***完成***")]),t._v(" "),e("p",[t._v("点击完成后,可查看工作负载的信息。该界面分成四个区域:")]),t._v(" "),e("ul",[e("li",[e("p",[t._v("页头区")]),t._v(" "),e("p",[t._v("页头区包含对该工作负载(本案例中为 Deployment)的操作按钮。可执行的操作有:"),e("em",[e("strong",[t._v("编辑")])]),t._v(" / "),e("em",[e("strong",[t._v("伸缩")])]),t._v(" / "),e("em",[e("strong",[t._v("刷新")])]),t._v(" / "),e("em",[e("strong",[t._v("删除")])])])]),t._v(" "),e("li",[e("p",[t._v("工作负载基本信息")]),t._v(" "),e("p",[t._v("基本信息区显示了工作负载的 "),e("em",[e("strong",[t._v("基本信息")])]),t._v(" 、"),e("em",[e("strong",[t._v("运行时信息")])]),t._v("、"),e("em",[e("strong",[t._v("访问方式")])]),t._v("(Service)、"),e("em",[e("strong",[t._v("互联网入口")])]),t._v("(Ingress)")])]),t._v(" "),e("li",[e("p",[t._v("容器组列表")]),t._v(" "),e("p",[t._v("容器组列表区显示了该当前对应的所有容器组(Pod),容器组列表区监听集群的动态变化,当您执行伸缩操作、或者删除容器组操作时,无需刷新,就可以查看到最新的容器组信息。")])]),t._v(" "),e("li",[e("p",[t._v("容器组详情")]),t._v(" "),e("p",[t._v("容器组详情区显示了当前选中容器组的信息,其中包括:")]),t._v(" "),e("ul",[e("li",[t._v("容器组相关事件")]),t._v(" "),e("li",[t._v("容器组基本信息,及删除容器组的操作按钮。(此区域还包括容器组相关的监控操作,监控模块在后续的章节中介绍)")]),t._v(" "),e("li",[t._v("容器基本信息,及查看容器日志、打开容器终端的按钮。(此区域还包括容器相关的监控操作,监控模块在后续的章节中介绍)")])])])])])]),t._v(" "),e("p",[e("img",{attrs:{src:v(230),alt:"image-20190723120011972"}})]),t._v(" "),e("ul",[e("li",[e("p",[t._v("点击***终端***")]),t._v(" "),e("p",[t._v("此时打开了该容器的控制台,Kuboard 默认使用 /bin/bash 终端程序,而 busybox 镜像中并不包含 /bin/bash,因此您会看到一个如下图所示的错误提示:")])])]),t._v(" "),e("p",[e("img",{attrs:{src:v(231),alt:"image-20190723120050894"}})]),t._v(" "),e("ul",[e("li",[e("p",[t._v("点击***切换到 /bin/sh***")]),t._v(" "),e("p",[t._v("点击屏幕左上角的 "),e("em",[e("strong",[t._v("切换到 /bin/sh")])])])])]),t._v(" "),e("p",[e("img",{attrs:{src:v(232),alt:"image-20190723120104474"}})]),t._v(" "),e("ul",[e("li",[e("p",[t._v("输入 "),e("em",[t._v("export")]),t._v(" 并回车")]),t._v(" "),e("p",[t._v("输入 "),e("em",[t._v("export")]),t._v(" 并回车后,可查看该容器当前的环境变量。您也可以在终端中执行任何容器内部的命令。在您完成容器的部署之后,终端界面是非常有效的问题诊断工具之一。")])])]),t._v(" "),e("p",[e("img",{attrs:{src:v(233),alt:"image-20190723120125425"}})])])},[],!1,null,null,null);_.default=s.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/app.3b2e3afe.js b/docs/assets/js/app.213a8b8d.js similarity index 88% rename from docs/assets/js/app.3b2e3afe.js rename to docs/assets/js/app.213a8b8d.js index 519bf85..3d2fb67 100644 --- a/docs/assets/js/app.3b2e3afe.js +++ b/docs/assets/js/app.213a8b8d.js @@ -1,4 +1,4 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[0],[]]);!function(t){function e(e){for(var r,a,s=e[0],l=e[1],u=e[2],f=0,p=[];f
'};function o(t,e,n){return tn?n:t}function i(t){return 100*(-1+t)}n.configure=function(t){var e,n;for(e in t)void 0!==(n=t[e])&&t.hasOwnProperty(e)&&(r[e]=n);return this},n.status=null,n.set=function(t){var e=n.isStarted();t=o(t,r.minimum,1),n.status=1===t?null:t;var l=n.render(!e),u=l.querySelector(r.barSelector),c=r.speed,f=r.easing;return l.offsetWidth,a(function(e){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),s(u,function(t,e,n){var o;return(o="translate3d"===r.positionUsing?{transform:"translate3d("+i(t)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+i(t)+"%,0)"}:{"margin-left":i(t)+"%"}).transition="all "+e+"ms "+n,o}(t,c,f)),1===t?(s(l,{transition:"none",opacity:1}),l.offsetWidth,setTimeout(function(){s(l,{transition:"all "+c+"ms linear",opacity:0}),setTimeout(function(){n.remove(),e()},c)},c)):setTimeout(e,c)}),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var t=function(){setTimeout(function(){n.status&&(n.trickle(),t())},r.trickleSpeed)};return r.trickle&&t(),this},n.done=function(t){return t||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(t){var e=n.status;return e?("number"!=typeof t&&(t=(1-e)*o(Math.random()*e,.1,.95)),e=o(e+t,0,.994),n.set(e)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},t=0,e=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===e&&n.start(),t++,e++,r.always(function(){0==--e?(t=0,n.done()):n.set((t-e)/t)}),this):this},n.render=function(t){if(n.isRendered())return document.getElementById("nprogress");u(document.documentElement,"nprogress-busy");var e=document.createElement("div");e.id="nprogress",e.innerHTML=r.template;var o,a=e.querySelector(r.barSelector),l=t?"-100":i(n.status||0),c=document.querySelector(r.parent);return s(a,{transition:"all 0 linear",transform:"translate3d("+l+"%,0,0)"}),r.showSpinner||(o=e.querySelector(r.spinnerSelector))&&p(o),c!=document.body&&u(c,"nprogress-custom-parent"),c.appendChild(e),e},n.remove=function(){c(document.documentElement,"nprogress-busy"),c(document.querySelector(r.parent),"nprogress-custom-parent");var t=document.getElementById("nprogress");t&&p(t)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var t=document.body.style,e="WebkitTransform"in t?"Webkit":"MozTransform"in t?"Moz":"msTransform"in t?"ms":"OTransform"in t?"O":"";return e+"Perspective"in t?"translate3d":e+"Transform"in t?"translate":"margin"};var a=function(){var t=[];function e(){var n=t.shift();n&&n(e)}return function(n){t.push(n),1==t.length&&e()}}(),s=function(){var t=["Webkit","O","Moz","ms"],e={};function n(n){return n=n.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,function(t,e){return e.toUpperCase()}),e[n]||(e[n]=function(e){var n=document.body.style;if(e in n)return e;for(var r,o=t.length,i=e.charAt(0).toUpperCase()+e.slice(1);o--;)if((r=t[o]+i)in n)return r;return e}(n))}function r(t,e,r){e=n(e),t.style[e]=r}return function(t,e){var n,o,i=arguments;if(2==i.length)for(n in e)void 0!==(o=e[n])&&e.hasOwnProperty(n)&&r(t,n,o);else r(t,i[1],i[2])}}();function l(t,e){var n="string"==typeof t?t:f(t);return n.indexOf(" "+e+" ")>=0}function u(t,e){var n=f(t),r=n+e;l(n,e)||(t.className=r.substring(1))}function c(t,e){var n,r=f(t);l(t,e)&&(n=r.replace(" "+e+" "," "),t.className=n.substring(1,n.length-1))}function f(t){return(" "+(t.className||"")+" ").replace(/\s+/gi," ")}function p(t){t&&t.parentNode&&t.parentNode.removeChild(t)}return n})?r.call(e,n,e,t):r)||(t.exports=o)},function(t,e,n){var r=n(6),o=n(26),i=n(13),a=Object.defineProperty;e.f=n(2)?Object.defineProperty:function(t,e,n){if(r(t),e=i(e,!0),r(n),o)try{return a(t,e,n)}catch(t){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(t[e]=n.value),t}},function(t,e,n){var r=n(34),o=n(16);t.exports=function(t){return r(o(t))}},function(t,e){var n=t.exports={version:"2.6.9"};"number"==typeof __e&&(__e=n)},function(t,e,n){var r=n(3);t.exports=function(t,e){if(!r(t))return t;var n,o;if(e&&"function"==typeof(n=t.toString)&&!r(o=n.call(t)))return o;if("function"==typeof(n=t.valueOf)&&!r(o=n.call(t)))return o;if(!e&&"function"==typeof(n=t.toString)&&!r(o=n.call(t)))return o;throw TypeError("Can't convert object to primitive value")}},function(t,e){t.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(t,e,n){var r=n(10),o=n(20);t.exports=n(2)?function(t,e,n){return r.f(t,e,o(1,n))}:function(t,e,n){return t[e]=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(1),o=n(15),i=n(5),a=n(24)("src"),s=n(49),l=(""+s).split("toString");n(12).inspectSource=function(t){return s.call(t)},(t.exports=function(t,e,n,s){var u="function"==typeof n;u&&(i(n,"name")||o(n,"name",e)),t[e]!==n&&(u&&(i(n,a)||o(n,a,t[e]?""+t[e]:l.join(String(e)))),t===r?t[e]=n:s?t[e]?t[e]=n:o(t,e,n):(delete t[e],o(t,e,n)))})(Function.prototype,"toString",function(){return"function"==typeof this&&this[a]||s.call(this)})},function(t,e){var n={}.toString;t.exports=function(t){return n.call(t).slice(8,-1)}},function(t,e,n){var r=n(46);t.exports=function(t,e,n){if(r(t),void 0===e)return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,r){return t.call(e,n,r)};case 3:return function(n,r,o){return t.call(e,n,r,o)}}return function(){return t.apply(e,arguments)}}},function(t,e){t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},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,n){var r=n(23)("keys"),o=n(24);t.exports=function(t){return r[t]||(r[t]=o(t))}},function(t,e,n){var r=n(12),o=n(1),i=o["__core-js_shared__"]||(o["__core-js_shared__"]={});(t.exports=function(t,e){return i[t]||(i[t]=void 0!==e?e:{})})("versions",[]).push({version:r.version,mode:n(35)?"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,n){var r=n(47),o=n(20),i=n(11),a=n(13),s=n(5),l=n(26),u=Object.getOwnPropertyDescriptor;e.f=n(2)?u:function(t,e){if(t=i(t),e=a(e,!0),l)try{return u(t,e)}catch(t){}if(s(t,e))return o(!r.f.call(t,e),t[e])}},function(t,e,n){t.exports=!n(2)&&!n(4)(function(){return 7!=Object.defineProperty(n(27)("div"),"a",{get:function(){return 7}}).a})},function(t,e,n){var r=n(3),o=n(1).document,i=r(o)&&r(o.createElement);t.exports=function(t){return i?o.createElement(t):{}}},function(t,e,n){var r=n(5),o=n(11),i=n(39)(!1),a=n(22)("IE_PROTO");t.exports=function(t,e){var n,s=o(t),l=0,u=[];for(n in s)n!=a&&r(s,n)&&u.push(n);for(;e.length>l;)r(s,n=e[l++])&&(~i(u,n)||u.push(n));return u}},function(t,e){var n="Expected a function",r=NaN,o="[object Symbol]",i=/^\s+|\s+$/g,a=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,l=/^0o[0-7]+$/i,u=parseInt,c="object"==typeof global&&global&&global.Object===Object&&global,f="object"==typeof self&&self&&self.Object===Object&&self,p=c||f||Function("return this")(),d=Object.prototype.toString,h=Math.max,v=Math.min,m=function(){return p.Date.now()};function g(t,e,r){var o,i,a,s,l,u,c=0,f=!1,p=!1,d=!0;if("function"!=typeof t)throw new TypeError(n);function g(e){var n=o,r=i;return o=i=void 0,c=e,s=t.apply(r,n)}function _(t){var n=t-u;return void 0===u||n>=e||n<0||p&&t-c>=a}function w(){var t=m();if(_(t))return k(t);l=setTimeout(w,function(t){var n=e-(t-u);return p?v(n,a-(t-c)):n}(t))}function k(t){return l=void 0,d&&o?g(t):(o=i=void 0,s)}function x(){var t=m(),n=_(t);if(o=arguments,i=this,u=t,n){if(void 0===l)return function(t){return c=t,l=setTimeout(w,e),f?g(t):s}(u);if(p)return l=setTimeout(w,e),g(u)}return void 0===l&&(l=setTimeout(w,e)),s}return e=b(e)||0,y(r)&&(f=!!r.leading,a=(p="maxWait"in r)?h(b(r.maxWait)||0,e):a,d="trailing"in r?!!r.trailing:d),x.cancel=function(){void 0!==l&&clearTimeout(l),c=0,o=u=i=l=void 0},x.flush=function(){return void 0===l?s:k(m())},x}function y(t){var e=typeof t;return!!t&&("object"==e||"function"==e)}function b(t){if("number"==typeof t)return t;if(function(t){return"symbol"==typeof t||function(t){return!!t&&"object"==typeof t}(t)&&d.call(t)==o}(t))return r;if(y(t)){var e="function"==typeof t.valueOf?t.valueOf():t;t=y(e)?e+"":e}if("string"!=typeof t)return 0===t?t:+t;t=t.replace(i,"");var n=s.test(t);return n||l.test(t)?u(t.slice(2),n?2:8):a.test(t)?r:+t}t.exports=function(t,e,r){var o=!0,i=!0;if("function"!=typeof t)throw new TypeError(n);return y(r)&&(o="leading"in r?!!r.leading:o,i="trailing"in r?!!r.trailing:i),g(t,e,{leading:o,maxWait:e,trailing:i})}},function(t,e){var n="Expected a function",r=NaN,o="[object Symbol]",i=/^\s+|\s+$/g,a=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,l=/^0o[0-7]+$/i,u=parseInt,c="object"==typeof global&&global&&global.Object===Object&&global,f="object"==typeof self&&self&&self.Object===Object&&self,p=c||f||Function("return this")(),d=Object.prototype.toString,h=Math.max,v=Math.min,m=function(){return p.Date.now()};function g(t){var e=typeof t;return!!t&&("object"==e||"function"==e)}function y(t){if("number"==typeof t)return t;if(function(t){return"symbol"==typeof t||function(t){return!!t&&"object"==typeof t}(t)&&d.call(t)==o}(t))return r;if(g(t)){var e="function"==typeof t.valueOf?t.valueOf():t;t=g(e)?e+"":e}if("string"!=typeof t)return 0===t?t:+t;t=t.replace(i,"");var n=s.test(t);return n||l.test(t)?u(t.slice(2),n?2:8):a.test(t)?r:+t}t.exports=function(t,e,r){var o,i,a,s,l,u,c=0,f=!1,p=!1,d=!0;if("function"!=typeof t)throw new TypeError(n);function b(e){var n=o,r=i;return o=i=void 0,c=e,s=t.apply(r,n)}function _(t){var n=t-u;return void 0===u||n>=e||n<0||p&&t-c>=a}function w(){var t=m();if(_(t))return k(t);l=setTimeout(w,function(t){var n=e-(t-u);return p?v(n,a-(t-c)):n}(t))}function k(t){return l=void 0,d&&o?b(t):(o=i=void 0,s)}function x(){var t=m(),n=_(t);if(o=arguments,i=this,u=t,n){if(void 0===l)return function(t){return c=t,l=setTimeout(w,e),f?b(t):s}(u);if(p)return l=setTimeout(w,e),b(u)}return void 0===l&&(l=setTimeout(w,e)),s}return e=y(e)||0,g(r)&&(f=!!r.leading,a=(p="maxWait"in r)?h(y(r.maxWait)||0,e):a,d="trailing"in r?!!r.trailing:d),x.cancel=function(){void 0!==l&&clearTimeout(l),c=0,o=u=i=l=void 0},x.flush=function(){return void 0===l?s:k(m())},x}},function(t,e,n){var r=n(1),o=n(12),i=n(15),a=n(17),s=n(19),l=function(t,e,n){var u,c,f,p,d=t&l.F,h=t&l.G,v=t&l.S,m=t&l.P,g=t&l.B,y=h?r:v?r[e]||(r[e]={}):(r[e]||{}).prototype,b=h?o:o[e]||(o[e]={}),_=b.prototype||(b.prototype={});for(u in h&&(n=e),n)f=((c=!d&&y&&void 0!==y[u])?y:n)[u],p=g&&c?s(f,r):m&&"function"==typeof f?s(Function.call,f):f,y&&a(y,u,f,t&l.U),b[u]!=f&&i(b,u,p),m&&_[u]!=f&&(_[u]=f)};r.core=o,l.F=1,l.G=2,l.S=4,l.P=8,l.B=16,l.W=32,l.U=64,l.R=128,t.exports=l},function(t,e,n){var r=n(21),o=Math.min;t.exports=function(t){return t>0?o(r(t),9007199254740991):0}},function(t,e,n){var r=n(28),o=n(14);t.exports=Object.keys||function(t){return r(t,o)}},function(t,e,n){var r=n(18);t.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==r(t)?t.split(""):Object(t)}},function(t,e){t.exports=!1},function(t,e,n){var r=n(6),o=n(51),i=n(14),a=n(22)("IE_PROTO"),s=function(){},l=function(){var t,e=n(27)("iframe"),r=i.length;for(e.style.display="none",n(52).appendChild(e),e.src="javascript:",(t=e.contentWindow.document).open(),t.write(" + diff --git a/docs/guide/cluster/namespace.html b/docs/guide/cluster/namespace.html index fcb5070..7689e9c 100644 --- a/docs/guide/cluster/namespace.html +++ b/docs/guide/cluster/namespace.html @@ -7,8 +7,8 @@ - - + +

名称空间管理

创建名称空间

前提

必须具备如下条件:

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

image-20190723105606081

准备

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

并填写:

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

image-20190723105644937

  • 点击 保存

image-20190723105722999

  • 点击 应用

image-20190723105748435

  • 点击 完成

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

image-20190723105809872

  • 点击 example 名称空间

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

image-20190723105830318

更新时间: 2019-07-25 06:22:52
Copyright © 2019-present HuanQing Shao
- + diff --git a/docs/guide/cluster/storage.html b/docs/guide/cluster/storage.html index 271bb3f..21487af 100644 --- a/docs/guide/cluster/storage.html +++ b/docs/guide/cluster/storage.html @@ -7,8 +7,8 @@ - - + +

存储空间管理

创建存储类

前提

必须具备如下条件:

  • 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 的指令复制下来后,如下所示:

@@ -22,6 +22,6 @@ sudo mount -t nfs -o vers=4,minorversion=0,noresvport Copyright © 2019-present HuanQing Shao
- + diff --git a/docs/guide/diagonize/events.html b/docs/guide/diagonize/events.html index b18fa38..aac668f 100644 --- a/docs/guide/diagonize/events.html +++ b/docs/guide/diagonize/events.html @@ -7,8 +7,8 @@ - - + +

集群事件

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

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

错误事件提示

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

image-20190721104153954

全局事件

查看全局事件

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

image-20190721101812895

删除事件

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

image-20190721101954560

  • 点击 确定

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

微服务上下文相关的事件

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

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

image-20190721103324863

更新时间: 2019-07-25 06:22:52
Copyright © 2019-present HuanQing Shao
- + diff --git a/docs/guide/diagonize/logs.html b/docs/guide/diagonize/logs.html index 9c4a385..ddff2c1 100644 --- a/docs/guide/diagonize/logs.html +++ b/docs/guide/diagonize/logs.html @@ -7,8 +7,8 @@ - - + +

日志及终端

日志

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

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

image-20190721104348908

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

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

image-20190721104415732

终端

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

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

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

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

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

image-20190721104522870

更新时间: 2019-07-25 06:22:52
Copyright © 2019-present HuanQing Shao
- + diff --git a/docs/guide/diagonize/port-forward.html b/docs/guide/diagonize/port-forward.html index 5792c8e..5f35704 100644 --- a/docs/guide/diagonize/port-forward.html +++ b/docs/guide/diagonize/port-forward.html @@ -7,8 +7,8 @@ - - + +

端口转发

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

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

Feature planned

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

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

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

更新时间: 2019-07-25 06:22:52
Copyright © 2019-present HuanQing Shao
- + diff --git a/docs/guide/example/busybox.html b/docs/guide/example/busybox.html index 3b6a2ea..b378d9a 100644 --- a/docs/guide/example/busybox.html +++ b/docs/guide/example/busybox.html @@ -7,8 +7,8 @@ - - + +

部署 busybox

前提

必须具备如下条件:

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

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

image-20190723115721514

部署 busybox

查看 busybox 介绍

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

  • 点击 创建工作负载按钮

    填写表单如下:

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

image-20190723115852719

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

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

image-20190723115912645

  • 点击***应用***

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

image-20190723115940862

验证工作负载

  • 点击***完成***

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

    • 页头区

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

    • 工作负载基本信息

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

    • 容器组列表

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

    • 容器组详情

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

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

image-20190723120011972

  • 点击***终端***

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

image-20190723120050894

  • 点击***切换到 /bin/sh***

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

image-20190723120104474

  • 输入 export 并回车

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

image-20190723120125425

更新时间: 2019-07-25 06:22:52
Copyright © 2019-present HuanQing Shao
- + diff --git a/docs/guide/example/import.html b/docs/guide/example/import.html index 6ad05c3..f52035d 100644 --- a/docs/guide/example/import.html +++ b/docs/guide/example/import.html @@ -7,8 +7,8 @@ - - + +

导入 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
@@ -53,6 +53,6 @@ com.netflix.discovery.shared.transport.TransportException: Cannot execute reques
         
         →
       

Copyright © 2019-present HuanQing Shao
- + diff --git a/docs/guide/example/monitor.html b/docs/guide/example/monitor.html index b9f0564..2380364 100644 --- a/docs/guide/example/monitor.html +++ b/docs/guide/example/monitor.html @@ -7,8 +7,8 @@ - - + +

监控 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
@@ -21,6 +21,6 @@
         
         →
       

Copyright © 2019-present HuanQing Shao
- + diff --git a/docs/guide/index.html b/docs/guide/index.html index 32a2a50..bbb7de1 100644 --- a/docs/guide/index.html +++ b/docs/guide/index.html @@ -7,8 +7,8 @@ - - + +

使用手册

Kuboard 的设计目标

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

熟悉 Kuboard 的最佳途径

Kuboard 可用于

  • 管理 Kubernetes 集群
  • 管理部署于 Kubernetes 的微服务
  • 诊断集群中的问题
  • 监控部署于 Kubernetes 的微服务
更新时间: 2019-07-25 06:22:52
Copyright © 2019-present HuanQing Shao
- + diff --git a/docs/guide/monitor/apis.html b/docs/guide/monitor/apis.html index ed88543..a6b431d 100644 --- a/docs/guide/monitor/apis.html +++ b/docs/guide/monitor/apis.html @@ -7,8 +7,8 @@ - - + +

自定义监控套件

文档建设中...

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

监控套件

文档建设中...

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

日常调整

前提

必须具备如下条件:

  • Kubernetes 集群

  • 已在集群中安装 Kuboard

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

image-20190720232405147

批量删除容器组

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

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

Copyright © 2019-present HuanQing Shao
- + diff --git a/docs/guide/namespace/configMap.html b/docs/guide/namespace/configMap.html index 2baf226..75b5052 100644 --- a/docs/guide/namespace/configMap.html +++ b/docs/guide/namespace/configMap.html @@ -7,8 +7,8 @@ - - + +

配置

配置: Kubernetes ConfigMap

查看配置列表

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

image-20190721110355464

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

点击 配置 可以刷新该列表

image-20190721112353077

创建配置

  • 点击 配置 / 创建

    填写表单如下所示:

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

image-20190721112624128

  • 点击 保存

    配置信息创建成功

image-20190721113050608

查看/编辑/删除 配置

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

image-20190721113155991

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

更新时间: 2019-07-25 06:22:52
Copyright © 2019-present HuanQing Shao
- + diff --git a/docs/guide/namespace/index.html b/docs/guide/namespace/index.html index 5531b89..e3c853b 100644 --- a/docs/guide/namespace/index.html +++ b/docs/guide/namespace/index.html @@ -7,11 +7,11 @@ - - + +

应用管理

创建工作负载

删除工作负载

伸缩

升级工作负载版本

环境迁移

导出

导入

更新时间: 2019-07-25 06:22:52
Copyright © 2019-present HuanQing Shao
- + diff --git a/docs/guide/namespace/multi-env.html b/docs/guide/namespace/multi-env.html index 0b57c8e..b6a896f 100644 --- a/docs/guide/namespace/multi-env.html +++ b/docs/guide/namespace/multi-env.html @@ -7,8 +7,8 @@ - - + +

多环境

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

  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

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

    ---
    @@ -42,6 +42,6 @@
             
             →
           

    Copyright © 2019-present HuanQing Shao
- + diff --git a/docs/guide/namespace/pvc.html b/docs/guide/namespace/pvc.html index 0f1d52c..83544c1 100644 --- a/docs/guide/namespace/pvc.html +++ b/docs/guide/namespace/pvc.html @@ -7,8 +7,8 @@ - - + +

存储卷声明

存储卷声明: Kubernetes Persistent Volume Claim

查看存储卷声明列表

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

image-20190721110355464

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

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

image-20190721113708689

创建存储卷声明

  • 点击 存储卷声明 / 创建

    填写表单如下:

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

image-20190721113810235

  • 点击 保存

    存储卷声明创建成功

image-20190721114112644

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

  • 点击 my-pvc

image-20190721114211751

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

更新时间: 2019-07-25 06:22:52
Copyright © 2019-present HuanQing Shao
- + diff --git a/docs/guide/namespace/secrets.html b/docs/guide/namespace/secrets.html index 13fbf12..dcc8625 100644 --- a/docs/guide/namespace/secrets.html +++ b/docs/guide/namespace/secrets.html @@ -7,8 +7,8 @@ - - + +

Secrets

查看 Secrets 列表

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

image-20190721110355464

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

点击 Secrets 可以刷新该列表

image-20190721110543437

创建 Secrets

  • 点击 Secrets / 创建

    填写表单如下:

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

image-20190721111011798

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

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

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

image-20190721111540512

查看/编辑/删除 Secrets

  • 点击 my-docker-repository

image-20190721111642221

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

更新时间: 2019-07-25 06:22:52
Copyright © 2019-present HuanQing Shao
- + diff --git a/docs/guide/namespace/workload.html b/docs/guide/namespace/workload.html index a23eb18..cc2b22b 100644 --- a/docs/guide/namespace/workload.html +++ b/docs/guide/namespace/workload.html @@ -7,8 +7,8 @@ - - + +

工作负载

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

请参考 创建 busybox

伸缩

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

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

image-20190722223454676

  • 点击 伸缩 按钮

    填写表单

    副本数: 目标容器组数量

image-20190722223551308

  • 点击 确定 按钮

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

image-20190722223605920

删除容器组

  • 点击 删除容器组 按钮

    可删除该容器组。

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

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

image-20190722231246540

诊断问题

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

事件: Kubernetes 部署相关问题

如下图所示,图中提示

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

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

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

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

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

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

image-20190722224029397

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

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

image-20190722225347491

  • 点击其中的 日志 按钮

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

image-20190722225454029

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

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

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

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

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

  • 点击 终端 按钮

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

image-20190722230511430

适用场景

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

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

开发人员 可以:

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

Kuboard

@@ -18,6 +18,6 @@ 查看文档 →

降低 Kubernetes 门槛

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

直观显示微服务架构

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

上下文关联监控

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

- + diff --git a/docs/install/index.html b/docs/install/index.html index a6077bb..411acac 100644 --- a/docs/install/index.html +++ b/docs/install/index.html @@ -7,8 +7,8 @@ - - + +

概述

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

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

如果您当下没有 Kubernetes 集群:


在线提问

Kuboard 兴趣群二维码

更新时间: 2019-07-25 06:22:52
Copyright © 2019-present HuanQing Shao
- + diff --git a/docs/install/install-common-ingress.html b/docs/install/install-common-ingress.html index 34157bc..8084931 100644 --- a/docs/install/install-common-ingress.html +++ b/docs/install/install-common-ingress.html @@ -7,13 +7,13 @@ - - + +

安装 Ingress Controller

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

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

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

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

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

在 apple-master-a-1 上执行

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

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

创建负载均衡 ELB:

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

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

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

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

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

配置域名解析

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

验证配置

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

更新时间: 2019-07-25 06:22:52
Copyright © 2019-present HuanQing Shao
- + diff --git a/docs/install/install-common-vm.html b/docs/install/install-common-vm.html index 7e0c979..b00298c 100644 --- a/docs/install/install-common-vm.html +++ b/docs/install/install-common-vm.html @@ -7,8 +7,8 @@ - - + +

制作标准机镜像

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

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

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

  • docker
  • gitlab-runner
  • kubernetes images

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

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

安装docker

卸载旧版本

sudo yum remove docker \
@@ -70,6 +70,6 @@ docker tag da86e6ba6ca1 k8s.gcr.io/pause:3.1
 docker tag eb516548c180 k8s.gcr.io/coredns:1.3.1
 docker tag 2c4adeb21b4f k8s.gcr.io/etcd:3.3.10
 

制作镜像

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

更新时间: 2019-07-25 06:22:52
Copyright © 2019-present HuanQing Shao
- + diff --git a/docs/install/install-dashboard.html b/docs/install/install-dashboard.html index 4e9c073..c81a5dc 100644 --- a/docs/install/install-dashboard.html +++ b/docs/install/install-dashboard.html @@ -7,8 +7,8 @@ - - + +

安装 kuboard

前提

安装 kuboard 时,假设您已经:

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

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

领取阿里云最高2000元红包

兼容性

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

Kubernetes 安装方式

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

安装

获取并修改yaml文件

wget https://raw.githubusercontent.com/eip-work/eip-monitor-repository/master/dashboard/kuboard.yaml
@@ -34,6 +34,6 @@ token: eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2Nv
          

Copyright © 2019-present HuanQing Shao
- + diff --git a/docs/install/install-k8s.html b/docs/install/install-k8s.html index ef5b917..5640e93 100644 --- a/docs/install/install-k8s.html +++ b/docs/install/install-k8s.html @@ -7,8 +7,8 @@ - - + +

安装 Kubernetes 用于测试

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

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

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

领取阿里云最高2000元红包

Kuboard 在线体验 @@ -101,6 +101,6 @@ kubeadm join apiserver.demo:6443 --token mpf →

Copyright © 2019-present HuanQing Shao
- + diff --git a/docs/install/install-kind.html b/docs/install/install-kind.html index 67bc5b3..8fcff43 100644 --- a/docs/install/install-kind.html +++ b/docs/install/install-kind.html @@ -7,8 +7,8 @@ - - + +

在单机使用 kind 安装 Kubernetes

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

环境简介

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

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

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

kind 简介与安装

kind:https://kind.sigs.k8s.io/ 是一个使用 Docker 容器运行本地 Kubernetes 集群的工具。 @@ -37,6 +37,6 @@ sudo mv ./kubectl /usr/local/bin/kubectl

等待 kuboard 启动成功

访问 kuboard 页面

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

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

获取登录 token

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

1563698644736

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

1563698714557

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

1563698865448

更新时间: 2019-07-25 06:22:52
Copyright © 2019-present HuanQing Shao
- + diff --git a/docs/install/install-kubernetes.html b/docs/install/install-kubernetes.html index b566580..bbf3b7b 100644 --- a/docs/install/install-kubernetes.html +++ b/docs/install/install-kubernetes.html @@ -7,8 +7,8 @@ - - + +

安装 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 \
@@ -119,6 +119,6 @@ kubectl apply -f https://raw.githubusercontent.com/eip-work/eip-monitor-reposito
         
         →
       

Copyright © 2019-present HuanQing Shao
- + diff --git a/docs/overview/concepts.html b/docs/overview/concepts.html index 072e5f2..1cdd5ea 100644 --- a/docs/overview/concepts.html +++ b/docs/overview/concepts.html @@ -7,8 +7,8 @@ - - + +

如何降低K8S学习门槛 🎉

Kubernetes 学习门槛在哪儿

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

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

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

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

降低 Kubernetes 学习门槛

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

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

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

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

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

工作负载编辑器设计

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

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

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

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

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

工作负载编辑器介绍

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

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

image-20190722165648180

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

image-20190722162249531

1. 基本信息

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

  • Deployment
  • StatefulSet
  • DaemonSet

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

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

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

Kubernetes Workload Controller 主要用于:

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

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

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

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

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

image-20190722172356943

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

2. 数据卷

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

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

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

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

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

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

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

image-20190722182005060

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

3. 身份信息

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

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

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

image-20190722183329825

4. 容器

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

Copyright © 2019-present HuanQing Shao
- + diff --git a/docs/overview/index.html b/docs/overview/index.html index 3a59c08..1f75e59 100644 --- a/docs/overview/index.html +++ b/docs/overview/index.html @@ -7,8 +7,8 @@ - - + +

Kuboard

A cool Kubernetes dashboard.

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

Kuboard 的主要特点:

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

image-20190716234146419

Demo

Kuboard 在线体验 @@ -17,6 +17,6 @@ →

Copyright © 2019-present HuanQing Shao
- + diff --git a/docs/overview/why-kuboard.html b/docs/overview/why-kuboard.html index 823514a..11875b0 100644 --- a/docs/overview/why-kuboard.html +++ b/docs/overview/why-kuboard.html @@ -7,8 +7,8 @@ - - + +

为什么选择 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 中,名称空间的展示形式如下:

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

  • 展现层 @@ -26,6 +26,6 @@ →

Copyright © 2019-present HuanQing Shao
- + diff --git a/docs/support/index.html b/docs/support/index.html index 9f7657b..7a511ee 100644 --- a/docs/support/index.html +++ b/docs/support/index.html @@ -7,11 +7,11 @@ - - + +

提交问题

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

在线提问

QQ 群

kuboard_qq

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