Kubernetes常见的部署方案(十四)
一、常见的部署方案
- 滚动更新
- 服务不会停止,但是整个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、 重新创建
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 、蓝绿
#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
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常见的部署方案(十四)的更多相关文章
- 秋色园QBlog技术原理解析:性能优化篇:缓存总有失效时,构造持续的缓存方案(十四)
转载自:http://www.cyqdata.com/qblog/article-detail-38993 文章回顾: 1: 秋色园QBlog技术原理解析:开篇:整体认识(一) --介绍整体文件夹和文 ...
- Kubernetes学习之路(十四)之服务发现Service
一.Service的概念 运行在Pod中的应用是向客户端提供服务的守护进程,比如,nginx.tomcat.etcd等等,它们都是受控于控制器的资源对象,存在生命周期,我们知道Pod资源对象在自愿或非 ...
- Kubernetes实战指南(三十四): 高可用安装K8s集群1.20.x
@ 目录 1. 安装说明 2. 节点规划 3. 基本配置 4. 内核配置 5. 基本组件安装 6. 高可用组件安装 7. 集群初始化 8. 高可用Master 9. 添加Node节点 10. Cali ...
- Wix 安装部署教程(十四) -- 多语言安装包之用户许可协议
在上一篇中,留下了许可协议的问题,目前已经解决.感谢网友武全的指点! 问题 一般我们是用WixVariable 来设定许可协议.如下所示: <WixVariable Id="WixUI ...
- JAVA常见算法题(三十四)---计算加密之后的电话号码
某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的, 加密规则如下: 每位数字都加上5,然后用和除以10的余数代替该数字, 再将第一位和第四位交换,第二位和第三位交换. 求加密之后的 ...
- JAVA常见算法题(二十四)
package com.xiaowu.demo; //一个5位数,判断它是不是回文数.即12321是回文数,个位与万位相同,十位与千位相同. public class Demo24 { public ...
- 使用Minikube部署本地Kubernetes集群(二十八)
前言 使用Minikube部署本地k8s集群相对比较简单,非常推荐将其用于本地k8s开发环境,唯一麻烦点的仅仅是网络问题. 在本篇教程中,我们使用了国内的镜像来完成本地k8s集群的搭建.如果搭建过程中 ...
- 《linux就该这么学》第十四节课:第13章,部署DNS域名解析服务(bind服务)
(借鉴请改动) 第十二章收尾 12.2.nfs网络文件系统 RHEL7默认安装了nfs,配置文件在 /etc/export 写入格式:共享目录 允许的客户端(参数) ro ...
- kubernetes学习笔记之十四:helm入门
1.Helm的简介 Helm是Kubernetes的一个包管理工具,用来简化Kubernetes应用的部署和管理.可以把Helm比作CentOS的yum工具. Helm有如下几个基本概念: Chart ...
随机推荐
- 【LeetCode】1020. Partition Array Into Three Parts With Equal Sum 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- TensorFlow.NET机器学习入门【4】采用神经网络处理分类问题
上一篇文章我们介绍了通过神经网络来处理一个非线性回归的问题,这次我们将采用神经网络来处理一个多元分类的问题. 这次我们解决这样一个问题:输入一个人的身高和体重的数据,程序判断出这个人的身材状况,一共三 ...
- 【C\C++笔记】指针输出字符串
1错误代码 #include<stdio.h> int main(){ char a[]="hello"; char *p=a; for(int i=0;i<5; ...
- [Kaiming]Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification
目录 概 主要内容 PReLU Kaiming 初始化 Forward case Backward case He K, Zhang X, Ren S, et al. Delving Deep int ...
- BL8810|USB2.0高速闪存读卡器芯片|BL8810规格书
1.说明 BL8810是一款USB 2.0读卡器控制器,采用高度集成的单芯片解决方案,旨在提供USB2.0和SD.SDHC.mini SD.Micro SD(T-Flash)接口规范之间的高速数据传输 ...
- Java高级程序设计作业目录(作业笔记)
持续更新中............. Java高级程序设计笔记 • [目录] 我的大学笔记>>> 第1章 IO流>>> 1.1.3 编写Java程序,在电脑硬盘里, ...
- 编写Java程序,通过接口摸拟麦当劳食物生产过程,接口设计
返回本章节 返回作业目录 需求说明: 通过接口摸拟麦当劳食物生产过程 实现思路: 通过接口摸拟麦当劳食物生产过程的实现思路: 创建接口食物(Food),该接口需要被所有的食物类所实现.在该接口中定义g ...
- MySQL数据库常用命令汇总
-- 查看mysql的当前登陆用户 select user(); -- 列出数据库 show databases; -- 使用数据库 use mysql; describe mysql.user; s ...
- [Azure DevOps] 管理测试计划、测试套件和测试用例
我喜欢测试计划,它能让团队清楚测试进度,还能妥善分配测试人员,更重要的是它能保证测试质量和效率.Azure DevOps 里提供了 Test Plans 这个模块用于管理测试计划. 1. Azure ...
- CSS基础-5 伪类
一.伪类 我们以a标签为例 伪类标签分为4类 1. 设置超链接默认的样式 a:link {属性:值;.....} 或者 a { 属性: 值;} 推荐使用这种方式 2 ...