如何通过Oracle Function删除吊舱?

时间:2020-05-20 14:09:44

标签: oracle-call-interface oracle-cloud-infrastructure fn oci-go-sdk

我在OKE内有一个群集,其中包含一些部署/服务/等...,通常我从PC上通过kubectl连接到该群集。

问题是:是否可以从Oracle Function中删除该集群内的Pod? 我想做的是建立一个CI / CD链,通过网关触发我的功能以执行我的“ ci-function”,这部分工作得很好。

我正在使用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: []

需要在功能env内安装oci,但我无法安装。

此外,这里使用的oci-cli是开源的,这是生成此处使用的令牌的有趣部分: https://github.com/oracle/oci-cli/blob/cf04fa4f08238cb1ee4287f0354603ba92e60647/services/container_engine/src/oci_cli_co… 但是我无法重新创建此部分并直接在kubeconfig中使用它。

有人知道这样做吗?

预先感谢

2 个答案:

答案 0 :(得分:3)

我认为您已经搞清楚了,但是与功能中其他OCI服务进行交互的最佳方法是使用功能的“资源主体”向该服务进行身份验证。这是赋予您的功能的身份,以便您可以编写策略以使其能够与其他OCI资源进行交互。由于表示该身份的临时API密钥已由服务传递到您的Function中,因此,您可以自行处理任何凭据。

要与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”。 https://constructive-laziness.blogspot.com/2020/05/the-case-of-vanishing-dockerfile.html上有一篇有关如何提取隐式dockerfile的博客文章。 现在,您可以根据此处的说明,添加到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的Function团队工作的,并且根据我所知,以上建议是正确的,但不构成官方支持)

答案 1 :(得分:0)

您应该能够使用Go SDK来更新https://docs.cloud.oracle.com/en-us/iaas/Content/API/SDKDocs/gosdk.htm

中提到的OCI函数中的集群和NodePool。

或者,您还应该能够在OCI函数中的Go代码中启动HTTP客户端,并调用OKE的UpdateCluster和UpdateNodePool REST API,例如, https://docs.cloud.oracle.com/en-us/iaas/api/#/en/containerengine/20180222/NodePool/UpdateNodePool