使用k8s.io软件包使用Kubectl Apply命令

时间:2018-10-25 09:04:31

标签: go kubernetes

我需要在应用程序中添加kubectl apply功能。

我浏览了kubectl go-client,其中没有关于apply命令的规定。

  1. 我可以在go-application中创建kubectl的实例吗?
  2. 如果不是1,我可以使用k8s.io/kubernetes包来模拟kubectl apply命令吗?

如有需要,将提出问题和澄清。

3 个答案:

答案 0 :(得分:4)

  
      
  1. 我可以在应用程序中创建kubectl的实例吗?
  2.   

您可以将kubectl命令包装在您的应用程序中,然后像在shell脚本中一样在新的子进程中启动它。有关更多信息,请参见go中的exec软件包:https://golang.org/pkg/os/exec/

这对我们来说很好用,并且kubectl通常具有-o-参数,该参数可让您控制输出格式,以便您获得机器可读的文本。

已经有一些使用这种方法的开源项目:

  
      
  1. 如果不是1,我可以使用k8s.io/kubernetes包来模拟kubectl apply命令吗?
  2.   

在搜索kubectl源代码时是否找到了https://github.com/kubernetes/kubernetes/blob/master/pkg/kubectl/cmd/apply/apply.go? 看一下运行功能:

func (o *ApplyOptions) Run() error {
    ...
    r := o.Builder.
        Unstructured().
        Schema(o.Validator).
        ContinueOnError().
        NamespaceParam(o.Namespace).DefaultNamespace().
        FilenameParam(o.EnforceNamespace, &o.DeleteOptions.FilenameOptions).
        LabelSelectorParam(o.Selector).
        IncludeUninitialized(o.ShouldIncludeUninitialized).
        Flatten().
        Do()
    ...
    err = r.Visit(func(info *resource.Info, err error) error {
    ...

它的可读性不是很好,但这就是kubectl apply所做的。 也许谁可能是调试代码并查看进一步功能的一种可能方式。

答案 1 :(得分:0)

这可以通过创建插件并将其添加到kubectl来完成。

  

您可以使用允许您编写命令行命令的任何编程语言或脚本来编写插件。

     

不需要插件安装或预加载。插件可执行文件从kubectl二进制文件接收继承的环境。插件根据其名称确定要实现的命令路径。例如,想要提供新命令kubectl foo的插件将简单地命名为kubectl-foo,并且位于用户PATH中的某个位置。

示例插件可以如下所示:

#!/bin/bash
# optional argument handling
if [[ "$1" == "version" ]]
then
  echo "1.0.0"
  exit 0
fi

# optional argument handling
if [[ "$1" == "config" ]]
then
  echo $KUBECONFIG
  exit 0
fi
echo "I am a plugin named kubectl-foo"

之后,只需将其设为可执行文件chmod +x ./kubectl-foo,然后将其移至路径mv ./kubectl-foo /usr/local/bin

现在您应该可以通过kubectl foo调用它了:

$ kubectl foo
I am a plugin named kubectl-foo

所有args和标志均按原样传递给可执行文件:

$ kubectl foo version
1.0.0

您可以在Kubernetes Extend kubectl with plugins文档中了解有关kubectl插件的更多信息。

答案 2 :(得分:0)

  • kubectl应该仅从命令行使用
  • 但是您可以使用某种形式的exec将其包裹在代码内,例如python中的os.system,类似的内容也会出现在golang import "os/exec“中,但是这种方法很脏
  • 您需要在代码中使用客户端库来执行操作
  • 客户端库的列表为here