本文介绍如何利用阿里云容器服务的Ingress功能,发布新版本服务。

前提条件

操作步骤

  1. 登录容器服务管理控制台
  2. 在 Kubernetes 菜单下,单击左侧导航栏中的应用 > 部署,进入部署列表页面。
  3. 单击页面右上角的使用模板创建


  4. 选择所需的集群,命名空间,选择样例模板或自定义,然后单击创建


    部署新版本nginx应用,包含一个 deployment、 service 以及 ingress。deployment及 service 编排模板如下:
    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      name: new-nginx
    spec:
      replicas: 1
      selector:
        matchLabels:
          run: new-nginx
      template:
        metadata:
          labels:
            run: new-nginx
        spec:
          containers:
          - image: registry.cn-hangzhou.aliyuncs.com/xianlu/new-nginx
            imagePullPolicy: Always
            name: new-nginx
            ports:
            - containerPort: 80
              protocol: TCP
          restartPolicy: Always
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: new-nginx
    spec:
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        run: new-nginx
      sessionAffinity: None
      type: NodePort
    ingress模板:
    说明 若 ingress的Anotation既没有设置 service-match,也没有设置 service-weight,Ingress Controller在转发客户端请求时默认会将请求均衡地随机转发到新老版本服务中。
    • 满足正则匹配foo=bar的客户端请求才能访问新版本服务

      apiVersion: extensions/v1beta1
      kind: Ingress
      metadata:
        name: gray-release
        annotations:
            nginx.ingress.kubernetes.io/service-match: |      # 请求头中满足正则匹配foo=bar的请求才会被路由到新版本服务new-nginx中
                new-nginx: header("foo", /^bar$/)
      spec:
        rules:
        - host: www.example.com
          http:
            paths:
            # 老版本服务
            - path: /
              backend:
                serviceName: old-nginx
                servicePort: 80
            # 新版本服务
            - path: /
              backend:
                serviceName: new-nginx
                servicePort: 80
    • 满足一定比例的请求被路由到新版本服务
      说明 此处新旧版本服务权重分别为50%。
      apiVersion: extensions/v1beta1
      kind: Ingress
      metadata:
        name: gray-release
        annotations:
            nginx.ingress.kubernetes.io/service-weight: |    # 允许50%的流量被路由到新版本服务new-nginx中
                new-nginx: 50, old-nginx: 50
      spec:
        rules:
        - host: www.example.com
          http:
            paths:
            # 老版本服务
            - path: /
              backend:
                serviceName: old-nginx
                servicePort: 80
            # 新版本服务
            - path: /
              backend:
                serviceName: new-nginx
                servicePort: 80
    • 满足foo=bar的客户端请求仅允许50%的流量被路由到新版本服务

      apiVersion: extensions/v1beta1
      kind: Ingress
      metadata:
        name: gray-release
        annotations:
          nginx.ingress.kubernetes.io/service-match: |   # 请求头中满足正则匹配foo=bar的请求才会被路由到新版本服务new-nginx中
              new-nginx: header("foo", /^bar$/)
          nginx.ingress.kubernetes.io/service-weight: |  # 在满足上述匹配规则的基础上仅允许50%的流量会被路由到新版本服务new-nginx中
              new-nginx: 50, old-nginx: 50
      spec:
        rules:
        - host: www.example.com
          http:
            paths:
            # 老版本服务
            - path: /
              backend:
                serviceName: old-nginx
                servicePort: 80
            # 新版本服务
            - path: /
              backend:
                serviceName: new-nginx
                servicePort: 80
  5. 创建成功后,单击左侧导航栏中的应用 > 路由

    您可看到虚拟主机名称指向 old-nginx。



  6. 登录 Master 节点,执行 curl 命令,查看路由的访问情况。
    • 满足正则匹配foo=bar的客户端请求才能访问新版本服务

      # curl -H "Host: www.example.com" -H "foo: bar" http://<EXTERNAL_IP> 


    • 满足一定比例的请求被路由到新版本服务

      # curl -H "Host: www.example.com" http://<EXTERNAL_IP> 


    • 满足foo=bar的客户端请求仅允许50%的流量被路由到新版本服务

      # curl -H "Host: www.example.com" -H "foo: bar" http://<EXTERNAL_IP>