【问题标题】:Cannot use BackendConfig on GKE无法在 GKE 上使用 BackendConfig
【发布时间】:2020-08-13 02:55:12
【问题描述】:

我有一个可以部署到 kubernetes (Google Kubernetes Engine) 的应用程序,我正在尝试将 Google 的 CDN 添加到该应用程序。为此,我添加了一个 BackendConfig。但是当我的 gitlab 管道尝试应用它时,它会返回以下错误。

$ kubectl apply -f backend-config.yaml 来自服务器的错误(禁止):检索当前配置时出错: 资源:“cloud.google.com/v1beta1, Resource=backendconfigs”,GroupVersionKind:“cloud.google.com/v1beta1, Kind=BackendConfig”

我强烈怀疑运行管道的帐户没有足够的权限来访问后端配置。作为 k8s 和 gke 的新手,我不知道如何解决这个问题。特别是因为我找不到这需要什么权限。

编辑

我在管道中添加了一个kubectl get backendconfigs,但失败并出现同样的错误。从我的 gcloud sdk 环境中运行它,同样的命令也可以工作。

请注意,集群由 Gitlab 管理并使用 RBAC。我的理解是 gitlab 在 k8s 中以edit 角色为每个命名空间创建服务帐户。

编辑 2

根据 Arghya 的回答添加了 ClusterRole 和 ClusterRoleBinding。

$ kubectl get crd 的输出

NAME                                           CREATED AT
backendconfigs.cloud.google.com                2020-01-09T15:37:27Z
capacityrequests.internal.autoscaling.k8s.io   2020-04-28T11:15:26Z
certificaterequests.cert-manager.io            2020-01-15T06:53:47Z
certificates.cert-manager.io                   2020-01-15T06:53:48Z
challenges.acme.cert-manager.io                2020-01-15T06:53:48Z
challenges.certmanager.k8s.io                  2020-01-09T15:47:01Z
clusterissuers.cert-manager.io                 2020-01-15T06:53:48Z
clusterissuers.certmanager.k8s.io              2020-01-09T15:47:01Z
issuers.cert-manager.io                        2020-01-15T06:53:48Z
issuers.certmanager.k8s.io                     2020-01-09T15:47:01Z
managedcertificates.networking.gke.io          2020-01-09T15:37:53Z
orders.acme.cert-manager.io                    2020-01-15T06:53:48Z
orders.certmanager.k8s.io                      2020-01-09T15:47:01Z
scalingpolicies.scalingpolicy.kope.io          2020-01-09T15:37:53Z
updateinfos.nodemanagement.gke.io              2020-01-09T15:37:53Z

kubectl describe crd backendconfigs.cloud.google.com的输出

Name:         backendconfigs.cloud.google.com
Namespace:    
Labels:       <none>
Annotations:  <none>
API Version:  apiextensions.k8s.io/v1beta1
Kind:         CustomResourceDefinition
Metadata:
  Creation Timestamp:  2020-01-09T15:37:27Z
  Generation:          1
  Resource Version:    198
  Self Link:           /apis/apiextensions.k8s.io/v1beta1/customresourcedefinitions/backendconfigs.cloud.google.com
  UID:                 f0bc780a-32f5-11ea-b7bd-42010aa40111
Spec:
  Conversion:
    Strategy:  None
  Group:       cloud.google.com
  Names:
    Kind:       BackendConfig
    List Kind:  BackendConfigList
    Plural:     backendconfigs
    Singular:   backendconfig
  Scope:        Namespaced
  Validation:
    Open APIV 3 Schema:
      Properties:
        API Version:
          Description:  APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources
          Type:         string
        Kind:
          Description:  Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds
          Type:         string
        Metadata:
          Type:  object
        Spec:
          Description:  BackendConfigSpec is the spec for a BackendConfig resource
          Properties:
            Cdn:
              Description:  CDNConfig contains configuration for CDN-enabled backends.
              Properties:
                Cache Policy:
                  Description:  CacheKeyPolicy contains configuration for how requests to a CDN-enabled backend are cached.
                  Properties:
                    Include Host:
                      Description:  If true, requests to different hosts will be cached separately.
                      Type:         boolean
                    Include Protocol:
                      Description:  If true, http and https requests will be cached separately.
                      Type:         boolean
                    Include Query String:
                      Description:  If true, query string parameters are included in the cache key according to QueryStringBlacklist and QueryStringWhitelist. If neither is set, the entire query string is included and if false the entire query string is excluded.
                      Type:         boolean
                    Query String Blacklist:
                      Description:  Names of query strint parameters to exclude from cache keys. All other parameters are included. Either specify QueryStringBlacklist or QueryStringWhitelist, but not both.
                      Items:
                        Type:  string
                      Type:    array
                    Query String Whitelist:
                      Description:  Names of query string parameters to include in cache keys. All other parameters are excluded. Either specify QueryStringBlacklist or QueryStringWhitelist, but not both.
                      Items:
                        Type:  string
                      Type:    array
                  Type:        object
                Enabled:
                  Type:  boolean
              Required:
                enabled
              Type:  object
            Connection Draining:
              Description:  ConnectionDrainingConfig contains configuration for connection draining. For now the draining timeout. May manage more settings in the future.
              Properties:
                Draining Timeout Sec:
                  Description:  Draining timeout in seconds.
                  Format:       int64
                  Type:         integer
              Type:             object
            Iap:
              Description:  IAPConfig contains configuration for IAP-enabled backends.
              Properties:
                Enabled:
                  Type:  boolean
                Oauthclient Credentials:
                  Description:  OAuthClientCredentials contains credentials for a single IAP-enabled backend.
                  Properties:
                    Client ID:
                      Description:  Direct reference to OAuth client id.
                      Type:         string
                    Client Secret:
                      Description:  Direct reference to OAuth client secret.
                      Type:         string
                    Secret Name:
                      Description:  The name of a k8s secret which stores the OAuth client id & secret.
                      Type:         string
                  Required:
                    secretName
                  Type:  object
              Required:
                enabled
                oauthclientCredentials
              Type:  object
            Security Policy:
              Type:  object
            Session Affinity:
              Description:  SessionAffinityConfig contains configuration for stickyness parameters.
              Properties:
                Affinity Cookie Ttl Sec:
                  Format:  int64
                  Type:    integer
                Affinity Type:
                  Type:  string
              Type:      object
            Timeout Sec:
              Format:  int64
              Type:    integer
          Type:        object
        Status:
          Type:  object
  Version:       v1beta1
  Versions:
    Name:     v1beta1
    Served:   true
    Storage:  true
Status:
  Accepted Names:
    Kind:       BackendConfig
    List Kind:  BackendConfigList
    Plural:     backendconfigs
    Singular:   backendconfig
  Conditions:
    Last Transition Time:  2020-01-09T15:37:27Z
    Message:               no conflicts found
    Reason:                NoConflicts
    Status:                True
    Type:                  NamesAccepted
    Last Transition Time:  <nil>
    Message:               the initial names have been accepted
    Reason:                InitialNamesAccepted
    Status:                True
    Type:                  Established
  Stored Versions:
    v1beta1
Events:  <none>

【问题讨论】:

    标签: kubernetes gitlab google-kubernetes-engine


    【解决方案1】:

    在命名空间 example-namespace 中为服务帐户 example-sa 创建 ClusterRole 和 ClusterRoleBinding

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: backendconfig-role
    rules:
    - apiGroups: ["cloud.google.com"]
      resources: ["backendconfigs"]
      verbs: ["get", "watch", "list", "create", "delete"]
    
    ---
    
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: backendconfig-rolebinding
    subjects:
    - kind: ServiceAccount
      name: example-sa 
      namespace: example-namespace
    roleRef:
      kind: ClusterRole
      name: backendconfig-role
      apiGroup: rbac.authorization.k8s.io
    

    检查权限是否被应用

    kubectl auth can-i get backendconfigs --as=system:serviceaccount:example-namespace:example-sa -n example-namespace
    

    【讨论】:

    • 我已调整 example-sa 和 example-namespace 以匹配我的管道正在使用的名称,但它仍然失败并出现相同的错误。我已经对这两个对象进行了获取,以验证它们是否被正确应用。
    • kubectl auth ...的回复是no
    • 你能分享一下kubectl get crd的输出吗
    • 分享 kubectl describe crd backendconfigs.cloud.google.com 的输出
    • 等一下它的命名空间范围..已经更新了答案中的 rbac..试试这个
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-07
    • 2019-03-29
    • 2020-08-28
    • 2019-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多