kubernetes(K8S)学习(八):K8S之常见部署方案
K8S之常见部署方案
- 一、普通部署
- 二、滚动更新(Rolling update)
- 三、蓝绿部署(Blue/Green Deployment)
- 四、灰度发布(金丝雀发布)
常见的部署方案参考博文:常见部署方案:普通部署、滚动部署、蓝绿部署、灰度发布(金丝雀发布)
一、普通部署
特点: 先停止旧的pod,然后再创建新的pod,这个过程服务是会间断的。
创建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/itcrazy2016/test-docker-image:v1.0 ports: - containerPort: 8080 livenessProbe: tcpSocket: port: 8080命令:
kubectl apply -f recreate.yaml kubectl get pods
修改recreate.yaml文件
kubectl apply -f recreate.yaml kubectl get pods
conclusion :发现pod是先停止,然后再创建新的。
NAME READY STATUS RESTARTS AGE recreate-655d4868d8-5dqcz 0/1 Terminating 0 2m31s recreate-655d4868d8-sb688 0/1 Terminating 0 2m31s
测试:
kubectl rollout pause deploy rollingupdate kubectl rollout resume deploy rollingupdate kubectl rollout undo deploy rollingupdate # 回到上一个版本
二、滚动更新(Rolling update)
服务不会停止,但是整个pod会有新旧并存的情况。
创建rollingupdate.yaml
maxSurge :滚动升级时先启动的pod数量
maxUnavailable :滚动升级时允许的最大unavailable的pod数量
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/itcrazy2016/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命令:
kubectl apply -f rollingupdate.yaml kubectl get pods kubectl get svc curl cluster-ip/dockerfile
修改rollingupdate.yaml文件,将镜像修改成v2.0
# 在w1上,不断地访问观察输出 while sleep 0.2;do curl cluster-ip/dockerfile;echo "";done # 在w2上,监控pod kubectl get pods -w # 使得更改生效 kubectl apply -f rollingupdate.yaml kubectl get pods
conclusion :发现新旧pod是会共存的,并且可以访问测试看一下
kubectl get pods -w kubectl get svc
可以发现,新老版本的确会共存。
三、蓝绿部署(Blue/Green Deployment)
无需停机,风险较小
- (1)部署v1的应用(一开始的状态)
所有外部请求的流量都打到这个版本上
- (2)部署版本2的应用
版本2的代码与版本1不同(新功能、Bug修复等).
- (3)将流量从版本1切换到版本2。
- (4)如版本2测试正常,就删除版本1正在使用的资源(例如实例),从此正式用版本2
创建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/itcrazy2016/test-docker-image:v1.0 ports: - containerPort: 8080命令:
kubectl apply -f bluegreen.yaml kubectl get pods
创建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命令:
kubectl apply -f bluegreen-service.yaml kubectl get svc # 在w1上不断访问观察 while sleep 0.3;do curl cluster-ip/dockerfile;echo "";done
修改bluegreen.yaml
01-deployment-name:blue —> green
02-image:v1.0—> v2.0
03-version:v1.0 —> v2.0
kubectl apply -f bluegreen.yaml kubectl get pods # 同时观察刚才访问的地址有没有变化 # 可以发现,两个版本就共存了,并且之前访问的地址没有变化
修改bluegreen-service.yaml
# 也就是把流量切到2.0的版本中 selector: app: bluegreen version: v2.0
kubectl apply -f bluegreen-service.yaml kubectl get svc # 同时观察刚才访问的地址有没有变化 # 发现流量已经完全切到了v2.0的版本上
四、灰度发布(金丝雀发布)
修改bluegreen-service.yaml
selector: app: bluegreen version: v2.0 # 把version删除掉,只是根据bluegreen进行选择
修改后:
apiVersion: v1 kind: Service metadata: name: bluegreen spec: ports: - port: 80 protocol: TCP targetPort: 8080 selector: app: bluegreen #version: v1.0 type: ClusterIP命令:
kubectl apply -f bluegreen-service.yaml
同时观察刚才访问的地址有没有变化,发现此时新旧版本能够同时被访问到。
- (1)部署v1的应用(一开始的状态)
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!
