Gardener项目中的Shoot集群访问方式详解

Gardener项目中的Shoot集群访问方式详解

gardener Homogeneous Kubernetes clusters at scale on any infrastructure using hosted control planes. gardener 项目地址: https://gitcode.com/gh_mirrors/ga/gardener

前言

在Gardener项目中,Shoot集群是用户创建和管理的Kubernetes集群。创建Shoot集群后,用户需要获取kubeconfig文件来访问和管理这些集群。本文将全面介绍Gardener中访问Shoot集群的多种方式及其技术细节。

临时管理员kubeconfig获取

基本概念

shoots/adminkubeconfig子资源允许用户动态生成具有cluster-admin权限的临时kubeconfig文件。这种kubeconfig具有以下特点:

  1. 使用客户端证书认证,安全性高
  2. 有效期短,需要定期更新
  3. 不会持久化存储在任何地方
  4. 用户名与访问Gardener API的用户名一致

命令行获取方式

通过以下命令可以获取临时kubeconfig:

export NAMESPACE=garden-my-namespace
export SHOOT_NAME=my-shoot
kubectl create \
    -f <(printf '{"spec":{"expirationSeconds":600}}') \
    --raw /apis/core.gardener.cloud/v1beta1/namespaces/${NAMESPACE}/shoots/${SHOOT_NAME}/adminkubeconfig | \
    jq -r ".status.kubeconfig" | \
    base64 -d

其中expirationSeconds参数控制kubeconfig的有效期(单位:秒)。

编程语言实现

Go语言实现
expiration := 10 * time.Minute
expirationSeconds := int64(expiration.Seconds())
adminKubeconfigRequest := &authenticationv1alpha1.AdminKubeconfigRequest{
  Spec: authenticationv1alpha1.AdminKubeconfigRequestSpec{
    ExpirationSeconds: &expirationSeconds,
  },
}
err := client.SubResource("adminkubeconfig").Create(ctx, shoot, adminKubeconfigRequest)
if err != nil {
  return err
}
config = adminKubeconfigRequest.Status.Kubeconfig
Python实现
import base64
import json
from kubernetes import client, config
import yaml

shoot_name="my-shoot"
project_namespace="garden-my-namespace"

config.load_kube_config()
api = client.ApiClient()

kubeconfig_request = {
    'apiVersion': 'authentication.gardener.cloud/v1alpha1',
    'kind': 'AdminKubeconfigRequest',
    'spec': {
      'expirationSeconds': 600
    }
}

response = api.call_api(
    resource_path=f'/apis/core.gardener.cloud/v1beta1/namespaces/{project_namespace}/shoots/{shoot_name}/adminkubeconfig',
    method='POST',
    body=kubeconfig_request,
    auth_settings=['BearerToken'],
    _preload_content=False,
    _return_http_data_only=True,
)

decoded_kubeconfig = base64.b64decode(json.loads(response.data)["status"]["kubeconfig"]).decode('utf-8')
shoot_api_client = config.new_client_from_config_dict(yaml.safe_load(decoded_kubeconfig))
v1 = client.CoreV1Api(shoot_api_client)

只读kubeconfig获取

shoots/viewerkubeconfig子资源与adminkubeconfig类似,但提供的是只读权限的kubeconfig。主要区别包括:

  1. 对所有API(除core/v1.Secret外)只有读取权限
  2. 无法访问spec.kubernetes.kubeAPIServer.encryptionConfig中指定的资源

获取命令与管理员kubeconfig类似,只需替换子资源名称:

kubectl create \
    -f <(printf '{"spec":{"expirationSeconds":600}}') \
    --raw /apis/core.gardener.cloud/v1beta1/namespaces/${NAMESPACE}/shoots/${SHOOT_NAME}/viewerkubeconfig | \
    jq -r ".status.kubeconfig" | \
    base64 -d

结构化认证配置(Kubernetes 1.30+)

对于Kubernetes 1.30及以上版本的Shoot集群,可以通过结构化认证配置实现更灵活的认证方式。

配置示例

apiVersion: core.gardener.cloud/v1beta1
kind: Shoot
spec:
  kubernetes:
    kubeAPIServer:
      structuredAuthentication:
        configMapName: auth-config

引用的ConfigMap示例:

apiVersion: v1
kind: ConfigMap
metadata:
  name: auth-config
data:
  config.yaml: |
    apiVersion: apiserver.config.k8s.io/v1beta1
    kind: AuthenticationConfiguration
    jwt:
    - issuer:
        url: https://issuer.example.com
        audiences:
        - audience1
      claimMappings:
        username:
          expression: 'claims.username'

注意事项

  1. 用户需自行确保JWT认证器配置的有效性
  2. 修改ConfigMap后不会自动触发Shoot集群的重新协调
  3. 需要手动触发立即协调才能使更改生效

结构化授权配置(Kubernetes 1.30+)

类似地,Kubernetes 1.30+支持结构化授权配置。

配置示例

apiVersion: core.gardener.cloud/v1beta1
kind: Shoot
spec:
  kubernetes:
    kubeAPIServer:
      structuredAuthorization:
        configMapName: authz-config
        kubeconfigs:
        - authorizerName: webhook1
          secretName: webhook-kubeconfig

引用的ConfigMap和Secret示例:

# ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
  name: authz-config
data:
  config.yaml: |
    apiVersion: apiserver.config.k8s.io/v1beta1
    kind: AuthorizationConfiguration
    authorizers:
    - type: Webhook
      name: webhook1
      webhook:
        timeout: 3s
        subjectAccessReviewVersion: v1

# Secret
apiVersion: v1
kind: Secret
metadata:
  name: webhook-kubeconfig
data:
  kubeconfig: <base64编码的kubeconfig>

重要限制

  1. 目前仅支持Webhook类型的授权器
  2. 不能直接配置connectionInfo,必须通过Secret提供kubeconfig
  3. Webhook授权器在RBAC/Node授权器之后执行

OpenID Connect认证(已弃用)

对于Kubernetes 1.32以下版本,仍支持OpenID Connect配置:

apiVersion: core.gardener.cloud/v1beta1
kind: Shoot
spec:
  kubernetes:
    oidcConfig:
      issuerUrl: https://oidc.example.com
      clientId: my-client

使用建议

  1. 推荐使用kubectl oidc-login插件进行OIDC认证
  2. 对于Kubernetes 1.30+集群,建议迁移到结构化认证配置
  3. 可以使用ClusterOpenIDConnectPresetOpenIDConnectPreset为多个Shoot设置默认OIDC配置

最佳实践

  1. 生产环境建议使用短期有效的kubeconfig,并通过自动化工具定期更新
  2. 根据最小权限原则,优先使用只读kubeconfig进行监控和审计
  3. 对于Kubernetes 1.30+集群,推荐使用结构化认证/授权配置
  4. 注意kubeconfig的有效期,避免因证书过期导致访问中断

通过以上方式,用户可以灵活安全地访问和管理Gardener中的Shoot集群,满足不同场景下的访问控制需求。

gardener Homogeneous Kubernetes clusters at scale on any infrastructure using hosted control planes. gardener 项目地址: https://gitcode.com/gh_mirrors/ga/gardener

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郜垒富Maddox

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值