我有以下情况:在Azure DevOps中创建了构建管道,设置了Kubernetes群集后,我想使用kubectl获得特定的pod名称。我是通过“部署到Kubernetes”任务V1来完成此任务的,它看起来像这样:
steps:
- task: Kubernetes@1
displayName: 'Get pod name'
inputs:
azureSubscriptionEndpoint: 'Azure Pay-as-you-Go (anonymized)'
azureResourceGroup: MyK8sDEV
kubernetesCluster: myCluster
command: get
arguments: 'pods -l "app=hlf-ca,release=ca" -o jsonpath="{.items[0].metadata.name}"'
因此任务正在成功运行,我想获取以上命令的输出字符串。在Pipeline视觉设计器中,它向我显示了正在写入的 undefined.KubectlOutput 输出变量。
在上面的kubectl任务之后,我直接创建了一个后续的Bash脚本任务。如果我读取变量 $ KUBECTLOUTPUT 或 $ UNDEFINED_KUBECTLOUTPUT ,它只会返回一个空字符串。我究竟做错了什么?我只需要将上一条命令的输出作为变量即可。
我试图确保在上一步中使用舵图部署的应用程序已启动并正在运行。在下一步中,我需要在应用程序pod内运行一些脚本(使用kubectl exec),因此我要确保至少有一个托管该应用程序的pod已启动并正在运行,以便可以对其执行命令。同时,我意识到如果在部署Helm图表时使用--wait标志,可以跳过检查步骤,但是在bash脚本中使用kubectl仍然存在问题。
答案 0 :(得分:1)
这就是我一直在使用的:
config=`find . -name config`
kubectl --kubeconfig $config get -n $(k8sEnv) deploy --selector=type=$(containerType) -o | jq '.items[].metadata.name' \
| xargs -L 1 -i kubectl --kubeconfig $config set -n $(k8sEnv) image deploy/{} containername=registry.azurecr.io/$(containerImage):$(BUILD.BUILDNUMBER) --record=true
这将找到带有特定标签的所有部署,并在每个部署上运行kubectl,您可以轻松地将其适应您的需求。唯一的先决条件是,您必须先执行kubectl任务,然后代理才能从Azure Devops下载kubectl配置。
上面的代码必须在以下目录中运行:
/home/vsts/work/_temp/kubectlTask
答案 1 :(得分:0)
经过几个小时的尝试,弄清楚了天蓝色的devops如何连接到AKS集群,据我所知,我发现它正在使用OAuth访问令牌。可以使用System.AccessToken变量访问此令牌(如果允许代理作业访问令牌-这是一个配置选项,默认情况下处于禁用状态)。我不知道是如何在脚本中将这个令牌与kubectl一起使用的,所以我现在已经放弃了此路径。
该作业还运行在托管的Ubuntu代理(如Microsoft托管)上,因此出于安全原因,它可能避免下载配置文件,即使Microsoft自己坚持认为代理是一次性VM,并且“一次使用后,机器将被丢弃” see MS docs here。
在托管代理上有效的方法(我仍然建议在生产场景中使用一些加密方法)-使用azure CLI命令登录并获取群集凭据:
az login
az aks get-credentials --resource-group=MyClusterDEV --name myCluster
kubectl […]
我使用的替代解决方案是在已预先配置Kubernetes配置文件的本地代理上运行脚本。为此,我只是创建了一个额外的代理作业来运行我的脚本,所以现在我有了: