From 6dcc548e27b8b33a7b4c09dadb18357bbe9d064e Mon Sep 17 00:00:00 2001 From: bjwswang Date: Wed, 9 Aug 2023 08:34:41 +0000 Subject: [PATCH] deploy: bdc05ae265fa07bf6fdc45efcc435e27bb6ea895 --- 404.html | 4 ++-- assets/js/791926a5.00bf0be8.js | 1 + assets/js/791926a5.b95f584b.js | 1 - assets/js/{935f2afb.032dc2a8.js => 935f2afb.e8481ca4.js} | 2 +- assets/js/ad895e75.a7b4397d.js | 1 - assets/js/ad895e75.d0e05bf9.js | 1 + ...{runtime~main.a11605a9.js => runtime~main.068ce0c8.js} | 2 +- blog/archive/index.html | 4 ++-- blog/first-blog-post/index.html | 4 ++-- blog/index.html | 4 ++-- blog/long-blog-post/index.html | 4 ++-- blog/mdx-blog-post/index.html | 4 ++-- blog/tags/docusaurus/index.html | 4 ++-- blog/tags/facebook/index.html | 4 ++-- blog/tags/hello/index.html | 4 ++-- blog/tags/hola/index.html | 4 ++-- blog/tags/index.html | 4 ++-- blog/welcome/index.html | 4 ++-- docs/FAQ/index.html | 8 ++++---- .../configuration/3rd-party-account/index.html | 4 ++-- docs/building-base/configuration/audit-config/index.html | 4 ++-- .../building-base/configuration/customize-menu/index.html | 4 ++-- .../configuration/customize-portal/index.html | 4 ++-- .../configuration/oidc-integration/index.html | 4 ++-- docs/building-base/intro/index.html | 4 ++-- "docs/category/\344\275\216\347\240\201kit/index.html" | 4 ++-- "docs/category/\345\206\205\346\240\270kit/index.html" | 4 ++-- "docs/category/\345\272\225\345\272\247kit/index.html" | 4 ++-- .../index.html" | 4 ++-- "docs/category/\346\246\202\345\277\265/index.html" | 4 ++-- .../index.html" | 4 ++-- .../index.html" | 4 ++-- .../index.html" | 4 ++-- docs/contribute/index.html | 4 ++-- docs/core/concepts/component/index.html | 4 ++-- docs/core/concepts/componentplan/index.html | 4 ++-- docs/core/concepts/repository/index.html | 4 ++-- docs/core/concepts/subscription/index.html | 4 ++-- docs/core/intro/index.html | 4 ++-- docs/core/rating/index.html | 4 ++-- docs/core/roadmap/index.html | 4 ++-- docs/core/userguide/privatecluster/index.html | 4 ++-- docs/intro/index.html | 4 ++-- .../development/backend-operator/index.html | 4 ++-- docs/lowcode-development/development/bff-apis/index.html | 4 ++-- .../development/develop-hello-world/index.html | 4 ++-- docs/lowcode-development/development/frontend/index.html | 4 ++-- docs/lowcode-development/development_pattern/index.html | 4 ++-- docs/lowcode-development/intro/index.html | 4 ++-- docs/quick-start/buildingbase_quickstart/index.html | 4 ++-- docs/quick-start/core_quickstart/index.html | 6 +++--- docs/quick-start/prerequisite/index.html | 4 ++-- en/404.html | 4 ++-- en/assets/js/791926a5.c805817d.js | 1 - en/assets/js/791926a5.fffb601c.js | 1 + .../js/{935f2afb.6b738667.js => 935f2afb.eb9c6d9f.js} | 2 +- en/assets/js/ad895e75.59c72d26.js | 1 - en/assets/js/ad895e75.c6c25b05.js | 1 + ...{runtime~main.76702a4e.js => runtime~main.86dc9b1a.js} | 2 +- en/blog/archive/index.html | 4 ++-- en/blog/first-blog-post/index.html | 4 ++-- en/blog/index.html | 4 ++-- en/blog/long-blog-post/index.html | 4 ++-- en/blog/mdx-blog-post/index.html | 4 ++-- en/blog/tags/docusaurus/index.html | 4 ++-- en/blog/tags/facebook/index.html | 4 ++-- en/blog/tags/hello/index.html | 4 ++-- en/blog/tags/hola/index.html | 4 ++-- en/blog/tags/index.html | 4 ++-- en/blog/welcome/index.html | 4 ++-- en/docs/FAQ/index.html | 8 ++++---- .../configuration/3rd-party-account/index.html | 4 ++-- .../building-base/configuration/audit-config/index.html | 4 ++-- .../building-base/configuration/customize-menu/index.html | 4 ++-- .../configuration/customize-portal/index.html | 4 ++-- .../configuration/oidc-integration/index.html | 4 ++-- en/docs/building-base/intro/index.html | 4 ++-- "en/docs/category/\344\275\216\347\240\201kit/index.html" | 4 ++-- "en/docs/category/\345\206\205\346\240\270kit/index.html" | 4 ++-- "en/docs/category/\345\272\225\345\272\247kit/index.html" | 4 ++-- .../index.html" | 4 ++-- "en/docs/category/\346\246\202\345\277\265/index.html" | 4 ++-- .../index.html" | 4 ++-- .../index.html" | 4 ++-- .../index.html" | 4 ++-- en/docs/contribute/index.html | 4 ++-- en/docs/core/concepts/component/index.html | 4 ++-- en/docs/core/concepts/componentplan/index.html | 4 ++-- en/docs/core/concepts/repository/index.html | 4 ++-- en/docs/core/concepts/subscription/index.html | 4 ++-- en/docs/core/intro/index.html | 4 ++-- en/docs/core/rating/index.html | 4 ++-- en/docs/core/roadmap/index.html | 4 ++-- en/docs/core/userguide/privatecluster/index.html | 4 ++-- en/docs/intro/index.html | 4 ++-- .../development/backend-operator/index.html | 4 ++-- .../lowcode-development/development/bff-apis/index.html | 4 ++-- .../development/develop-hello-world/index.html | 4 ++-- .../lowcode-development/development/frontend/index.html | 4 ++-- .../lowcode-development/development_pattern/index.html | 4 ++-- en/docs/lowcode-development/intro/index.html | 4 ++-- en/docs/quick-start/buildingbase_quickstart/index.html | 4 ++-- en/docs/quick-start/core_quickstart/index.html | 6 +++--- en/docs/quick-start/prerequisite/index.html | 4 ++-- en/index.html | 4 ++-- en/markdown-page/index.html | 4 ++-- index.html | 4 ++-- markdown-page/index.html | 4 ++-- 108 files changed, 206 insertions(+), 206 deletions(-) create mode 100644 assets/js/791926a5.00bf0be8.js delete mode 100644 assets/js/791926a5.b95f584b.js rename assets/js/{935f2afb.032dc2a8.js => 935f2afb.e8481ca4.js} (99%) delete mode 100644 assets/js/ad895e75.a7b4397d.js create mode 100644 assets/js/ad895e75.d0e05bf9.js rename assets/js/{runtime~main.a11605a9.js => runtime~main.068ce0c8.js} (97%) delete mode 100644 en/assets/js/791926a5.c805817d.js create mode 100644 en/assets/js/791926a5.fffb601c.js rename en/assets/js/{935f2afb.6b738667.js => 935f2afb.eb9c6d9f.js} (99%) delete mode 100644 en/assets/js/ad895e75.59c72d26.js create mode 100644 en/assets/js/ad895e75.c6c25b05.js rename en/assets/js/{runtime~main.76702a4e.js => runtime~main.86dc9b1a.js} (97%) diff --git a/404.html b/404.html index 0c34f279e..17a8b9948 100644 --- a/404.html +++ b/404.html @@ -5,13 +5,13 @@ 找不到页面 | Framework as a Building Block for Kubernetes - +
跳到主要内容

找不到页面

我们找不到您要找的页面。

请联系原始链接来源网站的所有者,并告知他们链接已损坏。

- + \ No newline at end of file diff --git a/assets/js/791926a5.00bf0be8.js b/assets/js/791926a5.00bf0be8.js new file mode 100644 index 000000000..fca7c6238 --- /dev/null +++ b/assets/js/791926a5.00bf0be8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[6741],{3905:(e,n,t)=>{t.d(n,{Zo:()=>b,kt:()=>k});var a=t(7294);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function l(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function o(e){for(var n=1;n=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var p=a.createContext({}),s=function(e){var n=a.useContext(p),t=n;return e&&(t="function"==typeof e?e(n):o(o({},n),e)),t},b=function(e){var n=s(e.components);return a.createElement(p.Provider,{value:n},e.children)},c="mdxType",u={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},m=a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,l=e.originalType,p=e.parentName,b=i(e,["components","mdxType","originalType","parentName"]),c=s(t),m=r,k=c["".concat(p,".").concat(m)]||c[m]||u[m]||l;return t?a.createElement(k,o(o({ref:n},b),{},{components:t})):a.createElement(k,o({ref:n},b))}));function k(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var l=t.length,o=new Array(l);o[0]=m;var i={};for(var p in n)hasOwnProperty.call(n,p)&&(i[p]=n[p]);i.originalType=e,i[c]="string"==typeof e?e:r,o[1]=i;for(var s=2;s{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>o,default:()=>u,frontMatter:()=>l,metadata:()=>i,toc:()=>s});var a=t(7462),r=(t(7294),t(3905));const l={sidebar_position:2},o="\u5b89\u88c5\u5185\u6838",i={unversionedId:"quick-start/core_quickstart",id:"quick-start/core_quickstart",title:"\u5b89\u88c5\u5185\u6838",description:"\u5b89\u88c5\u524d\u9700\u5b8c\u6210\u9884\u5148\u51c6\u5907\u3002",source:"@site/docs/quick-start/core_quickstart.md",sourceDirName:"quick-start",slug:"/quick-start/core_quickstart",permalink:"/website/docs/quick-start/core_quickstart",draft:!1,tags:[],version:"current",sidebarPosition:2,frontMatter:{sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"\u9884\u5148\u51c6\u5907",permalink:"/website/docs/quick-start/prerequisite"},next:{title:"\u5b89\u88c5\u5e95\u5ea7",permalink:"/website/docs/quick-start/buildingbase_quickstart"}},p={},s=[{value:"\u5b89\u88c5\u65b9\u5f0f",id:"\u5b89\u88c5\u65b9\u5f0f",level:2},{value:"Helm\u5b89\u88c5(\u63a8\u8350)",id:"helm\u5b89\u88c5\u63a8\u8350",level:3},{value:"\u6e90\u4ee3\u7801\u5b89\u88c5",id:"\u6e90\u4ee3\u7801\u5b89\u88c5",level:3},{value:"\u5feb\u901f\u4f53\u9a8c",id:"\u5feb\u901f\u4f53\u9a8c",level:2},{value:"\u4f7f\u7528\u5b98\u65b9\u7ec4\u4ef6\u4ed3\u5e93",id:"\u4f7f\u7528\u5b98\u65b9\u7ec4\u4ef6\u4ed3\u5e93",level:3},{value:"\u4f7f\u7528\u79c1\u6709\u7ec4\u4ef6\u4ed3\u5e93",id:"\u4f7f\u7528\u79c1\u6709\u7ec4\u4ef6\u4ed3\u5e93",level:3}],b={toc:s},c="wrapper";function u(e){let{components:n,...t}=e;return(0,r.kt)(c,(0,a.Z)({},b,t,{components:n,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"\u5b89\u88c5\u5185\u6838"},"\u5b89\u88c5\u5185\u6838"),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"\u5b89\u88c5\u524d\u9700\u5b8c\u6210",(0,r.kt)("a",{parentName:"p",href:"./prerequisite"},"\u9884\u5148\u51c6\u5907"),"\u3002")),(0,r.kt)("h2",{id:"\u5b89\u88c5\u65b9\u5f0f"},"\u5b89\u88c5\u65b9\u5f0f"),(0,r.kt)("h3",{id:"helm\u5b89\u88c5\u63a8\u8350"},"Helm\u5b89\u88c5(\u63a8\u8350)"),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"Kubebb\u5b98\u65b9\u63d0\u4f9b\u4e86helm\u4ed3\u5e93\uff0c\u65b9\u4fbf\u7528\u6237\u5b89\u88c5: ",(0,r.kt)("a",{parentName:"p",href:"https://kubebb.github.io/components/"},"https://kubebb.github.io/components/"))),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"\u6dfb\u52a0helm\u4ed3\u5e93")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"helm repo add kubebb https://kubebb.github.io/components/\nhelm repo update\n")),(0,r.kt)("ol",{start:2},(0,r.kt)("li",{parentName:"ol"},"\u521b\u5efa\u547d\u540d\u7a7a\u95f4")),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"\u8bf7\u6839\u636e\u5b9e\u9645\u60c5\u51b5\u4fee\u6539\u547d\u540d\u7a7a\u95f4\u540d\u79f0")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"kubectl create namespace kubebb-system\n")),(0,r.kt)("ol",{start:3},(0,r.kt)("li",{parentName:"ol"},"\u5b89\u88c5")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"helm install -nkubebb-system kubebb-core kubebb/kubebb-core\n")),(0,r.kt)("ol",{start:4},(0,r.kt)("li",{parentName:"ol"},"\u67e5\u770b\u5b89\u88c5\u72b6\u6001")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"kubectl get pods -nkubebb-system \n")),(0,r.kt)("p",null,"\u5982\u679c\u4e00\u5207\u6b63\u5e38\uff0c\u8f93\u5165\u5982\u4e0b:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"NAME READY STATUS RESTARTS AGE\nkubebb-core-6bd7c5f679-742mq 1/1 Running 0 21h\n")),(0,r.kt)("h3",{id:"\u6e90\u4ee3\u7801\u5b89\u88c5"},"\u6e90\u4ee3\u7801\u5b89\u88c5"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"\u514b\u9686\u4ee3\u7801")),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"\u8bf7\u6839\u636e\u5b9e\u9645\u60c5\u51b5\u4fee\u6539\u4ee3\u7801\u4ed3\u5e93\u7248\u672c")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"git clone https://github.com/kubebb/core\n")),(0,r.kt)("ol",{start:2},(0,r.kt)("li",{parentName:"ol"},"\u6784\u5efa\u955c\u50cf")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"cd core\nmake docker-build IMG=kubebb/kubebb-core:local\n")),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"\u5982\u679c\u4f7f\u7528\u7684\u662fkind\u5f00\u53d1\u96c6\u7fa4\uff0c\u9700\u8981\u5148\u5c06\u955c\u50cf\u63a8\u9001\u5230kind\u96c6\u7fa4\u4e2d:"),(0,r.kt)("pre",{parentName:"admonition"},(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"kind load docker-image kubebb/kubebb-core:local --name kubebb-core\n"))),(0,r.kt)("ol",{start:3},(0,r.kt)("li",{parentName:"ol"},"\u5b89\u88c5CRDs")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"make install\n")),(0,r.kt)("ol",{start:4},(0,r.kt)("li",{parentName:"ol"},"\u90e8\u7f72kubebb-core")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"make deploy IMG=kubebb/kubebb-core:local\n")),(0,r.kt)("ol",{start:5},(0,r.kt)("li",{parentName:"ol"},"\u67e5\u770b\u5b89\u88c5\u72b6\u6001")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"kubectl get pods -nkubebb-system \n")),(0,r.kt)("p",null,"\u5982\u679c\u4e00\u5207\u6b63\u5e38\uff0c\u8f93\u5165\u5982\u4e0b:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"NAME READY STATUS RESTARTS AGE\nkubebb-core-6bd7c5f679-742mq 1/1 Running 0 21h\n")),(0,r.kt)("h2",{id:"\u5feb\u901f\u4f53\u9a8c"},"\u5feb\u901f\u4f53\u9a8c"),(0,r.kt)("p",null,"\u5185\u6838\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u53ef\u901a\u8fc7\u4ee5\u4e0b\u4e24\u79cd\u65b9\u5f0f\u5feb\u901f\u4f53\u9a8c\u7ec4\u4ef6\u5316\u7684\u90e8\u7f72:"),(0,r.kt)("h3",{id:"\u4f7f\u7528\u5b98\u65b9\u7ec4\u4ef6\u4ed3\u5e93"},"\u4f7f\u7528\u5b98\u65b9\u7ec4\u4ef6\u4ed3\u5e93"),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},(0,r.kt)("a",{parentName:"p",href:"https://github.com/kubebb/components"},"\u5b98\u65b9\u7ec4\u4ef6\u4ed3\u5e93"),"\u63d0\u4f9b\u591a\u4e2a\u8ba4\u8bc1\u4ed3\u5e93\u3001\u7ec4\u4ef6\u548c\u7ec4\u4ef6\u5e94\u7528\uff0c\u53ef\u4f9b\u7528\u6237\u4f53\u9a8c\u3002\u540e\u7eed\u6b65\u9aa4\u5c06\u4f7f\u7528\u5b98\u65b9\u7ec4\u4ef6\u4ed3\u5e93\u4e3e\u4f8b\u3002")),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"\u901a\u8fc7\u4ee5\u4e0b\u547d\u4ee4\u514b\u9686\u5b98\u65b9\u7ec4\u4ef6\u4ed3\u5e93:")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"git clone https://github.com/kubebb/components\n# \u540e\u7eed\u6b65\u9aa4\u5747\u5728 components \u76ee\u5f55\u4e0b\u6267\u884c\ncd components\n")),(0,r.kt)("ol",{start:2},(0,r.kt)("li",{parentName:"ol"},"\u90e8\u7f72\u5b98\u65b9\u4ed3\u5e93")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"kubectl apply -f repos/repository_kubebb.yaml -nkubebb-system\n")),(0,r.kt)("p",null,"\u67e5\u770b\u4ed3\u5e93\u72b6\u6001:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"kubectl get repository -nkubebb-system\n")),(0,r.kt)("p",null,"\u5982\u679c\u4e00\u5207\u6b63\u5e38\uff0c\u8f93\u51fa\u5982\u4e0b:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"(base) \u279c ~ k get repos -nkubebb-system\nNAME AGE\nkubebb 42h\n")),(0,r.kt)("ol",{start:3},(0,r.kt)("li",{parentName:"ol"},"\u83b7\u53d6\u4ed3\u5e93\u4e2d\u7684\u7ec4\u4ef6")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"kubectl get components -nkubebb-system -l kubebb.component.repository=kubebb\n")),(0,r.kt)("p",null,"\u5982\u679c\u4e00\u5207\u6b63\u5e38\uff0c\u8f93\u51fa\u5982\u4e0b:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"NAME AGE\nkubebb.bc-apis 135m\nkubebb.bc-depository 135m\nkubebb.bc-explorer 135m\nkubebb.cluster-component 135m\nkubebb.fabric-operator 135m\nkubebb.ingress-nginx 135m\nkubebb.kubebb 135m\nkubebb.kubebb-core 135m\nkubebb.minio 135m\nkubebb.tekton-operator 135m\nkubebb.u4a-component 135m\nkubebb.weaviate 135m\n")),(0,r.kt)("ol",{start:4},(0,r.kt)("li",{parentName:"ol"},"\u6d4b\u8bd5\u7ec4\u4ef6\u90e8\u7f72(\u53ef\u9009)")),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"\u4ee5\u90e8\u7f72",(0,r.kt)("inlineCode",{parentName:"p"},"kubebb.minio"),"\u4e3a\u4f8b")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"kubectl apply -f examples/minio/componentplan.yaml\n")),(0,r.kt)("p",null,"\u7ec4\u4ef6\u90e8\u7f72\u914d\u7f6e\u4fe1\u606f\u5982\u4e0b: "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: core.kubebb.k8s.com.cn/v1alpha1\nkind: ComponentPlan\nmetadata:\n name: fabric-minio\n namespace: default\nspec:\n approved: true\n name: fabric-minio # similar to helm release name\n version: 5.0.7\n component:\n name: kubebb.minio\n namespace: kubebb-system\n")),(0,r.kt)("p",null,"\u67e5\u770b\u7ec4\u4ef6\u90e8\u7f72\u72b6\u6001:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"kubectl get componentplan fabric-minio -oyaml\n")),(0,r.kt)("p",null,"\u5982\u679c\u4e00\u5207\u6b63\u5e38\uff0c\u8f93\u51fa\u5982\u4e0b:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},'apiVersion: core.kubebb.k8s.com.cn/v1alpha1\nkind: ComponentPlan\nmetadata:\n annotations:\n kubectl.kubernetes.io/last-applied-configuration: |\n {"apiVersion":"core.kubebb.k8s.com.cn/v1alpha1","kind":"ComponentPlan","metadata":{"annotations":{},"name":"fabric-minio","namespace":"default"},"spec":{"approved":true,"component":{"name":"kubebb.minio","namespace":"kubebb-system"},"name":"fabric-minio","version":"5.0.7"}}\n creationTimestamp: "2023-07-04T07:52:17Z"\n finalizers:\n - core.kubebb.k8s.com.cn/finalizer\n generation: 3\n name: fabric-minio\n namespace: default\n resourceVersion: "14107"\n uid: 48696a2b-ae46-4522-95af-e951f255105e\nspec:\n approved: true\n component:\n name: kubebb.minio\n namespace: kubebb-system\n name: fabric-minio\n override: {}\n repository:\n name: kubebb\n namespace: kubebb-system\n version: 5.0.7\nstatus:\n conditions:\n - lastTransitionTime: "2023-07-04T07:52:17Z"\n reason: ""\n status: "True"\n type: Approved\n - lastTransitionTime: "2023-07-04T07:52:18Z"\n reason: ""\n status: "True"\n type: Installed\n - lastTransitionTime: "2023-07-04T07:52:18Z"\n reason: ""\n status: "True"\n type: Succeeded\n images:\n - hyperledgerk8s/minio-minio:RELEASE.2023-02-10T18-48-39Z\n resources:\n - NewCreated: true\n apiVersion: v1\n kind: ServiceAccount\n name: minio-sa\n - NewCreated: true\n apiVersion: v1\n kind: Secret\n name: fabric-minio\n - NewCreated: true\n apiVersion: v1\n kind: ConfigMap\n name: fabric-minio\n - NewCreated: true\n apiVersion: v1\n kind: Service\n name: fabric-minio-console\n - NewCreated: true\n apiVersion: v1\n kind: Service\n name: fabric-minio\n - NewCreated: true\n apiVersion: v1\n kind: Service\n name: fabric-minio-svc\n - NewCreated: true\n apiVersion: apps/v1\n kind: StatefulSet\n name: fabric-minio\n - NewCreated: true\n apiVersion: networking.k8s.io/v1\n kind: Ingress\n name: fabric-minio-console\n')),(0,r.kt)("p",null,"\u67e5\u770b\u7ec4\u4ef6Pod\u72b6\u6001"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"kubectl get pods -l core.kubebb.k8s.com.cn/componentplan=fabric-minio\n")),(0,r.kt)("p",null,"\u5982\u679c\u4e00\u5207\u6b63\u5e38\uff0c\u8f93\u51fa\u5982\u4e0b:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"NAME READY STATUS RESTARTS AGE\nfabric-minio-0 1/1 Running 0 42h\nfabric-minio-1 1/1 Running 0 42h\nfabric-minio-2 1/1 Running 0 42h\n")),(0,r.kt)("h3",{id:"\u4f7f\u7528\u79c1\u6709\u7ec4\u4ef6\u4ed3\u5e93"},"\u4f7f\u7528\u79c1\u6709\u7ec4\u4ef6\u4ed3\u5e93"),(0,r.kt)("p",null,"\u5f85\u8865\u5145"))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/791926a5.b95f584b.js b/assets/js/791926a5.b95f584b.js deleted file mode 100644 index 62034177f..000000000 --- a/assets/js/791926a5.b95f584b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[6741],{3905:(e,n,t)=>{t.d(n,{Zo:()=>b,kt:()=>k});var a=t(7294);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function l(e){for(var n=1;n=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var p=a.createContext({}),s=function(e){var n=a.useContext(p),t=n;return e&&(t="function"==typeof e?e(n):l(l({},n),e)),t},b=function(e){var n=s(e.components);return a.createElement(p.Provider,{value:n},e.children)},c="mdxType",u={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},m=a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,o=e.originalType,p=e.parentName,b=i(e,["components","mdxType","originalType","parentName"]),c=s(t),m=r,k=c["".concat(p,".").concat(m)]||c[m]||u[m]||o;return t?a.createElement(k,l(l({ref:n},b),{},{components:t})):a.createElement(k,l({ref:n},b))}));function k(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var o=t.length,l=new Array(o);l[0]=m;var i={};for(var p in n)hasOwnProperty.call(n,p)&&(i[p]=n[p]);i.originalType=e,i[c]="string"==typeof e?e:r,l[1]=i;for(var s=2;s{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>l,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>s});var a=t(7462),r=(t(7294),t(3905));const o={sidebar_position:2},l="\u5b89\u88c5\u5185\u6838",i={unversionedId:"quick-start/core_quickstart",id:"quick-start/core_quickstart",title:"\u5b89\u88c5\u5185\u6838",description:"\u5b89\u88c5\u524d\u9700\u5b8c\u6210\u9884\u5148\u51c6\u5907\u3002",source:"@site/docs/quick-start/core_quickstart.md",sourceDirName:"quick-start",slug:"/quick-start/core_quickstart",permalink:"/website/docs/quick-start/core_quickstart",draft:!1,tags:[],version:"current",sidebarPosition:2,frontMatter:{sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"\u9884\u5148\u51c6\u5907",permalink:"/website/docs/quick-start/prerequisite"},next:{title:"\u5b89\u88c5\u5e95\u5ea7",permalink:"/website/docs/quick-start/buildingbase_quickstart"}},p={},s=[{value:"\u5b89\u88c5\u65b9\u5f0f",id:"\u5b89\u88c5\u65b9\u5f0f",level:2},{value:"Helm\u5b89\u88c5(\u63a8\u8350)",id:"helm\u5b89\u88c5\u63a8\u8350",level:3},{value:"\u6e90\u4ee3\u7801\u5b89\u88c5",id:"\u6e90\u4ee3\u7801\u5b89\u88c5",level:3},{value:"\u5feb\u901f\u4f53\u9a8c",id:"\u5feb\u901f\u4f53\u9a8c",level:2},{value:"\u4f7f\u7528\u5b98\u65b9\u7ec4\u4ef6\u4ed3\u5e93",id:"\u4f7f\u7528\u5b98\u65b9\u7ec4\u4ef6\u4ed3\u5e93",level:3},{value:"\u4f7f\u7528\u79c1\u6709\u7ec4\u4ef6\u4ed3\u5e93",id:"\u4f7f\u7528\u79c1\u6709\u7ec4\u4ef6\u4ed3\u5e93",level:3}],b={toc:s},c="wrapper";function u(e){let{components:n,...t}=e;return(0,r.kt)(c,(0,a.Z)({},b,t,{components:n,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"\u5b89\u88c5\u5185\u6838"},"\u5b89\u88c5\u5185\u6838"),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"\u5b89\u88c5\u524d\u9700\u5b8c\u6210",(0,r.kt)("a",{parentName:"p",href:"./prerequisite"},"\u9884\u5148\u51c6\u5907"),"\u3002")),(0,r.kt)("h2",{id:"\u5b89\u88c5\u65b9\u5f0f"},"\u5b89\u88c5\u65b9\u5f0f"),(0,r.kt)("h3",{id:"helm\u5b89\u88c5\u63a8\u8350"},"Helm\u5b89\u88c5(\u63a8\u8350)"),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"Kubebb\u5b98\u65b9\u63d0\u4f9b\u4e86helm\u4ed3\u5e93\uff0c\u65b9\u4fbf\u7528\u6237\u5b89\u88c5: ",(0,r.kt)("a",{parentName:"p",href:"https://kubebb.github.io/components/"},"https://kubebb.github.io/components/"))),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"\u6dfb\u52a0helm\u4ed3\u5e93")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"helm repo add kubebb https://kubebb.github.io/components/\nhelm repo update\n")),(0,r.kt)("ol",{start:2},(0,r.kt)("li",{parentName:"ol"},"\u521b\u5efa\u547d\u540d\u7a7a\u95f4")),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"\u8bf7\u6839\u636e\u5b9e\u9645\u60c5\u51b5\u4fee\u6539\u547d\u540d\u7a7a\u95f4\u540d\u79f0")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"kubectl create namespace kubebb-system\n")),(0,r.kt)("ol",{start:3},(0,r.kt)("li",{parentName:"ol"},"\u5b89\u88c5")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"helm install --wait -nkubebb-system kubebb-core kubebb/kubebb-core\n")),(0,r.kt)("h3",{id:"\u6e90\u4ee3\u7801\u5b89\u88c5"},"\u6e90\u4ee3\u7801\u5b89\u88c5"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"\u514b\u9686\u4ee3\u7801")),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"\u8bf7\u6839\u636e\u5b9e\u9645\u60c5\u51b5\u4fee\u6539\u4ee3\u7801\u4ed3\u5e93\u7248\u672c")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"git clone https://github.com/kubebb/core\n")),(0,r.kt)("ol",{start:2},(0,r.kt)("li",{parentName:"ol"},"\u6784\u5efa\u955c\u50cf")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"cd core\nmake docker-build IMG=kubebb/kubebb-core:local\n")),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"\u5982\u679c\u4f7f\u7528\u7684\u662fkind\u5f00\u53d1\u96c6\u7fa4\uff0c\u9700\u8981\u5148\u5c06\u955c\u50cf\u63a8\u9001\u5230kind\u96c6\u7fa4\u4e2d:"),(0,r.kt)("pre",{parentName:"admonition"},(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"kind load docker-image kubebb/kubebb-core:local --name kubebb-core\n"))),(0,r.kt)("ol",{start:3},(0,r.kt)("li",{parentName:"ol"},"\u5b89\u88c5CRDs")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"make install\n")),(0,r.kt)("ol",{start:4},(0,r.kt)("li",{parentName:"ol"},"\u90e8\u7f72kubebb-core")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"make deploy IMG=kubebb/kubebb-core:local\n")),(0,r.kt)("h2",{id:"\u5feb\u901f\u4f53\u9a8c"},"\u5feb\u901f\u4f53\u9a8c"),(0,r.kt)("p",null,"\u5185\u6838\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u53ef\u901a\u8fc7\u4ee5\u4e0b\u4e24\u79cd\u65b9\u5f0f\u5feb\u901f\u4f53\u9a8c\u7ec4\u4ef6\u5316\u7684\u90e8\u7f72:"),(0,r.kt)("h3",{id:"\u4f7f\u7528\u5b98\u65b9\u7ec4\u4ef6\u4ed3\u5e93"},"\u4f7f\u7528\u5b98\u65b9\u7ec4\u4ef6\u4ed3\u5e93"),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},(0,r.kt)("a",{parentName:"p",href:"https://github.com/kubebb/components"},"\u5b98\u65b9\u7ec4\u4ef6\u4ed3\u5e93"),"\u63d0\u4f9b\u591a\u4e2a\u8ba4\u8bc1\u4ed3\u5e93\u3001\u7ec4\u4ef6\u548c\u7ec4\u4ef6\u5e94\u7528\uff0c\u53ef\u4f9b\u7528\u6237\u4f53\u9a8c\u3002\u540e\u7eed\u6b65\u9aa4\u5c06\u4f7f\u7528\u5b98\u65b9\u7ec4\u4ef6\u4ed3\u5e93\u4e3e\u4f8b\u3002")),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"\u901a\u8fc7\u4ee5\u4e0b\u547d\u4ee4\u514b\u9686\u5b98\u65b9\u7ec4\u4ef6\u4ed3\u5e93:")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"git clone https://github.com/kubebb/components\n# \u540e\u7eed\u6b65\u9aa4\u5747\u5728 components \u76ee\u5f55\u4e0b\u6267\u884c\ncd components\n")),(0,r.kt)("ol",{start:2},(0,r.kt)("li",{parentName:"ol"},"\u90e8\u7f72\u5b98\u65b9\u4ed3\u5e93")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"kubectl apply -f repos/repository_kubebb.yaml -nkubebb-system\n")),(0,r.kt)("p",null,"\u67e5\u770b\u4ed3\u5e93\u72b6\u6001:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"kubectl get repository -nkubebb-system\n")),(0,r.kt)("p",null,"\u5982\u679c\u4e00\u5207\u6b63\u5e38\uff0c\u8f93\u51fa\u5982\u4e0b:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"(base) \u279c ~ k get repos -nkubebb-system\nNAME AGE\nkubebb 42h\n")),(0,r.kt)("ol",{start:3},(0,r.kt)("li",{parentName:"ol"},"\u83b7\u53d6\u4ed3\u5e93\u4e2d\u7684\u7ec4\u4ef6")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"kubectl get components -nkubebb-system -l kubebb.component.repository=kubebb\n")),(0,r.kt)("p",null,"\u5982\u679c\u4e00\u5207\u6b63\u5e38\uff0c\u8f93\u51fa\u5982\u4e0b:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"NAME AGE\nkubebb.bc-apis 135m\nkubebb.bc-depository 135m\nkubebb.bc-explorer 135m\nkubebb.cluster-component 135m\nkubebb.fabric-operator 135m\nkubebb.ingress-nginx 135m\nkubebb.kubebb 135m\nkubebb.kubebb-core 135m\nkubebb.minio 135m\nkubebb.tekton-operator 135m\nkubebb.u4a-component 135m\nkubebb.weaviate 135m\n")),(0,r.kt)("ol",{start:4},(0,r.kt)("li",{parentName:"ol"},"\u6d4b\u8bd5\u7ec4\u4ef6\u90e8\u7f72(\u53ef\u9009)")),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"\u4ee5\u90e8\u7f72",(0,r.kt)("inlineCode",{parentName:"p"},"kubebb.minio"),"\u4e3a\u4f8b")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"kubectl apply -f examples/minio/componentplan.yaml\n")),(0,r.kt)("p",null,"\u7ec4\u4ef6\u90e8\u7f72\u914d\u7f6e\u4fe1\u606f\u5982\u4e0b: "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: core.kubebb.k8s.com.cn/v1alpha1\nkind: ComponentPlan\nmetadata:\n name: fabric-minio\n namespace: default\nspec:\n approved: true\n name: fabric-minio # similar to helm release name\n version: 5.0.7\n component:\n name: kubebb.minio\n namespace: kubebb-system\n")),(0,r.kt)("p",null,"\u67e5\u770b\u7ec4\u4ef6\u90e8\u7f72\u72b6\u6001:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"kubectl get componentplan fabric-minio -oyaml\n")),(0,r.kt)("p",null,"\u5982\u679c\u4e00\u5207\u6b63\u5e38\uff0c\u8f93\u51fa\u5982\u4e0b:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},'apiVersion: core.kubebb.k8s.com.cn/v1alpha1\nkind: ComponentPlan\nmetadata:\n annotations:\n kubectl.kubernetes.io/last-applied-configuration: |\n {"apiVersion":"core.kubebb.k8s.com.cn/v1alpha1","kind":"ComponentPlan","metadata":{"annotations":{},"name":"fabric-minio","namespace":"default"},"spec":{"approved":true,"component":{"name":"kubebb.minio","namespace":"kubebb-system"},"name":"fabric-minio","version":"5.0.7"}}\n creationTimestamp: "2023-07-04T07:52:17Z"\n finalizers:\n - core.kubebb.k8s.com.cn/finalizer\n generation: 3\n name: fabric-minio\n namespace: default\n resourceVersion: "14107"\n uid: 48696a2b-ae46-4522-95af-e951f255105e\nspec:\n approved: true\n component:\n name: kubebb.minio\n namespace: kubebb-system\n name: fabric-minio\n override: {}\n repository:\n name: kubebb\n namespace: kubebb-system\n version: 5.0.7\nstatus:\n conditions:\n - lastTransitionTime: "2023-07-04T07:52:17Z"\n reason: ""\n status: "True"\n type: Approved\n - lastTransitionTime: "2023-07-04T07:52:18Z"\n reason: ""\n status: "True"\n type: Installed\n - lastTransitionTime: "2023-07-04T07:52:18Z"\n reason: ""\n status: "True"\n type: Succeeded\n images:\n - hyperledgerk8s/minio-minio:RELEASE.2023-02-10T18-48-39Z\n resources:\n - NewCreated: true\n apiVersion: v1\n kind: ServiceAccount\n name: minio-sa\n - NewCreated: true\n apiVersion: v1\n kind: Secret\n name: fabric-minio\n - NewCreated: true\n apiVersion: v1\n kind: ConfigMap\n name: fabric-minio\n - NewCreated: true\n apiVersion: v1\n kind: Service\n name: fabric-minio-console\n - NewCreated: true\n apiVersion: v1\n kind: Service\n name: fabric-minio\n - NewCreated: true\n apiVersion: v1\n kind: Service\n name: fabric-minio-svc\n - NewCreated: true\n apiVersion: apps/v1\n kind: StatefulSet\n name: fabric-minio\n - NewCreated: true\n apiVersion: networking.k8s.io/v1\n kind: Ingress\n name: fabric-minio-console\n')),(0,r.kt)("p",null,"\u67e5\u770b\u7ec4\u4ef6Pod\u72b6\u6001"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"kubectl get pods -l core.kubebb.k8s.com.cn/componentplan=fabric-minio\n")),(0,r.kt)("p",null,"\u5982\u679c\u4e00\u5207\u6b63\u5e38\uff0c\u8f93\u51fa\u5982\u4e0b:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"NAME READY STATUS RESTARTS AGE\nfabric-minio-0 1/1 Running 0 42h\nfabric-minio-1 1/1 Running 0 42h\nfabric-minio-2 1/1 Running 0 42h\n")),(0,r.kt)("h3",{id:"\u4f7f\u7528\u79c1\u6709\u7ec4\u4ef6\u4ed3\u5e93"},"\u4f7f\u7528\u79c1\u6709\u7ec4\u4ef6\u4ed3\u5e93"),(0,r.kt)("p",null,"\u5f85\u8865\u5145"))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/935f2afb.032dc2a8.js b/assets/js/935f2afb.e8481ca4.js similarity index 99% rename from assets/js/935f2afb.032dc2a8.js rename to assets/js/935f2afb.e8481ca4.js index e4c9992e4..d7c58dd34 100644 --- a/assets/js/935f2afb.032dc2a8.js +++ b/assets/js/935f2afb.e8481ca4.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[53],{1109:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"link","label":"\u603b\u89c8","href":"/website/docs/intro","docId":"intro"},{"type":"category","label":"\u5feb\u901f\u5f00\u59cb","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u9884\u5148\u51c6\u5907","href":"/website/docs/quick-start/prerequisite","docId":"quick-start/prerequisite"},{"type":"link","label":"\u5b89\u88c5\u5185\u6838","href":"/website/docs/quick-start/core_quickstart","docId":"quick-start/core_quickstart"},{"type":"link","label":"\u5b89\u88c5\u5e95\u5ea7","href":"/website/docs/quick-start/buildingbase_quickstart","docId":"quick-start/buildingbase_quickstart"}],"href":"/website/docs/category/\u5feb\u901f\u5f00\u59cb"},{"type":"category","label":"\u5185\u6838Kit","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u4ecb\u7ecd","href":"/website/docs/core/intro","docId":"core/intro"},{"type":"category","label":"\u6982\u5ff5","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u7ec4\u4ef6\u4ed3\u5e93CRD","href":"/website/docs/core/concepts/repository","docId":"core/concepts/repository"},{"type":"link","label":"\u7ec4\u4ef6CRD","href":"/website/docs/core/concepts/component","docId":"core/concepts/component"},{"type":"link","label":"\u7ec4\u4ef6\u90e8\u7f72CRD","href":"/website/docs/core/concepts/componentplan","docId":"core/concepts/componentplan"},{"type":"link","label":"\u7ec4\u4ef6\u8ba2\u9605CRD","href":"/website/docs/core/concepts/subscription","docId":"core/concepts/subscription"}],"href":"/website/docs/category/\u6982\u5ff5"},{"type":"category","label":"\u7528\u6237\u6307\u5357","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u79c1\u6709\u96c6\u7fa4\u90e8\u7f72\u65b9\u6848","href":"/website/docs/core/userguide/privatecluster","docId":"core/userguide/privatecluster"}],"href":"/website/docs/category/\u7528\u6237\u6307\u5357"},{"type":"link","label":"\u7ec4\u4ef6\u8bc4\u7ea7","href":"/website/docs/core/rating","docId":"core/rating"},{"type":"link","label":"\u8def\u7ebf\u56fe","href":"/website/docs/core/roadmap","docId":"core/roadmap"}],"href":"/website/docs/category/\u5185\u6838kit"},{"type":"category","label":"\u5e95\u5ea7Kit","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u4ecb\u7ecd","href":"/website/docs/building-base/intro","docId":"building-base/intro"},{"type":"category","label":"\u81ea\u5b9a\u4e49\u914d\u7f6e","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u81ea\u5b9a\u4e49\u95e8\u6237","href":"/website/docs/building-base/configuration/customize-portal","docId":"building-base/configuration/customize-portal"},{"type":"link","label":"\u81ea\u5b9a\u4e49\u83dc\u5355","href":"/website/docs/building-base/configuration/customize-menu","docId":"building-base/configuration/customize-menu"},{"type":"link","label":"\u4f7f\u7528\u7b2c\u4e09\u65b9\u7cfb\u7edf\u767b\u5f55","href":"/website/docs/building-base/configuration/3rd-party-account","docId":"building-base/configuration/3rd-party-account"},{"type":"link","label":"\u914d\u7f6e\u5ba1\u8ba1\u80fd\u529b","href":"/website/docs/building-base/configuration/audit-config","docId":"building-base/configuration/audit-config"},{"type":"link","label":"\u96c6\u6210\u5355\u70b9\u767b\u5f55","href":"/website/docs/building-base/configuration/oidc-integration","docId":"building-base/configuration/oidc-integration"}],"href":"/website/docs/category/\u81ea\u5b9a\u4e49\u914d\u7f6e"}],"href":"/website/docs/category/\u5e95\u5ea7kit"},{"type":"category","label":"\u4f4e\u7801Kit","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u4ecb\u7ecd","href":"/website/docs/lowcode-development/intro","docId":"lowcode-development/intro"},{"type":"link","label":"\u5f00\u53d1\u6a21\u5f0f","href":"/website/docs/lowcode-development/development_pattern","docId":"lowcode-development/development_pattern"},{"type":"category","label":"\u7ec4\u4ef6\u5f00\u53d1","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u524d\u7aef\u5f00\u53d1","href":"/website/docs/lowcode-development/development/frontend","docId":"lowcode-development/development/frontend"},{"type":"link","label":"BFF\u5c42API\u5f00\u53d1","href":"/website/docs/lowcode-development/development/bff-apis","docId":"lowcode-development/development/bff-apis"},{"type":"link","label":"\u5f00\u53d1\u540e\u7aef\u670d\u52a1\u7ec4\u4ef6","href":"/website/docs/lowcode-development/development/backend-operator","docId":"lowcode-development/development/backend-operator"},{"type":"link","label":"\u53d1\u5e03\u4e00\u4e2a Hello World \u7ec4\u4ef6","href":"/website/docs/lowcode-development/development/develop-hello-world","docId":"lowcode-development/development/develop-hello-world"}],"href":"/website/docs/category/\u7ec4\u4ef6\u5f00\u53d1"}],"href":"/website/docs/category/\u4f4e\u7801kit"},{"type":"link","label":"\u5e38\u89c1\u95ee\u9898","href":"/website/docs/FAQ","docId":"FAQ"},{"type":"link","label":"\u8d21\u732e\u6307\u5357","href":"/website/docs/contribute","docId":"contribute"}]},"docs":{"building-base/configuration/3rd-party-account":{"id":"building-base/configuration/3rd-party-account","title":"\u4f7f\u7528\u7b2c\u4e09\u65b9\u7cfb\u7edf\u767b\u5f55","description":"\u76ee\u524d\u57fa\u4e8e dex \u652f\u6301\u5916\u90e8\u8ba4\u8bc1\u7cfb\u7edf\u7684\u96c6\u6210\uff0c\u5b9e\u73b0\u670d\u52a1\u95e8\u6237\u4e0e\u7b2c\u4e09\u65b9\u8ba4\u8bc1\u7cfb\u7edf\u7684\u7edf\u4e00\u8d26\u53f7\u53ca\u5355\u70b9\u767b\u5f55\u3002","sidebar":"tutorialSidebar"},"building-base/configuration/audit-config":{"id":"building-base/configuration/audit-config","title":"\u914d\u7f6e\u5ba1\u8ba1\u80fd\u529b","description":"1\u3001\u7f16\u8f91 audit-policy.yaml \u6587\u4ef6\u5bf9\u5ba1\u8ba1\u8fdb\u884c\u914d\u7f6e\uff0c`kubectl edit cm audit-policy-conf -n u4a-system`","sidebar":"tutorialSidebar"},"building-base/configuration/customize-menu":{"id":"building-base/configuration/customize-menu","title":"\u81ea\u5b9a\u4e49\u83dc\u5355","description":"kubebb \u7684\u6240\u6709\u83dc\u5355\u5747\u57fa\u4e8e menu \u7684 CRD \u8fdb\u884c\u5b9a\u4e49\uff0c\u5982\u679c\u9700\u8981\u6dfb\u52a0\u81ea\u5df1\u7684\u83dc\u5355\uff0c\u53ef\u4ee5\u53c2\u8003\u4ee5\u4e0b memnu \u793a\u4f8b:","sidebar":"tutorialSidebar"},"building-base/configuration/customize-portal":{"id":"building-base/configuration/customize-portal","title":"\u81ea\u5b9a\u4e49\u95e8\u6237","description":"\u81ea\u5b9a\u4e49 logo","sidebar":"tutorialSidebar"},"building-base/configuration/oidc-integration":{"id":"building-base/configuration/oidc-integration","title":"\u96c6\u6210\u5355\u70b9\u767b\u5f55","description":"\u901a\u8fc7 OIDC \u534f\u8bae\uff0c\u5b9e\u73b0\u540c kubebb \u7684\u7edf\u4e00\u8d26\u53f7\u3001\u8ba4\u8bc1\u53ca\u5355\u70b9\u767b\u5f55\u529f\u80fd\u3002","sidebar":"tutorialSidebar"},"building-base/intro":{"id":"building-base/intro","title":"\u4ecb\u7ecd","description":"\u6280\u672f\u7ec4\u4ef6","sidebar":"tutorialSidebar"},"contribute":{"id":"contribute","title":"\u8d21\u732e\u6307\u5357","description":"\u6b22\u8fce\u6765\u5230 KubeBB!","sidebar":"tutorialSidebar"},"core/concepts/component":{"id":"core/concepts/component","title":"\u7ec4\u4ef6CRD","description":"\u7ec4\u4ef6\u662f\u5c06 chart package \u6620\u5c04\u4e3a\u96c6\u7fa4\u8d44\u6e90\u7684\u4e00\u4e2a\u6982\u5ff5\uff0c\u7ec4\u4ef6\u5b9a\u4e49\u4e86 chart package \u7684\u57fa\u7840\u63cf\u8ff0\u4fe1\u606f\uff0c\u7248\u672c\u4fe1\u606f\u7b49\u3002\u7ec4\u4ef6\u4e00\u822c\u7531\u4ed3\u5e93\u521b\u5efa\u51fa\u6765\uff0c\u65e0\u9700\u624b\u52a8\u521b\u5efa\u3002","sidebar":"tutorialSidebar"},"core/concepts/componentplan":{"id":"core/concepts/componentplan","title":"\u7ec4\u4ef6\u90e8\u7f72CRD","description":"ComponentPlan \u4f1a\u5b89\u88c5\u4e00\u4e2a\u7ec4\u4ef6\u5230\u96c6\u7fa4\uff0c\u7c7b\u4f3c\u6267\u884c\u4e00\u6b21 helm install/upgrade \u64cd\u4f5c\uff0c\u53ea\u4e0d\u8fc7\u5c06 helm install/upgrade \u547d\u4ee4\u4e2d\u7684\u53c2\u6570\u56fa\u5316\u5230 ComponentPlan \u7684 spec","sidebar":"tutorialSidebar"},"core/concepts/repository":{"id":"core/concepts/repository","title":"\u7ec4\u4ef6\u4ed3\u5e93CRD","description":"\u4ed3\u5e93\u662f\u5c06 chart repository \u6620\u5c04\u4e3a\u96c6\u7fa4\u8d44\u6e90\u7684\u4e00\u4e2a\u6982\u5ff5\u3002\u4ed3\u5e93\u5b9a\u4e49\u4e86 chart repository \u7684 URL\uff0c\u8ba4\u8bc1\u4fe1\u606f\u7b49\u76f8\u5173\u4fe1\u606f\u3002\u4ed3\u5e93\u662f\u7ec4\u4ef6\u90e8\u7f72\uff0c\u5347\u7ea7\u7684\u57fa\u7840\u3002","sidebar":"tutorialSidebar"},"core/concepts/subscription":{"id":"core/concepts/subscription","title":"\u7ec4\u4ef6\u8ba2\u9605CRD","description":"\u521b\u5efa\u4e00\u4e2a\u8ba2\u9605\uff0c\u8868\u793a\u7528\u6237\u5c06\u8ffd\u8e2a\u4e00\u4e2a\u7ec4\u4ef6\uff08Component\uff09\u5728 \u4ed3\u5e93\uff08Repository\uff09\u4e2d\u7684\u66f4\u65b0\uff0c\u5f53\u7ec4\u4ef6\u66f4\u65b0\u65f6\uff0c\u8be5\u7ec4\u4ef6\u4f1a\u6839\u636e\u8ba2\u9605\u4e2d\u7684\u914d\u7f6e\u81ea\u52a8\u6216\u5f85\u6279\u51c6\u540e\u5b89\u88c5\u5230\u96c6\u7fa4\u4e2d\u3002","sidebar":"tutorialSidebar"},"core/intro":{"id":"core/intro","title":"\u4ecb\u7ecd","description":"\u5185\u6838\u57fa\u4e8ekubernetes operator\u6a21\u5f0f\u8fdb\u884c\u5f00\u53d1\uff0c\u63d0\u4f9b\u5b8c\u6574\u7684\u7ec4\u4ef6\u751f\u547d\u5468\u671f\u7ba1\u7406\u3001\u7ec4\u4ef6\u8ba2\u9605\u548c\u81ea\u52a8\u5316\u90e8\u7f72\u80fd\u529b\uff0c\u5e76\u901a\u8fc7tekton\u6269\u5c55\u5b9e\u73b0\u7ec4\u4ef6\u81ea\u52a8\u5316\u8bc4\u7ea7\u548c\u5b89\u88c5\u524d\u6821\u9a8c\u7b49\u80fd\u529b\u3002","sidebar":"tutorialSidebar"},"core/rating":{"id":"core/rating","title":"\u7ec4\u4ef6\u8bc4\u7ea7","description":"\u7ec4\u4ef6\u8bc4\u7ea7\u7684\u76ee\u7684\u662f\u901a\u8fc7\u5c3d\u53ef\u80fd\u591a\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u4ece\u591a\u4e2a\u7ef4\u5ea6\u6765\u8bc4\u4f30\u4e00\u4e2a\u7ec4\u4ef6\u3002\u56e0\u6b64\uff0c\u7ec4\u4ef6\u8bc4\u7ea7\u4e09\u4e2a\u90e8\u5206\u7684\u5185\u5bb9:","sidebar":"tutorialSidebar"},"core/roadmap":{"id":"core/roadmap","title":"\u8def\u7ebf\u56fe","description":"v0.1.0","sidebar":"tutorialSidebar"},"core/userguide/privatecluster":{"id":"core/userguide/privatecluster","title":"\u79c1\u6709\u96c6\u7fa4\u90e8\u7f72\u65b9\u6848","description":"\u5728\u4f7f\u7528 kubebb-core \u4e4b\u524d\u6211\u4eec\u9700\u8981\u6709\u4e00\u4e2a k8s \u96c6\u7fa4\uff0c\u7248\u672c\u662f 1.24+\u3002","sidebar":"tutorialSidebar"},"FAQ":{"id":"FAQ","title":"\u5e38\u89c1\u95ee\u9898","description":"BuildingBase\u90e8\u7f72","sidebar":"tutorialSidebar"},"intro":{"id":"intro","title":"\u603b\u89c8","description":"KubeBB(Kubernetes Building Blocks)\u662f\u4e00\u79cd\u7531\u5185\u6838\u9a71\u52a8\u7684\u7ec4\u4ef6\u751f\u547d\u5468\u671f\u7ba1\u7406\u5e73\u53f0\uff0c\u96c6\u6210\u5f00\u7bb1\u5373\u7528\u7684\u4e91\u539f\u751f\u5e95\u5ea7\u548c\u4f4e\u7801\u7ec4\u4ef6\u5f00\u53d1\u80fd\u529b,\u6574\u5408\u5b9e\u73b0\u4e91\u539f\u751f\u4e09\u5c42\u7ec4\u4ef6\u6a21\u5f0f\u3002","sidebar":"tutorialSidebar"},"lowcode-development/development_pattern":{"id":"lowcode-development/development_pattern","title":"\u5f00\u53d1\u6a21\u5f0f","description":"KubeBB\u7ec4\u4ef6\u7684\u5f00\u53d1\u91c7\u53d6\u524d\u540e\u7aef\u5206\u79bb\uff0c\u4ee5 K8S \u4e3a\u6838\u5fc3\u7684\u5f00\u53d1\u6846\u67b6\uff0c\u9075\u5faa K8S \u7684\u6269\u5c55\u673a\u5236\u53ca API \u89c4\u8303\u3002\u6574\u4f53\u5f00\u53d1\u67b6\u6784\u7684\u57fa\u672c\u903b\u8f91\u5982\u4e0b\u56fe\u6240\u793a\uff1a","sidebar":"tutorialSidebar"},"lowcode-development/development/backend-operator":{"id":"lowcode-development/development/backend-operator","title":"\u5f00\u53d1\u540e\u7aef\u670d\u52a1\u7ec4\u4ef6","description":"\u672c\u7ae0\u8282\u5bf9 Kubebb \u7684\u540e\u7aef\u670d\u52a1\u5f00\u53d1\u6807\u51c6\u8fdb\u884c\u8be6\u7ec6\u4ecb\u7ecd\uff0c\u4e3b\u8981\u662f\u57fa\u4e8e Controller + CRD \u7684 K8S Operator \u7684\u5f00\u53d1\u6a21\u5f0f\u3002","sidebar":"tutorialSidebar"},"lowcode-development/development/bff-apis":{"id":"lowcode-development/development/bff-apis","title":"BFF\u5c42API\u5f00\u53d1","description":"\u672c\u7ae0\u8282\u5bf9 Kubebb \u7684 BFF \u5c42\u8fdb\u884c\u8be6\u7ec6\u4ecb\u7ecd\uff0c\u5305\u62ec\u5982\u4f55\u4f7f\u7528 GraphQL \u5feb\u901f\u5f00\u53d1 BFF \u5c42\u7684 API","sidebar":"tutorialSidebar"},"lowcode-development/development/develop-hello-world":{"id":"lowcode-development/development/develop-hello-world","title":"\u53d1\u5e03\u4e00\u4e2a Hello World \u7ec4\u4ef6","description":"\u672c\u7ae0\u8282\u5bf9 Kubebb \u7684\u7ec4\u4ef6\u6982\u5ff5\u8fdb\u884c\u8be6\u7ec6\u4ecb\u7ecd","sidebar":"tutorialSidebar"},"lowcode-development/development/frontend":{"id":"lowcode-development/development/frontend","title":"\u524d\u7aef\u5f00\u53d1","description":"\u57fa\u4e8e\u4f4e\u4ee3\u7801\u5f15\u64ce\u8fdb\u884c\u524d\u7aef\u9875\u9762\u5f00\u53d1","sidebar":"tutorialSidebar"},"lowcode-development/intro":{"id":"lowcode-development/intro","title":"\u4ecb\u7ecd","description":"","sidebar":"tutorialSidebar"},"quick-start/buildingbase_quickstart":{"id":"quick-start/buildingbase_quickstart","title":"\u5b89\u88c5\u5e95\u5ea7","description":"\u672c\u7ae0\u8282\u4e3b\u8981\u4ecb\u7ecd\u5e95\u5ea7\u7ec4\u4ef6\u7684\u90e8\u7f72\u6b65\u9aa4\uff0c\u5305\u62ec\u76f8\u5173\u7684\u5f00\u6e90\u6280\u672f\u7ec4\u4ef6\u3001\u524d\u63d0\u6761\u4ef6\u4ee5\u53ca\u5feb\u901f\u90e8\u7f72\uff0c\u5e76\u5c06\u90e8\u7f72\u7684\u96c6\u7fa4\u6dfb\u52a0\u5230\u670d\u52a1\u95e8\u6237\u4e0a\u3002","sidebar":"tutorialSidebar"},"quick-start/core_quickstart":{"id":"quick-start/core_quickstart","title":"\u5b89\u88c5\u5185\u6838","description":"\u5b89\u88c5\u524d\u9700\u5b8c\u6210\u9884\u5148\u51c6\u5907\u3002","sidebar":"tutorialSidebar"},"quick-start/prerequisite":{"id":"quick-start/prerequisite","title":"\u9884\u5148\u51c6\u5907","description":"\u57fa\u7840\u73af\u5883","sidebar":"tutorialSidebar"}}}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[53],{1109:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"link","label":"\u603b\u89c8","href":"/website/docs/intro","docId":"intro"},{"type":"category","label":"\u5feb\u901f\u5f00\u59cb","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u9884\u5148\u51c6\u5907","href":"/website/docs/quick-start/prerequisite","docId":"quick-start/prerequisite"},{"type":"link","label":"\u5b89\u88c5\u5185\u6838","href":"/website/docs/quick-start/core_quickstart","docId":"quick-start/core_quickstart"},{"type":"link","label":"\u5b89\u88c5\u5e95\u5ea7","href":"/website/docs/quick-start/buildingbase_quickstart","docId":"quick-start/buildingbase_quickstart"}],"href":"/website/docs/category/\u5feb\u901f\u5f00\u59cb"},{"type":"category","label":"\u5185\u6838Kit","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u4ecb\u7ecd","href":"/website/docs/core/intro","docId":"core/intro"},{"type":"category","label":"\u6982\u5ff5","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u7ec4\u4ef6\u4ed3\u5e93CRD","href":"/website/docs/core/concepts/repository","docId":"core/concepts/repository"},{"type":"link","label":"\u7ec4\u4ef6CRD","href":"/website/docs/core/concepts/component","docId":"core/concepts/component"},{"type":"link","label":"\u7ec4\u4ef6\u90e8\u7f72CRD","href":"/website/docs/core/concepts/componentplan","docId":"core/concepts/componentplan"},{"type":"link","label":"\u7ec4\u4ef6\u8ba2\u9605CRD","href":"/website/docs/core/concepts/subscription","docId":"core/concepts/subscription"}],"href":"/website/docs/category/\u6982\u5ff5"},{"type":"category","label":"\u7528\u6237\u6307\u5357","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u79c1\u6709\u96c6\u7fa4\u90e8\u7f72\u65b9\u6848","href":"/website/docs/core/userguide/privatecluster","docId":"core/userguide/privatecluster"}],"href":"/website/docs/category/\u7528\u6237\u6307\u5357"},{"type":"link","label":"\u7ec4\u4ef6\u8bc4\u7ea7","href":"/website/docs/core/rating","docId":"core/rating"},{"type":"link","label":"\u8def\u7ebf\u56fe","href":"/website/docs/core/roadmap","docId":"core/roadmap"}],"href":"/website/docs/category/\u5185\u6838kit"},{"type":"category","label":"\u5e95\u5ea7Kit","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u4ecb\u7ecd","href":"/website/docs/building-base/intro","docId":"building-base/intro"},{"type":"category","label":"\u81ea\u5b9a\u4e49\u914d\u7f6e","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u81ea\u5b9a\u4e49\u95e8\u6237","href":"/website/docs/building-base/configuration/customize-portal","docId":"building-base/configuration/customize-portal"},{"type":"link","label":"\u81ea\u5b9a\u4e49\u83dc\u5355","href":"/website/docs/building-base/configuration/customize-menu","docId":"building-base/configuration/customize-menu"},{"type":"link","label":"\u4f7f\u7528\u7b2c\u4e09\u65b9\u7cfb\u7edf\u767b\u5f55","href":"/website/docs/building-base/configuration/3rd-party-account","docId":"building-base/configuration/3rd-party-account"},{"type":"link","label":"\u914d\u7f6e\u5ba1\u8ba1\u80fd\u529b","href":"/website/docs/building-base/configuration/audit-config","docId":"building-base/configuration/audit-config"},{"type":"link","label":"\u96c6\u6210\u5355\u70b9\u767b\u5f55","href":"/website/docs/building-base/configuration/oidc-integration","docId":"building-base/configuration/oidc-integration"}],"href":"/website/docs/category/\u81ea\u5b9a\u4e49\u914d\u7f6e"}],"href":"/website/docs/category/\u5e95\u5ea7kit"},{"type":"category","label":"\u4f4e\u7801Kit","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u4ecb\u7ecd","href":"/website/docs/lowcode-development/intro","docId":"lowcode-development/intro"},{"type":"link","label":"\u5f00\u53d1\u6a21\u5f0f","href":"/website/docs/lowcode-development/development_pattern","docId":"lowcode-development/development_pattern"},{"type":"category","label":"\u7ec4\u4ef6\u5f00\u53d1","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u524d\u7aef\u5f00\u53d1","href":"/website/docs/lowcode-development/development/frontend","docId":"lowcode-development/development/frontend"},{"type":"link","label":"BFF\u5c42API\u5f00\u53d1","href":"/website/docs/lowcode-development/development/bff-apis","docId":"lowcode-development/development/bff-apis"},{"type":"link","label":"\u5f00\u53d1\u540e\u7aef\u670d\u52a1\u7ec4\u4ef6","href":"/website/docs/lowcode-development/development/backend-operator","docId":"lowcode-development/development/backend-operator"},{"type":"link","label":"\u53d1\u5e03\u4e00\u4e2a Hello World \u7ec4\u4ef6","href":"/website/docs/lowcode-development/development/develop-hello-world","docId":"lowcode-development/development/develop-hello-world"}],"href":"/website/docs/category/\u7ec4\u4ef6\u5f00\u53d1"}],"href":"/website/docs/category/\u4f4e\u7801kit"},{"type":"link","label":"\u5e38\u89c1\u95ee\u9898","href":"/website/docs/FAQ","docId":"FAQ"},{"type":"link","label":"\u8d21\u732e\u6307\u5357","href":"/website/docs/contribute","docId":"contribute"}]},"docs":{"building-base/configuration/3rd-party-account":{"id":"building-base/configuration/3rd-party-account","title":"\u4f7f\u7528\u7b2c\u4e09\u65b9\u7cfb\u7edf\u767b\u5f55","description":"\u76ee\u524d\u57fa\u4e8e dex \u652f\u6301\u5916\u90e8\u8ba4\u8bc1\u7cfb\u7edf\u7684\u96c6\u6210\uff0c\u5b9e\u73b0\u670d\u52a1\u95e8\u6237\u4e0e\u7b2c\u4e09\u65b9\u8ba4\u8bc1\u7cfb\u7edf\u7684\u7edf\u4e00\u8d26\u53f7\u53ca\u5355\u70b9\u767b\u5f55\u3002","sidebar":"tutorialSidebar"},"building-base/configuration/audit-config":{"id":"building-base/configuration/audit-config","title":"\u914d\u7f6e\u5ba1\u8ba1\u80fd\u529b","description":"1\u3001\u7f16\u8f91 audit-policy.yaml \u6587\u4ef6\u5bf9\u5ba1\u8ba1\u8fdb\u884c\u914d\u7f6e\uff0c`kubectl edit cm audit-policy-conf -n u4a-system`","sidebar":"tutorialSidebar"},"building-base/configuration/customize-menu":{"id":"building-base/configuration/customize-menu","title":"\u81ea\u5b9a\u4e49\u83dc\u5355","description":"kubebb \u7684\u6240\u6709\u83dc\u5355\u5747\u57fa\u4e8e menu \u7684 CRD \u8fdb\u884c\u5b9a\u4e49\uff0c\u5982\u679c\u9700\u8981\u6dfb\u52a0\u81ea\u5df1\u7684\u83dc\u5355\uff0c\u53ef\u4ee5\u53c2\u8003\u4ee5\u4e0b memnu \u793a\u4f8b:","sidebar":"tutorialSidebar"},"building-base/configuration/customize-portal":{"id":"building-base/configuration/customize-portal","title":"\u81ea\u5b9a\u4e49\u95e8\u6237","description":"\u81ea\u5b9a\u4e49 logo","sidebar":"tutorialSidebar"},"building-base/configuration/oidc-integration":{"id":"building-base/configuration/oidc-integration","title":"\u96c6\u6210\u5355\u70b9\u767b\u5f55","description":"\u901a\u8fc7 OIDC \u534f\u8bae\uff0c\u5b9e\u73b0\u540c kubebb \u7684\u7edf\u4e00\u8d26\u53f7\u3001\u8ba4\u8bc1\u53ca\u5355\u70b9\u767b\u5f55\u529f\u80fd\u3002","sidebar":"tutorialSidebar"},"building-base/intro":{"id":"building-base/intro","title":"\u4ecb\u7ecd","description":"\u6280\u672f\u7ec4\u4ef6","sidebar":"tutorialSidebar"},"contribute":{"id":"contribute","title":"\u8d21\u732e\u6307\u5357","description":"\u6b22\u8fce\u6765\u5230 KubeBB!","sidebar":"tutorialSidebar"},"core/concepts/component":{"id":"core/concepts/component","title":"\u7ec4\u4ef6CRD","description":"\u7ec4\u4ef6\u662f\u5c06 chart package \u6620\u5c04\u4e3a\u96c6\u7fa4\u8d44\u6e90\u7684\u4e00\u4e2a\u6982\u5ff5\uff0c\u7ec4\u4ef6\u5b9a\u4e49\u4e86 chart package \u7684\u57fa\u7840\u63cf\u8ff0\u4fe1\u606f\uff0c\u7248\u672c\u4fe1\u606f\u7b49\u3002\u7ec4\u4ef6\u4e00\u822c\u7531\u4ed3\u5e93\u521b\u5efa\u51fa\u6765\uff0c\u65e0\u9700\u624b\u52a8\u521b\u5efa\u3002","sidebar":"tutorialSidebar"},"core/concepts/componentplan":{"id":"core/concepts/componentplan","title":"\u7ec4\u4ef6\u90e8\u7f72CRD","description":"ComponentPlan \u4f1a\u5b89\u88c5\u4e00\u4e2a\u7ec4\u4ef6\u5230\u96c6\u7fa4\uff0c\u7c7b\u4f3c\u6267\u884c\u4e00\u6b21 helm install/upgrade \u64cd\u4f5c\uff0c\u53ea\u4e0d\u8fc7\u5c06 helm install/upgrade \u547d\u4ee4\u4e2d\u7684\u53c2\u6570\u56fa\u5316\u5230 ComponentPlan \u7684 spec","sidebar":"tutorialSidebar"},"core/concepts/repository":{"id":"core/concepts/repository","title":"\u7ec4\u4ef6\u4ed3\u5e93CRD","description":"\u4ed3\u5e93\u662f\u5c06 chart repository \u6620\u5c04\u4e3a\u96c6\u7fa4\u8d44\u6e90\u7684\u4e00\u4e2a\u6982\u5ff5\u3002\u4ed3\u5e93\u5b9a\u4e49\u4e86 chart repository \u7684 URL\uff0c\u8ba4\u8bc1\u4fe1\u606f\u7b49\u76f8\u5173\u4fe1\u606f\u3002\u4ed3\u5e93\u662f\u7ec4\u4ef6\u90e8\u7f72\uff0c\u5347\u7ea7\u7684\u57fa\u7840\u3002","sidebar":"tutorialSidebar"},"core/concepts/subscription":{"id":"core/concepts/subscription","title":"\u7ec4\u4ef6\u8ba2\u9605CRD","description":"\u521b\u5efa\u4e00\u4e2a\u8ba2\u9605\uff0c\u8868\u793a\u7528\u6237\u5c06\u8ffd\u8e2a\u4e00\u4e2a\u7ec4\u4ef6\uff08Component\uff09\u5728 \u4ed3\u5e93\uff08Repository\uff09\u4e2d\u7684\u66f4\u65b0\uff0c\u5f53\u7ec4\u4ef6\u66f4\u65b0\u65f6\uff0c\u8be5\u7ec4\u4ef6\u4f1a\u6839\u636e\u8ba2\u9605\u4e2d\u7684\u914d\u7f6e\u81ea\u52a8\u6216\u5f85\u6279\u51c6\u540e\u5b89\u88c5\u5230\u96c6\u7fa4\u4e2d\u3002","sidebar":"tutorialSidebar"},"core/intro":{"id":"core/intro","title":"\u4ecb\u7ecd","description":"\u5185\u6838\u57fa\u4e8ekubernetes operator\u6a21\u5f0f\u8fdb\u884c\u5f00\u53d1\uff0c\u63d0\u4f9b\u5b8c\u6574\u7684\u7ec4\u4ef6\u751f\u547d\u5468\u671f\u7ba1\u7406\u3001\u7ec4\u4ef6\u8ba2\u9605\u548c\u81ea\u52a8\u5316\u90e8\u7f72\u80fd\u529b\uff0c\u5e76\u901a\u8fc7tekton\u6269\u5c55\u5b9e\u73b0\u7ec4\u4ef6\u81ea\u52a8\u5316\u8bc4\u7ea7\u548c\u5b89\u88c5\u524d\u6821\u9a8c\u7b49\u80fd\u529b\u3002","sidebar":"tutorialSidebar"},"core/rating":{"id":"core/rating","title":"\u7ec4\u4ef6\u8bc4\u7ea7","description":"\u7ec4\u4ef6\u8bc4\u7ea7\u7684\u76ee\u7684\u662f\u901a\u8fc7\u5c3d\u53ef\u80fd\u591a\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u4ece\u591a\u4e2a\u7ef4\u5ea6\u6765\u8bc4\u4f30\u4e00\u4e2a\u7ec4\u4ef6\u3002\u56e0\u6b64\uff0c\u7ec4\u4ef6\u8bc4\u7ea7\u4e09\u4e2a\u90e8\u5206\u7684\u5185\u5bb9:","sidebar":"tutorialSidebar"},"core/roadmap":{"id":"core/roadmap","title":"\u8def\u7ebf\u56fe","description":"v0.1.0","sidebar":"tutorialSidebar"},"core/userguide/privatecluster":{"id":"core/userguide/privatecluster","title":"\u79c1\u6709\u96c6\u7fa4\u90e8\u7f72\u65b9\u6848","description":"\u5728\u4f7f\u7528 kubebb-core \u4e4b\u524d\u6211\u4eec\u9700\u8981\u6709\u4e00\u4e2a k8s \u96c6\u7fa4\uff0c\u7248\u672c\u662f 1.24+\u3002","sidebar":"tutorialSidebar"},"FAQ":{"id":"FAQ","title":"\u5e38\u89c1\u95ee\u9898","description":"BuildingBase\u76f8\u5173","sidebar":"tutorialSidebar"},"intro":{"id":"intro","title":"\u603b\u89c8","description":"KubeBB(Kubernetes Building Blocks)\u662f\u4e00\u79cd\u7531\u5185\u6838\u9a71\u52a8\u7684\u7ec4\u4ef6\u751f\u547d\u5468\u671f\u7ba1\u7406\u5e73\u53f0\uff0c\u96c6\u6210\u5f00\u7bb1\u5373\u7528\u7684\u4e91\u539f\u751f\u5e95\u5ea7\u548c\u4f4e\u7801\u7ec4\u4ef6\u5f00\u53d1\u80fd\u529b,\u6574\u5408\u5b9e\u73b0\u4e91\u539f\u751f\u4e09\u5c42\u7ec4\u4ef6\u6a21\u5f0f\u3002","sidebar":"tutorialSidebar"},"lowcode-development/development_pattern":{"id":"lowcode-development/development_pattern","title":"\u5f00\u53d1\u6a21\u5f0f","description":"KubeBB\u7ec4\u4ef6\u7684\u5f00\u53d1\u91c7\u53d6\u524d\u540e\u7aef\u5206\u79bb\uff0c\u4ee5 K8S \u4e3a\u6838\u5fc3\u7684\u5f00\u53d1\u6846\u67b6\uff0c\u9075\u5faa K8S \u7684\u6269\u5c55\u673a\u5236\u53ca API \u89c4\u8303\u3002\u6574\u4f53\u5f00\u53d1\u67b6\u6784\u7684\u57fa\u672c\u903b\u8f91\u5982\u4e0b\u56fe\u6240\u793a\uff1a","sidebar":"tutorialSidebar"},"lowcode-development/development/backend-operator":{"id":"lowcode-development/development/backend-operator","title":"\u5f00\u53d1\u540e\u7aef\u670d\u52a1\u7ec4\u4ef6","description":"\u672c\u7ae0\u8282\u5bf9 Kubebb \u7684\u540e\u7aef\u670d\u52a1\u5f00\u53d1\u6807\u51c6\u8fdb\u884c\u8be6\u7ec6\u4ecb\u7ecd\uff0c\u4e3b\u8981\u662f\u57fa\u4e8e Controller + CRD \u7684 K8S Operator \u7684\u5f00\u53d1\u6a21\u5f0f\u3002","sidebar":"tutorialSidebar"},"lowcode-development/development/bff-apis":{"id":"lowcode-development/development/bff-apis","title":"BFF\u5c42API\u5f00\u53d1","description":"\u672c\u7ae0\u8282\u5bf9 Kubebb \u7684 BFF \u5c42\u8fdb\u884c\u8be6\u7ec6\u4ecb\u7ecd\uff0c\u5305\u62ec\u5982\u4f55\u4f7f\u7528 GraphQL \u5feb\u901f\u5f00\u53d1 BFF \u5c42\u7684 API","sidebar":"tutorialSidebar"},"lowcode-development/development/develop-hello-world":{"id":"lowcode-development/development/develop-hello-world","title":"\u53d1\u5e03\u4e00\u4e2a Hello World \u7ec4\u4ef6","description":"\u672c\u7ae0\u8282\u5bf9 Kubebb \u7684\u7ec4\u4ef6\u6982\u5ff5\u8fdb\u884c\u8be6\u7ec6\u4ecb\u7ecd","sidebar":"tutorialSidebar"},"lowcode-development/development/frontend":{"id":"lowcode-development/development/frontend","title":"\u524d\u7aef\u5f00\u53d1","description":"\u57fa\u4e8e\u4f4e\u4ee3\u7801\u5f15\u64ce\u8fdb\u884c\u524d\u7aef\u9875\u9762\u5f00\u53d1","sidebar":"tutorialSidebar"},"lowcode-development/intro":{"id":"lowcode-development/intro","title":"\u4ecb\u7ecd","description":"","sidebar":"tutorialSidebar"},"quick-start/buildingbase_quickstart":{"id":"quick-start/buildingbase_quickstart","title":"\u5b89\u88c5\u5e95\u5ea7","description":"\u672c\u7ae0\u8282\u4e3b\u8981\u4ecb\u7ecd\u5e95\u5ea7\u7ec4\u4ef6\u7684\u90e8\u7f72\u6b65\u9aa4\uff0c\u5305\u62ec\u76f8\u5173\u7684\u5f00\u6e90\u6280\u672f\u7ec4\u4ef6\u3001\u524d\u63d0\u6761\u4ef6\u4ee5\u53ca\u5feb\u901f\u90e8\u7f72\uff0c\u5e76\u5c06\u90e8\u7f72\u7684\u96c6\u7fa4\u6dfb\u52a0\u5230\u670d\u52a1\u95e8\u6237\u4e0a\u3002","sidebar":"tutorialSidebar"},"quick-start/core_quickstart":{"id":"quick-start/core_quickstart","title":"\u5b89\u88c5\u5185\u6838","description":"\u5b89\u88c5\u524d\u9700\u5b8c\u6210\u9884\u5148\u51c6\u5907\u3002","sidebar":"tutorialSidebar"},"quick-start/prerequisite":{"id":"quick-start/prerequisite","title":"\u9884\u5148\u51c6\u5907","description":"\u57fa\u7840\u73af\u5883","sidebar":"tutorialSidebar"}}}')}}]); \ No newline at end of file diff --git a/assets/js/ad895e75.a7b4397d.js b/assets/js/ad895e75.a7b4397d.js deleted file mode 100644 index c200b343d..000000000 --- a/assets/js/ad895e75.a7b4397d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[4288],{3905:(e,n,t)=>{t.d(n,{Zo:()=>u,kt:()=>f});var r=t(7294);function a(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function l(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function i(e){for(var n=1;n=0||(a[t]=e[t]);return a}(e,n);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var s=r.createContext({}),c=function(e){var n=r.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},u=function(e){var n=c(e.components);return r.createElement(s.Provider,{value:n},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},d=r.forwardRef((function(e,n){var t=e.components,a=e.mdxType,l=e.originalType,s=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),p=c(t),d=a,f=p["".concat(s,".").concat(d)]||p[d]||m[d]||l;return t?r.createElement(f,i(i({ref:n},u),{},{components:t})):r.createElement(f,i({ref:n},u))}));function f(e,n){var t=arguments,a=n&&n.mdxType;if("string"==typeof e||a){var l=t.length,i=new Array(l);i[0]=d;var o={};for(var s in n)hasOwnProperty.call(n,s)&&(o[s]=n[s]);o.originalType=e,o[p]="string"==typeof e?e:a,i[1]=o;for(var c=2;c{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>i,default:()=>m,frontMatter:()=>l,metadata:()=>o,toc:()=>c});var r=t(7462),a=(t(7294),t(3905));const l={sidebar_position:8},i="\u5e38\u89c1\u95ee\u9898",o={unversionedId:"FAQ",id:"FAQ",title:"\u5e38\u89c1\u95ee\u9898",description:"BuildingBase\u90e8\u7f72",source:"@site/docs/FAQ.md",sourceDirName:".",slug:"/FAQ",permalink:"/website/docs/FAQ",draft:!1,tags:[],version:"current",sidebarPosition:8,frontMatter:{sidebar_position:8},sidebar:"tutorialSidebar",previous:{title:"\u53d1\u5e03\u4e00\u4e2a Hello World \u7ec4\u4ef6",permalink:"/website/docs/lowcode-development/development/develop-hello-world"},next:{title:"\u8d21\u732e\u6307\u5357",permalink:"/website/docs/contribute"}},s={},c=[{value:"BuildingBase\u90e8\u7f72",id:"buildingbase\u90e8\u7f72",level:2},{value:"1. \u79df\u6237\u7ba1\u7406\u63a7\u5236\u5668probe liveness\u6821\u9a8c\u5931\u8d25\uff0c\u5bfc\u81f4\u65e0\u6cd5\u542f\u52a8",id:"1-\u79df\u6237\u7ba1\u7406\u63a7\u5236\u5668probe-liveness\u6821\u9a8c\u5931\u8d25\u5bfc\u81f4\u65e0\u6cd5\u542f\u52a8",level:3},{value:"\u95ee\u9898\u91cd\u73b0",id:"\u95ee\u9898\u91cd\u73b0",level:4},{value:"\u95ee\u9898\u539f\u56e0",id:"\u95ee\u9898\u539f\u56e0",level:4},{value:"\u89e3\u51b3\u65b9\u6848",id:"\u89e3\u51b3\u65b9\u6848",level:4}],u={toc:c},p="wrapper";function m(e){let{components:n,...t}=e;return(0,a.kt)(p,(0,r.Z)({},u,t,{components:n,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"\u5e38\u89c1\u95ee\u9898"},"\u5e38\u89c1\u95ee\u9898"),(0,a.kt)("h2",{id:"buildingbase\u90e8\u7f72"},"BuildingBase\u90e8\u7f72"),(0,a.kt)("h3",{id:"1-\u79df\u6237\u7ba1\u7406\u63a7\u5236\u5668probe-liveness\u6821\u9a8c\u5931\u8d25\u5bfc\u81f4\u65e0\u6cd5\u542f\u52a8"},"1. \u79df\u6237\u7ba1\u7406\u63a7\u5236\u5668probe liveness\u6821\u9a8c\u5931\u8d25\uff0c\u5bfc\u81f4\u65e0\u6cd5\u542f\u52a8"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\u73af\u5883",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"Azure VM (Ubuntu 22.04)")))),(0,a.kt)("h4",{id:"\u95ee\u9898\u91cd\u73b0"},"\u95ee\u9898\u91cd\u73b0"),(0,a.kt)("p",null,"\u8fd0\u884c",(0,a.kt)("inlineCode",{parentName:"p"},"helm install --wait -n u4a-system u4a-component ."),"\u540e\uff0c\u53d1\u73b0\u79df\u6237\u7ba1\u7406\u63a7\u5236\u5668\u4e00\u76f4\u5904\u4e8e",(0,a.kt)("inlineCode",{parentName:"p"},"CrashLoopBackOff"),"\u72b6\u6001:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-shell"},"\u279c ~ k get pods -nu4a-system\nNAME READY STATUS RESTARTS AGE\nbff-server-9cc54cbc5-gcp6x 1/1 Running 0 17m\ncapsule-controller-manager-5b9864f9bf-7mkhb 0/1 CrashLoopBackOff 8 (27s ago) 17m\ncert-manager-79d7998d9-c7q8n 1/1 Running 0 33m\ncert-manager-cainjector-57bb7f44dd-c9sj6 1/1 Running 0 33m\ncert-manager-webhook-65b494ccf4-4blzx 1/1 Running 0 33m\ncluster-component-ingress-nginx-controller-86d6bfdbf6-qj6hf 1/1 Running 0 33m\nkube-oidc-proxy-fc6b54b8c-ddc2s 1/1 Running 0 17m\noidc-server-84cbfcc9f5-bmmf9 2/2 Running 0 17m\nresource-view-controller-94645667-ttvst 1/1 Running 0 17m\n")),(0,a.kt)("p",null,"\u67e5\u770b\u65e5\u5fd7\u53d1\u73b0\u5982\u4e0b\u9519\u8bef\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-shell"},'Events:\n Type Reason Age From Message\n ---- ------ ---- ---- -------\n Normal Scheduled 4m35s default-scheduler Successfully assigned u4a-system/capsule-controller-manager-5b9864f9bf-7mkhb to kubebb-core-worker\n Normal Pulling 4m34s kubelet Pulling image "hub.tenxcloud.com/u4a-component/capsule:v0.1.2-20221122"\n Normal Pulled 3m57s kubelet Successfully pulled image "hub.tenxcloud.com/u4a-component/capsule:v0.1.2-20221122" in 36.616134797s\n Warning Unhealthy 3m53s kubelet Liveness probe failed: Get "http://10.244.1.6:10080/healthz": context deadline exceeded (Client.Timeout exceeded while awaiting headers)\n Warning Unhealthy 3m44s kubelet Readiness probe failed: Get "http://10.244.1.6:10080/readyz": dial tcp 10.244.1.6:10080: connect: connection refused\n Warning Unhealthy 3m44s kubelet Liveness probe failed: Get "http://10.244.1.6:10080/healthz": dial tcp 10.244.1.6:10080: connect: connection refused\n Normal Created 3m34s (x3 over 3m57s) kubelet Created container manager\n Normal Started 3m34s (x3 over 3m57s) kubelet Started container manager\n Warning Unhealthy 3m31s (x7 over 3m55s) kubelet Readiness probe failed: Get "http://10.244.1.6:10080/readyz": context deadline exceeded (Client.Timeout exceeded while awaiting headers)\n Warning BackOff 3m13s (x4 over 3m42s) kubelet Back-off restarting failed container\n Normal Pulled 3m1s (x3 over 3m50s) kubelet Container image "hub.tenxcloud.com/u4a-component/capsule:v0.1.2-20221122" already present on machine\n')),(0,a.kt)("h4",{id:"\u95ee\u9898\u539f\u56e0"},"\u95ee\u9898\u539f\u56e0"),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"\u611f\u8c22 @0xff-dev \u63d0\u4f9b\u7684\u89e3\u51b3\u65b9\u6848")),(0,a.kt)("p",null,"\u53bb\u9664liveness probe\u540e\uff0c\u80fd\u770b\u5230\u5bb9\u5668\u62a5\u9519\uff0c\u53d1\u73b0\u662f\u7531\u4e8ecapsule\u521d\u59cb\u5316\u8fc7\u7a0b\u4e2d\u8d85\u51fa\u4e86\u64cd\u4f5c\u7cfb\u7edf\u5141\u8bb8\u7684\u6700\u5927\u6587\u4ef6\u6253\u5f00\u6570\uff0c\u5bfc\u81f4capsule\u65e0\u6cd5\u542f\u52a8\u3002"),(0,a.kt)("h4",{id:"\u89e3\u51b3\u65b9\u6848"},"\u89e3\u51b3\u65b9\u6848"),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"\u611f\u8c22 @0xff-dev \u63d0\u4f9b\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u9700\u8bbe\u7f6e fs.inotify.max_user_instances=81920")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\u7531\u5fae\u8f6f\u7684New Bing\u89e3\u7b54\u5f97\u5230\u7684\u7b54\u6848\uff1a")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"fs.inotify.max_user_instances")," \u662f\u4e00\u4e2a\u5185\u6838\u53c2\u6570\uff0c\u5b83\u8868\u793a\u6bcf\u4e2a\u7528\u6237\u53ef\u4ee5\u521b\u5efa\u7684 ",(0,a.kt)("inlineCode",{parentName:"p"},"inotify")," \u5b9e\u4f8b\u7684\u6700\u5927\u6570\u91cf\u3002",(0,a.kt)("inlineCode",{parentName:"p"},"inotify")," \u662f\u4e00\u4e2a\u7528\u6765\u76d1\u89c6\u6587\u4ef6\u7cfb\u7edf\u53d8\u5316\u7684\u673a\u5236\u3002\u5982\u679c\u4f60\u60f3\u8981\u4fee\u6539\u8fd9\u4e2a\u53c2\u6570\uff0c\u4f60\u6709\u4e24\u79cd\u65b9\u6cd5\uff1a"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\u4e34\u65f6\u4fee\u6539\uff1a\u4f60\u53ef\u4ee5\u4f7f\u7528 sysctl -w \u547d\u4ee4\u6765\u4e34\u65f6\u4fee\u6539\u8fd9\u4e2a\u53c2\u6570\uff0c\u4f8b\u5982\uff1a")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"sudo sysctl -w fs.inotify.max_user_instances=81920\n")),(0,a.kt)("p",null,"\u8fd9\u4e2a\u547d\u4ee4\u4f1a\u628a ",(0,a.kt)("inlineCode",{parentName:"p"},"fs.inotify.max_user_instances")," \u7684\u503c\u8bbe\u7f6e\u4e3a 81920\uff0c\u5e76\u5199\u5165",(0,a.kt)("inlineCode",{parentName:"p"},"/proc/sys/fs/inotify/max_user_instances")," \u6587\u4ef6\u3002\u4f46\u662f\u8fd9\u4e2a\u4fee\u6539\u53ea\u5728\u91cd\u542f\u4e4b\u524d\u6709\u6548\uff0c\u91cd\u542f\u540e\u4f1a\u6062\u590d\u9ed8\u8ba4\u503c\u3002"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\u6c38\u4e45\u4fee\u6539\uff1a\u4f60\u53ef\u4ee5\u5728 /etc/sysctl.conf \u6587\u4ef6\u4e2d\u6dfb\u52a0\u4e00\u884c\uff1a")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"fs.inotify.max_user_instances=81920\n")),(0,a.kt)("p",null,"\u7136\u540e\u8fd0\u884c ",(0,a.kt)("inlineCode",{parentName:"p"},"sudo sysctl -p"),"\u547d\u4ee4\u6765\u52a0\u8f7d\u8fd9\u4e2a\u6587\u4ef6\u4e2d\u7684\u8bbe\u7f6e\u3002\u8fd9\u6837\uff0c\u8fd9\u4e2a\u4fee\u6539\u5c31\u4f1a\u5728\u6bcf\u6b21\u91cd\u542f\u540e\u751f\u6548\u3002"),(0,a.kt)("p",null,"\u5982\u679c\u4f60\u60f3\u4e86\u89e3\u66f4\u591a\u5173\u4e8e sysctl \u548c fs.inotify.max_user_instances \u7684\u4fe1\u606f\uff0c\u8bf7\u53c2\u8003\u4ee5\u4e0b\u94fe\u63a5\uff1a"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://www.suse.com/support/kb/doc/?id=000020048"},"How to increase the inotify.max_user_watches and inotify.max_user_instances sysctls on a Linux host | Support | SUSE")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://unix.stackexchange.com/questions/444998/how-to-set-and-understand-fs-notify-max-user-watches"},"How to set and understand fs.notify.max_user_watches - Unix & Linux Stack Exchange")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://askubuntu.com/questions/1068168/sysctl-permission-denied-on-key-fs-inotify-max-user-watches"},"sysctl: permission denied on key 'fs.inotify.max_user_watches' - Ask Ubuntu"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ad895e75.d0e05bf9.js b/assets/js/ad895e75.d0e05bf9.js new file mode 100644 index 000000000..9f56979b6 --- /dev/null +++ b/assets/js/ad895e75.d0e05bf9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[4288],{3905:(e,n,t)=>{t.d(n,{Zo:()=>u,kt:()=>f});var a=t(7294);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function l(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function i(e){for(var n=1;n=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var s=a.createContext({}),c=function(e){var n=a.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},u=function(e){var n=c(e.components);return a.createElement(s.Provider,{value:n},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},d=a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,l=e.originalType,s=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),p=c(t),d=r,f=p["".concat(s,".").concat(d)]||p[d]||m[d]||l;return t?a.createElement(f,i(i({ref:n},u),{},{components:t})):a.createElement(f,i({ref:n},u))}));function f(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var l=t.length,i=new Array(l);i[0]=d;var o={};for(var s in n)hasOwnProperty.call(n,s)&&(o[s]=n[s]);o.originalType=e,o[p]="string"==typeof e?e:r,i[1]=o;for(var c=2;c{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>i,default:()=>m,frontMatter:()=>l,metadata:()=>o,toc:()=>c});var a=t(7462),r=(t(7294),t(3905));const l={sidebar_position:8},i="\u5e38\u89c1\u95ee\u9898",o={unversionedId:"FAQ",id:"FAQ",title:"\u5e38\u89c1\u95ee\u9898",description:"BuildingBase\u76f8\u5173",source:"@site/docs/FAQ.md",sourceDirName:".",slug:"/FAQ",permalink:"/website/docs/FAQ",draft:!1,tags:[],version:"current",sidebarPosition:8,frontMatter:{sidebar_position:8},sidebar:"tutorialSidebar",previous:{title:"\u53d1\u5e03\u4e00\u4e2a Hello World \u7ec4\u4ef6",permalink:"/website/docs/lowcode-development/development/develop-hello-world"},next:{title:"\u8d21\u732e\u6307\u5357",permalink:"/website/docs/contribute"}},s={},c=[{value:"BuildingBase\u76f8\u5173",id:"buildingbase\u76f8\u5173",level:2},{value:"\u90e8\u7f72\u95ee\u9898",id:"\u90e8\u7f72\u95ee\u9898",level:3},{value:"1. \u79df\u6237\u7ba1\u7406\u63a7\u5236\u5668probe liveness\u6821\u9a8c\u5931\u8d25\uff0c\u5bfc\u81f4\u65e0\u6cd5\u542f\u52a8",id:"1-\u79df\u6237\u7ba1\u7406\u63a7\u5236\u5668probe-liveness\u6821\u9a8c\u5931\u8d25\u5bfc\u81f4\u65e0\u6cd5\u542f\u52a8",level:4},{value:"\u95ee\u9898\u91cd\u73b0",id:"\u95ee\u9898\u91cd\u73b0",level:4},{value:"\u95ee\u9898\u539f\u56e0",id:"\u95ee\u9898\u539f\u56e0",level:4},{value:"\u89e3\u51b3\u65b9\u6848",id:"\u89e3\u51b3\u65b9\u6848",level:4}],u={toc:c},p="wrapper";function m(e){let{components:n,...t}=e;return(0,r.kt)(p,(0,a.Z)({},u,t,{components:n,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"\u5e38\u89c1\u95ee\u9898"},"\u5e38\u89c1\u95ee\u9898"),(0,r.kt)("h2",{id:"buildingbase\u76f8\u5173"},"BuildingBase\u76f8\u5173"),(0,r.kt)("h3",{id:"\u90e8\u7f72\u95ee\u9898"},"\u90e8\u7f72\u95ee\u9898"),(0,r.kt)("h4",{id:"1-\u79df\u6237\u7ba1\u7406\u63a7\u5236\u5668probe-liveness\u6821\u9a8c\u5931\u8d25\u5bfc\u81f4\u65e0\u6cd5\u542f\u52a8"},"1. \u79df\u6237\u7ba1\u7406\u63a7\u5236\u5668probe liveness\u6821\u9a8c\u5931\u8d25\uff0c\u5bfc\u81f4\u65e0\u6cd5\u542f\u52a8"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\u73af\u5883",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Azure VM (Ubuntu 22.04)")))),(0,r.kt)("h4",{id:"\u95ee\u9898\u91cd\u73b0"},"\u95ee\u9898\u91cd\u73b0"),(0,r.kt)("p",null,"\u8fd0\u884c",(0,r.kt)("inlineCode",{parentName:"p"},"helm install --wait -n u4a-system u4a-component ."),"\u540e\uff0c\u53d1\u73b0\u79df\u6237\u7ba1\u7406\u63a7\u5236\u5668\u4e00\u76f4\u5904\u4e8e",(0,r.kt)("inlineCode",{parentName:"p"},"CrashLoopBackOff"),"\u72b6\u6001:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"\u279c ~ k get pods -nu4a-system\nNAME READY STATUS RESTARTS AGE\nbff-server-9cc54cbc5-gcp6x 1/1 Running 0 17m\ncapsule-controller-manager-5b9864f9bf-7mkhb 0/1 CrashLoopBackOff 8 (27s ago) 17m\ncert-manager-79d7998d9-c7q8n 1/1 Running 0 33m\ncert-manager-cainjector-57bb7f44dd-c9sj6 1/1 Running 0 33m\ncert-manager-webhook-65b494ccf4-4blzx 1/1 Running 0 33m\ncluster-component-ingress-nginx-controller-86d6bfdbf6-qj6hf 1/1 Running 0 33m\nkube-oidc-proxy-fc6b54b8c-ddc2s 1/1 Running 0 17m\noidc-server-84cbfcc9f5-bmmf9 2/2 Running 0 17m\nresource-view-controller-94645667-ttvst 1/1 Running 0 17m\n")),(0,r.kt)("p",null,"\u67e5\u770b\u65e5\u5fd7\u53d1\u73b0\u5982\u4e0b\u9519\u8bef\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},'Events:\n Type Reason Age From Message\n ---- ------ ---- ---- -------\n Normal Scheduled 4m35s default-scheduler Successfully assigned u4a-system/capsule-controller-manager-5b9864f9bf-7mkhb to kubebb-core-worker\n Normal Pulling 4m34s kubelet Pulling image "hub.tenxcloud.com/u4a-component/capsule:v0.1.2-20221122"\n Normal Pulled 3m57s kubelet Successfully pulled image "hub.tenxcloud.com/u4a-component/capsule:v0.1.2-20221122" in 36.616134797s\n Warning Unhealthy 3m53s kubelet Liveness probe failed: Get "http://10.244.1.6:10080/healthz": context deadline exceeded (Client.Timeout exceeded while awaiting headers)\n Warning Unhealthy 3m44s kubelet Readiness probe failed: Get "http://10.244.1.6:10080/readyz": dial tcp 10.244.1.6:10080: connect: connection refused\n Warning Unhealthy 3m44s kubelet Liveness probe failed: Get "http://10.244.1.6:10080/healthz": dial tcp 10.244.1.6:10080: connect: connection refused\n Normal Created 3m34s (x3 over 3m57s) kubelet Created container manager\n Normal Started 3m34s (x3 over 3m57s) kubelet Started container manager\n Warning Unhealthy 3m31s (x7 over 3m55s) kubelet Readiness probe failed: Get "http://10.244.1.6:10080/readyz": context deadline exceeded (Client.Timeout exceeded while awaiting headers)\n Warning BackOff 3m13s (x4 over 3m42s) kubelet Back-off restarting failed container\n Normal Pulled 3m1s (x3 over 3m50s) kubelet Container image "hub.tenxcloud.com/u4a-component/capsule:v0.1.2-20221122" already present on machine\n')),(0,r.kt)("h4",{id:"\u95ee\u9898\u539f\u56e0"},"\u95ee\u9898\u539f\u56e0"),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"\u611f\u8c22 @0xff-dev \u63d0\u4f9b\u7684\u89e3\u51b3\u65b9\u6848")),(0,r.kt)("p",null,"\u53bb\u9664liveness probe\u540e\uff0c\u80fd\u770b\u5230\u5bb9\u5668\u62a5\u9519\uff0c\u53d1\u73b0\u662f\u7531\u4e8ecapsule\u521d\u59cb\u5316\u8fc7\u7a0b\u4e2d\u8d85\u51fa\u4e86\u64cd\u4f5c\u7cfb\u7edf\u5141\u8bb8\u7684\u6700\u5927\u6587\u4ef6\u6253\u5f00\u6570\uff0c\u5bfc\u81f4capsule\u65e0\u6cd5\u542f\u52a8\u3002"),(0,r.kt)("h4",{id:"\u89e3\u51b3\u65b9\u6848"},"\u89e3\u51b3\u65b9\u6848"),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"\u611f\u8c22 @0xff-dev \u63d0\u4f9b\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u9700\u8bbe\u7f6e fs.inotify.max_user_instances=81920")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"\u7531\u5fae\u8f6f\u7684New Bing\u89e3\u7b54\u5f97\u5230\u7684\u7b54\u6848\uff1a")),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"fs.inotify.max_user_instances")," \u662f\u4e00\u4e2a\u5185\u6838\u53c2\u6570\uff0c\u5b83\u8868\u793a\u6bcf\u4e2a\u7528\u6237\u53ef\u4ee5\u521b\u5efa\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"inotify")," \u5b9e\u4f8b\u7684\u6700\u5927\u6570\u91cf\u3002",(0,r.kt)("inlineCode",{parentName:"p"},"inotify")," \u662f\u4e00\u4e2a\u7528\u6765\u76d1\u89c6\u6587\u4ef6\u7cfb\u7edf\u53d8\u5316\u7684\u673a\u5236\u3002\u5982\u679c\u4f60\u60f3\u8981\u4fee\u6539\u8fd9\u4e2a\u53c2\u6570\uff0c\u4f60\u6709\u4e24\u79cd\u65b9\u6cd5\uff1a"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\u4e34\u65f6\u4fee\u6539\uff1a\u4f60\u53ef\u4ee5\u4f7f\u7528 sysctl -w \u547d\u4ee4\u6765\u4e34\u65f6\u4fee\u6539\u8fd9\u4e2a\u53c2\u6570\uff0c\u4f8b\u5982\uff1a")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo sysctl -w fs.inotify.max_user_instances=81920\n")),(0,r.kt)("p",null,"\u8fd9\u4e2a\u547d\u4ee4\u4f1a\u628a ",(0,r.kt)("inlineCode",{parentName:"p"},"fs.inotify.max_user_instances")," \u7684\u503c\u8bbe\u7f6e\u4e3a 81920\uff0c\u5e76\u5199\u5165",(0,r.kt)("inlineCode",{parentName:"p"},"/proc/sys/fs/inotify/max_user_instances")," \u6587\u4ef6\u3002\u4f46\u662f\u8fd9\u4e2a\u4fee\u6539\u53ea\u5728\u91cd\u542f\u4e4b\u524d\u6709\u6548\uff0c\u91cd\u542f\u540e\u4f1a\u6062\u590d\u9ed8\u8ba4\u503c\u3002"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\u6c38\u4e45\u4fee\u6539\uff1a\u4f60\u53ef\u4ee5\u5728 /etc/sysctl.conf \u6587\u4ef6\u4e2d\u6dfb\u52a0\u4e00\u884c\uff1a")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"fs.inotify.max_user_instances=81920\n")),(0,r.kt)("p",null,"\u7136\u540e\u8fd0\u884c ",(0,r.kt)("inlineCode",{parentName:"p"},"sudo sysctl -p"),"\u547d\u4ee4\u6765\u52a0\u8f7d\u8fd9\u4e2a\u6587\u4ef6\u4e2d\u7684\u8bbe\u7f6e\u3002\u8fd9\u6837\uff0c\u8fd9\u4e2a\u4fee\u6539\u5c31\u4f1a\u5728\u6bcf\u6b21\u91cd\u542f\u540e\u751f\u6548\u3002"),(0,r.kt)("p",null,"\u5982\u679c\u4f60\u60f3\u4e86\u89e3\u66f4\u591a\u5173\u4e8e sysctl \u548c fs.inotify.max_user_instances \u7684\u4fe1\u606f\uff0c\u8bf7\u53c2\u8003\u4ee5\u4e0b\u94fe\u63a5\uff1a"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://www.suse.com/support/kb/doc/?id=000020048"},"How to increase the inotify.max_user_watches and inotify.max_user_instances sysctls on a Linux host | Support | SUSE")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://unix.stackexchange.com/questions/444998/how-to-set-and-understand-fs-notify-max-user-watches"},"How to set and understand fs.notify.max_user_watches - Unix & Linux Stack Exchange")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://askubuntu.com/questions/1068168/sysctl-permission-denied-on-key-fs-inotify-max-user-watches"},"sysctl: permission denied on key 'fs.inotify.max_user_watches' - Ask Ubuntu"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/runtime~main.a11605a9.js b/assets/js/runtime~main.068ce0c8.js similarity index 97% rename from assets/js/runtime~main.a11605a9.js rename to assets/js/runtime~main.068ce0c8.js index e249705fc..d4a7a7683 100644 --- a/assets/js/runtime~main.a11605a9.js +++ b/assets/js/runtime~main.068ce0c8.js @@ -1 +1 @@ -(()=>{"use strict";var e,a,f,c,b,t={},d={};function r(e){var a=d[e];if(void 0!==a)return a.exports;var f=d[e]={id:e,loaded:!1,exports:{}};return t[e].call(f.exports,f,f.exports,r),f.loaded=!0,f.exports}r.m=t,r.c=d,e=[],r.O=(a,f,c,b)=>{if(!f){var t=1/0;for(i=0;i=b)&&Object.keys(r.O).every((e=>r.O[e](f[o])))?f.splice(o--,1):(d=!1,b0&&e[i-1][2]>b;i--)e[i]=e[i-1];e[i]=[f,c,b]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},f=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,c){if(1&c&&(e=this(e)),8&c)return e;if("object"==typeof e&&e){if(4&c&&e.__esModule)return e;if(16&c&&"function"==typeof e.then)return e}var b=Object.create(null);r.r(b);var t={};a=a||[null,f({}),f([]),f(f)];for(var d=2&c&&e;"object"==typeof d&&!~a.indexOf(d);d=f(d))Object.getOwnPropertyNames(d).forEach((a=>t[a]=()=>e[a]));return t.default=()=>e,r.d(b,t),b},r.d=(e,a)=>{for(var f in a)r.o(a,f)&&!r.o(e,f)&&Object.defineProperty(e,f,{enumerable:!0,get:a[f]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,f)=>(r.f[f](e,a),a)),[])),r.u=e=>"assets/js/"+({53:"935f2afb",277:"c4348237",638:"2be451b9",948:"8717b14a",1075:"18874b20",1129:"c2c9b4b3",1500:"b81173c6",1505:"7c2ff145",1649:"8d745e6e",1669:"c64e4644",1914:"d9f32620",2237:"acf368fd",2267:"59362658",2362:"e273c56f",2535:"814f3328",2774:"22646bfb",3085:"1f391b9e",3089:"a6aa9e1f",3514:"73664a40",3589:"6d8d5af3",3608:"9e4087bc",3957:"27015b90",4013:"01a85c17",4094:"d54d1d36",4154:"300d3bf9",4195:"c4f5d8e4",4288:"ad895e75",4456:"b42f4d8b",4776:"552535a5",4823:"cd7e3398",5062:"69369ae2",5070:"62fa1b0b",5662:"3c7910a2",6004:"a76bfff0",6103:"ccc49370",6287:"e90a2c2a",6306:"1d408bef",6320:"647f233e",6353:"c00468a4",6513:"1bba06cb",6741:"791926a5",6846:"710d6d2e",6890:"41ebaef0",6900:"0b2479c4",7133:"f03e9ca9",7331:"e6809710",7414:"393be207",7492:"81fe2174",7521:"ac63f98d",7527:"f345e2d0",7745:"085a15b4",7818:"037ceaed",7918:"17896441",7943:"a35a66a7",8221:"1c59ea81",8428:"807573a4",8610:"6875c492",8636:"f4f34a3a",8989:"23822d86",8994:"9546be45",9003:"925b3f96",9067:"c4afd168",9449:"3724ddc1",9514:"1be78505",9541:"422f8ca8",9642:"7661071f",9671:"0e384e19",9735:"4ba7e5a3",9817:"14eb3368"}[e]||e)+"."+{53:"032dc2a8",210:"4d2f5804",277:"4c140266",638:"04ee09c2",948:"f7dcbeb5",1075:"ec6ab114",1129:"89c59f08",1500:"58453c83",1505:"d5ffaf36",1649:"7d014f1e",1669:"d247f122",1914:"80015ae3",2237:"e2d33c34",2267:"21996e9c",2362:"91d595a4",2529:"da2bcb01",2535:"ebb147e0",2774:"99024fc4",3085:"f8464388",3089:"1e1af270",3514:"82f400ba",3589:"2056914d",3608:"9a815895",3957:"7a484ae8",4013:"5653d10a",4094:"06b988da",4154:"1ab8b83e",4195:"ca1028d5",4288:"a7b4397d",4456:"db20884f",4776:"62c3c6be",4823:"95ebc198",4972:"9374abde",5062:"f229d6b9",5070:"b5b41b52",5662:"940c85b0",6004:"0739f1bb",6103:"5cfe080a",6287:"e9ac8e34",6306:"70cf2055",6320:"f313b8c5",6353:"eb6dcaea",6513:"a06ae883",6741:"b95f584b",6846:"165dcede",6890:"5664e135",6900:"3e11ba74",7133:"37c900ca",7331:"0f5fad24",7414:"7cc220a5",7492:"d89689e4",7521:"b3888073",7527:"04faa359",7745:"3c3f3dfb",7818:"668a2a75",7918:"bacd5894",7943:"3e888b37",8221:"7bf39220",8428:"fdfff05a",8610:"da158881",8636:"30f136ee",8989:"edd20c3f",8994:"921e114b",9003:"dc312b15",9067:"86787076",9449:"4dd18884",9514:"82b3557a",9541:"f766c998",9642:"7d45a9e1",9671:"67c20791",9735:"cde53a1e",9817:"3bb53ce2"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),c={},b="website:",r.l=(e,a,f,t)=>{if(c[e])c[e].push(a);else{var d,o;if(void 0!==f)for(var n=document.getElementsByTagName("script"),i=0;i{d.onerror=d.onload=null,clearTimeout(s);var b=c[e];if(delete c[e],d.parentNode&&d.parentNode.removeChild(d),b&&b.forEach((e=>e(f))),a)return a(f)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:d}),12e4);d.onerror=l.bind(null,d.onerror),d.onload=l.bind(null,d.onload),o&&document.head.appendChild(d)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/website/",r.gca=function(e){return e={17896441:"7918",59362658:"2267","935f2afb":"53",c4348237:"277","2be451b9":"638","8717b14a":"948","18874b20":"1075",c2c9b4b3:"1129",b81173c6:"1500","7c2ff145":"1505","8d745e6e":"1649",c64e4644:"1669",d9f32620:"1914",acf368fd:"2237",e273c56f:"2362","814f3328":"2535","22646bfb":"2774","1f391b9e":"3085",a6aa9e1f:"3089","73664a40":"3514","6d8d5af3":"3589","9e4087bc":"3608","27015b90":"3957","01a85c17":"4013",d54d1d36:"4094","300d3bf9":"4154",c4f5d8e4:"4195",ad895e75:"4288",b42f4d8b:"4456","552535a5":"4776",cd7e3398:"4823","69369ae2":"5062","62fa1b0b":"5070","3c7910a2":"5662",a76bfff0:"6004",ccc49370:"6103",e90a2c2a:"6287","1d408bef":"6306","647f233e":"6320",c00468a4:"6353","1bba06cb":"6513","791926a5":"6741","710d6d2e":"6846","41ebaef0":"6890","0b2479c4":"6900",f03e9ca9:"7133",e6809710:"7331","393be207":"7414","81fe2174":"7492",ac63f98d:"7521",f345e2d0:"7527","085a15b4":"7745","037ceaed":"7818",a35a66a7:"7943","1c59ea81":"8221","807573a4":"8428","6875c492":"8610",f4f34a3a:"8636","23822d86":"8989","9546be45":"8994","925b3f96":"9003",c4afd168:"9067","3724ddc1":"9449","1be78505":"9514","422f8ca8":"9541","7661071f":"9642","0e384e19":"9671","4ba7e5a3":"9735","14eb3368":"9817"}[e]||e,r.p+r.u(e)},(()=>{var e={1303:0,532:0};r.f.j=(a,f)=>{var c=r.o(e,a)?e[a]:void 0;if(0!==c)if(c)f.push(c[2]);else if(/^(1303|532)$/.test(a))e[a]=0;else{var b=new Promise(((f,b)=>c=e[a]=[f,b]));f.push(c[2]=b);var t=r.p+r.u(a),d=new Error;r.l(t,(f=>{if(r.o(e,a)&&(0!==(c=e[a])&&(e[a]=void 0),c)){var b=f&&("load"===f.type?"missing":f.type),t=f&&f.target&&f.target.src;d.message="Loading chunk "+a+" failed.\n("+b+": "+t+")",d.name="ChunkLoadError",d.type=b,d.request=t,c[1](d)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,f)=>{var c,b,t=f[0],d=f[1],o=f[2],n=0;if(t.some((a=>0!==e[a]))){for(c in d)r.o(d,c)&&(r.m[c]=d[c]);if(o)var i=o(r)}for(a&&a(f);n{"use strict";var e,a,f,c,b,t={},d={};function r(e){var a=d[e];if(void 0!==a)return a.exports;var f=d[e]={id:e,loaded:!1,exports:{}};return t[e].call(f.exports,f,f.exports,r),f.loaded=!0,f.exports}r.m=t,r.c=d,e=[],r.O=(a,f,c,b)=>{if(!f){var t=1/0;for(i=0;i=b)&&Object.keys(r.O).every((e=>r.O[e](f[o])))?f.splice(o--,1):(d=!1,b0&&e[i-1][2]>b;i--)e[i]=e[i-1];e[i]=[f,c,b]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},f=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,c){if(1&c&&(e=this(e)),8&c)return e;if("object"==typeof e&&e){if(4&c&&e.__esModule)return e;if(16&c&&"function"==typeof e.then)return e}var b=Object.create(null);r.r(b);var t={};a=a||[null,f({}),f([]),f(f)];for(var d=2&c&&e;"object"==typeof d&&!~a.indexOf(d);d=f(d))Object.getOwnPropertyNames(d).forEach((a=>t[a]=()=>e[a]));return t.default=()=>e,r.d(b,t),b},r.d=(e,a)=>{for(var f in a)r.o(a,f)&&!r.o(e,f)&&Object.defineProperty(e,f,{enumerable:!0,get:a[f]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,f)=>(r.f[f](e,a),a)),[])),r.u=e=>"assets/js/"+({53:"935f2afb",277:"c4348237",638:"2be451b9",948:"8717b14a",1075:"18874b20",1129:"c2c9b4b3",1500:"b81173c6",1505:"7c2ff145",1649:"8d745e6e",1669:"c64e4644",1914:"d9f32620",2237:"acf368fd",2267:"59362658",2362:"e273c56f",2535:"814f3328",2774:"22646bfb",3085:"1f391b9e",3089:"a6aa9e1f",3514:"73664a40",3589:"6d8d5af3",3608:"9e4087bc",3957:"27015b90",4013:"01a85c17",4094:"d54d1d36",4154:"300d3bf9",4195:"c4f5d8e4",4288:"ad895e75",4456:"b42f4d8b",4776:"552535a5",4823:"cd7e3398",5062:"69369ae2",5070:"62fa1b0b",5662:"3c7910a2",6004:"a76bfff0",6103:"ccc49370",6287:"e90a2c2a",6306:"1d408bef",6320:"647f233e",6353:"c00468a4",6513:"1bba06cb",6741:"791926a5",6846:"710d6d2e",6890:"41ebaef0",6900:"0b2479c4",7133:"f03e9ca9",7331:"e6809710",7414:"393be207",7492:"81fe2174",7521:"ac63f98d",7527:"f345e2d0",7745:"085a15b4",7818:"037ceaed",7918:"17896441",7943:"a35a66a7",8221:"1c59ea81",8428:"807573a4",8610:"6875c492",8636:"f4f34a3a",8989:"23822d86",8994:"9546be45",9003:"925b3f96",9067:"c4afd168",9449:"3724ddc1",9514:"1be78505",9541:"422f8ca8",9642:"7661071f",9671:"0e384e19",9735:"4ba7e5a3",9817:"14eb3368"}[e]||e)+"."+{53:"e8481ca4",210:"4d2f5804",277:"4c140266",638:"04ee09c2",948:"f7dcbeb5",1075:"ec6ab114",1129:"89c59f08",1500:"58453c83",1505:"d5ffaf36",1649:"7d014f1e",1669:"d247f122",1914:"80015ae3",2237:"e2d33c34",2267:"21996e9c",2362:"91d595a4",2529:"da2bcb01",2535:"ebb147e0",2774:"99024fc4",3085:"f8464388",3089:"1e1af270",3514:"82f400ba",3589:"2056914d",3608:"9a815895",3957:"7a484ae8",4013:"5653d10a",4094:"06b988da",4154:"1ab8b83e",4195:"ca1028d5",4288:"d0e05bf9",4456:"db20884f",4776:"62c3c6be",4823:"95ebc198",4972:"9374abde",5062:"f229d6b9",5070:"b5b41b52",5662:"940c85b0",6004:"0739f1bb",6103:"5cfe080a",6287:"e9ac8e34",6306:"70cf2055",6320:"f313b8c5",6353:"eb6dcaea",6513:"a06ae883",6741:"00bf0be8",6846:"165dcede",6890:"5664e135",6900:"3e11ba74",7133:"37c900ca",7331:"0f5fad24",7414:"7cc220a5",7492:"d89689e4",7521:"b3888073",7527:"04faa359",7745:"3c3f3dfb",7818:"668a2a75",7918:"bacd5894",7943:"3e888b37",8221:"7bf39220",8428:"fdfff05a",8610:"da158881",8636:"30f136ee",8989:"edd20c3f",8994:"921e114b",9003:"dc312b15",9067:"86787076",9449:"4dd18884",9514:"82b3557a",9541:"f766c998",9642:"7d45a9e1",9671:"67c20791",9735:"cde53a1e",9817:"3bb53ce2"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),c={},b="website:",r.l=(e,a,f,t)=>{if(c[e])c[e].push(a);else{var d,o;if(void 0!==f)for(var n=document.getElementsByTagName("script"),i=0;i{d.onerror=d.onload=null,clearTimeout(s);var b=c[e];if(delete c[e],d.parentNode&&d.parentNode.removeChild(d),b&&b.forEach((e=>e(f))),a)return a(f)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:d}),12e4);d.onerror=l.bind(null,d.onerror),d.onload=l.bind(null,d.onload),o&&document.head.appendChild(d)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/website/",r.gca=function(e){return e={17896441:"7918",59362658:"2267","935f2afb":"53",c4348237:"277","2be451b9":"638","8717b14a":"948","18874b20":"1075",c2c9b4b3:"1129",b81173c6:"1500","7c2ff145":"1505","8d745e6e":"1649",c64e4644:"1669",d9f32620:"1914",acf368fd:"2237",e273c56f:"2362","814f3328":"2535","22646bfb":"2774","1f391b9e":"3085",a6aa9e1f:"3089","73664a40":"3514","6d8d5af3":"3589","9e4087bc":"3608","27015b90":"3957","01a85c17":"4013",d54d1d36:"4094","300d3bf9":"4154",c4f5d8e4:"4195",ad895e75:"4288",b42f4d8b:"4456","552535a5":"4776",cd7e3398:"4823","69369ae2":"5062","62fa1b0b":"5070","3c7910a2":"5662",a76bfff0:"6004",ccc49370:"6103",e90a2c2a:"6287","1d408bef":"6306","647f233e":"6320",c00468a4:"6353","1bba06cb":"6513","791926a5":"6741","710d6d2e":"6846","41ebaef0":"6890","0b2479c4":"6900",f03e9ca9:"7133",e6809710:"7331","393be207":"7414","81fe2174":"7492",ac63f98d:"7521",f345e2d0:"7527","085a15b4":"7745","037ceaed":"7818",a35a66a7:"7943","1c59ea81":"8221","807573a4":"8428","6875c492":"8610",f4f34a3a:"8636","23822d86":"8989","9546be45":"8994","925b3f96":"9003",c4afd168:"9067","3724ddc1":"9449","1be78505":"9514","422f8ca8":"9541","7661071f":"9642","0e384e19":"9671","4ba7e5a3":"9735","14eb3368":"9817"}[e]||e,r.p+r.u(e)},(()=>{var e={1303:0,532:0};r.f.j=(a,f)=>{var c=r.o(e,a)?e[a]:void 0;if(0!==c)if(c)f.push(c[2]);else if(/^(1303|532)$/.test(a))e[a]=0;else{var b=new Promise(((f,b)=>c=e[a]=[f,b]));f.push(c[2]=b);var t=r.p+r.u(a),d=new Error;r.l(t,(f=>{if(r.o(e,a)&&(0!==(c=e[a])&&(e[a]=void 0),c)){var b=f&&("load"===f.type?"missing":f.type),t=f&&f.target&&f.target.src;d.message="Loading chunk "+a+" failed.\n("+b+": "+t+")",d.name="ChunkLoadError",d.type=b,d.request=t,c[1](d)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,f)=>{var c,b,t=f[0],d=f[1],o=f[2],n=0;if(t.some((a=>0!==e[a]))){for(c in d)r.o(d,c)&&(r.m[c]=d[c]);if(o)var i=o(r)}for(a&&a(f);n 历史博文 | Framework as a Building Block for Kubernetes - + - + \ No newline at end of file diff --git a/blog/first-blog-post/index.html b/blog/first-blog-post/index.html index 53636813c..77ad6c2f1 100644 --- a/blog/first-blog-post/index.html +++ b/blog/first-blog-post/index.html @@ -5,13 +5,13 @@ First Blog Post | Framework as a Building Block for Kubernetes - +

First Blog Post

· 阅读需 1 分钟
Gao Wei

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

- + \ No newline at end of file diff --git a/blog/index.html b/blog/index.html index 8fc3a4d83..04a23e5a0 100644 --- a/blog/index.html +++ b/blog/index.html @@ -5,13 +5,13 @@ Blog | Framework as a Building Block for Kubernetes - +

· 阅读需 1 分钟
Sébastien Lorber
Yangshun Tay

Docusaurus blogging features are powered by the blog plugin.

Simply add Markdown files (or folders) to the blog directory.

Regular blog authors can be added to authors.yml.

The blog post date can be extracted from filenames, such as:

  • 2019-05-30-welcome.md
  • 2019-05-30-welcome/index.md

A blog post folder can be convenient to co-locate blog post images:

Docusaurus Plushie

The blog supports tags as well!

And if you don't want a blog: just delete this directory, and use blog: false in your Docusaurus config.

· 阅读需 1 分钟
Gao Wei

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

- + \ No newline at end of file diff --git a/blog/long-blog-post/index.html b/blog/long-blog-post/index.html index 916aad25b..ef4c28bdd 100644 --- a/blog/long-blog-post/index.html +++ b/blog/long-blog-post/index.html @@ -5,13 +5,13 @@ Long Blog Post | Framework as a Building Block for Kubernetes - +

Long Blog Post

· 阅读需 3 分钟
Endilie Yacop Sucipto

This is the summary of a very long blog post,

Use a <!-- truncate --> comment to limit blog post size in the list view.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

- + \ No newline at end of file diff --git a/blog/mdx-blog-post/index.html b/blog/mdx-blog-post/index.html index 0ecea81c8..cca71e583 100644 --- a/blog/mdx-blog-post/index.html +++ b/blog/mdx-blog-post/index.html @@ -5,13 +5,13 @@ MDX Blog Post | Framework as a Building Block for Kubernetes - +

MDX Blog Post

· 阅读需 1 分钟
Sébastien Lorber

Blog posts support Docusaurus Markdown features, such as MDX.

提示

Use the power of React to create interactive blog posts.

<button onClick={() => alert('button clicked!')}>Click me!</button>
- + \ No newline at end of file diff --git a/blog/tags/docusaurus/index.html b/blog/tags/docusaurus/index.html index 7d932c9b7..0585f4851 100644 --- a/blog/tags/docusaurus/index.html +++ b/blog/tags/docusaurus/index.html @@ -5,13 +5,13 @@ 4 篇博文 含有标签「docusaurus」 | Framework as a Building Block for Kubernetes - +

4 篇博文 含有标签「docusaurus」

查看所有标签

· 阅读需 1 分钟
Sébastien Lorber
Yangshun Tay

Docusaurus blogging features are powered by the blog plugin.

Simply add Markdown files (or folders) to the blog directory.

Regular blog authors can be added to authors.yml.

The blog post date can be extracted from filenames, such as:

  • 2019-05-30-welcome.md
  • 2019-05-30-welcome/index.md

A blog post folder can be convenient to co-locate blog post images:

Docusaurus Plushie

The blog supports tags as well!

And if you don't want a blog: just delete this directory, and use blog: false in your Docusaurus config.

· 阅读需 1 分钟
Gao Wei

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

- + \ No newline at end of file diff --git a/blog/tags/facebook/index.html b/blog/tags/facebook/index.html index 9c33b9901..5870d52e6 100644 --- a/blog/tags/facebook/index.html +++ b/blog/tags/facebook/index.html @@ -5,13 +5,13 @@ 1 篇博文 含有标签「facebook」 | Framework as a Building Block for Kubernetes - +

1 篇博文 含有标签「facebook」

查看所有标签

· 阅读需 1 分钟
Sébastien Lorber
Yangshun Tay

Docusaurus blogging features are powered by the blog plugin.

Simply add Markdown files (or folders) to the blog directory.

Regular blog authors can be added to authors.yml.

The blog post date can be extracted from filenames, such as:

  • 2019-05-30-welcome.md
  • 2019-05-30-welcome/index.md

A blog post folder can be convenient to co-locate blog post images:

Docusaurus Plushie

The blog supports tags as well!

And if you don't want a blog: just delete this directory, and use blog: false in your Docusaurus config.

- + \ No newline at end of file diff --git a/blog/tags/hello/index.html b/blog/tags/hello/index.html index b53523339..f45f0e69c 100644 --- a/blog/tags/hello/index.html +++ b/blog/tags/hello/index.html @@ -5,13 +5,13 @@ 2 篇博文 含有标签「hello」 | Framework as a Building Block for Kubernetes - +

2 篇博文 含有标签「hello」

查看所有标签

· 阅读需 1 分钟
Sébastien Lorber
Yangshun Tay

Docusaurus blogging features are powered by the blog plugin.

Simply add Markdown files (or folders) to the blog directory.

Regular blog authors can be added to authors.yml.

The blog post date can be extracted from filenames, such as:

  • 2019-05-30-welcome.md
  • 2019-05-30-welcome/index.md

A blog post folder can be convenient to co-locate blog post images:

Docusaurus Plushie

The blog supports tags as well!

And if you don't want a blog: just delete this directory, and use blog: false in your Docusaurus config.

- + \ No newline at end of file diff --git a/blog/tags/hola/index.html b/blog/tags/hola/index.html index 873d2f0be..730c293ed 100644 --- a/blog/tags/hola/index.html +++ b/blog/tags/hola/index.html @@ -5,13 +5,13 @@ 1 篇博文 含有标签「hola」 | Framework as a Building Block for Kubernetes - +

1 篇博文 含有标签「hola」

查看所有标签

· 阅读需 1 分钟
Gao Wei

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

- + \ No newline at end of file diff --git a/blog/tags/index.html b/blog/tags/index.html index 2fa54db2c..346aba914 100644 --- a/blog/tags/index.html +++ b/blog/tags/index.html @@ -5,13 +5,13 @@ 标签 | Framework as a Building Block for Kubernetes - + - + \ No newline at end of file diff --git a/blog/welcome/index.html b/blog/welcome/index.html index c2a98215a..7d231f1db 100644 --- a/blog/welcome/index.html +++ b/blog/welcome/index.html @@ -5,13 +5,13 @@ Welcome | Framework as a Building Block for Kubernetes - +

Welcome

· 阅读需 1 分钟
Sébastien Lorber
Yangshun Tay

Docusaurus blogging features are powered by the blog plugin.

Simply add Markdown files (or folders) to the blog directory.

Regular blog authors can be added to authors.yml.

The blog post date can be extracted from filenames, such as:

  • 2019-05-30-welcome.md
  • 2019-05-30-welcome/index.md

A blog post folder can be convenient to co-locate blog post images:

Docusaurus Plushie

The blog supports tags as well!

And if you don't want a blog: just delete this directory, and use blog: false in your Docusaurus config.

- + \ No newline at end of file diff --git a/docs/FAQ/index.html b/docs/FAQ/index.html index 90f84f60b..decfb261b 100644 --- a/docs/FAQ/index.html +++ b/docs/FAQ/index.html @@ -3,15 +3,15 @@ -常见问题 | Framework as a Building Block for Kubernetes +常见问题 | Framework as a Building Block for Kubernetes - +
-

常见问题

BuildingBase部署

1. 租户管理控制器probe liveness校验失败,导致无法启动

  • 环境
    • Azure VM (Ubuntu 22.04)

问题重现

运行helm install --wait -n u4a-system u4a-component .后,发现租户管理控制器一直处于CrashLoopBackOff状态:

➜  ~ k get pods -nu4a-system
NAME READY STATUS RESTARTS AGE
bff-server-9cc54cbc5-gcp6x 1/1 Running 0 17m
capsule-controller-manager-5b9864f9bf-7mkhb 0/1 CrashLoopBackOff 8 (27s ago) 17m
cert-manager-79d7998d9-c7q8n 1/1 Running 0 33m
cert-manager-cainjector-57bb7f44dd-c9sj6 1/1 Running 0 33m
cert-manager-webhook-65b494ccf4-4blzx 1/1 Running 0 33m
cluster-component-ingress-nginx-controller-86d6bfdbf6-qj6hf 1/1 Running 0 33m
kube-oidc-proxy-fc6b54b8c-ddc2s 1/1 Running 0 17m
oidc-server-84cbfcc9f5-bmmf9 2/2 Running 0 17m
resource-view-controller-94645667-ttvst 1/1 Running 0 17m

查看日志发现如下错误:

Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 4m35s default-scheduler Successfully assigned u4a-system/capsule-controller-manager-5b9864f9bf-7mkhb to kubebb-core-worker
Normal Pulling 4m34s kubelet Pulling image "hub.tenxcloud.com/u4a-component/capsule:v0.1.2-20221122"
Normal Pulled 3m57s kubelet Successfully pulled image "hub.tenxcloud.com/u4a-component/capsule:v0.1.2-20221122" in 36.616134797s
Warning Unhealthy 3m53s kubelet Liveness probe failed: Get "http://10.244.1.6:10080/healthz": context deadline exceeded (Client.Timeout exceeded while awaiting headers)
Warning Unhealthy 3m44s kubelet Readiness probe failed: Get "http://10.244.1.6:10080/readyz": dial tcp 10.244.1.6:10080: connect: connection refused
Warning Unhealthy 3m44s kubelet Liveness probe failed: Get "http://10.244.1.6:10080/healthz": dial tcp 10.244.1.6:10080: connect: connection refused
Normal Created 3m34s (x3 over 3m57s) kubelet Created container manager
Normal Started 3m34s (x3 over 3m57s) kubelet Started container manager
Warning Unhealthy 3m31s (x7 over 3m55s) kubelet Readiness probe failed: Get "http://10.244.1.6:10080/readyz": context deadline exceeded (Client.Timeout exceeded while awaiting headers)
Warning BackOff 3m13s (x4 over 3m42s) kubelet Back-off restarting failed container
Normal Pulled 3m1s (x3 over 3m50s) kubelet Container image "hub.tenxcloud.com/u4a-component/capsule:v0.1.2-20221122" already present on machine

问题原因

感谢 @0xff-dev 提供的解决方案

去除liveness probe后,能看到容器报错,发现是由于capsule初始化过程中超出了操作系统允许的最大文件打开数,导致capsule无法启动。

解决方案

感谢 @0xff-dev 提供的解决方案,需设置 fs.inotify.max_user_instances=81920

由微软的New Bing解答得到的答案:

fs.inotify.max_user_instances 是一个内核参数,它表示每个用户可以创建的 inotify 实例的最大数量。inotify 是一个用来监视文件系统变化的机制。如果你想要修改这个参数,你有两种方法:

  • 临时修改:你可以使用 sysctl -w 命令来临时修改这个参数,例如:
sudo sysctl -w fs.inotify.max_user_instances=81920

这个命令会把 fs.inotify.max_user_instances 的值设置为 81920,并写入/proc/sys/fs/inotify/max_user_instances 文件。但是这个修改只在重启之前有效,重启后会恢复默认值。

  • 永久修改:你可以在 /etc/sysctl.conf 文件中添加一行:
fs.inotify.max_user_instances=81920

然后运行 sudo sysctl -p命令来加载这个文件中的设置。这样,这个修改就会在每次重启后生效。

如果你想了解更多关于 sysctl 和 fs.inotify.max_user_instances 的信息,请参考以下链接:

- +

常见问题

BuildingBase相关

部署问题

1. 租户管理控制器probe liveness校验失败,导致无法启动

  • 环境
    • Azure VM (Ubuntu 22.04)

问题重现

运行helm install --wait -n u4a-system u4a-component .后,发现租户管理控制器一直处于CrashLoopBackOff状态:

➜  ~ k get pods -nu4a-system
NAME READY STATUS RESTARTS AGE
bff-server-9cc54cbc5-gcp6x 1/1 Running 0 17m
capsule-controller-manager-5b9864f9bf-7mkhb 0/1 CrashLoopBackOff 8 (27s ago) 17m
cert-manager-79d7998d9-c7q8n 1/1 Running 0 33m
cert-manager-cainjector-57bb7f44dd-c9sj6 1/1 Running 0 33m
cert-manager-webhook-65b494ccf4-4blzx 1/1 Running 0 33m
cluster-component-ingress-nginx-controller-86d6bfdbf6-qj6hf 1/1 Running 0 33m
kube-oidc-proxy-fc6b54b8c-ddc2s 1/1 Running 0 17m
oidc-server-84cbfcc9f5-bmmf9 2/2 Running 0 17m
resource-view-controller-94645667-ttvst 1/1 Running 0 17m

查看日志发现如下错误:

Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 4m35s default-scheduler Successfully assigned u4a-system/capsule-controller-manager-5b9864f9bf-7mkhb to kubebb-core-worker
Normal Pulling 4m34s kubelet Pulling image "hub.tenxcloud.com/u4a-component/capsule:v0.1.2-20221122"
Normal Pulled 3m57s kubelet Successfully pulled image "hub.tenxcloud.com/u4a-component/capsule:v0.1.2-20221122" in 36.616134797s
Warning Unhealthy 3m53s kubelet Liveness probe failed: Get "http://10.244.1.6:10080/healthz": context deadline exceeded (Client.Timeout exceeded while awaiting headers)
Warning Unhealthy 3m44s kubelet Readiness probe failed: Get "http://10.244.1.6:10080/readyz": dial tcp 10.244.1.6:10080: connect: connection refused
Warning Unhealthy 3m44s kubelet Liveness probe failed: Get "http://10.244.1.6:10080/healthz": dial tcp 10.244.1.6:10080: connect: connection refused
Normal Created 3m34s (x3 over 3m57s) kubelet Created container manager
Normal Started 3m34s (x3 over 3m57s) kubelet Started container manager
Warning Unhealthy 3m31s (x7 over 3m55s) kubelet Readiness probe failed: Get "http://10.244.1.6:10080/readyz": context deadline exceeded (Client.Timeout exceeded while awaiting headers)
Warning BackOff 3m13s (x4 over 3m42s) kubelet Back-off restarting failed container
Normal Pulled 3m1s (x3 over 3m50s) kubelet Container image "hub.tenxcloud.com/u4a-component/capsule:v0.1.2-20221122" already present on machine

问题原因

感谢 @0xff-dev 提供的解决方案

去除liveness probe后,能看到容器报错,发现是由于capsule初始化过程中超出了操作系统允许的最大文件打开数,导致capsule无法启动。

解决方案

感谢 @0xff-dev 提供的解决方案,需设置 fs.inotify.max_user_instances=81920

由微软的New Bing解答得到的答案:

fs.inotify.max_user_instances 是一个内核参数,它表示每个用户可以创建的 inotify 实例的最大数量。inotify 是一个用来监视文件系统变化的机制。如果你想要修改这个参数,你有两种方法:

  • 临时修改:你可以使用 sysctl -w 命令来临时修改这个参数,例如:
sudo sysctl -w fs.inotify.max_user_instances=81920

这个命令会把 fs.inotify.max_user_instances 的值设置为 81920,并写入/proc/sys/fs/inotify/max_user_instances 文件。但是这个修改只在重启之前有效,重启后会恢复默认值。

  • 永久修改:你可以在 /etc/sysctl.conf 文件中添加一行:
fs.inotify.max_user_instances=81920

然后运行 sudo sysctl -p命令来加载这个文件中的设置。这样,这个修改就会在每次重启后生效。

如果你想了解更多关于 sysctl 和 fs.inotify.max_user_instances 的信息,请参考以下链接:

+ \ No newline at end of file diff --git a/docs/building-base/configuration/3rd-party-account/index.html b/docs/building-base/configuration/3rd-party-account/index.html index 4162c66f0..57ef0c17e 100644 --- a/docs/building-base/configuration/3rd-party-account/index.html +++ b/docs/building-base/configuration/3rd-party-account/index.html @@ -5,7 +5,7 @@ 使用第三方系统登录 | Framework as a Building Block for Kubernetes - + @@ -14,7 +14,7 @@ 图 1

  • 在左侧菜单导航处选择“应用”,然后在新建应用中,填写必要信息:

    • 名称:根据需要填写
    • 回调地址:<u4a-component 地址>/oidc/callback
    • 范围:勾选 read_user 和 openid 图 2
    1. 保存应用,点击页面下刚刚保存的应用,得到下图。 图 3

    记录 应用程序ID(clientid)、密码(clientsecret) 以及 回调 URL(redirecturl),需要在oidc-server 端进行相应配置。

    1. 编辑 oidc-server 的配置文件,增加一种新的 connector 配置,kubectl edit cm oidc-server -n u4a-system,按以下示例进行配置:
    connectors:
    - type: k8scrd
    ...
    - type: gitlab ## 固定值 gitlab
    name: gitlab ## 名称
    id: gitlab ## 固定值 gitlab
    config:
    baseURL: http://gitlab.172.22.50.155.nip.io ## gitlab对外访问的地址
    clientID: ef2b579e5b4c1cf9ae5b0b2acb166271ebff5892e84aa113689d4646ffcb29e7 ## gitlab配置的应用的clientID, 可在上一步骤”配置gitlab“中获取
    clientSecret: 3a9e79368a70bcdf1e4ac1df64e4220e7af798876333c9642a8edb782e6eb558 ## gitlab配置的应用的密码, 可在上一步骤”配置gitlab“中获取
    redirectURI: https://portal.172.22.96.209.nip.io/oidc/callback ## gitlab配置的callback地址, 可在上一步骤”配置gitlab“中获取
    1. 开启第三方系统对接,目前支持 gitlab/github 两种,仅需要将对应的 enabled 字段设置为 true 即可。
    • kubectl edit connector3rd connector3rd
    kind: Connector3rd
    metadata:
    annotations:
    helm.sh/hook: post-install,post-upgrade
    helm.sh/hook-weight: "-5"
    name: connector3rd
    spec:
    connectors:
    - description: gitlab description
    enabled: false # 修改为 true
    icon: <保持不变>
    id: gitlab
    name: gitlab
    - description: github description
    enabled: false
    icon: <保持不变>
    id: github
    name: github
    1. 配置完毕后,重启 oidc-server 服务即可生效,此时再次访问登录页面,既可看到对应的登录图标。

    图 4

    - + \ No newline at end of file diff --git a/docs/building-base/configuration/audit-config/index.html b/docs/building-base/configuration/audit-config/index.html index 64ffe74b5..3a07cfe6b 100644 --- a/docs/building-base/configuration/audit-config/index.html +++ b/docs/building-base/configuration/audit-config/index.html @@ -5,14 +5,14 @@ 配置审计能力 | Framework as a Building Block for Kubernetes - +

    配置审计能力

    1、编辑 audit-policy.yaml 文件对审计进行配置,kubectl edit cm audit-policy-conf -n u4a-system

    按照以下模式进行定义:

    apiVersion: audit.k8s.io/v1beta1
    kind: Policy
    # Don't generate audit events for all requests in RequestReceived stage.
    omitStages:
    - "RequestReceived"
    rules:
    # Don't audit namespace: kube-system/cluster-system/system-bigdata
    - level: None
    resources:
    - group: "" # core API group
    resources: ["secrets", "configmaps"]
    namespaces: ["kube-system", "cluster-system", "system-bigdata"]
    # Only enable 'write' verbs audit log for secret and configmap
    - level: Metadata
    verbs: ["create","delete","deletecollection","patch","update"]
    resources:
    - group: "" # core API group
    resources: ["secrets", "configmaps"]

    各个组件,需要根据自己的资源类型,来针对性的将自己的资源添加到审计的 rule 列表中,默认对写操作进行审计即可。

    2、配置 kube-apiserver 参数(也可以在 kube-oidc-proxy 上进行类似的配置,在无法操作原有 K8S 集群的条件下,使用 kube-oidc-proxy 的配置),添加:

    # 审计策略配置文件地址
    - --audit-policy-file=/etc/kubernetes/pki/audit-policy.yaml
    # 审计日志的路径文件
    - --audit-log-path=/var/log/apiserver/audit/audit.log
    # 日志保存策略
    - --audit-log-maxage=7
    - --audit-log-maxbackup=10
    - --audit-log-maxsize=10

    如果是在 K8S 上直接修改,则需要修改 /etc/kubernetes/manifests/kube-apiserver.yaml 来添加该参数,修改后确认 kube-apiserver 容器发生重启,此时配置才能生效

    3、配置 fluentd 进行采集(索引模版跟原来的 fluentd 冲突,所以需要单独的fluentd 进程专门采集 master 上的审计日志。 目前测试方法,从原有的 fluentd daemonset 复制一个,修改 ds 的名字,并使用以下配置文件进行挂载即可:

    apiVersion: v1
    data:
    fluent.conf: |2
    # for audit log
    <source>
    @type tail
    @id in_tail_kube_apiserver_audit
    multiline_flush_interval 5s
    path /var/log/apiserver/audit/audit.log
    pos_file /var/log/kube-apiserver-audit.log.pos
    tag kube-apiserver-audit
    <parse>
    @type json
    keep_time_key true
    time_key timestamp
    time_format %Y-%m-%dT%T.%L%Z
    </parse>
    </source>

    ## Used for health check
    <source>
    @type http
    port 9880
    bind 0.0.0.0
    </source>

    ## sink all log to elasticsearch directly
    <match **>
    @type elasticsearch
    @log_level debug
    include_tag_key true
    host elasticsearch-logging
    port 9200
    user "#{ENV['ES_USERNAME']}"
    password "#{ENV['ES_PASSWORD']}"
    scheme "#{ENV['ES_SCHEME']}"
    ca_file /etc/fluent/certs/ca.crt
    logstash_prefix audit-k8s
    logstash_format true
    # Set the chunk limit the same as for fluentd-gcp.
    reload_on_failure true
    reconnect_on_error true
    request_timeout 120s
    <buffer>
    @type file
    path /var/log/td-agent/buffer/elasticsearch
    chunk_limit_size 15MB
    total_limit_size 20GB
    flush_interval 3s
    flush_thread_count 8
    flush_mode interval
    # Never wait longer than 5 minutes between retries.
    retry_timeout 300
    retry_forever true
    </buffer>
    </match>
    kind: ConfigMap
    metadata:
    labels:
    component: fluentd
    k8s-app: fluentd
    # 新的 fluentd 使用这个 configmap
    name: fluentd-audit
    namespace: kube-system

    注意:

    • 新的 fluentd daemonset 只需要启动在 kube-oidc-proxy 部署的节点上(通过节点亲和性配置)
    • 将使用的 configmap 修改为上面的,名字 fluentd-audit

    4、最终在 es 里的审计记录格式如下,可以通过查询 es 来获取审计日志

    {
    "_index": "logstash-2022.08.20",
    "_type": "fluentd",
    "_id": "iRzLu4IBqmHyli33qpUa",
    "_version": 1,
    "_score": null,
    "_source": {
    "kind": "Event",
    "apiVersion": "audit.k8s.io/v1",
    "level": "Metadata",
    "auditID": "7c0072aa-b48a-4772-bc52-42e50c0e65ce",
    "stage": "ResponseComplete",
    "requestURI": "/api/v1/namespaces/addon-system/configmaps/42c733ea.clastix.capsule.io",
    "verb": "update",
    "user": {
    "username": "system:serviceaccount:addon-system:default",
    "uid": "c8cb442d-853c-4a53-9c83-c7a1520095c4",
    "groups": [
    "system:serviceaccounts",
    "system:serviceaccounts:addon-system",
    "system:authenticated"
    ]
    },
    "sourceIPs": [
    "172.22.96.146"
    ],
    "userAgent": "manager/v0.0.0 (linux/amd64) kubernetes/$Format/leader-election",
    "objectRef": {
    "resource": "configmaps",
    "namespace": "addon-system",
    "name": "42c733ea.clastix.capsule.io",
    "uid": "c4542d46-0e07-41be-8420-f912a2918e51",
    "apiVersion": "v1",
    "resourceVersion": "236579314"
    },
    "responseStatus": {
    "metadata": {},
    "code": 200
    },
    "requestReceivedTimestamp": "2022-08-20T15:07:41.991582Z",
    "stageTimestamp": "2022-08-20T15:07:42.000098Z",
    "annotations": {
    "authentication.k8s.io/legacy-token": "system:serviceaccount:addon-system:default",
    "authorization.k8s.io/decision": "allow",
    "authorization.k8s.io/reason": "RBAC: allowed by ClusterRoleBinding \"t7d.io.capsule-manager-rolebinding\" of ClusterRole \"cluster-admin\" to ServiceAccount \"default/addon-system\""
    },
    "@timestamp": "2022-08-20T15:07:42.000871648+00:00",
    "tag": "kube-apiserver-audit"
    },
    "fields": {
    "requestReceivedTimestamp": [
    "2022-08-20T15:07:41.991Z"
    ],
    "stageTimestamp": [
    "2022-08-20T15:07:42.000Z"
    ],
    "@timestamp": [
    "2022-08-20T15:07:42.000Z"
    ]
    },
    "sort": [
    1661008062000
    ]
    }

    5、如果不是标准的 K8S 资源类型的审计,应用/服务可以自己将审计写入到 /var/log/apiserver/audit 目录,比如命名为 service-audit.log,格式符合 K8S audit 消息格式即可,参考以下单条审计记录的格式:

    {"kind":"Event","apiVersion":"audit.k8s.io/v1","level":"Metadata","auditID":"8d8d8163-54e8-457d-94f6-7851e887f3cf","stage":"ResponseComplete","requestURI":"/api/v1/namespaces/u4a-system/secrets/sh.helm.release.v1.u4a-system.v1","verb":"delete","user":{"username":"admin","groups":["system:nodes","iam.tenxcloud.com"]},"sourceIPs":["172.16.31.254"],"userAgent":"helm/v0.0.0 (darwin/amd64) kubernetes/$Format","objectRef":{"resource":"secrets","namespace":"u4a-system","name":"sh.helm.release.v1.u4a-system.v1","apiVersion":"v1"},"responseStatus":{"metadata":{},"code":200},"requestReceivedTimestamp":"2022-08-24T05:36:36.524760Z","stageTimestamp":"2022-08-24T05:36:36.529890Z"}

    其中,重点关注的数据如下:

    1)kind,统一用 ”Event“,查询只查询 Event 的审计

    2)stage:目前都是“ResponseComplete“,只记录了响应结束的时间,没记录请求收到的时间

    3)verb:增删改查

    4)user.username,操作人

    5)sourceIPs:客户端 IP

    6)objectRef.resource:操作的资源

    7)objectRef.namespace:操作的项目/namespace

    8)responseStatus.code:返回代码

    9)requestReceivedTimestamp:请求到达时间
    - + \ No newline at end of file diff --git a/docs/building-base/configuration/customize-menu/index.html b/docs/building-base/configuration/customize-menu/index.html index be663f4f4..23109625f 100644 --- a/docs/building-base/configuration/customize-menu/index.html +++ b/docs/building-base/configuration/customize-menu/index.html @@ -5,14 +5,14 @@ 自定义菜单 | Framework as a Building Block for Kubernetes - +

    自定义菜单

    kubebb 的所有菜单均基于 menu 的 CRD 进行定义,如果需要添加自己的菜单,可以参考以下 memnu 示例:

    # 主菜单
    apiVersion: component.t7d.io/v1beta1
    kind: Menu
    metadata:
    name: demo-menu
    spec:
    column: 1
    isRenderSelectCurrent: false
    parentOwnerReferences:
    apiVersion: ""
    kind: ""
    name: ""
    uid: ""
    rankingInColumn: 100
    tenant: true
    text: 测试菜单
    textEn: "Test Menu"
    ---
    # 测试菜单索引菜单
    apiVersion: component.t7d.io/v1beta1
    kind: Menu
    metadata:
    name: demo-menu-index
    spec:
    getTitleForReplaceSider: {}
    parentOwnerReferences:
    apiVersion: component.t7d.io/v1beta1
    blockOwnerDeletion: false
    controller: false
    kind: Menu
    name: demo-menu
    uid: ""
    rankingInColumn: 100
    tenant: true
    text: 菜单索引项
    textEn: “Menu Index Item"
    ---
    # 子菜单,具备实际链接功能
    apiVersion: component.t7d.io/v1beta1
    kind: Menu
    metadata:
    name: demo-menu-submenu1
    spec:
    getTitleForReplaceSider: {}
    isRenderSelectCurrent: false
    parentOwnerReferences:
    apiVersion: component.t7d.io/v1beta1
    blockOwnerDeletion: false
    controller: false
    kind: Menu
    name: demo-menu-index
    uid: ""
    pathname: /demo-feature1
    rankingInColumn: 200
    text: 测试子菜单
    textEn: "Test Submenu"

    使用 kubectl apply -f 即可将菜单项部署到环境中,如下图所示: 图 1

    - + \ No newline at end of file diff --git a/docs/building-base/configuration/customize-portal/index.html b/docs/building-base/configuration/customize-portal/index.html index 82c65716c..bcd9d195e 100644 --- a/docs/building-base/configuration/customize-portal/index.html +++ b/docs/building-base/configuration/customize-portal/index.html @@ -5,13 +5,13 @@ 自定义门户 | Framework as a Building Block for Kubernetes - +

    自定义门户

    1. 准备好需要替换的 logo,比如 logo-white.png、favicon.png,使用以下命令创建对应的 configmap
    kubectl create configmap portal-logos -n u4a-system \
    --from-file=logo-white.png=./logo-white.png \
    --from-file=favicon.ico=./favicon.png
    1. 修改 bff-server 的 deployment 将 configmap 挂载进去
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: bff-server
    namespace: u4a-system
    spec:
    template:
    spec:
    volumes:
    - hostPath:
    path: /etc/localtime
    type: ""
    name: time-localtime
    # 存储卷中增加刚刚创建的 configmap portal-logos
    - configMap:
    name: portal-logos
    name: logos
    containers:
    volumeMounts:
    - mountPath: /etc/localtime
    name: time-localtime
    readOnly: true
    # 将上面的存储卷 logos 挂载到对应 logo 目录
    - mountPath: /usr/src/app/public/profile/img
    name: logos

    自定义主色调

    通过创建 portal-global-configs 的 configmap,即可自定义门户主色调,示意如下:

    apiVersion: v1
    kind: ConfigMap
    metadata:
    name: portal-global-configs
    namespace: u4a-system
    data:
    global-configs: |
    {"theme": {"primaryColor": "#008F35"}}

    创建 configMap,刷新门户后即可生效

    kubectl create cm portal-global-configs -n u4a-system
    1. 修改 bff-server 的 deployment 将 configmap 挂载进去
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: bff-server
    namespace: u4a-system
    spec:
    template:
    spec:
    volumes:
    - hostPath:
    path: /etc/localtime
    type: ""
    name: time-localtime
    # 存储卷中增加刚刚创建的 configmap portal-global-configs
    - configMap:
    name: portal-global-configs
    name: portal-global-configs
    containers:
    volumeMounts:
    - mountPath: /etc/localtime
    name: time-localtime
    readOnly: true
    # 将上面的存储卷 logos 挂载到对应 logo 目录:
    - mountPath: /usr/src/app/configs
    name: portal-global-configs
    - + \ No newline at end of file diff --git a/docs/building-base/configuration/oidc-integration/index.html b/docs/building-base/configuration/oidc-integration/index.html index 1746bfef6..01e39eb6e 100644 --- a/docs/building-base/configuration/oidc-integration/index.html +++ b/docs/building-base/configuration/oidc-integration/index.html @@ -5,13 +5,13 @@ 集成单点登录 | Framework as a Building Block for Kubernetes - +

    集成单点登录

    通过 OIDC 协议,实现同 kubebb 的统一账号、认证及单点登录功能。

    1. 在 kubebb 服务端注册 OIDC 客户端

    通过修改 dex-server 使用的 ConfigMap 来添加 client:

    kubectl edit cm oidc-server -n u4a-system

    在 staticClients 处添加一个新的客户端,参考:

      staticClients:
    - id: my-oidc-client
    name: my-oidc-client
    secret: ZXhhbXBsZS1hcHAtc2VjcmV0 # 这里填写随机密钥,注意不要泄漏密钥
    redirectURIs: # 这里可以配置多个回调地址
    - "<my-oidc-client-callback-address>" # 这里填写登录成功后的回调地址,例如 "http://192.168.1.32:8022"

    重启 oidc-server

    kubectl delete <oidc-server-pod> -n u4a-system

    2. 接入 OIDC 登录

    1. 环境信息示例

    2. 应用注册信息

    3. 用户登录

    • 在应用侧,一般会引用相关的 OIDC SDK 来处理 OIDC 相关的处理流程,来帮助开发者简化交互流程,比如 golang 可以使用:https://github.com/coreos/go-oidc

    这里介绍如何通过 API 调用,来实现 OIDC 单点登录的基本流程:

    1)用户访问应用界面,应自动重定向到 kubebb 认证服务登陆 URL,URL 示例如下:

    https://192.168.2.216/oidc/auth?client_id=my-oidc-client&redirect_uri=http://192.168.1.32:8022/auth/callback&response_type=code&scope=openid+profile+email+offline_access
    参数名称描述
    client_id应用 ID,注册阶段由 kubebb 提供,如:my-oidc-client
    redirect_uri应用回调地址,注册阶段由应用提供,如:http://192.168.1.32:8022/auth/callback
    response_type固定值:code
    scope固定值:openid profile email

    2)在 kubebb 的登陆页面,用户输入用户名/密码登陆(如果用户已经登陆,这步会自动跳过)

    3)登录成功后,跳转回应用注册的回调地址,跳转示例如下:

    http://192.168.1.32:8022/auth/callback?code=kf7dmmvhdipdcjczydklwi6pu&state=<state-info>
    参数名称描述
    code授权码,由 kubebb 认证服务 生成,用于后面获取 token
    state与应用跳转到 kubebb 认证服务登陆 URL 时传递的 state 值一样。

    4)应用后台调用 kubebb token API 获取 token 信息,调用示例如下:

    curl -XPOST 'https://192.168.2.216/oidc/token' \
    -H 'Authorization: Basic c2FtcGxlLWFwcC0yMTg6WlhoaGJYQnNaUzFoY0hBdGMyVmpjbVYwJw==' \
    -H 'Content-Type: application/x-www-form-urlencoded' \
    --data-urlencode 'code=kf7dmmvhdipdcjczydklwi6pu' \
    --data-urlencode 'grant_type=authorization_code' \
    --data-urlencode 'redirect_uri=http://192.168.1.32:8022/auth/callback'
    参数名称描述
    Authorization格式 Basic XXXX,其中 XXXX 是 client_id:client_secret 的 base64 编码
    Content-Type固定值:application/x-www-form-urlencoded
    code授权码
    grant_type固定值:authorization_code
    redirect_uri应用回调地址,kubebb 认证服务会验证该地址是否与应用注册的回调地址一致

    该请求会返回token信息

    ID Token: eyJhbGciOiJSUzI1NiIsImtpZCI6ImQxY2Y2MzA3YmQ5Yzk3OTJiMzdmMGJiM2M1Njk1ZDQ0MWJlZTMzNjcifQ.eyJpc3MiOiJodHRwczovLzE5Mi4xNjguMi4yMTYiLCJzdWIiOiJDZ0V4RWdsMFpXNTRZMnh2ZFdRIiwiYXVkIjoic2FtcGxlLWFwcC0yMTgiLCJleHAiOjE2MzAwMzA0ODEsImlhdCI6MTYyOTk0NDA4MSwiYXRfaGFzaCI6Ik1PUjk0enktTUZNcU5zZUZTM1ZzRXciLCJjX2hhc2giOiJpbkoteDVKUEFCRXhaaEpRaEx3T3pBIiwiZW1haWwiOiJhZG1pbkBleGFtcGxlLmNvbSIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJuYW1lIjoiYWRtaW4iLCJwaG9uZSI6IjE3MzQzMTM1MDUxIiwidXNlcmlkIjoiMSJ9.FrC6oKRsManuP9opqugknJmOE78uKmxX6uteM1flCDVRqRv-riG0C5AOX4K9BTnT9GIlu3H24jydT4ybSissz_wL_mLzoTQWoQ9uMMmd4w1aiGqgO6mIaEh3XvTqtoQv1ltONSkp49bykpdIXbDJxy0PScU0k-0XFNJIMSBwn8SEubgH7NO3xwFzsjaLqBfolxC5YXBuWS8n-FEOqNTg-mx-n_Fu2oemJCT-8qWMqY6FNjRSC3D-2ABkCbl4g76vPLgJ-I6dU6eaJvaBW6S4BzhCX0SitxYrxcXjOGviX1HKOXXSUC1n1HfQpOpNW-FA2G3F-kON94rYr1AEdIwSVw

    Access Token: eyJhbGciOiJSUzI1NiIsImtpZCI6ImQxY2Y2MzA3YmQ5Yzk3OTJiMzdmMGJiM2M1Njk1ZDQ0MWJlZTMzNjcifQ.eyJpc3MiOiJodHRwczovLzE5Mi4xNjguMi4yMTYiLCJzdWIiOiJDZ0V4RWdsMFpXNTRZMnh2ZFdRIiwiYXVkIjoic2FtcGxlLWFwcC0yMTgiLCJleHAiOjE2MzAwMzA0ODEsImlhdCI6MTYyOTk0NDA4MSwiYXRfaGFzaCI6IlhYS3RzUkhZS043WnZGOUFxcXVSd3ciLCJlbWFpbCI6ImFkbWluQGV4YW1wbGUuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsIm5hbWUiOiJhZG1pbiIsInBob25lIjoiMTczNDMxMzUwNTEiLCJ1c2VyaWQiOiIxIn0.VXUxba9cy4S3ZUtyfbF6A3Xg5fZYL-m6nqR09qiJgJmNUCEkHr_b4xKXXvDJwsgoC0zdUxShd1BpOgN4vi8A7zZ676-PybB2dVT6x3EPpwCVC8_NVYwXijeELWJJ0nU9aAq6p_m-XdXOuPzutbmMLSWVfrY-CS2WSdQISuKxb28slTptzCF4OY3dZugOHZ_v10KAxsMo0Aul4d3C_EXOaiUKzw0OTD7xyYOm8MmJvhzQEYSodHAkbJWnOusKEBtFKJ5hhAqPLCymY2VleN-7Jbqr-DYrDSDtd7FF1vCbDL0-rTwQ5_79FIAu_fusOcVc26M7GlvOtGcniaweNtm1dg

    返回的 ID Token 是标准 JWT Token,应用可以从 ID Token 中解析出用户信息,例如:

        {
    "iss": "https://192.168.2.216/oidc",
    "sub": "CgExEgl0ZW54Y2xvdWQ",
    "aud": "sample-app",
    "exp": 1630030481,
    "iat": 1629944081,
    "at_hash": "MOR94zy-MFMqNseFS3VsEw",
    "c_hash": "inJ-x5JPABExZhJQhLwOzA",
    "email": "admin@example.com",
    "email_verified": true,
    "name": "admin",
    "phone": "17343135051",
    "userid": "1"
    }
    • 基于该 JWT Token,应用可以将用户基础信息同步到自己的系统内,在基于统一账号、认证的前提下,实现同自身账号、权限体系的融合。
    • Access Token 一般用于访问 kubebb 认证服务获取用户详细信息,可以按需使用。
    - + \ No newline at end of file diff --git a/docs/building-base/intro/index.html b/docs/building-base/intro/index.html index 31536285f..ed4189550 100644 --- a/docs/building-base/intro/index.html +++ b/docs/building-base/intro/index.html @@ -5,14 +5,14 @@ 介绍 | Framework as a Building Block for Kubernetes - +

    介绍

    技术组件

    平台开发采取前后端分离,以 K8S 为核心的开发框架,遵循 K8S 的扩展机制及 API 规范,整体开发架构的基本逻辑如下图所示: 图 2

    1. 所有组件的开发、扩展的认证都通过统一认证中心进行认证
    2. 认证由微前端的主框架 DockApp 统一进行,其他微前端的扩展不需要单独支持同认证中心的处理
    3. 开发架构上整体可以按照三层来看
    • 第一层,前端采用微前端架构,尽量采用低代码方式进行开发,提高代码自动化生成比例
    • 第二层,根据业务需求增加 OpenAPI,形成统一的 BFF 层,对 API 进行聚合,提供前端所需要的业务场景数据
    • 后端采用 CRD + controller 的 Operator 模式进行开发,形成数据驱动的流程开发模式
    1. 对外 API 主要包括两部分:
    • 从 BFF 层提供的 OpenAPI
    • 从 K8S 层提供的资源 API

    使用域名访问

    在代理服务器/负载均衡上,使用 nip.io 来支持 http/https 域名的绑定方式,便于默认统一采用域名进行配置。

    • 使用 nip.io 进行访问 http://<ip-address>.nip.io,比如 http://192.168.1.123.nip.io
    - + \ No newline at end of file diff --git "a/docs/category/\344\275\216\347\240\201kit/index.html" "b/docs/category/\344\275\216\347\240\201kit/index.html" index 8dd390069..436fa54bd 100644 --- "a/docs/category/\344\275\216\347\240\201kit/index.html" +++ "b/docs/category/\344\275\216\347\240\201kit/index.html" @@ -5,13 +5,13 @@ 低码Kit | Framework as a Building Block for Kubernetes - + - + \ No newline at end of file diff --git "a/docs/category/\345\206\205\346\240\270kit/index.html" "b/docs/category/\345\206\205\346\240\270kit/index.html" index 962626a8e..af39ed6fb 100644 --- "a/docs/category/\345\206\205\346\240\270kit/index.html" +++ "b/docs/category/\345\206\205\346\240\270kit/index.html" @@ -5,13 +5,13 @@ 内核Kit | Framework as a Building Block for Kubernetes - + - + \ No newline at end of file diff --git "a/docs/category/\345\272\225\345\272\247kit/index.html" "b/docs/category/\345\272\225\345\272\247kit/index.html" index e43ce549c..22e21d070 100644 --- "a/docs/category/\345\272\225\345\272\247kit/index.html" +++ "b/docs/category/\345\272\225\345\272\247kit/index.html" @@ -5,13 +5,13 @@ 底座Kit | Framework as a Building Block for Kubernetes - + - + \ No newline at end of file diff --git "a/docs/category/\345\277\253\351\200\237\345\274\200\345\247\213/index.html" "b/docs/category/\345\277\253\351\200\237\345\274\200\345\247\213/index.html" index 9d4d14978..979405fb7 100644 --- "a/docs/category/\345\277\253\351\200\237\345\274\200\345\247\213/index.html" +++ "b/docs/category/\345\277\253\351\200\237\345\274\200\345\247\213/index.html" @@ -5,13 +5,13 @@ 快速开始 | Framework as a Building Block for Kubernetes - + - + \ No newline at end of file diff --git "a/docs/category/\346\246\202\345\277\265/index.html" "b/docs/category/\346\246\202\345\277\265/index.html" index 031c560a4..5a6333576 100644 --- "a/docs/category/\346\246\202\345\277\265/index.html" +++ "b/docs/category/\346\246\202\345\277\265/index.html" @@ -5,13 +5,13 @@ 概念 | Framework as a Building Block for Kubernetes - + - + \ No newline at end of file diff --git "a/docs/category/\347\224\250\346\210\267\346\214\207\345\215\227/index.html" "b/docs/category/\347\224\250\346\210\267\346\214\207\345\215\227/index.html" index 3dc6fca57..b52cac610 100644 --- "a/docs/category/\347\224\250\346\210\267\346\214\207\345\215\227/index.html" +++ "b/docs/category/\347\224\250\346\210\267\346\214\207\345\215\227/index.html" @@ -5,13 +5,13 @@ 用户指南 | Framework as a Building Block for Kubernetes - + - + \ No newline at end of file diff --git "a/docs/category/\347\273\204\344\273\266\345\274\200\345\217\221/index.html" "b/docs/category/\347\273\204\344\273\266\345\274\200\345\217\221/index.html" index 34255b900..afbbbb569 100644 --- "a/docs/category/\347\273\204\344\273\266\345\274\200\345\217\221/index.html" +++ "b/docs/category/\347\273\204\344\273\266\345\274\200\345\217\221/index.html" @@ -5,13 +5,13 @@ 组件开发 | Framework as a Building Block for Kubernetes - + - + \ No newline at end of file diff --git "a/docs/category/\350\207\252\345\256\232\344\271\211\351\205\215\347\275\256/index.html" "b/docs/category/\350\207\252\345\256\232\344\271\211\351\205\215\347\275\256/index.html" index cf99c1001..455dd2d80 100644 --- "a/docs/category/\350\207\252\345\256\232\344\271\211\351\205\215\347\275\256/index.html" +++ "b/docs/category/\350\207\252\345\256\232\344\271\211\351\205\215\347\275\256/index.html" @@ -5,13 +5,13 @@ 自定义配置 | Framework as a Building Block for Kubernetes - + - + \ No newline at end of file diff --git a/docs/contribute/index.html b/docs/contribute/index.html index dba578e22..1e4855687 100644 --- a/docs/contribute/index.html +++ b/docs/contribute/index.html @@ -5,7 +5,7 @@ 贡献指南 | Framework as a Building Block for Kubernetes - + @@ -14,7 +14,7 @@ 在仓库主页面的左手边。然后你就可以在你的 GitHub 用户名中看到你的仓库了。

  • Clone 你自己的仓库到本地来开发。使用 git clone https://github.com/<your-username>/<your-project>.git 来克隆代码仓库到你的本地机器。然后你可以创建新的分支来完成你想做的改动。

  • 设置远程上游 上游设置为 https://github.com/kubebb/<project>.git 例如:

    git remote add upstream https://github.com/kubebb/core.git
    git remote set-url --push upstream no-pushing

    增加 upstream ,我们可以轻松地将本地分支与上游分支同步。

  • 创建一个分支 添加新特性或者修复问题。 更新本地工作目录:

    cd <project>
    git fetch upstream
    git checkout main
    git rebase upstream/main

    创建新的分支:

    git checkout -b <new-branch>

    在新的分支改动后可以构建和测试你的代码。

  • PR规范

    通过创建 PR 是对 KubeBB 项目的文件进行修改的唯一途径.

    git commit --signoff -m "description of this PR"

    为了帮助 reviewer 更好地理解你创建的 PR 的目的,PR描述需符合如下规范:

    <type>: <description>

    [optional body]

    其中,type 种类包括:

    • feat - 引入了新功能
    • fix - 修复了一个错误
    • chore - 与修复或功能无关的更改,不修改源代码或测试文件(例如更新依赖项)
    • refactor - 重构的代码,既不修复错误也不添加功能
    • docs - 更新文档,如README或其他markdown文件
    • style - 不影响代码含义的更改,通常与代码格式相关,如空格、缺少分号等。
    • test - 包括新的测试或更正之前的测试
    • perf - 性能改进
    • ci - 与持续集成相关
    • build - 影响构建系统或外部依赖项的更改
    • revert - 撤销先前的提交

    如果PR为对应解决某个 issue ,必须在PR出,添加 Fix: #1 #2 ,如下图:

    pr_example

    代码规范

    参与帮助任何事情

    我们选择 GitHub 作为 KubeBB 合作的主要场所。所以 KubeBB 的最新更新总是在这里。尽管通过 PR 的贡献是一种明确的帮助方式,我们仍然呼吁任何其他方式:

    • 在 issue 中回复其他人的问题
    • 帮助解决其他人的问题
    • 帮助 review 其他人的 PR
    • 参与讨论
    • 写技术博客
    • 等等

    加入社区

    如果您想成为 KubeBB GitHub 组织的成员,请参考下面的介绍:

    加入 KubeBB Github 组织

    在要求加入社区之前,我们要求你先做少量的贡献,以证明你有继续为 KubeBB 贡献的意愿。

    • 注意 任何人都可以为 KubeBB 做出贡献,加入 KubeBB Github 组织并不是一个强制性的步骤。

    有很多方法可以为 KubeBB 做出贡献:

    • 提交 PR
    • 报告错误或提供反馈
    • 回答 GitHub 上的问题

    提出您的申请

    • 在 KubeBB 仓库中创建一个 issue,并尽可能罗列您所做的全部工作。
    • 请 AT 2 个现有的 reviewer 以获取同意。
    • 请求被批准后,管理员将向你发出邀请。
      • 这是一个手动过程,通常每周运行几次。
      • 如果一个星期过去了,没有收到邀请,请通过邮件或者钉钉联系我们。
    - + \ No newline at end of file diff --git a/docs/core/concepts/component/index.html b/docs/core/concepts/component/index.html index d62becb5a..b529814fd 100644 --- a/docs/core/concepts/component/index.html +++ b/docs/core/concepts/component/index.html @@ -5,13 +5,13 @@ 组件CRD | Framework as a Building Block for Kubernetes - +

    组件CRD

    组件是将 chart package 映射为集群资源的一个概念,组件定义了 chart package 的基础描述信息,版本信息等。组件一般由仓库创建出来,无需手动创建。

    使用

    下面是手动创建一个组件示例:

    1. 准备组件 component.yaml
    apiVersion: core.kubebb.k8s.com.cn/v1alpha1
    kind: Component
    metadata:
    labels:
    kubebb.component.repository: repository-bitnami-sample
    name: repository-bitnami-sample.wordpress
    namespace: kubebb-system
    ownerReferences:
    - apiVersion: core.kubebb.k8s.com.cn/v1alpha1
    kind: Repository
    name: repository-bitnami-sample
    uid: a5b8b73d-47a5-40e1-9839-7aebf8a25618
    spec: {}
    kubectl apply -f component.yaml
    1. 准备更新组件 status.yaml
    status:
    description: WordPress is the world's most popular blogging and content management
    platform. Powerful yet simple, everyone from students to global corporations use
    it to build beautiful, functional websites.
    home: https://bitnami.com
    icon: https://bitnami.com/assets/stacks/wordpress/img/wordpress-stack-220x234.png
    keywords:
    - application
    - blog:
    - cms
    - http
    - php
    - web
    - wordpress
    maintainers:
    - name: VMware, Inc.
    url: https://github.com/bitnami/charts
    - name: Bitnami
    url: https://github.com/bitnami/charts
    name: wordpress
    repository:
    apiVersion: core.kubebb.k8s.com.cn/v1alpha1
    kind: Repository
    name: repository-bitnami-sample
    namespace: kubebb-system
    uid: a5b8b73d-47a5-40e1-9839-7aebf8a25618
    sources:
    - https://github.com/bitnami/charts/tree/main/bitnami/wordpress
    versions:
    - appVersion: 6.2.2
    createdAt: "2023-06-06T19:08:58Z"
    deprecated: false
    digest: 47096ed3f0a385e5830e90c75f443b7be107d7fa6df6aa869e7deb60b6cb6f8f
    updatedAt: "2023-06-08T05:34:00Z"
    version: 16.1.13
    - appVersion: 6.2.2
    createdAt: "2023-06-05T12:52:45Z"
    deprecated: false
    digest: 2005819fa8a08dea1f73585bcc4a37d83d3ef4f787c3927b5f51d2b5ae826dcb
    updatedAt: "2023-06-08T05:34:00Z"
    kubectl -nkubebb-system patch component.core.kubebb.k8s.com.cn repository-bitnami-sample.wordpress --type=merge --subresource status --patch-file status.yaml

    CRD 定义说明

    CRD 的代码定义位于 ComponentTypes。组件的信息都定在 status 中, 接下来会详细介绍每个字段的含义及其作用。

    • status.name

      该字段用来保存 chart package 的名字。

    • status.versions

      该字段是数组,用来保存 chart package 的多个版本。每个版本包含的信息如下

      • status.versions[index].appVersion 定义 chart packge 里面的应用的版本信息。
      • status.versions[index].createdAt 创建时间
      • status.versions[index].updatedAt 更新时间
      • status.versions[index].deprecated 当前版本是否废弃
      • status.versions[index].version chart package 的版本信息
      • status.versions[index].digest 数字签名
    • status.description

      chart package 的描述信息

    • status.maintainers

      该字段是数组类型,每一项都是 chart package 的维护者。每一项的包含的信息如下

      • status.maintainers[index].name 维护者名字
      • status.maintainers[index].email 维护者的邮箱
      • status.maintainers[index].url 维护者的网站
    • status.home

      组件的官网。

    • status.soureces

      该字段是字符串数组类型,定义组件代码仓库。

    • status.keywords

      该字段是字符串数组类型,定义与该组件关联的关键词。

    • status.icon

      定义该组件的图标

    • status.deprecated

      定义当前组件是否废弃

    工作原理

    组件也实现为 Kubernetes Operator,主要功能就是当组件创建,更新给每个组件添加 label kubebb.component.repository=<repository-name>,方便搜索。

    - + \ No newline at end of file diff --git a/docs/core/concepts/componentplan/index.html b/docs/core/concepts/componentplan/index.html index b4fa40919..07f6e46e1 100644 --- a/docs/core/concepts/componentplan/index.html +++ b/docs/core/concepts/componentplan/index.html @@ -5,7 +5,7 @@ 组件部署CRD | Framework as a Building Block for Kubernetes - + @@ -18,7 +18,7 @@ 字段)的规则遵循 kustomize:ImageTagTransformer 规范,代码实现也是直接调用了 kustomize 的这部分代码,降低了用户学习成本,保证了代码的兼容性和有效性。
  • 单个 ComponentPlan 的镜像替换和整个 Repository 的镜像替换,都是通过 Helm:post-rendering 技术实现的。
  • 镜像覆盖策略

    image-changed

    ComponentPlan 和 Helm release 的关系

    componentplan

    - + \ No newline at end of file diff --git a/docs/core/concepts/repository/index.html b/docs/core/concepts/repository/index.html index 54667c855..24880132c 100644 --- a/docs/core/concepts/repository/index.html +++ b/docs/core/concepts/repository/index.html @@ -5,7 +5,7 @@ 组件仓库CRD | Framework as a Building Block for Kubernetes - + @@ -15,7 +15,7 @@ 对仓库中所有来自 docker.io 的镜像,替换为 192.168.1.1 ,并将镜像路径为 library 的镜像替换为 system-container ,比如仓库中有镜像 docker.io/library/nginx:v1.2.3 会替换为 192.168.1.1/system-container/nginx:v1.2.3

    CRD 定义说明

    CRD 的代码定义位于 RepositoryTypes。接下来会详细介绍每个字段的含义及其作用。

    提示

    说明 对于下面的 yaml,我们想要访问 bar 字段,书写格式为 spec.foo.bar

    spec:
    foo:
    bar: xx
    • spec.url

      该字段用来保存 chart repository 的地址

    • spec.authSecret

      对于需要认证,或者有自定义证书的 chart repository,需要将认证信息,证书信息存放到以该字段为名字的 secret 中。secret 中的主要字段信息如下

      • username 定义认证需要的用户名
      • password 定义认证需要的密码
      • cadata 定义签发证书的 RootCA
      • certdata 定义客户端通过 RootCA 签发的证书
      • keydata 定义客户端私钥

      如果服务端要求 TLS 双向认证,那么需要提供 certdatakeydata

    • spec.insecure

      是否跳过 https 验证

    • spec.repositoryType

      仓库类型,是字符串,理解为标记即可。

    • spec.PullStrategy.intervalSeconds

      定义获取数据的周期,可以不填写,默认是 120 秒。

    • spec.PullStrategy.timeoutSeconds

      定义一次 http 请求的超时时间。

    • spec.PullStrategy.retry

      定义请求失败的重试次数。默认不填写,只会做一次请求

    • spec.filter

      该字段是数组,定义了一系列的对 chart package 和 版本的过滤条件。因为是数组,所以可以出现对同一个 chart package 的多个过滤条件,只会使用最后一条。

      数组的每一项的介绍

      • spec.filter[index].name 定义了要参与过滤的 chart package 的名称。
      • spec.filter[index].operation 有两个可选值 keep, ignoreignore 定义 chart package 要忽略的版本, keep 定义 chart package 要保留的版本。
      • spec.filter[index].keepDeprecated false 表示不保留 chart package 已经废弃的版本,true 表示保留。
      • spec.filter[index].versionedFilterCond.versions 是一个版本的数组,只要 chart package 的版本与该数组中任意一个精确匹配上,即符合规则。
      • spec.fitler[index].versionedFilterCond.versionRegexp 版本过滤的正则表达式。
      • spec.filter[index].versionedFilterCond.versionConstraint 版本验证条件,表达式格式请参考 semver

      operation=keep 的时候, versions, versionRegexp, VersionConstraint 满足任一条件就会保留版本。
      operation=ignore 的时候, versions, versionRegexp, VersionConstraint 满足任一条件就会忽略版本。

      keepDeprecated 在对最终留下来的版本进行过滤,是否保留废弃版本。

    • spec.imageOverride 非必需 该字段是数组,定义了一系列仓库级别的镜像覆盖策略。

      每一项内容包括:

      • spec.imageOverride[].registry 该镜像仓库域名地址,可以包含端口,例如:docker.io192.168.1.1:5000
      • spec.imageOverride[].newRegistry 要将 registry 替换后的镜像仓库域名地址,可以包含端口。
      • spec.imageOverride[].pathOverride 非必需
        • spec.imageOverride[].pathOverride.path 旧的镜像仓库路径,比如镜像地址 docker.io/library/nginx:latest 中的 path 为 library
        • spec.imageOverride[].pathOverride.newPath 要将 path 替换后的镜像仓库新路径。

    工作原理

    仓库以 Kubernetes Operator 方式实现。周期性的获取 chart repository 的数据,对集群中组件更新或者创建,一般不会删除组件,而是将在 chart repository 中不存在的组件标记为废弃

    1. Repository 创建,更新时

    创建或者更新 Repository 时,会检查该资源是否添加 finalizers, 以及 URL 变更历史是否正确更新。

    当所有的更新都处理完成后,将会启动 chartmuseum watcher,在每次获取到若干的 chart package 后,与集群中已经存在的 Component 对比,将会执行 新增 component, 更新 component

    我们不会删除已经创建的 Component, 而是在发现集群中存在 Component 且并不存在于当前的 chart repository 中,那么会将其标记为废弃。

    1. Repoistory 删除时

    Repository 创建出来的 Component 都会添加 OwnerReferences,删除 Repository 的时候会自动删除关联的 Component

    1. 镜像覆盖策略

    image-changed

    - + \ No newline at end of file diff --git a/docs/core/concepts/subscription/index.html b/docs/core/concepts/subscription/index.html index 65b2afafe..c10e6e884 100644 --- a/docs/core/concepts/subscription/index.html +++ b/docs/core/concepts/subscription/index.html @@ -5,7 +5,7 @@ 组件订阅CRD | Framework as a Building Block for Kubernetes - + @@ -18,7 +18,7 @@ 该字段用来指明要监控的组件所在的仓库实例,一般使用 namespacename 来唯一确定,一般由控制器自动填充,不需要用户填写。
  • spec.componentPlanInstallMethod 可选字段 组件安装计划的安装方式,默认为 auto,可选项为 automanual
  • spec.其他 订阅中完整的包含了组件安装计划中的自定义配置字段。详细内容见组件安装计划的文档。
  • 工作原理

    订阅以 Kubernetes Operator 方式实现。当订阅控制器监视发现集群中订阅对应的组件创建或更新时,判断订阅未处理该更新事件时,用订阅中的组件安装计划配置创建一个名为 sub-<订阅名>-<安装版本>ComponentPlan,触发后续的组件安装步骤。

    - + \ No newline at end of file diff --git a/docs/core/intro/index.html b/docs/core/intro/index.html index 69902d26f..4a852eed1 100644 --- a/docs/core/intro/index.html +++ b/docs/core/intro/index.html @@ -5,14 +5,14 @@ 介绍 | Framework as a Building Block for Kubernetes - +

    介绍

    内核基于kubernetes operator模式进行开发,提供完整的组件生命周期管理、组件订阅和自动化部署能力,并通过tekton扩展实现组件自动化评级和安装前校验等能力。

    整体架构

    KubeBB Core架构图

    核心优势

    声明式组件生命周期管理

    组件生命周期

    组件的生命周期主要可以划分为三个阶段:

    component_lifecycle

    1. 研发阶段

    开发者通过低码平台(optional)完成组件的开发工作,根据不同的组件类型,选择不同的方式完成组件的打包,并将打包后的资源发布到仓库服务中。

    组件资源一般包含两类:

    • 镜像资源: 组件开发完成一般需要构建成一个镜像,并推送到镜像仓库
    • 安装包:组件安装部署时的各种资源配置信息(通常为Helm charts),并推送到Charts包仓库

    镜像资源一般通过公共镜像仓库(Dockerhub)或私有镜像仓库管理,我们不做特殊处理。组件仓库服务主要用于存储安装包(Charts)。

    2. 部署阶段

    系统管理员从组件仓库服务中手动查找存储的组件列表,获取可用的组件信息(发布者、版本、安装配置等),并根据实际情况,完成组件配置并安装到系统中。安装完成后,需要手动去检查组件版本更新,并谨慎的完整组件的升级。

    3. 使用阶段

    普通用户在组件安装到系统后,通过底座Kit提供的统一访问入口和统一用户认证来访问具体的组件服务。

    声明式的优势

    声明式的组件生命周期管理有以下优势:

    • 可读性: 更易于理解和阅读组件定义本身,因为它们表达了想要的结果,而不是实现的步骤。
    • 可维护性:更易于维护组件,因为它们更容易理解,更容易修改,而且更少有错误。
    • 可重用性:更容易重用组件,因为它们通常是独立于上下文的,可以在不同的环境中使用。
    • 可扩展性:更易于扩展组件,因为它们通常是基于组件和模块的,可以简单地组合起来创建更复杂的系统。
    • 可靠性:更可靠,因为它们通常是基于静态配置的,而不是基于运行时状态的。这意味着它们更少出现运行时错误和意外行为。

    多维度组件评级

    通过集成Tekton流水线组件,实现自动化的组件评级,并通过CRD Rating完成评测数据总结和分析。

    目前组件评级围绕三个维度展开:

    • 安全性: 评估组件的安全性和软件供应链的安全性。
    • 可靠性: 评估组件本身是否已经过良好的功能测试、性能测试
    • 可用性: 评估组件是否有充足的文档、示例来指导用户使用

    全面适配Helm生态

    Helm是一种成熟的包管理工具,提供一种简单的方式来管理Kubernetes应用程序的部署和升级。它拥有庞大的社区和众多优秀的项目。 因此,内核从设计之初就确定了必须全面兼容Helm生态

    这一特点体现在内核设计的各个方面,我们支持:

    扩展适配底座服务

    提示
    1. 低代码开发平台定义MenusRoute等底座相关资源,并打包到组件模版中
    2. 内核获取底座自定义资源后,自动解析、配置、创建对应资源

    底座服务支持通过自定义菜单路由扩展平台服务,为支撑适配这一能力,我们做了以下努力:

    • 移植Menu资源类型
    • 移植Route配置

    从而通过内核串联云梯低代码开发平台底座服务

    - + \ No newline at end of file diff --git a/docs/core/rating/index.html b/docs/core/rating/index.html index 6068370f6..e88e48af8 100644 --- a/docs/core/rating/index.html +++ b/docs/core/rating/index.html @@ -5,13 +5,13 @@ 组件评级 | Framework as a Building Block for Kubernetes - +

    组件评级

    组件评级的目的是通过尽可能多的自动化测试从多个维度来评估一个组件。因此,组件评级三个部分的内容:

    • 定义并完成组件的自动化测试
    • 收集处理测试数据
    • 评估获取组件等级

    为了实现上述提到的三个部分的内容,我们选择:

    • 通过Tekton安全性可靠性可用性三个维度定义多种任务来完成自动化组件测试
    • 定义CRD Rating及其控制器,实时监听Tekton资源,收集测试数据
    • 通过Human DefinedAI Defined两种模式来制定组件评估规则,并基于测试数据实时更新组件等级

    核心流程

    rating_workflow

    任务列表

    提示

    所有任务权重目前都为1,后续需要根据实际的任务重要性赋予不同的权重,并以此获得最终的评分

    评测任务类型描述权重状态
    rating-security-rback安全性通过 dryrun 的方式获取完整的组件 RBAC1已支持
    rating-security-slsa安全性验证 SLSA 供应链安全等级1研发中
    rating-reliability-linting可靠性通过 helm lint 验证组件是否符合规范1已支持
    rating-reliability-testing可靠性通过 helm testing1研发中
    rating-reliability-deployment-testing可靠性验证部署后的组件,功能和性能是否符合预期1研发中
    rating-availability-sample可用性验证组件包是否包含 ComponentPlan 示例1研发中

    安全性任务

    rating-security-rback 根据 chart 包里的内容得到完整的安装文件,并根据这些文件生成权限关系图,用户可以根据这个关系图判断权限是否过大而选择是否安装。

    分以下4个步骤完成:

    1. 下载chart包

    通过 helm pull 下载指定的chart包

    1. 生成 .dot 文件

    通过 helm template 将 chart 包要安装的内容完全列举出来,并通过 yqjq 命令转换成如下格式:

    {
    "kind":"List",
    "apiVersion": "v1",
    "items": [
    {
    "kind": "ServiceAccount",
    "apiVersion": "v1",
    "metadata": {
    "name": "sa",
    }
    }
    ]
    }

    通过 rback 命令将以上的 json 内容转换成 .dot 文件。

    1. 存储到 ConfigMap

    将上述得到 .dot 文件存储到 ConfigMap 中。

    1. 将 ConfigMap 名字写到输出

    Pipeline 支持输出一些运行结果,将CongiMap的名字写到输出内容中,方便后续用户使用。

    可靠性任务

    rating-reliability-linting 用来检查 chart 包里书写格式是否正确,以保证平台可以完整的给用户展示相关信息。

    分以下2个步骤完成:

    1. 下载 chart 包

    通过 helm pull 下载 chart 包。

    1. 检查 lint

    通过 helm lint 检查包的书写格式,输出内容会跟随日志输出。

    可用性任务

    (待补充)

    - + \ No newline at end of file diff --git a/docs/core/roadmap/index.html b/docs/core/roadmap/index.html index 510401d4c..f057b455a 100644 --- a/docs/core/roadmap/index.html +++ b/docs/core/roadmap/index.html @@ -5,13 +5,13 @@ 路线图 | Framework as a Building Block for Kubernetes - +

    路线图

    v0.1.0

    • 支持管理组件仓库 Repository
      • 支持与 Helm 仓库兼容的 Repository Server
      • Watcher 监视 Repository
    • 实现 Component 管理
      • Watcher 实现 Components 的 CRUD 操作
    • 支持 ComponentPlanSubscription
      • 允许用户订阅 Component 的最新版本更改
      • 使用与 Helm Chart 兼容的 ComponentPlan 计划组件部署

    v0.2.0

    • 支持内核各控制器的Events记录
    • 适配 Kubebb 底座服务
    • 基于Tekton Pipeline安全性可靠性可用性 三个维度对 Component 进行评级Rating
    • 基于Tekton Pipeline实现ComponentPlan组件部署前的预先校验Check
    • 组件仓库Repository 中启用 authOCI
    • 实现与低代码平台集成
    - + \ No newline at end of file diff --git a/docs/core/userguide/privatecluster/index.html b/docs/core/userguide/privatecluster/index.html index 0404a3198..cf55d0bf6 100644 --- a/docs/core/userguide/privatecluster/index.html +++ b/docs/core/userguide/privatecluster/index.html @@ -5,7 +5,7 @@ 私有集群部署方案 | Framework as a Building Block for Kubernetes - + @@ -16,7 +16,7 @@ 这里还是以 chartmuseum 测试

    cd components/charts/chartmuseum
    helm pacakge .

    # 成功将会输出 {"saved":true}
    curl --data-binary "@chartmuseum-3.10.1.tgz" http://localhost:8080/api/charts

    4.4 结果查看

    # 查看 index.yaml
    curl http://localhost:8080/index.yaml

    4.4 上传其他的chart包

    对于 components/charts 下面的其他的chart包用到哪些,按照 4.3 步骤就可以完成上传。


    5.使用 kubebb-core

    5.1 部署一个 Repository

    # repo.yaml
    apiVersion: core.kubebb.k8s.com.cn/v1alpha1
    kind: Repository
    metadata:
    name: kubebb
    namespace: kubebb-system
    spec:
    url: http://chartmuseum.default.svc.cluster.local:8080
    pullStategy:
    intervalSeconds: 120
    retry: 5

    创建 repository

    # 1. 创建 repository
    kubectl apply -f repo.yaml

    # 2. 检查 components 是否创建
    kubectl get components.core.kubebb.k8s.com.cn -n kubebb-system
    NAME AGE
    kubebb.chartmuseum 2s
    kubebb.kubebb-core 2s

    可以看到创建了 repository 后,相关的 components 已经被创建出来了。

    5.2 部署一个 Component

    部署 component ,需要使用 componentplan 这个资源。这里我们选择再次部署一个 chartmuseum。前面通过 helm 部署的 chartmuseum 是给系统存储chart用的,这里部署,是为了测试功能正常(没搞其他的chart包)。

    # componentplan.yaml
    apiVersion: core.kubebb.k8s.com.cn/v1alpha1
    kind: ComponentPlan
    metadata:
    name: chartmuseum-test
    namespace: default
    spec:
    approved: true
    name: chartmuseum-test
    version: 3.10.1
    override:
    set:
    - image.repository=localhost:5001/chartmuseum
    - env.open.DISABLE_API=false
    component:
    name: kubebb.chartmuseum
    namespace: kubebb-system

    创建compnentplan

    kubectl apply -f componentplan.yaml

    部署完成后,可以看到 chartmuseum-test 的pod也起来了。

    kubectl get po

    NAME READY STATUS RESTARTS AGE
    chartmuseum-6c4bc46898-msp7r 1/1 Running 0 107s
    chartmuseum-test-86d66fd5d7-lp2rn 1/1 Running 0 11s

    5.3 Repository Image 重写

    这个步骤是为了测试 image 更新策略,如果不需要可以不用操作。 我们还是用之前的helm部署的 chartmuseum,里面有一个chartmuseum 的包, 要用到镜像

    ghcr.io/helm/chartmuseum:v0.16.0

    # repo-override-image.yaml
    apiVersion: core.kubebb.k8s.com.cn/v1alpha1
    kind: Repository
    metadata:
    name: repo-override-image
    namespace: kubebb-system
    spec:
    url: http://chartmuseum.default.svc.cluster.local:8080
    pullStategy:
    intervalSeconds: 120
    retry: 5
    imageOverride:
    - registry: ghcr.io
    newRegistry: localhost:5001
    pathOverride:
    path: helm
    newPath: ""

    创建Repository

    kubectl apply -f repo-override-image.yaml

    创建 repository 后,查看 components

    kubectl get components -A
    NAMESPACE NAME AGE
    kubebb-system kubebb.chartmuseum 18m
    kubebb-system kubebb.kubebb-core 18m
    kubebb-system repo-override-image.chartmuseum 5s
    kubebb-system repo-override-image.kubebb-core 5s

    再次安装 chartmuseum 注意,这里我们不再设置 chartmuseum 所使用的镜像。

    # componentplan-default-override.yaml
    apiVersion: core.kubebb.k8s.com.cn/v1alpha1
    kind: ComponentPlan
    metadata:
    name: chartmuseum-test233
    namespace: default
    spec:
    approved: true
    name: chartmuseum-test233
    version: 3.10.1
    override:
    set:
    - env.open.DISABLE_API=false
    component:
    name: repo-override-image.chartmuseum
    namespace: kubebb-system

    创建 componentplan

    kubectl apply -f componentplan-default-override.yaml

    检查pod的运行情况

    kubectl get po

    NAME READY STATUS RESTARTS AGE
    chartmuseum-6c4bc46898-msp7r 1/1 Running 0 32m
    chartmuseum-test-86d66fd5d7-lp2rn 1/1 Running 0 31m
    chartmuseum-test233-544cbfb87c-b6pdd 1/1 Running 0 12s

    部署完成✅!

    - + \ No newline at end of file diff --git a/docs/intro/index.html b/docs/intro/index.html index 816d35442..50af2152a 100644 --- a/docs/intro/index.html +++ b/docs/intro/index.html @@ -5,13 +5,13 @@ 总览 | Framework as a Building Block for Kubernetes - +

    总览

    KubeBB(Kubernetes Building Blocks)是一种由内核驱动的组件生命周期管理平台,集成开箱即用的云原生底座低码组件开发能力,整合实现云原生三层组件模式

    overview

    Kubebb提供三个套件

    提供声明式的组件生命周期管理和组件市场,并通过Tekton流水线强化低代码平台组件与底座服务的集成。

    提供开箱即用的云原生服务门户,包括用户、OIDC认证、权限、审计、租户管理、门户服务等基础组件以及证书管理、Nignx Ingress等集群组件。

    依托Low-Code Engine和具有Git特性的关系数据库Dolt打造,并借助底座门户的菜单和路由资源和内核套件的组件管理能力,实现组件开发、测试到上线的全链路能力。

    三个核心套件之间的关系可以类比一下操作系统:

    • Kubernetes ~ 操作系统内核
    • Core ~ 软件安装器
    • 底座Kit ~ 操作系统的系统软件,如GUI、用户系统、网络等
    • 低码组件开发Kit ~ 操作系统软件开发工具

    内核Kit

    内核Kit的是现阶段我们重点关注并研发的项目,完全遵循开源项目管理规范。现阶段我们的目标:

    1. 声明式的组件全生命周期管理

    基于Operator Pattern开发,实现声明式的组件全生命周期管理。

    component-lifecycle

    提供四个核心的CRD实现:

    定义了组件仓库的访问信息、轮询策略和过滤选项,从而实现周期性地向仓库服务获取最新的组件列表信息。

    记录组件的基础描述、版本列表、是否废弃等信息

    定义组件安装部署的手动批准、组件引用、版本设置、类helm的配置覆盖策略,从而实现组件的可追踪部署、升级和回滚。

    定义了用户订阅组件版本更新

    一个扩展CRD实现,集成Tekton Pipeline:

    2. 开放组件市场

    组件市场是内核能力的产品化,作为一个适配底座服务的组件发布到官方组件仓库中使用,扩展KubeBB生态。

    底座Kit

    底座Kit通过集成以下组件从而提供统一的认证中心和门户入口:

    portal

    低码Kit

    低码Kit提供三层组件开发模式前端模块研发、出码能力,并借助内核Kit完成标准化打包、测试、发布。

    lowcode_development

    - + \ No newline at end of file diff --git a/docs/lowcode-development/development/backend-operator/index.html b/docs/lowcode-development/development/backend-operator/index.html index df3e3482e..9c26e281d 100644 --- a/docs/lowcode-development/development/backend-operator/index.html +++ b/docs/lowcode-development/development/backend-operator/index.html @@ -5,13 +5,13 @@ 开发后端服务组件 | Framework as a Building Block for Kubernetes - + - + \ No newline at end of file diff --git a/docs/lowcode-development/development/bff-apis/index.html b/docs/lowcode-development/development/bff-apis/index.html index 02c6cc5a3..5c6e00c7d 100644 --- a/docs/lowcode-development/development/bff-apis/index.html +++ b/docs/lowcode-development/development/bff-apis/index.html @@ -5,13 +5,13 @@ BFF层API开发 | Framework as a Building Block for Kubernetes - + - + \ No newline at end of file diff --git a/docs/lowcode-development/development/develop-hello-world/index.html b/docs/lowcode-development/development/develop-hello-world/index.html index 33b58c714..872efb7bf 100644 --- a/docs/lowcode-development/development/develop-hello-world/index.html +++ b/docs/lowcode-development/development/develop-hello-world/index.html @@ -5,13 +5,13 @@ 发布一个 Hello World 组件 | Framework as a Building Block for Kubernetes - + - + \ No newline at end of file diff --git a/docs/lowcode-development/development/frontend/index.html b/docs/lowcode-development/development/frontend/index.html index cdac7af49..65ef5a249 100644 --- a/docs/lowcode-development/development/frontend/index.html +++ b/docs/lowcode-development/development/frontend/index.html @@ -5,13 +5,13 @@ 前端开发 | Framework as a Building Block for Kubernetes - + - + \ No newline at end of file diff --git a/docs/lowcode-development/development_pattern/index.html b/docs/lowcode-development/development_pattern/index.html index af51ac417..172f149b7 100644 --- a/docs/lowcode-development/development_pattern/index.html +++ b/docs/lowcode-development/development_pattern/index.html @@ -5,14 +5,14 @@ 开发模式 | Framework as a Building Block for Kubernetes - +

    开发模式

    KubeBB组件的开发采取前后端分离,以 K8S 为核心的开发框架,遵循 K8S 的扩展机制及 API 规范。整体开发架构的基本逻辑如下图所示: dev_arch

    1. 所有组件的开发、扩展的认证都通过统一认证中心进行认证
    2. 认证由微前端的主框架 DockApp 统一进行,其他微前端的扩展不需要单独支持同认证中心的处理

    三层模式

    基于低码开发的组件,将采用如下三层开发模式:

    • 第一层: 前端采用微前端架构,采用低代码方式进行开发,提高代码自动化生成比例
    • 第二层: 根据业务需求增加 OpenAPI,形成统一的 BFF 层,对 API 进行聚合,提供前端所需要的业务场景数据
    • 第三层: 后端采用CRD + controller 的 Operator 模式进行开发,形成数据驱动的流程开发模式
    - + \ No newline at end of file diff --git a/docs/lowcode-development/intro/index.html b/docs/lowcode-development/intro/index.html index 119d6345f..4d8b5b9c8 100644 --- a/docs/lowcode-development/intro/index.html +++ b/docs/lowcode-development/intro/index.html @@ -5,13 +5,13 @@ 介绍 | Framework as a Building Block for Kubernetes - + - + \ No newline at end of file diff --git a/docs/quick-start/buildingbase_quickstart/index.html b/docs/quick-start/buildingbase_quickstart/index.html index aeda3b2e5..ce1fb0601 100644 --- a/docs/quick-start/buildingbase_quickstart/index.html +++ b/docs/quick-start/buildingbase_quickstart/index.html @@ -5,13 +5,13 @@ 安装底座 | Framework as a Building Block for Kubernetes - +

    安装底座

    本章节主要介绍底座组件的部署步骤,包括相关的开源技术组件、前提条件以及快速部署,并将部署的集群添加到服务门户上。

    提示

    安装前需完成安装内核

    部署

    1. 创建官方组件仓库

    可参考使用官方组件仓库

    2. 创建底座组件空间

    提示

    目前仅支持使用命名空间u4a-system

        kubectl create namespace u4a-system

    3. 部署Cluster Component

    组件部署信息cluster_componentplan.yaml如下:

    详细可参考

    apiVersion: core.kubebb.k8s.com.cn/v1alpha1
    kind: ComponentPlan
    metadata:
    name: cluster-component
    namespace: u4a-system
    spec:
    approved: true
    name: cluster-component
    version: 0.1.3
    override:
    set:
    - ingress-nginx.controller.nodeSelector.kubernetes\.io/hostname=kubebb-core-control-plane
    component:
    name: kubebb.cluster-component
    namespace: kubebb-system

    需调整参数:

    • override.set.ingress-nginx.controller.nodeSelector.kubernetes\.io/hostname 将作为ingress-nginx服务节点

    此处基于kind开发集群kubebb-core-control-plane节点。

    通过一下命令部署:

        kubectl apply -nu4a-system -f cluster_componentplan.yaml

    Cluster Component部署完成后,可通过以下命令查看组件部署状态:

        kubectl get componentplan -nu4a-system cluster-component -oyaml

    当组件部署状态如下时,表示组件部署成功:

    status:
    conditions:
    - lastTransitionTime: "2023-07-25T08:15:41Z"
    reason: ""
    status: "True"
    type: Approved
    - lastTransitionTime: "2023-07-25T08:15:44Z"
    reason: InstallSuccess
    status: "True"
    type: Actioned
    - lastTransitionTime: "2023-07-25T08:15:44Z"
    reason: ""
    status: "True"
    type: Succeeded

    4. 部署U4A Component

    组件部署信息u4a_componentplan.yaml如下:

    apiVersion: core.kubebb.k8s.com.cn/v1alpha1
    kind: ComponentPlan
    metadata:
    name: u4a-component
    namespace: u4a-system
    spec:
    approved: true
    name: u4a-component
    version: 0.1.3
    wait: true
    override:
    valuesFrom:
    - kind: ConfigMap
    name: u4acm
    valuesKey: "values.yaml"
    component:
    name: kubebb.u4a-component
    namespace: kubebb-system

    其中,组件U4A-Component的参数通过ConfigMap方式注入,ConfigMap的创建流程可参考U4A组件部署流程

    通过一下命令部署:

        kubectl apply -nu4a-system -f u4a_componentplan.yaml

    U4A Component部署完成后,可通过以下命令查看组件部署状态:

        kubectl get componentplan -nu4a-system u4a-component -oyaml

    5. 访问底座服务门户

    通过以下命令获取门户服务的访问地址:

    (base) ➜  ~ kubectl get ingress -nu4a-system
    NAME CLASS HOSTS ADDRESS PORTS AGE
    bff-server-ingress <none> portal.172.18.0.2.nip.io 80, 443 4h55m
    bff-server-ingress-socket <none> portal.172.18.0.2.nip.io 80, 443 4h55m
    kube-oidc-proxy-server-ingress <none> k8s.172.18.0.2.nip.io 80, 443 4h55m

    通过浏览器访问https://portal.172.18.0.2.nip.io即可进入服务门户。默认的用户名密码为

    • 用户名: admin
    • 密码: kubebb-admin

    注意: 由于使用了nip.io作为域名解析服务,因此需要将HOSTS中的域名解析到ADDRESS对应的IP地址上。

    卸载

    1. 卸载U4A Component

        kubectl delete componentplan -nu4a-system u4a-component

    2. 卸载Cluster Component

        kubectl delete componentplan -nu4a-system cluster-component
    - + \ No newline at end of file diff --git a/docs/quick-start/core_quickstart/index.html b/docs/quick-start/core_quickstart/index.html index 54bfcaf27..c0888d75d 100644 --- a/docs/quick-start/core_quickstart/index.html +++ b/docs/quick-start/core_quickstart/index.html @@ -5,13 +5,13 @@ 安装内核 | Framework as a Building Block for Kubernetes - +
    -

    安装内核

    提示

    安装前需完成预先准备

    安装方式

    Helm安装(推荐)

    提示

    Kubebb官方提供了helm仓库,方便用户安装: https://kubebb.github.io/components/

    1. 添加helm仓库
    helm repo add kubebb https://kubebb.github.io/components/
    helm repo update
    1. 创建命名空间

    请根据实际情况修改命名空间名称

    kubectl create namespace kubebb-system
    1. 安装
    helm install --wait -nkubebb-system kubebb-core kubebb/kubebb-core

    源代码安装

    1. 克隆代码

    请根据实际情况修改代码仓库版本

    git clone https://github.com/kubebb/core
    1. 构建镜像
    cd core
    make docker-build IMG=kubebb/kubebb-core:local
    提示

    如果使用的是kind开发集群,需要先将镜像推送到kind集群中:

    kind load docker-image kubebb/kubebb-core:local --name kubebb-core
    1. 安装CRDs
    make install
    1. 部署kubebb-core
    make deploy IMG=kubebb/kubebb-core:local

    快速体验

    内核安装完成后,可通过以下两种方式快速体验组件化的部署:

    使用官方组件仓库

    提示

    官方组件仓库提供多个认证仓库、组件和组件应用,可供用户体验。后续步骤将使用官方组件仓库举例。

    1. 通过以下命令克隆官方组件仓库:
    git clone https://github.com/kubebb/components
    # 后续步骤均在 components 目录下执行
    cd components
    1. 部署官方仓库
    kubectl apply -f repos/repository_kubebb.yaml -nkubebb-system

    查看仓库状态:

    kubectl get repository -nkubebb-system

    如果一切正常,输出如下:

    (base) ➜  ~ k get repos  -nkubebb-system
    NAME AGE
    kubebb 42h
    1. 获取仓库中的组件
    kubectl get components -nkubebb-system  -l kubebb.component.repository=kubebb

    如果一切正常,输出如下:

    NAME                       AGE
    kubebb.bc-apis 135m
    kubebb.bc-depository 135m
    kubebb.bc-explorer 135m
    kubebb.cluster-component 135m
    kubebb.fabric-operator 135m
    kubebb.ingress-nginx 135m
    kubebb.kubebb 135m
    kubebb.kubebb-core 135m
    kubebb.minio 135m
    kubebb.tekton-operator 135m
    kubebb.u4a-component 135m
    kubebb.weaviate 135m
    1. 测试组件部署(可选)

    以部署kubebb.minio为例

    kubectl apply -f examples/minio/componentplan.yaml

    组件部署配置信息如下:

    apiVersion: core.kubebb.k8s.com.cn/v1alpha1
    kind: ComponentPlan
    metadata:
    name: fabric-minio
    namespace: default
    spec:
    approved: true
    name: fabric-minio # similar to helm release name
    version: 5.0.7
    component:
    name: kubebb.minio
    namespace: kubebb-system

    查看组件部署状态:

    kubectl get componentplan fabric-minio -oyaml

    如果一切正常,输出如下:

    apiVersion: core.kubebb.k8s.com.cn/v1alpha1
    kind: ComponentPlan
    metadata:
    annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
    {"apiVersion":"core.kubebb.k8s.com.cn/v1alpha1","kind":"ComponentPlan","metadata":{"annotations":{},"name":"fabric-minio","namespace":"default"},"spec":{"approved":true,"component":{"name":"kubebb.minio","namespace":"kubebb-system"},"name":"fabric-minio","version":"5.0.7"}}
    creationTimestamp: "2023-07-04T07:52:17Z"
    finalizers:
    - core.kubebb.k8s.com.cn/finalizer
    generation: 3
    name: fabric-minio
    namespace: default
    resourceVersion: "14107"
    uid: 48696a2b-ae46-4522-95af-e951f255105e
    spec:
    approved: true
    component:
    name: kubebb.minio
    namespace: kubebb-system
    name: fabric-minio
    override: {}
    repository:
    name: kubebb
    namespace: kubebb-system
    version: 5.0.7
    status:
    conditions:
    - lastTransitionTime: "2023-07-04T07:52:17Z"
    reason: ""
    status: "True"
    type: Approved
    - lastTransitionTime: "2023-07-04T07:52:18Z"
    reason: ""
    status: "True"
    type: Installed
    - lastTransitionTime: "2023-07-04T07:52:18Z"
    reason: ""
    status: "True"
    type: Succeeded
    images:
    - hyperledgerk8s/minio-minio:RELEASE.2023-02-10T18-48-39Z
    resources:
    - NewCreated: true
    apiVersion: v1
    kind: ServiceAccount
    name: minio-sa
    - NewCreated: true
    apiVersion: v1
    kind: Secret
    name: fabric-minio
    - NewCreated: true
    apiVersion: v1
    kind: ConfigMap
    name: fabric-minio
    - NewCreated: true
    apiVersion: v1
    kind: Service
    name: fabric-minio-console
    - NewCreated: true
    apiVersion: v1
    kind: Service
    name: fabric-minio
    - NewCreated: true
    apiVersion: v1
    kind: Service
    name: fabric-minio-svc
    - NewCreated: true
    apiVersion: apps/v1
    kind: StatefulSet
    name: fabric-minio
    - NewCreated: true
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    name: fabric-minio-console

    查看组件Pod状态

    kubectl get pods -l core.kubebb.k8s.com.cn/componentplan=fabric-minio

    如果一切正常,输出如下:

    NAME             READY   STATUS    RESTARTS   AGE
    fabric-minio-0 1/1 Running 0 42h
    fabric-minio-1 1/1 Running 0 42h
    fabric-minio-2 1/1 Running 0 42h

    使用私有组件仓库

    待补充

    - +

    安装内核

    提示

    安装前需完成预先准备

    安装方式

    Helm安装(推荐)

    提示

    Kubebb官方提供了helm仓库,方便用户安装: https://kubebb.github.io/components/

    1. 添加helm仓库
    helm repo add kubebb https://kubebb.github.io/components/
    helm repo update
    1. 创建命名空间

    请根据实际情况修改命名空间名称

    kubectl create namespace kubebb-system
    1. 安装
    helm install -nkubebb-system kubebb-core kubebb/kubebb-core
    1. 查看安装状态
    kubectl get pods -nkubebb-system 

    如果一切正常,输入如下:

    NAME                           READY   STATUS    RESTARTS   AGE
    kubebb-core-6bd7c5f679-742mq 1/1 Running 0 21h

    源代码安装

    1. 克隆代码

    请根据实际情况修改代码仓库版本

    git clone https://github.com/kubebb/core
    1. 构建镜像
    cd core
    make docker-build IMG=kubebb/kubebb-core:local
    提示

    如果使用的是kind开发集群,需要先将镜像推送到kind集群中:

    kind load docker-image kubebb/kubebb-core:local --name kubebb-core
    1. 安装CRDs
    make install
    1. 部署kubebb-core
    make deploy IMG=kubebb/kubebb-core:local
    1. 查看安装状态
    kubectl get pods -nkubebb-system 

    如果一切正常,输入如下:

    NAME                           READY   STATUS    RESTARTS   AGE
    kubebb-core-6bd7c5f679-742mq 1/1 Running 0 21h

    快速体验

    内核安装完成后,可通过以下两种方式快速体验组件化的部署:

    使用官方组件仓库

    提示

    官方组件仓库提供多个认证仓库、组件和组件应用,可供用户体验。后续步骤将使用官方组件仓库举例。

    1. 通过以下命令克隆官方组件仓库:
    git clone https://github.com/kubebb/components
    # 后续步骤均在 components 目录下执行
    cd components
    1. 部署官方仓库
    kubectl apply -f repos/repository_kubebb.yaml -nkubebb-system

    查看仓库状态:

    kubectl get repository -nkubebb-system

    如果一切正常,输出如下:

    (base) ➜  ~ k get repos  -nkubebb-system
    NAME AGE
    kubebb 42h
    1. 获取仓库中的组件
    kubectl get components -nkubebb-system  -l kubebb.component.repository=kubebb

    如果一切正常,输出如下:

    NAME                       AGE
    kubebb.bc-apis 135m
    kubebb.bc-depository 135m
    kubebb.bc-explorer 135m
    kubebb.cluster-component 135m
    kubebb.fabric-operator 135m
    kubebb.ingress-nginx 135m
    kubebb.kubebb 135m
    kubebb.kubebb-core 135m
    kubebb.minio 135m
    kubebb.tekton-operator 135m
    kubebb.u4a-component 135m
    kubebb.weaviate 135m
    1. 测试组件部署(可选)

    以部署kubebb.minio为例

    kubectl apply -f examples/minio/componentplan.yaml

    组件部署配置信息如下:

    apiVersion: core.kubebb.k8s.com.cn/v1alpha1
    kind: ComponentPlan
    metadata:
    name: fabric-minio
    namespace: default
    spec:
    approved: true
    name: fabric-minio # similar to helm release name
    version: 5.0.7
    component:
    name: kubebb.minio
    namespace: kubebb-system

    查看组件部署状态:

    kubectl get componentplan fabric-minio -oyaml

    如果一切正常,输出如下:

    apiVersion: core.kubebb.k8s.com.cn/v1alpha1
    kind: ComponentPlan
    metadata:
    annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
    {"apiVersion":"core.kubebb.k8s.com.cn/v1alpha1","kind":"ComponentPlan","metadata":{"annotations":{},"name":"fabric-minio","namespace":"default"},"spec":{"approved":true,"component":{"name":"kubebb.minio","namespace":"kubebb-system"},"name":"fabric-minio","version":"5.0.7"}}
    creationTimestamp: "2023-07-04T07:52:17Z"
    finalizers:
    - core.kubebb.k8s.com.cn/finalizer
    generation: 3
    name: fabric-minio
    namespace: default
    resourceVersion: "14107"
    uid: 48696a2b-ae46-4522-95af-e951f255105e
    spec:
    approved: true
    component:
    name: kubebb.minio
    namespace: kubebb-system
    name: fabric-minio
    override: {}
    repository:
    name: kubebb
    namespace: kubebb-system
    version: 5.0.7
    status:
    conditions:
    - lastTransitionTime: "2023-07-04T07:52:17Z"
    reason: ""
    status: "True"
    type: Approved
    - lastTransitionTime: "2023-07-04T07:52:18Z"
    reason: ""
    status: "True"
    type: Installed
    - lastTransitionTime: "2023-07-04T07:52:18Z"
    reason: ""
    status: "True"
    type: Succeeded
    images:
    - hyperledgerk8s/minio-minio:RELEASE.2023-02-10T18-48-39Z
    resources:
    - NewCreated: true
    apiVersion: v1
    kind: ServiceAccount
    name: minio-sa
    - NewCreated: true
    apiVersion: v1
    kind: Secret
    name: fabric-minio
    - NewCreated: true
    apiVersion: v1
    kind: ConfigMap
    name: fabric-minio
    - NewCreated: true
    apiVersion: v1
    kind: Service
    name: fabric-minio-console
    - NewCreated: true
    apiVersion: v1
    kind: Service
    name: fabric-minio
    - NewCreated: true
    apiVersion: v1
    kind: Service
    name: fabric-minio-svc
    - NewCreated: true
    apiVersion: apps/v1
    kind: StatefulSet
    name: fabric-minio
    - NewCreated: true
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    name: fabric-minio-console

    查看组件Pod状态

    kubectl get pods -l core.kubebb.k8s.com.cn/componentplan=fabric-minio

    如果一切正常,输出如下:

    NAME             READY   STATUS    RESTARTS   AGE
    fabric-minio-0 1/1 Running 0 42h
    fabric-minio-1 1/1 Running 0 42h
    fabric-minio-2 1/1 Running 0 42h

    使用私有组件仓库

    待补充

    + \ No newline at end of file diff --git a/docs/quick-start/prerequisite/index.html b/docs/quick-start/prerequisite/index.html index 5a9504826..3e4a7f3eb 100644 --- a/docs/quick-start/prerequisite/index.html +++ b/docs/quick-start/prerequisite/index.html @@ -5,13 +5,13 @@ 预先准备 | Framework as a Building Block for Kubernetes - +

    预先准备

    基础环境

    Kubernetes集群

    提示

    如果没有kubernets集群,可按照下述教程通过kind部署一个开发集群。默认情况下,为适配building base,集群至少有一个节点需要为Ingress Controller服务节点,并暴露80443端口。

    Kind开发集群

    1. 安装kind

    参考: https://kind.sigs.k8s.io/docs/user/quick-start/#installation

    Linux环境为例:

    # For AMD64 / x86_64
    [ $(uname -m) = x86_64 ] && curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.20.0/kind-linux-amd64
    # For ARM64
    [ $(uname -m) = aarch64 ] && curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.20.0/kind-linux-arm64
    chmod +x ./kind
    sudo mv ./kind /usr/local/bin/kind
    1. 准备单节点集群配置文件kind-config.yaml
    提示
    kind: Cluster
    apiVersion: kind.x-k8s.io/v1alpha4
    name: kubebb-core
    nodes:
    - role: control-plane
    image: kindest/node:v1.24.13
    kubeadmConfigPatches:
    - |
    kind: InitConfiguration
    nodeRegistration:
    kubeletExtraArgs:
    node-labels: "ingress-ready=true"
    extraPortMappings:
    - containerPort: 80
    hostPort: 80
    protocol: TCP
    - containerPort: 443
    hostPort: 443
    protocol: TCP
    1. 创建集群
    kind create cluster --config=kind-config.yaml
    1. 查看集群状态
    kubectl cluster-info --context kind-kubebb-core

    如果一切正常,输出如下:

    Kubernetes control plane is running at https://127.0.0.1:42607
    CoreDNS is running at https://127.0.0.1:42607/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

    To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
    1. 查看集群节点
    kubectl get nodes

    如果一切正常,输出如下:

    NAME                              STATUS   ROLES           AGE   VERSION
    kubebb-core-control-plane Ready control-plane 21m v1.24.13

    通过docker ps可发现该节点已经暴露了80443端口:

    (base) ➜  building-base git:(azure) docker ps
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    e4e3820cdb5a kindest/node:v1.24.13 "/usr/local/bin/entr…" 22 minutes ago Up 22 minutes 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 127.0.0.1:33611->6443/tcp kubebb-core-control-plane
    - + \ No newline at end of file diff --git a/en/404.html b/en/404.html index b47a1991a..ce14c9007 100644 --- a/en/404.html +++ b/en/404.html @@ -5,13 +5,13 @@ Page Not Found | Framework as a Building Block for Kubernetes - +

    Page Not Found

    We could not find what you were looking for.

    Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

    - + \ No newline at end of file diff --git a/en/assets/js/791926a5.c805817d.js b/en/assets/js/791926a5.c805817d.js deleted file mode 100644 index ef89ca76b..000000000 --- a/en/assets/js/791926a5.c805817d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[6741],{3905:(e,n,t)=>{t.d(n,{Zo:()=>b,kt:()=>k});var a=t(7294);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function l(e){for(var n=1;n=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var p=a.createContext({}),s=function(e){var n=a.useContext(p),t=n;return e&&(t="function"==typeof e?e(n):l(l({},n),e)),t},b=function(e){var n=s(e.components);return a.createElement(p.Provider,{value:n},e.children)},c="mdxType",u={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},m=a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,o=e.originalType,p=e.parentName,b=i(e,["components","mdxType","originalType","parentName"]),c=s(t),m=r,k=c["".concat(p,".").concat(m)]||c[m]||u[m]||o;return t?a.createElement(k,l(l({ref:n},b),{},{components:t})):a.createElement(k,l({ref:n},b))}));function k(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var o=t.length,l=new Array(o);l[0]=m;var i={};for(var p in n)hasOwnProperty.call(n,p)&&(i[p]=n[p]);i.originalType=e,i[c]="string"==typeof e?e:r,l[1]=i;for(var s=2;s{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>l,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>s});var a=t(7462),r=(t(7294),t(3905));const o={sidebar_position:2},l="\u5b89\u88c5\u5185\u6838",i={unversionedId:"quick-start/core_quickstart",id:"quick-start/core_quickstart",title:"\u5b89\u88c5\u5185\u6838",description:"\u5b89\u88c5\u524d\u9700\u5b8c\u6210\u9884\u5148\u51c6\u5907\u3002",source:"@site/docs/quick-start/core_quickstart.md",sourceDirName:"quick-start",slug:"/quick-start/core_quickstart",permalink:"/website/en/docs/quick-start/core_quickstart",draft:!1,tags:[],version:"current",sidebarPosition:2,frontMatter:{sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"\u9884\u5148\u51c6\u5907",permalink:"/website/en/docs/quick-start/prerequisite"},next:{title:"\u5b89\u88c5\u5e95\u5ea7",permalink:"/website/en/docs/quick-start/buildingbase_quickstart"}},p={},s=[{value:"\u5b89\u88c5\u65b9\u5f0f",id:"\u5b89\u88c5\u65b9\u5f0f",level:2},{value:"Helm\u5b89\u88c5(\u63a8\u8350)",id:"helm\u5b89\u88c5\u63a8\u8350",level:3},{value:"\u6e90\u4ee3\u7801\u5b89\u88c5",id:"\u6e90\u4ee3\u7801\u5b89\u88c5",level:3},{value:"\u5feb\u901f\u4f53\u9a8c",id:"\u5feb\u901f\u4f53\u9a8c",level:2},{value:"\u4f7f\u7528\u5b98\u65b9\u7ec4\u4ef6\u4ed3\u5e93",id:"\u4f7f\u7528\u5b98\u65b9\u7ec4\u4ef6\u4ed3\u5e93",level:3},{value:"\u4f7f\u7528\u79c1\u6709\u7ec4\u4ef6\u4ed3\u5e93",id:"\u4f7f\u7528\u79c1\u6709\u7ec4\u4ef6\u4ed3\u5e93",level:3}],b={toc:s},c="wrapper";function u(e){let{components:n,...t}=e;return(0,r.kt)(c,(0,a.Z)({},b,t,{components:n,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"\u5b89\u88c5\u5185\u6838"},"\u5b89\u88c5\u5185\u6838"),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"\u5b89\u88c5\u524d\u9700\u5b8c\u6210",(0,r.kt)("a",{parentName:"p",href:"./prerequisite"},"\u9884\u5148\u51c6\u5907"),"\u3002")),(0,r.kt)("h2",{id:"\u5b89\u88c5\u65b9\u5f0f"},"\u5b89\u88c5\u65b9\u5f0f"),(0,r.kt)("h3",{id:"helm\u5b89\u88c5\u63a8\u8350"},"Helm\u5b89\u88c5(\u63a8\u8350)"),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"Kubebb\u5b98\u65b9\u63d0\u4f9b\u4e86helm\u4ed3\u5e93\uff0c\u65b9\u4fbf\u7528\u6237\u5b89\u88c5: ",(0,r.kt)("a",{parentName:"p",href:"https://kubebb.github.io/components/"},"https://kubebb.github.io/components/"))),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"\u6dfb\u52a0helm\u4ed3\u5e93")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"helm repo add kubebb https://kubebb.github.io/components/\nhelm repo update\n")),(0,r.kt)("ol",{start:2},(0,r.kt)("li",{parentName:"ol"},"\u521b\u5efa\u547d\u540d\u7a7a\u95f4")),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"\u8bf7\u6839\u636e\u5b9e\u9645\u60c5\u51b5\u4fee\u6539\u547d\u540d\u7a7a\u95f4\u540d\u79f0")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"kubectl create namespace kubebb-system\n")),(0,r.kt)("ol",{start:3},(0,r.kt)("li",{parentName:"ol"},"\u5b89\u88c5")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"helm install --wait -nkubebb-system kubebb-core kubebb/kubebb-core\n")),(0,r.kt)("h3",{id:"\u6e90\u4ee3\u7801\u5b89\u88c5"},"\u6e90\u4ee3\u7801\u5b89\u88c5"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"\u514b\u9686\u4ee3\u7801")),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"\u8bf7\u6839\u636e\u5b9e\u9645\u60c5\u51b5\u4fee\u6539\u4ee3\u7801\u4ed3\u5e93\u7248\u672c")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"git clone https://github.com/kubebb/core\n")),(0,r.kt)("ol",{start:2},(0,r.kt)("li",{parentName:"ol"},"\u6784\u5efa\u955c\u50cf")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"cd core\nmake docker-build IMG=kubebb/kubebb-core:local\n")),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"\u5982\u679c\u4f7f\u7528\u7684\u662fkind\u5f00\u53d1\u96c6\u7fa4\uff0c\u9700\u8981\u5148\u5c06\u955c\u50cf\u63a8\u9001\u5230kind\u96c6\u7fa4\u4e2d:"),(0,r.kt)("pre",{parentName:"admonition"},(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"kind load docker-image kubebb/kubebb-core:local --name kubebb-core\n"))),(0,r.kt)("ol",{start:3},(0,r.kt)("li",{parentName:"ol"},"\u5b89\u88c5CRDs")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"make install\n")),(0,r.kt)("ol",{start:4},(0,r.kt)("li",{parentName:"ol"},"\u90e8\u7f72kubebb-core")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"make deploy IMG=kubebb/kubebb-core:local\n")),(0,r.kt)("h2",{id:"\u5feb\u901f\u4f53\u9a8c"},"\u5feb\u901f\u4f53\u9a8c"),(0,r.kt)("p",null,"\u5185\u6838\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u53ef\u901a\u8fc7\u4ee5\u4e0b\u4e24\u79cd\u65b9\u5f0f\u5feb\u901f\u4f53\u9a8c\u7ec4\u4ef6\u5316\u7684\u90e8\u7f72:"),(0,r.kt)("h3",{id:"\u4f7f\u7528\u5b98\u65b9\u7ec4\u4ef6\u4ed3\u5e93"},"\u4f7f\u7528\u5b98\u65b9\u7ec4\u4ef6\u4ed3\u5e93"),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},(0,r.kt)("a",{parentName:"p",href:"https://github.com/kubebb/components"},"\u5b98\u65b9\u7ec4\u4ef6\u4ed3\u5e93"),"\u63d0\u4f9b\u591a\u4e2a\u8ba4\u8bc1\u4ed3\u5e93\u3001\u7ec4\u4ef6\u548c\u7ec4\u4ef6\u5e94\u7528\uff0c\u53ef\u4f9b\u7528\u6237\u4f53\u9a8c\u3002\u540e\u7eed\u6b65\u9aa4\u5c06\u4f7f\u7528\u5b98\u65b9\u7ec4\u4ef6\u4ed3\u5e93\u4e3e\u4f8b\u3002")),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"\u901a\u8fc7\u4ee5\u4e0b\u547d\u4ee4\u514b\u9686\u5b98\u65b9\u7ec4\u4ef6\u4ed3\u5e93:")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"git clone https://github.com/kubebb/components\n# \u540e\u7eed\u6b65\u9aa4\u5747\u5728 components \u76ee\u5f55\u4e0b\u6267\u884c\ncd components\n")),(0,r.kt)("ol",{start:2},(0,r.kt)("li",{parentName:"ol"},"\u90e8\u7f72\u5b98\u65b9\u4ed3\u5e93")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"kubectl apply -f repos/repository_kubebb.yaml -nkubebb-system\n")),(0,r.kt)("p",null,"\u67e5\u770b\u4ed3\u5e93\u72b6\u6001:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"kubectl get repository -nkubebb-system\n")),(0,r.kt)("p",null,"\u5982\u679c\u4e00\u5207\u6b63\u5e38\uff0c\u8f93\u51fa\u5982\u4e0b:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"(base) \u279c ~ k get repos -nkubebb-system\nNAME AGE\nkubebb 42h\n")),(0,r.kt)("ol",{start:3},(0,r.kt)("li",{parentName:"ol"},"\u83b7\u53d6\u4ed3\u5e93\u4e2d\u7684\u7ec4\u4ef6")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"kubectl get components -nkubebb-system -l kubebb.component.repository=kubebb\n")),(0,r.kt)("p",null,"\u5982\u679c\u4e00\u5207\u6b63\u5e38\uff0c\u8f93\u51fa\u5982\u4e0b:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"NAME AGE\nkubebb.bc-apis 135m\nkubebb.bc-depository 135m\nkubebb.bc-explorer 135m\nkubebb.cluster-component 135m\nkubebb.fabric-operator 135m\nkubebb.ingress-nginx 135m\nkubebb.kubebb 135m\nkubebb.kubebb-core 135m\nkubebb.minio 135m\nkubebb.tekton-operator 135m\nkubebb.u4a-component 135m\nkubebb.weaviate 135m\n")),(0,r.kt)("ol",{start:4},(0,r.kt)("li",{parentName:"ol"},"\u6d4b\u8bd5\u7ec4\u4ef6\u90e8\u7f72(\u53ef\u9009)")),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"\u4ee5\u90e8\u7f72",(0,r.kt)("inlineCode",{parentName:"p"},"kubebb.minio"),"\u4e3a\u4f8b")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"kubectl apply -f examples/minio/componentplan.yaml\n")),(0,r.kt)("p",null,"\u7ec4\u4ef6\u90e8\u7f72\u914d\u7f6e\u4fe1\u606f\u5982\u4e0b: "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: core.kubebb.k8s.com.cn/v1alpha1\nkind: ComponentPlan\nmetadata:\n name: fabric-minio\n namespace: default\nspec:\n approved: true\n name: fabric-minio # similar to helm release name\n version: 5.0.7\n component:\n name: kubebb.minio\n namespace: kubebb-system\n")),(0,r.kt)("p",null,"\u67e5\u770b\u7ec4\u4ef6\u90e8\u7f72\u72b6\u6001:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"kubectl get componentplan fabric-minio -oyaml\n")),(0,r.kt)("p",null,"\u5982\u679c\u4e00\u5207\u6b63\u5e38\uff0c\u8f93\u51fa\u5982\u4e0b:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},'apiVersion: core.kubebb.k8s.com.cn/v1alpha1\nkind: ComponentPlan\nmetadata:\n annotations:\n kubectl.kubernetes.io/last-applied-configuration: |\n {"apiVersion":"core.kubebb.k8s.com.cn/v1alpha1","kind":"ComponentPlan","metadata":{"annotations":{},"name":"fabric-minio","namespace":"default"},"spec":{"approved":true,"component":{"name":"kubebb.minio","namespace":"kubebb-system"},"name":"fabric-minio","version":"5.0.7"}}\n creationTimestamp: "2023-07-04T07:52:17Z"\n finalizers:\n - core.kubebb.k8s.com.cn/finalizer\n generation: 3\n name: fabric-minio\n namespace: default\n resourceVersion: "14107"\n uid: 48696a2b-ae46-4522-95af-e951f255105e\nspec:\n approved: true\n component:\n name: kubebb.minio\n namespace: kubebb-system\n name: fabric-minio\n override: {}\n repository:\n name: kubebb\n namespace: kubebb-system\n version: 5.0.7\nstatus:\n conditions:\n - lastTransitionTime: "2023-07-04T07:52:17Z"\n reason: ""\n status: "True"\n type: Approved\n - lastTransitionTime: "2023-07-04T07:52:18Z"\n reason: ""\n status: "True"\n type: Installed\n - lastTransitionTime: "2023-07-04T07:52:18Z"\n reason: ""\n status: "True"\n type: Succeeded\n images:\n - hyperledgerk8s/minio-minio:RELEASE.2023-02-10T18-48-39Z\n resources:\n - NewCreated: true\n apiVersion: v1\n kind: ServiceAccount\n name: minio-sa\n - NewCreated: true\n apiVersion: v1\n kind: Secret\n name: fabric-minio\n - NewCreated: true\n apiVersion: v1\n kind: ConfigMap\n name: fabric-minio\n - NewCreated: true\n apiVersion: v1\n kind: Service\n name: fabric-minio-console\n - NewCreated: true\n apiVersion: v1\n kind: Service\n name: fabric-minio\n - NewCreated: true\n apiVersion: v1\n kind: Service\n name: fabric-minio-svc\n - NewCreated: true\n apiVersion: apps/v1\n kind: StatefulSet\n name: fabric-minio\n - NewCreated: true\n apiVersion: networking.k8s.io/v1\n kind: Ingress\n name: fabric-minio-console\n')),(0,r.kt)("p",null,"\u67e5\u770b\u7ec4\u4ef6Pod\u72b6\u6001"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"kubectl get pods -l core.kubebb.k8s.com.cn/componentplan=fabric-minio\n")),(0,r.kt)("p",null,"\u5982\u679c\u4e00\u5207\u6b63\u5e38\uff0c\u8f93\u51fa\u5982\u4e0b:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"NAME READY STATUS RESTARTS AGE\nfabric-minio-0 1/1 Running 0 42h\nfabric-minio-1 1/1 Running 0 42h\nfabric-minio-2 1/1 Running 0 42h\n")),(0,r.kt)("h3",{id:"\u4f7f\u7528\u79c1\u6709\u7ec4\u4ef6\u4ed3\u5e93"},"\u4f7f\u7528\u79c1\u6709\u7ec4\u4ef6\u4ed3\u5e93"),(0,r.kt)("p",null,"\u5f85\u8865\u5145"))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/en/assets/js/791926a5.fffb601c.js b/en/assets/js/791926a5.fffb601c.js new file mode 100644 index 000000000..68837fe0d --- /dev/null +++ b/en/assets/js/791926a5.fffb601c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[6741],{3905:(e,n,t)=>{t.d(n,{Zo:()=>b,kt:()=>k});var a=t(7294);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function l(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function o(e){for(var n=1;n=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var p=a.createContext({}),s=function(e){var n=a.useContext(p),t=n;return e&&(t="function"==typeof e?e(n):o(o({},n),e)),t},b=function(e){var n=s(e.components);return a.createElement(p.Provider,{value:n},e.children)},c="mdxType",u={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},m=a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,l=e.originalType,p=e.parentName,b=i(e,["components","mdxType","originalType","parentName"]),c=s(t),m=r,k=c["".concat(p,".").concat(m)]||c[m]||u[m]||l;return t?a.createElement(k,o(o({ref:n},b),{},{components:t})):a.createElement(k,o({ref:n},b))}));function k(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var l=t.length,o=new Array(l);o[0]=m;var i={};for(var p in n)hasOwnProperty.call(n,p)&&(i[p]=n[p]);i.originalType=e,i[c]="string"==typeof e?e:r,o[1]=i;for(var s=2;s{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>o,default:()=>u,frontMatter:()=>l,metadata:()=>i,toc:()=>s});var a=t(7462),r=(t(7294),t(3905));const l={sidebar_position:2},o="\u5b89\u88c5\u5185\u6838",i={unversionedId:"quick-start/core_quickstart",id:"quick-start/core_quickstart",title:"\u5b89\u88c5\u5185\u6838",description:"\u5b89\u88c5\u524d\u9700\u5b8c\u6210\u9884\u5148\u51c6\u5907\u3002",source:"@site/docs/quick-start/core_quickstart.md",sourceDirName:"quick-start",slug:"/quick-start/core_quickstart",permalink:"/website/en/docs/quick-start/core_quickstart",draft:!1,tags:[],version:"current",sidebarPosition:2,frontMatter:{sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"\u9884\u5148\u51c6\u5907",permalink:"/website/en/docs/quick-start/prerequisite"},next:{title:"\u5b89\u88c5\u5e95\u5ea7",permalink:"/website/en/docs/quick-start/buildingbase_quickstart"}},p={},s=[{value:"\u5b89\u88c5\u65b9\u5f0f",id:"\u5b89\u88c5\u65b9\u5f0f",level:2},{value:"Helm\u5b89\u88c5(\u63a8\u8350)",id:"helm\u5b89\u88c5\u63a8\u8350",level:3},{value:"\u6e90\u4ee3\u7801\u5b89\u88c5",id:"\u6e90\u4ee3\u7801\u5b89\u88c5",level:3},{value:"\u5feb\u901f\u4f53\u9a8c",id:"\u5feb\u901f\u4f53\u9a8c",level:2},{value:"\u4f7f\u7528\u5b98\u65b9\u7ec4\u4ef6\u4ed3\u5e93",id:"\u4f7f\u7528\u5b98\u65b9\u7ec4\u4ef6\u4ed3\u5e93",level:3},{value:"\u4f7f\u7528\u79c1\u6709\u7ec4\u4ef6\u4ed3\u5e93",id:"\u4f7f\u7528\u79c1\u6709\u7ec4\u4ef6\u4ed3\u5e93",level:3}],b={toc:s},c="wrapper";function u(e){let{components:n,...t}=e;return(0,r.kt)(c,(0,a.Z)({},b,t,{components:n,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"\u5b89\u88c5\u5185\u6838"},"\u5b89\u88c5\u5185\u6838"),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"\u5b89\u88c5\u524d\u9700\u5b8c\u6210",(0,r.kt)("a",{parentName:"p",href:"./prerequisite"},"\u9884\u5148\u51c6\u5907"),"\u3002")),(0,r.kt)("h2",{id:"\u5b89\u88c5\u65b9\u5f0f"},"\u5b89\u88c5\u65b9\u5f0f"),(0,r.kt)("h3",{id:"helm\u5b89\u88c5\u63a8\u8350"},"Helm\u5b89\u88c5(\u63a8\u8350)"),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"Kubebb\u5b98\u65b9\u63d0\u4f9b\u4e86helm\u4ed3\u5e93\uff0c\u65b9\u4fbf\u7528\u6237\u5b89\u88c5: ",(0,r.kt)("a",{parentName:"p",href:"https://kubebb.github.io/components/"},"https://kubebb.github.io/components/"))),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"\u6dfb\u52a0helm\u4ed3\u5e93")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"helm repo add kubebb https://kubebb.github.io/components/\nhelm repo update\n")),(0,r.kt)("ol",{start:2},(0,r.kt)("li",{parentName:"ol"},"\u521b\u5efa\u547d\u540d\u7a7a\u95f4")),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"\u8bf7\u6839\u636e\u5b9e\u9645\u60c5\u51b5\u4fee\u6539\u547d\u540d\u7a7a\u95f4\u540d\u79f0")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"kubectl create namespace kubebb-system\n")),(0,r.kt)("ol",{start:3},(0,r.kt)("li",{parentName:"ol"},"\u5b89\u88c5")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"helm install -nkubebb-system kubebb-core kubebb/kubebb-core\n")),(0,r.kt)("ol",{start:4},(0,r.kt)("li",{parentName:"ol"},"\u67e5\u770b\u5b89\u88c5\u72b6\u6001")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"kubectl get pods -nkubebb-system \n")),(0,r.kt)("p",null,"\u5982\u679c\u4e00\u5207\u6b63\u5e38\uff0c\u8f93\u5165\u5982\u4e0b:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"NAME READY STATUS RESTARTS AGE\nkubebb-core-6bd7c5f679-742mq 1/1 Running 0 21h\n")),(0,r.kt)("h3",{id:"\u6e90\u4ee3\u7801\u5b89\u88c5"},"\u6e90\u4ee3\u7801\u5b89\u88c5"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"\u514b\u9686\u4ee3\u7801")),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"\u8bf7\u6839\u636e\u5b9e\u9645\u60c5\u51b5\u4fee\u6539\u4ee3\u7801\u4ed3\u5e93\u7248\u672c")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"git clone https://github.com/kubebb/core\n")),(0,r.kt)("ol",{start:2},(0,r.kt)("li",{parentName:"ol"},"\u6784\u5efa\u955c\u50cf")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"cd core\nmake docker-build IMG=kubebb/kubebb-core:local\n")),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"\u5982\u679c\u4f7f\u7528\u7684\u662fkind\u5f00\u53d1\u96c6\u7fa4\uff0c\u9700\u8981\u5148\u5c06\u955c\u50cf\u63a8\u9001\u5230kind\u96c6\u7fa4\u4e2d:"),(0,r.kt)("pre",{parentName:"admonition"},(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"kind load docker-image kubebb/kubebb-core:local --name kubebb-core\n"))),(0,r.kt)("ol",{start:3},(0,r.kt)("li",{parentName:"ol"},"\u5b89\u88c5CRDs")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"make install\n")),(0,r.kt)("ol",{start:4},(0,r.kt)("li",{parentName:"ol"},"\u90e8\u7f72kubebb-core")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"make deploy IMG=kubebb/kubebb-core:local\n")),(0,r.kt)("ol",{start:5},(0,r.kt)("li",{parentName:"ol"},"\u67e5\u770b\u5b89\u88c5\u72b6\u6001")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"kubectl get pods -nkubebb-system \n")),(0,r.kt)("p",null,"\u5982\u679c\u4e00\u5207\u6b63\u5e38\uff0c\u8f93\u5165\u5982\u4e0b:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"NAME READY STATUS RESTARTS AGE\nkubebb-core-6bd7c5f679-742mq 1/1 Running 0 21h\n")),(0,r.kt)("h2",{id:"\u5feb\u901f\u4f53\u9a8c"},"\u5feb\u901f\u4f53\u9a8c"),(0,r.kt)("p",null,"\u5185\u6838\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u53ef\u901a\u8fc7\u4ee5\u4e0b\u4e24\u79cd\u65b9\u5f0f\u5feb\u901f\u4f53\u9a8c\u7ec4\u4ef6\u5316\u7684\u90e8\u7f72:"),(0,r.kt)("h3",{id:"\u4f7f\u7528\u5b98\u65b9\u7ec4\u4ef6\u4ed3\u5e93"},"\u4f7f\u7528\u5b98\u65b9\u7ec4\u4ef6\u4ed3\u5e93"),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},(0,r.kt)("a",{parentName:"p",href:"https://github.com/kubebb/components"},"\u5b98\u65b9\u7ec4\u4ef6\u4ed3\u5e93"),"\u63d0\u4f9b\u591a\u4e2a\u8ba4\u8bc1\u4ed3\u5e93\u3001\u7ec4\u4ef6\u548c\u7ec4\u4ef6\u5e94\u7528\uff0c\u53ef\u4f9b\u7528\u6237\u4f53\u9a8c\u3002\u540e\u7eed\u6b65\u9aa4\u5c06\u4f7f\u7528\u5b98\u65b9\u7ec4\u4ef6\u4ed3\u5e93\u4e3e\u4f8b\u3002")),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"\u901a\u8fc7\u4ee5\u4e0b\u547d\u4ee4\u514b\u9686\u5b98\u65b9\u7ec4\u4ef6\u4ed3\u5e93:")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"git clone https://github.com/kubebb/components\n# \u540e\u7eed\u6b65\u9aa4\u5747\u5728 components \u76ee\u5f55\u4e0b\u6267\u884c\ncd components\n")),(0,r.kt)("ol",{start:2},(0,r.kt)("li",{parentName:"ol"},"\u90e8\u7f72\u5b98\u65b9\u4ed3\u5e93")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"kubectl apply -f repos/repository_kubebb.yaml -nkubebb-system\n")),(0,r.kt)("p",null,"\u67e5\u770b\u4ed3\u5e93\u72b6\u6001:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"kubectl get repository -nkubebb-system\n")),(0,r.kt)("p",null,"\u5982\u679c\u4e00\u5207\u6b63\u5e38\uff0c\u8f93\u51fa\u5982\u4e0b:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"(base) \u279c ~ k get repos -nkubebb-system\nNAME AGE\nkubebb 42h\n")),(0,r.kt)("ol",{start:3},(0,r.kt)("li",{parentName:"ol"},"\u83b7\u53d6\u4ed3\u5e93\u4e2d\u7684\u7ec4\u4ef6")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"kubectl get components -nkubebb-system -l kubebb.component.repository=kubebb\n")),(0,r.kt)("p",null,"\u5982\u679c\u4e00\u5207\u6b63\u5e38\uff0c\u8f93\u51fa\u5982\u4e0b:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"NAME AGE\nkubebb.bc-apis 135m\nkubebb.bc-depository 135m\nkubebb.bc-explorer 135m\nkubebb.cluster-component 135m\nkubebb.fabric-operator 135m\nkubebb.ingress-nginx 135m\nkubebb.kubebb 135m\nkubebb.kubebb-core 135m\nkubebb.minio 135m\nkubebb.tekton-operator 135m\nkubebb.u4a-component 135m\nkubebb.weaviate 135m\n")),(0,r.kt)("ol",{start:4},(0,r.kt)("li",{parentName:"ol"},"\u6d4b\u8bd5\u7ec4\u4ef6\u90e8\u7f72(\u53ef\u9009)")),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"\u4ee5\u90e8\u7f72",(0,r.kt)("inlineCode",{parentName:"p"},"kubebb.minio"),"\u4e3a\u4f8b")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"kubectl apply -f examples/minio/componentplan.yaml\n")),(0,r.kt)("p",null,"\u7ec4\u4ef6\u90e8\u7f72\u914d\u7f6e\u4fe1\u606f\u5982\u4e0b: "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: core.kubebb.k8s.com.cn/v1alpha1\nkind: ComponentPlan\nmetadata:\n name: fabric-minio\n namespace: default\nspec:\n approved: true\n name: fabric-minio # similar to helm release name\n version: 5.0.7\n component:\n name: kubebb.minio\n namespace: kubebb-system\n")),(0,r.kt)("p",null,"\u67e5\u770b\u7ec4\u4ef6\u90e8\u7f72\u72b6\u6001:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"kubectl get componentplan fabric-minio -oyaml\n")),(0,r.kt)("p",null,"\u5982\u679c\u4e00\u5207\u6b63\u5e38\uff0c\u8f93\u51fa\u5982\u4e0b:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},'apiVersion: core.kubebb.k8s.com.cn/v1alpha1\nkind: ComponentPlan\nmetadata:\n annotations:\n kubectl.kubernetes.io/last-applied-configuration: |\n {"apiVersion":"core.kubebb.k8s.com.cn/v1alpha1","kind":"ComponentPlan","metadata":{"annotations":{},"name":"fabric-minio","namespace":"default"},"spec":{"approved":true,"component":{"name":"kubebb.minio","namespace":"kubebb-system"},"name":"fabric-minio","version":"5.0.7"}}\n creationTimestamp: "2023-07-04T07:52:17Z"\n finalizers:\n - core.kubebb.k8s.com.cn/finalizer\n generation: 3\n name: fabric-minio\n namespace: default\n resourceVersion: "14107"\n uid: 48696a2b-ae46-4522-95af-e951f255105e\nspec:\n approved: true\n component:\n name: kubebb.minio\n namespace: kubebb-system\n name: fabric-minio\n override: {}\n repository:\n name: kubebb\n namespace: kubebb-system\n version: 5.0.7\nstatus:\n conditions:\n - lastTransitionTime: "2023-07-04T07:52:17Z"\n reason: ""\n status: "True"\n type: Approved\n - lastTransitionTime: "2023-07-04T07:52:18Z"\n reason: ""\n status: "True"\n type: Installed\n - lastTransitionTime: "2023-07-04T07:52:18Z"\n reason: ""\n status: "True"\n type: Succeeded\n images:\n - hyperledgerk8s/minio-minio:RELEASE.2023-02-10T18-48-39Z\n resources:\n - NewCreated: true\n apiVersion: v1\n kind: ServiceAccount\n name: minio-sa\n - NewCreated: true\n apiVersion: v1\n kind: Secret\n name: fabric-minio\n - NewCreated: true\n apiVersion: v1\n kind: ConfigMap\n name: fabric-minio\n - NewCreated: true\n apiVersion: v1\n kind: Service\n name: fabric-minio-console\n - NewCreated: true\n apiVersion: v1\n kind: Service\n name: fabric-minio\n - NewCreated: true\n apiVersion: v1\n kind: Service\n name: fabric-minio-svc\n - NewCreated: true\n apiVersion: apps/v1\n kind: StatefulSet\n name: fabric-minio\n - NewCreated: true\n apiVersion: networking.k8s.io/v1\n kind: Ingress\n name: fabric-minio-console\n')),(0,r.kt)("p",null,"\u67e5\u770b\u7ec4\u4ef6Pod\u72b6\u6001"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"kubectl get pods -l core.kubebb.k8s.com.cn/componentplan=fabric-minio\n")),(0,r.kt)("p",null,"\u5982\u679c\u4e00\u5207\u6b63\u5e38\uff0c\u8f93\u51fa\u5982\u4e0b:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"NAME READY STATUS RESTARTS AGE\nfabric-minio-0 1/1 Running 0 42h\nfabric-minio-1 1/1 Running 0 42h\nfabric-minio-2 1/1 Running 0 42h\n")),(0,r.kt)("h3",{id:"\u4f7f\u7528\u79c1\u6709\u7ec4\u4ef6\u4ed3\u5e93"},"\u4f7f\u7528\u79c1\u6709\u7ec4\u4ef6\u4ed3\u5e93"),(0,r.kt)("p",null,"\u5f85\u8865\u5145"))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/en/assets/js/935f2afb.6b738667.js b/en/assets/js/935f2afb.eb9c6d9f.js similarity index 99% rename from en/assets/js/935f2afb.6b738667.js rename to en/assets/js/935f2afb.eb9c6d9f.js index 5e5cabf04..9366b1774 100644 --- a/en/assets/js/935f2afb.6b738667.js +++ b/en/assets/js/935f2afb.eb9c6d9f.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[53],{1109:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"link","label":"\u603b\u89c8","href":"/website/en/docs/intro","docId":"intro"},{"type":"category","label":"\u5feb\u901f\u5f00\u59cb","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u9884\u5148\u51c6\u5907","href":"/website/en/docs/quick-start/prerequisite","docId":"quick-start/prerequisite"},{"type":"link","label":"\u5b89\u88c5\u5185\u6838","href":"/website/en/docs/quick-start/core_quickstart","docId":"quick-start/core_quickstart"},{"type":"link","label":"\u5b89\u88c5\u5e95\u5ea7","href":"/website/en/docs/quick-start/buildingbase_quickstart","docId":"quick-start/buildingbase_quickstart"}],"href":"/website/en/docs/category/\u5feb\u901f\u5f00\u59cb"},{"type":"category","label":"\u5185\u6838Kit","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u4ecb\u7ecd","href":"/website/en/docs/core/intro","docId":"core/intro"},{"type":"category","label":"\u6982\u5ff5","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u7ec4\u4ef6\u4ed3\u5e93CRD","href":"/website/en/docs/core/concepts/repository","docId":"core/concepts/repository"},{"type":"link","label":"\u7ec4\u4ef6CRD","href":"/website/en/docs/core/concepts/component","docId":"core/concepts/component"},{"type":"link","label":"\u7ec4\u4ef6\u90e8\u7f72CRD","href":"/website/en/docs/core/concepts/componentplan","docId":"core/concepts/componentplan"},{"type":"link","label":"\u7ec4\u4ef6\u8ba2\u9605CRD","href":"/website/en/docs/core/concepts/subscription","docId":"core/concepts/subscription"}],"href":"/website/en/docs/category/\u6982\u5ff5"},{"type":"category","label":"\u7528\u6237\u6307\u5357","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u79c1\u6709\u96c6\u7fa4\u90e8\u7f72\u65b9\u6848","href":"/website/en/docs/core/userguide/privatecluster","docId":"core/userguide/privatecluster"}],"href":"/website/en/docs/category/\u7528\u6237\u6307\u5357"},{"type":"link","label":"\u7ec4\u4ef6\u8bc4\u7ea7","href":"/website/en/docs/core/rating","docId":"core/rating"},{"type":"link","label":"\u8def\u7ebf\u56fe","href":"/website/en/docs/core/roadmap","docId":"core/roadmap"}],"href":"/website/en/docs/category/\u5185\u6838kit"},{"type":"category","label":"\u5e95\u5ea7Kit","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u4ecb\u7ecd","href":"/website/en/docs/building-base/intro","docId":"building-base/intro"},{"type":"category","label":"\u81ea\u5b9a\u4e49\u914d\u7f6e","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u81ea\u5b9a\u4e49\u95e8\u6237","href":"/website/en/docs/building-base/configuration/customize-portal","docId":"building-base/configuration/customize-portal"},{"type":"link","label":"\u81ea\u5b9a\u4e49\u83dc\u5355","href":"/website/en/docs/building-base/configuration/customize-menu","docId":"building-base/configuration/customize-menu"},{"type":"link","label":"\u4f7f\u7528\u7b2c\u4e09\u65b9\u7cfb\u7edf\u767b\u5f55","href":"/website/en/docs/building-base/configuration/3rd-party-account","docId":"building-base/configuration/3rd-party-account"},{"type":"link","label":"\u914d\u7f6e\u5ba1\u8ba1\u80fd\u529b","href":"/website/en/docs/building-base/configuration/audit-config","docId":"building-base/configuration/audit-config"},{"type":"link","label":"\u96c6\u6210\u5355\u70b9\u767b\u5f55","href":"/website/en/docs/building-base/configuration/oidc-integration","docId":"building-base/configuration/oidc-integration"}],"href":"/website/en/docs/category/\u81ea\u5b9a\u4e49\u914d\u7f6e"}],"href":"/website/en/docs/category/\u5e95\u5ea7kit"},{"type":"category","label":"\u4f4e\u7801Kit","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u4ecb\u7ecd","href":"/website/en/docs/lowcode-development/intro","docId":"lowcode-development/intro"},{"type":"link","label":"\u5f00\u53d1\u6a21\u5f0f","href":"/website/en/docs/lowcode-development/development_pattern","docId":"lowcode-development/development_pattern"},{"type":"category","label":"\u7ec4\u4ef6\u5f00\u53d1","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u524d\u7aef\u5f00\u53d1","href":"/website/en/docs/lowcode-development/development/frontend","docId":"lowcode-development/development/frontend"},{"type":"link","label":"BFF\u5c42API\u5f00\u53d1","href":"/website/en/docs/lowcode-development/development/bff-apis","docId":"lowcode-development/development/bff-apis"},{"type":"link","label":"\u5f00\u53d1\u540e\u7aef\u670d\u52a1\u7ec4\u4ef6","href":"/website/en/docs/lowcode-development/development/backend-operator","docId":"lowcode-development/development/backend-operator"},{"type":"link","label":"\u53d1\u5e03\u4e00\u4e2a Hello World \u7ec4\u4ef6","href":"/website/en/docs/lowcode-development/development/develop-hello-world","docId":"lowcode-development/development/develop-hello-world"}],"href":"/website/en/docs/category/\u7ec4\u4ef6\u5f00\u53d1"}],"href":"/website/en/docs/category/\u4f4e\u7801kit"},{"type":"link","label":"\u5e38\u89c1\u95ee\u9898","href":"/website/en/docs/FAQ","docId":"FAQ"},{"type":"link","label":"\u8d21\u732e\u6307\u5357","href":"/website/en/docs/contribute","docId":"contribute"}]},"docs":{"building-base/configuration/3rd-party-account":{"id":"building-base/configuration/3rd-party-account","title":"\u4f7f\u7528\u7b2c\u4e09\u65b9\u7cfb\u7edf\u767b\u5f55","description":"\u76ee\u524d\u57fa\u4e8e dex \u652f\u6301\u5916\u90e8\u8ba4\u8bc1\u7cfb\u7edf\u7684\u96c6\u6210\uff0c\u5b9e\u73b0\u670d\u52a1\u95e8\u6237\u4e0e\u7b2c\u4e09\u65b9\u8ba4\u8bc1\u7cfb\u7edf\u7684\u7edf\u4e00\u8d26\u53f7\u53ca\u5355\u70b9\u767b\u5f55\u3002","sidebar":"tutorialSidebar"},"building-base/configuration/audit-config":{"id":"building-base/configuration/audit-config","title":"\u914d\u7f6e\u5ba1\u8ba1\u80fd\u529b","description":"1\u3001\u7f16\u8f91 audit-policy.yaml \u6587\u4ef6\u5bf9\u5ba1\u8ba1\u8fdb\u884c\u914d\u7f6e\uff0c`kubectl edit cm audit-policy-conf -n u4a-system`","sidebar":"tutorialSidebar"},"building-base/configuration/customize-menu":{"id":"building-base/configuration/customize-menu","title":"\u81ea\u5b9a\u4e49\u83dc\u5355","description":"kubebb \u7684\u6240\u6709\u83dc\u5355\u5747\u57fa\u4e8e menu \u7684 CRD \u8fdb\u884c\u5b9a\u4e49\uff0c\u5982\u679c\u9700\u8981\u6dfb\u52a0\u81ea\u5df1\u7684\u83dc\u5355\uff0c\u53ef\u4ee5\u53c2\u8003\u4ee5\u4e0b memnu \u793a\u4f8b:","sidebar":"tutorialSidebar"},"building-base/configuration/customize-portal":{"id":"building-base/configuration/customize-portal","title":"\u81ea\u5b9a\u4e49\u95e8\u6237","description":"\u81ea\u5b9a\u4e49 logo","sidebar":"tutorialSidebar"},"building-base/configuration/oidc-integration":{"id":"building-base/configuration/oidc-integration","title":"\u96c6\u6210\u5355\u70b9\u767b\u5f55","description":"\u901a\u8fc7 OIDC \u534f\u8bae\uff0c\u5b9e\u73b0\u540c kubebb \u7684\u7edf\u4e00\u8d26\u53f7\u3001\u8ba4\u8bc1\u53ca\u5355\u70b9\u767b\u5f55\u529f\u80fd\u3002","sidebar":"tutorialSidebar"},"building-base/intro":{"id":"building-base/intro","title":"\u4ecb\u7ecd","description":"\u6280\u672f\u7ec4\u4ef6","sidebar":"tutorialSidebar"},"contribute":{"id":"contribute","title":"\u8d21\u732e\u6307\u5357","description":"\u6b22\u8fce\u6765\u5230 KubeBB!","sidebar":"tutorialSidebar"},"core/concepts/component":{"id":"core/concepts/component","title":"\u7ec4\u4ef6CRD","description":"\u7ec4\u4ef6\u662f\u5c06 chart package \u6620\u5c04\u4e3a\u96c6\u7fa4\u8d44\u6e90\u7684\u4e00\u4e2a\u6982\u5ff5\uff0c\u7ec4\u4ef6\u5b9a\u4e49\u4e86 chart package \u7684\u57fa\u7840\u63cf\u8ff0\u4fe1\u606f\uff0c\u7248\u672c\u4fe1\u606f\u7b49\u3002\u7ec4\u4ef6\u4e00\u822c\u7531\u4ed3\u5e93\u521b\u5efa\u51fa\u6765\uff0c\u65e0\u9700\u624b\u52a8\u521b\u5efa\u3002","sidebar":"tutorialSidebar"},"core/concepts/componentplan":{"id":"core/concepts/componentplan","title":"\u7ec4\u4ef6\u90e8\u7f72CRD","description":"ComponentPlan \u4f1a\u5b89\u88c5\u4e00\u4e2a\u7ec4\u4ef6\u5230\u96c6\u7fa4\uff0c\u7c7b\u4f3c\u6267\u884c\u4e00\u6b21 helm install/upgrade \u64cd\u4f5c\uff0c\u53ea\u4e0d\u8fc7\u5c06 helm install/upgrade \u547d\u4ee4\u4e2d\u7684\u53c2\u6570\u56fa\u5316\u5230 ComponentPlan \u7684 spec","sidebar":"tutorialSidebar"},"core/concepts/repository":{"id":"core/concepts/repository","title":"\u7ec4\u4ef6\u4ed3\u5e93CRD","description":"\u4ed3\u5e93\u662f\u5c06 chart repository \u6620\u5c04\u4e3a\u96c6\u7fa4\u8d44\u6e90\u7684\u4e00\u4e2a\u6982\u5ff5\u3002\u4ed3\u5e93\u5b9a\u4e49\u4e86 chart repository \u7684 URL\uff0c\u8ba4\u8bc1\u4fe1\u606f\u7b49\u76f8\u5173\u4fe1\u606f\u3002\u4ed3\u5e93\u662f\u7ec4\u4ef6\u90e8\u7f72\uff0c\u5347\u7ea7\u7684\u57fa\u7840\u3002","sidebar":"tutorialSidebar"},"core/concepts/subscription":{"id":"core/concepts/subscription","title":"\u7ec4\u4ef6\u8ba2\u9605CRD","description":"\u521b\u5efa\u4e00\u4e2a\u8ba2\u9605\uff0c\u8868\u793a\u7528\u6237\u5c06\u8ffd\u8e2a\u4e00\u4e2a\u7ec4\u4ef6\uff08Component\uff09\u5728 \u4ed3\u5e93\uff08Repository\uff09\u4e2d\u7684\u66f4\u65b0\uff0c\u5f53\u7ec4\u4ef6\u66f4\u65b0\u65f6\uff0c\u8be5\u7ec4\u4ef6\u4f1a\u6839\u636e\u8ba2\u9605\u4e2d\u7684\u914d\u7f6e\u81ea\u52a8\u6216\u5f85\u6279\u51c6\u540e\u5b89\u88c5\u5230\u96c6\u7fa4\u4e2d\u3002","sidebar":"tutorialSidebar"},"core/intro":{"id":"core/intro","title":"\u4ecb\u7ecd","description":"\u5185\u6838\u57fa\u4e8ekubernetes operator\u6a21\u5f0f\u8fdb\u884c\u5f00\u53d1\uff0c\u63d0\u4f9b\u5b8c\u6574\u7684\u7ec4\u4ef6\u751f\u547d\u5468\u671f\u7ba1\u7406\u3001\u7ec4\u4ef6\u8ba2\u9605\u548c\u81ea\u52a8\u5316\u90e8\u7f72\u80fd\u529b\uff0c\u5e76\u901a\u8fc7tekton\u6269\u5c55\u5b9e\u73b0\u7ec4\u4ef6\u81ea\u52a8\u5316\u8bc4\u7ea7\u548c\u5b89\u88c5\u524d\u6821\u9a8c\u7b49\u80fd\u529b\u3002","sidebar":"tutorialSidebar"},"core/rating":{"id":"core/rating","title":"\u7ec4\u4ef6\u8bc4\u7ea7","description":"\u7ec4\u4ef6\u8bc4\u7ea7\u7684\u76ee\u7684\u662f\u901a\u8fc7\u5c3d\u53ef\u80fd\u591a\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u4ece\u591a\u4e2a\u7ef4\u5ea6\u6765\u8bc4\u4f30\u4e00\u4e2a\u7ec4\u4ef6\u3002\u56e0\u6b64\uff0c\u7ec4\u4ef6\u8bc4\u7ea7\u4e09\u4e2a\u90e8\u5206\u7684\u5185\u5bb9:","sidebar":"tutorialSidebar"},"core/roadmap":{"id":"core/roadmap","title":"\u8def\u7ebf\u56fe","description":"v0.1.0","sidebar":"tutorialSidebar"},"core/userguide/privatecluster":{"id":"core/userguide/privatecluster","title":"\u79c1\u6709\u96c6\u7fa4\u90e8\u7f72\u65b9\u6848","description":"\u5728\u4f7f\u7528 kubebb-core \u4e4b\u524d\u6211\u4eec\u9700\u8981\u6709\u4e00\u4e2a k8s \u96c6\u7fa4\uff0c\u7248\u672c\u662f 1.24+\u3002","sidebar":"tutorialSidebar"},"FAQ":{"id":"FAQ","title":"\u5e38\u89c1\u95ee\u9898","description":"BuildingBase\u90e8\u7f72","sidebar":"tutorialSidebar"},"intro":{"id":"intro","title":"\u603b\u89c8","description":"KubeBB(Kubernetes Building Blocks)\u662f\u4e00\u79cd\u7531\u5185\u6838\u9a71\u52a8\u7684\u7ec4\u4ef6\u751f\u547d\u5468\u671f\u7ba1\u7406\u5e73\u53f0\uff0c\u96c6\u6210\u5f00\u7bb1\u5373\u7528\u7684\u4e91\u539f\u751f\u5e95\u5ea7\u548c\u4f4e\u7801\u7ec4\u4ef6\u5f00\u53d1\u80fd\u529b,\u6574\u5408\u5b9e\u73b0\u4e91\u539f\u751f\u4e09\u5c42\u7ec4\u4ef6\u6a21\u5f0f\u3002","sidebar":"tutorialSidebar"},"lowcode-development/development_pattern":{"id":"lowcode-development/development_pattern","title":"\u5f00\u53d1\u6a21\u5f0f","description":"KubeBB\u7ec4\u4ef6\u7684\u5f00\u53d1\u91c7\u53d6\u524d\u540e\u7aef\u5206\u79bb\uff0c\u4ee5 K8S \u4e3a\u6838\u5fc3\u7684\u5f00\u53d1\u6846\u67b6\uff0c\u9075\u5faa K8S \u7684\u6269\u5c55\u673a\u5236\u53ca API \u89c4\u8303\u3002\u6574\u4f53\u5f00\u53d1\u67b6\u6784\u7684\u57fa\u672c\u903b\u8f91\u5982\u4e0b\u56fe\u6240\u793a\uff1a","sidebar":"tutorialSidebar"},"lowcode-development/development/backend-operator":{"id":"lowcode-development/development/backend-operator","title":"\u5f00\u53d1\u540e\u7aef\u670d\u52a1\u7ec4\u4ef6","description":"\u672c\u7ae0\u8282\u5bf9 Kubebb \u7684\u540e\u7aef\u670d\u52a1\u5f00\u53d1\u6807\u51c6\u8fdb\u884c\u8be6\u7ec6\u4ecb\u7ecd\uff0c\u4e3b\u8981\u662f\u57fa\u4e8e Controller + CRD \u7684 K8S Operator \u7684\u5f00\u53d1\u6a21\u5f0f\u3002","sidebar":"tutorialSidebar"},"lowcode-development/development/bff-apis":{"id":"lowcode-development/development/bff-apis","title":"BFF\u5c42API\u5f00\u53d1","description":"\u672c\u7ae0\u8282\u5bf9 Kubebb \u7684 BFF \u5c42\u8fdb\u884c\u8be6\u7ec6\u4ecb\u7ecd\uff0c\u5305\u62ec\u5982\u4f55\u4f7f\u7528 GraphQL \u5feb\u901f\u5f00\u53d1 BFF \u5c42\u7684 API","sidebar":"tutorialSidebar"},"lowcode-development/development/develop-hello-world":{"id":"lowcode-development/development/develop-hello-world","title":"\u53d1\u5e03\u4e00\u4e2a Hello World \u7ec4\u4ef6","description":"\u672c\u7ae0\u8282\u5bf9 Kubebb \u7684\u7ec4\u4ef6\u6982\u5ff5\u8fdb\u884c\u8be6\u7ec6\u4ecb\u7ecd","sidebar":"tutorialSidebar"},"lowcode-development/development/frontend":{"id":"lowcode-development/development/frontend","title":"\u524d\u7aef\u5f00\u53d1","description":"\u57fa\u4e8e\u4f4e\u4ee3\u7801\u5f15\u64ce\u8fdb\u884c\u524d\u7aef\u9875\u9762\u5f00\u53d1","sidebar":"tutorialSidebar"},"lowcode-development/intro":{"id":"lowcode-development/intro","title":"\u4ecb\u7ecd","description":"","sidebar":"tutorialSidebar"},"quick-start/buildingbase_quickstart":{"id":"quick-start/buildingbase_quickstart","title":"\u5b89\u88c5\u5e95\u5ea7","description":"\u672c\u7ae0\u8282\u4e3b\u8981\u4ecb\u7ecd\u5e95\u5ea7\u7ec4\u4ef6\u7684\u90e8\u7f72\u6b65\u9aa4\uff0c\u5305\u62ec\u76f8\u5173\u7684\u5f00\u6e90\u6280\u672f\u7ec4\u4ef6\u3001\u524d\u63d0\u6761\u4ef6\u4ee5\u53ca\u5feb\u901f\u90e8\u7f72\uff0c\u5e76\u5c06\u90e8\u7f72\u7684\u96c6\u7fa4\u6dfb\u52a0\u5230\u670d\u52a1\u95e8\u6237\u4e0a\u3002","sidebar":"tutorialSidebar"},"quick-start/core_quickstart":{"id":"quick-start/core_quickstart","title":"\u5b89\u88c5\u5185\u6838","description":"\u5b89\u88c5\u524d\u9700\u5b8c\u6210\u9884\u5148\u51c6\u5907\u3002","sidebar":"tutorialSidebar"},"quick-start/prerequisite":{"id":"quick-start/prerequisite","title":"\u9884\u5148\u51c6\u5907","description":"\u57fa\u7840\u73af\u5883","sidebar":"tutorialSidebar"}}}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[53],{1109:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"link","label":"\u603b\u89c8","href":"/website/en/docs/intro","docId":"intro"},{"type":"category","label":"\u5feb\u901f\u5f00\u59cb","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u9884\u5148\u51c6\u5907","href":"/website/en/docs/quick-start/prerequisite","docId":"quick-start/prerequisite"},{"type":"link","label":"\u5b89\u88c5\u5185\u6838","href":"/website/en/docs/quick-start/core_quickstart","docId":"quick-start/core_quickstart"},{"type":"link","label":"\u5b89\u88c5\u5e95\u5ea7","href":"/website/en/docs/quick-start/buildingbase_quickstart","docId":"quick-start/buildingbase_quickstart"}],"href":"/website/en/docs/category/\u5feb\u901f\u5f00\u59cb"},{"type":"category","label":"\u5185\u6838Kit","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u4ecb\u7ecd","href":"/website/en/docs/core/intro","docId":"core/intro"},{"type":"category","label":"\u6982\u5ff5","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u7ec4\u4ef6\u4ed3\u5e93CRD","href":"/website/en/docs/core/concepts/repository","docId":"core/concepts/repository"},{"type":"link","label":"\u7ec4\u4ef6CRD","href":"/website/en/docs/core/concepts/component","docId":"core/concepts/component"},{"type":"link","label":"\u7ec4\u4ef6\u90e8\u7f72CRD","href":"/website/en/docs/core/concepts/componentplan","docId":"core/concepts/componentplan"},{"type":"link","label":"\u7ec4\u4ef6\u8ba2\u9605CRD","href":"/website/en/docs/core/concepts/subscription","docId":"core/concepts/subscription"}],"href":"/website/en/docs/category/\u6982\u5ff5"},{"type":"category","label":"\u7528\u6237\u6307\u5357","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u79c1\u6709\u96c6\u7fa4\u90e8\u7f72\u65b9\u6848","href":"/website/en/docs/core/userguide/privatecluster","docId":"core/userguide/privatecluster"}],"href":"/website/en/docs/category/\u7528\u6237\u6307\u5357"},{"type":"link","label":"\u7ec4\u4ef6\u8bc4\u7ea7","href":"/website/en/docs/core/rating","docId":"core/rating"},{"type":"link","label":"\u8def\u7ebf\u56fe","href":"/website/en/docs/core/roadmap","docId":"core/roadmap"}],"href":"/website/en/docs/category/\u5185\u6838kit"},{"type":"category","label":"\u5e95\u5ea7Kit","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u4ecb\u7ecd","href":"/website/en/docs/building-base/intro","docId":"building-base/intro"},{"type":"category","label":"\u81ea\u5b9a\u4e49\u914d\u7f6e","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u81ea\u5b9a\u4e49\u95e8\u6237","href":"/website/en/docs/building-base/configuration/customize-portal","docId":"building-base/configuration/customize-portal"},{"type":"link","label":"\u81ea\u5b9a\u4e49\u83dc\u5355","href":"/website/en/docs/building-base/configuration/customize-menu","docId":"building-base/configuration/customize-menu"},{"type":"link","label":"\u4f7f\u7528\u7b2c\u4e09\u65b9\u7cfb\u7edf\u767b\u5f55","href":"/website/en/docs/building-base/configuration/3rd-party-account","docId":"building-base/configuration/3rd-party-account"},{"type":"link","label":"\u914d\u7f6e\u5ba1\u8ba1\u80fd\u529b","href":"/website/en/docs/building-base/configuration/audit-config","docId":"building-base/configuration/audit-config"},{"type":"link","label":"\u96c6\u6210\u5355\u70b9\u767b\u5f55","href":"/website/en/docs/building-base/configuration/oidc-integration","docId":"building-base/configuration/oidc-integration"}],"href":"/website/en/docs/category/\u81ea\u5b9a\u4e49\u914d\u7f6e"}],"href":"/website/en/docs/category/\u5e95\u5ea7kit"},{"type":"category","label":"\u4f4e\u7801Kit","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u4ecb\u7ecd","href":"/website/en/docs/lowcode-development/intro","docId":"lowcode-development/intro"},{"type":"link","label":"\u5f00\u53d1\u6a21\u5f0f","href":"/website/en/docs/lowcode-development/development_pattern","docId":"lowcode-development/development_pattern"},{"type":"category","label":"\u7ec4\u4ef6\u5f00\u53d1","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u524d\u7aef\u5f00\u53d1","href":"/website/en/docs/lowcode-development/development/frontend","docId":"lowcode-development/development/frontend"},{"type":"link","label":"BFF\u5c42API\u5f00\u53d1","href":"/website/en/docs/lowcode-development/development/bff-apis","docId":"lowcode-development/development/bff-apis"},{"type":"link","label":"\u5f00\u53d1\u540e\u7aef\u670d\u52a1\u7ec4\u4ef6","href":"/website/en/docs/lowcode-development/development/backend-operator","docId":"lowcode-development/development/backend-operator"},{"type":"link","label":"\u53d1\u5e03\u4e00\u4e2a Hello World \u7ec4\u4ef6","href":"/website/en/docs/lowcode-development/development/develop-hello-world","docId":"lowcode-development/development/develop-hello-world"}],"href":"/website/en/docs/category/\u7ec4\u4ef6\u5f00\u53d1"}],"href":"/website/en/docs/category/\u4f4e\u7801kit"},{"type":"link","label":"\u5e38\u89c1\u95ee\u9898","href":"/website/en/docs/FAQ","docId":"FAQ"},{"type":"link","label":"\u8d21\u732e\u6307\u5357","href":"/website/en/docs/contribute","docId":"contribute"}]},"docs":{"building-base/configuration/3rd-party-account":{"id":"building-base/configuration/3rd-party-account","title":"\u4f7f\u7528\u7b2c\u4e09\u65b9\u7cfb\u7edf\u767b\u5f55","description":"\u76ee\u524d\u57fa\u4e8e dex \u652f\u6301\u5916\u90e8\u8ba4\u8bc1\u7cfb\u7edf\u7684\u96c6\u6210\uff0c\u5b9e\u73b0\u670d\u52a1\u95e8\u6237\u4e0e\u7b2c\u4e09\u65b9\u8ba4\u8bc1\u7cfb\u7edf\u7684\u7edf\u4e00\u8d26\u53f7\u53ca\u5355\u70b9\u767b\u5f55\u3002","sidebar":"tutorialSidebar"},"building-base/configuration/audit-config":{"id":"building-base/configuration/audit-config","title":"\u914d\u7f6e\u5ba1\u8ba1\u80fd\u529b","description":"1\u3001\u7f16\u8f91 audit-policy.yaml \u6587\u4ef6\u5bf9\u5ba1\u8ba1\u8fdb\u884c\u914d\u7f6e\uff0c`kubectl edit cm audit-policy-conf -n u4a-system`","sidebar":"tutorialSidebar"},"building-base/configuration/customize-menu":{"id":"building-base/configuration/customize-menu","title":"\u81ea\u5b9a\u4e49\u83dc\u5355","description":"kubebb \u7684\u6240\u6709\u83dc\u5355\u5747\u57fa\u4e8e menu \u7684 CRD \u8fdb\u884c\u5b9a\u4e49\uff0c\u5982\u679c\u9700\u8981\u6dfb\u52a0\u81ea\u5df1\u7684\u83dc\u5355\uff0c\u53ef\u4ee5\u53c2\u8003\u4ee5\u4e0b memnu \u793a\u4f8b:","sidebar":"tutorialSidebar"},"building-base/configuration/customize-portal":{"id":"building-base/configuration/customize-portal","title":"\u81ea\u5b9a\u4e49\u95e8\u6237","description":"\u81ea\u5b9a\u4e49 logo","sidebar":"tutorialSidebar"},"building-base/configuration/oidc-integration":{"id":"building-base/configuration/oidc-integration","title":"\u96c6\u6210\u5355\u70b9\u767b\u5f55","description":"\u901a\u8fc7 OIDC \u534f\u8bae\uff0c\u5b9e\u73b0\u540c kubebb \u7684\u7edf\u4e00\u8d26\u53f7\u3001\u8ba4\u8bc1\u53ca\u5355\u70b9\u767b\u5f55\u529f\u80fd\u3002","sidebar":"tutorialSidebar"},"building-base/intro":{"id":"building-base/intro","title":"\u4ecb\u7ecd","description":"\u6280\u672f\u7ec4\u4ef6","sidebar":"tutorialSidebar"},"contribute":{"id":"contribute","title":"\u8d21\u732e\u6307\u5357","description":"\u6b22\u8fce\u6765\u5230 KubeBB!","sidebar":"tutorialSidebar"},"core/concepts/component":{"id":"core/concepts/component","title":"\u7ec4\u4ef6CRD","description":"\u7ec4\u4ef6\u662f\u5c06 chart package \u6620\u5c04\u4e3a\u96c6\u7fa4\u8d44\u6e90\u7684\u4e00\u4e2a\u6982\u5ff5\uff0c\u7ec4\u4ef6\u5b9a\u4e49\u4e86 chart package \u7684\u57fa\u7840\u63cf\u8ff0\u4fe1\u606f\uff0c\u7248\u672c\u4fe1\u606f\u7b49\u3002\u7ec4\u4ef6\u4e00\u822c\u7531\u4ed3\u5e93\u521b\u5efa\u51fa\u6765\uff0c\u65e0\u9700\u624b\u52a8\u521b\u5efa\u3002","sidebar":"tutorialSidebar"},"core/concepts/componentplan":{"id":"core/concepts/componentplan","title":"\u7ec4\u4ef6\u90e8\u7f72CRD","description":"ComponentPlan \u4f1a\u5b89\u88c5\u4e00\u4e2a\u7ec4\u4ef6\u5230\u96c6\u7fa4\uff0c\u7c7b\u4f3c\u6267\u884c\u4e00\u6b21 helm install/upgrade \u64cd\u4f5c\uff0c\u53ea\u4e0d\u8fc7\u5c06 helm install/upgrade \u547d\u4ee4\u4e2d\u7684\u53c2\u6570\u56fa\u5316\u5230 ComponentPlan \u7684 spec","sidebar":"tutorialSidebar"},"core/concepts/repository":{"id":"core/concepts/repository","title":"\u7ec4\u4ef6\u4ed3\u5e93CRD","description":"\u4ed3\u5e93\u662f\u5c06 chart repository \u6620\u5c04\u4e3a\u96c6\u7fa4\u8d44\u6e90\u7684\u4e00\u4e2a\u6982\u5ff5\u3002\u4ed3\u5e93\u5b9a\u4e49\u4e86 chart repository \u7684 URL\uff0c\u8ba4\u8bc1\u4fe1\u606f\u7b49\u76f8\u5173\u4fe1\u606f\u3002\u4ed3\u5e93\u662f\u7ec4\u4ef6\u90e8\u7f72\uff0c\u5347\u7ea7\u7684\u57fa\u7840\u3002","sidebar":"tutorialSidebar"},"core/concepts/subscription":{"id":"core/concepts/subscription","title":"\u7ec4\u4ef6\u8ba2\u9605CRD","description":"\u521b\u5efa\u4e00\u4e2a\u8ba2\u9605\uff0c\u8868\u793a\u7528\u6237\u5c06\u8ffd\u8e2a\u4e00\u4e2a\u7ec4\u4ef6\uff08Component\uff09\u5728 \u4ed3\u5e93\uff08Repository\uff09\u4e2d\u7684\u66f4\u65b0\uff0c\u5f53\u7ec4\u4ef6\u66f4\u65b0\u65f6\uff0c\u8be5\u7ec4\u4ef6\u4f1a\u6839\u636e\u8ba2\u9605\u4e2d\u7684\u914d\u7f6e\u81ea\u52a8\u6216\u5f85\u6279\u51c6\u540e\u5b89\u88c5\u5230\u96c6\u7fa4\u4e2d\u3002","sidebar":"tutorialSidebar"},"core/intro":{"id":"core/intro","title":"\u4ecb\u7ecd","description":"\u5185\u6838\u57fa\u4e8ekubernetes operator\u6a21\u5f0f\u8fdb\u884c\u5f00\u53d1\uff0c\u63d0\u4f9b\u5b8c\u6574\u7684\u7ec4\u4ef6\u751f\u547d\u5468\u671f\u7ba1\u7406\u3001\u7ec4\u4ef6\u8ba2\u9605\u548c\u81ea\u52a8\u5316\u90e8\u7f72\u80fd\u529b\uff0c\u5e76\u901a\u8fc7tekton\u6269\u5c55\u5b9e\u73b0\u7ec4\u4ef6\u81ea\u52a8\u5316\u8bc4\u7ea7\u548c\u5b89\u88c5\u524d\u6821\u9a8c\u7b49\u80fd\u529b\u3002","sidebar":"tutorialSidebar"},"core/rating":{"id":"core/rating","title":"\u7ec4\u4ef6\u8bc4\u7ea7","description":"\u7ec4\u4ef6\u8bc4\u7ea7\u7684\u76ee\u7684\u662f\u901a\u8fc7\u5c3d\u53ef\u80fd\u591a\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u4ece\u591a\u4e2a\u7ef4\u5ea6\u6765\u8bc4\u4f30\u4e00\u4e2a\u7ec4\u4ef6\u3002\u56e0\u6b64\uff0c\u7ec4\u4ef6\u8bc4\u7ea7\u4e09\u4e2a\u90e8\u5206\u7684\u5185\u5bb9:","sidebar":"tutorialSidebar"},"core/roadmap":{"id":"core/roadmap","title":"\u8def\u7ebf\u56fe","description":"v0.1.0","sidebar":"tutorialSidebar"},"core/userguide/privatecluster":{"id":"core/userguide/privatecluster","title":"\u79c1\u6709\u96c6\u7fa4\u90e8\u7f72\u65b9\u6848","description":"\u5728\u4f7f\u7528 kubebb-core \u4e4b\u524d\u6211\u4eec\u9700\u8981\u6709\u4e00\u4e2a k8s \u96c6\u7fa4\uff0c\u7248\u672c\u662f 1.24+\u3002","sidebar":"tutorialSidebar"},"FAQ":{"id":"FAQ","title":"\u5e38\u89c1\u95ee\u9898","description":"BuildingBase\u76f8\u5173","sidebar":"tutorialSidebar"},"intro":{"id":"intro","title":"\u603b\u89c8","description":"KubeBB(Kubernetes Building Blocks)\u662f\u4e00\u79cd\u7531\u5185\u6838\u9a71\u52a8\u7684\u7ec4\u4ef6\u751f\u547d\u5468\u671f\u7ba1\u7406\u5e73\u53f0\uff0c\u96c6\u6210\u5f00\u7bb1\u5373\u7528\u7684\u4e91\u539f\u751f\u5e95\u5ea7\u548c\u4f4e\u7801\u7ec4\u4ef6\u5f00\u53d1\u80fd\u529b,\u6574\u5408\u5b9e\u73b0\u4e91\u539f\u751f\u4e09\u5c42\u7ec4\u4ef6\u6a21\u5f0f\u3002","sidebar":"tutorialSidebar"},"lowcode-development/development_pattern":{"id":"lowcode-development/development_pattern","title":"\u5f00\u53d1\u6a21\u5f0f","description":"KubeBB\u7ec4\u4ef6\u7684\u5f00\u53d1\u91c7\u53d6\u524d\u540e\u7aef\u5206\u79bb\uff0c\u4ee5 K8S \u4e3a\u6838\u5fc3\u7684\u5f00\u53d1\u6846\u67b6\uff0c\u9075\u5faa K8S \u7684\u6269\u5c55\u673a\u5236\u53ca API \u89c4\u8303\u3002\u6574\u4f53\u5f00\u53d1\u67b6\u6784\u7684\u57fa\u672c\u903b\u8f91\u5982\u4e0b\u56fe\u6240\u793a\uff1a","sidebar":"tutorialSidebar"},"lowcode-development/development/backend-operator":{"id":"lowcode-development/development/backend-operator","title":"\u5f00\u53d1\u540e\u7aef\u670d\u52a1\u7ec4\u4ef6","description":"\u672c\u7ae0\u8282\u5bf9 Kubebb \u7684\u540e\u7aef\u670d\u52a1\u5f00\u53d1\u6807\u51c6\u8fdb\u884c\u8be6\u7ec6\u4ecb\u7ecd\uff0c\u4e3b\u8981\u662f\u57fa\u4e8e Controller + CRD \u7684 K8S Operator \u7684\u5f00\u53d1\u6a21\u5f0f\u3002","sidebar":"tutorialSidebar"},"lowcode-development/development/bff-apis":{"id":"lowcode-development/development/bff-apis","title":"BFF\u5c42API\u5f00\u53d1","description":"\u672c\u7ae0\u8282\u5bf9 Kubebb \u7684 BFF \u5c42\u8fdb\u884c\u8be6\u7ec6\u4ecb\u7ecd\uff0c\u5305\u62ec\u5982\u4f55\u4f7f\u7528 GraphQL \u5feb\u901f\u5f00\u53d1 BFF \u5c42\u7684 API","sidebar":"tutorialSidebar"},"lowcode-development/development/develop-hello-world":{"id":"lowcode-development/development/develop-hello-world","title":"\u53d1\u5e03\u4e00\u4e2a Hello World \u7ec4\u4ef6","description":"\u672c\u7ae0\u8282\u5bf9 Kubebb \u7684\u7ec4\u4ef6\u6982\u5ff5\u8fdb\u884c\u8be6\u7ec6\u4ecb\u7ecd","sidebar":"tutorialSidebar"},"lowcode-development/development/frontend":{"id":"lowcode-development/development/frontend","title":"\u524d\u7aef\u5f00\u53d1","description":"\u57fa\u4e8e\u4f4e\u4ee3\u7801\u5f15\u64ce\u8fdb\u884c\u524d\u7aef\u9875\u9762\u5f00\u53d1","sidebar":"tutorialSidebar"},"lowcode-development/intro":{"id":"lowcode-development/intro","title":"\u4ecb\u7ecd","description":"","sidebar":"tutorialSidebar"},"quick-start/buildingbase_quickstart":{"id":"quick-start/buildingbase_quickstart","title":"\u5b89\u88c5\u5e95\u5ea7","description":"\u672c\u7ae0\u8282\u4e3b\u8981\u4ecb\u7ecd\u5e95\u5ea7\u7ec4\u4ef6\u7684\u90e8\u7f72\u6b65\u9aa4\uff0c\u5305\u62ec\u76f8\u5173\u7684\u5f00\u6e90\u6280\u672f\u7ec4\u4ef6\u3001\u524d\u63d0\u6761\u4ef6\u4ee5\u53ca\u5feb\u901f\u90e8\u7f72\uff0c\u5e76\u5c06\u90e8\u7f72\u7684\u96c6\u7fa4\u6dfb\u52a0\u5230\u670d\u52a1\u95e8\u6237\u4e0a\u3002","sidebar":"tutorialSidebar"},"quick-start/core_quickstart":{"id":"quick-start/core_quickstart","title":"\u5b89\u88c5\u5185\u6838","description":"\u5b89\u88c5\u524d\u9700\u5b8c\u6210\u9884\u5148\u51c6\u5907\u3002","sidebar":"tutorialSidebar"},"quick-start/prerequisite":{"id":"quick-start/prerequisite","title":"\u9884\u5148\u51c6\u5907","description":"\u57fa\u7840\u73af\u5883","sidebar":"tutorialSidebar"}}}')}}]); \ No newline at end of file diff --git a/en/assets/js/ad895e75.59c72d26.js b/en/assets/js/ad895e75.59c72d26.js deleted file mode 100644 index e280c7b01..000000000 --- a/en/assets/js/ad895e75.59c72d26.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[4288],{3905:(e,n,t)=>{t.d(n,{Zo:()=>u,kt:()=>f});var r=t(7294);function a(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function l(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function i(e){for(var n=1;n=0||(a[t]=e[t]);return a}(e,n);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var s=r.createContext({}),c=function(e){var n=r.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},u=function(e){var n=c(e.components);return r.createElement(s.Provider,{value:n},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},d=r.forwardRef((function(e,n){var t=e.components,a=e.mdxType,l=e.originalType,s=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),p=c(t),d=a,f=p["".concat(s,".").concat(d)]||p[d]||m[d]||l;return t?r.createElement(f,i(i({ref:n},u),{},{components:t})):r.createElement(f,i({ref:n},u))}));function f(e,n){var t=arguments,a=n&&n.mdxType;if("string"==typeof e||a){var l=t.length,i=new Array(l);i[0]=d;var o={};for(var s in n)hasOwnProperty.call(n,s)&&(o[s]=n[s]);o.originalType=e,o[p]="string"==typeof e?e:a,i[1]=o;for(var c=2;c{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>i,default:()=>m,frontMatter:()=>l,metadata:()=>o,toc:()=>c});var r=t(7462),a=(t(7294),t(3905));const l={sidebar_position:8},i="\u5e38\u89c1\u95ee\u9898",o={unversionedId:"FAQ",id:"FAQ",title:"\u5e38\u89c1\u95ee\u9898",description:"BuildingBase\u90e8\u7f72",source:"@site/docs/FAQ.md",sourceDirName:".",slug:"/FAQ",permalink:"/website/en/docs/FAQ",draft:!1,tags:[],version:"current",sidebarPosition:8,frontMatter:{sidebar_position:8},sidebar:"tutorialSidebar",previous:{title:"\u53d1\u5e03\u4e00\u4e2a Hello World \u7ec4\u4ef6",permalink:"/website/en/docs/lowcode-development/development/develop-hello-world"},next:{title:"\u8d21\u732e\u6307\u5357",permalink:"/website/en/docs/contribute"}},s={},c=[{value:"BuildingBase\u90e8\u7f72",id:"buildingbase\u90e8\u7f72",level:2},{value:"1. \u79df\u6237\u7ba1\u7406\u63a7\u5236\u5668probe liveness\u6821\u9a8c\u5931\u8d25\uff0c\u5bfc\u81f4\u65e0\u6cd5\u542f\u52a8",id:"1-\u79df\u6237\u7ba1\u7406\u63a7\u5236\u5668probe-liveness\u6821\u9a8c\u5931\u8d25\u5bfc\u81f4\u65e0\u6cd5\u542f\u52a8",level:3},{value:"\u95ee\u9898\u91cd\u73b0",id:"\u95ee\u9898\u91cd\u73b0",level:4},{value:"\u95ee\u9898\u539f\u56e0",id:"\u95ee\u9898\u539f\u56e0",level:4},{value:"\u89e3\u51b3\u65b9\u6848",id:"\u89e3\u51b3\u65b9\u6848",level:4}],u={toc:c},p="wrapper";function m(e){let{components:n,...t}=e;return(0,a.kt)(p,(0,r.Z)({},u,t,{components:n,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"\u5e38\u89c1\u95ee\u9898"},"\u5e38\u89c1\u95ee\u9898"),(0,a.kt)("h2",{id:"buildingbase\u90e8\u7f72"},"BuildingBase\u90e8\u7f72"),(0,a.kt)("h3",{id:"1-\u79df\u6237\u7ba1\u7406\u63a7\u5236\u5668probe-liveness\u6821\u9a8c\u5931\u8d25\u5bfc\u81f4\u65e0\u6cd5\u542f\u52a8"},"1. \u79df\u6237\u7ba1\u7406\u63a7\u5236\u5668probe liveness\u6821\u9a8c\u5931\u8d25\uff0c\u5bfc\u81f4\u65e0\u6cd5\u542f\u52a8"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\u73af\u5883",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"Azure VM (Ubuntu 22.04)")))),(0,a.kt)("h4",{id:"\u95ee\u9898\u91cd\u73b0"},"\u95ee\u9898\u91cd\u73b0"),(0,a.kt)("p",null,"\u8fd0\u884c",(0,a.kt)("inlineCode",{parentName:"p"},"helm install --wait -n u4a-system u4a-component ."),"\u540e\uff0c\u53d1\u73b0\u79df\u6237\u7ba1\u7406\u63a7\u5236\u5668\u4e00\u76f4\u5904\u4e8e",(0,a.kt)("inlineCode",{parentName:"p"},"CrashLoopBackOff"),"\u72b6\u6001:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-shell"},"\u279c ~ k get pods -nu4a-system\nNAME READY STATUS RESTARTS AGE\nbff-server-9cc54cbc5-gcp6x 1/1 Running 0 17m\ncapsule-controller-manager-5b9864f9bf-7mkhb 0/1 CrashLoopBackOff 8 (27s ago) 17m\ncert-manager-79d7998d9-c7q8n 1/1 Running 0 33m\ncert-manager-cainjector-57bb7f44dd-c9sj6 1/1 Running 0 33m\ncert-manager-webhook-65b494ccf4-4blzx 1/1 Running 0 33m\ncluster-component-ingress-nginx-controller-86d6bfdbf6-qj6hf 1/1 Running 0 33m\nkube-oidc-proxy-fc6b54b8c-ddc2s 1/1 Running 0 17m\noidc-server-84cbfcc9f5-bmmf9 2/2 Running 0 17m\nresource-view-controller-94645667-ttvst 1/1 Running 0 17m\n")),(0,a.kt)("p",null,"\u67e5\u770b\u65e5\u5fd7\u53d1\u73b0\u5982\u4e0b\u9519\u8bef\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-shell"},'Events:\n Type Reason Age From Message\n ---- ------ ---- ---- -------\n Normal Scheduled 4m35s default-scheduler Successfully assigned u4a-system/capsule-controller-manager-5b9864f9bf-7mkhb to kubebb-core-worker\n Normal Pulling 4m34s kubelet Pulling image "hub.tenxcloud.com/u4a-component/capsule:v0.1.2-20221122"\n Normal Pulled 3m57s kubelet Successfully pulled image "hub.tenxcloud.com/u4a-component/capsule:v0.1.2-20221122" in 36.616134797s\n Warning Unhealthy 3m53s kubelet Liveness probe failed: Get "http://10.244.1.6:10080/healthz": context deadline exceeded (Client.Timeout exceeded while awaiting headers)\n Warning Unhealthy 3m44s kubelet Readiness probe failed: Get "http://10.244.1.6:10080/readyz": dial tcp 10.244.1.6:10080: connect: connection refused\n Warning Unhealthy 3m44s kubelet Liveness probe failed: Get "http://10.244.1.6:10080/healthz": dial tcp 10.244.1.6:10080: connect: connection refused\n Normal Created 3m34s (x3 over 3m57s) kubelet Created container manager\n Normal Started 3m34s (x3 over 3m57s) kubelet Started container manager\n Warning Unhealthy 3m31s (x7 over 3m55s) kubelet Readiness probe failed: Get "http://10.244.1.6:10080/readyz": context deadline exceeded (Client.Timeout exceeded while awaiting headers)\n Warning BackOff 3m13s (x4 over 3m42s) kubelet Back-off restarting failed container\n Normal Pulled 3m1s (x3 over 3m50s) kubelet Container image "hub.tenxcloud.com/u4a-component/capsule:v0.1.2-20221122" already present on machine\n')),(0,a.kt)("h4",{id:"\u95ee\u9898\u539f\u56e0"},"\u95ee\u9898\u539f\u56e0"),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"\u611f\u8c22 @0xff-dev \u63d0\u4f9b\u7684\u89e3\u51b3\u65b9\u6848")),(0,a.kt)("p",null,"\u53bb\u9664liveness probe\u540e\uff0c\u80fd\u770b\u5230\u5bb9\u5668\u62a5\u9519\uff0c\u53d1\u73b0\u662f\u7531\u4e8ecapsule\u521d\u59cb\u5316\u8fc7\u7a0b\u4e2d\u8d85\u51fa\u4e86\u64cd\u4f5c\u7cfb\u7edf\u5141\u8bb8\u7684\u6700\u5927\u6587\u4ef6\u6253\u5f00\u6570\uff0c\u5bfc\u81f4capsule\u65e0\u6cd5\u542f\u52a8\u3002"),(0,a.kt)("h4",{id:"\u89e3\u51b3\u65b9\u6848"},"\u89e3\u51b3\u65b9\u6848"),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"\u611f\u8c22 @0xff-dev \u63d0\u4f9b\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u9700\u8bbe\u7f6e fs.inotify.max_user_instances=81920")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\u7531\u5fae\u8f6f\u7684New Bing\u89e3\u7b54\u5f97\u5230\u7684\u7b54\u6848\uff1a")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"fs.inotify.max_user_instances")," \u662f\u4e00\u4e2a\u5185\u6838\u53c2\u6570\uff0c\u5b83\u8868\u793a\u6bcf\u4e2a\u7528\u6237\u53ef\u4ee5\u521b\u5efa\u7684 ",(0,a.kt)("inlineCode",{parentName:"p"},"inotify")," \u5b9e\u4f8b\u7684\u6700\u5927\u6570\u91cf\u3002",(0,a.kt)("inlineCode",{parentName:"p"},"inotify")," \u662f\u4e00\u4e2a\u7528\u6765\u76d1\u89c6\u6587\u4ef6\u7cfb\u7edf\u53d8\u5316\u7684\u673a\u5236\u3002\u5982\u679c\u4f60\u60f3\u8981\u4fee\u6539\u8fd9\u4e2a\u53c2\u6570\uff0c\u4f60\u6709\u4e24\u79cd\u65b9\u6cd5\uff1a"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\u4e34\u65f6\u4fee\u6539\uff1a\u4f60\u53ef\u4ee5\u4f7f\u7528 sysctl -w \u547d\u4ee4\u6765\u4e34\u65f6\u4fee\u6539\u8fd9\u4e2a\u53c2\u6570\uff0c\u4f8b\u5982\uff1a")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"sudo sysctl -w fs.inotify.max_user_instances=81920\n")),(0,a.kt)("p",null,"\u8fd9\u4e2a\u547d\u4ee4\u4f1a\u628a ",(0,a.kt)("inlineCode",{parentName:"p"},"fs.inotify.max_user_instances")," \u7684\u503c\u8bbe\u7f6e\u4e3a 81920\uff0c\u5e76\u5199\u5165",(0,a.kt)("inlineCode",{parentName:"p"},"/proc/sys/fs/inotify/max_user_instances")," \u6587\u4ef6\u3002\u4f46\u662f\u8fd9\u4e2a\u4fee\u6539\u53ea\u5728\u91cd\u542f\u4e4b\u524d\u6709\u6548\uff0c\u91cd\u542f\u540e\u4f1a\u6062\u590d\u9ed8\u8ba4\u503c\u3002"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\u6c38\u4e45\u4fee\u6539\uff1a\u4f60\u53ef\u4ee5\u5728 /etc/sysctl.conf \u6587\u4ef6\u4e2d\u6dfb\u52a0\u4e00\u884c\uff1a")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"fs.inotify.max_user_instances=81920\n")),(0,a.kt)("p",null,"\u7136\u540e\u8fd0\u884c ",(0,a.kt)("inlineCode",{parentName:"p"},"sudo sysctl -p"),"\u547d\u4ee4\u6765\u52a0\u8f7d\u8fd9\u4e2a\u6587\u4ef6\u4e2d\u7684\u8bbe\u7f6e\u3002\u8fd9\u6837\uff0c\u8fd9\u4e2a\u4fee\u6539\u5c31\u4f1a\u5728\u6bcf\u6b21\u91cd\u542f\u540e\u751f\u6548\u3002"),(0,a.kt)("p",null,"\u5982\u679c\u4f60\u60f3\u4e86\u89e3\u66f4\u591a\u5173\u4e8e sysctl \u548c fs.inotify.max_user_instances \u7684\u4fe1\u606f\uff0c\u8bf7\u53c2\u8003\u4ee5\u4e0b\u94fe\u63a5\uff1a"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://www.suse.com/support/kb/doc/?id=000020048"},"How to increase the inotify.max_user_watches and inotify.max_user_instances sysctls on a Linux host | Support | SUSE")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://unix.stackexchange.com/questions/444998/how-to-set-and-understand-fs-notify-max-user-watches"},"How to set and understand fs.notify.max_user_watches - Unix & Linux Stack Exchange")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://askubuntu.com/questions/1068168/sysctl-permission-denied-on-key-fs-inotify-max-user-watches"},"sysctl: permission denied on key 'fs.inotify.max_user_watches' - Ask Ubuntu"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/en/assets/js/ad895e75.c6c25b05.js b/en/assets/js/ad895e75.c6c25b05.js new file mode 100644 index 000000000..2d5589924 --- /dev/null +++ b/en/assets/js/ad895e75.c6c25b05.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[4288],{3905:(e,n,t)=>{t.d(n,{Zo:()=>u,kt:()=>f});var a=t(7294);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function l(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function i(e){for(var n=1;n=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var s=a.createContext({}),c=function(e){var n=a.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},u=function(e){var n=c(e.components);return a.createElement(s.Provider,{value:n},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},d=a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,l=e.originalType,s=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),p=c(t),d=r,f=p["".concat(s,".").concat(d)]||p[d]||m[d]||l;return t?a.createElement(f,i(i({ref:n},u),{},{components:t})):a.createElement(f,i({ref:n},u))}));function f(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var l=t.length,i=new Array(l);i[0]=d;var o={};for(var s in n)hasOwnProperty.call(n,s)&&(o[s]=n[s]);o.originalType=e,o[p]="string"==typeof e?e:r,i[1]=o;for(var c=2;c{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>i,default:()=>m,frontMatter:()=>l,metadata:()=>o,toc:()=>c});var a=t(7462),r=(t(7294),t(3905));const l={sidebar_position:8},i="\u5e38\u89c1\u95ee\u9898",o={unversionedId:"FAQ",id:"FAQ",title:"\u5e38\u89c1\u95ee\u9898",description:"BuildingBase\u76f8\u5173",source:"@site/docs/FAQ.md",sourceDirName:".",slug:"/FAQ",permalink:"/website/en/docs/FAQ",draft:!1,tags:[],version:"current",sidebarPosition:8,frontMatter:{sidebar_position:8},sidebar:"tutorialSidebar",previous:{title:"\u53d1\u5e03\u4e00\u4e2a Hello World \u7ec4\u4ef6",permalink:"/website/en/docs/lowcode-development/development/develop-hello-world"},next:{title:"\u8d21\u732e\u6307\u5357",permalink:"/website/en/docs/contribute"}},s={},c=[{value:"BuildingBase\u76f8\u5173",id:"buildingbase\u76f8\u5173",level:2},{value:"\u90e8\u7f72\u95ee\u9898",id:"\u90e8\u7f72\u95ee\u9898",level:3},{value:"1. \u79df\u6237\u7ba1\u7406\u63a7\u5236\u5668probe liveness\u6821\u9a8c\u5931\u8d25\uff0c\u5bfc\u81f4\u65e0\u6cd5\u542f\u52a8",id:"1-\u79df\u6237\u7ba1\u7406\u63a7\u5236\u5668probe-liveness\u6821\u9a8c\u5931\u8d25\u5bfc\u81f4\u65e0\u6cd5\u542f\u52a8",level:4},{value:"\u95ee\u9898\u91cd\u73b0",id:"\u95ee\u9898\u91cd\u73b0",level:4},{value:"\u95ee\u9898\u539f\u56e0",id:"\u95ee\u9898\u539f\u56e0",level:4},{value:"\u89e3\u51b3\u65b9\u6848",id:"\u89e3\u51b3\u65b9\u6848",level:4}],u={toc:c},p="wrapper";function m(e){let{components:n,...t}=e;return(0,r.kt)(p,(0,a.Z)({},u,t,{components:n,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"\u5e38\u89c1\u95ee\u9898"},"\u5e38\u89c1\u95ee\u9898"),(0,r.kt)("h2",{id:"buildingbase\u76f8\u5173"},"BuildingBase\u76f8\u5173"),(0,r.kt)("h3",{id:"\u90e8\u7f72\u95ee\u9898"},"\u90e8\u7f72\u95ee\u9898"),(0,r.kt)("h4",{id:"1-\u79df\u6237\u7ba1\u7406\u63a7\u5236\u5668probe-liveness\u6821\u9a8c\u5931\u8d25\u5bfc\u81f4\u65e0\u6cd5\u542f\u52a8"},"1. \u79df\u6237\u7ba1\u7406\u63a7\u5236\u5668probe liveness\u6821\u9a8c\u5931\u8d25\uff0c\u5bfc\u81f4\u65e0\u6cd5\u542f\u52a8"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\u73af\u5883",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Azure VM (Ubuntu 22.04)")))),(0,r.kt)("h4",{id:"\u95ee\u9898\u91cd\u73b0"},"\u95ee\u9898\u91cd\u73b0"),(0,r.kt)("p",null,"\u8fd0\u884c",(0,r.kt)("inlineCode",{parentName:"p"},"helm install --wait -n u4a-system u4a-component ."),"\u540e\uff0c\u53d1\u73b0\u79df\u6237\u7ba1\u7406\u63a7\u5236\u5668\u4e00\u76f4\u5904\u4e8e",(0,r.kt)("inlineCode",{parentName:"p"},"CrashLoopBackOff"),"\u72b6\u6001:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"\u279c ~ k get pods -nu4a-system\nNAME READY STATUS RESTARTS AGE\nbff-server-9cc54cbc5-gcp6x 1/1 Running 0 17m\ncapsule-controller-manager-5b9864f9bf-7mkhb 0/1 CrashLoopBackOff 8 (27s ago) 17m\ncert-manager-79d7998d9-c7q8n 1/1 Running 0 33m\ncert-manager-cainjector-57bb7f44dd-c9sj6 1/1 Running 0 33m\ncert-manager-webhook-65b494ccf4-4blzx 1/1 Running 0 33m\ncluster-component-ingress-nginx-controller-86d6bfdbf6-qj6hf 1/1 Running 0 33m\nkube-oidc-proxy-fc6b54b8c-ddc2s 1/1 Running 0 17m\noidc-server-84cbfcc9f5-bmmf9 2/2 Running 0 17m\nresource-view-controller-94645667-ttvst 1/1 Running 0 17m\n")),(0,r.kt)("p",null,"\u67e5\u770b\u65e5\u5fd7\u53d1\u73b0\u5982\u4e0b\u9519\u8bef\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},'Events:\n Type Reason Age From Message\n ---- ------ ---- ---- -------\n Normal Scheduled 4m35s default-scheduler Successfully assigned u4a-system/capsule-controller-manager-5b9864f9bf-7mkhb to kubebb-core-worker\n Normal Pulling 4m34s kubelet Pulling image "hub.tenxcloud.com/u4a-component/capsule:v0.1.2-20221122"\n Normal Pulled 3m57s kubelet Successfully pulled image "hub.tenxcloud.com/u4a-component/capsule:v0.1.2-20221122" in 36.616134797s\n Warning Unhealthy 3m53s kubelet Liveness probe failed: Get "http://10.244.1.6:10080/healthz": context deadline exceeded (Client.Timeout exceeded while awaiting headers)\n Warning Unhealthy 3m44s kubelet Readiness probe failed: Get "http://10.244.1.6:10080/readyz": dial tcp 10.244.1.6:10080: connect: connection refused\n Warning Unhealthy 3m44s kubelet Liveness probe failed: Get "http://10.244.1.6:10080/healthz": dial tcp 10.244.1.6:10080: connect: connection refused\n Normal Created 3m34s (x3 over 3m57s) kubelet Created container manager\n Normal Started 3m34s (x3 over 3m57s) kubelet Started container manager\n Warning Unhealthy 3m31s (x7 over 3m55s) kubelet Readiness probe failed: Get "http://10.244.1.6:10080/readyz": context deadline exceeded (Client.Timeout exceeded while awaiting headers)\n Warning BackOff 3m13s (x4 over 3m42s) kubelet Back-off restarting failed container\n Normal Pulled 3m1s (x3 over 3m50s) kubelet Container image "hub.tenxcloud.com/u4a-component/capsule:v0.1.2-20221122" already present on machine\n')),(0,r.kt)("h4",{id:"\u95ee\u9898\u539f\u56e0"},"\u95ee\u9898\u539f\u56e0"),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"\u611f\u8c22 @0xff-dev \u63d0\u4f9b\u7684\u89e3\u51b3\u65b9\u6848")),(0,r.kt)("p",null,"\u53bb\u9664liveness probe\u540e\uff0c\u80fd\u770b\u5230\u5bb9\u5668\u62a5\u9519\uff0c\u53d1\u73b0\u662f\u7531\u4e8ecapsule\u521d\u59cb\u5316\u8fc7\u7a0b\u4e2d\u8d85\u51fa\u4e86\u64cd\u4f5c\u7cfb\u7edf\u5141\u8bb8\u7684\u6700\u5927\u6587\u4ef6\u6253\u5f00\u6570\uff0c\u5bfc\u81f4capsule\u65e0\u6cd5\u542f\u52a8\u3002"),(0,r.kt)("h4",{id:"\u89e3\u51b3\u65b9\u6848"},"\u89e3\u51b3\u65b9\u6848"),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"\u611f\u8c22 @0xff-dev \u63d0\u4f9b\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u9700\u8bbe\u7f6e fs.inotify.max_user_instances=81920")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"\u7531\u5fae\u8f6f\u7684New Bing\u89e3\u7b54\u5f97\u5230\u7684\u7b54\u6848\uff1a")),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"fs.inotify.max_user_instances")," \u662f\u4e00\u4e2a\u5185\u6838\u53c2\u6570\uff0c\u5b83\u8868\u793a\u6bcf\u4e2a\u7528\u6237\u53ef\u4ee5\u521b\u5efa\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"inotify")," \u5b9e\u4f8b\u7684\u6700\u5927\u6570\u91cf\u3002",(0,r.kt)("inlineCode",{parentName:"p"},"inotify")," \u662f\u4e00\u4e2a\u7528\u6765\u76d1\u89c6\u6587\u4ef6\u7cfb\u7edf\u53d8\u5316\u7684\u673a\u5236\u3002\u5982\u679c\u4f60\u60f3\u8981\u4fee\u6539\u8fd9\u4e2a\u53c2\u6570\uff0c\u4f60\u6709\u4e24\u79cd\u65b9\u6cd5\uff1a"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\u4e34\u65f6\u4fee\u6539\uff1a\u4f60\u53ef\u4ee5\u4f7f\u7528 sysctl -w \u547d\u4ee4\u6765\u4e34\u65f6\u4fee\u6539\u8fd9\u4e2a\u53c2\u6570\uff0c\u4f8b\u5982\uff1a")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo sysctl -w fs.inotify.max_user_instances=81920\n")),(0,r.kt)("p",null,"\u8fd9\u4e2a\u547d\u4ee4\u4f1a\u628a ",(0,r.kt)("inlineCode",{parentName:"p"},"fs.inotify.max_user_instances")," \u7684\u503c\u8bbe\u7f6e\u4e3a 81920\uff0c\u5e76\u5199\u5165",(0,r.kt)("inlineCode",{parentName:"p"},"/proc/sys/fs/inotify/max_user_instances")," \u6587\u4ef6\u3002\u4f46\u662f\u8fd9\u4e2a\u4fee\u6539\u53ea\u5728\u91cd\u542f\u4e4b\u524d\u6709\u6548\uff0c\u91cd\u542f\u540e\u4f1a\u6062\u590d\u9ed8\u8ba4\u503c\u3002"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\u6c38\u4e45\u4fee\u6539\uff1a\u4f60\u53ef\u4ee5\u5728 /etc/sysctl.conf \u6587\u4ef6\u4e2d\u6dfb\u52a0\u4e00\u884c\uff1a")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"fs.inotify.max_user_instances=81920\n")),(0,r.kt)("p",null,"\u7136\u540e\u8fd0\u884c ",(0,r.kt)("inlineCode",{parentName:"p"},"sudo sysctl -p"),"\u547d\u4ee4\u6765\u52a0\u8f7d\u8fd9\u4e2a\u6587\u4ef6\u4e2d\u7684\u8bbe\u7f6e\u3002\u8fd9\u6837\uff0c\u8fd9\u4e2a\u4fee\u6539\u5c31\u4f1a\u5728\u6bcf\u6b21\u91cd\u542f\u540e\u751f\u6548\u3002"),(0,r.kt)("p",null,"\u5982\u679c\u4f60\u60f3\u4e86\u89e3\u66f4\u591a\u5173\u4e8e sysctl \u548c fs.inotify.max_user_instances \u7684\u4fe1\u606f\uff0c\u8bf7\u53c2\u8003\u4ee5\u4e0b\u94fe\u63a5\uff1a"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://www.suse.com/support/kb/doc/?id=000020048"},"How to increase the inotify.max_user_watches and inotify.max_user_instances sysctls on a Linux host | Support | SUSE")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://unix.stackexchange.com/questions/444998/how-to-set-and-understand-fs-notify-max-user-watches"},"How to set and understand fs.notify.max_user_watches - Unix & Linux Stack Exchange")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://askubuntu.com/questions/1068168/sysctl-permission-denied-on-key-fs-inotify-max-user-watches"},"sysctl: permission denied on key 'fs.inotify.max_user_watches' - Ask Ubuntu"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/en/assets/js/runtime~main.76702a4e.js b/en/assets/js/runtime~main.86dc9b1a.js similarity index 97% rename from en/assets/js/runtime~main.76702a4e.js rename to en/assets/js/runtime~main.86dc9b1a.js index b34bd075b..8f390968b 100644 --- a/en/assets/js/runtime~main.76702a4e.js +++ b/en/assets/js/runtime~main.86dc9b1a.js @@ -1 +1 @@ -(()=>{"use strict";var e,a,f,c,d,t={},r={};function b(e){var a=r[e];if(void 0!==a)return a.exports;var f=r[e]={id:e,loaded:!1,exports:{}};return t[e].call(f.exports,f,f.exports,b),f.loaded=!0,f.exports}b.m=t,b.c=r,e=[],b.O=(a,f,c,d)=>{if(!f){var t=1/0;for(i=0;i=d)&&Object.keys(b.O).every((e=>b.O[e](f[o])))?f.splice(o--,1):(r=!1,d0&&e[i-1][2]>d;i--)e[i]=e[i-1];e[i]=[f,c,d]},b.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return b.d(a,{a:a}),a},f=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,b.t=function(e,c){if(1&c&&(e=this(e)),8&c)return e;if("object"==typeof e&&e){if(4&c&&e.__esModule)return e;if(16&c&&"function"==typeof e.then)return e}var d=Object.create(null);b.r(d);var t={};a=a||[null,f({}),f([]),f(f)];for(var r=2&c&&e;"object"==typeof r&&!~a.indexOf(r);r=f(r))Object.getOwnPropertyNames(r).forEach((a=>t[a]=()=>e[a]));return t.default=()=>e,b.d(d,t),d},b.d=(e,a)=>{for(var f in a)b.o(a,f)&&!b.o(e,f)&&Object.defineProperty(e,f,{enumerable:!0,get:a[f]})},b.f={},b.e=e=>Promise.all(Object.keys(b.f).reduce(((a,f)=>(b.f[f](e,a),a)),[])),b.u=e=>"assets/js/"+({53:"935f2afb",99:"3d36d8f8",277:"c4348237",948:"8717b14a",1285:"5c4c6e60",1352:"1a244cdc",1383:"449dbafe",1505:"7c2ff145",1599:"6dc07dca",1649:"8d745e6e",1808:"2aa8b0d3",1914:"d9f32620",2237:"acf368fd",2267:"59362658",2352:"4a2fc361",2362:"e273c56f",2535:"814f3328",2774:"22646bfb",3085:"1f391b9e",3089:"a6aa9e1f",3514:"73664a40",3608:"9e4087bc",3957:"27015b90",4013:"01a85c17",4195:"c4f5d8e4",4288:"ad895e75",4776:"552535a5",4823:"cd7e3398",5062:"69369ae2",5070:"62fa1b0b",5513:"6f9ac6d0",5604:"4c747d7c",5662:"3c7910a2",5680:"ff43d3e1",5819:"809ee581",6004:"a76bfff0",6070:"27a2546e",6103:"ccc49370",6210:"180ea7ad",6287:"e90a2c2a",6306:"1d408bef",6320:"647f233e",6513:"1bba06cb",6741:"791926a5",6890:"41ebaef0",7133:"f03e9ca9",7331:"e6809710",7414:"393be207",7492:"81fe2174",7494:"da46f5e6",7527:"f345e2d0",7745:"085a15b4",7918:"17896441",7960:"ef6edb73",8288:"3fabc7c4",8610:"6875c492",8636:"f4f34a3a",8916:"e0f3ca4f",8994:"9546be45",9003:"925b3f96",9067:"c4afd168",9449:"3724ddc1",9514:"1be78505",9575:"a5ddeb9f",9642:"7661071f",9671:"0e384e19",9723:"9684cbb9",9735:"4ba7e5a3",9817:"14eb3368"}[e]||e)+"."+{53:"6b738667",99:"6347763c",210:"4d2f5804",277:"4c140266",948:"269a85c1",1285:"1d7ed2b4",1352:"73b27d4e",1383:"c313d4a9",1505:"d5ffaf36",1599:"3a4880a7",1649:"118ef3a0",1808:"f5bf5a84",1914:"2f150157",2237:"71c95c9b",2267:"d3cf6c5a",2352:"4b2855a7",2362:"04a690f5",2529:"da2bcb01",2535:"bee19867",2774:"42e0ad33",3085:"f8464388",3089:"1e1af270",3514:"5501e765",3608:"9a815895",3957:"f873f70e",4013:"5653d10a",4195:"ca1028d5",4288:"59c72d26",4776:"aa34f3f9",4823:"3ed81743",4972:"9374abde",5062:"f229d6b9",5070:"868a5eef",5513:"919f99df",5604:"93f8f9a8",5662:"562a6b8c",5680:"ff8c6bf7",5819:"5b0206ca",6004:"5b2e32b3",6070:"1e485dfc",6103:"5cfe080a",6210:"003bea24",6287:"c8bc7b7c",6306:"107a45a6",6320:"756b4535",6513:"e19b8d88",6741:"c805817d",6890:"7dc153b4",7133:"49612467",7331:"266ff867",7414:"c124ecc0",7492:"6bbee95d",7494:"c2895288",7527:"cd8f643f",7745:"2cf66abc",7918:"bacd5894",7960:"b2e20e23",8288:"2065d837",8610:"da158881",8636:"23a4200e",8916:"698b311a",8994:"1bf24f03",9003:"c4db91ca",9067:"9e952f7b",9449:"5128ca28",9514:"82b3557a",9575:"125052c9",9642:"3fa71cce",9671:"d29f5086",9723:"09e27ee5",9735:"47c0bba1",9817:"3bb53ce2"}[e]+".js",b.miniCssF=e=>{},b.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),b.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),c={},d="website:",b.l=(e,a,f,t)=>{if(c[e])c[e].push(a);else{var r,o;if(void 0!==f)for(var n=document.getElementsByTagName("script"),i=0;i{r.onerror=r.onload=null,clearTimeout(s);var d=c[e];if(delete c[e],r.parentNode&&r.parentNode.removeChild(r),d&&d.forEach((e=>e(f))),a)return a(f)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:r}),12e4);r.onerror=l.bind(null,r.onerror),r.onload=l.bind(null,r.onload),o&&document.head.appendChild(r)}},b.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},b.p="/website/en/",b.gca=function(e){return e={17896441:"7918",59362658:"2267","935f2afb":"53","3d36d8f8":"99",c4348237:"277","8717b14a":"948","5c4c6e60":"1285","1a244cdc":"1352","449dbafe":"1383","7c2ff145":"1505","6dc07dca":"1599","8d745e6e":"1649","2aa8b0d3":"1808",d9f32620:"1914",acf368fd:"2237","4a2fc361":"2352",e273c56f:"2362","814f3328":"2535","22646bfb":"2774","1f391b9e":"3085",a6aa9e1f:"3089","73664a40":"3514","9e4087bc":"3608","27015b90":"3957","01a85c17":"4013",c4f5d8e4:"4195",ad895e75:"4288","552535a5":"4776",cd7e3398:"4823","69369ae2":"5062","62fa1b0b":"5070","6f9ac6d0":"5513","4c747d7c":"5604","3c7910a2":"5662",ff43d3e1:"5680","809ee581":"5819",a76bfff0:"6004","27a2546e":"6070",ccc49370:"6103","180ea7ad":"6210",e90a2c2a:"6287","1d408bef":"6306","647f233e":"6320","1bba06cb":"6513","791926a5":"6741","41ebaef0":"6890",f03e9ca9:"7133",e6809710:"7331","393be207":"7414","81fe2174":"7492",da46f5e6:"7494",f345e2d0:"7527","085a15b4":"7745",ef6edb73:"7960","3fabc7c4":"8288","6875c492":"8610",f4f34a3a:"8636",e0f3ca4f:"8916","9546be45":"8994","925b3f96":"9003",c4afd168:"9067","3724ddc1":"9449","1be78505":"9514",a5ddeb9f:"9575","7661071f":"9642","0e384e19":"9671","9684cbb9":"9723","4ba7e5a3":"9735","14eb3368":"9817"}[e]||e,b.p+b.u(e)},(()=>{var e={1303:0,532:0};b.f.j=(a,f)=>{var c=b.o(e,a)?e[a]:void 0;if(0!==c)if(c)f.push(c[2]);else if(/^(1303|532)$/.test(a))e[a]=0;else{var d=new Promise(((f,d)=>c=e[a]=[f,d]));f.push(c[2]=d);var t=b.p+b.u(a),r=new Error;b.l(t,(f=>{if(b.o(e,a)&&(0!==(c=e[a])&&(e[a]=void 0),c)){var d=f&&("load"===f.type?"missing":f.type),t=f&&f.target&&f.target.src;r.message="Loading chunk "+a+" failed.\n("+d+": "+t+")",r.name="ChunkLoadError",r.type=d,r.request=t,c[1](r)}}),"chunk-"+a,a)}},b.O.j=a=>0===e[a];var a=(a,f)=>{var c,d,t=f[0],r=f[1],o=f[2],n=0;if(t.some((a=>0!==e[a]))){for(c in r)b.o(r,c)&&(b.m[c]=r[c]);if(o)var i=o(b)}for(a&&a(f);n{"use strict";var e,a,f,c,d,t={},r={};function b(e){var a=r[e];if(void 0!==a)return a.exports;var f=r[e]={id:e,loaded:!1,exports:{}};return t[e].call(f.exports,f,f.exports,b),f.loaded=!0,f.exports}b.m=t,b.c=r,e=[],b.O=(a,f,c,d)=>{if(!f){var t=1/0;for(i=0;i=d)&&Object.keys(b.O).every((e=>b.O[e](f[o])))?f.splice(o--,1):(r=!1,d0&&e[i-1][2]>d;i--)e[i]=e[i-1];e[i]=[f,c,d]},b.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return b.d(a,{a:a}),a},f=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,b.t=function(e,c){if(1&c&&(e=this(e)),8&c)return e;if("object"==typeof e&&e){if(4&c&&e.__esModule)return e;if(16&c&&"function"==typeof e.then)return e}var d=Object.create(null);b.r(d);var t={};a=a||[null,f({}),f([]),f(f)];for(var r=2&c&&e;"object"==typeof r&&!~a.indexOf(r);r=f(r))Object.getOwnPropertyNames(r).forEach((a=>t[a]=()=>e[a]));return t.default=()=>e,b.d(d,t),d},b.d=(e,a)=>{for(var f in a)b.o(a,f)&&!b.o(e,f)&&Object.defineProperty(e,f,{enumerable:!0,get:a[f]})},b.f={},b.e=e=>Promise.all(Object.keys(b.f).reduce(((a,f)=>(b.f[f](e,a),a)),[])),b.u=e=>"assets/js/"+({53:"935f2afb",99:"3d36d8f8",277:"c4348237",948:"8717b14a",1285:"5c4c6e60",1352:"1a244cdc",1383:"449dbafe",1505:"7c2ff145",1599:"6dc07dca",1649:"8d745e6e",1808:"2aa8b0d3",1914:"d9f32620",2237:"acf368fd",2267:"59362658",2352:"4a2fc361",2362:"e273c56f",2535:"814f3328",2774:"22646bfb",3085:"1f391b9e",3089:"a6aa9e1f",3514:"73664a40",3608:"9e4087bc",3957:"27015b90",4013:"01a85c17",4195:"c4f5d8e4",4288:"ad895e75",4776:"552535a5",4823:"cd7e3398",5062:"69369ae2",5070:"62fa1b0b",5513:"6f9ac6d0",5604:"4c747d7c",5662:"3c7910a2",5680:"ff43d3e1",5819:"809ee581",6004:"a76bfff0",6070:"27a2546e",6103:"ccc49370",6210:"180ea7ad",6287:"e90a2c2a",6306:"1d408bef",6320:"647f233e",6513:"1bba06cb",6741:"791926a5",6890:"41ebaef0",7133:"f03e9ca9",7331:"e6809710",7414:"393be207",7492:"81fe2174",7494:"da46f5e6",7527:"f345e2d0",7745:"085a15b4",7918:"17896441",7960:"ef6edb73",8288:"3fabc7c4",8610:"6875c492",8636:"f4f34a3a",8916:"e0f3ca4f",8994:"9546be45",9003:"925b3f96",9067:"c4afd168",9449:"3724ddc1",9514:"1be78505",9575:"a5ddeb9f",9642:"7661071f",9671:"0e384e19",9723:"9684cbb9",9735:"4ba7e5a3",9817:"14eb3368"}[e]||e)+"."+{53:"eb9c6d9f",99:"6347763c",210:"4d2f5804",277:"4c140266",948:"269a85c1",1285:"1d7ed2b4",1352:"73b27d4e",1383:"c313d4a9",1505:"d5ffaf36",1599:"3a4880a7",1649:"118ef3a0",1808:"f5bf5a84",1914:"2f150157",2237:"71c95c9b",2267:"d3cf6c5a",2352:"4b2855a7",2362:"04a690f5",2529:"da2bcb01",2535:"bee19867",2774:"42e0ad33",3085:"f8464388",3089:"1e1af270",3514:"5501e765",3608:"9a815895",3957:"f873f70e",4013:"5653d10a",4195:"ca1028d5",4288:"c6c25b05",4776:"aa34f3f9",4823:"3ed81743",4972:"9374abde",5062:"f229d6b9",5070:"868a5eef",5513:"919f99df",5604:"93f8f9a8",5662:"562a6b8c",5680:"ff8c6bf7",5819:"5b0206ca",6004:"5b2e32b3",6070:"1e485dfc",6103:"5cfe080a",6210:"003bea24",6287:"c8bc7b7c",6306:"107a45a6",6320:"756b4535",6513:"e19b8d88",6741:"fffb601c",6890:"7dc153b4",7133:"49612467",7331:"266ff867",7414:"c124ecc0",7492:"6bbee95d",7494:"c2895288",7527:"cd8f643f",7745:"2cf66abc",7918:"bacd5894",7960:"b2e20e23",8288:"2065d837",8610:"da158881",8636:"23a4200e",8916:"698b311a",8994:"1bf24f03",9003:"c4db91ca",9067:"9e952f7b",9449:"5128ca28",9514:"82b3557a",9575:"125052c9",9642:"3fa71cce",9671:"d29f5086",9723:"09e27ee5",9735:"47c0bba1",9817:"3bb53ce2"}[e]+".js",b.miniCssF=e=>{},b.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),b.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),c={},d="website:",b.l=(e,a,f,t)=>{if(c[e])c[e].push(a);else{var r,o;if(void 0!==f)for(var n=document.getElementsByTagName("script"),i=0;i{r.onerror=r.onload=null,clearTimeout(s);var d=c[e];if(delete c[e],r.parentNode&&r.parentNode.removeChild(r),d&&d.forEach((e=>e(f))),a)return a(f)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:r}),12e4);r.onerror=l.bind(null,r.onerror),r.onload=l.bind(null,r.onload),o&&document.head.appendChild(r)}},b.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},b.p="/website/en/",b.gca=function(e){return e={17896441:"7918",59362658:"2267","935f2afb":"53","3d36d8f8":"99",c4348237:"277","8717b14a":"948","5c4c6e60":"1285","1a244cdc":"1352","449dbafe":"1383","7c2ff145":"1505","6dc07dca":"1599","8d745e6e":"1649","2aa8b0d3":"1808",d9f32620:"1914",acf368fd:"2237","4a2fc361":"2352",e273c56f:"2362","814f3328":"2535","22646bfb":"2774","1f391b9e":"3085",a6aa9e1f:"3089","73664a40":"3514","9e4087bc":"3608","27015b90":"3957","01a85c17":"4013",c4f5d8e4:"4195",ad895e75:"4288","552535a5":"4776",cd7e3398:"4823","69369ae2":"5062","62fa1b0b":"5070","6f9ac6d0":"5513","4c747d7c":"5604","3c7910a2":"5662",ff43d3e1:"5680","809ee581":"5819",a76bfff0:"6004","27a2546e":"6070",ccc49370:"6103","180ea7ad":"6210",e90a2c2a:"6287","1d408bef":"6306","647f233e":"6320","1bba06cb":"6513","791926a5":"6741","41ebaef0":"6890",f03e9ca9:"7133",e6809710:"7331","393be207":"7414","81fe2174":"7492",da46f5e6:"7494",f345e2d0:"7527","085a15b4":"7745",ef6edb73:"7960","3fabc7c4":"8288","6875c492":"8610",f4f34a3a:"8636",e0f3ca4f:"8916","9546be45":"8994","925b3f96":"9003",c4afd168:"9067","3724ddc1":"9449","1be78505":"9514",a5ddeb9f:"9575","7661071f":"9642","0e384e19":"9671","9684cbb9":"9723","4ba7e5a3":"9735","14eb3368":"9817"}[e]||e,b.p+b.u(e)},(()=>{var e={1303:0,532:0};b.f.j=(a,f)=>{var c=b.o(e,a)?e[a]:void 0;if(0!==c)if(c)f.push(c[2]);else if(/^(1303|532)$/.test(a))e[a]=0;else{var d=new Promise(((f,d)=>c=e[a]=[f,d]));f.push(c[2]=d);var t=b.p+b.u(a),r=new Error;b.l(t,(f=>{if(b.o(e,a)&&(0!==(c=e[a])&&(e[a]=void 0),c)){var d=f&&("load"===f.type?"missing":f.type),t=f&&f.target&&f.target.src;r.message="Loading chunk "+a+" failed.\n("+d+": "+t+")",r.name="ChunkLoadError",r.type=d,r.request=t,c[1](r)}}),"chunk-"+a,a)}},b.O.j=a=>0===e[a];var a=(a,f)=>{var c,d,t=f[0],r=f[1],o=f[2],n=0;if(t.some((a=>0!==e[a]))){for(c in r)b.o(r,c)&&(b.m[c]=r[c]);if(o)var i=o(b)}for(a&&a(f);n Archive | Framework as a Building Block for Kubernetes - + - + \ No newline at end of file diff --git a/en/blog/first-blog-post/index.html b/en/blog/first-blog-post/index.html index 59ff5dcb0..5a34d0dd8 100644 --- a/en/blog/first-blog-post/index.html +++ b/en/blog/first-blog-post/index.html @@ -5,13 +5,13 @@ First Blog Post | Framework as a Building Block for Kubernetes - +

    First Blog Post

    · One min read
    Gao Wei

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

    - + \ No newline at end of file diff --git a/en/blog/index.html b/en/blog/index.html index f8b444108..84599f14b 100644 --- a/en/blog/index.html +++ b/en/blog/index.html @@ -5,13 +5,13 @@ Blog | Framework as a Building Block for Kubernetes - +

    · One min read
    Sébastien Lorber
    Yangshun Tay

    Docusaurus blogging features are powered by the blog plugin.

    Simply add Markdown files (or folders) to the blog directory.

    Regular blog authors can be added to authors.yml.

    The blog post date can be extracted from filenames, such as:

    • 2019-05-30-welcome.md
    • 2019-05-30-welcome/index.md

    A blog post folder can be convenient to co-locate blog post images:

    Docusaurus Plushie

    The blog supports tags as well!

    And if you don't want a blog: just delete this directory, and use blog: false in your Docusaurus config.

    · One min read
    Gao Wei

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

    - + \ No newline at end of file diff --git a/en/blog/long-blog-post/index.html b/en/blog/long-blog-post/index.html index dddf982c2..d920e92cf 100644 --- a/en/blog/long-blog-post/index.html +++ b/en/blog/long-blog-post/index.html @@ -5,13 +5,13 @@ Long Blog Post | Framework as a Building Block for Kubernetes - +

    Long Blog Post

    · 3 min read
    Endilie Yacop Sucipto

    This is the summary of a very long blog post,

    Use a <!-- truncate --> comment to limit blog post size in the list view.

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

    - + \ No newline at end of file diff --git a/en/blog/mdx-blog-post/index.html b/en/blog/mdx-blog-post/index.html index 237d2faa7..51c47d554 100644 --- a/en/blog/mdx-blog-post/index.html +++ b/en/blog/mdx-blog-post/index.html @@ -5,13 +5,13 @@ MDX Blog Post | Framework as a Building Block for Kubernetes - +

    MDX Blog Post

    · One min read
    Sébastien Lorber

    Blog posts support Docusaurus Markdown features, such as MDX.

    tip

    Use the power of React to create interactive blog posts.

    <button onClick={() => alert('button clicked!')}>Click me!</button>
    - + \ No newline at end of file diff --git a/en/blog/tags/docusaurus/index.html b/en/blog/tags/docusaurus/index.html index ac8664a0c..79440cb43 100644 --- a/en/blog/tags/docusaurus/index.html +++ b/en/blog/tags/docusaurus/index.html @@ -5,13 +5,13 @@ 4 posts tagged with "docusaurus" | Framework as a Building Block for Kubernetes - +

    4 posts tagged with "docusaurus"

    View All Tags

    · One min read
    Sébastien Lorber
    Yangshun Tay

    Docusaurus blogging features are powered by the blog plugin.

    Simply add Markdown files (or folders) to the blog directory.

    Regular blog authors can be added to authors.yml.

    The blog post date can be extracted from filenames, such as:

    • 2019-05-30-welcome.md
    • 2019-05-30-welcome/index.md

    A blog post folder can be convenient to co-locate blog post images:

    Docusaurus Plushie

    The blog supports tags as well!

    And if you don't want a blog: just delete this directory, and use blog: false in your Docusaurus config.

    · One min read
    Gao Wei

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

    - + \ No newline at end of file diff --git a/en/blog/tags/facebook/index.html b/en/blog/tags/facebook/index.html index ee0b05a84..3884676b0 100644 --- a/en/blog/tags/facebook/index.html +++ b/en/blog/tags/facebook/index.html @@ -5,13 +5,13 @@ One post tagged with "facebook" | Framework as a Building Block for Kubernetes - +

    One post tagged with "facebook"

    View All Tags

    · One min read
    Sébastien Lorber
    Yangshun Tay

    Docusaurus blogging features are powered by the blog plugin.

    Simply add Markdown files (or folders) to the blog directory.

    Regular blog authors can be added to authors.yml.

    The blog post date can be extracted from filenames, such as:

    • 2019-05-30-welcome.md
    • 2019-05-30-welcome/index.md

    A blog post folder can be convenient to co-locate blog post images:

    Docusaurus Plushie

    The blog supports tags as well!

    And if you don't want a blog: just delete this directory, and use blog: false in your Docusaurus config.

    - + \ No newline at end of file diff --git a/en/blog/tags/hello/index.html b/en/blog/tags/hello/index.html index f26a78e76..87cd672d3 100644 --- a/en/blog/tags/hello/index.html +++ b/en/blog/tags/hello/index.html @@ -5,13 +5,13 @@ 2 posts tagged with "hello" | Framework as a Building Block for Kubernetes - +

    2 posts tagged with "hello"

    View All Tags

    · One min read
    Sébastien Lorber
    Yangshun Tay

    Docusaurus blogging features are powered by the blog plugin.

    Simply add Markdown files (or folders) to the blog directory.

    Regular blog authors can be added to authors.yml.

    The blog post date can be extracted from filenames, such as:

    • 2019-05-30-welcome.md
    • 2019-05-30-welcome/index.md

    A blog post folder can be convenient to co-locate blog post images:

    Docusaurus Plushie

    The blog supports tags as well!

    And if you don't want a blog: just delete this directory, and use blog: false in your Docusaurus config.

    - + \ No newline at end of file diff --git a/en/blog/tags/hola/index.html b/en/blog/tags/hola/index.html index edba06192..139b5f2dd 100644 --- a/en/blog/tags/hola/index.html +++ b/en/blog/tags/hola/index.html @@ -5,13 +5,13 @@ One post tagged with "hola" | Framework as a Building Block for Kubernetes - +

    One post tagged with "hola"

    View All Tags

    · One min read
    Gao Wei

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

    - + \ No newline at end of file diff --git a/en/blog/tags/index.html b/en/blog/tags/index.html index 7037f5d8f..f9da3a21c 100644 --- a/en/blog/tags/index.html +++ b/en/blog/tags/index.html @@ -5,13 +5,13 @@ Tags | Framework as a Building Block for Kubernetes - + - + \ No newline at end of file diff --git a/en/blog/welcome/index.html b/en/blog/welcome/index.html index 022dac6f7..ef92b4dc9 100644 --- a/en/blog/welcome/index.html +++ b/en/blog/welcome/index.html @@ -5,13 +5,13 @@ Welcome | Framework as a Building Block for Kubernetes - +

    Welcome

    · One min read
    Sébastien Lorber
    Yangshun Tay

    Docusaurus blogging features are powered by the blog plugin.

    Simply add Markdown files (or folders) to the blog directory.

    Regular blog authors can be added to authors.yml.

    The blog post date can be extracted from filenames, such as:

    • 2019-05-30-welcome.md
    • 2019-05-30-welcome/index.md

    A blog post folder can be convenient to co-locate blog post images:

    Docusaurus Plushie

    The blog supports tags as well!

    And if you don't want a blog: just delete this directory, and use blog: false in your Docusaurus config.

    - + \ No newline at end of file diff --git a/en/docs/FAQ/index.html b/en/docs/FAQ/index.html index 61b2be62c..7023f695e 100644 --- a/en/docs/FAQ/index.html +++ b/en/docs/FAQ/index.html @@ -3,15 +3,15 @@ -常见问题 | Framework as a Building Block for Kubernetes +常见问题 | Framework as a Building Block for Kubernetes - +
    -

    常见问题

    BuildingBase部署

    1. 租户管理控制器probe liveness校验失败,导致无法启动

    • 环境
      • Azure VM (Ubuntu 22.04)

    问题重现

    运行helm install --wait -n u4a-system u4a-component .后,发现租户管理控制器一直处于CrashLoopBackOff状态:

    ➜  ~ k get pods -nu4a-system
    NAME READY STATUS RESTARTS AGE
    bff-server-9cc54cbc5-gcp6x 1/1 Running 0 17m
    capsule-controller-manager-5b9864f9bf-7mkhb 0/1 CrashLoopBackOff 8 (27s ago) 17m
    cert-manager-79d7998d9-c7q8n 1/1 Running 0 33m
    cert-manager-cainjector-57bb7f44dd-c9sj6 1/1 Running 0 33m
    cert-manager-webhook-65b494ccf4-4blzx 1/1 Running 0 33m
    cluster-component-ingress-nginx-controller-86d6bfdbf6-qj6hf 1/1 Running 0 33m
    kube-oidc-proxy-fc6b54b8c-ddc2s 1/1 Running 0 17m
    oidc-server-84cbfcc9f5-bmmf9 2/2 Running 0 17m
    resource-view-controller-94645667-ttvst 1/1 Running 0 17m

    查看日志发现如下错误:

    Events:
    Type Reason Age From Message
    ---- ------ ---- ---- -------
    Normal Scheduled 4m35s default-scheduler Successfully assigned u4a-system/capsule-controller-manager-5b9864f9bf-7mkhb to kubebb-core-worker
    Normal Pulling 4m34s kubelet Pulling image "hub.tenxcloud.com/u4a-component/capsule:v0.1.2-20221122"
    Normal Pulled 3m57s kubelet Successfully pulled image "hub.tenxcloud.com/u4a-component/capsule:v0.1.2-20221122" in 36.616134797s
    Warning Unhealthy 3m53s kubelet Liveness probe failed: Get "http://10.244.1.6:10080/healthz": context deadline exceeded (Client.Timeout exceeded while awaiting headers)
    Warning Unhealthy 3m44s kubelet Readiness probe failed: Get "http://10.244.1.6:10080/readyz": dial tcp 10.244.1.6:10080: connect: connection refused
    Warning Unhealthy 3m44s kubelet Liveness probe failed: Get "http://10.244.1.6:10080/healthz": dial tcp 10.244.1.6:10080: connect: connection refused
    Normal Created 3m34s (x3 over 3m57s) kubelet Created container manager
    Normal Started 3m34s (x3 over 3m57s) kubelet Started container manager
    Warning Unhealthy 3m31s (x7 over 3m55s) kubelet Readiness probe failed: Get "http://10.244.1.6:10080/readyz": context deadline exceeded (Client.Timeout exceeded while awaiting headers)
    Warning BackOff 3m13s (x4 over 3m42s) kubelet Back-off restarting failed container
    Normal Pulled 3m1s (x3 over 3m50s) kubelet Container image "hub.tenxcloud.com/u4a-component/capsule:v0.1.2-20221122" already present on machine

    问题原因

    感谢 @0xff-dev 提供的解决方案

    去除liveness probe后,能看到容器报错,发现是由于capsule初始化过程中超出了操作系统允许的最大文件打开数,导致capsule无法启动。

    解决方案

    感谢 @0xff-dev 提供的解决方案,需设置 fs.inotify.max_user_instances=81920

    由微软的New Bing解答得到的答案:

    fs.inotify.max_user_instances 是一个内核参数,它表示每个用户可以创建的 inotify 实例的最大数量。inotify 是一个用来监视文件系统变化的机制。如果你想要修改这个参数,你有两种方法:

    • 临时修改:你可以使用 sysctl -w 命令来临时修改这个参数,例如:
    sudo sysctl -w fs.inotify.max_user_instances=81920

    这个命令会把 fs.inotify.max_user_instances 的值设置为 81920,并写入/proc/sys/fs/inotify/max_user_instances 文件。但是这个修改只在重启之前有效,重启后会恢复默认值。

    • 永久修改:你可以在 /etc/sysctl.conf 文件中添加一行:
    fs.inotify.max_user_instances=81920

    然后运行 sudo sysctl -p命令来加载这个文件中的设置。这样,这个修改就会在每次重启后生效。

    如果你想了解更多关于 sysctl 和 fs.inotify.max_user_instances 的信息,请参考以下链接:

    - +

    常见问题

    BuildingBase相关

    部署问题

    1. 租户管理控制器probe liveness校验失败,导致无法启动

    • 环境
      • Azure VM (Ubuntu 22.04)

    问题重现

    运行helm install --wait -n u4a-system u4a-component .后,发现租户管理控制器一直处于CrashLoopBackOff状态:

    ➜  ~ k get pods -nu4a-system
    NAME READY STATUS RESTARTS AGE
    bff-server-9cc54cbc5-gcp6x 1/1 Running 0 17m
    capsule-controller-manager-5b9864f9bf-7mkhb 0/1 CrashLoopBackOff 8 (27s ago) 17m
    cert-manager-79d7998d9-c7q8n 1/1 Running 0 33m
    cert-manager-cainjector-57bb7f44dd-c9sj6 1/1 Running 0 33m
    cert-manager-webhook-65b494ccf4-4blzx 1/1 Running 0 33m
    cluster-component-ingress-nginx-controller-86d6bfdbf6-qj6hf 1/1 Running 0 33m
    kube-oidc-proxy-fc6b54b8c-ddc2s 1/1 Running 0 17m
    oidc-server-84cbfcc9f5-bmmf9 2/2 Running 0 17m
    resource-view-controller-94645667-ttvst 1/1 Running 0 17m

    查看日志发现如下错误:

    Events:
    Type Reason Age From Message
    ---- ------ ---- ---- -------
    Normal Scheduled 4m35s default-scheduler Successfully assigned u4a-system/capsule-controller-manager-5b9864f9bf-7mkhb to kubebb-core-worker
    Normal Pulling 4m34s kubelet Pulling image "hub.tenxcloud.com/u4a-component/capsule:v0.1.2-20221122"
    Normal Pulled 3m57s kubelet Successfully pulled image "hub.tenxcloud.com/u4a-component/capsule:v0.1.2-20221122" in 36.616134797s
    Warning Unhealthy 3m53s kubelet Liveness probe failed: Get "http://10.244.1.6:10080/healthz": context deadline exceeded (Client.Timeout exceeded while awaiting headers)
    Warning Unhealthy 3m44s kubelet Readiness probe failed: Get "http://10.244.1.6:10080/readyz": dial tcp 10.244.1.6:10080: connect: connection refused
    Warning Unhealthy 3m44s kubelet Liveness probe failed: Get "http://10.244.1.6:10080/healthz": dial tcp 10.244.1.6:10080: connect: connection refused
    Normal Created 3m34s (x3 over 3m57s) kubelet Created container manager
    Normal Started 3m34s (x3 over 3m57s) kubelet Started container manager
    Warning Unhealthy 3m31s (x7 over 3m55s) kubelet Readiness probe failed: Get "http://10.244.1.6:10080/readyz": context deadline exceeded (Client.Timeout exceeded while awaiting headers)
    Warning BackOff 3m13s (x4 over 3m42s) kubelet Back-off restarting failed container
    Normal Pulled 3m1s (x3 over 3m50s) kubelet Container image "hub.tenxcloud.com/u4a-component/capsule:v0.1.2-20221122" already present on machine

    问题原因

    感谢 @0xff-dev 提供的解决方案

    去除liveness probe后,能看到容器报错,发现是由于capsule初始化过程中超出了操作系统允许的最大文件打开数,导致capsule无法启动。

    解决方案

    感谢 @0xff-dev 提供的解决方案,需设置 fs.inotify.max_user_instances=81920

    由微软的New Bing解答得到的答案:

    fs.inotify.max_user_instances 是一个内核参数,它表示每个用户可以创建的 inotify 实例的最大数量。inotify 是一个用来监视文件系统变化的机制。如果你想要修改这个参数,你有两种方法:

    • 临时修改:你可以使用 sysctl -w 命令来临时修改这个参数,例如:
    sudo sysctl -w fs.inotify.max_user_instances=81920

    这个命令会把 fs.inotify.max_user_instances 的值设置为 81920,并写入/proc/sys/fs/inotify/max_user_instances 文件。但是这个修改只在重启之前有效,重启后会恢复默认值。

    • 永久修改:你可以在 /etc/sysctl.conf 文件中添加一行:
    fs.inotify.max_user_instances=81920

    然后运行 sudo sysctl -p命令来加载这个文件中的设置。这样,这个修改就会在每次重启后生效。

    如果你想了解更多关于 sysctl 和 fs.inotify.max_user_instances 的信息,请参考以下链接:

    + \ No newline at end of file diff --git a/en/docs/building-base/configuration/3rd-party-account/index.html b/en/docs/building-base/configuration/3rd-party-account/index.html index 5e14c1c7a..0df9e7bb2 100644 --- a/en/docs/building-base/configuration/3rd-party-account/index.html +++ b/en/docs/building-base/configuration/3rd-party-account/index.html @@ -5,7 +5,7 @@ 使用第三方系统登录 | Framework as a Building Block for Kubernetes - + @@ -14,7 +14,7 @@ 图 1

  • 在左侧菜单导航处选择“应用”,然后在新建应用中,填写必要信息:

    • 名称:根据需要填写
    • 回调地址:<u4a-component 地址>/oidc/callback
    • 范围:勾选 read_user 和 openid 图 2
    1. 保存应用,点击页面下刚刚保存的应用,得到下图。 图 3

    记录 应用程序ID(clientid)、密码(clientsecret) 以及 回调 URL(redirecturl),需要在oidc-server 端进行相应配置。

    1. 编辑 oidc-server 的配置文件,增加一种新的 connector 配置,kubectl edit cm oidc-server -n u4a-system,按以下示例进行配置:
    connectors:
    - type: k8scrd
    ...
    - type: gitlab ## 固定值 gitlab
    name: gitlab ## 名称
    id: gitlab ## 固定值 gitlab
    config:
    baseURL: http://gitlab.172.22.50.155.nip.io ## gitlab对外访问的地址
    clientID: ef2b579e5b4c1cf9ae5b0b2acb166271ebff5892e84aa113689d4646ffcb29e7 ## gitlab配置的应用的clientID, 可在上一步骤”配置gitlab“中获取
    clientSecret: 3a9e79368a70bcdf1e4ac1df64e4220e7af798876333c9642a8edb782e6eb558 ## gitlab配置的应用的密码, 可在上一步骤”配置gitlab“中获取
    redirectURI: https://portal.172.22.96.209.nip.io/oidc/callback ## gitlab配置的callback地址, 可在上一步骤”配置gitlab“中获取
    1. 开启第三方系统对接,目前支持 gitlab/github 两种,仅需要将对应的 enabled 字段设置为 true 即可。
    • kubectl edit connector3rd connector3rd
    kind: Connector3rd
    metadata:
    annotations:
    helm.sh/hook: post-install,post-upgrade
    helm.sh/hook-weight: "-5"
    name: connector3rd
    spec:
    connectors:
    - description: gitlab description
    enabled: false # 修改为 true
    icon: <保持不变>
    id: gitlab
    name: gitlab
    - description: github description
    enabled: false
    icon: <保持不变>
    id: github
    name: github
    1. 配置完毕后,重启 oidc-server 服务即可生效,此时再次访问登录页面,既可看到对应的登录图标。

    图 4

    - + \ No newline at end of file diff --git a/en/docs/building-base/configuration/audit-config/index.html b/en/docs/building-base/configuration/audit-config/index.html index 3b22438d5..81bef9fd1 100644 --- a/en/docs/building-base/configuration/audit-config/index.html +++ b/en/docs/building-base/configuration/audit-config/index.html @@ -5,14 +5,14 @@ 配置审计能力 | Framework as a Building Block for Kubernetes - +

    配置审计能力

    1、编辑 audit-policy.yaml 文件对审计进行配置,kubectl edit cm audit-policy-conf -n u4a-system

    按照以下模式进行定义:

    apiVersion: audit.k8s.io/v1beta1
    kind: Policy
    # Don't generate audit events for all requests in RequestReceived stage.
    omitStages:
    - "RequestReceived"
    rules:
    # Don't audit namespace: kube-system/cluster-system/system-bigdata
    - level: None
    resources:
    - group: "" # core API group
    resources: ["secrets", "configmaps"]
    namespaces: ["kube-system", "cluster-system", "system-bigdata"]
    # Only enable 'write' verbs audit log for secret and configmap
    - level: Metadata
    verbs: ["create","delete","deletecollection","patch","update"]
    resources:
    - group: "" # core API group
    resources: ["secrets", "configmaps"]

    各个组件,需要根据自己的资源类型,来针对性的将自己的资源添加到审计的 rule 列表中,默认对写操作进行审计即可。

    2、配置 kube-apiserver 参数(也可以在 kube-oidc-proxy 上进行类似的配置,在无法操作原有 K8S 集群的条件下,使用 kube-oidc-proxy 的配置),添加:

    # 审计策略配置文件地址
    - --audit-policy-file=/etc/kubernetes/pki/audit-policy.yaml
    # 审计日志的路径文件
    - --audit-log-path=/var/log/apiserver/audit/audit.log
    # 日志保存策略
    - --audit-log-maxage=7
    - --audit-log-maxbackup=10
    - --audit-log-maxsize=10

    如果是在 K8S 上直接修改,则需要修改 /etc/kubernetes/manifests/kube-apiserver.yaml 来添加该参数,修改后确认 kube-apiserver 容器发生重启,此时配置才能生效

    3、配置 fluentd 进行采集(索引模版跟原来的 fluentd 冲突,所以需要单独的fluentd 进程专门采集 master 上的审计日志。 目前测试方法,从原有的 fluentd daemonset 复制一个,修改 ds 的名字,并使用以下配置文件进行挂载即可:

    apiVersion: v1
    data:
    fluent.conf: |2
    # for audit log
    <source>
    @type tail
    @id in_tail_kube_apiserver_audit
    multiline_flush_interval 5s
    path /var/log/apiserver/audit/audit.log
    pos_file /var/log/kube-apiserver-audit.log.pos
    tag kube-apiserver-audit
    <parse>
    @type json
    keep_time_key true
    time_key timestamp
    time_format %Y-%m-%dT%T.%L%Z
    </parse>
    </source>

    ## Used for health check
    <source>
    @type http
    port 9880
    bind 0.0.0.0
    </source>

    ## sink all log to elasticsearch directly
    <match **>
    @type elasticsearch
    @log_level debug
    include_tag_key true
    host elasticsearch-logging
    port 9200
    user "#{ENV['ES_USERNAME']}"
    password "#{ENV['ES_PASSWORD']}"
    scheme "#{ENV['ES_SCHEME']}"
    ca_file /etc/fluent/certs/ca.crt
    logstash_prefix audit-k8s
    logstash_format true
    # Set the chunk limit the same as for fluentd-gcp.
    reload_on_failure true
    reconnect_on_error true
    request_timeout 120s
    <buffer>
    @type file
    path /var/log/td-agent/buffer/elasticsearch
    chunk_limit_size 15MB
    total_limit_size 20GB
    flush_interval 3s
    flush_thread_count 8
    flush_mode interval
    # Never wait longer than 5 minutes between retries.
    retry_timeout 300
    retry_forever true
    </buffer>
    </match>
    kind: ConfigMap
    metadata:
    labels:
    component: fluentd
    k8s-app: fluentd
    # 新的 fluentd 使用这个 configmap
    name: fluentd-audit
    namespace: kube-system

    注意:

    • 新的 fluentd daemonset 只需要启动在 kube-oidc-proxy 部署的节点上(通过节点亲和性配置)
    • 将使用的 configmap 修改为上面的,名字 fluentd-audit

    4、最终在 es 里的审计记录格式如下,可以通过查询 es 来获取审计日志

    {
    "_index": "logstash-2022.08.20",
    "_type": "fluentd",
    "_id": "iRzLu4IBqmHyli33qpUa",
    "_version": 1,
    "_score": null,
    "_source": {
    "kind": "Event",
    "apiVersion": "audit.k8s.io/v1",
    "level": "Metadata",
    "auditID": "7c0072aa-b48a-4772-bc52-42e50c0e65ce",
    "stage": "ResponseComplete",
    "requestURI": "/api/v1/namespaces/addon-system/configmaps/42c733ea.clastix.capsule.io",
    "verb": "update",
    "user": {
    "username": "system:serviceaccount:addon-system:default",
    "uid": "c8cb442d-853c-4a53-9c83-c7a1520095c4",
    "groups": [
    "system:serviceaccounts",
    "system:serviceaccounts:addon-system",
    "system:authenticated"
    ]
    },
    "sourceIPs": [
    "172.22.96.146"
    ],
    "userAgent": "manager/v0.0.0 (linux/amd64) kubernetes/$Format/leader-election",
    "objectRef": {
    "resource": "configmaps",
    "namespace": "addon-system",
    "name": "42c733ea.clastix.capsule.io",
    "uid": "c4542d46-0e07-41be-8420-f912a2918e51",
    "apiVersion": "v1",
    "resourceVersion": "236579314"
    },
    "responseStatus": {
    "metadata": {},
    "code": 200
    },
    "requestReceivedTimestamp": "2022-08-20T15:07:41.991582Z",
    "stageTimestamp": "2022-08-20T15:07:42.000098Z",
    "annotations": {
    "authentication.k8s.io/legacy-token": "system:serviceaccount:addon-system:default",
    "authorization.k8s.io/decision": "allow",
    "authorization.k8s.io/reason": "RBAC: allowed by ClusterRoleBinding \"t7d.io.capsule-manager-rolebinding\" of ClusterRole \"cluster-admin\" to ServiceAccount \"default/addon-system\""
    },
    "@timestamp": "2022-08-20T15:07:42.000871648+00:00",
    "tag": "kube-apiserver-audit"
    },
    "fields": {
    "requestReceivedTimestamp": [
    "2022-08-20T15:07:41.991Z"
    ],
    "stageTimestamp": [
    "2022-08-20T15:07:42.000Z"
    ],
    "@timestamp": [
    "2022-08-20T15:07:42.000Z"
    ]
    },
    "sort": [
    1661008062000
    ]
    }

    5、如果不是标准的 K8S 资源类型的审计,应用/服务可以自己将审计写入到 /var/log/apiserver/audit 目录,比如命名为 service-audit.log,格式符合 K8S audit 消息格式即可,参考以下单条审计记录的格式:

    {"kind":"Event","apiVersion":"audit.k8s.io/v1","level":"Metadata","auditID":"8d8d8163-54e8-457d-94f6-7851e887f3cf","stage":"ResponseComplete","requestURI":"/api/v1/namespaces/u4a-system/secrets/sh.helm.release.v1.u4a-system.v1","verb":"delete","user":{"username":"admin","groups":["system:nodes","iam.tenxcloud.com"]},"sourceIPs":["172.16.31.254"],"userAgent":"helm/v0.0.0 (darwin/amd64) kubernetes/$Format","objectRef":{"resource":"secrets","namespace":"u4a-system","name":"sh.helm.release.v1.u4a-system.v1","apiVersion":"v1"},"responseStatus":{"metadata":{},"code":200},"requestReceivedTimestamp":"2022-08-24T05:36:36.524760Z","stageTimestamp":"2022-08-24T05:36:36.529890Z"}

    其中,重点关注的数据如下:

    1)kind,统一用 ”Event“,查询只查询 Event 的审计

    2)stage:目前都是“ResponseComplete“,只记录了响应结束的时间,没记录请求收到的时间

    3)verb:增删改查

    4)user.username,操作人

    5)sourceIPs:客户端 IP

    6)objectRef.resource:操作的资源

    7)objectRef.namespace:操作的项目/namespace

    8)responseStatus.code:返回代码

    9)requestReceivedTimestamp:请求到达时间
    - + \ No newline at end of file diff --git a/en/docs/building-base/configuration/customize-menu/index.html b/en/docs/building-base/configuration/customize-menu/index.html index 38292c6ba..3f5138b9f 100644 --- a/en/docs/building-base/configuration/customize-menu/index.html +++ b/en/docs/building-base/configuration/customize-menu/index.html @@ -5,14 +5,14 @@ 自定义菜单 | Framework as a Building Block for Kubernetes - +

    自定义菜单

    kubebb 的所有菜单均基于 menu 的 CRD 进行定义,如果需要添加自己的菜单,可以参考以下 memnu 示例:

    # 主菜单
    apiVersion: component.t7d.io/v1beta1
    kind: Menu
    metadata:
    name: demo-menu
    spec:
    column: 1
    isRenderSelectCurrent: false
    parentOwnerReferences:
    apiVersion: ""
    kind: ""
    name: ""
    uid: ""
    rankingInColumn: 100
    tenant: true
    text: 测试菜单
    textEn: "Test Menu"
    ---
    # 测试菜单索引菜单
    apiVersion: component.t7d.io/v1beta1
    kind: Menu
    metadata:
    name: demo-menu-index
    spec:
    getTitleForReplaceSider: {}
    parentOwnerReferences:
    apiVersion: component.t7d.io/v1beta1
    blockOwnerDeletion: false
    controller: false
    kind: Menu
    name: demo-menu
    uid: ""
    rankingInColumn: 100
    tenant: true
    text: 菜单索引项
    textEn: “Menu Index Item"
    ---
    # 子菜单,具备实际链接功能
    apiVersion: component.t7d.io/v1beta1
    kind: Menu
    metadata:
    name: demo-menu-submenu1
    spec:
    getTitleForReplaceSider: {}
    isRenderSelectCurrent: false
    parentOwnerReferences:
    apiVersion: component.t7d.io/v1beta1
    blockOwnerDeletion: false
    controller: false
    kind: Menu
    name: demo-menu-index
    uid: ""
    pathname: /demo-feature1
    rankingInColumn: 200
    text: 测试子菜单
    textEn: "Test Submenu"

    使用 kubectl apply -f 即可将菜单项部署到环境中,如下图所示: 图 1

    - + \ No newline at end of file diff --git a/en/docs/building-base/configuration/customize-portal/index.html b/en/docs/building-base/configuration/customize-portal/index.html index 84420200f..12845f242 100644 --- a/en/docs/building-base/configuration/customize-portal/index.html +++ b/en/docs/building-base/configuration/customize-portal/index.html @@ -5,13 +5,13 @@ 自定义门户 | Framework as a Building Block for Kubernetes - +

    自定义门户

    1. 准备好需要替换的 logo,比如 logo-white.png、favicon.png,使用以下命令创建对应的 configmap
    kubectl create configmap portal-logos -n u4a-system \
    --from-file=logo-white.png=./logo-white.png \
    --from-file=favicon.ico=./favicon.png
    1. 修改 bff-server 的 deployment 将 configmap 挂载进去
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: bff-server
    namespace: u4a-system
    spec:
    template:
    spec:
    volumes:
    - hostPath:
    path: /etc/localtime
    type: ""
    name: time-localtime
    # 存储卷中增加刚刚创建的 configmap portal-logos
    - configMap:
    name: portal-logos
    name: logos
    containers:
    volumeMounts:
    - mountPath: /etc/localtime
    name: time-localtime
    readOnly: true
    # 将上面的存储卷 logos 挂载到对应 logo 目录
    - mountPath: /usr/src/app/public/profile/img
    name: logos

    自定义主色调

    通过创建 portal-global-configs 的 configmap,即可自定义门户主色调,示意如下:

    apiVersion: v1
    kind: ConfigMap
    metadata:
    name: portal-global-configs
    namespace: u4a-system
    data:
    global-configs: |
    {"theme": {"primaryColor": "#008F35"}}

    创建 configMap,刷新门户后即可生效

    kubectl create cm portal-global-configs -n u4a-system
    1. 修改 bff-server 的 deployment 将 configmap 挂载进去
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: bff-server
    namespace: u4a-system
    spec:
    template:
    spec:
    volumes:
    - hostPath:
    path: /etc/localtime
    type: ""
    name: time-localtime
    # 存储卷中增加刚刚创建的 configmap portal-global-configs
    - configMap:
    name: portal-global-configs
    name: portal-global-configs
    containers:
    volumeMounts:
    - mountPath: /etc/localtime
    name: time-localtime
    readOnly: true
    # 将上面的存储卷 logos 挂载到对应 logo 目录:
    - mountPath: /usr/src/app/configs
    name: portal-global-configs
    - + \ No newline at end of file diff --git a/en/docs/building-base/configuration/oidc-integration/index.html b/en/docs/building-base/configuration/oidc-integration/index.html index 57d71f1c2..8ce84083e 100644 --- a/en/docs/building-base/configuration/oidc-integration/index.html +++ b/en/docs/building-base/configuration/oidc-integration/index.html @@ -5,13 +5,13 @@ 集成单点登录 | Framework as a Building Block for Kubernetes - +

    集成单点登录

    通过 OIDC 协议,实现同 kubebb 的统一账号、认证及单点登录功能。

    1. 在 kubebb 服务端注册 OIDC 客户端

    通过修改 dex-server 使用的 ConfigMap 来添加 client:

    kubectl edit cm oidc-server -n u4a-system

    在 staticClients 处添加一个新的客户端,参考:

      staticClients:
    - id: my-oidc-client
    name: my-oidc-client
    secret: ZXhhbXBsZS1hcHAtc2VjcmV0 # 这里填写随机密钥,注意不要泄漏密钥
    redirectURIs: # 这里可以配置多个回调地址
    - "<my-oidc-client-callback-address>" # 这里填写登录成功后的回调地址,例如 "http://192.168.1.32:8022"

    重启 oidc-server

    kubectl delete <oidc-server-pod> -n u4a-system

    2. 接入 OIDC 登录

    1. 环境信息示例

    2. 应用注册信息

    3. 用户登录

    • 在应用侧,一般会引用相关的 OIDC SDK 来处理 OIDC 相关的处理流程,来帮助开发者简化交互流程,比如 golang 可以使用:https://github.com/coreos/go-oidc

    这里介绍如何通过 API 调用,来实现 OIDC 单点登录的基本流程:

    1)用户访问应用界面,应自动重定向到 kubebb 认证服务登陆 URL,URL 示例如下:

    https://192.168.2.216/oidc/auth?client_id=my-oidc-client&redirect_uri=http://192.168.1.32:8022/auth/callback&response_type=code&scope=openid+profile+email+offline_access
    参数名称描述
    client_id应用 ID,注册阶段由 kubebb 提供,如:my-oidc-client
    redirect_uri应用回调地址,注册阶段由应用提供,如:http://192.168.1.32:8022/auth/callback
    response_type固定值:code
    scope固定值:openid profile email

    2)在 kubebb 的登陆页面,用户输入用户名/密码登陆(如果用户已经登陆,这步会自动跳过)

    3)登录成功后,跳转回应用注册的回调地址,跳转示例如下:

    http://192.168.1.32:8022/auth/callback?code=kf7dmmvhdipdcjczydklwi6pu&state=<state-info>
    参数名称描述
    code授权码,由 kubebb 认证服务 生成,用于后面获取 token
    state与应用跳转到 kubebb 认证服务登陆 URL 时传递的 state 值一样。

    4)应用后台调用 kubebb token API 获取 token 信息,调用示例如下:

    curl -XPOST 'https://192.168.2.216/oidc/token' \
    -H 'Authorization: Basic c2FtcGxlLWFwcC0yMTg6WlhoaGJYQnNaUzFoY0hBdGMyVmpjbVYwJw==' \
    -H 'Content-Type: application/x-www-form-urlencoded' \
    --data-urlencode 'code=kf7dmmvhdipdcjczydklwi6pu' \
    --data-urlencode 'grant_type=authorization_code' \
    --data-urlencode 'redirect_uri=http://192.168.1.32:8022/auth/callback'
    参数名称描述
    Authorization格式 Basic XXXX,其中 XXXX 是 client_id:client_secret 的 base64 编码
    Content-Type固定值:application/x-www-form-urlencoded
    code授权码
    grant_type固定值:authorization_code
    redirect_uri应用回调地址,kubebb 认证服务会验证该地址是否与应用注册的回调地址一致

    该请求会返回token信息

    ID Token: eyJhbGciOiJSUzI1NiIsImtpZCI6ImQxY2Y2MzA3YmQ5Yzk3OTJiMzdmMGJiM2M1Njk1ZDQ0MWJlZTMzNjcifQ.eyJpc3MiOiJodHRwczovLzE5Mi4xNjguMi4yMTYiLCJzdWIiOiJDZ0V4RWdsMFpXNTRZMnh2ZFdRIiwiYXVkIjoic2FtcGxlLWFwcC0yMTgiLCJleHAiOjE2MzAwMzA0ODEsImlhdCI6MTYyOTk0NDA4MSwiYXRfaGFzaCI6Ik1PUjk0enktTUZNcU5zZUZTM1ZzRXciLCJjX2hhc2giOiJpbkoteDVKUEFCRXhaaEpRaEx3T3pBIiwiZW1haWwiOiJhZG1pbkBleGFtcGxlLmNvbSIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJuYW1lIjoiYWRtaW4iLCJwaG9uZSI6IjE3MzQzMTM1MDUxIiwidXNlcmlkIjoiMSJ9.FrC6oKRsManuP9opqugknJmOE78uKmxX6uteM1flCDVRqRv-riG0C5AOX4K9BTnT9GIlu3H24jydT4ybSissz_wL_mLzoTQWoQ9uMMmd4w1aiGqgO6mIaEh3XvTqtoQv1ltONSkp49bykpdIXbDJxy0PScU0k-0XFNJIMSBwn8SEubgH7NO3xwFzsjaLqBfolxC5YXBuWS8n-FEOqNTg-mx-n_Fu2oemJCT-8qWMqY6FNjRSC3D-2ABkCbl4g76vPLgJ-I6dU6eaJvaBW6S4BzhCX0SitxYrxcXjOGviX1HKOXXSUC1n1HfQpOpNW-FA2G3F-kON94rYr1AEdIwSVw

    Access Token: eyJhbGciOiJSUzI1NiIsImtpZCI6ImQxY2Y2MzA3YmQ5Yzk3OTJiMzdmMGJiM2M1Njk1ZDQ0MWJlZTMzNjcifQ.eyJpc3MiOiJodHRwczovLzE5Mi4xNjguMi4yMTYiLCJzdWIiOiJDZ0V4RWdsMFpXNTRZMnh2ZFdRIiwiYXVkIjoic2FtcGxlLWFwcC0yMTgiLCJleHAiOjE2MzAwMzA0ODEsImlhdCI6MTYyOTk0NDA4MSwiYXRfaGFzaCI6IlhYS3RzUkhZS043WnZGOUFxcXVSd3ciLCJlbWFpbCI6ImFkbWluQGV4YW1wbGUuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsIm5hbWUiOiJhZG1pbiIsInBob25lIjoiMTczNDMxMzUwNTEiLCJ1c2VyaWQiOiIxIn0.VXUxba9cy4S3ZUtyfbF6A3Xg5fZYL-m6nqR09qiJgJmNUCEkHr_b4xKXXvDJwsgoC0zdUxShd1BpOgN4vi8A7zZ676-PybB2dVT6x3EPpwCVC8_NVYwXijeELWJJ0nU9aAq6p_m-XdXOuPzutbmMLSWVfrY-CS2WSdQISuKxb28slTptzCF4OY3dZugOHZ_v10KAxsMo0Aul4d3C_EXOaiUKzw0OTD7xyYOm8MmJvhzQEYSodHAkbJWnOusKEBtFKJ5hhAqPLCymY2VleN-7Jbqr-DYrDSDtd7FF1vCbDL0-rTwQ5_79FIAu_fusOcVc26M7GlvOtGcniaweNtm1dg

    返回的 ID Token 是标准 JWT Token,应用可以从 ID Token 中解析出用户信息,例如:

        {
    "iss": "https://192.168.2.216/oidc",
    "sub": "CgExEgl0ZW54Y2xvdWQ",
    "aud": "sample-app",
    "exp": 1630030481,
    "iat": 1629944081,
    "at_hash": "MOR94zy-MFMqNseFS3VsEw",
    "c_hash": "inJ-x5JPABExZhJQhLwOzA",
    "email": "admin@example.com",
    "email_verified": true,
    "name": "admin",
    "phone": "17343135051",
    "userid": "1"
    }
    • 基于该 JWT Token,应用可以将用户基础信息同步到自己的系统内,在基于统一账号、认证的前提下,实现同自身账号、权限体系的融合。
    • Access Token 一般用于访问 kubebb 认证服务获取用户详细信息,可以按需使用。
    - + \ No newline at end of file diff --git a/en/docs/building-base/intro/index.html b/en/docs/building-base/intro/index.html index ce9d65899..2dd0cc089 100644 --- a/en/docs/building-base/intro/index.html +++ b/en/docs/building-base/intro/index.html @@ -5,14 +5,14 @@ 介绍 | Framework as a Building Block for Kubernetes - +

    介绍

    技术组件

    平台开发采取前后端分离,以 K8S 为核心的开发框架,遵循 K8S 的扩展机制及 API 规范,整体开发架构的基本逻辑如下图所示: 图 2

    1. 所有组件的开发、扩展的认证都通过统一认证中心进行认证
    2. 认证由微前端的主框架 DockApp 统一进行,其他微前端的扩展不需要单独支持同认证中心的处理
    3. 开发架构上整体可以按照三层来看
    • 第一层,前端采用微前端架构,尽量采用低代码方式进行开发,提高代码自动化生成比例
    • 第二层,根据业务需求增加 OpenAPI,形成统一的 BFF 层,对 API 进行聚合,提供前端所需要的业务场景数据
    • 后端采用 CRD + controller 的 Operator 模式进行开发,形成数据驱动的流程开发模式
    1. 对外 API 主要包括两部分:
    • 从 BFF 层提供的 OpenAPI
    • 从 K8S 层提供的资源 API

    使用域名访问

    在代理服务器/负载均衡上,使用 nip.io 来支持 http/https 域名的绑定方式,便于默认统一采用域名进行配置。

    • 使用 nip.io 进行访问 http://<ip-address>.nip.io,比如 http://192.168.1.123.nip.io
    - + \ No newline at end of file diff --git "a/en/docs/category/\344\275\216\347\240\201kit/index.html" "b/en/docs/category/\344\275\216\347\240\201kit/index.html" index 8b3788884..7300b6c9e 100644 --- "a/en/docs/category/\344\275\216\347\240\201kit/index.html" +++ "b/en/docs/category/\344\275\216\347\240\201kit/index.html" @@ -5,13 +5,13 @@ 低码Kit | Framework as a Building Block for Kubernetes - + - + \ No newline at end of file diff --git "a/en/docs/category/\345\206\205\346\240\270kit/index.html" "b/en/docs/category/\345\206\205\346\240\270kit/index.html" index 2a469d3c8..92284c359 100644 --- "a/en/docs/category/\345\206\205\346\240\270kit/index.html" +++ "b/en/docs/category/\345\206\205\346\240\270kit/index.html" @@ -5,13 +5,13 @@ 内核Kit | Framework as a Building Block for Kubernetes - + - + \ No newline at end of file diff --git "a/en/docs/category/\345\272\225\345\272\247kit/index.html" "b/en/docs/category/\345\272\225\345\272\247kit/index.html" index 7525ffbbd..a2b274581 100644 --- "a/en/docs/category/\345\272\225\345\272\247kit/index.html" +++ "b/en/docs/category/\345\272\225\345\272\247kit/index.html" @@ -5,13 +5,13 @@ 底座Kit | Framework as a Building Block for Kubernetes - + - + \ No newline at end of file diff --git "a/en/docs/category/\345\277\253\351\200\237\345\274\200\345\247\213/index.html" "b/en/docs/category/\345\277\253\351\200\237\345\274\200\345\247\213/index.html" index c85cdcca0..6859d4ad3 100644 --- "a/en/docs/category/\345\277\253\351\200\237\345\274\200\345\247\213/index.html" +++ "b/en/docs/category/\345\277\253\351\200\237\345\274\200\345\247\213/index.html" @@ -5,13 +5,13 @@ 快速开始 | Framework as a Building Block for Kubernetes - + - + \ No newline at end of file diff --git "a/en/docs/category/\346\246\202\345\277\265/index.html" "b/en/docs/category/\346\246\202\345\277\265/index.html" index 0ec658291..ea8ebb6f9 100644 --- "a/en/docs/category/\346\246\202\345\277\265/index.html" +++ "b/en/docs/category/\346\246\202\345\277\265/index.html" @@ -5,13 +5,13 @@ 概念 | Framework as a Building Block for Kubernetes - + - + \ No newline at end of file diff --git "a/en/docs/category/\347\224\250\346\210\267\346\214\207\345\215\227/index.html" "b/en/docs/category/\347\224\250\346\210\267\346\214\207\345\215\227/index.html" index 429d3e5f1..ed45927fe 100644 --- "a/en/docs/category/\347\224\250\346\210\267\346\214\207\345\215\227/index.html" +++ "b/en/docs/category/\347\224\250\346\210\267\346\214\207\345\215\227/index.html" @@ -5,13 +5,13 @@ 用户指南 | Framework as a Building Block for Kubernetes - + - + \ No newline at end of file diff --git "a/en/docs/category/\347\273\204\344\273\266\345\274\200\345\217\221/index.html" "b/en/docs/category/\347\273\204\344\273\266\345\274\200\345\217\221/index.html" index cb9e81843..2ac1996c0 100644 --- "a/en/docs/category/\347\273\204\344\273\266\345\274\200\345\217\221/index.html" +++ "b/en/docs/category/\347\273\204\344\273\266\345\274\200\345\217\221/index.html" @@ -5,13 +5,13 @@ 组件开发 | Framework as a Building Block for Kubernetes - + - + \ No newline at end of file diff --git "a/en/docs/category/\350\207\252\345\256\232\344\271\211\351\205\215\347\275\256/index.html" "b/en/docs/category/\350\207\252\345\256\232\344\271\211\351\205\215\347\275\256/index.html" index c3ddd2044..a27a915f6 100644 --- "a/en/docs/category/\350\207\252\345\256\232\344\271\211\351\205\215\347\275\256/index.html" +++ "b/en/docs/category/\350\207\252\345\256\232\344\271\211\351\205\215\347\275\256/index.html" @@ -5,13 +5,13 @@ 自定义配置 | Framework as a Building Block for Kubernetes - + - + \ No newline at end of file diff --git a/en/docs/contribute/index.html b/en/docs/contribute/index.html index 3f1deacf4..bc4b9e41e 100644 --- a/en/docs/contribute/index.html +++ b/en/docs/contribute/index.html @@ -5,7 +5,7 @@ 贡献指南 | Framework as a Building Block for Kubernetes - + @@ -14,7 +14,7 @@ 在仓库主页面的左手边。然后你就可以在你的 GitHub 用户名中看到你的仓库了。

  • Clone 你自己的仓库到本地来开发。使用 git clone https://github.com/<your-username>/<your-project>.git 来克隆代码仓库到你的本地机器。然后你可以创建新的分支来完成你想做的改动。

  • 设置远程上游 上游设置为 https://github.com/kubebb/<project>.git 例如:

    git remote add upstream https://github.com/kubebb/core.git
    git remote set-url --push upstream no-pushing

    增加 upstream ,我们可以轻松地将本地分支与上游分支同步。

  • 创建一个分支 添加新特性或者修复问题。 更新本地工作目录:

    cd <project>
    git fetch upstream
    git checkout main
    git rebase upstream/main

    创建新的分支:

    git checkout -b <new-branch>

    在新的分支改动后可以构建和测试你的代码。

  • PR规范

    通过创建 PR 是对 KubeBB 项目的文件进行修改的唯一途径.

    git commit --signoff -m "description of this PR"

    为了帮助 reviewer 更好地理解你创建的 PR 的目的,PR描述需符合如下规范:

    <type>: <description>

    [optional body]

    其中,type 种类包括:

    • feat - 引入了新功能
    • fix - 修复了一个错误
    • chore - 与修复或功能无关的更改,不修改源代码或测试文件(例如更新依赖项)
    • refactor - 重构的代码,既不修复错误也不添加功能
    • docs - 更新文档,如README或其他markdown文件
    • style - 不影响代码含义的更改,通常与代码格式相关,如空格、缺少分号等。
    • test - 包括新的测试或更正之前的测试
    • perf - 性能改进
    • ci - 与持续集成相关
    • build - 影响构建系统或外部依赖项的更改
    • revert - 撤销先前的提交

    如果PR为对应解决某个 issue ,必须在PR出,添加 Fix: #1 #2 ,如下图:

    pr_example

    代码规范

    参与帮助任何事情

    我们选择 GitHub 作为 KubeBB 合作的主要场所。所以 KubeBB 的最新更新总是在这里。尽管通过 PR 的贡献是一种明确的帮助方式,我们仍然呼吁任何其他方式:

    • 在 issue 中回复其他人的问题
    • 帮助解决其他人的问题
    • 帮助 review 其他人的 PR
    • 参与讨论
    • 写技术博客
    • 等等

    加入社区

    如果您想成为 KubeBB GitHub 组织的成员,请参考下面的介绍:

    加入 KubeBB Github 组织

    在要求加入社区之前,我们要求你先做少量的贡献,以证明你有继续为 KubeBB 贡献的意愿。

    • 注意 任何人都可以为 KubeBB 做出贡献,加入 KubeBB Github 组织并不是一个强制性的步骤。

    有很多方法可以为 KubeBB 做出贡献:

    • 提交 PR
    • 报告错误或提供反馈
    • 回答 GitHub 上的问题

    提出您的申请

    • 在 KubeBB 仓库中创建一个 issue,并尽可能罗列您所做的全部工作。
    • 请 AT 2 个现有的 reviewer 以获取同意。
    • 请求被批准后,管理员将向你发出邀请。
      • 这是一个手动过程,通常每周运行几次。
      • 如果一个星期过去了,没有收到邀请,请通过邮件或者钉钉联系我们。
    - + \ No newline at end of file diff --git a/en/docs/core/concepts/component/index.html b/en/docs/core/concepts/component/index.html index 6a04ae576..998a85fc1 100644 --- a/en/docs/core/concepts/component/index.html +++ b/en/docs/core/concepts/component/index.html @@ -5,13 +5,13 @@ 组件CRD | Framework as a Building Block for Kubernetes - +

    组件CRD

    组件是将 chart package 映射为集群资源的一个概念,组件定义了 chart package 的基础描述信息,版本信息等。组件一般由仓库创建出来,无需手动创建。

    使用

    下面是手动创建一个组件示例:

    1. 准备组件 component.yaml
    apiVersion: core.kubebb.k8s.com.cn/v1alpha1
    kind: Component
    metadata:
    labels:
    kubebb.component.repository: repository-bitnami-sample
    name: repository-bitnami-sample.wordpress
    namespace: kubebb-system
    ownerReferences:
    - apiVersion: core.kubebb.k8s.com.cn/v1alpha1
    kind: Repository
    name: repository-bitnami-sample
    uid: a5b8b73d-47a5-40e1-9839-7aebf8a25618
    spec: {}
    kubectl apply -f component.yaml
    1. 准备更新组件 status.yaml
    status:
    description: WordPress is the world's most popular blogging and content management
    platform. Powerful yet simple, everyone from students to global corporations use
    it to build beautiful, functional websites.
    home: https://bitnami.com
    icon: https://bitnami.com/assets/stacks/wordpress/img/wordpress-stack-220x234.png
    keywords:
    - application
    - blog:
    - cms
    - http
    - php
    - web
    - wordpress
    maintainers:
    - name: VMware, Inc.
    url: https://github.com/bitnami/charts
    - name: Bitnami
    url: https://github.com/bitnami/charts
    name: wordpress
    repository:
    apiVersion: core.kubebb.k8s.com.cn/v1alpha1
    kind: Repository
    name: repository-bitnami-sample
    namespace: kubebb-system
    uid: a5b8b73d-47a5-40e1-9839-7aebf8a25618
    sources:
    - https://github.com/bitnami/charts/tree/main/bitnami/wordpress
    versions:
    - appVersion: 6.2.2
    createdAt: "2023-06-06T19:08:58Z"
    deprecated: false
    digest: 47096ed3f0a385e5830e90c75f443b7be107d7fa6df6aa869e7deb60b6cb6f8f
    updatedAt: "2023-06-08T05:34:00Z"
    version: 16.1.13
    - appVersion: 6.2.2
    createdAt: "2023-06-05T12:52:45Z"
    deprecated: false
    digest: 2005819fa8a08dea1f73585bcc4a37d83d3ef4f787c3927b5f51d2b5ae826dcb
    updatedAt: "2023-06-08T05:34:00Z"
    kubectl -nkubebb-system patch component.core.kubebb.k8s.com.cn repository-bitnami-sample.wordpress --type=merge --subresource status --patch-file status.yaml

    CRD 定义说明

    CRD 的代码定义位于 ComponentTypes。组件的信息都定在 status 中, 接下来会详细介绍每个字段的含义及其作用。

    • status.name

      该字段用来保存 chart package 的名字。

    • status.versions

      该字段是数组,用来保存 chart package 的多个版本。每个版本包含的信息如下

      • status.versions[index].appVersion 定义 chart packge 里面的应用的版本信息。
      • status.versions[index].createdAt 创建时间
      • status.versions[index].updatedAt 更新时间
      • status.versions[index].deprecated 当前版本是否废弃
      • status.versions[index].version chart package 的版本信息
      • status.versions[index].digest 数字签名
    • status.description

      chart package 的描述信息

    • status.maintainers

      该字段是数组类型,每一项都是 chart package 的维护者。每一项的包含的信息如下

      • status.maintainers[index].name 维护者名字
      • status.maintainers[index].email 维护者的邮箱
      • status.maintainers[index].url 维护者的网站
    • status.home

      组件的官网。

    • status.soureces

      该字段是字符串数组类型,定义组件代码仓库。

    • status.keywords

      该字段是字符串数组类型,定义与该组件关联的关键词。

    • status.icon

      定义该组件的图标

    • status.deprecated

      定义当前组件是否废弃

    工作原理

    组件也实现为 Kubernetes Operator,主要功能就是当组件创建,更新给每个组件添加 label kubebb.component.repository=<repository-name>,方便搜索。

    - + \ No newline at end of file diff --git a/en/docs/core/concepts/componentplan/index.html b/en/docs/core/concepts/componentplan/index.html index fb80135aa..30c11ea4b 100644 --- a/en/docs/core/concepts/componentplan/index.html +++ b/en/docs/core/concepts/componentplan/index.html @@ -5,7 +5,7 @@ 组件部署CRD | Framework as a Building Block for Kubernetes - + @@ -18,7 +18,7 @@ 字段)的规则遵循 kustomize:ImageTagTransformer 规范,代码实现也是直接调用了 kustomize 的这部分代码,降低了用户学习成本,保证了代码的兼容性和有效性。
  • 单个 ComponentPlan 的镜像替换和整个 Repository 的镜像替换,都是通过 Helm:post-rendering 技术实现的。
  • 镜像覆盖策略

    image-changed

    ComponentPlan 和 Helm release 的关系

    componentplan

    - + \ No newline at end of file diff --git a/en/docs/core/concepts/repository/index.html b/en/docs/core/concepts/repository/index.html index e00146c10..c0a8949fb 100644 --- a/en/docs/core/concepts/repository/index.html +++ b/en/docs/core/concepts/repository/index.html @@ -5,7 +5,7 @@ 组件仓库CRD | Framework as a Building Block for Kubernetes - + @@ -15,7 +15,7 @@ 对仓库中所有来自 docker.io 的镜像,替换为 192.168.1.1 ,并将镜像路径为 library 的镜像替换为 system-container ,比如仓库中有镜像 docker.io/library/nginx:v1.2.3 会替换为 192.168.1.1/system-container/nginx:v1.2.3

    CRD 定义说明

    CRD 的代码定义位于 RepositoryTypes。接下来会详细介绍每个字段的含义及其作用。

    tip

    说明 对于下面的 yaml,我们想要访问 bar 字段,书写格式为 spec.foo.bar

    spec:
    foo:
    bar: xx
    • spec.url

      该字段用来保存 chart repository 的地址

    • spec.authSecret

      对于需要认证,或者有自定义证书的 chart repository,需要将认证信息,证书信息存放到以该字段为名字的 secret 中。secret 中的主要字段信息如下

      • username 定义认证需要的用户名
      • password 定义认证需要的密码
      • cadata 定义签发证书的 RootCA
      • certdata 定义客户端通过 RootCA 签发的证书
      • keydata 定义客户端私钥

      如果服务端要求 TLS 双向认证,那么需要提供 certdatakeydata

    • spec.insecure

      是否跳过 https 验证

    • spec.repositoryType

      仓库类型,是字符串,理解为标记即可。

    • spec.PullStrategy.intervalSeconds

      定义获取数据的周期,可以不填写,默认是 120 秒。

    • spec.PullStrategy.timeoutSeconds

      定义一次 http 请求的超时时间。

    • spec.PullStrategy.retry

      定义请求失败的重试次数。默认不填写,只会做一次请求

    • spec.filter

      该字段是数组,定义了一系列的对 chart package 和 版本的过滤条件。因为是数组,所以可以出现对同一个 chart package 的多个过滤条件,只会使用最后一条。

      数组的每一项的介绍

      • spec.filter[index].name 定义了要参与过滤的 chart package 的名称。
      • spec.filter[index].operation 有两个可选值 keep, ignoreignore 定义 chart package 要忽略的版本, keep 定义 chart package 要保留的版本。
      • spec.filter[index].keepDeprecated false 表示不保留 chart package 已经废弃的版本,true 表示保留。
      • spec.filter[index].versionedFilterCond.versions 是一个版本的数组,只要 chart package 的版本与该数组中任意一个精确匹配上,即符合规则。
      • spec.fitler[index].versionedFilterCond.versionRegexp 版本过滤的正则表达式。
      • spec.filter[index].versionedFilterCond.versionConstraint 版本验证条件,表达式格式请参考 semver

      operation=keep 的时候, versions, versionRegexp, VersionConstraint 满足任一条件就会保留版本。
      operation=ignore 的时候, versions, versionRegexp, VersionConstraint 满足任一条件就会忽略版本。

      keepDeprecated 在对最终留下来的版本进行过滤,是否保留废弃版本。

    • spec.imageOverride 非必需 该字段是数组,定义了一系列仓库级别的镜像覆盖策略。

      每一项内容包括:

      • spec.imageOverride[].registry 该镜像仓库域名地址,可以包含端口,例如:docker.io192.168.1.1:5000
      • spec.imageOverride[].newRegistry 要将 registry 替换后的镜像仓库域名地址,可以包含端口。
      • spec.imageOverride[].pathOverride 非必需
        • spec.imageOverride[].pathOverride.path 旧的镜像仓库路径,比如镜像地址 docker.io/library/nginx:latest 中的 path 为 library
        • spec.imageOverride[].pathOverride.newPath 要将 path 替换后的镜像仓库新路径。

    工作原理

    仓库以 Kubernetes Operator 方式实现。周期性的获取 chart repository 的数据,对集群中组件更新或者创建,一般不会删除组件,而是将在 chart repository 中不存在的组件标记为废弃

    1. Repository 创建,更新时

    创建或者更新 Repository 时,会检查该资源是否添加 finalizers, 以及 URL 变更历史是否正确更新。

    当所有的更新都处理完成后,将会启动 chartmuseum watcher,在每次获取到若干的 chart package 后,与集群中已经存在的 Component 对比,将会执行 新增 component, 更新 component

    我们不会删除已经创建的 Component, 而是在发现集群中存在 Component 且并不存在于当前的 chart repository 中,那么会将其标记为废弃。

    1. Repoistory 删除时

    Repository 创建出来的 Component 都会添加 OwnerReferences,删除 Repository 的时候会自动删除关联的 Component

    1. 镜像覆盖策略

    image-changed

    - + \ No newline at end of file diff --git a/en/docs/core/concepts/subscription/index.html b/en/docs/core/concepts/subscription/index.html index efceb742e..78df84b7f 100644 --- a/en/docs/core/concepts/subscription/index.html +++ b/en/docs/core/concepts/subscription/index.html @@ -5,7 +5,7 @@ 组件订阅CRD | Framework as a Building Block for Kubernetes - + @@ -18,7 +18,7 @@ 该字段用来指明要监控的组件所在的仓库实例,一般使用 namespacename 来唯一确定,一般由控制器自动填充,不需要用户填写。
  • spec.componentPlanInstallMethod 可选字段 组件安装计划的安装方式,默认为 auto,可选项为 automanual
  • spec.其他 订阅中完整的包含了组件安装计划中的自定义配置字段。详细内容见组件安装计划的文档。
  • 工作原理

    订阅以 Kubernetes Operator 方式实现。当订阅控制器监视发现集群中订阅对应的组件创建或更新时,判断订阅未处理该更新事件时,用订阅中的组件安装计划配置创建一个名为 sub-<订阅名>-<安装版本>ComponentPlan,触发后续的组件安装步骤。

    - + \ No newline at end of file diff --git a/en/docs/core/intro/index.html b/en/docs/core/intro/index.html index 23956ae92..8c5cf0aef 100644 --- a/en/docs/core/intro/index.html +++ b/en/docs/core/intro/index.html @@ -5,14 +5,14 @@ 介绍 | Framework as a Building Block for Kubernetes - +

    介绍

    内核基于kubernetes operator模式进行开发,提供完整的组件生命周期管理、组件订阅和自动化部署能力,并通过tekton扩展实现组件自动化评级和安装前校验等能力。

    整体架构

    KubeBB Core架构图

    核心优势

    声明式组件生命周期管理

    组件生命周期

    组件的生命周期主要可以划分为三个阶段:

    component_lifecycle

    1. 研发阶段

    开发者通过低码平台(optional)完成组件的开发工作,根据不同的组件类型,选择不同的方式完成组件的打包,并将打包后的资源发布到仓库服务中。

    组件资源一般包含两类:

    • 镜像资源: 组件开发完成一般需要构建成一个镜像,并推送到镜像仓库
    • 安装包:组件安装部署时的各种资源配置信息(通常为Helm charts),并推送到Charts包仓库

    镜像资源一般通过公共镜像仓库(Dockerhub)或私有镜像仓库管理,我们不做特殊处理。组件仓库服务主要用于存储安装包(Charts)。

    2. 部署阶段

    系统管理员从组件仓库服务中手动查找存储的组件列表,获取可用的组件信息(发布者、版本、安装配置等),并根据实际情况,完成组件配置并安装到系统中。安装完成后,需要手动去检查组件版本更新,并谨慎的完整组件的升级。

    3. 使用阶段

    普通用户在组件安装到系统后,通过底座Kit提供的统一访问入口和统一用户认证来访问具体的组件服务。

    声明式的优势

    声明式的组件生命周期管理有以下优势:

    • 可读性: 更易于理解和阅读组件定义本身,因为它们表达了想要的结果,而不是实现的步骤。
    • 可维护性:更易于维护组件,因为它们更容易理解,更容易修改,而且更少有错误。
    • 可重用性:更容易重用组件,因为它们通常是独立于上下文的,可以在不同的环境中使用。
    • 可扩展性:更易于扩展组件,因为它们通常是基于组件和模块的,可以简单地组合起来创建更复杂的系统。
    • 可靠性:更可靠,因为它们通常是基于静态配置的,而不是基于运行时状态的。这意味着它们更少出现运行时错误和意外行为。

    多维度组件评级

    通过集成Tekton流水线组件,实现自动化的组件评级,并通过CRD Rating完成评测数据总结和分析。

    目前组件评级围绕三个维度展开:

    • 安全性: 评估组件的安全性和软件供应链的安全性。
    • 可靠性: 评估组件本身是否已经过良好的功能测试、性能测试
    • 可用性: 评估组件是否有充足的文档、示例来指导用户使用

    全面适配Helm生态

    Helm是一种成熟的包管理工具,提供一种简单的方式来管理Kubernetes应用程序的部署和升级。它拥有庞大的社区和众多优秀的项目。 因此,内核从设计之初就确定了必须全面兼容Helm生态

    这一特点体现在内核设计的各个方面,我们支持:

    扩展适配底座服务

    tip
    1. 低代码开发平台定义MenusRoute等底座相关资源,并打包到组件模版中
    2. 内核获取底座自定义资源后,自动解析、配置、创建对应资源

    底座服务支持通过自定义菜单路由扩展平台服务,为支撑适配这一能力,我们做了以下努力:

    • 移植Menu资源类型
    • 移植Route配置

    从而通过内核串联云梯低代码开发平台底座服务

    - + \ No newline at end of file diff --git a/en/docs/core/rating/index.html b/en/docs/core/rating/index.html index df6709199..fa4707523 100644 --- a/en/docs/core/rating/index.html +++ b/en/docs/core/rating/index.html @@ -5,13 +5,13 @@ 组件评级 | Framework as a Building Block for Kubernetes - +

    组件评级

    组件评级的目的是通过尽可能多的自动化测试从多个维度来评估一个组件。因此,组件评级三个部分的内容:

    • 定义并完成组件的自动化测试
    • 收集处理测试数据
    • 评估获取组件等级

    为了实现上述提到的三个部分的内容,我们选择:

    • 通过Tekton安全性可靠性可用性三个维度定义多种任务来完成自动化组件测试
    • 定义CRD Rating及其控制器,实时监听Tekton资源,收集测试数据
    • 通过Human DefinedAI Defined两种模式来制定组件评估规则,并基于测试数据实时更新组件等级

    核心流程

    rating_workflow

    任务列表

    tip

    所有任务权重目前都为1,后续需要根据实际的任务重要性赋予不同的权重,并以此获得最终的评分

    评测任务类型描述权重状态
    rating-security-rback安全性通过 dryrun 的方式获取完整的组件 RBAC1已支持
    rating-security-slsa安全性验证 SLSA 供应链安全等级1研发中
    rating-reliability-linting可靠性通过 helm lint 验证组件是否符合规范1已支持
    rating-reliability-testing可靠性通过 helm testing1研发中
    rating-reliability-deployment-testing可靠性验证部署后的组件,功能和性能是否符合预期1研发中
    rating-availability-sample可用性验证组件包是否包含 ComponentPlan 示例1研发中

    安全性任务

    rating-security-rback 根据 chart 包里的内容得到完整的安装文件,并根据这些文件生成权限关系图,用户可以根据这个关系图判断权限是否过大而选择是否安装。

    分以下4个步骤完成:

    1. 下载chart包

    通过 helm pull 下载指定的chart包

    1. 生成 .dot 文件

    通过 helm template 将 chart 包要安装的内容完全列举出来,并通过 yqjq 命令转换成如下格式:

    {
    "kind":"List",
    "apiVersion": "v1",
    "items": [
    {
    "kind": "ServiceAccount",
    "apiVersion": "v1",
    "metadata": {
    "name": "sa",
    }
    }
    ]
    }

    通过 rback 命令将以上的 json 内容转换成 .dot 文件。

    1. 存储到 ConfigMap

    将上述得到 .dot 文件存储到 ConfigMap 中。

    1. 将 ConfigMap 名字写到输出

    Pipeline 支持输出一些运行结果,将CongiMap的名字写到输出内容中,方便后续用户使用。

    可靠性任务

    rating-reliability-linting 用来检查 chart 包里书写格式是否正确,以保证平台可以完整的给用户展示相关信息。

    分以下2个步骤完成:

    1. 下载 chart 包

    通过 helm pull 下载 chart 包。

    1. 检查 lint

    通过 helm lint 检查包的书写格式,输出内容会跟随日志输出。

    可用性任务

    (待补充)

    - + \ No newline at end of file diff --git a/en/docs/core/roadmap/index.html b/en/docs/core/roadmap/index.html index dcdb79e4c..53e8adb0b 100644 --- a/en/docs/core/roadmap/index.html +++ b/en/docs/core/roadmap/index.html @@ -5,13 +5,13 @@ 路线图 | Framework as a Building Block for Kubernetes - +

    路线图

    v0.1.0

    • 支持管理组件仓库 Repository
      • 支持与 Helm 仓库兼容的 Repository Server
      • Watcher 监视 Repository
    • 实现 Component 管理
      • Watcher 实现 Components 的 CRUD 操作
    • 支持 ComponentPlanSubscription
      • 允许用户订阅 Component 的最新版本更改
      • 使用与 Helm Chart 兼容的 ComponentPlan 计划组件部署

    v0.2.0

    • 支持内核各控制器的Events记录
    • 适配 Kubebb 底座服务
    • 基于Tekton Pipeline安全性可靠性可用性 三个维度对 Component 进行评级Rating
    • 基于Tekton Pipeline实现ComponentPlan组件部署前的预先校验Check
    • 组件仓库Repository 中启用 authOCI
    • 实现与低代码平台集成
    - + \ No newline at end of file diff --git a/en/docs/core/userguide/privatecluster/index.html b/en/docs/core/userguide/privatecluster/index.html index 063ffd79c..f188dfc45 100644 --- a/en/docs/core/userguide/privatecluster/index.html +++ b/en/docs/core/userguide/privatecluster/index.html @@ -5,7 +5,7 @@ 私有集群部署方案 | Framework as a Building Block for Kubernetes - + @@ -16,7 +16,7 @@ 这里还是以 chartmuseum 测试

    cd components/charts/chartmuseum
    helm pacakge .

    # 成功将会输出 {"saved":true}
    curl --data-binary "@chartmuseum-3.10.1.tgz" http://localhost:8080/api/charts

    4.4 结果查看

    # 查看 index.yaml
    curl http://localhost:8080/index.yaml

    4.4 上传其他的chart包

    对于 components/charts 下面的其他的chart包用到哪些,按照 4.3 步骤就可以完成上传。


    5.使用 kubebb-core

    5.1 部署一个 Repository

    # repo.yaml
    apiVersion: core.kubebb.k8s.com.cn/v1alpha1
    kind: Repository
    metadata:
    name: kubebb
    namespace: kubebb-system
    spec:
    url: http://chartmuseum.default.svc.cluster.local:8080
    pullStategy:
    intervalSeconds: 120
    retry: 5

    创建 repository

    # 1. 创建 repository
    kubectl apply -f repo.yaml

    # 2. 检查 components 是否创建
    kubectl get components.core.kubebb.k8s.com.cn -n kubebb-system
    NAME AGE
    kubebb.chartmuseum 2s
    kubebb.kubebb-core 2s

    可以看到创建了 repository 后,相关的 components 已经被创建出来了。

    5.2 部署一个 Component

    部署 component ,需要使用 componentplan 这个资源。这里我们选择再次部署一个 chartmuseum。前面通过 helm 部署的 chartmuseum 是给系统存储chart用的,这里部署,是为了测试功能正常(没搞其他的chart包)。

    # componentplan.yaml
    apiVersion: core.kubebb.k8s.com.cn/v1alpha1
    kind: ComponentPlan
    metadata:
    name: chartmuseum-test
    namespace: default
    spec:
    approved: true
    name: chartmuseum-test
    version: 3.10.1
    override:
    set:
    - image.repository=localhost:5001/chartmuseum
    - env.open.DISABLE_API=false
    component:
    name: kubebb.chartmuseum
    namespace: kubebb-system

    创建compnentplan

    kubectl apply -f componentplan.yaml

    部署完成后,可以看到 chartmuseum-test 的pod也起来了。

    kubectl get po

    NAME READY STATUS RESTARTS AGE
    chartmuseum-6c4bc46898-msp7r 1/1 Running 0 107s
    chartmuseum-test-86d66fd5d7-lp2rn 1/1 Running 0 11s

    5.3 Repository Image 重写

    这个步骤是为了测试 image 更新策略,如果不需要可以不用操作。 我们还是用之前的helm部署的 chartmuseum,里面有一个chartmuseum 的包, 要用到镜像

    ghcr.io/helm/chartmuseum:v0.16.0

    # repo-override-image.yaml
    apiVersion: core.kubebb.k8s.com.cn/v1alpha1
    kind: Repository
    metadata:
    name: repo-override-image
    namespace: kubebb-system
    spec:
    url: http://chartmuseum.default.svc.cluster.local:8080
    pullStategy:
    intervalSeconds: 120
    retry: 5
    imageOverride:
    - registry: ghcr.io
    newRegistry: localhost:5001
    pathOverride:
    path: helm
    newPath: ""

    创建Repository

    kubectl apply -f repo-override-image.yaml

    创建 repository 后,查看 components

    kubectl get components -A
    NAMESPACE NAME AGE
    kubebb-system kubebb.chartmuseum 18m
    kubebb-system kubebb.kubebb-core 18m
    kubebb-system repo-override-image.chartmuseum 5s
    kubebb-system repo-override-image.kubebb-core 5s

    再次安装 chartmuseum 注意,这里我们不再设置 chartmuseum 所使用的镜像。

    # componentplan-default-override.yaml
    apiVersion: core.kubebb.k8s.com.cn/v1alpha1
    kind: ComponentPlan
    metadata:
    name: chartmuseum-test233
    namespace: default
    spec:
    approved: true
    name: chartmuseum-test233
    version: 3.10.1
    override:
    set:
    - env.open.DISABLE_API=false
    component:
    name: repo-override-image.chartmuseum
    namespace: kubebb-system

    创建 componentplan

    kubectl apply -f componentplan-default-override.yaml

    检查pod的运行情况

    kubectl get po

    NAME READY STATUS RESTARTS AGE
    chartmuseum-6c4bc46898-msp7r 1/1 Running 0 32m
    chartmuseum-test-86d66fd5d7-lp2rn 1/1 Running 0 31m
    chartmuseum-test233-544cbfb87c-b6pdd 1/1 Running 0 12s

    部署完成✅!

    - + \ No newline at end of file diff --git a/en/docs/intro/index.html b/en/docs/intro/index.html index 541918c19..463fd461f 100644 --- a/en/docs/intro/index.html +++ b/en/docs/intro/index.html @@ -5,13 +5,13 @@ 总览 | Framework as a Building Block for Kubernetes - +

    总览

    KubeBB(Kubernetes Building Blocks)是一种由内核驱动的组件生命周期管理平台,集成开箱即用的云原生底座低码组件开发能力,整合实现云原生三层组件模式

    overview

    Kubebb提供三个套件

    提供声明式的组件生命周期管理和组件市场,并通过Tekton流水线强化低代码平台组件与底座服务的集成。

    提供开箱即用的云原生服务门户,包括用户、OIDC认证、权限、审计、租户管理、门户服务等基础组件以及证书管理、Nignx Ingress等集群组件。

    依托Low-Code Engine和具有Git特性的关系数据库Dolt打造,并借助底座门户的菜单和路由资源和内核套件的组件管理能力,实现组件开发、测试到上线的全链路能力。

    三个核心套件之间的关系可以类比一下操作系统:

    • Kubernetes ~ 操作系统内核
    • Core ~ 软件安装器
    • 底座Kit ~ 操作系统的系统软件,如GUI、用户系统、网络等
    • 低码组件开发Kit ~ 操作系统软件开发工具

    内核Kit

    内核Kit的是现阶段我们重点关注并研发的项目,完全遵循开源项目管理规范。现阶段我们的目标:

    1. 声明式的组件全生命周期管理

    基于Operator Pattern开发,实现声明式的组件全生命周期管理。

    component-lifecycle

    提供四个核心的CRD实现:

    定义了组件仓库的访问信息、轮询策略和过滤选项,从而实现周期性地向仓库服务获取最新的组件列表信息。

    记录组件的基础描述、版本列表、是否废弃等信息

    定义组件安装部署的手动批准、组件引用、版本设置、类helm的配置覆盖策略,从而实现组件的可追踪部署、升级和回滚。

    定义了用户订阅组件版本更新

    一个扩展CRD实现,集成Tekton Pipeline:

    2. 开放组件市场

    组件市场是内核能力的产品化,作为一个适配底座服务的组件发布到官方组件仓库中使用,扩展KubeBB生态。

    底座Kit

    底座Kit通过集成以下组件从而提供统一的认证中心和门户入口:

    portal

    低码Kit

    低码Kit提供三层组件开发模式前端模块研发、出码能力,并借助内核Kit完成标准化打包、测试、发布。

    lowcode_development

    - + \ No newline at end of file diff --git a/en/docs/lowcode-development/development/backend-operator/index.html b/en/docs/lowcode-development/development/backend-operator/index.html index 781bc0494..8f83619ca 100644 --- a/en/docs/lowcode-development/development/backend-operator/index.html +++ b/en/docs/lowcode-development/development/backend-operator/index.html @@ -5,13 +5,13 @@ 开发后端服务组件 | Framework as a Building Block for Kubernetes - + - + \ No newline at end of file diff --git a/en/docs/lowcode-development/development/bff-apis/index.html b/en/docs/lowcode-development/development/bff-apis/index.html index 61b05bf8b..801f50655 100644 --- a/en/docs/lowcode-development/development/bff-apis/index.html +++ b/en/docs/lowcode-development/development/bff-apis/index.html @@ -5,13 +5,13 @@ BFF层API开发 | Framework as a Building Block for Kubernetes - + - + \ No newline at end of file diff --git a/en/docs/lowcode-development/development/develop-hello-world/index.html b/en/docs/lowcode-development/development/develop-hello-world/index.html index 08ccbfee2..85f909bd1 100644 --- a/en/docs/lowcode-development/development/develop-hello-world/index.html +++ b/en/docs/lowcode-development/development/develop-hello-world/index.html @@ -5,13 +5,13 @@ 发布一个 Hello World 组件 | Framework as a Building Block for Kubernetes - + - + \ No newline at end of file diff --git a/en/docs/lowcode-development/development/frontend/index.html b/en/docs/lowcode-development/development/frontend/index.html index af52e6e8b..a2b4babe0 100644 --- a/en/docs/lowcode-development/development/frontend/index.html +++ b/en/docs/lowcode-development/development/frontend/index.html @@ -5,13 +5,13 @@ 前端开发 | Framework as a Building Block for Kubernetes - + - + \ No newline at end of file diff --git a/en/docs/lowcode-development/development_pattern/index.html b/en/docs/lowcode-development/development_pattern/index.html index f7147f468..bf6cb80ce 100644 --- a/en/docs/lowcode-development/development_pattern/index.html +++ b/en/docs/lowcode-development/development_pattern/index.html @@ -5,14 +5,14 @@ 开发模式 | Framework as a Building Block for Kubernetes - +

    开发模式

    KubeBB组件的开发采取前后端分离,以 K8S 为核心的开发框架,遵循 K8S 的扩展机制及 API 规范。整体开发架构的基本逻辑如下图所示: dev_arch

    1. 所有组件的开发、扩展的认证都通过统一认证中心进行认证
    2. 认证由微前端的主框架 DockApp 统一进行,其他微前端的扩展不需要单独支持同认证中心的处理

    三层模式

    基于低码开发的组件,将采用如下三层开发模式:

    • 第一层: 前端采用微前端架构,采用低代码方式进行开发,提高代码自动化生成比例
    • 第二层: 根据业务需求增加 OpenAPI,形成统一的 BFF 层,对 API 进行聚合,提供前端所需要的业务场景数据
    • 第三层: 后端采用CRD + controller 的 Operator 模式进行开发,形成数据驱动的流程开发模式
    - + \ No newline at end of file diff --git a/en/docs/lowcode-development/intro/index.html b/en/docs/lowcode-development/intro/index.html index b780779f9..7ff41efbc 100644 --- a/en/docs/lowcode-development/intro/index.html +++ b/en/docs/lowcode-development/intro/index.html @@ -5,13 +5,13 @@ 介绍 | Framework as a Building Block for Kubernetes - + - + \ No newline at end of file diff --git a/en/docs/quick-start/buildingbase_quickstart/index.html b/en/docs/quick-start/buildingbase_quickstart/index.html index 79ec4868d..e7415500f 100644 --- a/en/docs/quick-start/buildingbase_quickstart/index.html +++ b/en/docs/quick-start/buildingbase_quickstart/index.html @@ -5,13 +5,13 @@ 安装底座 | Framework as a Building Block for Kubernetes - +

    安装底座

    本章节主要介绍底座组件的部署步骤,包括相关的开源技术组件、前提条件以及快速部署,并将部署的集群添加到服务门户上。

    tip

    安装前需完成安装内核

    部署

    1. 创建官方组件仓库

    可参考使用官方组件仓库

    2. 创建底座组件空间

    tip

    目前仅支持使用命名空间u4a-system

        kubectl create namespace u4a-system

    3. 部署Cluster Component

    组件部署信息cluster_componentplan.yaml如下:

    详细可参考

    apiVersion: core.kubebb.k8s.com.cn/v1alpha1
    kind: ComponentPlan
    metadata:
    name: cluster-component
    namespace: u4a-system
    spec:
    approved: true
    name: cluster-component
    version: 0.1.3
    override:
    set:
    - ingress-nginx.controller.nodeSelector.kubernetes\.io/hostname=kubebb-core-control-plane
    component:
    name: kubebb.cluster-component
    namespace: kubebb-system

    需调整参数:

    • override.set.ingress-nginx.controller.nodeSelector.kubernetes\.io/hostname 将作为ingress-nginx服务节点

    此处基于kind开发集群kubebb-core-control-plane节点。

    通过一下命令部署:

        kubectl apply -nu4a-system -f cluster_componentplan.yaml

    Cluster Component部署完成后,可通过以下命令查看组件部署状态:

        kubectl get componentplan -nu4a-system cluster-component -oyaml

    当组件部署状态如下时,表示组件部署成功:

    status:
    conditions:
    - lastTransitionTime: "2023-07-25T08:15:41Z"
    reason: ""
    status: "True"
    type: Approved
    - lastTransitionTime: "2023-07-25T08:15:44Z"
    reason: InstallSuccess
    status: "True"
    type: Actioned
    - lastTransitionTime: "2023-07-25T08:15:44Z"
    reason: ""
    status: "True"
    type: Succeeded

    4. 部署U4A Component

    组件部署信息u4a_componentplan.yaml如下:

    apiVersion: core.kubebb.k8s.com.cn/v1alpha1
    kind: ComponentPlan
    metadata:
    name: u4a-component
    namespace: u4a-system
    spec:
    approved: true
    name: u4a-component
    version: 0.1.3
    wait: true
    override:
    valuesFrom:
    - kind: ConfigMap
    name: u4acm
    valuesKey: "values.yaml"
    component:
    name: kubebb.u4a-component
    namespace: kubebb-system

    其中,组件U4A-Component的参数通过ConfigMap方式注入,ConfigMap的创建流程可参考U4A组件部署流程

    通过一下命令部署:

        kubectl apply -nu4a-system -f u4a_componentplan.yaml

    U4A Component部署完成后,可通过以下命令查看组件部署状态:

        kubectl get componentplan -nu4a-system u4a-component -oyaml

    5. 访问底座服务门户

    通过以下命令获取门户服务的访问地址:

    (base) ➜  ~ kubectl get ingress -nu4a-system
    NAME CLASS HOSTS ADDRESS PORTS AGE
    bff-server-ingress <none> portal.172.18.0.2.nip.io 80, 443 4h55m
    bff-server-ingress-socket <none> portal.172.18.0.2.nip.io 80, 443 4h55m
    kube-oidc-proxy-server-ingress <none> k8s.172.18.0.2.nip.io 80, 443 4h55m

    通过浏览器访问https://portal.172.18.0.2.nip.io即可进入服务门户。默认的用户名密码为

    • 用户名: admin
    • 密码: kubebb-admin

    注意: 由于使用了nip.io作为域名解析服务,因此需要将HOSTS中的域名解析到ADDRESS对应的IP地址上。

    卸载

    1. 卸载U4A Component

        kubectl delete componentplan -nu4a-system u4a-component

    2. 卸载Cluster Component

        kubectl delete componentplan -nu4a-system cluster-component
    - + \ No newline at end of file diff --git a/en/docs/quick-start/core_quickstart/index.html b/en/docs/quick-start/core_quickstart/index.html index 391b5f746..4bea40d89 100644 --- a/en/docs/quick-start/core_quickstart/index.html +++ b/en/docs/quick-start/core_quickstart/index.html @@ -5,13 +5,13 @@ 安装内核 | Framework as a Building Block for Kubernetes - +
    -

    安装内核

    tip

    安装前需完成预先准备

    安装方式

    Helm安装(推荐)

    tip

    Kubebb官方提供了helm仓库,方便用户安装: https://kubebb.github.io/components/

    1. 添加helm仓库
    helm repo add kubebb https://kubebb.github.io/components/
    helm repo update
    1. 创建命名空间

    请根据实际情况修改命名空间名称

    kubectl create namespace kubebb-system
    1. 安装
    helm install --wait -nkubebb-system kubebb-core kubebb/kubebb-core

    源代码安装

    1. 克隆代码

    请根据实际情况修改代码仓库版本

    git clone https://github.com/kubebb/core
    1. 构建镜像
    cd core
    make docker-build IMG=kubebb/kubebb-core:local
    tip

    如果使用的是kind开发集群,需要先将镜像推送到kind集群中:

    kind load docker-image kubebb/kubebb-core:local --name kubebb-core
    1. 安装CRDs
    make install
    1. 部署kubebb-core
    make deploy IMG=kubebb/kubebb-core:local

    快速体验

    内核安装完成后,可通过以下两种方式快速体验组件化的部署:

    使用官方组件仓库

    tip

    官方组件仓库提供多个认证仓库、组件和组件应用,可供用户体验。后续步骤将使用官方组件仓库举例。

    1. 通过以下命令克隆官方组件仓库:
    git clone https://github.com/kubebb/components
    # 后续步骤均在 components 目录下执行
    cd components
    1. 部署官方仓库
    kubectl apply -f repos/repository_kubebb.yaml -nkubebb-system

    查看仓库状态:

    kubectl get repository -nkubebb-system

    如果一切正常,输出如下:

    (base) ➜  ~ k get repos  -nkubebb-system
    NAME AGE
    kubebb 42h
    1. 获取仓库中的组件
    kubectl get components -nkubebb-system  -l kubebb.component.repository=kubebb

    如果一切正常,输出如下:

    NAME                       AGE
    kubebb.bc-apis 135m
    kubebb.bc-depository 135m
    kubebb.bc-explorer 135m
    kubebb.cluster-component 135m
    kubebb.fabric-operator 135m
    kubebb.ingress-nginx 135m
    kubebb.kubebb 135m
    kubebb.kubebb-core 135m
    kubebb.minio 135m
    kubebb.tekton-operator 135m
    kubebb.u4a-component 135m
    kubebb.weaviate 135m
    1. 测试组件部署(可选)

    以部署kubebb.minio为例

    kubectl apply -f examples/minio/componentplan.yaml

    组件部署配置信息如下:

    apiVersion: core.kubebb.k8s.com.cn/v1alpha1
    kind: ComponentPlan
    metadata:
    name: fabric-minio
    namespace: default
    spec:
    approved: true
    name: fabric-minio # similar to helm release name
    version: 5.0.7
    component:
    name: kubebb.minio
    namespace: kubebb-system

    查看组件部署状态:

    kubectl get componentplan fabric-minio -oyaml

    如果一切正常,输出如下:

    apiVersion: core.kubebb.k8s.com.cn/v1alpha1
    kind: ComponentPlan
    metadata:
    annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
    {"apiVersion":"core.kubebb.k8s.com.cn/v1alpha1","kind":"ComponentPlan","metadata":{"annotations":{},"name":"fabric-minio","namespace":"default"},"spec":{"approved":true,"component":{"name":"kubebb.minio","namespace":"kubebb-system"},"name":"fabric-minio","version":"5.0.7"}}
    creationTimestamp: "2023-07-04T07:52:17Z"
    finalizers:
    - core.kubebb.k8s.com.cn/finalizer
    generation: 3
    name: fabric-minio
    namespace: default
    resourceVersion: "14107"
    uid: 48696a2b-ae46-4522-95af-e951f255105e
    spec:
    approved: true
    component:
    name: kubebb.minio
    namespace: kubebb-system
    name: fabric-minio
    override: {}
    repository:
    name: kubebb
    namespace: kubebb-system
    version: 5.0.7
    status:
    conditions:
    - lastTransitionTime: "2023-07-04T07:52:17Z"
    reason: ""
    status: "True"
    type: Approved
    - lastTransitionTime: "2023-07-04T07:52:18Z"
    reason: ""
    status: "True"
    type: Installed
    - lastTransitionTime: "2023-07-04T07:52:18Z"
    reason: ""
    status: "True"
    type: Succeeded
    images:
    - hyperledgerk8s/minio-minio:RELEASE.2023-02-10T18-48-39Z
    resources:
    - NewCreated: true
    apiVersion: v1
    kind: ServiceAccount
    name: minio-sa
    - NewCreated: true
    apiVersion: v1
    kind: Secret
    name: fabric-minio
    - NewCreated: true
    apiVersion: v1
    kind: ConfigMap
    name: fabric-minio
    - NewCreated: true
    apiVersion: v1
    kind: Service
    name: fabric-minio-console
    - NewCreated: true
    apiVersion: v1
    kind: Service
    name: fabric-minio
    - NewCreated: true
    apiVersion: v1
    kind: Service
    name: fabric-minio-svc
    - NewCreated: true
    apiVersion: apps/v1
    kind: StatefulSet
    name: fabric-minio
    - NewCreated: true
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    name: fabric-minio-console

    查看组件Pod状态

    kubectl get pods -l core.kubebb.k8s.com.cn/componentplan=fabric-minio

    如果一切正常,输出如下:

    NAME             READY   STATUS    RESTARTS   AGE
    fabric-minio-0 1/1 Running 0 42h
    fabric-minio-1 1/1 Running 0 42h
    fabric-minio-2 1/1 Running 0 42h

    使用私有组件仓库

    待补充

    - +

    安装内核

    tip

    安装前需完成预先准备

    安装方式

    Helm安装(推荐)

    tip

    Kubebb官方提供了helm仓库,方便用户安装: https://kubebb.github.io/components/

    1. 添加helm仓库
    helm repo add kubebb https://kubebb.github.io/components/
    helm repo update
    1. 创建命名空间

    请根据实际情况修改命名空间名称

    kubectl create namespace kubebb-system
    1. 安装
    helm install -nkubebb-system kubebb-core kubebb/kubebb-core
    1. 查看安装状态
    kubectl get pods -nkubebb-system 

    如果一切正常,输入如下:

    NAME                           READY   STATUS    RESTARTS   AGE
    kubebb-core-6bd7c5f679-742mq 1/1 Running 0 21h

    源代码安装

    1. 克隆代码

    请根据实际情况修改代码仓库版本

    git clone https://github.com/kubebb/core
    1. 构建镜像
    cd core
    make docker-build IMG=kubebb/kubebb-core:local
    tip

    如果使用的是kind开发集群,需要先将镜像推送到kind集群中:

    kind load docker-image kubebb/kubebb-core:local --name kubebb-core
    1. 安装CRDs
    make install
    1. 部署kubebb-core
    make deploy IMG=kubebb/kubebb-core:local
    1. 查看安装状态
    kubectl get pods -nkubebb-system 

    如果一切正常,输入如下:

    NAME                           READY   STATUS    RESTARTS   AGE
    kubebb-core-6bd7c5f679-742mq 1/1 Running 0 21h

    快速体验

    内核安装完成后,可通过以下两种方式快速体验组件化的部署:

    使用官方组件仓库

    tip

    官方组件仓库提供多个认证仓库、组件和组件应用,可供用户体验。后续步骤将使用官方组件仓库举例。

    1. 通过以下命令克隆官方组件仓库:
    git clone https://github.com/kubebb/components
    # 后续步骤均在 components 目录下执行
    cd components
    1. 部署官方仓库
    kubectl apply -f repos/repository_kubebb.yaml -nkubebb-system

    查看仓库状态:

    kubectl get repository -nkubebb-system

    如果一切正常,输出如下:

    (base) ➜  ~ k get repos  -nkubebb-system
    NAME AGE
    kubebb 42h
    1. 获取仓库中的组件
    kubectl get components -nkubebb-system  -l kubebb.component.repository=kubebb

    如果一切正常,输出如下:

    NAME                       AGE
    kubebb.bc-apis 135m
    kubebb.bc-depository 135m
    kubebb.bc-explorer 135m
    kubebb.cluster-component 135m
    kubebb.fabric-operator 135m
    kubebb.ingress-nginx 135m
    kubebb.kubebb 135m
    kubebb.kubebb-core 135m
    kubebb.minio 135m
    kubebb.tekton-operator 135m
    kubebb.u4a-component 135m
    kubebb.weaviate 135m
    1. 测试组件部署(可选)

    以部署kubebb.minio为例

    kubectl apply -f examples/minio/componentplan.yaml

    组件部署配置信息如下:

    apiVersion: core.kubebb.k8s.com.cn/v1alpha1
    kind: ComponentPlan
    metadata:
    name: fabric-minio
    namespace: default
    spec:
    approved: true
    name: fabric-minio # similar to helm release name
    version: 5.0.7
    component:
    name: kubebb.minio
    namespace: kubebb-system

    查看组件部署状态:

    kubectl get componentplan fabric-minio -oyaml

    如果一切正常,输出如下:

    apiVersion: core.kubebb.k8s.com.cn/v1alpha1
    kind: ComponentPlan
    metadata:
    annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
    {"apiVersion":"core.kubebb.k8s.com.cn/v1alpha1","kind":"ComponentPlan","metadata":{"annotations":{},"name":"fabric-minio","namespace":"default"},"spec":{"approved":true,"component":{"name":"kubebb.minio","namespace":"kubebb-system"},"name":"fabric-minio","version":"5.0.7"}}
    creationTimestamp: "2023-07-04T07:52:17Z"
    finalizers:
    - core.kubebb.k8s.com.cn/finalizer
    generation: 3
    name: fabric-minio
    namespace: default
    resourceVersion: "14107"
    uid: 48696a2b-ae46-4522-95af-e951f255105e
    spec:
    approved: true
    component:
    name: kubebb.minio
    namespace: kubebb-system
    name: fabric-minio
    override: {}
    repository:
    name: kubebb
    namespace: kubebb-system
    version: 5.0.7
    status:
    conditions:
    - lastTransitionTime: "2023-07-04T07:52:17Z"
    reason: ""
    status: "True"
    type: Approved
    - lastTransitionTime: "2023-07-04T07:52:18Z"
    reason: ""
    status: "True"
    type: Installed
    - lastTransitionTime: "2023-07-04T07:52:18Z"
    reason: ""
    status: "True"
    type: Succeeded
    images:
    - hyperledgerk8s/minio-minio:RELEASE.2023-02-10T18-48-39Z
    resources:
    - NewCreated: true
    apiVersion: v1
    kind: ServiceAccount
    name: minio-sa
    - NewCreated: true
    apiVersion: v1
    kind: Secret
    name: fabric-minio
    - NewCreated: true
    apiVersion: v1
    kind: ConfigMap
    name: fabric-minio
    - NewCreated: true
    apiVersion: v1
    kind: Service
    name: fabric-minio-console
    - NewCreated: true
    apiVersion: v1
    kind: Service
    name: fabric-minio
    - NewCreated: true
    apiVersion: v1
    kind: Service
    name: fabric-minio-svc
    - NewCreated: true
    apiVersion: apps/v1
    kind: StatefulSet
    name: fabric-minio
    - NewCreated: true
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    name: fabric-minio-console

    查看组件Pod状态

    kubectl get pods -l core.kubebb.k8s.com.cn/componentplan=fabric-minio

    如果一切正常,输出如下:

    NAME             READY   STATUS    RESTARTS   AGE
    fabric-minio-0 1/1 Running 0 42h
    fabric-minio-1 1/1 Running 0 42h
    fabric-minio-2 1/1 Running 0 42h

    使用私有组件仓库

    待补充

    + \ No newline at end of file diff --git a/en/docs/quick-start/prerequisite/index.html b/en/docs/quick-start/prerequisite/index.html index 876f30b6b..f3dfcc566 100644 --- a/en/docs/quick-start/prerequisite/index.html +++ b/en/docs/quick-start/prerequisite/index.html @@ -5,13 +5,13 @@ 预先准备 | Framework as a Building Block for Kubernetes - +

    预先准备

    基础环境

    Kubernetes集群

    tip

    如果没有kubernets集群,可按照下述教程通过kind部署一个开发集群。默认情况下,为适配building base,集群至少有一个节点需要为Ingress Controller服务节点,并暴露80443端口。

    Kind开发集群

    1. 安装kind

    参考: https://kind.sigs.k8s.io/docs/user/quick-start/#installation

    Linux环境为例:

    # For AMD64 / x86_64
    [ $(uname -m) = x86_64 ] && curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.20.0/kind-linux-amd64
    # For ARM64
    [ $(uname -m) = aarch64 ] && curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.20.0/kind-linux-arm64
    chmod +x ./kind
    sudo mv ./kind /usr/local/bin/kind
    1. 准备单节点集群配置文件kind-config.yaml
    tip
    kind: Cluster
    apiVersion: kind.x-k8s.io/v1alpha4
    name: kubebb-core
    nodes:
    - role: control-plane
    image: kindest/node:v1.24.13
    kubeadmConfigPatches:
    - |
    kind: InitConfiguration
    nodeRegistration:
    kubeletExtraArgs:
    node-labels: "ingress-ready=true"
    extraPortMappings:
    - containerPort: 80
    hostPort: 80
    protocol: TCP
    - containerPort: 443
    hostPort: 443
    protocol: TCP
    1. 创建集群
    kind create cluster --config=kind-config.yaml
    1. 查看集群状态
    kubectl cluster-info --context kind-kubebb-core

    如果一切正常,输出如下:

    Kubernetes control plane is running at https://127.0.0.1:42607
    CoreDNS is running at https://127.0.0.1:42607/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

    To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
    1. 查看集群节点
    kubectl get nodes

    如果一切正常,输出如下:

    NAME                              STATUS   ROLES           AGE   VERSION
    kubebb-core-control-plane Ready control-plane 21m v1.24.13

    通过docker ps可发现该节点已经暴露了80443端口:

    (base) ➜  building-base git:(azure) docker ps
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    e4e3820cdb5a kindest/node:v1.24.13 "/usr/local/bin/entr…" 22 minutes ago Up 22 minutes 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 127.0.0.1:33611->6443/tcp kubebb-core-control-plane
    - + \ No newline at end of file diff --git a/en/index.html b/en/index.html index 0f0d733fc..986c8d51b 100644 --- a/en/index.html +++ b/en/index.html @@ -5,13 +5,13 @@ Homepage of Framework as a Building Block for Kubernetes | Framework as a Building Block for Kubernetes - +

    Framework as a Building Block for Kubernetes

    在 Kubernetes 上以搭积木的方式构建自己的服务门户

    提供底座服务,快速开启搭建

    提供账号、认证(OIDC)、权限(RBAC)、审计(Audit)的基础功能,采用更加标准的技术方式提供构建的底座服务

    内核驱动的声明式组件管理

    提供声明式的组件仓库管理、组件同步、组件订阅部署以及多维度的组件评级,完整适配Helm生态,集成微前端框架

    灵活的组件开发模式

    基于微前端框架和低代码开发,定义了标准的组件封装及发布模式,让开发者可以在底座之上按照开发规范进行组件的快速开发和发布,并在统一的服务门户上对外提供服务

    - + \ No newline at end of file diff --git a/en/markdown-page/index.html b/en/markdown-page/index.html index 141f13dbc..4467bd6f7 100644 --- a/en/markdown-page/index.html +++ b/en/markdown-page/index.html @@ -5,13 +5,13 @@ Markdown page example | Framework as a Building Block for Kubernetes - +

    Markdown page example

    You don't need React to write simple standalone pages.

    - + \ No newline at end of file diff --git a/index.html b/index.html index ba954bafb..9d29deef0 100644 --- a/index.html +++ b/index.html @@ -5,13 +5,13 @@ Homepage of Framework as a Building Block for Kubernetes | Framework as a Building Block for Kubernetes - +

    Framework as a Building Block for Kubernetes

    在 Kubernetes 上以搭积木的方式构建自己的服务门户

    提供底座服务,快速开启搭建

    提供账号、认证(OIDC)、权限(RBAC)、审计(Audit)的基础功能,采用更加标准的技术方式提供构建的底座服务

    内核驱动的声明式组件管理

    提供声明式的组件仓库管理、组件同步、组件订阅部署以及多维度的组件评级,完整适配Helm生态,集成微前端框架

    灵活的组件开发模式

    基于微前端框架和低代码开发,定义了标准的组件封装及发布模式,让开发者可以在底座之上按照开发规范进行组件的快速开发和发布,并在统一的服务门户上对外提供服务

    - + \ No newline at end of file diff --git a/markdown-page/index.html b/markdown-page/index.html index b18f5e4cb..397cb2d83 100644 --- a/markdown-page/index.html +++ b/markdown-page/index.html @@ -5,13 +5,13 @@ Markdown page example | Framework as a Building Block for Kubernetes - +

    Markdown page example

    You don't need React to write simple standalone pages.

    - + \ No newline at end of file