Как я могу удалить модуль с помощью функции 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