我正在测试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相同的功能。
也许有一条我看不到的中间道路
谢谢您的帮助
我想在 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
一点背景是我已经设置了一个 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) 我有以下 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 …
我想在 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) 我在 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)
因为我仍然被提示输入密码。
我正在尝试引用我的注释值。我正在尝试这样
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。
我正在尝试使用 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) 我目前有一个在 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)
我试图创建一个Issuer和ClusterIssuer,但同样的问题不断出现。
google-cloud-platform kubernetes lets-encrypt cert-manager nginx-ingress
在使用 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-ingress ×10
kubernetes ×9
docker ×2
nginx ×2
amazon-eks ×1
asp.net-core ×1
azure-aks ×1
c# ×1
cert-manager ×1
istio ×1
lets-encrypt ×1
minikube ×1
skaffold ×1