我有一个集群,在OKE中有一些部署/服务/等,我通常通过kubectl从我的电脑连接到它。
问题是:是否可以从 Oracle 函数中删除该集群内的 Pod? 我想做的是构建一个 CI/CD 链,通过网关触发我的函数来执行我的"ci 函数",这部分运行良好。
我正在使用 oci-go-sdk 在 Go 中编写我的函数,但问题是:
我可以使用以下命令获取集群的 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... 但是我无法重新创建这部分并直接在 kubeconfig 中使用它。
有人知道有什么办法可以做到这一点吗?
提前致谢
我认为您已经弄清楚了这一点,但与函数中的其他 OCI 服务交互的最佳方式是使用函数的"资源主体"向该服务进行身份验证。这是赋予函数的标识,以便您可以编写策略以允许它与其他 OCI 资源交互。这样可以节省您自己处理任何凭据的时间,因为表示此标识的临时 API 密钥由服务传递到您的函数中。
要与 Kubernetes 集群进行交互,您需要一个 kubeconfig,正如您所看到的,这可以由 OKE API 生成。
返回的 kubeconfig 使用基于时间的临时令牌向集群进行身份验证,正如您在交互式用例中看到的那样,在 OCI CLI 中实现了此令牌生成。
不幸的是,SDK 中没有实现此方法,因此您需要执行以下操作之一。
将生成令牌的 CLI 中的代码复制到您的函数代码中,如有必要,翻译成您选择的语言,然后将生成的令牌传递到您的 kubeconfig 中
保留执行 OCI CLI 以获取令牌的配置,安装 OCI CLI 并使 OCI CLI 使用资源主体生成令牌
既然你说你尝试了第一种方法但没有成功,而且由于第一种方法有点繁琐,我将介绍你将如何实现第二种方法。
要安装 OCI CLI,您需要控制 docker 构建过程,以便修改生成的函数映像的内容。 每个 FDK 都有一个"隐式"Dockerfile。您可以在 Fn CLI 中找到这些文件的样板文件,然后可以将该 Dockerfile 放在函数目录中,并将 func.yaml 中的函数类型更改为"docker"。 这里有一篇关于如何提取隐式 dockerfile 的博客文章 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 由于 Go 的 FDK 基础映像是基于高山的,因此该过程可能需要一些修改以适应这一点。
若要使 OCI CLI 使用资源主体,需要设置环境变量OCI_CLI_AUTH
以resource_principal
这可以在 Dockerfile 最后阶段的ENV
行中完成
您还需要确保将函数放在动态组中,并根据此处的文档为您的函数制定适当的策略 https://docs.cloud.oracle.com/en-us/iaas/Content/Functions/Tasks/functionsaccessingociresources.htm?Highlight=functions%20resource%20principal
(免责声明,我在Oracle的职能团队工作,据我所知,上述建议是正确的,但不构成官方支持(
您应该能够使用 Go SDK 更新 OCI 函数中的集群和节点池,如 https://docs.cloud.oracle.com/en-us/iaas/Content/API/SDKDocs/gosdk.htm 中所述
或者,您还应该能够在 OCI 函数的 Go 代码中启动一个 HTTP 客户端,并调用 OKE 的 UpdateCluster 和 UpdateNodePool REST API,例如 https://docs.cloud.oracle.com/en-us/iaas/api/#/en/containerengine/20180222/NodePool/UpdateNodePool