Ansible: получить api_token из gce_container_cluster - PullRequest
0 голосов
/ 13 октября 2019

Я запускаю кластер GCP без проблем, но я не знаю, как заставить работать работающий модуль k8s. Я бы предпочел, чтобы api_key проходил аутентификацию в модуле k8s.

Моя книга игр выглядит следующим образом.

- name: Hello k8s
  hosts: all
  tasks:
    - name: Create a cluster
      register: cluster
      gcp_container_cluster:
        name: thecluster
        initial_node_count: 1
        master_auth:
          username: admin
          password: TheRandomPassword
        node_config:
          machine_type: g1-small
          disk_size_gb: 10
          oauth_scopes:
            - "https://www.googleapis.com/auth/compute"
            - "https://www.googleapis.com/auth/devstorage.read_only"
            - "https://www.googleapis.com/auth/logging.write"
            - "https://www.googleapis.com/auth/monitoring"
        zone: europe-west3-c
        project:  second-network-255214 
        auth_kind: serviceaccount
        service_account_file: "{{ lookup('env', 'GOOGLE_CREDENTIALS') }}"
        state: present 
    - name: Show results
      debug: var=cluster
    - name: Create temporary file for CA
      tempfile:
        state: file
        suffix: build
      register: ca_crt
    - name: Save content to file
      copy: 
        content: "{{ cluster.masterAuth.clusterCaCertificate |b64decode }}"
        dest: "{{ ca_crt.path }}"
    - name: Create a k8s namespace
      k8s:
        host: "https://{{ cluster.endpoint }}"
        ca_cert: "{{ ca_crt.path }}"
        api_key: "{{ cluster.HOW_I_GET_THE_API_KEY}}" <<<-- Here is what I want!!!
        name: testing
        api_version: v1
        kind: Namespace
        state: present 

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 14 октября 2019

Согласно подробному руководству , masterAuth содержит два других поля, clientCertificate и clientKey, которые соответствуют параметрам client_cert: и client_key: соответственно,С этого момента вы можете аутентифицироваться на конечной точке вашего кластера как cluster-admin, используя очень и очень сильные учетные данные закрытого ключа, и с этого момента использовать ту же задачу k8s:, чтобы предоставить себе токен cluster-admin ServiceAccount, еслиВы хотите сделать это.

Вы также можете явно использовать masterAuth.username и masterAuth.password в параметрах username: и password: k8s:, которые должны быть такими же безопасными, поскольку учетные данныепутешествовать по HTTPS, но вам показалось, что вас больше интересует решение с более высокой энтропийной аутентификацией.

0 голосов
/ 14 октября 2019

Я нашел обходной путь, который должен вызывать gcloud напрямую:

    - name: Get JWT
      command: gcloud auth application-default print-access-token
      register: api_key

Очевидно, мне нужно было:

  • Установить GCloud
  • Переопределить envvar с помощьюот auth.json до GOOGLE_APPLICATION_CREDENTIALS.

Задача вызывает gcloud напрямую для получения токена, поэтому нет необходимости генерировать токен. Я постараюсь добавить, чтобы добавить эту функцию в качестве модуля в ansible для лучшей совместимости с kubernetes.

После получения можно вызвать модуль k8s следующим образом:

    - name: Create ClusterRoleBinding
      k8s:
        state: present
        host: "https://{{ cluster.endpoint }}"
        ca_cert: "{{ ca_crt.path }}"
        api_version: rbac.authorization.k8s.io/v1
        api_key: "{{ api_key.stdout }}"
        definition:
          kind: ClusterRoleBinding
          metadata:
            name: kube-system_default_cluster-admin
          subjects:
          - kind: ServiceAccount
            name: default # Name is case sensitive
            namespace: kube-system
          roleRef:
            kind: ClusterRole
            name: cluster-admin
            apiGroup: rbac.authorization.k8s.io
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...