Как получить доступ к секретам хранилища из другого кластера kubernetes, когда хранилище развернуто в выделенном кластере? - PullRequest
0 голосов
/ 14 мая 2019

Я создал 2 кластера kubernetes в одном VPC в одном регионе в AWS.

Первый кластер посвящен моим микро-сервисам. Назовите его «MS» Второй посвящен хранилищу и его высокодоступному хранилищу (консул). Давайте назовем это "V"

Вопрос в том, как я могу получить доступ к секретам, которые я создал в кластере "V", из контейнеров в кластере "MS"?

Что я пробовал до сих пор:

1) Я начал с создания новой учетной записи службы в кластере «MS», которая аутентифицируется с помощью API маркеров проверки.

2) Затем мне пришлось извлечь токен JWT, сертификат CA Kuberenetes и хост Kubernetes из кластера "MI"

3) Затем я переключился на контекст кластера «V», чтобы включить и создать новый метод аутентификации kubernetes, присоединенный к этой учетной записи службы.

Оттуда я не знаю, что делать, и я не уверен, что этот метод действительно работает при использовании 2 разных кластеров!?

Сервисный аккаунт:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: consul
  labels:
    app: consul
rules:
  - apiGroups: [""]
    resources:
      - pods
    verbs:
      - get
      - list
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: consul
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: consul
subjects:
  - kind: ServiceAccount
    name: consul
    namespace: default
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: consul
  labels:
    app: consul

Экспорт переменных просмотра токенов из кластера "MI"

export VAULT_SA_NAME=$(kubectl get sa postgres-vault -o jsonpath="{.secrets[*]['name']}")

export SA_JWT_TOKEN=$(kubectl get secret $VAULT_SA_NAME -o jsonpath="{.data.token}" | base64 --decode; echo)

export SA_CA_CRT=$(kubectl get secret $VAULT_SA_NAME -o jsonpath="{.data['ca\.crt']}" | base64 --decode; echo)

export K8S_HOST=$(kubectl exec consul-consul-0 -- sh -c 'echo $KUBERNETES_SERVICE_HOST')

Создание метода аутентификации kubernetes


vault auth enable kubernetes
vault write auth/kubernetes/config \
  token_reviewer_jwt="$SA_JWT_TOKEN" \
  kubernetes_host="https://$K8S_HOST:443" \
  kubernetes_ca_cert="$SA_CA_CRT"

Я ожидаю получить доступ к секретам, хранящимся в хранилище, от моих микросервисов. Хотя я не уверен, что этот метод работает, когда хранилище развернуто в выделенном кластере. Я думаю, что может быть что-то еще, чтобы объединить оба кластера! Может быть, используете консул?

1 Ответ

1 голос
/ 14 мая 2019

Вы на 80%. следующие шаги: 1. Запустите развертывание с правильной учетной записью службы 2. Войдите в систему / выполните аутентификацию в хранилище, используя метод аутентификации Kubernetes, и получите соответствующий токен хранилища. 3. Получить секреты.

Это пример добавления учетной записи службы в ваше развертывание:

apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: xxx
  labels:
    app: xxx
spec:
  replicas: 1
  template:
    metadata:
      ...
    spec:
      serviceAccountName: vault-auth
  ...

Чтобы войти в систему с помощью kube auth, см. здесь . Я бы посоветовал вам взглянуть на этот проект для конкретного примера.

Получив токен с правильными разрешениями, вы можете использовать vault cli / rest api для доступа к секретам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...