之前的文章 介绍了把应用部署到k8s到
pod上,大家也看到了,由于是测试着玩的只有一个pod运行,可以这么说只运行了一个应用实例,如果这个pod挂了亦或pod所在的node/master挂了,都会导致业务的不可访问,这完全是逆K8S集群技术而为,今天就说下让我们的应用具备自我修复的能力。
这里要用到K8S下的一个资源对象Deployment,从字面意思上我们知道它是部署的意思,那到底在部署什么,又和哪个有关联,不用多说肯定是pod了,关乎着pod的规格定义,使我们的pod真正高可用并平衡负载。
下面我们来定义资源yml文件,我这边取名为deploy.yml
你可以根据自己情况取名,保持后缀是yml就行了。
apiVersion: apps/v1
kind: Deployment
metadata:
name: test-deploy
spec:
replicas: 5
selector:
matchLabels:
project: test-project
template:
metadata:
labels:
project: test-project
spec:
containers:
- name: test-pod
imagePullPolicy: Always
ports:
- containerPort: 8080
image: userName/test-project:1.0
文件中的test-deploy和test-project以及image后面的镜像仓库地址,请根据实际情况修改,但要确保两处有test-project的地方相同。可以看到这里replicas: 5
表示我要起5个pod副本,imagePullPolicy: Always
表示不使用本地镜像。暴露的应用端口为8080,最后一行包含应用镜像的仓库地址。
运行以下命令,检查K8S上是否运行有pod和deployment:
kubectl get pods
kubectl get deployments
在deploy.yml文件所在的文件夹,运行以下命令,部署Deployment。
kubectl apply -f deploy.yml
现在再次查看Deployment和Pod的状态:
可以看到已经有了2个运行中的pod,其他3个正在创建中。稍等片刻就可以看到全部pod的状态变为running。
下面我们模拟删除一个pod,看K8S是否会帮我们恢复到5个pod。
运行以下命令,删除一个pod。
kubectl delete pod pod-name
上面pod-name请自行获取替换。
可以看到在我删除了一个pod后,那么现在pod的数量和我们文件中定义的5个就不一样了,我们的Deployment 控制器检查到了这个变化,那么就会帮我们重新启动一个新的pod,可以看到上图中红色框选的部分。
是不是感觉很奶思,当然了我这里之上描述了一种情况,就是节点所在的pod挂了一个,还有一种情况就是pod所依附的节点自身挂了,我没演示,其实思路大体一致,只是我是docker desktop安装的单节点集群,没法演示,后面如果有条件的话我再搞一下,当然了如果各位急着想看一下这种情况的处理办法,可以先行在网络上搜一下。:joy_cat:
发表回复