Как я могу удалить модуль с помощью функции 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/src/oci_cli_co Icli_cli не удалось воссоздать эту часть и напрямую использовать ее внутри kubeconfig.

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

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

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 CLI на основе инструкций здесь: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 в группе функций, и приведенный выше совет верен, насколько мне известно, но не является официальной поддержкой)

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

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

Другие вопросы по тегам