标签: nginx-ingress

Istio和(或与之相对)Nginx入口控制器

我正在测试Istio,目前正在测试路由流量的“ canary”功能。

为了进行测试,我创建了一个由5个微服务(serviceA,serviceB,serviceC,serviceD,serviceE)组成的小型服务网格。每个人都可以呼叫其他人。我只传递了A,E,C,B,B,D之类的路径,并且请求遵循该路径。为了从集群外部调用我的servicemesh,我有一个Nginx Ingress Controller,其Ingress规则指向serviceA pod。

一切正常。

我面临的问题与使用自定义标头匹配的流量切换有关,如下所示:

kind: VirtualService
metadata:
  name: ServiceA
  namespace: demo
  labels:
    app: demo
spec:
  hosts:
  - service-a
  http:
  - route:
    - destination:
        host: service-a
        subset: v1
  - match:
    - headers:
        x-internal-request:
          exact: true
    route:
    - destination:
        host: service-a
        subset: v2
Run Code Online (Sandbox Code Playgroud)

所以在这里,当我将自定义标头x-internal-request设置为true 时,我想尝试将流量路由到ServiceA的v2版本。

问题

  • 为了使用此功能,我的服务是否必须知道x-internal-header,并将它们传递给请求中的下一个服务?还是因为Istio为他们完成工作,他们不需要处理它?

  • 为了使用此功能,我是否需要使用Istio Ingress Controller(带有Istio网关)而不是Nginx Ingress Controller?

今天,我正在使用Nginx Ingress Controller公开一些服务。我们之所以选择Nginx,是因为它具有“外部授权”之类的功能,可以节省很多工作,并且如果我们需要使用Istio Ingress控制器,我不确定它是否提供与Nginx相同的功能。

也许有一条我看不到的中间道路

谢谢您的帮助

istio nginx-ingress

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

将 nginx-ingress 绑定到静态 IP 地址

我想在 AWS EKS 上为多个从外部系统访问的微服务设置入口控制器。

微服务通过虚拟主机名访问,如svc1.acme.com, svc2.acme.com, ...

我用舵图设置了 nginx 入口控制器:https : //github.com/helm/charts/tree/master/stable/nginx-ingress

我的想法是保留一个弹性 IP 地址并通过设置变量 externalIP 将 nginx 控制器绑定到该 IP。

这样我应该能够使用稳定的通配符 DNS 条目访问服务 *.acme.com --> 54.72.43.19

我可以看到入口控制器服务获取了 externalIP,但无法访问该 IP。

NAME                                    TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-ingress-controller        LoadBalancer   10.100.45.119    54.72.43.19   80:32104/TCP,443:31771/TCP   1m
Run Code Online (Sandbox Code Playgroud)

知道为什么吗?

更新:

我使用以下命令安装了入口控制器:

helm install --name ingress -f values.yaml stable/nginx-ingress

这是值的要点,与默认值相比唯一更改的是

externalIPs: ["54.72.43.19"]

https://gist.github.com/christianwoehrle/3b136023b1e0085b028a67ca6a0959b7

amazon-web-services kubernetes amazon-eks nginx-ingress

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

默认后端 - 使用 dns 时从 nginx-controller 返回 404

一点背景是我已经设置了一个 Azure Kubernetes 服务集群并部署了一个基本的 .Net Core api 作为部署对象。然后我部署了一个 nodeport 服务来公开 api,然后部署了一个 nginx-controller 和一个 ingress 对象来配置它。我使用入口控制器的 IP 来路由请求,例如工作。http://1.2.3.4/hello-world-one/api/values。但是当我用生成的 dns 替换 Ip 时,不知何故忽略了路径,我得到了默认后端 - 从 nginx 控制器返回的 404。预期的行为是 dns 将解析,然后路径“api/values”将被发送到我的服务。

谁能帮我这个?提前致谢。

我的部署、服务和入口配置如下。

    apiVersion: apps/v1beta1
    kind: Deployment
    metadata:
      name: test-deployment
      labels:
        app: test
    spec:
      replicas: 1
      selector:
         matchLabels: 
           app: test
      strategy:
        type: RollingUpdate
        rollingUpdate:
           maxUnavailable: 1
           maxSurge: 1 
      template:
        metadata:
          labels: 
            app: test
        spec:
          containers:
          - name: test-service
            image: <my-repo>.azurecr.io/testservice
            imagePullPolicy: Always
            ports:
            - name: tcp
              containerPort: 80
          imagePullSecrets:
          - name: …
Run Code Online (Sandbox Code Playgroud)

kubernetes azure-aks nginx-ingress

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

ASP.Net Core 2.2 Kubernetes Ingress:未找到自定义路径的静态内容

我有以下 ingress.yml:

apiVersion: extensions/v1beta1
kind: Ingress 
metadata:
  name: ingress 
  namespace: default 
  annotations:
    kubernetes.io/ingress.class: "nginx" 
    nginx.ingress.kubernetes.io/ssl-redirect: "false" 
    nginx.ingress.kubernetes.io/rewrite-target: /$2
  labels: 
    app: ingress 
spec:
  rules:  
    - host: 
      http:   
        paths:
          - path: /apistarter(/|$)(.*)
            backend:
              serviceName: svc-aspnetapistarter
              servicePort: 5000
          - path: //apistarter(/|$)(.*)
            backend:
              serviceName: svc-aspnetapistarter
              servicePort: 5000
Run Code Online (Sandbox Code Playgroud)

部署我的 ASP.Net Core 2.2 API 应用程序并导航到 后http://localhost/apistarter/,浏览器调试器控制台显示加载静态内容和 Javascript 的错误。此外,导航到http://localhost/apistarter/swagger/index.html结果

Fetch error Not Found /swagger/v2/swagger.json
Run Code Online (Sandbox Code Playgroud)

我对使用不同路径前缀的多个微服务使用相同的入口。它使用 microk8s 在我的本地 kubernetes 集群上运行。还没有在任何云提供商上。我已经查看了如何配置 ASP.NET Core 多微服务应用程序和 Azure AKS 入口路由,以便它不会破坏 wwwroot 文件夹https://docs.microsoft.com/en-us/aspnet/core 中的资源/host-and-deploy/proxy-load-balancer?view=aspnetcore-2.1 …

c# kubernetes asp.net-core kubernetes-ingress nginx-ingress

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

Kubernetes 入口域重定向

我想在 nginx 入口 kubernete 中重定向域。

https://test.example.io/preview/qLxiVcDGxCaQ134650121853FTg4
Run Code Online (Sandbox Code Playgroud)

如果在 urlpreview中更改域重定向

https://test.app.example.io/preview/qLxiVcDGxCaQ134650121853FTg4
Run Code Online (Sandbox Code Playgroud)

我在尝试什么

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    certmanager.k8s.io/cluster-issuer: staging
    nginx.ingress.kubernetes.io/rewrite-target: /
    kubernetes.io/ingress.class: nginx
  name: staging-ingress
spec:
  rules:
  - host: test.example.io
    http:
      paths:
      - path: /
        backend:
          serviceName: service-1
          servicePort: 80
      - path: /preview/*
        backend:
          url: 
          serviceName: service-2
          servicePort: 80
  tls:
  - hosts:
    - test.example.io
    secretName: staging
Run Code Online (Sandbox Code Playgroud)

对于简单的 nginx 块就像

location ~ /preview
    {
      rewrite /preview https://test.app.example.com$uri permanent;
    }
Run Code Online (Sandbox Code Playgroud)

docker kubernetes kubernetes-ingress nginx-ingress

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

通过 nginx 入口控制器进行基本身份验证

我在 AWS 上使用 nginx 入口控制器(https://kubernetes.github.io/ingress-nginx/deploy/)。后端服务(来自 ECK 的 kibana:https ://www.elastic.co/guide/en/cloud-on-k8s/current/k8s-operator-config.html )使用 HTTP 基本身份验证机制。

有没有办法调整 nginx 以便它向转发到我的服务的每个请求附加 Authorization: Basic 标头,这样用户就不必输入密码?

此解决方案对我不起作用:

nginx.ingress.kubernetes.io/configuration-snippet: |
      more_set_headers "Authorization: Basic encoded_credentals";
Run Code Online (Sandbox Code Playgroud)

因为我仍然被提示输入密码。

nginx kubernetes nginx-ingress

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

helm 双引号注释值

我正在尝试引用我的注释值。我正在尝试这样

annotations:
  {{- range $key, $value := .Values.ingress.annotations }}
     {{ $key }}: {{ printf "%s" $value | quote }}
  {{- end }}
Run Code Online (Sandbox Code Playgroud)

和这个

annotations:
  {{- range $key, $value := .Values.ingress.annotations }}
     {{ $key }}: "{{ $value }}"
  {{- end }}
Run Code Online (Sandbox Code Playgroud)

这是我的 values.yaml

annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/force-ssl-redirect: false
Run Code Online (Sandbox Code Playgroud)

但它不起作用。即使我双引号 values.yaml 中的注释值 helm 也会删除引号。有人可以告诉我如何在注释中使用双引号值来掌舵吗?

我正在使用 Helm 版本 3。

kubernetes kubernetes-helm kubernetes-ingress nginx-ingress

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

(Kubernetes + Docker) Skaffold 不断终止我的部署文件:错误:无法在 2 分钟内稳定:超出上下文截止日期

我正在尝试使用 Skaffold 在我的本地机器上部署一个微服务系统。

ingress-srv.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-service
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/use-regex: 'true'
spec:
  rules:
    - host: ticketing.dot
      http:
        paths:
          - path: /api/users/?(.*)
            backend:
              serviceName: auth-srv
              servicePort: 3000
Run Code Online (Sandbox Code Playgroud)

auth-depl.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: auth-depl
spec:
  replicas: 1
  selector:
    matchLabels:
      app: auth
  template:
    metadata:
      labels:
        app: auth
    spec:
      containers:
        - name: auth
          image: ****MYDOCKERID****/auth
          env:
            - name: JWT_KEY
              valueFrom:
                secretKeyRef:
                  name: jwt-secret
                  key: JWT_KEY

---
apiVersion: v1
kind: Service
metadata:
  name: auth-srv
spec:
  selector:
    app: auth …
Run Code Online (Sandbox Code Playgroud)

docker kubernetes kubernetes-ingress skaffold nginx-ingress

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

如何解决 Google Cloud 上的“所有主机都被其他资源占用”?

我目前有一个在 GCP 上运行的 Kubernetes 集群。在这个集群中,我有一个有效的 NGINX Ingress,但现在我正在尝试使用 cert-manager 为其添加证书。

除了 ACME 挑战之外,一切正常。当我做 a 时,kubectl describe challenge我得到以下信息:

Status:
  Presented:   true
  Processing:  true
  Reason:      Waiting for HTTP-01 challenge propagation: failed to perform self check GET request
Run Code Online (Sandbox Code Playgroud)

当 acme 挑战创建求解器服务时,我在 GCP 上收到以下错误消息:

"All hosts are taken by other resources"
Run Code Online (Sandbox Code Playgroud)

我在谷歌云中遇到的错误图片

我试图创建一个IssuerClusterIssuer,但同样的问题不断出现。

google-cloud-platform kubernetes lets-encrypt cert-manager nginx-ingress

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

nginx.ingress.kubernetes.io/rewrite-target: /$1 在 minikube 注释中究竟是什么意思?

在使用 minikube ingress 时,我必须编写nginx.ingress.kubernetes.io/rewrite-target: /$1. 我一直在努力理解为什么我们需要这个注释以及如何使用它。

我知道医生说以下内容:

在某些情况下,后端服务中暴露的 URL 与 Ingress 规则中指定的路径不同。如果没有重写,任何请求都将返回 404。将注释 nginx.ingress.kubernetes.io/rewrite-target 设置为服务预期的路径。

但我无法准确理解到底the exposed URL in the backend service differs from the specified path in the Ingress rule是什么意思。我无法清楚地理解这个想法。

此外,在尝试使用服务执行入口文件时:

代码1:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  namespace: example-namespace
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  rules:
    - host: myexample.com
      http:
        paths:
          - path: /
            pathType: Prefix 
            backend:
              service:
                name: example-service
                port:
                  number: 80
Run Code Online (Sandbox Code Playgroud)

代码2:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  namespace: example-namespace …
Run Code Online (Sandbox Code Playgroud)

nginx kubernetes minikube nginx-ingress

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