本篇将会讲解应用部署到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 系列四:集群,扩容,升级,回滚的更多相关文章

  1. Dubbo学习源码总结系列四--集群容错机制

    Dubbo提供了哪些集群容错机制?如何实现的?         提供了六种集群容错机制,包括Failover(失败自动切换,尝试其他服务器).Failfast(失败立即抛出异常).Failsafe(失 ...

  2. elasticsearch集群扩容和容灾

    elasticsearch专栏:https://www.cnblogs.com/hello-shf/category/1550315.html 一.集群健康 Elasticsearch 的集群监控信息 ...

  3. Docker实战之Zookeeper集群

    1. 概述 这里是 Docker 实战系列第四篇.主要介绍分布式系统中的元老级组件 Zookeeper. ZooKeeper 是一个开源的分布式协调服务,是 Hadoop,HBase 和其他分布式框架 ...

  4. 庐山真面目之十微服务架构 Net Core 基于 Docker 容器部署 Nginx 集群

    庐山真面目之十微服务架构 Net Core 基于 Docker 容器部署 Nginx 集群 一.简介      前面的两篇文章,我们已经介绍了Net Core项目基于Docker容器部署在Linux服 ...

  5. 使用docker安装部署Spark集群来训练CNN(含Python实例)

    使用docker安装部署Spark集群来训练CNN(含Python实例) http://blog.csdn.net/cyh_24/article/details/49683221 实验室有4台神服务器 ...

  6. 【ELK】【docker】6.Elasticsearch 集群启动多节点 + 解决ES节点集群状态为yellow

    本章其实是ELK第二章的插入章节. 本章ES集群的多节点是docker启动在同一个虚拟机上 ====================================================== ...

  7. 宝塔面板 + Rancher + 阿里云镜像仓库 + Docker + Kubernetes,添加集群、部署 web 应用

    目录 一,安装宝塔面板(V 6.8) 二,使用宝塔安装 Docker,配置阿里云容器服务 三,安装 Rancher (Server) 四,管理 Rancher.添加集群 五,添加 Rancher 应用 ...

  8. Docker实战之Consul集群

    前言 最近参加了几场 Java 面试,发现大多数的微服务实践还是 Eureka 偏多,鉴于笔者的单位选型 Consul,这里对 Consul 做简单总结. 该篇是 Docker 实战系列的第三篇.传送 ...

  9. Kubernetes 集群无损升级实践 转至元数据结尾

    一.背景 活跃的社区和广大的用户群,使 Kubernetes 仍然保持3个月一个版本的高频发布节奏.高频的版本发布带来了更多的新功能落地和 bug 及时修复,但是线上环境业务长期运行,任何变更出错都可 ...

随机推荐

  1. CSS选择器与CSS的继承,层叠和特殊性

    什么是选择器?选择器{样式;},在{}之前的部分就是"选择器","选择器"指明了{}中的"样式"的作用对象,也就是"样式" ...

  2. XSS Cheat Sheet(basics and advanced)

    XSS Cheat Sheet BASICS HTML注入 当输入位于HTML标记的属性值内或标记的外部(下一种情况中描述的标记除外)时使用.如果输入在HTML注释中,则在payload前加上&quo ...

  3. Scrapy模拟登录信息

    携带cookie模拟登录 需要在爬虫里面自定义一个start_requests()的函数 里面的内容: def start_requests(self): cookies = '真实有效的cookie ...

  4. 五分钟秒懂机器学习混淆矩阵、ROC和AUC

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是机器学习专题的第18篇文章,我们来看看机器学习领域当中,非常重要的其他几个指标. 混淆矩阵 在上一篇文章当中,我们在介绍召回率.准确率 ...

  5. Makefile 头文件 <> 与 "" 的差别,与 Visual Studio 不同

    #include "" : 首先在所有被编译的.c所在的路径中,查找头文件,如果找不到,则到 -I路径下去找头文件 #inclue <> :首先在-I路径下去找,如果找 ...

  6. StringBuilder、StringBuffer分析比较

    StringBuilder.StringBuffer源码分析 StringBuilder源码分析 类结构 public final class StringBuilder extends Abstra ...

  7. numpy库的学习笔记

    一.ndarray 1.numpy 库处理的最基础数据类型是由同种元素构成的多维数组(ndarray),简称“数组”. 2.ndarray是一个多维数组的对象,ndarray数组一般要求所有元素类型相 ...

  8. 标准库 xml

    xml处理模块 xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,不过,古时候,在json还没诞生的黑暗年代,大家只能选择用xml呀,至今很多传统公司如金融 ...

  9. spark下dataframe转为rdd格式

    dataframe可以实现很多操作,但是存储到本地的时候,只能存 parquest格式 需要存储源格式,需要转换为rdd类型 将dataframe中的每一行都map成有逗号相连的string,就变为了 ...

  10. python 类C数组的两种形式:list -->内容可变, tuple --->内容不可变

    python 中的列表相当与 C 中的数组,列表:list 初始化使用[ ], 元组:tuple 初始化使用(): 一.列表list 1 #!/usr/bin/python  2   3 #list初 ...