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

操作步骤

  1. 登录容器服务管理控制台
  2. 在控制台左侧导航栏中,单击集群
  3. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情
  4. 在集群管理页左侧导航栏中,单击工作负载
  5. 先选择命名空间,然后选择无状态页签。
  6. 单击无状态页签右上角的使用模板创建
  7. 选择示例模板使用已有模板,然后单击创建
    部署新版本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的Annotation既没有设置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
  8. 创建成功后,单击左侧导航栏中的路由

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

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

      # curl -H "Host: www.example.com" -H "foo: bar" http://<EXTERNAL_IP> 
      nodes
    • 满足一定比例的请求被路由到新版本服务。

      # curl -H "Host: www.example.com" http://<EXTERNAL_IP> 
      nodes
    • 满足foo=bar的客户端请求仅允许50%的流量被路由到新版本服务。

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