Подтвердить что ты не робот

Как добавить пользователей в Kubernetes (kubectl)?

Я создал кластер Kubernetes на AWS с kops и может успешно администрировать его с помощью kubectl с моей локальной машины.

Я могу просмотреть текущую конфигурацию с помощью kubectl config view, а также напрямую получить доступ к сохраненному состоянию в ~/.kube/config, например:

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: REDACTED
    server: https://api.{CLUSTER_NAME}
  name: {CLUSTER_NAME}
contexts:
- context:
    cluster: {CLUSTER_NAME}
    user: {CLUSTER_NAME}
  name: {CLUSTER_NAME}
current-context: {CLUSTER_NAME}
kind: Config
preferences: {}
users:
- name: {CLUSTER_NAME}
  user:
    client-certificate-data: REDACTED
    client-key-data: REDACTED
    password: REDACTED
    username: admin
- name: {CLUSTER_NAME}-basic-auth
  user:
    password: REDACTED
    username: admin

Мне нужно разрешить другим пользователям также администрировать. Это руководство пользователя описывает, как определить их на другом компьютере пользователя, но не описывает, как фактически создавать учетные данные пользователя внутри самого кластера. Как вы это делаете?

Кроме того, можно ли просто поделиться cluster.certificate-authority-data?

4b9b3361

Ответ 1

На момент написания статьи (PRE k8s 1.6) улучшенная поддержка пользовательских объектов все еще находится в стадии разработки, а самые простые сейчас - serviceaccounts - с некоторыми опциями для специализированных политик для контроля доступа. (см. ниже)

ПРИМЕЧАНИЕ 1.6 было выпущено с использованием управления доступом на основе ролей по умолчанию - этот пост не обновляется этой информацией

EDIT: отличный гид от Bitnami на Настройка пользователя с помощью RBAC!

Шаги по включению доступа к учетной записи службы (по умолчанию без правил RBAC или ABAC, эти учетные записи имеют полные права администратора!):

EDIT: Вот bash script для автоматизации создания учетной записи службы - см. ниже шаги

  • Создайте учетную запись пользователя Alice

    kubectl create sa alice
    
  • Получить связанный секрет

    secret=$(kubectl get sa alice -o json | jq -r .secrets[].name)
    
  • Получите ca.crt из тайны (используя OSX base64 с флагом -D для декодирования)

    kubectl get secret $secret -o json | jq -r '.data["ca.crt"]' | base64 -D > ca.crt
    
  • Получить токен учетной записи службы из секретного

    user_token=$(kubectl get secret $secret -o json | jq -r '.data["token"]' | base64 -D)
    
  • Получить информацию из вашей конфигурации kubectl (текущий-контекст, сервер..)

    # get current context
    c=`kubectl config current-context`
    
    # get cluster name of context
    name=`kubectl config get-contexts $c | awk '{print $3}' | tail -n 1`
    
    # get endpoint of current context 
    endpoint=`kubectl config view -o jsonpath="{.clusters[?(@.name == \"$name\")].cluster.server}"`
    
  • На новой машине выполните следующие шаги (с учетом полученной информации ca.cert и $endpoint:

    • Установите kubectl

      brew install kubectl
      
    • Установить кластер (запустить в каталоге, где хранится ca.crt)

      kubectl config set-cluster cluster-staging \
        --embed-certs=true \
        --server=$endpoint \
        --certificate-authority=./ca.crt
      
    • Установить учетные данные пользователя

      kubectl config set-credentials alice-staging --token=$user_token
      
    • Определите комбинацию пользователя alice с промежуточным кластером

      kubectl config set-context alice-staging \
        --cluster=cluster-staging \
        --user=alice-staging \
        --namespace=alice
      
    • Переключить текущий контекст в alice-staging для пользователя

      kubectl config use-context alice-staging
      

Чтобы управлять доступом пользователей с помощью политик (с использованием ABAC), вам необходимо создать файл policy:

{
  "apiVersion": "abac.authorization.kubernetes.io/v1beta1",
  "kind": "Policy",
  "spec": {
    "user": "system:serviceaccount:default:alice",
    "namespace": "default",
    "resource": "*",
    "readonly": true
  }
}

Предоставьте это policy.json для каждого мастера node и добавьте флаги --authorization-mode=ABAC --authorization-policy-file=/path/to/policy.json к серверам API

Это позволит Алисе (через ее учетную запись службы) читать только права на все ресурсы только в пространстве имен по умолчанию.

Лучшим решением является реализация coreos/dex в качестве поставщика Auth'n для Kubernetes (это может интегрироваться с вашей организацией GitHub) и использовать RBAC.

RBAC все еще находятся в Alpha для k8s 1.5, но запланированы для Beta в k8s 1.6

1.6 План выпуска на момент написания:

March 14th 2017 (Tuesday) Lift code freeze and v1.6.0-rc.1
March 22nd 2017 (Wednesday) - v1.6.0 

PR Предварительный просмотр документации RBAC

Ответ 2

Вы говорите:

Мне нужно разрешить другим пользователям также администрировать.

Но согласно документации

Предполагается, что обычные пользователи управляются внешней независимой службой. Администратор, распространяющий личные ключи, пользовательский магазин, такой как Keystone или Google Accounts, даже файл со списком имен пользователей и паролей. В связи с этим у Kubernetes нет объектов, которые представляют собой обычные учетные записи пользователей. Обычные пользователи не могут быть добавлены в кластер через вызов API.

Для этого вам нужно использовать сторонний инструмент.

== Правка ==

Одним из решений может быть вручную создать запись пользователя в файле kubeconfig. Из документа :

# create kubeconfig entry
$ kubectl config set-cluster $CLUSTER_NICK \
    --server=https://1.1.1.1 \
    --certificate-authority=/path/to/apiserver/ca_file \
    --embed-certs=true \
    # Or if tls not needed, replace --certificate-authority and --embed-certs with
    --insecure-skip-tls-verify=true \
    --kubeconfig=/path/to/standalone/.kube/config

# create user entry
$ kubectl config set-credentials $USER_NICK \
    # bearer token credentials, generated on kube master
    --token=$token \
    # use either username|password or token, not both
    --username=$username \
    --password=$password \
    --client-certificate=/path/to/crt_file \
    --client-key=/path/to/key_file \
    --embed-certs=true \
    --kubeconfig=/path/to/standalone/.kube/config

# create context entry
$ kubectl config set-context $CONTEXT_NAME \
    --cluster=$CLUSTER_NICK \
    --user=$USER_NICK \
    --kubeconfig=/path/to/standalone/.kube/config