代码之家  ›  专栏  ›  技术社区  ›  Razvan

从AzureDevOpsDeploytoKubernetes任务获取输出

  •  0
  • Razvan  · 技术社区  · 5 年前

    设置说明

    我有以下场景:在AzureDevOps中创建了一个构建管道,在设置了我的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}"'
    

    所以任务运行成功,我想得到上面命令的输出字符串。在管道可视化设计器中,它向我显示 未定义.kubectloutput 正在写信给。

    问题陈述

    我已经在上面的kubectl任务之后直接创建了后续的bash脚本任务。如果我读取变量 美元输出 $未定义的输出 它只返回一个空字符串。我做错什么了?我只需要前面命令的输出作为变量。

    我的行动目标

    我正在尝试确保在上一步中使用helm图表部署的应用程序已经启动并运行。在下一步中,我需要在应用程序pods中运行一些脚本(使用kubectl exec),因此我要确保至少有一个承载应用程序的pod启动并运行,以便我可以对其执行命令。同时,我意识到,如果在部署头盔图时使用--wait标志,就可以跳过检查步骤,但是在bash脚本中使用kubectl仍然有问题。

    2 回复  |  直到 5 年前
        1
  •  1
  •   4c74356b41    5 年前

    这就是我一直在使用的:

    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任务,因此您的代理从AzureDevOps下载kubectl配置。
    以上操作必须在此目录中运行:

    /home/vsts/work/_temp/kubectlTask
    
        2
  •  0
  •   Razvan    5 年前

    在花了几个小时的时间试图弄清楚AzureDevOps如何连接到AKS集群之后,我发现它正在使用一个OAuth访问令牌,据我所知。可以使用system.access token变量访问此令牌(如果允许代理作业访问令牌-这是一个配置选项,默认情况下是关闭的)。我无法理解的是如何在脚本中使用这个标记和kubectl,所以我暂时放弃了这条路径。

    此外,作业运行在托管的Ubuntu代理上(与Microsoft托管的一样),因此出于安全原因,它可能会避免下载配置文件,即使Microsoft本身认为代理是一次性虚拟机,并且“一次使用后虚拟机将被丢弃”。 see MS docs here .

    在托管代理上工作的内容(我仍然建议对生产方案进行一些加密)-使用Azure CLI命令登录并获取群集凭据:

    az login
    az aks get-credentials --resource-group=MyClusterDEV --name myCluster
    kubectl […]
    

    我使用的另一种解决方案是在已经预先配置了kubernetes配置文件的本地代理上运行脚本。为此,我只创建了一个额外的代理作业来运行脚本,所以现在我有:

    1. 执行helm init和其他基本设置任务的通用代理作业(托管Ubuntu 16)
    2. 针对特定pods运行更复杂脚本的本地代理作业(Windows)