侧边栏壁纸
博主头像
张种恩的技术小栈博主等级

行动起来,活在当下

  • 累计撰写 748 篇文章
  • 累计创建 65 个标签
  • 累计收到 39 条评论

目 录CONTENT

文章目录

AWS EKS 中的 Ingress 注解问题

zze
zze
2020-12-05 / 0 评论 / 1 点赞 / 979 阅读 / 5922 字

这两天有一个 Kubernetes 的迁移需求,从阿里云迁移到 AWS。

迁移过来后有一个问题,我们在集群中有一个接口是有预期的访问很慢(60s+),这个接口是个特殊接口,我们需要允许它访问慢,但是在调试的过程中发现连接时间每到 60s 的时候这个连接就强行中断了,这里我们的应用是没有做限制的,唯一可能有问题的地方就是代理部分了。

我们的接口是通过 EKS 默认的 nginx-ingress-controller 暴露的,这里我其实第一时间就想到是 nginx 默认的代理时间的问题,进入 nginx-ingress-controller 的容器内部检查生效的配置文件:

$ kubectl exec -it nginx-nginx-ingress-845457bcc-krhpm -n ingress -- bash
nginx@nginx-nginx-ingress-845457bcc-krhpm:/$ cd /etc/nginx/conf.d/
nginx@nginx-nginx-ingress-845457bcc-krhpm:/etc/nginx/conf.d$ cat xxx.conf
...
        location / {


                proxy_http_version 1.1;


                proxy_connect_timeout 60s;
                proxy_read_timeout 60s;
                proxy_send_timeout 60s;
                client_max_body_size 50m;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Host $host;
                proxy_set_header X-Forwarded-Port $server_port;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_buffering on;

                proxy_pass http://helmsman-hlm-pool-app-v223-miner-app.grandhelmsman.com-hlm-pool-app-v225-svc-6zr7mz;


        }


}

发现默认生成的 nginx 配置果然限制了默认的超时时间。。

知道问题就好办了,之前也有了解过,nginx-ingress-controller 生成的虚拟主机配置是可以通过对应 Ingress 的注解(annotation)来设定的,而我之前使用的 Kubernetes 集群都是自己手动搭建的,并且 nginx-ingress-controller 也是通过网上常规的 yaml 部署的,按之前的了解它的注解应该配置如下:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/proxy-connect-timeout: "600"
    nginx.ingress.kubernetes.io/proxy-read-timeout: "600"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "600"

然后。。我就这么配了。。然后结果就是 nginx-ingress-controller 中的虚拟主机配置并没有更新生效。。

这个问题整了我好久,今天早上醒来。突然想到 nginx-ingress-controller 好像是有几个版本的,有 Nginx 官方的版本,也有什么社区版本的。。然后就立马来查看一下 ingress-controller Pod 使用的镜像:

$ kubectl get deploy -n ingress -o yaml | grep 'image:'
          image: nginx/nginx-ingress:1.7.2

然后经过一通调研。。发现这个其实是属于 Nginx 官方发布的 ingress-controller,最终在 Nginx 官网的一个博文中找到了 1.7 版本的发布说明,地址如下:

下面是这篇文章第一段的内容:

We are happy to announce release 1.7.0 of NGINX Ingress Controller for Kubernetes. This release builds upon the development of our supported solution for Ingress load balancing on Kubernetes platforms, including Amazon Elastic Container Service for Kubernetes (EKS), the Azure Kubernetes Service (AKS), Google Kubernetes Engine (GKE), Red Hat OpenShift, IBM Cloud Private, Diamanti, and others.

啊。。可以看到上面有说它是被 EKS 应用的方案,接着往下:

With release 1.7.0, we continue our commitment to providing a flexible, powerful and easy-to-use Ingress Controller, which you can configure with both Kubernetes Ingress resources and NGINX Ingress resources:

Kubernetes Ingress resources provide maximum compatibility across Ingress controller implementations, and can be extended using annotations and custom templates to generate sophisticated configuration.
NGINX Ingress resources provide an NGINX‑specific configuration schema, which is richer and safer than customizing the generic Kubernetes Ingress resources.

正好有介绍到可以通过 annotationscustom templates 来生成配置。。就是它了!!!

点击 annotations 超链接进去定睛一看,,这里使用的配置格式如下:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: cafe-ingress-with-annotations
  annotations:
    nginx.org/proxy-connect-timeout: "30s"
    nginx.org/proxy-read-timeout: "20s"
    nginx.org/client-max-body-size: "4m"
    nginx.org/server-snippets: |
      location / {
        return 302 /coffee;
      }

可以看到注解字段使用的前缀是 nginx.org 而不是百度上常见的 nginx.ingress.kubernetes.io。。

然后去 EKS 中测试了一下,果然就是这个。。解决了。。

紧接着,由于上面还有介绍一种自定义模板的方式来生成配置,所以我又好奇的去看了一下 ingress 命名空间使用的 ConfigMap 资源:

kubectl get cm -n ingress
NAME                                  DATA   AGE
nginx-nginx-ingress                   4      137d
nginx-nginx-ingress-leader-election   0      137d

真正的配置内容在这个资源中:

$ kubectl get cm -n ingress nginx-nginx-ingress -o yaml
apiVersion: v1
data:
  client-max-body-size: 50m
  proxy-body-size: 50m
  proxy-pass-headers: x-amz-PROJECT_ID
kind: ConfigMap
metadata:
  annotations:
    meta.helm.sh/release-name: nginx
    meta.helm.sh/release-namespace: ingress
...

可以看到 data 节中的键值对不正是 Nginx 配置项吗。。然后试着在这里加了一个键值对:

  proxy-connect-timeout: 300s

回头再检查 ingress-controller 中渲染的虚拟主机配置,会发现所有虚拟主机都应用上了这个配置,而单独通过 Ingress 注解配置了对应配置项的虚拟主机配置以注解配置为准。

到这里对 EKS 的 nginx-ingress-controller 配置就可以做一下小结了:

  • ingress controller 中的虚拟主机配置默认以 ConfigMap 资源配置为准;
  • 如果单独通过 ingress 注解配置则以注解配置优先生效;

周末终于圆满了。。。

1

评论区