Kf 依赖项和架构

Kf 需要 Kubernetes 和其他几个 OSS 项目才能运行。其中一些依赖项与 Google 代管式服务兼容,例如 Google Kubernetes Engine (GKE) 提供 Kubernetes。

依赖项

获取 CRD 详细信息

Kf 支持 kubectl 子命令 explain。您可以使用该命令列出 Kf CRD 中的字段,以了解如何通过自动化流程创建 Kf 对象(而不是通过 CLI 手动创建)。此命令旨在与 Config Management 搭配使用,用于跨多个集群自动创建和管理空间等资源。您可以将该命令用于以下任何 kinds 的组件

在此示例中,我们将检查 spaces CRD 中名为 spacekind

kubectl explain space.spec

输出类似于以下内容:

$ kubectl explain space.spec
KIND:     Space
VERSION:  kf.dev/v1alpha1

RESOURCE: spec <Object>

DESCRIPTION:
     SpaceSpec contains the specification for a space.

FIELDS:
   buildConfig  <Object>
     BuildConfig contains config for the build pipelines.

   networkConfig        <Object>
     NetworkConfig contains settings for the space's networking environment.

   runtimeConfig        <Object>
     RuntimeConfig contains settings for the app runtime environment.

Kf 组件

Kf 会安装一些自己的 Kubernetes 自定义资源控制器。自定义资源实际上用作 Kf API,并由 kf CLI 用于与系统进行交互。控制器使用 Kf 的 CRD 来编排系统中的其他组件。

您可以通过运行以下命令来查看 Kf 安装和使用的 CRD:

kubectl api-resources --api-group=kf.dev

该命令的输出如下所示:

NAME                      SHORTNAMES   APIGROUP   NAMESPACED   KIND
apps                                   kf.dev     true         App
builds                                 kf.dev     true         Build
clusterservicebrokers                  kf.dev     false        ClusterServiceBroker
routes                                 kf.dev     true         Route
servicebrokers                         kf.dev     true         ServiceBroker
serviceinstancebindings                kf.dev     true         ServiceInstanceBinding
serviceinstances                       kf.dev     true         ServiceInstance
spaces                                 kf.dev     false        Space

应用

应用表示部署到 Kubernetes 的十二要素应用。它包含应用的源代码、配置和当前状态。应用负责协调:

  • Kf Builds
  • Kf Routes
  • Kubernetes 部署
  • Kubernetes Service
  • Kubernetes ServiceAccounts
  • Kubernetes Secret

您可以使用 Kf 或 kubectl 列出应用:

kf apps
kubectl get apps -n space-name

构建作业

构建作业结合了应用的源代码和构建配置。它们为 Tekton TaskRun 预配了正确步骤,以便使 Buildpack V2、Buildpack V3 或 Dockerfile 构建生效。

您可以使用 Kf 或 kubectl 列出构建作业:

kf builds
kubectl get builds -n space-name

ClusterServiceBrokers

ClusterServiceBrokers 包含使用 Service Broker 扩展 Kf 所需的连接信息。它们负责获取代理提供的服务目录并将其显示在 kf marketplace 的输出中。

您可以使用 kubectl 列出 ClusterServiceBrokers:

kubectl get clusterservicebrokers

路由

路由是包含 HTTP 路由规则的高级结构。它们负责协调 Istio VirtualService。

您可以使用 Kf 或 kubectl 列出路线:

kf routes
kubectl get routes -n space-name

ServiceBrokers

ServiceBrokers 包含使用 Service Broker 扩展 Kf 所需的连接信息。它们负责获取代理提供的服务目录并将其显示在 kf marketplace 的输出中。

您可以使用 kubectl 列出 ServiceBrokers:

kubectl get servicebrokers -n space-name

ServiceInstanceBinding

ServiceInstanceBinding 包含用来在 Service Broker 上创建绑定的参数以及该代理为绑定返回的凭据。它们负责对代理调用 Bind API 来绑定服务。

您可以使用 Kf 或 kubectl 列出 ServiceInstanceBindings:

kf bindings
kubectl get serviceinstancebindings -n space-name

ServiceInstance

ServiceInstances 包含用来在 Service Broker 上创建服务的参数。它们负责在代理上调用 Provision API 以创建服务。

您可以使用 Kf 或 kubectl 列出 ServiceInstances:

kf services
kubectl get serviceinstances -n space-name

Spaces

Spaces 包含与 Cloud Foundry 组织和空间类似的配置信息。他们负责:

  • 创建要在其中预配其他 Kf 资源的 Kubernetes 命名空间。
  • 创建 Kubernetes NetworkPolicies 以强制执行网络连接政策。
  • 保留构建作业、应用和路由的配置和政策。

您可以使用 Kf 或 kubectl 列出空间:

kf spaces
kubectl get spaces

Kf RBAC/权限

以下部分列出了要使 Kf 及其组件在集群级层具有正确访问权限所需的权限。这些权限在 Kf 中是必需的并且默认处于启用状态;请勿尝试停用这些权限。

组件 命名空间 服务账号
controller kf controller
subresource-apiserver kf controller
webhook kf controller
appdevexperience-operator appdevexperience appdevexperience-operator

请注意,appdevexperience-operator 服务账号与 controller 具有相同的一组权限。operator 是用以部署所有 Kf 组件的对象,包括自定义资源定义和控制器。

适用于 Kf 服务账号的 RBAC

下面的 apiGroup 定义详细说明了 Kf 中的哪些访问权限控制组件对 controllerappdevexperience-operator 服务账号具有哪些 API 组和资源权限。

- apiGroups:
  - "authentication.k8s.io"
  resources:
  - tokenreviews
  verbs:
  - create
- apiGroups:
  - "authorization.k8s.io"
  resources:
  - subjectaccessreviews
  verbs:
  - create
- apiGroups:
  - ""
  resources:
  - pods
  - services
  - persistentvolumeclaims
  - persistentvolumes
  - endpoints
  - events
  - configmaps
  - secrets
  verbs: *
- apiGroups:
  - ""
  resources:
  - services
  - services/status
  verbs:
  - create
  - delete
  - get
  - list
  - watch
- apiGroups:
  - "apps"
  resources:
  - deployments
  - daemonsets
  - replicasets
  - statefulsets
  verbs: *
- apiGroups:
  - "apps"
  resources:
  - deployments/finalizers
  verbs:
  - get
  - list
  - create
  - update
  - delete
  - patch
  - watch
- apiGroups:
  - "rbac.authorization.k8s.io"
  resources:
  - clusterroles
  - roles
  - clusterrolebindings
  - rolebindings
  verbs:
  - create
  - delete
  - update
  - patch
  - escalate
  - get
  - list
  - deletecollection
  - bind
- apiGroups:
  - "apiregistration.k8s.io"
  resources:
  - apiservices
  verbs:
  - update
  - patch
  - create
  - delete
  - get
  - list
- apiGroups:
  - "pubsub.cloud.google.com"
  resources:
  - topics 
  - topics/status
  verbs: *
- apiGroups:
  - ""
  resources:
  - namespaces
  - namespaces/finalizers
  - serviceaccounts
  verbs: 
  - get
  - list
  - create
  - update
  - watch
  - delete
  - patch
  - watch
- apiGroups:
  - "autoscaling"
  resources:
  - horizontalpodautoscalers
  verbs: 
  - create
  - delete
  - get
  - list
  - update
  - patch
  - watch
- apiGroups:
  - "coordination.k8s.io"
  resources:
  - leases
  verbs: *
- apiGroups:
  - "batch"
  resources:
  - jobs
  - cronjobs
  verbs: 
  - get
  - list
  - create
  - update
  - patch
  - delete
  - deletecollection
  - watch
- apiGroups:
  - "messaging.cloud.google.com"
  resources:
  - channels
  verbs: 
  - delete
- apiGroups:
  - "pubsub.cloud.google.com"
  resources:
  - pullsubscriptions
  verbs: 
  - delete
  - get
  - list
  - watch
  - create
  - update
  - patch
- apiGroups:
  - "pubsub.cloud.google.com"
  resources:
  - [pullsubscriptions/status
  verbs: 
  - get
  - update
  - patch
- apiGroups:
  - "events.cloud.google.com"
  resources: *
  verbs: *
- apiGroups:
  - "keda.k8s.io"
  resources: *
  verbs: *
- apiGroups:
  - "admissionregistration.k8s.io"
  resources:
  - mutatingwebhookconfigurations
  - validatingwebhookconfigurations
  verbs:
  - get
  - list
  - create
  - update
  - patch
  - delete
  - watch
- apiGroups:
  - "extensions"
  resources:
  - ingresses
  - ingresses/status
  verbs: *
- apiGroups:
  - ""
  resources: 
  - endpoints/restricted
  verbs:
  - create
- apiGroups:
  - "certificates.k8s.io"
  resources: 
  - certificatesigningrequests
  - certificatesigningrequests/approval
  - certificatesigningrequests/status
  verbs: 
  - update
  - create
  - get
  - delete
- apiGroups:
  - "apiextensions.k8s.io"
  resources:
  - customresourcedefinitions
  verbs:   
  - get
  - list
  - create
  - update
  - patch
  - delete
  - watch
- apiGroups:
  - "networking.k8s.io"
  resources: 
  - networkpolicies
  verbs: 
  - get
  - list
  - create
  - update
  - patch
  - delete
  - deletecollection
  - watch
- apiGroups:
  - ""
  resources: 
  - nodes
  verbs: 
  - get
  - list
  - watch
  - update
  - patch
- apiGroups:
  - ""
  resources: 
  - nodes/status
  verbs: 
  - patch

下表列出了如何在 Kf 中使用 RBAC 权限,其中:

  • view 包括以下动词:get、list、watch
  • modify 包括以下动词:create、update、delete、patch
权限 原因
可查看所有 secrets Kf 协调器需要读取 Secret 才能实现空间创建和服务实例绑定等功能。
可修改 pods Kf 协调器需要修改 Pod 才能实现构建/推送应用和任务等功能。
可修改 secrets Kf 协调器需要修改 Secret 才能实现构建/推送应用和任务以及服务实例绑定等功能。
可修改 configmaps Kf 协调器需要修改 configmap 才能实现构建/推送应用和任务等功能。
可修改 endpoints Kf 协调器需要修改端点才能实现构建/推送应用和路由绑定等功能。
可修改 services Kf 协调器需要修改 Pod 才能实现构建/推送应用和路由绑定等功能。
可修改 events Kf 控制器会为 Kf 管理的资源创建和发出事件。
可修改 serviceaccounts Kf 需要修改服务账号才能部署应用。
可修改 endpoints/restricted Kf 需要修改端点才能部署应用。
可修改 deployments Kf 需要修改部署才能实现推送应用等功能。
可修改 mutatingwebhookconfiguration Cloud Service Mesh(一个 Kf 依赖项)需要具有 Mutatingwebhookconfiguration 权限才能使用准入 webhook。
可修改 customresourcedefinitions customresourcedefinitions/status Kf 通过自定义资源(例如应用、空间和构建)管理资源。
可修改 horizontalpodautoscalers Kf 支持基于水平 Pod 自动扩缩器的自动扩缩功能。
可修改 namespace/finalizer Kf 需要设置网络钩子的所有者引用。

第三方库

如需查看第三方库源代码和许可,请参阅任何 Kf 容器映像的 /third_party 目录。

您还可以运行 kf third-party-licenses,以查看已下载的 Kf CLI 版本的第三方许可。