一、常见的部署方案

  • 滚动更新
    • 服务不会停止,但是整个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. 【LeetCode】102. Binary Tree Level Order Traversal 二叉树的层序遍历 (Python&C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 BFS DFS 日期 题目地址:https://lee ...

  2. ADAM : A METHOD FOR STOCHASTIC OPTIMIZATION

    目录 概 主要内容 算法 选择合适的参数 一些别的优化算法 AdaMax 理论 代码 Kingma D P, Ba J. Adam: A Method for Stochastic Optimizat ...

  3. 【Warrior刷题笔记】剑指offer 6 24 35. 三道题,让你学会链表递归迭代辅助栈

    题目一 从尾到头打印链表 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/cong-wei-dao-tou-da-yin-lian-biao-l ...

  4. python+pytest,通过自定义命令行参数,实现浏览器兼容性跑用例

    场景拓展: UI自动化可能需要指定浏览器进行测试,为了做成自定义配置浏览器,可以通过动态添加pytest的命令行参数,在执行的时候,获取命令行传入的参数,在对应的浏览器执行用例. 1.自动化用例需要支 ...

  5. hive 之 查看某库一共有多少张表

    思路一: show出所有表,然后wc -l hive -e" use database_name; show tables; "|wc -l 思路二: 1.show出当前库所有的表 ...

  6. Selenium_截图(16)

    selenium截图有两种方式 截取全屏 get_screenshot_as_file(filename):将截图转化成文件保存到本地,filename为保存的文件路径 get_screenshot_ ...

  7. 不用下载Axure RP Extension for Chrome插件查看原型文件的方法

    Axure RP Extension for Chrome是一款谷歌插件,主要可以用来查看原型文件.以前安装插件的时候总是找半天资源,很麻烦,最近发现了一种新方法可以不用下载插件资源.其实在原型文件中 ...

  8. Nginx 添加防爬虫

    include agent_deny.conf; conf下添加 #禁止Scrapy|curl等工具的抓取 if ($http_user_agent ~* (Scrapy|Curl|HttpClien ...

  9. Centos7安装maxscale 实现mysql的读写分离

    安装依赖 yum install -y novacom-server.x86_64 libaio.x86_64 libaio-devel.x86_64 网站下载 https://downloads.m ...

  10. xshell 所选的用户密钥未在远程主机上注册;无法加载密钥

    他山之石 https://zhuanlan.zhihu.com/p/92528287 安全起见,服务器最近的安全策略准备进行更改,逐渐由原来的密码登录更换为密钥登录认证. 于是今天把服务器上的id_r ...