一、常见的部署方案

  • 滚动更新
    • 服务不会停止,但是整个pod会有新旧并存的情况。
  • 重新创建
    • 先停止旧的pod,然后再创建新的pod,这个过程服务是会间断的。
  • 蓝绿 (无需停机,风险较小)

    • 部署v1的应用(一开始的状态)所有外部请求的流量都打到这个版本上
    • 部署版本2的应用版本2的代码与版本1不同(新功能、Bug修复等)
    • 将流量从版本1切换到版本2。 
    • 如版本2测试正常,就删除版本1正在使用的资源(例如实例),从此正式用版本2。
  • 金丝雀 
 

1.1 、滚动更新

  • maxSurge :滚动升级时先启动的pod数量
  • maxUnavailable :滚动升级时允许的最大unavailable的pod数量

(1)创建文件rollingupdate.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
name: rollingupdate
spec:
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
selector:
matchLabels:
app: rollingupdate
replicas: 4
template:
metadata:
labels:
app: rollingupdate
spec:
containers:
- name: rollingupdate
image: registry.cn-hangzhou.aliyuncs.com/ghy/test-docker-image:v1.0
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: rollingupdate
spec:
ports:
- port: 80
protocol: TCP
targetPort: 8080
selector:
app: rollingupdate
type: ClusterIP

(2)执行脚本

kubectl apply -f rollingupdate.yaml

(3)查看pods

kubectl get pods

(4) 查看svc

kubectl get svc

(5) 上面成功后就可以直接通过ip进行访问pod对应的服务的

curl cluster-ip/dockerfile

(6) 前面如果都成功了,那下面要做的事就是实现滚动更新动作了,先修改rollingupdate.yaml文件,将镜像修改成v2.0 然后保存文件

(7)在w1上,不断地访问观察输出

while sleep 0.2;do curl cluster-ip/dockerfile;echo "";done

(8)在w2上,监控pod

kubectl get pods -w

(7)执行apply操作让文件重新生效变成2.0版本

kubectl apply -f rollingupdate.yaml

(8)执行下面命令会发现有新老版本的替换的过程

kubectl get pods

1.2、 重新创建

如果我们需求不希望新老版本共存,希望老版本全停后再上新版本就要用到这方法了
(1)编写recreate.yaml 文件
apiVersion: apps/v1
kind: Deployment
metadata:
name: recreate
spec:
strategy:
type: Recreate
selector:
matchLabels:
app: recreate
replicas: 4
template:
metadata:
labels:
app: recreate
spec:
containers:
- name: recreate
image: registry.cn-hangzhou.aliyuncs.com/ghy/test-docker-image:v1.0
ports:
- containerPort: 8080
livenessProbe:
tcpSocket:
port: 8080

(2)执行脚本

kubectl apply -f rollingupdate.yaml

(3)查看pods

kubectl get pods

(4)和前面一样修改recreate.yaml文件的版本号

kubectl apply -f recreate.yaml

(5)查看pod

kubectl get pods

(6)执行apply操作让文件重新生效变成2.0版本

kubectl apply -f rollingupdate.yaml

(7)执行下面命令会发现老版本停止后再启动新版本

kubectl get pods

1.3 、蓝绿

蓝绿部署呢其实就是一个标饰,标记一个蓝色一个绿色,版本切换通过蓝和绿进行声明;
(1)创建一个bluegreen.yaml 
#deploy
apiVersion: apps/v1
kind: Deployment
metadata:
name: blue
spec:
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
selector:
matchLabels:
app: bluegreen
replicas: 4
template:
metadata:
labels:
app: bluegreen
version: v1.0
spec:
containers:
- name: bluegreen
image: registry.cn-hangzhou.aliyuncs.com/ghy/test-docker-image:v1.0
ports:
- containerPort: 8080

(2)执行脚本

kubectl apply -f bluegreen.yaml

(3)查看pods

kubectl get pods
 (4)写一个service脚本,文件名是bluegreen-service.yaml

apiVersion: v1
kind: Service
metadata:
name: bluegreen
spec:
ports:
- port: 80
protocol: TCP
targetPort: 8080
selector:
app: bluegreen
version: v1.0
type: ClusterIP

(5)重新启动脚本

kubectl apply -f bluegreen-service.yaml

(6)查看svc

kubectl get svc

(7)在w1上不断访问观察

while sleep 0.3;do curl cluster-ip/dockerfile;echo "";done

(8)接下来就是要做将1.0版本升级到2.0版本了修改bluegreen.yaml,修改的内容我标记不同颜色

#deploy
apiVersion: apps/v1
kind: Deployment
metadata:
name: green
spec:
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
selector:
matchLabels:
app: bluegreen
replicas: 4
template:
metadata:
labels:
app: bluegreen
version: v2.0
spec:
containers:
- name: bluegreen
image: registry.cn-hangzhou.aliyuncs.com/ghy/test-docker-image:v2.0
ports:
- containerPort: 8080

(9)重新启动脚本

kubectl apply -f bluegreen.yaml

(10)查看pod

kubectl get pods

(11)同时观察刚才访问的地址有没有变化,可以发现,两个版本就共存了,并且之前访问的地址没有变化,那怎么切换版本呢,前面不是写了个bluegreen-service.yaml文件吗,很简单,修改bluegreen-service.yaml文件的指向就行,修改后的bluegreen-service.yaml文件如下

apiVersion: v1
kind: Service
metadata:
name: bluegreen
spec:
ports:
- port: 80
protocol: TCP
targetPort: 8080
#也就是把流量切到了2.0版本中
selector:
app: bluegreen
version: v2.0
type: ClusterIP

(12)重启下bluegreen-service.yaml文件

kubectl apply -f bluegreen-service.yaml

(13)重新查看svc

kubectl get svc

(14)同时观察刚才访问的地址有没有变化,发现流量已经完全切到了v2.0的版本上

1.4、金丝雀

前面三种介绍完了,接下来说一种开发中常用的一种部署方式,在有些场景中,如果我们希望多版本共存,那部署怎么搞呢,方法就是接下来要说明的

(1)其实很简单,只用在我们1.3中的蓝绿部署中做一些小小的改变就好。修改下bluegreen-service.yaml文件,改动如下

apiVersion: v1
kind: Service
metadata:
name: bluegreen
spec:
ports:
- port: 80
protocol: TCP
targetPort: 8080
selector:
app: bluegreen
version: v2.0 #把veersion删除掉只根据bluegreen进行选择
type: ClusterIP

(2)重启下bluegreen-service.yaml文件

kubectl apply -f bluegreen-service.yaml

(3)同时观察刚才访问的地址有没有变化,istio中就更方便咯,此时新旧版本能够同时被访问到,AB测试,新功能部署少一些的实例

Kubernetes常见的部署方案(十四)的更多相关文章

  1. 秋色园QBlog技术原理解析:性能优化篇:缓存总有失效时,构造持续的缓存方案(十四)

    转载自:http://www.cyqdata.com/qblog/article-detail-38993 文章回顾: 1: 秋色园QBlog技术原理解析:开篇:整体认识(一) --介绍整体文件夹和文 ...

  2. Kubernetes学习之路(十四)之服务发现Service

    一.Service的概念 运行在Pod中的应用是向客户端提供服务的守护进程,比如,nginx.tomcat.etcd等等,它们都是受控于控制器的资源对象,存在生命周期,我们知道Pod资源对象在自愿或非 ...

  3. Kubernetes实战指南(三十四): 高可用安装K8s集群1.20.x

    @ 目录 1. 安装说明 2. 节点规划 3. 基本配置 4. 内核配置 5. 基本组件安装 6. 高可用组件安装 7. 集群初始化 8. 高可用Master 9. 添加Node节点 10. Cali ...

  4. Wix 安装部署教程(十四) -- 多语言安装包之用户许可协议

    在上一篇中,留下了许可协议的问题,目前已经解决.感谢网友武全的指点! 问题 一般我们是用WixVariable 来设定许可协议.如下所示: <WixVariable Id="WixUI ...

  5. JAVA常见算法题(三十四)---计算加密之后的电话号码

    某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的, 加密规则如下: 每位数字都加上5,然后用和除以10的余数代替该数字, 再将第一位和第四位交换,第二位和第三位交换. 求加密之后的 ...

  6. JAVA常见算法题(二十四)

    package com.xiaowu.demo; //一个5位数,判断它是不是回文数.即12321是回文数,个位与万位相同,十位与千位相同. public class Demo24 { public ...

  7. 使用Minikube部署本地Kubernetes集群(二十八)

    前言 使用Minikube部署本地k8s集群相对比较简单,非常推荐将其用于本地k8s开发环境,唯一麻烦点的仅仅是网络问题. 在本篇教程中,我们使用了国内的镜像来完成本地k8s集群的搭建.如果搭建过程中 ...

  8. 《linux就该这么学》第十四节课:第13章,部署DNS域名解析服务(bind服务)

    (借鉴请改动)  第十二章收尾  12.2.nfs网络文件系统 RHEL7默认安装了nfs,配置文件在  /etc/export  写入格式:共享目录    允许的客户端(参数)  ro        ...

  9. kubernetes学习笔记之十四:helm入门

    1.Helm的简介 Helm是Kubernetes的一个包管理工具,用来简化Kubernetes应用的部署和管理.可以把Helm比作CentOS的yum工具. Helm有如下几个基本概念: Chart ...

随机推荐

  1. C. Success Rate

    Success Rate 题目链接 题意 给你两个分数形式的数,然后有两种变化方式 上下都+1 仅下面部分+1 让你求第一个分数变化到第二个分数的最小步数. 思路 有几种特殊情况分类讨论一下. 首先我 ...

  2. Docker 与 K8S学习笔记(六)—— 容器的资源限制

    我们在启动Docker容器时,默认情况下容器所使用的资源是没有限制的,这样就会存在部分特别耗资源的容器会占用大量系统资源,从而导致其他容器甚至整个服务器性能降低,为此,Docker提供了一系列参数方便 ...

  3. HITCON 2019 Lost Modular again writeup

    HITCON 2019 Lost Modular again writeup 算是基础题,有很多之前题的影子,做不出来纯属菜. 题目 加密脚本 from Crypto.Util.number impo ...

  4. 「算法笔记」FHQ-Treap

    右转→https://www.cnblogs.com/mytqwqq/p/15057231.html 下面放个板子 (禁止莱莱白嫖板子) P3369 [模板]普通平衡树 #include<bit ...

  5. Reproducing Kernel Hilbert Space (RKHS)

    目录 概 主要内容 RKHS-wiki 概 这里对RKHS做一个简单的整理, 之前的理解错得有点离谱了. 主要内容 首先要说明的是, RKHS也是指一种Hilbert空间, 只是其有特殊的性质. Hi ...

  6. Probabilistic Principal Component Analysis

    目录 引 主要内容 EM算法求解 附录 极大似然估计 代码 Tipping M E, Bishop C M. Probabilistic Principal Component Analysis[J] ...

  7. 使用.NET 6开发TodoList应用(12)——实现ActionFilter

    系列导航及源代码 使用.NET 6开发TodoList应用文章索引 需求 Filter在.NET Web API项目开发中也是很重要的一个概念,它运行在执行MVC响应的Pipeline中执行,允许我们 ...

  8. linux系统安装java

    1.下载Java压缩包 *.gz 2.解压 3.修改Linux配置文件,配置Java环境变量 4.使用命令source /etc/profile让修改生效 转载 https://www.cnblogs ...

  9. Android程序设计基础 • 【第1章 Android程序入门】

    全部章节   >>>> 本章目录 1.1 Android 平台介绍 1.1.1 Android 简介 1.1.2 Android 平台的发展 1.1.3 Android 平台架 ...

  10. 【MySQL作业】DDL 和 DML——美和易思使用 DML 新增和更新表数据应用习题

    点击打开所使用到的数据库>>> 1.添加 easyShopping 客户数据. insert into customer values('abc111','111',' 刘一鸣 ', ...