我需要在应用程序中添加kubectl apply
功能。
我浏览了kubectl go-client
,其中没有关于apply命令的规定。
kubectl
的实例吗? k8s.io/kubernetes
包来模拟kubectl apply
命令吗?如有需要,将提出问题和澄清。
答案 0 :(得分:4)
- 我可以在应用程序中创建kubectl的实例吗?
您可以将kubectl
命令包装在您的应用程序中,然后像在shell脚本中一样在新的子进程中启动它。有关更多信息,请参见go中的exec
软件包:https://golang.org/pkg/os/exec/
这对我们来说很好用,并且kubectl通常具有-o
-参数,该参数可让您控制输出格式,以便您获得机器可读的文本。
已经有一些使用这种方法的开源项目:
- 如果不是1,我可以使用k8s.io/kubernetes包来模拟kubectl apply命令吗?
在搜索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
应该仅从命令行使用os.system
,类似的内容也会出现在golang import "os/exec
“中,但是这种方法很脏