• istio1.0 实现蓝绿发布(未完成)


    istio1.0 实现蓝绿发布
    
    环境:
    
    192.168.0.91   master
    
    192.168.0.92   node
    
    
    
    第一步:安装k8s集群,参照:https://www.cnblogs.com/effortsing/p/10312081.html
    
    第二步:安装 istio1.0 参照:https://www.cnblogs.com/effortsing/p/10603392.html
    
    第三步:部署同一个应用的两个版本
    
    我们构建了简单的基于Nginx的Docker镜像来作为应用案例:janakiramm/myapp:v1和janakiramm/myapp:v2。
    
    部署完成之后,这两个版本的Nginx会分别显示蓝色或者绿色背景的静态页面。我们用这些图像来完成我们的教程
    
    
    cat>myapp.yaml<<EOF
    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      name: myapp-v1
    spec:
      replicas: 1
      template:
        metadata:
          labels:
            app: myapp
            version: v1
        spec:
          containers:
          - name:  myapp
            image: janakiramm/myapp:v1
            imagePullPolicy: IfNotPresent      
            ports:
            - containerPort: 80
    ---
    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      name: myapp-v2
    spec:
      replicas: 1
      template:
        metadata:
          labels:
            app: myapp
            version: v2
        spec:
          containers:
          - name:  myapp
            image: janakiramm/myapp:v2
            imagePullPolicy: IfNotPresent      
            ports:
            - containerPort: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: myapp
      labels:
        app: myapp
    spec:
      type: ClusterIP
      ports: 
      - port: 80
        name: http
      selector:
        app: myapp
    EOF
    
    
    
    我们先从创建YAML文件开始,来定义V1和V2版本Nginx的部署,同时也设置集群IP把服务暴露出来。请注意我们用不同的标签来区分Pods——app和版本。因为两次部署的版本号不一样,app名字可以相同。
    
    这是Istio所希望的,像单一的app那样处理它们,用不同的个版本来区分。
    
    集群的服务定义也是一样的,标签app: myapp关联了基于不同版本所创建的Pod。
    
    
    
    通过kubectl来创建deployment和service。注意deployment和service是Kubernetes的相关术语,和Istio没有关系。唯一和Istio的关联是我们为deployment和service创建标签的方式
    
    kubectl apply -f myapp.yaml
    
    [root@test2 ~]# kubectl apply -f myapp.yaml
    deployment.extensions/myapp-v1 created
    deployment.extensions/myapp-v2 created
    service/myapp created
    
    [root@test2 ~]# kubectl get pod
    NAME                        READY     STATUS    RESTARTS   AGE
    myapp-v1-58c55dbfb6-lcvzq   1/1       Running   0          48s
    myapp-v2-5c8c686fc6-4v4mn   1/1       Running   0          48s
    
    [root@test2 ~]# kubectl get svc
    NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
    kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP   22d
    myapp        ClusterIP   10.100.239.218   <none>        80/TCP    4m
    
    
    配置Istio之前,我们先来检查一下app的版本。我们可以通过port-forward deployments访问Pod。通过运行下面的命令访问V1的8080端口。准备好CTRL+C
    
    kubectl port-forward deployment/myapp-v1 8080:80
    
    访问:
    
    可以看到下面的访问结果中倒数第5行是nignx的V1版本
    
    [root@test2 ~]# curl http://10.100.239.218:80
    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="utf-8">
      <title>Sample Deployment</title>
      <style>
        body {
          color: #ffffff;
          background-color: blue;
          font-family: Arial, sans-serif;
          font-size: 14px;
        }
        
        h1 {
          font-size: 500%;
          font-weight: normal;
          margin-bottom: 0;
        }
        
        h2 {
          font-size: 200%;
          font-weight: normal;
          margin-bottom: 0;
        }
      </style>
    </head>
    <body>
      <div align="center">
        <h1>Welcome to V1 of the web application</h1>
        <h2>This application will be deployed on Kubernetes.</h2>
      </div>
    </body>
    </html>
    
    
    
    运行下面的命令访问V2的8081端口,继续CTRL+C
    
    kubectl port-forward deployment/myapp-v2 8081:80
    
    
    访问:
    
    可以看到下面的访问结果中倒数第5行是nignx的vNext版本
    
    [root@test2 ~]# curl http://10.100.239.218:80
    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="utf-8">
      <title>Sample Deployment</title>
      <style>
        body {
          color: #ffffff;
          background-color: green;
          font-family: Arial, sans-serif;
          font-size: 14px;
        }
        
        h1 {
          font-size: 500%;
          font-weight: normal;
          margin-bottom: 0;
        }
        
        h2 {
          font-size: 200%;
          font-weight: normal;
          margin-bottom: 0;
        }
      </style>
    </head>
    <body>
      <div align="center">
        <h1>Welcome to vNext of the web application</h1>
        <h2>This application will be deployed on Kubernetes.</h2>
      </div>
    </body>
    </html>
    
    
    第四步:配置蓝绿部署
    
    我们的实验目标是让流量有选择的访问某一个部署,而且不能有服务停止。为了达到这目的,我们要告诉Istio依照权重来路由流量
    
    为了达到这个效果我们需要设置三个对象:
    
    网关
    
    Istio网关描述了在网格边界的负载均衡器如何处理进出的HTTP/TCP连接。着重描述了哪些端口应该被暴露出来,有哪些协议可以用,负载均衡器的SNI配置等等。
    
    接下来,我们把网关指向默认的Ingress网关,它在Istio安装的时候就被创建出来了
    
    创建网关:
    
    cat>apigatway.yaml<<EOF
    apiVersion: networking.istio.io/v1alpha3
    kind: Gateway
    metadata:
      name: app-gateway
    spec:
      selector:
        istio: ingressgateway
      servers:
      - port:
          number: 80
          name: http
          protocol: HTTP
        hosts:
        - "*"
    EOF
    
    kubectl create -f apigatway.yaml
    
    
    报错如下:(暂时不做了)
    
    [root@test2 ~]# kubectl create -f apigatway.yaml
    Error from server (Timeout): error when creating "apigatway.yaml": Timeout: request did not complete within allowed duration
    
    
    目的地规则
    
    Istio目的地规则定义了流量被路由以后访问服务的规则。请注意在Kubernete中这个规则是如何利用标签来声明的。
    
    apiVersion: networking.istio.io/v1alpha3
    kind: DestinationRule
    metadata:
    name: myapp
    spec:
    host: myapp
    subsets:
    - name: v1
    labels:
      version: v1
    - name: v2
    labels:
      version: v2
    
    
    虚拟服务
    
    虚拟服务定义了当主机获得地址以后一系列流量的路由规则。每一条路由规则都定义了某个基于特定协议的流量的匹配规则。当一个流量被匹配了,基于版本,它会被发送到相关的目标服务
    
    
    在下面的操作中,我们声明了V1和V2的权重都为50,这就意味着流量会被平均分配
    
    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
    name: myapp
    spec:
    hosts:
    - "*"
    gateways:
    - app-gateway
    http:
    - route:
      - destination:
          host: myapp
          subset: v1
        weight: 50
      - destination:
          host: myapp
          subset: v2
        weight: 50
    
    
    
    参照:http://dockone.io/article/8297
    
    https://it.baiked.com/kubernetes/3444.html(未做成)
    
    https://blog.csdn.net/qq_33093199/article/details/51397628(解决报错的)

    https://blog.csdn.net/liukuan73/article/details/81165716

    http://blog.itpub.net/28624388/viewspace-2199899/

    http://blog.itpub.net/28624388/viewspace-2199899/

    https://blog.csdn.net/M2l0ZgSsVc7r69eFdTj/article/details/81571517

    https://istio.io/docs/setup/kubernetes/additional-setup/sidecar-injection/ (官网这个简单的sleep实例都做不成)
  • 相关阅读:
    深度学习网络压缩简单介绍
    骨架提取与分水岭算法
    高级形态学处理
    iview @change添加自定义参数
    设置axios拦截器,promise抛出的异常处理
    js 网页跳转
    js 加减法
    vue重新渲染组件(重置或者更新)
    Laravel里firstOrCreate、firstOrNew、updateOrCreate 方法使用
    算法
  • 原文地址:https://www.cnblogs.com/effortsing/p/10609214.html
Copyright © 2020-2023  润新知