【问题标题】:Dynamic proxy_pass in nginx to another pod in Kubernetesnginx 中的动态 proxy_pass 到 Kubernetes 中的另一个 pod
【发布时间】:2016-09-28 03:54:04
【问题描述】:

我正在尝试创建一个 nginx 代理,将请求转发到 /<service>http://<service>。我首先尝试了以下方法:

location ~ ^/(.+)$ {
    set $backend "http://$1:80";
    proxy_pass $backend;
}

但它无法说出类似(调用/myservice时):

[error] 7741#0: *1 no resolver defined to resolve http://myservice

由于myservice 无法从外部访问,我尝试将go-dnsmasq 作为sidecar 安装在同一个pod 中,并尝试将其用于DNS 解析(就像我在this 示例中看到的那样)并更改我的 nginx 配置如下所示:

location ~ ^/(.+)$ {
        resolver 127.0.0.1:53;
        set $backend "http://$1:80";
        proxy_pass $backend;
}

但是现在 nginx 失败了:

[error] 9#9: *734 myservice could not be resolved (2: Server failure), client: 127.0.0.1, server: nginx-proxy, request: "GET /myservice HTTP/1.1", host: "localhost:8080"
127.0.0.1 - xxx [30/May/2016:10:34:23 +0000] "GET /myservice HTTP/1.1" 502 173 "-" "curl/7.38.0" "-"

我的 Kubernetes pod 如下所示:

spec:
  containers:
    - name: nginx
      image: "nginx:1.10.0"
      ports:
        - containerPort: 8080
          name: "external"
          protocol: "TCP"
    - name: dnsmasq
      image: "janeczku/go-dnsmasq:release-1.0.5"
      args:
        - --listen
        - "0.0.0.0:53"

在 dnsmasq 容器中运行 netstat -ntlp 给了我:

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      -
tcp        0      0 :::53                   :::*                    LISTEN      1/go-dnsmasq

并在 nginx 容器中运行nmap --min-parallelism 100 -sT -sU localhost

Starting Nmap 6.47 ( http://nmap.org ) at 2016-05-30 10:33 UTC
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00055s latency).
Other addresses for localhost (not scanned): 127.0.0.1
Not shown: 1997 closed ports
PORT     STATE SERVICE
53/tcp   open  domain
8080/tcp open  http-proxy
53/udp   open  domain

看来 dnsmasq 和 nginx 确实启动并运行了?我可能做错了什么?

【问题讨论】:

    标签: nginx dns kubernetes dnsmasq


    【解决方案1】:

    经过大量研究和反复试验,我设法解决了这个问题。首先,我将 pod 规范更改为:

    spec:
      containers:
        - name: nginx
          image: "nginx:1.10.0"
          ports:
            - containerPort: 8080
              name: "external"
              protocol: "TCP"
        - name: dnsmasq
          image: "janeczku/go-dnsmasq:release-1.0.5"
          args:
            - --listen
            - "127.0.0.1:53"
            - --default-resolver
            - --append-search-domains
            - --hostsfile=/etc/hosts
            - --verbose
    

    然后我还必须为 nginx 中的解析器禁用 ipv6:

    location ~ ^/(.+)$ {
            resolver 127.0.0.1:53 ipv6=off;
            set $backend "http://$1:80";
            proxy_pass $backend;
    }
    

    然后它按预期工作!

    【讨论】:

    • 这很棒。谢谢你。不知道为什么 kube-dns 作为解析器不起作用。
    • 你简直救了我的命。不知道如何将另一个容器作为我的部署的边车运行。谢谢!
    【解决方案2】:

    我通过 coredns docker 解决了这个问题: 我的 nginx 和 coredns 都部署在主机上

    第一步:配置核心文件 在 Corefile 中也许你应该更改 k8s 主配置参考:https://coredns.io/plugins/kubernetes/

    sudo mkdir /etc/coredns; sudo tee /etc/coredns/Corefile   <<-'EOF' .:53 {
        log
        errors
        health
        kubernetes cluster.local in-addr.arpa ip6.arpa {
           endpoint http://172.31.88.71:8080
           pods insecure
           upstream
           fallthrough in-addr.arpa ip6.arpa
           ttl 30
        }
        forward . /etc/resolv.conf
        cache 30
        loop
        reload
        loadbalance } EOF
    

    step2:config docker然后启动它

    tee coreos.sh   <<-'EOF'
     docker run --restart=always  -idt --name coredns \
     -v /etc/coredns/Corefile:/etc/coredns/Corefile \
     -v /home/ec2-user/.kube/config:/etc/coredns/kubeconfig \
     -p 53:53/udp \
     coredns/coredns:1.6.9 \
     -conf /etc/coredns/Corefile
    EOF
    

    第三步:配置 nginx 然后重新加载

    resolver 127.0.0.1 valid=60s ipv6=off;
    

    【讨论】:

      猜你喜欢
      • 2019-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-22
      • 2022-01-22
      • 2017-09-06
      相关资源
      最近更新 更多