Как удалить модуль с помощью функции Oracle?

У меня есть кластер с некоторыми развертываниями / услугами / и т. Д. Внутри OKE, к которому я обычно подключаюсь через kubectl со своего компьютера.

Возникает вопрос: можно ли удалить модуль внутри этого кластера из функции Oracle? Я хочу построить цепочку CI / CD, запускающую мою функцию через шлюз для выполнения моей «ci-функции», и эта часть работает хорошо.

Я пишу свои функции на Go, используя oci-go-sdk, но вот проблема:

Я могу получить файл Kubeconfig своего кластера с помощью:

   resp, err := client.CreateKubeconfig(ctx, containerengine.CreateKubeconfigRequest{

  ClusterId: &cID,

  })

Но этот файл Kubeconfig содержит:

- name: user-**********
  user:
    exec:
      apiVersion: client.authentication.k8s.io/v1beta1
      args:
      - ce
      - cluster
      - generate-token
      - --cluster-id
      - ocid1.cluster.oc1.*************************
      - --region
      - eu-frankfurt-1
      command: oci
      env: []

которым нужно установить oci внутри функции env, которую я не могу установить.

Кроме того, используется oci-cli с открытым исходным кодом, вот интересная часть, которая генерирует используемый здесь токен: https://github.com/oracle/oci-cli/blob/cf04fa4f08238cb1ee4287f0354603ba92e60647/services/container_engine/sr/oci_cli_co не удалось воссоздать эту часть ... и использовать его напрямую в kubeconfig.

Кто-нибудь знает, как это сделать?

заранее спасибо


person Cirelli94    schedule 20.05.2020    source источник


Ответы (2)


Я думаю, что вы уже поняли это, но лучший способ взаимодействовать с другими службами OCI в вашей функции - это аутентифицироваться в этой службе с помощью «принципала ресурса» функции. Это идентификатор, присвоенный вашей функции, чтобы вы могли писать политики, позволяющие ей взаимодействовать с другими ресурсами OCI. Это избавляет вас от необходимости самостоятельно обрабатывать любые учетные данные, поскольку эфемерный ключ API, представляющий эту личность, передается в вашу функцию службой.

Для взаимодействия с кластером Kubernetes вам понадобится kubeconfig, который, как видите, может быть сгенерирован API OKE.

Возвращенный kubeconfig использует токены на основе эфемерного времени для аутентификации в кластере, и, как вы можете видеть для интерактивных сценариев использования, существует реализация генерации этого токена в интерфейсе командной строки OCI.

К сожалению, в SDK нет реализации этого метода, поэтому вам необходимо выполнить одно из следующих действий.

  • Скопируйте код из интерфейса командной строки, который генерирует токен, в код вашей функции, при необходимости переведя на выбранный язык, а затем передайте этот сгенерированный токен в свой kubeconfig.

  • Сохраните конфигурацию, которая выполняет OCI CLI для получения токена, установите OCI CLI и заставьте OCI CLI сгенерировать токен с использованием принципала ресурса.

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

Чтобы установить OCI CLI, вам необходимо взять под контроль процесс сборки докера, чтобы вы могли изменять содержимое сгенерированного образа функции. У каждого FDK есть «неявный» Dockerfile. Вы можете найти шаблон для них в Fn CLI, а затем вы можете поместить этот Dockerfile в свой каталог функций и изменить тип функции в func.yaml на «docker». В блоге есть сообщение о том, как извлечь неявный файл докеров здесь https://constructive-laziness.blogspot.com/2020/05/the-case-of-vanishing-dockerfile.html Теперь вы можете добавить в файл Dockerfile шаги по установке интерфейса командной строки OCI в соответствии с инструкциями. здесь: https://docs.cloud.oracle.com/en-us/iaas/Content/API/SDKDocs/climanualinst.htm Поскольку базовые образы FDK для Go основаны на альпийских версиях, для этого могут потребоваться некоторые изменения.

Чтобы заставить OCI CLI использовать принципала ресурса, вам необходимо установить для переменной среды OCI_CLI_AUTH значение resource_principal. Это можно сделать в строке ENV на последнем этапе вашего Dockerfile.

Вам также необходимо убедиться, что у вас есть свои функции в динамической группе и соответствующая политика для вашей функции в соответствии с документами здесь https://docs.cloud.oracle.com/en-us/iaas/Content/Functions/Tasks/functionsaccessingociresources.htm?Highlight=functions%20resource%20principal

(Заявление об отказе от ответственности, я работаю в Oracle в группе функций, и приведенный выше совет, насколько мне известно, верен, но не является официальной поддержкой)

person rconan    schedule 10.06.2020
comment
эги рконан, это отличная идея! Мы решили сделать что-то подобное, но внутри кластера, запустив oci cli на веб-сервере с api, который мы вызываем удаленно через шлюз для выполнения обновления. Было бы интересно, если бы вы могли, кстати, создать для этого публичное рабочее решение! - person Cirelli94; 10.06.2020

Вы должны иметь возможность использовать Go SDK для обновления кластера и NodePool внутри своей функции OCI, как указано в https://docs.cloud.oracle.com/en-us/iaas/Content/API/SDKDocs./gosdk.htm

В качестве альтернативы вы также должны иметь возможность запускать HTTP-клиент внутри кода Go в своей функции OCI и вызывать API REST UpdateCluster и UpdateNodePool в OKE, см., Например, https://docs.cloud.oracle.com/en-us/iaas/api/#/en/containerengine/20180222/NodePool/UpdateNodePool

person Ling Toh    schedule 07.06.2020
comment
Пул узлов - это машины, на которых запускаются службы, необходимые для работы моих модулей, к сожалению, это совсем другое дело. NodePoolDetails и ClusterDetails не описывают вещи, это не интересные вещи, которые относятся к модулям, см. docs.cloud.oracle.com/en-us/iaas/api / # / en / containerengine / docs.cloud.oracle.com/en-us/iaas/api / # / en / containerengine / - person Cirelli94; 07.06.2020
comment
@ Cirelli94, я зацикливался на rconan, чтобы помочь с вашим вопросом. Его ответ выше должен больше соответствовать тому, что вы ищете. - person Ling Toh; 12.06.2020