1. istio1.0 实现蓝绿发布
  2.  
  3. 环境:
  4.  
  5. 192.168.0.91 master
  6.  
  7. 192.168.0.92 node
  8.  
  9. 第一步:安装k8s集群,参照:https://www.cnblogs.com/effortsing/p/10312081.html
  10.  
  11. 第二步:安装 istio1.0 参照:https://www.cnblogs.com/effortsing/p/10603392.html
  12.  
  13. 第三步:部署同一个应用的两个版本
  14.  
  15. 我们构建了简单的基于NginxDocker镜像来作为应用案例:janakiramm/myapp:v1janakiramm/myapp:v2
  16.  
  17. 部署完成之后,这两个版本的Nginx会分别显示蓝色或者绿色背景的静态页面。我们用这些图像来完成我们的教程
  18.  
  19. cat>myapp.yaml<<EOF
  20. apiVersion: extensions/v1beta1
  21. kind: Deployment
  22. metadata:
  23. name: myapp-v1
  24. spec:
  25. replicas: 1
  26. template:
  27. metadata:
  28. labels:
  29. app: myapp
  30. version: v1
  31. spec:
  32. containers:
  33. - name: myapp
  34. image: janakiramm/myapp:v1
  35. imagePullPolicy: IfNotPresent
  36. ports:
  37. - containerPort: 80
  38. ---
  39. apiVersion: extensions/v1beta1
  40. kind: Deployment
  41. metadata:
  42. name: myapp-v2
  43. spec:
  44. replicas: 1
  45. template:
  46. metadata:
  47. labels:
  48. app: myapp
  49. version: v2
  50. spec:
  51. containers:
  52. - name: myapp
  53. image: janakiramm/myapp:v2
  54. imagePullPolicy: IfNotPresent
  55. ports:
  56. - containerPort: 80
  57. ---
  58. apiVersion: v1
  59. kind: Service
  60. metadata:
  61. name: myapp
  62. labels:
  63. app: myapp
  64. spec:
  65. type: ClusterIP
  66. ports:
  67. - port: 80
  68. name: http
  69. selector:
  70. app: myapp
  71. EOF
  72.  
  73. 我们先从创建YAML文件开始,来定义V1V2版本Nginx的部署,同时也设置集群IP把服务暴露出来。请注意我们用不同的标签来区分Pods——app和版本。因为两次部署的版本号不一样,app名字可以相同。
  74.  
  75. 这是Istio所希望的,像单一的app那样处理它们,用不同的个版本来区分。
  76.  
  77. 集群的服务定义也是一样的,标签app: myapp关联了基于不同版本所创建的Pod
  78.  
  79. 通过kubectl来创建deploymentservice。注意deploymentserviceKubernetes的相关术语,和Istio没有关系。唯一和Istio的关联是我们为deploymentservice创建标签的方式
  80.  
  81. kubectl apply -f myapp.yaml
  82.  
  83. [root@test2 ~]# kubectl apply -f myapp.yaml
  84. deployment.extensions/myapp-v1 created
  85. deployment.extensions/myapp-v2 created
  86. service/myapp created
  87.  
  88. [root@test2 ~]# kubectl get pod
  89. NAME READY STATUS RESTARTS AGE
  90. myapp-v1-58c55dbfb6-lcvzq 1/1 Running 0 48s
  91. myapp-v2-5c8c686fc6-4v4mn 1/1 Running 0 48s
  92.  
  93. [root@test2 ~]# kubectl get svc
  94. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  95. kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 22d
  96. myapp ClusterIP 10.100.239.218 <none> 80/TCP 4m
  97.  
  98. 配置Istio之前,我们先来检查一下app的版本。我们可以通过port-forward deployments访问Pod。通过运行下面的命令访问V18080端口。准备好CTRL+C
  99.  
  100. kubectl port-forward deployment/myapp-v1 8080:80
  101.  
  102. 访问:
  103.  
  104. 可以看到下面的访问结果中倒数第5行是nignxV1版本
  105.  
  106. [root@test2 ~]# curl http://10.100.239.218:80
  107. <!DOCTYPE html>
  108. <html>
  109. <head>
  110. <meta charset="utf-8">
  111. <title>Sample Deployment</title>
  112. <style>
  113. body {
  114. color: #ffffff;
  115. background-color: blue;
  116. font-family: Arial, sans-serif;
  117. font-size: 14px;
  118. }
  119.  
  120. h1 {
  121. font-size: 500%;
  122. font-weight: normal;
  123. margin-bottom: 0;
  124. }
  125.  
  126. h2 {
  127. font-size: 200%;
  128. font-weight: normal;
  129. margin-bottom: 0;
  130. }
  131. </style>
  132. </head>
  133. <body>
  134. <div align="center">
  135. <h1>Welcome to V1 of the web application</h1>
  136. <h2>This application will be deployed on Kubernetes.</h2>
  137. </div>
  138. </body>
  139. </html>
  140.  
  141. 运行下面的命令访问V28081端口,继续CTRL+C
  142.  
  143. kubectl port-forward deployment/myapp-v2 8081:80
  144.  
  145. 访问:
  146.  
  147. 可以看到下面的访问结果中倒数第5行是nignxvNext版本
  148.  
  149. [root@test2 ~]# curl http://10.100.239.218:80
  150. <!DOCTYPE html>
  151. <html>
  152. <head>
  153. <meta charset="utf-8">
  154. <title>Sample Deployment</title>
  155. <style>
  156. body {
  157. color: #ffffff;
  158. background-color: green;
  159. font-family: Arial, sans-serif;
  160. font-size: 14px;
  161. }
  162.  
  163. h1 {
  164. font-size: 500%;
  165. font-weight: normal;
  166. margin-bottom: 0;
  167. }
  168.  
  169. h2 {
  170. font-size: 200%;
  171. font-weight: normal;
  172. margin-bottom: 0;
  173. }
  174. </style>
  175. </head>
  176. <body>
  177. <div align="center">
  178. <h1>Welcome to vNext of the web application</h1>
  179. <h2>This application will be deployed on Kubernetes.</h2>
  180. </div>
  181. </body>
  182. </html>
  183.  
  184. 第四步:配置蓝绿部署
  185.  
  186. 我们的实验目标是让流量有选择的访问某一个部署,而且不能有服务停止。为了达到这目的,我们要告诉Istio依照权重来路由流量
  187.  
  188. 为了达到这个效果我们需要设置三个对象:
  189.  
  190. 网关
  191.  
  192. Istio网关描述了在网格边界的负载均衡器如何处理进出的HTTP/TCP连接。着重描述了哪些端口应该被暴露出来,有哪些协议可以用,负载均衡器的SNI配置等等。
  193.  
  194. 接下来,我们把网关指向默认的Ingress网关,它在Istio安装的时候就被创建出来了
  195.  
  196. 创建网关:
  197.  
  198. cat>apigatway.yaml<<EOF
  199. apiVersion: networking.istio.io/v1alpha3
  200. kind: Gateway
  201. metadata:
  202. name: app-gateway
  203. spec:
  204. selector:
  205. istio: ingressgateway
  206. servers:
  207. - port:
  208. number: 80
  209. name: http
  210. protocol: HTTP
  211. hosts:
  212. - "*"
  213. EOF
  214.  
  215. kubectl create -f apigatway.yaml
  216.  
  217. 报错如下:(暂时不做了)
  218.  
  219. [root@test2 ~]# kubectl create -f apigatway.yaml
  220. Error from server (Timeout): error when creating "apigatway.yaml": Timeout: request did not complete within allowed duration
  221.  
  222. 目的地规则
  223.  
  224. Istio目的地规则定义了流量被路由以后访问服务的规则。请注意在Kubernete中这个规则是如何利用标签来声明的。
  225.  
  226. apiVersion: networking.istio.io/v1alpha3
  227. kind: DestinationRule
  228. metadata:
  229. name: myapp
  230. spec:
  231. host: myapp
  232. subsets:
  233. - name: v1
  234. labels:
  235. version: v1
  236. - name: v2
  237. labels:
  238. version: v2
  239.  
  240. 虚拟服务
  241.  
  242. 虚拟服务定义了当主机获得地址以后一系列流量的路由规则。每一条路由规则都定义了某个基于特定协议的流量的匹配规则。当一个流量被匹配了,基于版本,它会被发送到相关的目标服务
  243.  
  244. 在下面的操作中,我们声明了V1V2的权重都为50,这就意味着流量会被平均分配
  245.  
  246. apiVersion: networking.istio.io/v1alpha3
  247. kind: VirtualService
  248. metadata:
  249. name: myapp
  250. spec:
  251. hosts:
  252. - "*"
  253. gateways:
  254. - app-gateway
  255. http:
  256. - route:
  257. - destination:
  258. host: myapp
  259. subset: v1
  260. weight: 50
  261. - destination:
  262. host: myapp
  263. subset: v2
  264. weight: 50
  265.  
  266. 参照:http://dockone.io/article/8297
  267.  
  268. https://it.baiked.com/kubernetes/3444.html(未做成)
  269.  
  270. https://blog.csdn.net/qq_33093199/article/details/51397628(解决报错的)
  271.  
  272. https://blog.csdn.net/liukuan73/article/details/81165716
  273.  
  274. http://blog.itpub.net/28624388/viewspace-2199899/
  275.  
  276. http://blog.itpub.net/28624388/viewspace-2199899/
  277.  
  278. https://blog.csdn.net/M2l0ZgSsVc7r69eFdTj/article/details/81571517
  279.  
  280. https://istio.io/docs/setup/kubernetes/additional-setup/sidecar-injection/ (官网这个简单的sleep实例都做不成)

istio1.0 实现蓝绿发布(未完成)的更多相关文章

  1. 附032.Kubernetes实现蓝绿发布

    蓝绿发布原理 蓝绿发布本质上是希望能优雅无误的迭代应用,以便于使应用平稳提供服务.通常是不停老版本的同时对新版本进行先发布,然后确认无误后进行流量切换,即并行部署. Kubernetes中可以通过de ...

  2. 一文读懂蓝绿发布、A/B 测试和金丝雀发布的优缺点

    作者 | 扬少 背景 目前,业界已经总结出了几种常见的服务发布策略来解决版本升级过程中带来的流量有损问题.本文首先会对这些普遍的发布策略进行简单的原理解析,最后结合阿里云的云原生网关对这些发布策略进行 ...

  3. 持续部署入门:基于 Kubernetes 实现蓝绿发布

    前言 软件世界比以往任何时候都更快.为了保持竞争力,需要尽快推出新的软件版本,而不会中断活跃用户访问,影响用户体验.越来越多企业已将其应用迁移到 Kubernetes. 在 Kubernetes 中有 ...

  4. 手把手教你在 TKE 集群中实现简单的蓝绿发布和灰度发布

    概述 如何在腾讯云 Kubernetes 集群实现蓝绿发布和灰度发布?通常要向集群额外部署其它开源工具来实现,比如 Nginx Ingress,Traefik 等,或者让业务上 Service Mes ...

  5. 蓝绿部署、红黑部署、AB测试、灰度发布、金丝雀发布、滚动发布的概念与区别(转)

    出处:https://www.baidu.com/link?url=QjboallwNm_jxcL3fHG57wEakiBfAs_3-TChTGu1eBXstlHEsGBc-NDA7AKTqsiroB ...

  6. 蓝 / 绿部署(Blue/Green) 金丝雀发布(Canary Release) 功能标记(Feature Flagging)

    https://www.cnblogs.com/apanly/p/8784096.html 最终,我选择了 GraphQL 作为企业 API 网关 蓝 / 绿部署(Blue/Green) 金丝雀发布( ...

  7. Contour 学习笔记(二):使用级联功能实现蓝绿部署和金丝雀发布

    上篇文章介绍了 Contour 分布式架构的工作原理,顺便简单介绍了下 IngressRoute 的使用方式.本文将探讨 IngressRoute 更高级的用法,其中级联功能是重点. 1. Ingre ...

  8. 蓝绿部署、A/B测试以及灰度发布(金丝雀发布)

    过去的10多年里,很多大公司都在使用蓝绿部署,安全.可靠是这种部署方式的特点.蓝绿部署虽然算不上”Sliver Bullet“,但确实很实用.在有关于“微服务”.“DevOps”.“Cloud-nat ...

  9. 蓝绿部署、金丝雀发布(灰度发布)、A/B测试

    本文转载自蓝绿部署.金丝雀发布(灰度发布).A/B测试的准确定义 概述 蓝绿部署.A/B测试.金丝雀发布,以及灰度发布.流量切分等,经常被混为一谈,影响沟通效率. 根本原因是这些名词经常出现,人们耳熟 ...

随机推荐

  1. python 获取当前,上级,上上级路径

    import os print '***获取当前目录***' print os.getcwd() print os.path.abspath(os.path.dirname(__file__)) pr ...

  2. hive的常用函数工作总结

    1.concat_ws 它是一个特殊形式的 CONCAT() concat_ws(分隔符,参数1,参数2.......) as 字段 2.split 返回值为一个数组 a.基本用法: 例1:split ...

  3. Reducetask机制

    Reduce大致分为copy.sort.reduce三个阶段,重点在前两个阶段.copy阶段包含一个eventFetcher来获     取已完成的map列表,由Fetcher线程去copy数据,在此 ...

  4. vscode代码折叠方法

    最近换用了vscode代码编辑器,在查看c源码的时候想折叠所有区域的代码,不知道快捷键是哪一个?查看了使用说明,快捷键如下: 1. 折叠所有区域代码的快捷: ctrl + k      ctrl + ...

  5. 拓展-教你手把手用纯CSS写轮播图

    先看成品图[示例网址:][1] [1]: https://huruji.github.io/css-imitate-js/slider/index.html一.随便说几句####css3动画效果的强大 ...

  6. 【C/C++】变量

    变量定义就是告诉编译器在何处创建变量的存储,以及如何创建变量的存储.变量定义指定一个数据类型,并包含了该类型的一个或多个变量的列表. 变量声明向编译器保证变量以给定的类型和名称存在,这样编译器在不需要 ...

  7. (尚029)Vue_案例_交互footer组件功能

    需要实现界面截图: 难点分析:sAllCheck必须定义为计算属性 1.想到问题: 一旦写一个组件,需要接收哪些属性?? 因为只有属性确定了,标签才好写 todos属性可以确定三个方面的显示 2.做交 ...

  8. 异常0xc000041d的抛出过程

    为了说明这个过程,我们必须写一个示例程序,如下: #include "stdafx.h" #include <tchar.h> #include <stdio.h ...

  9. 【题解】洛谷 P2725 邮票 Stamps

    目录 题目 思路 \(Code\) 题目 P2725 邮票 Stamps 思路 \(\texttt{dp}\).\(\texttt{dp[i]}\)表示拼出邮资\(i\)最少需要几张邮票. 状态转移方 ...

  10. gcc 编译c++文件

    #include <stdio.h> //将类定义在命名空间中 namespace Diy{ class Student{ public: char *name; int age; flo ...