Как получить учетные данные созданного кластера Google Kubernetes (GKE) в Ansible? - PullRequest
0 голосов
/ 08 июля 2020

Я создаю кластер и пул узлов с

- name: "Create Google Kubernetes Engine Cluster to be setup with with kubectl"
  gcp_container_cluster:
    name: "{{cluster_name}}"
    project: "{{project_id}}"
    auth_kind: "serviceaccount"
    location: "{{cluster_location}}"
    logging_service: "none"
    monitoring_service: "none"
    service_account_contents: "{{service_account_contents}}"
    initial_node_count: 1
  register: cluster
- name: "Create node pool for system pods"
  gcp_container_node_pool:
    name: "default-pool"
    project: "{{project_id}}"
    cluster: "{{ cluster }}"
    auth_kind: "serviceaccount"
    location: "{{cluster_location}}"
    autoscaling:
      enabled: "no"
    initial_node_count: 1
    service_account_contents: "{{service_account_contents}}"
    config:
      machine_type: "g1-small"
      disk_size_gb: 25
      preemptible: "no"
    management:
      auto_repair: "yes"
      auto_upgrade: "yes"

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

Во-первых, документация бесполезна как по формулировкам, так и по примерам. Я не нашел ни руководства, ни сообщения в блоге, ни чего-либо еще, и чувствую, что я первый, кто выполняет эту задачу с Ansible. Я внимательно изучил возвращенный объект кластера (сохраненный с register выше), но не нашел ничего подходящего. Это относится как к gcp_container_cluster, так и к gcp_container_cluster_info.

Насколько я понимаю, мне нужно каким-то образом получить kubeconfig с модулем Ansible, который я могу использовать в модуле k8s, как я бы сделал с gcloud container clusters get-credentials. Я хотел бы сначала посмотреть, есть ли встроенный способ, прежде чем использовать хакерский обходной путь с помощью команд оболочки в Ansible.

Я использую Ansible 2.9.10 в Ubuntu 20.04.

Ответы [ 2 ]

2 голосов
/ 09 июля 2020

Когда вы создаете кластер с использованием gcp_container_cluster, возвращаемое значение будет включать путь, по которому хранится файл kubeconfig . Вы можете сослаться на этот путь, используя свой пример с помощью {{cluster.kubectlPath}}.

Если вы хотите использовать модуль k8s, вы можете указать путь к файлу kubeconfig для использования для модуля .. Это будет выглядеть примерно так:

    - name: "Create Google Kubernetes Engine Cluster to be setup with with kubectl"
      gcp_container_cluster:
        name: "{{cluster_name}}"
        kubectlPath: /path/to/save/config
        [...]
      register: cluster
    - name: "Create k8s resource"
      k8s:
        kubeconfig: "{{ cluster.kubectlPath }}"
        definition:
          [...]

РЕДАКТИРОВАТЬ: Я неправильно прочитал документ, в разделе «ответ» уточняется, что это поле должно быть установлено для файла, который будет записан в этом путь, для этого поля нет значения по умолчанию.

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

Это кажется невозможным из-за https://github.com/ansible/ansible/issues/66096.

Я обошел это с помощью

- name: "Circumvent https://github.com/ansible/ansible/issues/66096 which makes it impossible to retrieve the
kubecontext retrieved during cluster creation, asked
https://stackoverflow.com/questions/62799952/how-to-update-the-ansible-gcp-container-cluster-module for input"
  block:
    - name: "Create temporary file for gcloud key"
      tempfile: ~
      register: gcloud_key_tempfile
    - name: "Write gcloud key to temporary file"
      copy: content="{{ service_account_contents }}" dest={{ gcloud_key_tempfile.path }}
    - name: "Retrieve k8s credentials through gcloud shell commands"
      shell: |
        gcloud config set project {{ project_id }}
        gcloud config set compute/zone {{ cluster_location }}
        gcloud auth activate-service-account --key-file {{ gcloud_key_tempfile.path }}
        env KUBECONFIG={{kubectl_tempfile.path}} gcloud container clusters get-credentials {{ cluster_name }}
    - set_fact:
        kubeconfig_path: "{{ kubectl_tempfile.path }}"
  always:
    - name: "Remove temporary file for gcloud key"
      file: dest="{{ gcloud_key_tempfile.path }}" state=absent
...