Docker & Kubenetes 系列四:集群,扩容,升级,回滚
本篇将会讲解应用部署到Kubenetes集群,集群副本集查看,集群自愈能力演示,集群扩容,滚动升级,以及回滚。
本篇是Docker&Kubenetes系列的第四篇,在前面的篇幅中,我们向Kubenetes中部署了单个应用实例。如果单个节点故障了,那么服务就不可用了,这在实际环境中是不能接受的。在实际的正式环境中,我们不仅要避免单点,还要根据负载变化动态的调整节点数量。为了实现这个目的,我们可以借助于Kubenetes的Deployment,Deployment可以创建指定数量的Pod,并有自愈能力,还能完成升级更新及回滚操作。
向Kubenetes中部署一个3节点的集群
和之前介绍的一样部署集群也由过yml配置文件开始的,本例我们依然使用前面篇幅中创建的docker镜像来部署集群。Deployment配置文件内容如下,这个配置文件是从Kubenetes官网复制的,手写yml文件太容易出错了,yml格式挺烦的。
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-first-demo-dep
labels:
app: my-first-demo
spec:
replicas: 3
selector:
matchLabels:
app: my-first-demo
template:
metadata:
labels:
app: my-first-demo
spec:
containers:
- name: my-first-demo
image: hellodm/my-first-demo:v1.0
ports:
- containerPort: 80
配置文件中,replicas=3
表示要启动3个副本,使用的镜像是hellodm/my-first-demo:v1.0
。配置完了之后,我们来启动集群,命令如下:
$ kubectl create -f dep.yml
deployment.apps/my-first-demo-dep created
我们来看查看副本集情况:
$ kubectl get rs
NAME DESIRED CURRENT READY AGE
my-first-demo-dep-5647fd55f 3 3 3 3m15s
在查看一下pod:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
my-first-demo-dep-5647fd55f-4wzxs 1/1 Running 0 22s
my-first-demo-dep-5647fd55f-c9lwx 1/1 Running 0 22s
my-first-demo-dep-5647fd55f-nnwt6 1/1 Running 0 22s
暴露集群,使得我们可以在访问集群内部的应用。
$ kubectl apply -f svc.yml
service/my-first-demo-svc created
访问:
$ curl 'http://localhost:30000/'
<h1>Hello world! <h1>
OK,成功了。
Kubenetes 扩容演示
上面我们部署了3个节点的集群,假设现在3个节点已经有点吃力了,我们准备扩展到4个节点。编辑上面的Deployment文件,修改的地方如下:
spec:
replicas: 4
其他的不变,只是replicas
为4了。重新启动一下看看:
$ kubectl apply -f dep.yml --record=true
deployment.apps/my-first-demo-dep configured
看下副本集,如下,变成4个了。
$ kubectl get rs
NAME DESIRED CURRENT READY AGE
my-first-demo-dep-5647fd55f 4 4 4 10h
检查Kubenetes集群的自愈性
我们来删掉2个Pod,模拟宕机情况,执行kubectl delete pod
命令,如下:
$ kubectl delete pod my-first-demo-dep-5647fd55f-4wzxs my-first-demo-dep-5647fd55f-c9lwx
立马查看Pod是否恢复:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
my-first-demo-dep-5647fd55f-bxpn7 1/1 Running 0 25s
my-first-demo-dep-5647fd55f-nnwt6 1/1 Running 0 5m8s
my-first-demo-dep-5647fd55f-vwxgz 1/1 Running 0 25s
可以看到还是3台,从NAME和AGE可以看出,多了两个新的。OK,至此,我们演示了扩容和自愈性。
Kubenetes滚动升级
为了演示滚动升级,我们先制作v2.0版本的镜像,修改index的内容为:
<h1>Hello worldls , this is Version 2.</h1>
这里我故意拼错了一个单词,别急,后面有妙用。下面我们来
制作v2.0的镜像:
$ docker build . -t my-frist-demo:v2.0
Sending build context to Docker daemon 6.144kB
Step 1/2 : FROM nginx
---> 602e111c06b6
Step 2/2 : COPY index.html /usr/share/nginx/html
---> 7484909c0df2
Successfully built 7484909c0df2
Successfully tagged my-frist-demo:v2.0
发布镜像:
$ docker tag my-frist-demo:v2.0 hellodm/my-first-demo:v2.0
$ docker push hellodm/my-first-demo:v2.0
The push refers to repository [docker.io/hellodm/my-first-demo]
a3e37d09f192: Preparing
b3003aac411c: Preparing
216cf33c0a28: Preparing
c2adabaecedb: Layer already exists
denied: requested access to the resource is denied
修改deployment的配置文件,改用v2.0的镜像,如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-first-demo-dep
labels:
app: my-first-demo
spec:
replicas: 3
selector:
matchLabels:
app: my-first-demo
template:
metadata:
labels:
app: my-first-demo
spec:
containers:
- name: my-first-demo
image: hellodm/my-first-demo:v2.0
ports:
- containerPort: 80
执行发布,这次附带了一个参数--record=true
让 Kubernetes 把这行命令记到发布历史中方便后面查看。
$ kubectl apply -f dep.yml --record=true
deployment.apps/my-first-demo-dep configured
赶紧查看一下pod状态如下,可以发现已经在滚动发布了,ContainerCreating
状态的表示新版本的容器正在启动,Running
的是新版本的已经运行起来了,Terminating
的这个是老版本正在停止。
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
my-first-demo-dep-54596847d8-6m4n9 0/1 ContainerCreating 0 2s
my-first-demo-dep-54596847d8-jrm8g 1/1 Running 0 4s
my-first-demo-dep-5647fd55f-cbcrz 1/1 Running 0 56s
my-first-demo-dep-5647fd55f-ll7tt 0/1 Terminating 0 56s
my-first-demo-dep-5647fd55f-s8d6l 1/1 Running 0 56s
再赶快查看一下滚动发布的状态:
$ kubectl rollout status deployment my-first-demo-dep
Waiting for rollout to finish: 1 old replicas are pending termination...
deployment "my-first-demo-dep" successfully rolled out
如上命令所表示,随着最后一个old replicas
终止,新版本的deployment成功发布了successfully rolled out
。
简直是太激动了,验证一下是不是3个pod,如下,没问题,3个Running状态。
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
my-first-demo-dep-54596847d8-6m4n9 1/1 Running 0 36s
my-first-demo-dep-54596847d8-jrm8g 1/1 Running 0 38s
my-first-demo-dep-54596847d8-nqgmn 1/1 Running 0 34s
访问一下看看:
$ curl 'http://localhost:30000/'
<h1>Hello worldls , this is Version 2.</h1>
已经是新版本了,可惜啊,新版本有问题啊!单词拼错了,world
写成了worldls
,我们来赶紧回滚一下。
Kubenetes应用集群回滚
上面我们使用滚动发布,将网站升级为version2了。但是有错误,我们来查看一下发布历史:
$ kubectl rollout history deployment my-first-demo-dep
deployment.extensions/my-first-demo-dep
REVISION CHANGE-CAUSE
1 kubectl apply --filename=dep.yml --record=true
2 kubectl apply --filename=dep.yml --record=true
可以看到,有两个版本,我们回滚到版本1,执行如下命令:
$ kubectl rollout undo deployment my-first-demo-dep --to-revision=1
deployment.extensions/my-first-demo-dep rolled back
查看回滚过程状态:
$ kubectl rollout status deployment my-first-demo-dep
Waiting for deployment "my-first-demo-dep" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment "my-first-demo-dep" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment "my-first-demo-dep" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment "my-first-demo-dep" rollout to finish: 1 old replicas are pending termination...
Waiting for deployment "my-first-demo-dep" rollout to finish: 1 old replicas are pending termination...
deployment "my-first-demo-dep" successfully rolled out
上面的日志显示了完整的回滚过程,看到最后一行successfully rolled out
输出的时候,说明回滚完成了。这时候响应的应该就是 Hello world!
,我们来验证一下回滚效果:
$ curl 'http://localhost:30000/'
<h1>Hello world! <h1>
OK,成功了,回滚到了没有错误的原始版本。
总结
本篇演示了Kubenetes集群发布,集群副本集查看,集群自愈能力演示,集群扩容,滚动升级,以及回滚。然而这一切来得是如此的简单,我们只需要修改一下配置,执行一个命令,剩下的工作Kubenetes都帮我们做了。当我在回顾我几年前所在的某家公司的时候,程序升级上线都是由运维手工完成,虽然也完成了任务,但是那种原始的操作方式,在时下如果还有人用的话,那简直是不敢想象。
Docker & k8s 系列一:快速上手docker
Docker & k8s 系列二:本机k8s环境搭建
Docker & k8s 系列三:在k8s中部署单个服务实例
Docker & Kubenetes 系列四:集群,扩容,升级,回滚的更多相关文章
- Dubbo学习源码总结系列四--集群容错机制
Dubbo提供了哪些集群容错机制?如何实现的? 提供了六种集群容错机制,包括Failover(失败自动切换,尝试其他服务器).Failfast(失败立即抛出异常).Failsafe(失 ...
- elasticsearch集群扩容和容灾
elasticsearch专栏:https://www.cnblogs.com/hello-shf/category/1550315.html 一.集群健康 Elasticsearch 的集群监控信息 ...
- Docker实战之Zookeeper集群
1. 概述 这里是 Docker 实战系列第四篇.主要介绍分布式系统中的元老级组件 Zookeeper. ZooKeeper 是一个开源的分布式协调服务,是 Hadoop,HBase 和其他分布式框架 ...
- 庐山真面目之十微服务架构 Net Core 基于 Docker 容器部署 Nginx 集群
庐山真面目之十微服务架构 Net Core 基于 Docker 容器部署 Nginx 集群 一.简介 前面的两篇文章,我们已经介绍了Net Core项目基于Docker容器部署在Linux服 ...
- 使用docker安装部署Spark集群来训练CNN(含Python实例)
使用docker安装部署Spark集群来训练CNN(含Python实例) http://blog.csdn.net/cyh_24/article/details/49683221 实验室有4台神服务器 ...
- 【ELK】【docker】6.Elasticsearch 集群启动多节点 + 解决ES节点集群状态为yellow
本章其实是ELK第二章的插入章节. 本章ES集群的多节点是docker启动在同一个虚拟机上 ====================================================== ...
- 宝塔面板 + Rancher + 阿里云镜像仓库 + Docker + Kubernetes,添加集群、部署 web 应用
目录 一,安装宝塔面板(V 6.8) 二,使用宝塔安装 Docker,配置阿里云容器服务 三,安装 Rancher (Server) 四,管理 Rancher.添加集群 五,添加 Rancher 应用 ...
- Docker实战之Consul集群
前言 最近参加了几场 Java 面试,发现大多数的微服务实践还是 Eureka 偏多,鉴于笔者的单位选型 Consul,这里对 Consul 做简单总结. 该篇是 Docker 实战系列的第三篇.传送 ...
- Kubernetes 集群无损升级实践 转至元数据结尾
一.背景 活跃的社区和广大的用户群,使 Kubernetes 仍然保持3个月一个版本的高频发布节奏.高频的版本发布带来了更多的新功能落地和 bug 及时修复,但是线上环境业务长期运行,任何变更出错都可 ...
随机推荐
- Vue 3.0 Composition API - 中文翻译
Composition API 发布转载请附原文链接 https://www.cnblogs.com/zgh-blog/articles/composition_api.html 这两天初步了解了下 ...
- php原生函数应用
php常见基本的函数 一.字符串函数 implode — 将一个一维数组的值转化为字符串 lcfirst — 使一个字符串的第一个字符小写 ltrim — 删除字符串开头的空白字符(或其他字符) rt ...
- 2019-2020-1 20199308《Linux内核原理与分析》第八周作业
<Linux内核分析> 第七章 可执行程序工作原理 7.1 知识点 1.目标文件:编译器生成的文件,"目标"指平台,它决定了编译器使用的机器指令集. 2.目标文件格式: ...
- python25之进制转换
一.进制转换函数 bin():将十进制转换为二进制 oct():将十进制转换为八进制 hex():将十进制转换为十六进制 >>> x=1234>>> bin(x)' ...
- (五)PL/SQL条件控制
简述 决策结构需要程序员指定一个或多个条件要计算,或由程序进行测试,如果条件被确定为真那么一条或多条语句被执行,如果要被执行的其它语句条件被确定为假,则选其它执行块. PL/SQL编程语言提供了以下几 ...
- Kubernetes 命令行工具之kubctl
目录 1.何为kubectl 2.Kubectl基本使用 2.1.命令补全 2.2.快速查找资源 2.3.使用自定义输出格式 3.陈述式管理资源 3.1.管理namespace资源 3.2.管理Dep ...
- 使用IBM Blockchain Platform extension开发你的第一个fabric智能合约
文章目录 安装IBM Blockchain Platform extension for VS Code 创建一个智能合约项目 理解智能合约 打包智能合约 Local Fabric Ops 安装智能合 ...
- IDEA 之 Java项目复制
1.复制一个项目,并改名字 2.更改以下文件名字 3.将以下文件中的原有名字,替换成更改后的名字(例如MyWebapp07替换成MyWebapp08) 4.将out文件夹给删除 5.然后用IDEA ...
- java 之 继承 super关键籽 this关键字 final关键字
继承 语法: 使用 extends 来继承 class子类 extends父类{ 子类属性 子类方法 } 继承的特点: 1.子类会把父类所有的属性和方法继承下来,final修饰的类是不可以被继承 ...
- 【Linux常见命令】mv命令
mv - move (rename) files mv命令用来为文件或目录改名.或将文件或目录移入其它位置. 语法: mv [OPTION]... [-T] SOURCE DEST mv [OPTIO ...