本篇将会讲解应用部署到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. es6最 全教程2020年

    带手机验证码登陆, 带全套购物车系统 带数据库 前后端分离开发 带定位用户功能 数据库代码为本地制作好了 带支付宝支付系统 带django开发服务器接口教程 地址:   https://www.dua ...

  2. 轻量级mysql安装教程-避免采坑

    1:安装包获取 安装了很多次,来来回回踩,踩出了一片光明大道,简单好用. 百度网盘获取:链接:https://pan.baidu.com/s/13frFBTODaMeADZOHj5KdJQ 提取码:a ...

  3. 一篇文章掌握网页解析神器——xpath

    学爬虫不会xpath解析数据? 今天老师带你一堂课带你从零开始精通xpath,从此轻松提取网页信息. 我们在爬虫的过程中,经常会遇到html字符串数据,很多我们需要的数据不是作为标签的文本就是作标签的 ...

  4. http与web

    在看<图解http>的时候,忽然有一个想法冒出来. web与http是什么关系? http服务器与web服务器有区别?为什么用以搞混了? web的定义:它是一种基于超文本和HTTP的.全球 ...

  5. Programmatically mount a Microsoft Virtual Hard Drive (VHD)

    By Pixy https://stackoverflow.com/questions/24396644/programmatically-mount-a-microsoft-virtual-hard ...

  6. Django Channel实时推送与聊天

    先来看一下最终的效果吧 开始聊天,输入消息并点击发送消息就可以开始聊天了 点击 “获取后端数据”开启实时推送 先来简单了解一下 Django Channel Channels是一个采用Django并将 ...

  7. hexo-themes-setting

    hexo-themes-setting hexotheme Hexo 主题配置管理 一半有几种方式, 可以删除git 单独维护 也可以使用 hexo 推荐的方式进行维护 所有需要写在主题配置文件中的配 ...

  8. CodeForces 674C Levels and Regions

    #include<bits/stdc++.h> using namespace std; const int maxn=2e5+5; int N,K,head,tair; int q[ma ...

  9. c语言-----劫持自己02

    在上一节 c语言-----劫持原理01 已经叙述了劫持原理,下边正式进入劫持实战 1. 需要实现的功能 在c语言中 system("notepad") 可以打开一个记事本 syst ...

  10. vSphere可用性之三准备实验环境

    第三章 准备实验环境 在上篇内容中,讲述了进行VMware HA实验所必需的软硬件条件.接下来将使用这些来搭建实验环境.主要内容为依据拓扑图安装ESX主机系统.ISCSI存储系统. 此次实验环境的建置 ...