如何检查我在Kubernetes中的所有部署是否完成

myss37ts  于 5个月前  发布在  Kubernetes
关注(0)|答案(4)|浏览(92)

我有几个部署包含在我的应用程序中。我想在成功部署我的应用程序结束时执行自定义操作,这意味着所有部署都很顺利。我如何确定我的所有kubernetes部署都成功完成?

j9per5c4

j9per5c41#

也许在所有部署中使用基本的watch命令?

watch kubectl get deployments

字符串
然后检查READY列。
还是我没抓住重点

hmae6n7t

hmae6n7t2#

我不太清楚你是什么意思。
正如@Marc ABOUCHACRA所指出的,你可以使用watch。这可以通过使用-w标志来完成,比如kubectl get deployments -w
但这仅提供了有关状态Desired/Current/Up-to-date/Available的信息。

$ kubectl get deployments
NAME      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
nginx-1   1         1         1            1           27h

字符串
您可以定义就绪探测器。
有时,应用程序暂时无法提供流量。例如,应用程序可能需要在启动期间加载大量数据或配置文件,或者在启动后依赖外部服务。在这种情况下,您不希望终止应用程序,但你我也不想向它发送请求。Kubernetes提供了就绪探测器来检测和缓解这些情况。一个包含容器的pod报告它们没有ready不通过Kubernetes服务接收流量。

**注意:**Readiness探针在容器的整个生命周期中运行。

readinessProbe:
  exec:
    command:
    - cat
    - /tmp/healthy
  initialDelaySeconds: 5
  periodSeconds: 5


或者只使用部署状态,
Deployment在其生命周期中会进入各种状态。它可以在推出新的ReplicaSet时进行,也可以完成,或者无法进行。

$ kubectl rollout status deployment nginx-1
deployment "nginx-1" successfully rolled out

bcs8qyzn

bcs8qyzn3#

如果所有的部署都在同一个命名空间中,你可以这样运行:

#!/bin/bash
    

check_unavailable() {
  deployments=$(kubectl get deploy -n "${NAMESPACE}" -o=jsonpath="{range .items[*]}{.metadata.name}{'\t'}{.status.unavailableReplicas}{'\n'}{end}")
  while read -r line; do lines+=("$line"); done <<<"$deployments"
  for line in "${lines[@]}"
  do
    read -ra arr <<< "$line"
    if [ "${arr[1]}" ]; then
      echo "${arr[0]} deployment has ${arr[1]} unavailable Replicas "

    fi
  done
}

check_unavailable

字符串
这也适用于具有多容器pod的部署。

u5rb5r59

u5rb5r594#

我使用的集群运行多个应用程序,每个应用程序都可以独立部署,因此检查 * 任何 * 不可用/正在进行的部署都不起作用。
我们的方法对发布过程做了一些假设:

  • 我们避免竞争条件
  • 我们使用CI/CD工具运行应用程序版本。该工具为应用程序保留环境(多个应用程序可以同时部署,但单个应用程序不会同时部署多个应用程序)。
  • 每个应用程序“拥有”自己的资源(不同应用程序的发布不会对同一资源进行更改)。
  • K8S pod配置了就绪探测器/运行状况检查,仅在部署正确运行时将其标记为“良好”。
  • spec.progressDeadlineSeconds是为发行版中的每个Deployment适当设置的

以一个具有Web服务工作者和后台工作者的应用程序发布为例,我们的部署脚本可能如下所示:

#/bin/bash

# Cause deployment script to exit immediately if there is any failure, presumably in the `wait` commands
set -e

# This could be any action that generates kubernetes deployment(s)
kubectl apply -k "$DEPLOYMENT_DIR"

# Monitor the status of the web service worker
kubectl rollout status deployment.apps/app1-service &
_service=$!
# Monitor the status of the background worker deployment
kubectl rollout status deployment.apps/app1-background &
_background=$!

# Wait for all deployments to complete (or any of them to fail)
wait $_service
wait $_background

echo "Deployment complete"

字符串
rollout status检查和相应的wait操作应与作为发布的一部分进行监控的Deployment s/DaemonSet s/etc匹配。

相关问题