我是 Kubernetes 的新手,我的问题与 Google Cloud 平台有关。
给定一个场景,我们需要重新启动一个 kubernetes 集群,并且在 Spring 启动中有一些服务。由于 Spring 引导服务就像每个单独的 JVM,并且像一个独立的进程一样运行。一旦 Kubernetes 重新启动以重新启动 Spring 启动服务,我需要帮助来了解使用哪种类型的脚本或机制来重新启动 Kubernetes 中的所有服务。请让我知道并感谢您,并感谢您的所有意见。
我不确定我是否完全理解您的问题,但我认为对您来说最好的方法是将Spring Boot app
Pack
到 Docker 容器,然后在GKE
上使用它。
有关Packing
Spring Boot
应用程序container
的良好指南,请参阅 CodeLabs 教程。
当您的应用程序处于container
中时,您将能够在Deployment
或Statefulsets
配置文件中使用它,并将其部署到集群中。
如部署文档中所述:
部署为 Pod 和副本集提供声明性更新。
您在部署中描述所需状态,部署控制器会以受控速率将实际状态更改为所需状态。您可以定义部署以创建新的副本集,或删除现有部署并将其所有资源与新部署一起采用。
简而言之,Deployment controller
确保应用程序保持所需的状态。
例如,如果您想重新启动应用程序,则可以Deployment
缩小到0 replicas
,然后扩展到5 replicas
。
此外,当GKE
处理Google Compute Engine
VM 时,还可以缩放群集节点数。
例子
重新启动应用程序
对于我的测试,我在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 节点,服务在群集中仍然可见,因为这是抽象的。您不必重新启动它。但是,如果要更改某些静态服务配置(如端口),则需要使用新配置重新创建服务。
有用的链接
- 将工作负载迁移到不同的计算机类型
- 自动修复节点