使用kubernetes中的Deployment对象让Pod和Node具有故障修复能力(高可用/横向扩展/扩缩容/滚动更新)

之前的文章 介绍了把应用部署到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:

2022年3月20日                                        添加评论

In container, k8s, kubernetes, 云计算, 容器

# # # # # # #

发表回复