Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 确保Kubernetes部署已完成,且所有POD均已更新且可用_Bash_Kubernetes - Fatal编程技术网

Bash 确保Kubernetes部署已完成,且所有POD均已更新且可用

Bash 确保Kubernetes部署已完成,且所有POD均已更新且可用,bash,kubernetes,Bash,Kubernetes,指示您可以查看部署observedgegenerationvsgeneration,当observedgegeneration>=generation时,部署成功。这很好,但我想知道新容器何时在我所有的pod中实际运行,这样,如果我点击了一个服务,我肯定会点击一个代表最新部署的容器的服务器 K8S松弛构件的另一个尖端: kubectl get deployments | grep <deployment-name> | sed 's/ /,/g' | cut -d ' ' -f 4

指示您可以查看部署
observedgegeneration
vs
generation
,当
observedgegeneration>=generation
时,部署成功。这很好,但我想知道新容器何时在我所有的pod中实际运行,这样,如果我点击了一个服务,我肯定会点击一个代表最新部署的容器的服务器

K8S松弛构件的另一个尖端:

kubectl get deployments | grep <deployment-name> | sed 's/ /,/g' | cut -d ' ' -f 4
kubectl-get-deployments | grep | sed's/,/g'| cut-d'-f 4
我部署了一个坏映像,导致
ErrImagePull
,但部署仍然报告了8个最新副本的正确数量(可用副本为7个)。

更新#2:Kubernetes 1.5将附带一个更好的
kubectl推出状态版本
,并在1.6中进一步改进,可能会替换下面列出的自定义解决方案/脚本

更新#1:我已将我的答案转化为一份报告,目前已收到少量改进的PRs

原始答案:

首先,我认为您得到的
kubectl
命令是不正确的:它用逗号替换所有空格,但在用空格分隔后尝试获取第四个字段

为了验证部署(或升级)是否对所有POD都有效,我认为您应该检查可用副本的数量是否与所需副本的数量匹配。也就是说,
kubectl
输出中的
可用
所需
列是否相等。而您可以通过以下方式获得可用副本的数量(第5列)

kubectl获得部署nginx | tail-n+2 | awk'{print$5}'

以及所需副本的数量(第2列)到

kubectl获得部署nginx | tail-n+2 | awk'{print$2}'

一种更简洁的方法是使用
kubectl
的jsonpath输出,特别是如果您还想考虑官方文档中提到的生成需求的话

下面是我编写的一个快速bash脚本,它希望在命令行上指定部署名称,等待观察到的生成成为指定的生成,然后等待可用副本达到指定副本的数量:

#!/bin/bash
set -o errexit
set -o pipefail
set -o nounset

deployment=

get_generation() {
  get_deployment_jsonpath '{.metadata.generation}'
}

get_observed_generation() {
  get_deployment_jsonpath '{.status.observedGeneration}'
}

get_replicas() {
  get_deployment_jsonpath '{.spec.replicas}'
}

get_available_replicas() {
  get_deployment_jsonpath '{.status.availableReplicas}'
}

get_deployment_jsonpath() {
  local readonly _jsonpath="$1"

  kubectl get deployment "${deployment}" -o "jsonpath=${_jsonpath}"
}

if [[ $# != 1 ]]; then
  echo "usage: $(basename $0) <deployment>" >&2
  exit 1
fi

readonly deployment="$1"

readonly generation=$(get_generation)
echo "waiting for specified generation ${generation} to be observed"
while [[ $(get_observed_generation) -lt ${generation} ]]; do
  sleep .5
done
echo "specified generation observed."

readonly replicas="$(get_replicas)"
echo "specified replicas: ${replicas}"

available=-1
while [[ ${available} -ne ${replicas} ]]; do
  sleep .5
  available=$(get_available_replicas)
  echo "available replicas: ${available}"
done

echo "deployment complete."
#/bin/bash
set-o errexit
设置-o管道故障
集合-o名词集合
部署=
get_generation(){
获取部署路径“{.metadata.generation}”
}
获取已观察到的\u生成(){
获取部署路径“{.status.observedGeneration}”
}
获取副本(){
获取部署路径“{.spec.replicas}”
}
获取可用的副本(){
获取部署路径“{.status.availableReplicas}”
}
get_部署_jsonpath(){
本地只读_jsonpath=“$1”
kubectl获取部署“${deployment}”-o“jsonpath=${u jsonpath}”
}
如果[$#!=1]];然后
echo“用法:$(basename$0)”>&2
出口1
fi
只读部署=“$1”
只读生成=$(获取\u生成)
echo“等待观察指定的生成${generation}”
而[[$(get_observed_generation)-lt${generation}];做
睡觉
完成
echo“观察到指定的生成”
只读副本=“$(获取\u副本)”
echo“指定的副本:${replicas}”
可用=-1
而[[${available}-ne${replications}]];做
睡觉
可用=$(获取可用副本)
echo“可用副本:${available}”
完成
回显“部署完成”
只需使用:

kubectl卷展栏状态部署/
这将在前台运行,等待并显示状态,并在卷展成功或失败时退出。 如果您正在编写一个shell脚本,那么请检查命令后面的返回代码,类似这样

kubectl rollout status deployment/<deployment-name>
if [[ "$?" -ne 0 ]] then
    echo "deployment failed!"
    exit 1
fi
kubectl卷展栏状态部署/
如果[[“$?”-ne 0]],则
echo“部署失败!”
出口1
fi
要进一步自动化脚本,请执行以下操作:

deployment_name=$(kubectl get deployment -n <your namespace> | awk '!/NAME/{print $1}')  
kubectl rollout status deployment/"${deployment_name}" -n <your namespace>
if [[ "$?" -ne 0 ]] then
    echo "deployment failed!"
    #exit 1
else
    echo "deployment succeeded"
fi
deployment_name=$(kubectl get deployment-n | awk'!/name/{print$1})
kubectl卷展栏状态部署/“${deployment\u name}”-n
如果[[“$?”-ne 0]],则
echo“部署失败!”
#出口1
其他的
echo“部署成功”
fi
如果在默认名称空间中运行,则可以省略-n。 命令awk'/NAME/{print$1}')提取第一个字段(部署名称),同时忽略作为标题的第一行(NAME READY-TO-DATE AVAILABLE AGE)。
如果您有多个部署文件,那么您还可以向awk添加更多正则表达式或模式:例如awk'/NAME/{print$1}')

答案很好。谢谢通过参考1.5/1.6中大大改进的
kubectl卷展状态更新了答案。这太棒了,我在这里创建了一个分支来添加非位置参数并支持自定义K8s命名空间:。
deployment_name=$(kubectl get deployment -n <your namespace> | awk '!/NAME/{print $1}')  
kubectl rollout status deployment/"${deployment_name}" -n <your namespace>
if [[ "$?" -ne 0 ]] then
    echo "deployment failed!"
    #exit 1
else
    echo "deployment succeeded"
fi