标签: nginx-ingress

ingress nginx - 代理到外部 URL

我搜索(很多天以来......)如何使用 Ingress Nginx 以便使用外部 url 作为后端。

是的,我使用带有 externalName 的服务对象。我还在 nginx 中测试了很多指令但没有成功......

目标很简单:

  • 用户只能解析并加入我的公共 URL(url-public.com 和 url-public-2.com)
  • 我想将请求发送到超出我控制范围和集群的外部后端(url-ext.com)

我的入口可以解析 url-ext.com,但用户不能。当然,url-ext.com 这里有适当的证书,并且公开为 HTTPS ;)。注意:我的入口暴露了 2 个 url,但我认为这并不重要。

我的代码:

服务 :

kind: Service
apiVersion: v1
metadata:
  name: external-eip
  namespace: external-url
spec:
  type: ExternalName
  externalName: url-ext.com
Run Code Online (Sandbox Code Playgroud)

入口:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: external-eip
  namespace: external-url
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
    nginx.ingress.kubernetes.io/upstream-vhost: "url-ext.com"
    nginx.ingress.kubernetes.io/configuration-snippet: |
      #      more_clear_input_headers "Host" "X-Forwarded-Host";
      more_set_input_headers 'Host: url-ext.com';
      proxy_set_header Host url-ext.com;

spec:
  rules:
  - host: url-public.com
    http:
      paths:
      - path: …
Run Code Online (Sandbox Code Playgroud)

nginx kubernetes nginx-ingress

4
推荐指数
1
解决办法
7150
查看次数

NGINX 基于 Header 的入口路由

auth-service我有一个 nginx-ingress在向后端服务发送请求之前调用自定义,使用这个简单的 ConfigMap 和 Ingress:

apiVersion: v1
kind: ConfigMap
metadata:
  ...
data:
  global-auth-url: auth-service-url:8080/authenticate
  global-auth-method: GET
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: "nginx"
  ...
spec:
  rules:
  - host: host1
    http:
      paths:
      - backend:
          serviceName: backend-service
          servicePort: 8080 
Run Code Online (Sandbox Code Playgroud)

现在我需要一些不同的东西。

如何通过不同的流发送所有具有相同“主机”标头的请求,一个具有 auth-service 并连接到,backend-service1另一个没有任何身份验证并连接到backend-service2

明确地说,并使用自定义标头“Example-header:test”

  1. 如果“Example-header”是“test”,请auth-service在发送到 之前通过 my 进行身份验证backend-service,就像现在所做的那样。
  2. 如果未定义“Example-header”,我想将请求发送到不同的后端服务,并且不在auth-service该过程中使用。

我尝试了几件事,即有 2 个 Ingress,一个 ,global-auth-url另一个 ,nginx.ingress.kubernetes.io/enable-global-auth: "false"但始终会调用 auth-service 。

我可以使用 NGINX 来完成此操作,还是必须使用 Istio 或大使?

nginx kubernetes nginx-ingress

4
推荐指数
1
解决办法
6956
查看次数

在注释中使用 ingressClassName 而不是 kubernetes.io/ingress.class 时,ingress-nginx 不起作用

我使用 Kubespray 部署了一个裸机集群,并启用了 kubernetes 1.22.2、MetalLB 和 ingress-nginx。404 Not found当设置时尝试访问通过 helm 部署的任何服务时,我得到了ingressClassName: nginx。但是,如果我不使用ingressClassName: nginx而是kubernetes.io/ingress.class: nginx在 helm 图表中使用,一切都会正常工作。yaml。我怎样才能让它工作ingressClassName

这些是我的 kubespray 设置inventory/mycluster/group_vars/k8s_cluster/addons.yml

# Nginx ingress controller deployment
ingress_nginx_enabled: true
ingress_nginx_host_network: false
ingress_publish_status_address: ""
ingress_nginx_nodeselector:
  kubernetes.io/os: "linux"
ingress_nginx_tolerations:
  - key: "node-role.kubernetes.io/master"
    operator: "Equal"
    value: ""
    effect: "NoSchedule"
  - key: "node-role.kubernetes.io/control-plane"
    operator: "Equal"
    value: ""
    effect: "NoSchedule"
ingress_nginx_namespace: "ingress-nginx"
ingress_nginx_insecure_port: 80
ingress_nginx_secure_port: 443
ingress_nginx_configmap:
  map-hash-bucket-size: "128"
  ssl-protocols: "TLSv1.2 TLSv1.3"
ingress_nginx_configmap_tcp_services:
  9000: "default/example-go:8080"
ingress_nginx_configmap_udp_services:
  53: …
Run Code Online (Sandbox Code Playgroud)

kubernetes kubernetes-helm nginx-ingress

4
推荐指数
1
解决办法
5806
查看次数

Nginx 控制器返回 404 Not Found On Path 和默认后端

我使用 Vagrant 创建了一个 kubernetes 集群。我为其创建了一个 Nginx Pod 和一个集群 IP 服务。我可以卷曲 Pod 和服务,获得成功的结果。我现在已经从以下位置安装了 Nginx 入口控制器:https: //kubernetes.github.io/ingress-nginx/deploy/#bare-metal-clusters并运行以下命令: kubectl create ingress nginxingress --rule="/nginx=nginx-service:80" --annotation nginx.ingress.kubernetes.io/rewrite-target=/ --default-backend=nginx-service:80据我所知,它们都已正确设置因为没有错误。但每当我尝试卷曲路径时,它就会失败,控制器不断抛出 404 未找到。更多可能有帮助的信息:
服务
在此输入图像描述 入口
在此输入图像描述
任何帮助将不胜感激

kubernetes google-kubernetes-engine kubernetes-ingress nginx-ingress

4
推荐指数
1
解决办法
7057
查看次数

Helm3 模板错误调用包括: template: no template "microservice.labels" Associated with template "gotpl"

我使用命令创建了 helm 3 模板helm create microservice。它有以下文件。

/Chart.yaml
./values.yaml
./.helmignore
./templates/ingress.yaml
./templates/deployment.yaml
./templates/service.yaml
./templates/serviceaccount.yaml
./templates/hpa.yaml
./templates/NOTES.txt
./templates/_helpers.tpl
./templates/tests/test-connection.yaml
Run Code Online (Sandbox Code Playgroud)

根据我的应用程序更新了值文件,当我尝试安装 helm chat 时,它给出以下错误消息。

Error: UPGRADE FAILED: template: microservice/templates/ingress.yaml:20:8: executing "microservice/templates/ingress.yaml" at <include "microservice.labels" .>: error calling include: template: no template "microservice.labels" associated with template "gotpl"
helm.go:75: [debug] template: microservice/templates/ingress.yaml:20:8: executing "microservice/templates/ingress.yaml" at <include "microservice.labels" .>: error calling include: template: no template "microservice.labels" associated with template "gotpl"
Run Code Online (Sandbox Code Playgroud)

这是ingress.yaml文件。

{{- if .Values.ingress.enabled -}}
{{- $fullName := include "microservice.fullname" . -}} …
Run Code Online (Sandbox Code Playgroud)

kubernetes kubernetes-helm kubernetes-ingress nginx-ingress helm3

4
推荐指数
1
解决办法
2万
查看次数

Kubernetes 集群内的流量如何流动?

(在学习 Kubernetes 时,我从未真正找到任何解释这一点的好资源)

场景:
我拥有 mywebsite1.com 和 mywebsite2.com,我想将它们都托管在 Kubernetes 集群中。

我根据以下网站使用 2
kubectl apply -f < url > 命令部署了一个通用的云入口控制器。(mandatory.yaml 和通用 ingress.yaml)
https://kubernetes.github.io/ingress-nginx/deploy/

所以问题是这种架构是什么样的?以及数据如何流入集群?

kubernetes kubernetes-ingress nginx-ingress

3
推荐指数
1
解决办法
1344
查看次数

如何使用Nginx Ingress正确设置自定义标头?

我有以下配置:

守护进程:

apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  name: nginx-ingress
  namespace: nginx-ingress
spec:
  selector:
    matchLabels:
      app: nginx-ingress
  template:
    metadata:
      labels:
        app: nginx-ingress
    spec:
      serviceAccountName: nginx-ingress
      containers:
      - image: nginx/nginx-ingress:1.4.2-alpine
        imagePullPolicy: Always
        name: nginx-ingress
        ports:
        - name: http
          containerPort: 80
          hostPort: 80
        - name: https
          containerPort: 443
          hostPort: 443
        env:
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        args:
          - -nginx-configmaps=$(POD_NAMESPACE)/nginx-config
          - -default-server-tls-secret=$(POD_NAMESPACE)/default-server-secret 
Run Code Online (Sandbox Code Playgroud)

主要配置:

apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-config
  namespace: nginx-ingress
data:
  proxy-set-headers: "nginx-ingress/custom-headers" …
Run Code Online (Sandbox Code Playgroud)

kubernetes nginx-ingress

3
推荐指数
4
解决办法
5240
查看次数

拒绝访问 kubernetes 集群外的路由

我正在使用带有一些私有路由的大型单体应用程序。这些私有路由目前由一个普通的经典 nginx 服务器管理。

我需要将其迁移到 Kubernetes,并且必须拒绝对这些路由的所有外部访问。我正在使用 GKE 和 AFAIK,私有化路由可以在 nginx-ingress 控制器内完成。

我正在尝试使用服务器代码段,但它似乎不起作用。这是当前的代码:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
    kubernetes.io/tls-acme: "true"
    nginx.org/websocket-services: service-ws
    nginx.org/server-snippet: |
      location /private {
        allow 10.100.0.0/16; #Pods IPs
        allow 10.200.0.0/16; #Pods IPs
        deny all; 
      }
  generation: 3
Run Code Online (Sandbox Code Playgroud)

结果是 /private 路由总是返回 200 而不是 401/403。我还尝试创建重定向而不是允许/拒绝,并获得 200 而不是 301 重定向。

您是否有一些想法或技巧可以使这项工作发挥作用?

kubernetes google-kubernetes-engine nginx-ingress

3
推荐指数
1
解决办法
1192
查看次数

如何将x-forward-for字段添加到我的Nginx入口控制器的访问日志中?

我在gke上使用了nginx入口控制器,默认情况下,这些是我的访问日志:

"10.123.0.20 - [10.123.0.20] - - [22/Apr/2019:18:47:59 +0000] "GET /sdflksdf/sdfsdf HTTP/2.0" 404 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/538.12 (KHTML, like Gecko) Chrome/73.0.3683.100 Safari/537.36" 26 0.002 [default-blah-80] 10.44.0.26:80 0 0.001 404 skjf0s93jf0ws93jfsijf3s3fjs3i
Run Code Online (Sandbox Code Playgroud)

我想在访问日志中添加x-forward-for标头。如果可能的话,Id希望将该字段添加到当前日志行的末尾。或者在日志行的开头也可以,我猜

我正在看他们的文档,但我不清楚如何将x-forwarded-for添加到访问日志:https : //kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/log-format/

nginx kubernetes google-kubernetes-engine nginx-ingress

3
推荐指数
1
解决办法
282
查看次数

如果 https 流量,我如何将入口转发到 ssl 端口(443)

入口如何将 https 流量转发到服务的端口 443(最终转发到我容器上的 8443)?我是否必须对我的入口进行任何更改,还是自动完成。

在 GCP 上,我有一个第 4 层平衡器 -> nginx-ingress 控制器 -> 入口

我的入口是:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-keycloak
  annotations:
    kubernetes.io/ingress.class: "nginx"
    certmanager.k8s.io/issuer: "letsencrypt-prod"
    certmanager.k8s.io/acme-challenge-type: http01


spec:
  tls:
  - hosts:
    - mysite.com
    secretName: staging-iam-tls
  rules:
  - host: mysite.com
    http:
      paths:
      - path: /auth
        backend:
          serviceName: keycloak-http
          servicePort: 80
Run Code Online (Sandbox Code Playgroud)

我在网上搜索,但我没有看到达到 443 的明确例子。它总是 80(或 8080)

我的服务keycloak-http是(省略,我的容器实际上在 8443 监听)

apiVersion: v1
kind: Service
metadata:
  creationTimestamp: 2019-05-15T12:45:58Z
  labels:
    app: keycloak
    chart: keycloak-4.12.0
    heritage: Tiller
    release: keycloak
  name: keycloak-http …
Run Code Online (Sandbox Code Playgroud)

kubernetes kubernetes-ingress nginx-ingress

3
推荐指数
1
解决办法
4533
查看次数