Gardener项目中的Shoot集群访问方式详解
前言
在Gardener项目中,Shoot集群是用户创建和管理的Kubernetes集群。创建Shoot集群后,用户需要获取kubeconfig文件来访问和管理这些集群。本文将全面介绍Gardener中访问Shoot集群的多种方式及其技术细节。
临时管理员kubeconfig获取
基本概念
shoots/adminkubeconfig
子资源允许用户动态生成具有cluster-admin
权限的临时kubeconfig文件。这种kubeconfig具有以下特点:
- 使用客户端证书认证,安全性高
- 有效期短,需要定期更新
- 不会持久化存储在任何地方
- 用户名与访问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。主要区别包括:
- 对所有API(除
core/v1.Secret
外)只有读取权限 - 无法访问
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'
注意事项
- 用户需自行确保JWT认证器配置的有效性
- 修改ConfigMap后不会自动触发Shoot集群的重新协调
- 需要手动触发立即协调才能使更改生效
结构化授权配置(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>
重要限制
- 目前仅支持Webhook类型的授权器
- 不能直接配置
connectionInfo
,必须通过Secret提供kubeconfig - 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
使用建议
- 推荐使用
kubectl oidc-login
插件进行OIDC认证 - 对于Kubernetes 1.30+集群,建议迁移到结构化认证配置
- 可以使用
ClusterOpenIDConnectPreset
和OpenIDConnectPreset
为多个Shoot设置默认OIDC配置
最佳实践
- 生产环境建议使用短期有效的kubeconfig,并通过自动化工具定期更新
- 根据最小权限原则,优先使用只读kubeconfig进行监控和审计
- 对于Kubernetes 1.30+集群,推荐使用结构化认证/授权配置
- 注意kubeconfig的有效期,避免因证书过期导致访问中断
通过以上方式,用户可以灵活安全地访问和管理Gardener中的Shoot集群,满足不同场景下的访问控制需求。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考