Включение API-интерфейсов REST для развертывания, обслуживания GKE и прочего - PullRequest
1 голос
/ 13 июля 2020

Я пытаюсь развернуть приложения на GKE с помощью REST API. Однако документация GKE перепутана и неясна относительно того, как включить доступ Kubernetes REST API.

Есть ли у кого-нибудь здесь четкое представление о том, как создать кластер развертывания Kubernetes в Google Cloud? Если да, я хотел бы узнать подробные инструкции по включению того же. В настоящее время это то, что я получаю.

https://xx.xx.xx.xx/apis/apps/v1/namespaces/default/deployments/nginx-1 Вызов GET дает ниже JSON вывод, несмотря на действительный токен авторизации

{
    "kind": "Status",
    "apiVersion": "v1",
    "metadata": {},
    "status": "Failure",
    "message": "deployments.apps \"nginx-1\" is forbidden: User \"system:serviceaccount:default:default\" cannot get resource \"deployments\" in API group \"apps\" in the namespace \"default\"",
    "reason": "Forbidden",
    "details": {
        "name": "nginx-1",
        "group": "apps",
        "kind": "deployments"
    },
    "code": 403
}

Однако API администрирования, похоже, включены:

Следуя инструкциям в по этой ссылке и выполняя следующие команды:

# Check all possible clusters, as your .KUBECONFIG may have multiple contexts:
kubectl config view -o jsonpath='{"Cluster name\tServer\n"}{range .clusters[*]}{.name}{"\t"}{.cluster.server}{"\n"}{end}'

# Select name of cluster you want to interact with from above output:
export CLUSTER_NAME="some_server_name"

# Point to the API server referring the cluster name
APISERVER=$(kubectl config view -o jsonpath="{.clusters[?(@.name==\"$CLUSTER_NAME\")].cluster.server}")

# Gets the token value
TOKEN=$(kubectl get secrets -o jsonpath="{.items[?(@.metadata.annotations['kubernetes\.io/service-account\.name']=='default')].data.token}"|base64 --decode)

# Explore the API with TOKEN
curl -X GET $APISERVER/api --header "Authorization: Bearer $TOKEN" --insecure

дает желаемый результат.

1 Ответ

0 голосов
/ 13 июля 2020

Учетная запись службы default в пространстве имен default не имеет RBA C для выполнения команды get для ресурса deployment в пространстве имен default.

Используйте ниже role и rolebinding для предоставления необходимого разрешения учетной записи службы.

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: deployment-reader
rules:
- apiGroups: ["apps"]
  resources: ["deployments"]
  verbs: ["get", "watch", "list"]

---

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: read-deployment
  namespace: default
subjects:
# You can specify more than one "subject"
- kind: ServiceAccount
  name: default # "name" is case sensitive
  namespace: default
roleRef:
  # "roleRef" specifies the binding to a Role / ClusterRole
  kind: Role #this must be Role or ClusterRole
  name: deployment-reader # this must match the name of the Role or ClusterRole you wish to bind to
  apiGroup: rbac.authorization.k8s.io

Для проверки разрешения

kubectl auth can-i get deployments --as=system:serviceaccount:default:default -n default
yes
...