我v1.22.1在裸机 CentOS 中设置了一个 Kubernetes 集群。我在按照此链接设置 Nginx Ingress 控制器时遇到问题。
我按照步骤 1-3 进行了完全相同的操作,但CrashLoopBackOff在 nginx 入口控制器 pod 中出现错误。我检查了 pod 的日志,发现如下:
[root@dev1 deployments]# kubectl logs -n nginx-ingress nginx-ingress-5cd5c7549d-hw6l7
I0910 23:15:20.729196 1 main.go:271] Starting NGINX Ingress controller Version=1.12.1 GitCommit=6f72db6030daa9afd567fd7faf9d5fffac9c7c8f Date=2021-09-08T13:39:53Z PlusFlag=false
W0910 23:15:20.770569 1 main.go:310] The '-use-ingress-class-only' flag will be deprecated and has no effect on versions of kubernetes >= 1.18.0. Processing ONLY resources that have the 'ingressClassName' field in Ingress equal to the class.
F0910 23:15:20.774788 1 main.go:314] …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用入口进行 TCP/UDP 端口转发。
按照文档:https://kubernetes.github.io/ingress-nginx/user-guide/exusing-tcp-udp-services/
它说设置:--tcp-services-configmap但没有告诉你在哪里设置它。我认为它是命令行参数。然后我用谷歌搜索了 nginx-ingress 的命令行参数列表
https://kubernetes.github.io/ingress-nginx/user-guide/cli-arguments/
在这里你可以清楚地看到它的控制器的参数:
--tcp-services-configmap 包含要公开的 TCP 服务定义的 ConfigMap 的名称。图中的键表示要使用的外部端口。该值是对服务的引用,格式为“namespace/name:port”,其中“port”可以是端口号或名称。TCP 端口 80 和 443 被控制器保留用于服务 HTTP 流量。
第一个问题:如何动态添加到 nginx-ingress helm 图表的容器参数中,我在任何地方都没有看到该记录?
第二个问题:使用当前版本的 nginx-ingress 设置此值的正确方法是什么,因为设置命令行参数会使容器启动失败,因为二进制文件没有该参数选项。
在默认的 Helm Chart Values.yaml 中,有一些关于为 tcp-services 设置 configmap 的命名空间的选项,但考虑到文档说我必须将其设置为参数,但该参数启动失败,我不知道你如何实际上设置了这个。
https://github.com/kubernetes/ingress-nginx/blob/main/charts/ingress-nginx/values.yaml
我手动编辑了部署并在容器参数上设置了标志:
- args:
- -nginx-plus=false
- -nginx-reload-timeout=60000
- -enable-app-protect=false
- -nginx-configmaps=$(POD_NAMESPACE)/emoney-nginx-controller-nginx-ingress
- -default-server-tls-secret=$(POD_NAMESPACE)/emoney-nginx-controller-nginx-ingress-default-server-tls
- -ingress-class=emoney-ingress
- -health-status=false
- -health-status-uri=/nginx-health
- -tcp-services-configmap=emoney-node/tcp-services-configmap
- -nginx-debug=false
- -v=1
- -nginx-status=true
- -nginx-status-port=8080
- -nginx-status-allow-cidrs=127.0.0.1
- -report-ingress-status
- -external-service=emoney-nginx-controller-nginx-ingress
- …Run Code Online (Sandbox Code Playgroud) 我已经使用基于路径的路由配置了 nginx-ingress 控制器。下面是我的 ingress.yaml 文件。
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: voting-app-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
kubernetes.io/ingress.class: nginx
spec:
rules:
- host: voteapp.com
http:
paths:
- backend:
serviceName: vote
servicePort: vote-http
path: /vote(/|$)(.*)
- backend:
serviceName: result
servicePort: result-http
path: /result(/|$)(.*)
Run Code Online (Sandbox Code Playgroud)
我可以成功访问该应用程序,但是当我单击应用程序中的任何内容时,它会路由到 404 页面未找到。 http://voteapp.com/vote/ http://voteapp.com/result/
kubectl get ing
NAME CLASS HOSTS ADDRESS PORTS AGE
voting-app-ingress <none> voteapp.com 192.168.99.100 80 40s
Run Code Online (Sandbox Code Playgroud)
但当我使用基于主机的路由时,同样的事情工作得很好。
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: voting-app-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
kubernetes.io/ingress.class: nginx
spec:
rules:
- host: voteapp.com
http:
paths: …Run Code Online (Sandbox Code Playgroud) 我正在使用静态 ip 创建 nlb 类型的 nginx 入口控制器,但对于静态 ip,我收到此错误AllocationIdNotFound。虽然这个分配id是有效的,并且具有这个id的eip存在于同一区域中。以下是我在 nginx 入口控制器服务中使用的注释
annotations:
service.beta.kubernetes.io/aws-load-balancer-backend-protocol: tcp
service.beta.kubernetes.io/aws-load-balancer-cross-zone-load-balancing-enabled: 'true'
service.beta.kubernetes.io/aws-load-balancer-type: nlb
service.beta.kubernetes.io/aws-load-balancer-subnets: "subnet-xxxxxxxxxx, subnet-xxxxxxxxxx"
service.beta.kubernetes.io/aws-load-balancer-eip-allocations: "eipalloc-xxxxxxxxxx, eipalloc-xxxxxxxxxx"
Run Code Online (Sandbox Code Playgroud)
如果我注释service.beta.kubernetes.io/aws-load-balancer-eip-allocations注释,负载均衡器将成功创建,但没有 eip。
我在这里做错了什么?
nlb amazon-web-services kubernetes-ingress amazon-eks nginx-ingress
我开始知道 Nginx Ingress 直接与 pod 对话,而不是通过服务。
NGINX 入口控制器不使用服务将流量路由到 Pod。相反,它使用 Endpoints API 来绕过 kube-proxy,以允许 NGINX 功能,例如会话亲和性和自定义负载平衡算法。
这是特定于此类入口的还是该想法适用于所有入口?
我对 K8s 还很陌生。
我正在努力让我的应用程序对外界可见。我已经在我的应用程序中部署了这个Nginx Ingress Controller,使用 Helm 和helmfile,它为我提供了外部 IP 地址和负载均衡器。
据我了解,我现在需要ingress resource配置路由映射。
我计划使用这个入口资源作为起点。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: minimal-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx-example
rules:
- http:
paths:
- path: /testpath
pathType: Prefix
backend:
service:
name: test
port:
number: 80
Run Code Online (Sandbox Code Playgroud)
我的应用程序部署在端口 80 上的单独命名空间中。
我的问题是:我应该将用于创建资源的 yaml 放在哪里?
如果可能的话,我希望将所有内容保留在 Helm 中,以便更轻松地管理配置,因此kubectl除非必须,否则我不想使用。
repositories:
- name: stable
url: https://charts.helm.sh/stable
- name: nginx-stable
url: https://helm.nginx.com/stable
releases:
# other apps configured here
- name: ingress-nginx …Run Code Online (Sandbox Code Playgroud) kubernetes kubernetes-helm kubernetes-ingress nginx-ingress ingress-controller
我有一个用于 ActiveMQ-Artemis 的 k8 部署(使用 minikube)。在此,我公开了代理(61616)和控制台(8161)的端口。将端口指向服务。它运行良好。我还为控制台配置了入口控制器。
服务.yaml
kind: Service
metadata:
name: artemis-service
spec:
type: ClusterIP
ports:
- port: 8161
name: http-console
protocol: TCP
targetPort: 8161
- port: 61616
name: netty-connector
protocol: TCP
targetPort: 61616
selector:
app: artemis
Run Code Online (Sandbox Code Playgroud)
Ingress.yaml
kind: Ingress
metadata:
name: broker-ingress
labels:
name: broker-ingress
spec:
ingressClassName: nginx
rules:
- host: artemis.broker.com
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: artemis-service
port:
number: 8161
Run Code Online (Sandbox Code Playgroud)
当我点击时,我可以访问 activemq 控制台,http://artemis.broker.com
现在我想使用 NGINX 控制器公开 TCP 端口 (61616),通过它我可以使用 TCP URL 将消息发布/消费到 …
我在 Kubernetes 集群中遇到了oauth2 代理和 Ingress Nginx(最新版本)的问题,其中X-Auth-Request标头在标准 oauth 身份验证流程中未传递到客户端。我专门使用 Azure 作为身份验证提供程序。
这是我的 oauth 代理配置的相关部分:
pass_access_token = true
pass_authorization_header = true
pass_user_headers = true
set_xauthrequest = true
Run Code Online (Sandbox Code Playgroud)
当我显式调用 时/oauth2/auth,我会按预期获得标头。但是,在标准 OAuth2 身份验证流程中,任何请求都不会返回任何标头。
这种情况有点类似于这里的另一个问题:Oauth2-Proxy do not pass X-Auth-Request-Groups header,但就我而言,我没有收到任何X-Auth-Request标头,除非我/oauth2/auth直接调用。
我还尝试将以下代码片段添加到我的应用程序 Ingress 配置中,但没有成功:
nginx.ingress.kubernetes.io/configuration-snippet: |
auth_request_set $email $upstream_http_x_auth_request_email;
access_by_lua_block {
if ngx.var.email ~= "" then
ngx.req.set_header("X-Auth-Request-Email", ngx.var.email)
end
}
Run Code Online (Sandbox Code Playgroud)
我已经完成了多种配置,阅读了大量博客文章,并搜索了 GitHub 问题,但一直无法解决这个问题。有谁对可能导致这种行为的原因有任何见解吗?
我正在构建一个用户可以构建Web应用程序的服务 - 这些应用程序将以虚拟DNS名称*.laska.io托管
例如,如果Tom和Jerry都构建了一个应用程序,那么它们将在以下位置托管:
tom.laska.io
jerry.laska.io
Run Code Online (Sandbox Code Playgroud)
现在,假设我有1000个用户.我应该创建一个看起来像这样的大入口吗?
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: nginx-ingress
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
rules:
- host: tom.laska.io
http:
paths:
- backend:
serviceName: nginx-service
servicePort: 80
- host: jerry.laska.io
http:
paths:
- backend:
serviceName: nginx-service
servicePort: 80
...and so forth
Run Code Online (Sandbox Code Playgroud)
我担心停机时间 - 如果我有一个带有websockets的应用程序.此外,1000个用户的文件也将变得庞大.将重新加载入口的速度是否足够快?另外,我该如何重装?
我想到的第二个选择就是为每个Web应用创建一个入口.我担心的是,ingress-nginx可以处理很多进入吗?或者这是反模式?
哪一个更好?
kubernetes google-kubernetes-engine kubernetes-ingress nginx-ingress
我在让Nginx入口控制器在Kubernetes集群中工作时遇到了一些麻烦。根据https://kubernetes.github.io/ingress-nginx/deploy/,我已经创建了nginx-ingress部署,服务,角色等。
我还部署了一个hello-world监听端口的简单应用8080
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: hello-world
namespace: default
spec:
selector:
matchLabels:
name: hello-world
template:
metadata:
labels:
name: hello-world
spec:
containers:
- name: hello-world
image: myrepo/hello-world
resources:
requests:
memory: 200Mi
cpu: 150m
limits:
cpu: 300m
ports:
- name: http
containerPort: 8080
protocol: TCP
Run Code Online (Sandbox Code Playgroud)
并为其创建了服务
kind: Service
apiVersion: v1
metadata:
namespace: default
name: hello-world
spec:
selector:
app: hello-world
ports:
- name: server
port: 8080
Run Code Online (Sandbox Code Playgroud)
最后,我创建了一个TLS密码(my-tls-secret),并按照说明部署了nginx入口。例如:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: …Run Code Online (Sandbox Code Playgroud)