Skip to main content

配置 Kubernetes 集成

配置 Kubernetes 集成包括两个步骤:

1.启用后端从 Kubernetes 集群收集对象 2.在目录实体中显示 Kubernetes 对象

配置 Kubernetes 集群

下面是app-config.yaml:

kubernetes:
serviceLocatorMethod:
type: 'multiTenant'
clusterLocatorMethods:
- type: 'config'
clusters:
- url: http://127.0.0.1:9999
name: minikube
authProvider: 'serviceAccount'
skipTLSVerify: false
skipMetricsLookup: true
serviceAccountToken: ${K8S_MINIKUBE_TOKEN}
dashboardUrl: http://127.0.0.1:64713 # url copied from running the command: minikube service kubernetes-dashboard -n kubernetes-dashboard
dashboardApp: standard
caData: ${K8S_CONFIG_CA_DATA}
caFile: '' # local path to CA file
customResources:
- group: 'argoproj.io'
apiVersion: 'v1alpha1'
plural: 'rollouts'
- url: http://127.0.0.2:9999
name: aws-cluster-1
authProvider: 'aws'
- type: 'gke'
projectId: 'gke-clusters'
region: 'europe-west1'
skipTLSVerify: true
skipMetricsLookup: true
exposeDashboard: true

`服务定位器方法

这将配置如何确定组件在哪个集群中运行。

有效值为

  • multiTenant - 该配置假定所有组件都在提供的所有集群上运行。 singleTenant - 该配置假定当前组件在提供的集群中的一个集群上运行。

clusterLocatorMethods `集群定位器方法

这是一个数组,用于确定从何处检索群集配置。

有效的群组定位方法有

catalog

这种群集定位方法将收集资源类型kubernetes-cluster要使用这种方法检测到资源,该资源还必须具备以下条件注释(如这里在代码中):

还有许多其他注释可应用于集群资源,以配置 Backstage 的通信方式,记录如下这里下面是一个 YAML 代码段,以目录中的集群为例进行说明:

apiVersion: backstage.io/v1alpha1
kind: Resource
metadata:
name: my-cluster
annotations:
kubernetes.io/api-server: 'https://127.0.0.1:53725'
kubernetes.io/api-server-certificate-authority: # base64-encoded CA
kubernetes.io/auth-provider: 'oidc'
kubernetes.io/oidc-token-provider: 'microsoft'
kubernetes.io/skip-metrics-lookup: 'true'
spec:
type: kubernetes-cluster
owner: user:guest

请注意,在目录实体的注解中存储 Kubernetes 服务账户令牌是不安全的(很容易被目录 API 意外泄露),因此没有与服务帐户令牌使用的配置因此,目录群定位器不支持服务帐户认证策略。

如果将这种方法与摄取程序(如实体提供者(安装文件这里)或集群处理器来自动更新由 Backstage 跟踪的群集集群。

config

此集群定位器方法将从应用程序配置中读取集群信息(见下文)。

clusters

用于config集群定位器方法来构建 Kubernetes 客户端。

clusters.\*.url

Kubernetes 控制平面的基本 URL,可通过运行kubectl cluster-info指挥。

clusters.\*.name

代表该群集的名称,该名称在clusters用户将在软件目录 Kubernetes 插件中看到此值。

clusters.\*.authProvider

这决定了 Kubernetes 客户端与 Kubernetes 集群的验证方式。 有效值为

| Value | Description | | ---------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | |aks| 这将使用用户的 AKS 访问令牌。微软认证提供商访问 AKS 集群上的 Kubernetes API。aws| 这将使用 AWS 凭据访问 EKS 群集中的资源。azure| 这将使用Azure 身份识别以访问集群中的资源 | |google| 这将使用用户的 Google 访问令牌。谷歌认证提供商访问 GKE 集群上的 Kubernetes API。googleServiceAccount| 这将使用 Google 云服务帐户凭据访问群集中的资源。oidc| 这将使用Oidc 代币来验证 Kubernetes API。oidcTokenProvider请注意,集群必须支持 OIDC,在撰写本文时,AKS 集群不支持 OIDC。serviceAccount| 这将使用 Kubernetes服务账户访问 Kubernetes API。serviceAccountToken字段也应设置,否则 Backstage 应在集群内运行。

检查Kubernetes 验证部分进行补充说明。

clusters.\*.skipTLSVerify.

这决定了 Kubernetes 客户端是否验证 API 服务器提供的 TLS 证书。 默认为false.

clusters.\*.skipMetricsLookup.

这将决定 Kubernetes 客户端是否查找 API 服务器返回的 pod 的 CPU/内存资源指标。 默认为false.

clusters.\*.serviceAccountToken(可选)

时使用的服务帐户令牌。serviceAccount请注意,除非你有一个有效的凭证轮换程序,或者有一个同时运行 Backstage 和所有服务的 Kubernetes 集群,否则这个认证提供程序可能不是生产的理想选择。

假设您已经创建了一个名为SERVICE_ACCOUNT_NAME名称空间NAMESPACE并有足够的权限下面是一些示例程序,用于获取与该提供程序一起使用的长期服务帐户令牌:

  • On versions of Kubernetes prior to 1.24, you could get an (automatically-generated) token for a service account with: sh kubectl -n <NAMESPACE> get secret $(kubectl -n <NAMESPACE> get sa <SERVICE_ACCOUNT_NAME> -o=json \ | jq -r '.secrets[0].name') -o=json \ | jq -r '.data["token"]' \ | base64 --decode * For Kubernetes 1.24+, as described in this guide, you can obtain a long-lived token by creating a secret: sh kubectl apply -f - <<EOF apiVersion: v1 kind: Secret metadata: name: <SECRET_NAME> namespace: <NAMESPACE> annotations: kubernetes.io/service-account.name: <SERVICE_ACCOUNT_NAME> type: kubernetes.io/service-account-token EOF waiting for the token controller to populate a token, and retrieving it with:```sh kubectl -n get secret <SECRET_NAME> -o go-template=

如果群组有authProvider: serviceAccountserviceAccountToken字段被省略时,backstage 将忽略配置的 URL 和证书数据,而是尝试通过集群内客户端访问 Kubernetes API,如以下所示本例.

clusters.\*.oidcTokenProvider(可选)

该字段在使用oidc它将使用配置的Backstage授权提供者所选的oidcTokenProvider需要在auth才能正常工作。

kubernetes:
clusterLocatorMethods:
- type: 'config'
clusters:
- name: test-cluster
url: http://localhost:8080
authProvider: oidc
oidcTokenProvider: okta # This value needs to match a config under auth.providers
auth:
providers:
okta:
development:
clientId: ${AUTH_OKTA_CLIENT_ID}
clientSecret: ${AUTH_OKTA_CLIENT_SECRET}
audience: ${AUTH_OKTA_AUDIENCE}

前台支持以下开箱即用的值:gitlab(的应用程序clientId授权提供程序所使用的openid范围)、google,microsoft,okta,onelogin.

请注意oidcTokenProvider只是令牌的发行者,您可以在启用了 OIDC 的集群中使用其中任何一种,例如使用microsoft作为 EKS 群集的签发器。

clusters.\*.dashboardUrl(可选)

指定指向管理该群集的 Kubernetes 面板的链接。

请注意,应使用dashboardApp属性,以便正确格式化指向 kubernetes 资源的链接,否则它会认为你运行的是标准的。

还请注意,对于某些类型的仪表盘(如 GKE),该属性是可选的,因为 GKE 需要在dashboardParameters选择。

clusters.\*.dashboardApp(可选)

指定提供 Kubernetes 仪表板的应用程序。

这将用于格式化仪表板内指向 kubernetes 对象的链接。

支持的仪表盘有standard,rancher,openshift,gke,aks,eks不过,并非所有的功能都已实现,因此请大家献计献策!

请注意,它将默认使用 Kubernetes 项目提供的常规仪表板 (standard),可以在任何 Kubernetes 集群中运行。

请注意,对于gke您必须在dashboardParameters选择。

请注意,您可以将自己的格式器注册到clusterLinksFormatters字典,在应用程序项目中。

例如

import { clusterLinksFormatters } from '@backstage/plugin-kubernetes';
clusterLinksFormatters.myDashboard = (options) => ...;

真实案例另见 https://github.com/backstage/backstage/tree/master/plugins/kubernetes/src/utils/clusterLinks/formatters。

clusters.\*.dashboardParameters(可选)

指定所选dashboardApp格式。

请注意,即使dashboardParameters是可选的,但对于某些仪表盘(如 GKE)可能是强制性的。

GKE 所需参数

| 名称 | 说明 | | ------------- | ------------------------------------------------------------------------ | | |projectId| 包含 Kubernetes 集群的 GCP 项目 IDregion| 包含 Kubernetes 群集的 GCP 区域clusterName| 中的 kubernetes 集群名称。projectIdGCP 项目

请注意,GKE 群集定位器可自动为dashboardAppdashboardParameters如果设置了exposeDashboard属性为true.

例如

kubernetes:
serviceLocatorMethod:
type: 'multiTenant'
clusterLocatorMethods:
- type: 'config'
clusters:
- url: http://127.0.0.1:9999
name: my-cluster
dashboardApp: gke
dashboardParameters:
projectId: my-project
region: us-east1
clusterName: my-cluster
clusters.\*.caData(可选)

PEM 格式的 Base64 编码证书授权捆绑包。 Kubernetes 客户端将验证 API 服务器提供的 TLS 证书是否由该 CA 签发。

可以通过检查 kubeconfig 文件(通常位于~/.kube/config)之下clusters[*].cluster.certificate-authority-data对于 GKE,执行以下命令获取值

gcloud container clusters describe <YOUR_CLUSTER_NAME> \
--zone=<YOUR_COMPUTE_ZONE> \
--format="value(masterAuth.clusterCaCertificate)"

有关 GKE 的完整文档,请参阅 https://cloud.google.com/kubernetes-engine/docs/how-to/api-server-authentication#environments-without-gcloud。`gcloud`.

clusters.\*.caFile(可选)

文件系统路径(在运行 Backstage 进程的主机上)到 PEM 格式的证书授权包。 Kubernetes 客户端将验证 API 服务器提供的 TLS 证书是否由该 CA 签发。 请注意,只有在应用程序配置中通过配置集群定位器方法可以这样配置。

clusters.\*.customResources(可选)

配置定制资源的规范相同。自定义资源

gke

该群集定位器旨在与运行于GKE它将配置 Kubernetes 后端插件,以便向运行在谷歌云项目中的集群发出请求。

这种群集定位方法将使用google认证机制。

使用的 Google 云服务账户可通过GOOGLE_APPLICATION_CREDENTIALS环境变量。谷歌云文档了解更多信息。

例如

- type: 'gke'
projectId: 'gke-clusters'
region: 'europe-west1' # optional
authProvider: 'google' # optional
skipTLSVerify: false # optional
skipMetricsLookup: false # optional
exposeDashboard: false # optional
matchingResourceLabels: # optional
- key: 'environment'
value: 'production'

将配置 Kubernetes 插件以连接项目中的所有 GKE 集群gke-clusters在该地区europe-west1.

请注意,GKE 群集定位器可自动为dashboardAppdashboardParameters选项,如果启用exposeDashboard选择。

projectId

谷歌云项目中寻找 Kubernetes 集群。

区域(可选)

要查找 Kubernetes 集群的 Google 云区域。 默认为所有区域。

authProvider(可选)

设置用于发现群集和收集资源信息的验证方法。

默认为google它利用登录用户的 Google OAuth 凭据。

设置为googleServiceAccount使用应用程序默认凭据 (https://cloud.google.com/docs/authentication/application-default-credentials)。要使用服务帐户 JSON 密钥(不推荐),请设置GOOGLE_APPLICATION_CREDENTIALS后端环境变量的服务账户密钥文件路径。

skipTLSVerify(可选)

这决定了 Kubernetes 客户端是否验证 API 服务器提供的 TLS 证书。 默认为false.

skipMetricsLookup(可选)

这将决定 Kubernetes 客户端是否查找 API 服务器返回的 pod 的 CPU/内存资源指标。 默认为false.

exposeDashboard(可选)

这决定了dashboardAppdashboardParameters应自动配置,以便从 Kubernetes 插件公开 GKE 仪表板。

默认为false.

matchingResourceLabels(可选)

键值标签数组,用于筛选出不匹配的群集。资源标签.

localKubectlProxy

该群集定位器方法将假定本地运行的kubectl proxy进程使用默认端口(8001)。

注意:此群集定位器方法仅用于本地开发,不应在生产中使用。

自定义 `KubernetesClustersSupplier

如果基于配置的群集定位器不适合您的用例,也可以实现一个风俗.

###customResources (可选)

配置定制资源在返回实体的 Kubernetes 资源时,默认情况下会查找

注:

  • 可选的 kubernetes.customResources 属性被 [群集级别] 的 customResources 所覆盖(#clusterscustomresources-optional)。

默认为空数组。 示例

---
kubernetes:
customResources:
- group: 'argoproj.io'
apiVersion: 'v1alpha1'
plural: 'rollouts'

customResources.\*.group

自定义资源的组。

customResources.\*.apiVersion

自定义资源的 apiVersion。

customResources.\*.plural

代表自定义资源的复数。

apiVersionOverrides(可选)

用于请求相应对象的 API 版本的重写。 如果使用的是 Kubernetes 传统版本,可使用此配置将默认 API 版本重写为集群支持的版本。

例如

---
kubernetes:
apiVersionOverrides:
cronjobs: 'v1beta1'

有关群集支持哪些 API 版本的更多信息,请查看您的 Kubernetes 版本的 Kubernetes API 文档(例如版本 1.22 的应用程序接口组)

objectTypes(可选)

覆盖从集群获取的 Kubernetes 对象类型。 默认对象类型是

  • Pods * services * configmaps * limitranges * resourcequotas * deployments * replicasets * horizontalpodautoscalers * jobs * cronjobs * ingresses * statefulsets * daemonsets

如果只需要默认对象类型的子集,可以使用此配置覆盖默认对象类型。 不过,目前还不支持获取默认类型中指定的对象类型以外的其他对象类型。

例如

---
kubernetes:
objectTypes:
- configmaps
- deployments
- limitranges
- pods
- services
- statefulsets

基于角色的访问控制

当前所需的 RBAC 权限是集群范围内的只读权限,下面的 Kubernetes 清单描述了所需的对象,并将确保插件正常运行:

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: backstage-read-only
rules:
- apiGroups:
- '*'
resources:
- pods
- configmaps
- services
- deployments
- replicasets
- horizontalpodautoscalers
- ingresses
- statefulsets
- limitranges
- resourcequotas
- daemonsets
verbs:
- get
- list
- watch
- apiGroups:
- batch
resources:
- jobs
- cronjobs
verbs:
- get
- list
- watch
- apiGroups:
- metrics.k8s.io
resources:
- pods
verbs:
- get
- list

将 Kubernetes 组件作为实体的一部分浮出水面

有两种方法可将 Kubernetes 组件显示为实体的一部分。 标签选择器优先于注解/服务 ID。

Common backstage.io/kubernetes-id 标签

添加实体注释

为了让 Backstage 检测到实体拥有 Kubernetes 组件,应在实体的catalog-info.yaml:

annotations:
'backstage.io/kubernetes-id': dice-roller

添加命名空间注解

实体可以具有backstage.io/kubernetes-namespace注解,这将导致实体的 Kubernetes 资源通过该命名空间进行查找。

annotations:
'backstage.io/kubernetes-namespace': dice-space

标记 Kubernetes 组件

为了让 Kubernetes 组件作为实体的一部分出现在软件目录中,Kubernetes 组件本身可以有以下标签:

'backstage.io/kubernetes-id': <BACKSTAGE_ENTITY_NAME>

标签选择器查询注释

您可以编写自己的自定义标签选择器查询,以便 Backstage 用来查找对象(类似于kubectl --selector="your query here"审查标签和选择器 Kubernetes 文档了解更多信息。

'backstage.io/kubernetes-label-selector': 'app=my-app,component=front-end'

群组选择注释

这只适用于singleTenant服务定位器方法。

现在您可以选择single要应用此注解,请使用以下注解。

单一租户集群:

'backstage.io/kubernetes-cluster': dice-cluster

在上面的示例中,我们在实体上配置了 "backstage.io/kubernetes-cluster "注解catalog-info.yaml文件中指定当前组件在名为 "dice-cluster "的单个集群中运行,因此该集群必须在app-config.yaml下的 Kubernetes 集群配置(更多详情,请参阅配置 Kubernetes 集群).

如果不指定注释,默认情况下,backstage 会从所有定义的 Kubernetes 集群获取数据。