<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          KubeSphere 核心架構(gòu)淺析

          共 8980字,需瀏覽 18分鐘

           ·

          2021-08-30 06:50

          作者簡介:萬宏明,KubeSphere 核心貢獻(xiàn)者,專注于云原生安全領(lǐng)域。

          KubeSphere 是在 Kubernetes 之上構(gòu)建的面向云原生應(yīng)用的容器混合云管理系統(tǒng)。支持多云與多集群管理,提供全棧的自動(dòng)化運(yùn)維能力,幫助企業(yè)用戶簡化 DevOps 工作流,提供了運(yùn)維友好的向?qū)讲僮鹘缑妫瑤椭髽I(yè)快速構(gòu)建一個(gè)強(qiáng)大和功能豐富的容器云平臺(tái)。

          KubeSphere 為用戶提供構(gòu)建企業(yè)級(jí) Kubernetes 環(huán)境所需的多項(xiàng)功能,例如多云與多集群管理、Kubernetes 資源管理、DevOps、應(yīng)用生命周期管理、微服務(wù)治理(服務(wù)網(wǎng)格)、日志查詢與收集、服務(wù)與網(wǎng)絡(luò)、多租戶管理、監(jiān)控告警、事件與審計(jì)查詢、存儲(chǔ)管理、訪問權(quán)限控制、GPU 支持、網(wǎng)絡(luò)策略、鏡像倉庫管理以及安全管理等。

          得益于 Kubernetes 優(yōu)秀的架構(gòu)與設(shè)計(jì),KubeSphere 取長補(bǔ)短采用了更為輕量的架構(gòu)模式,靈活的整合資源,進(jìn)一步豐富了 K8s 生態(tài)。

          KubeSphere 核心架構(gòu)

          KubeSphere 的核心架構(gòu)如下圖所示:

          核心組件主要有三個(gè):

          • ks-console 前端服務(wù)組件
          • ks-apiserver 后端服務(wù)組件
          • ks-controller-manager 資源狀態(tài)維護(hù)組件

          KubeSphere 的后端設(shè)計(jì)中沿用了 K8s 聲明式 API 的風(fēng)格,所有可操作的資源都盡可能的抽象成為 CustomResource[1]。與命令式 API 相比,聲明性 API 的使用更加簡潔,并且提供了更好的抽象性, 告訴程序最終的期望狀態(tài)(做什么),而不關(guān)心怎么做。

          典型的,在聲明式 API 中:

          1. 你的 API 包含相對(duì)而言為數(shù)不多的、尺寸較小的對(duì)象(資源)。
          2. 對(duì)象定義了應(yīng)用或者基礎(chǔ)設(shè)施的配置信息。
          3. 對(duì)象更新操作頻率較低。
          4. 通常需要人來讀取或?qū)懭雽?duì)象。
          5. 對(duì)象的主要操作是 CRUD 風(fēng)格的(創(chuàng)建、讀取、更新和刪除)。
          6. 不需要跨對(duì)象的事務(wù)支持:API 對(duì)象代表的是期望狀態(tài)而非確切實(shí)際狀態(tài)。

          命令式 API(Imperative API)與聲明式有所不同。以下跡象表明你的 API 可能不是聲明式的:

          1. 客戶端發(fā)出“做這個(gè)操作”的指令,之后在該操作結(jié)束時(shí)獲得同步響應(yīng)。
          2. 客戶端發(fā)出“做這個(gè)操作”的指令,并獲得一個(gè)操作 ID,之后需要判斷請(qǐng)求是否成功完成。
          3. 你會(huì)將你的 API 類比為 RPC。
          4. 直接存儲(chǔ)大量數(shù)據(jù)。
          5. 在對(duì)象上執(zhí)行的常規(guī)操作并非 CRUD 風(fēng)格。
          6. API 不太容易用對(duì)象來建模。

          借助 kube-apiserver、etcd 實(shí)現(xiàn)數(shù)據(jù)同步和數(shù)據(jù)持久化,通過 ks-controller-manager 維護(hù)這些資源的狀態(tài),以達(dá)到最終狀態(tài)的一致性。如果你熟悉 K8s,可以很好的理解聲明式 API 帶來的好處,這也是 KubeSphere 最為核心的部分。

          例如 KubeSphere 中的流水線、用戶憑證、用戶實(shí)體、告警通知的配置,都可以抽象為資源實(shí)體,借助 K8s 成熟的架構(gòu)與工具鏈,可以方便的與 K8s 進(jìn)行結(jié)合,降低各組件之間的耦合,降低系統(tǒng)的復(fù)雜度。

          ks-apiserver 的核心架構(gòu)

          ks-apiserver 是 KubeSphere 核心的后端組件,負(fù)責(zé)前后端數(shù)據(jù)的交互、請(qǐng)求的代理分發(fā)、認(rèn)證與鑒權(quán)。下圖是 ks-apiserver 的核心架構(gòu):

          ks-apiserver 的開發(fā)使用了 go-restful[2] 框架,可以在請(qǐng)求鏈路中增加多個(gè) Filter 用于動(dòng)態(tài)的攔截請(qǐng)求和響應(yīng),實(shí)現(xiàn)認(rèn)證、鑒權(quán)、審計(jì)邏輯轉(zhuǎn)發(fā)和反向代理功能,KubeSphere 的 API 風(fēng)格也盡可能的學(xué)習(xí) K8s 的模式[3],方便使用 RBAC[4] 進(jìn)行權(quán)限控制。

          借助 CRD + controller 的方式進(jìn)行解耦,可以極大的簡化與第三方工具、軟件的集成方式。

          K8s 社區(qū)也提供了豐富的工具鏈,借助 controller-runtime[5]kubebuiler[6] 可以迅速的搭建起開發(fā)腳手架。

          API 聚合與權(quán)限控制

          可以通過拓展 ks-apiserver 實(shí)現(xiàn) API 的聚合,進(jìn)一步實(shí)現(xiàn)功能拓展、聚合查詢等功能。在 API 的開發(fā)過程中中需要遵循以下規(guī)范,以便與 KubeSphere 的租戶體系、資源體系進(jìn)行整合。

          • API 聚合
          • 權(quán)限控制
          • CRD + controller

          API 規(guī)范

          # 通過 api group 進(jìn)行分組
          /apis/{api-group}/{version}/{resources}
          # 示例
          /apis/apps/v1/deployments
          /kapis/iam.kubesphere.io/v1alpha2/users
          # api core
          /api/v1/namespaces

          # 通過 path 區(qū)分不同的動(dòng)作
          /api/{version}/watch/{resources}
          /api/{version}/proxy/{resources}/{resource}

          # 通過 path 區(qū)分不同的資源層級(jí)
          /kapis/{api-group}/{version}/workspaces/{workspace}/{resources}/{resource}
          /api/{version}/namespaces/{namespace}/{resource}

          規(guī)范 API 的目的:

          1. 更好的對(duì)資源進(jìn)行抽象,抽象為 Object 更適合聲明式 API
          2. 更好的對(duì) API 進(jìn)行管理,版本、分組、分層,更方便 API 的拓展
          3. 更好的與權(quán)限控制進(jìn)行整合,可以方便的從請(qǐng)求中獲取元數(shù)據(jù),apigroup,scope,version,verb

          權(quán)限控制

          KubeSphere 權(quán)限控制的核心是 RBAC[7] 基于角色的訪問控制。

          關(guān)鍵的對(duì)象有:Role、User、RoleBinding。

          Role 定義了一個(gè)角色可以訪問的資源。

          角色是根據(jù)資源層級(jí)進(jìn)行劃分的,cluster role、workspace role、namespace role 不同層級(jí)的角色定義了該角色在當(dāng)前層級(jí)可以訪問的資源。

          apiVersion: rbac.authorization.k8s.io/v1
          kind: ClusterRole
          metadata:
            name: role-grantor
          rules:
          - apiGroups: ["rbac.authorization.k8s.io"]
            resources: ["rolebindings"]
            verbs: ["create"]
          - apiGroups: ["rbac.authorization.k8s.io"]
            resources: ["clusterroles"]
            verbs: ["bind"]
            # 忽略 resourceNames 意味著允許綁定任何 ClusterRole
            resourceNames: ["admin","edit","view"]
          - nonResourceURLs: ["/healthz", "/healthz/*"] # nonResourceURL 中的 '*' 是一個(gè)全局通配符
            verbs: ["get", "post"]

          RoleBinding 可綁定角色到某主體(Subject)上。主體可以是組,用戶或者服務(wù)賬戶。

          apiVersion: rbac.authorization.k8s.io/v1
          kind: ClusterRoleBinding
          metadata:
            name: role-grantor-binding
          roleRef:
            apiGroup: rbac.authorization.k8s.io
            kind: ClusterRole
            name: role-grantor
          subjects:
          - apiGroup: rbac.authorization.k8s.io
            kind: User
            name: user-1

          CRD + controller

          自定義資源(Custom Resource) 是對(duì) Kubernetes API 的擴(kuò)展,可以通過動(dòng)態(tài)注冊(cè)的方式拓展 K8s API。用戶可以使用 kubectl 來創(chuàng)建和訪問其中的對(duì)象,就像操作內(nèi)置資源一樣。

          通過 CRD 對(duì)資源進(jìn)行抽象,再通過 controller 監(jiān)聽資源變化維護(hù)資源狀態(tài), controller 的核心是 Reconcile,與他的意思一樣,通過被動(dòng)、定時(shí)觸發(fā)的方式對(duì)資源狀態(tài)進(jìn)行維護(hù),直至達(dá)到聲明的狀態(tài)。

          以 User 資源為例,我們可以定義一下結(jié)構(gòu)的 CRD [8] 對(duì) User 進(jìn)行抽象:

          apiVersion: iam.kubesphere.io/v1alpha2
          kind: User
          metadata:
            annotations:
              iam.kubesphere.io/last-password-change-time: "2021-05-12T05:50:07Z"
            name: admin
            resourceVersion: "478503717"
            selfLink: /apis/iam.kubesphere.io/v1alpha2/users/admin
            uid: 9e438fcc-f179-4254-b534-e913dfd7a727
          spec:
            email: [email protected]
            lang: zh
            description: 'description'
            password: $2a$10$w312tzLTvXObnfEYiIrk9u5Nu/reJpwQeI66vrM1XJETWtpjd1/q2
          status:
            lastLoginTime: "2021-06-08T06:37:36Z"
            state: Active

          對(duì)應(yīng)的 API 為:

          # 創(chuàng)建
          POST /apis/iam.kubesphere.io/v1alpha2/users

          # 刪除
          DELETE /apis/iam.kubesphere.io/v1alpha2/users/{username}

          # 修改
          PUT /apis/iam.kubesphere.io/v1alpha2/users/{username}
          PATCH /apis/iam.kubesphere.io/v1alpha2/users/{username}

          # 查詢
          GET /apis/iam.kubesphere.io/v1alpha2/users
          GET /apis/iam.kubesphere.io/v1alpha2/users/{username}

          ks-apiserver 負(fù)責(zé)將這些數(shù)據(jù)寫入 K8s 再由 informer 同步到各個(gè)副本中。

          ks-controller-manager 通過監(jiān)聽數(shù)據(jù)變化,對(duì)資源狀態(tài)進(jìn)行維護(hù),以創(chuàng)建用戶為例, 通過 POST /apis/iam.kubesphere.io/v1alpha2/users 創(chuàng)建用戶之后, user controller 會(huì)對(duì)用戶資源狀態(tài)進(jìn)行同步。

          func (c *userController) reconcile(key string) error {
           // Get the user with this name
           user, err := c.userLister.Get(key)

                  if err != nil {
                      // The user may no longer exist, in which case we stop
                      // processing.
                      if errors.IsNotFound(err) {
                          utilruntime.HandleError(fmt.Errorf("user '%s' in work queue no longer exists", key))
                          return nil
                      }
                      klog.Error(err)
                      return err
                  }

           if user, err = c.encryptPassword(user); err != nil {
            klog.Error(err)
            return err
           }

           if user, err = c.syncUserStatus(user); err != nil {
            klog.Error(err)
            return err
           }

           // synchronization through kubefed-controller when multi cluster is enabled
           if c.multiClusterEnabled {
            if err = c.multiClusterSync(user); err != nil {
             c.recorder.Event(user, corev1.EventTypeWarning, controller.FailedSynced, fmt.Sprintf(syncFailMessage, err))
             return err
            }
           }

           c.recorder.Event(user, corev1.EventTypeNormal, successSynced, messageResourceSynced)
           return nil
          }

          通過聲明式的 API 將復(fù)雜的邏輯放到 controller 進(jìn)行處理,方便解耦。可以很方便的與其他系統(tǒng)、服務(wù)進(jìn)行集成,例如:

          /apis/devops.kubesphere.io/v1alpha2/namespaces/{namespace}/pipelines
          /apis/devops.kubesphere.io/v1alpha2/namespaces/{namespace}/credentials
          /apis/openpitrix.io/v1alpha2/namespaces/{namespace}/applications
          /apis/notification.kubesphere.io/v1alpha2/configs

          對(duì)應(yīng)的權(quán)限控制策略:

          定義一個(gè)可以增刪改查 user 資源的角色。

          apiVersion: rbac.authorization.k8s.io/v1
          kind: ClusterRole
          metadata:
            name: user-manager
          rules:
          - apiGroups: ["iam.kubesphere.io"]
            resources: ["users"]
            verbs: ["create","delete","patch","update","get","list"]

          定義一個(gè)可以創(chuàng)建 pipeline 資源的角色。

          apiVersion: rbac.authorization.k8s.io/v1
          kind: Role
          metadata:
            name: devops-manager
          rules:
          - apiGroups: ["devops.kubesphere.io"]
            resources: ["pipelines"]
            verbs: ["create","delete","patch","update","get","list"]

          引用鏈接

          [1]

          CustomResource: https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/

          [2]

          go-restful: https://github.com/emicklei/go-restful

          [3]

          K8s 的模式: https://kubernetes.io/docs/reference/using-api/api-concepts/

          [4]

          RBAC: https://kubernetes.io/docs/reference/access-authn-authz/rbac/

          [5]

          controller-runtime: https://github.com/kubernetes-sigs/controller-runtime

          [6]

          kubebuiler: https://github.com/kubernetes-sigs/kubebuilder

          [7]

          RBAC: https://kubernetes.io/zh/docs/reference/access-authn-authz/rbac/

          [8]

          CRD : https://raw.githubusercontent.com/kubesphere/kubesphere/master/config/crds/iam.kubesphere.io_users.yaml

          瀏覽 40
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  黄色网页伊人 | 亚洲黄色电影免费在线观看 | 欧美性爱啪啪视频 | 收各种流量价格置顶TG@DJYT8 | 欧美性爱成人 |