Kubernetes 重启如何运行终止的进程



我是 Kubernetes 的新手,我的问题与 Google Cloud 平台有关。

给定一个场景,我们需要重新启动一个 kubernetes 集群,并且在 Spring 启动中有一些服务。由于 Spring 引导服务就像每个单独的 JVM,并且像一个独立的进程一样运行。一旦 Kubernetes 重新启动以重新启动 Spring 启动服务,我需要帮助来了解使用哪种类型的脚本或机制来重新启动 Kubernetes 中的所有服务。请让我知道并感谢您,并感谢您的所有意见。

我不确定我是否完全理解您的问题,但我认为对您来说最好的方法是将Spring Boot appPack到 Docker 容器,然后在GKE上使用它。

有关PackingSpring Boot应用程序container的良好指南,请参阅 CodeLabs 教程。

当您的应用程序处于container中时,您将能够在DeploymentStatefulsets配置文件中使用它,并将其部署到集群中。

如部署文档中所述:

部署为 Pod 和副本集提供声明性更新。

您在部署中描述所需状态,部署控制器会以受控速率将实际状态更改为所需状态。您可以定义部署以创建新的副本集,或删除现有部署并将其所有资源与新部署一起采用。

简而言之,Deployment controller确保应用程序保持所需的状态。

例如,如果您想重新启动应用程序,则可以Deployment缩小到0 replicas,然后扩展到5 replicas

此外,当GKE处理Google Compute EngineVM 时,还可以缩放群集节点数。

例子

重新启动应用程序

对于我的测试,我在Deployment中使用了Nginx container,但它应该与您的Spring boot app container类似。

假设您有 2 个节点群集,其中有 5 个副本应用程序。

$ kubectl create deployment nginx --image=nginx --replicas=5
deployment.apps/nginx created
$ kubectl get pods -o wide
NAME                     READY   STATUS    RESTARTS   AGE     IP          NODE                                       NOMINATED NODE   READINESS GATES
nginx-86c57db685-2x8tj   1/1     Running   0          2m45s   10.4.1.5    gke-cluster-1-default-pool-faec7b51-6kc3   <none>           <none>
nginx-86c57db685-6lpfg   1/1     Running   0          2m45s   10.4.1.6    gke-cluster-1-default-pool-faec7b51-6kc3   <none>           <none>
nginx-86c57db685-8lvqq   1/1     Running   0          2m45s   10.4.0.9    gke-cluster-1-default-pool-faec7b51-x07n   <none>           <none>
nginx-86c57db685-lq6l7   1/1     Running   0          2m45s   10.4.0.11   gke-cluster-1-default-pool-faec7b51-x07n   <none>           <none>
nginx-86c57db685-xn7fn   1/1     Running   0          2m45s   10.4.0.10   gke-cluster-1-default-pool-faec7b51-x07n   <none>           <none>

现在,您需要使用 ConfigMap 更改应用程序内部的一些环境变量。要应用此更改,您只需使用rollout.它将restart您的应用程序并提供来自ConfigMap的其他数据。

$ kubectl rollout restart deployment nginx
deployment.apps/nginx restarted
$ kubectl get po -o wide
NAME                     READY   STATUS        RESTARTS   AGE     IP          NODE                                       NOMINATED NODE   READINESS GATES
nginx-6c98778485-2k98b   1/1     Running       0          6s      10.4.0.13   gke-cluster-1-default-pool-faec7b51-x07n   <none>           <none>
nginx-6c98778485-96qx7   1/1     Running       0          6s      10.4.1.7    gke-cluster-1-default-pool-faec7b51-6kc3   <none>           <none>
nginx-6c98778485-qb89l   1/1     Running       0          6s      10.4.0.12   gke-cluster-1-default-pool-faec7b51-x07n   <none>           <none>
nginx-6c98778485-qqs97   1/1     Running       0          4s      10.4.1.8    gke-cluster-1-default-pool-faec7b51-6kc3   <none>           <none>
nginx-6c98778485-skbwv   1/1     Running       0          4s      10.4.0.14   gke-cluster-1-default-pool-faec7b51-x07n   <none>           <none>
nginx-86c57db685-2x8tj   0/1     Terminating   0          4m38s   10.4.1.5    gke-cluster-1-default-pool-faec7b51-6kc3   <none>           <none>
nginx-86c57db685-6lpfg   0/1     Terminating   0          4m38s   <none>      gke-cluster-1-default-pool-faec7b51-6kc3   <none>           <none>
nginx-86c57db685-8lvqq   0/1     Terminating   0          4m38s   10.4.0.9    gke-cluster-1-default-pool-faec7b51-x07n   <none>           <none>
nginx-86c57db685-xn7fn   0/1     Terminating   0          4m38s   10.4.0.10   gke-cluster-1-default-pool-faec7b51-x07n   <nont e>           <none>

排空节点以执行节点操作

另一个示例是,当你需要对 VM 执行某些操作时。您可以通过排空节点来做到这一点。

在对节点执行维护(例如内核升级、硬件维护等)之前,您可以使用 kubectl drain 安全地从节点中逐出所有 Pod。安全逐出允许容器的容器正常终止,并将遵循您指定的 PodDisruptBudgets。

因此,它会将所有 Pod 从此节点重新调度到另一个节点。

重启集群

请记住,GKE由 google 管理,您无法重新启动一台计算机,因为它由托管实例组管理。 您可以对每个节点进行ssh,更改一些设置。当您将它们扩展到 0 并纵向扩展时,您将获得具有新ExternalIP的新机器。

$ kubectl get nodes -o wide
NAME                                       STATUS   ROLES    AGE    VERSION             INTERNAL-IP   EXTERNAL-IP     OS-IMAGE                             KERNEL-VERSION   CONTAINER-RUNTIME
gke-cluster-1-default-pool-faec7b51-6kc3   Ready    <none>   3d1h   v1.17.14-gke.1600   10.128.0.25   34.XX.176.56    Container-Optimized OS from Google   4.19.150+        docker://19.3.6
gke-cluster-1-default-pool-faec7b51-x07n   Ready    <none>   3d1h   v1.17.14-gke.1600   10.128.0.24   23.XXX.50.249   Container-Optimized OS from Google   4.19.150+        docker://19.3.6
$ gcloud container clusters resize cluster-1 --node-pool default-pool 
>     --num-nodes 0 
>     --zone us-central1-c
Pool [default-pool] for [cluster-1] will be resized to 0.
$ kubectl get nodes -o wide
No resources found
$ gcloud container clusters resize cluster-1 --node-pool default-pool     --num-nodes 2     --zone us-central1-c
Pool [default-pool] for [cluster-1] will be resized to 2.
Do you want to continue (Y/n)?  y
$ $ kubectl get nodes -o wide
NAME                                       STATUS   ROLES    AGE   VERSION             INTERNAL-IP   EXTERNAL-IP     OS-IMAGE                             KERNEL-VERSION   CONTAINER-RUNTIME
gke-cluster-1-default-pool-faec7b51-n5hm   Ready    <none>   68s   v1.17.14-gke.1600   10.128.0.26   23.XXX.50.249   Container-Optimized OS from Google   4.19.150+        docker://19.3.6
gke-cluster-1-default-pool-faec7b51-xx01   Ready    <none>   74s   v1.17.14-gke.1600   10.128.0.27   35.XXX.135.41   Container-Optimized OS from Google   4.19.150+        docker://19.3.6

结论

当您使用GKE时,您使用的是预定义的节点,由Google管理,这些节点会自动升级(某些安全功能等)。因此,更改节点容量很容易。

当您将应用程序pack到容器并在Deployment中使用它时,您的应用程序将由Deployment Controller处理,将尝试始终保持所需的状态。

如服务文档中所述。

在 Kubernetes 中,服务是一种抽象,它定义了一组逻辑 Pod 和访问它们的策略。

即使将群集扩展到 0 节点,服务在群集中仍然可见,因为这是抽象的。您不必重新启动它。但是,如果要更改某些静态服务配置(如端口),则需要使用新配置重新创建服务。

有用的链接

  • 将工作负载迁移到不同的计算机类型
  • 自动修复节点

相关内容

  • 没有找到相关文章

最新更新