Привилегии нарушаются при наборе кластера и контекста

#kubernetes #google-cloud-platform #google-kubernetes-engine #service-accounts

#kubernetes #google-облачная платформа #google-kubernetes-engine #учетные записи служб

Вопрос:

Если вы задаете информацию о кластере с помощью get-credentials , kubectl не позволит вам подключаться к такой информации, как модули. Это доступ к API kubernetes изнутри модуля, а подключенная учетная запись службы имеет кластерную роль администратора кластера RBAC.

Во-первых, сразу после активации модуля это нормально.

 foo@abcd:~$ kubectl get po
NAME                               READY   STATUS    RESTARTS   AGE
xxxxxxxxxxxxxxxxxxxxxxxxxxxxx      2/2     Running   0          27h
yyyyyyyyyyyyyyyyyyyyyyyyyyy        1/1     Running   0          27h
zzzzzzzzzzzzzzzzzzzzzzzzz          1/1     Running   0          18m
  

В этом случае кластер и контекст не заданы.

 apiVersion: v1
clusters: null
contexts:
current-context: ""
kind: Config
preferences: {}
users:
- name: gke_prj_zone_cluster-name
  user:
    auth-provider:
      config:
        access-token: xxxxxx
        expiry: "2020-10-03T04:29:36.29112618 09:00"
      name: gcp
  

Затем задайте информацию о кластере.

 gcloud container clusters get-credentials cluster-name --zone zone --project prj
  

Посмотрите на настройки еще раз.

 foo@bar:~$ kubectl config view
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: DATA OMITTED
    server: https://12.34.56.78
  name: gke_prj_zone_cluster-name
contexts:
- context:
    cluster: gke_prj_zone_cluster-name
    user: gke_prj_zone_cluster-name
  name: gke_prj_zone_cluster-name
current-context: gke_prj_zone_cluster-name
kind: Config
preferences: {}
users:
- name: gke_prj_zone_cluster-name
  user:
    auth-provider:
      config: null
      name: gcp
  

Тогда мои полномочия исчезли.

 foo@bar:~$ kubectl get po
Error from server (Forbidden): pods is forbidden: User "123456789-compute@developer.gserviceaccount.com" cannot list resource "pods" in API group "" in the namespace "default": requires one of ["container.pods.list"] permission(s).
  

Почему они теряют свои полномочия?

======================== Из-за операции с модулем gke я не получил учетные данные первым, я просто прикрепил кластерную роль (cluster-admin) к gke.

с помощью helmfile

 {{- if .Values.serviceAccount.create -}}
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: {{ include "serviceAccountName" . }}
  labels:
    {{- include "labels" . | nindent 4 }}
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: {{ include "serviceAccountName" . }}
  namespace: {{ .Release.Namespace }}
{{- end }}
  

Комментарии:

1. Можете ли вы показать всю команду, которую вы используете, с самого начала. Я не знаю, как вы получили первые учетные данные.

2. Из-за операции с модулем gke я не получил учетные данные первым, я просто прикрепил кластерную роль (администратор кластера) к gke. [postscript]

3. Может ли быть так, что учетная запись службы, установленная на pod, с самого начала имеет только рабочие привилегии для текущего кластера? Если да, могу ли я получить доступ ко всем кластерам изнутри модуля? Учетная запись службы, созданная terraform with gcloud auth , была аутентифицирована как учетная запись службы по умолчанию и не могла получить контейнер, даже если она была подключена к API kubernetes.

4. Я смог подключиться к нему, скопировав ~/.kube/config , который используется локально, в модуль и выполнив kubectl get po --kubeconfig=copied-conf . Проблема, похоже, в конфигурации kubeconfig в модуле. Есть ли простой способ получить эту конфигурацию?

5. Но конфигурация kubeconf имеет короткий срок, и я хочу легко автоматически фиксировать эту конфигурацию. gcloud container clusters get-credentials ${cluster-name} --zone ${zone} --project ${prj} Интересно, почему auth-provider в значительной степени отсутствует в учетных данных, которые я получаю, возможно