使Nginx-ingress在Azure中使用UDP [英] Getting nginx-ingress to use UDP in Azure
问题描述
当前此设置适用于TCP,但一旦切换到UDP,我会收到错误消息
Currently this setup worked for TCP but once switched to UDP I get the error
The Service "nginx-ingress-controller" is invalid: spec.ports: Invalid value:
[]core.ServicePort{core.ServicePort{Name:"proxied-udp-30001", Protocol:"UDP",
Port:30001, TargetPort:intstr.IntOrString{Type:0, IntVal:30001, StrVal:""},
NodePort:0}, core.ServicePort{Name:"proxied-udp-30002", Protocol:"UDP",
Port:30002, TargetPort:intstr.IntOrString{Type:0, IntVal:30002, StrVal:""},
NodePort:0}, core.ServicePort{Name:"http", Protocol:"TCP", Port:80,
TargetPort:intstr.IntOrString{Type:1, IntVal:0, StrVal:"http"}, NodePort:32724},
core.ServicePort{Name:"https", Protocol:"TCP", Port:443,
TargetPort:intstr.IntOrString{Type:1, IntVal:0, StrVal:"https"},
NodePort:30127}}: cannot create an external load balancer with mix protocols
在我尝试应用补丁之后
kubectl patch deployment nginx-ingress-controller -n ingress-nginx --patch $(Get-Content .\k8s\prod-azure-multi-pod-node\nginx-ingress-controller-deploy-patch.yaml -Raw)
kubectl patch svc nginx-ingress-controller -n ingress-nginx --patch $(Get-Content .\k8s\prod-azure-multi-pod-node\nginx-ingress-controller-svc-patch.yaml -Raw)
这些文件分别在哪里
nginx-ingress-controller-svc-patch.yaml
nginx-ingress-controller-svc-patch.yaml
apiVersion: v1
kind: Service
metadata:
annotations:
meta.helm.sh/release-name: nginx-ingress
meta.helm.sh/release-namespace: ingress-nginx
name: nginx-ingress-controller
namespace: ingress-nginx
selfLink: /api/v1/namespaces/ingress-nginx/services/nginx-ingress-controller
spec:
ports:
- name: proxied-udp-30001
port: 30001
targetPort: 30001
protocol: UDP
- name: proxied-udp-30002
port: 30002
targetPort: 30002
protocol: UDP
和nginx-ingress-controller-deploy-patch.yaml
And nginx-ingress-controller-deploy-patch.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx-ingress-controller
namespace: ingress-nginx
selfLink: /apis/extensions/v1beta1/namespaces/ingress-nginx/deployments/nginx-ingress-controller
spec:
template:
spec:
hostNetwork: true # Edit added via tutorial https://skryvets.com/blog/2019/04/09/exposing-tcp-and-udp-services-via-ingress-on-minikube/
containers:
- args:
- /nginx-ingress-controller
- --default-backend-service=ingress-nginx/nginx-ingress-default-backend
- --election-id=ingress-controller-leader
- --ingress-class=nginx
- --udp-services-configmap=default/udp-services # Needed for udp config map usage
- --configmap=ingress-nginx/nginx-ingress-controller
name: nginx-ingress-controller
服务看起来像这样
apiVersion: v1
kind: Service
metadata:
name: game-svc-1
namespace: default
spec:
selector:
instance: game-1
# type: NodePort
type: ClusterIP
ports:
- protocol: UDP
port: 9001 # exposed port
targetPort: 19132
还有Udp配置文件
apiVersion: v1
kind: ConfigMap
metadata:
name: udp-services
namespace: default
data:
30001: "default/game-svc-1:9001"
30002: "default/game-svc-2:9002"
就像我说的那样,当使用tcp时,它可以很好地工作,但是一旦我切换到UDP,就会弹出错误消息,我是否缺少UDP步骤?
Like I said this works perfectly fine when using tcp but once I switched to UDP that error pops up, is there a UDP step I am missing?
编辑>按照Microsoft的说明添加helm命令以使用此命令
EDIT > add helm command as stated by microsoft to use this command
helm install nginx-ingress stable/nginx-ingress --namespace ingress-nginx --set controller.replicaCount=2 --set controller.nodeSelector."beta\.kubernetes\.io/os"=linux --set defaultBackend.nodeSelector."beta\.kubernetes\.io/os"=linux --set controller.service.httpPort.enable=false --set controller.service.httpsPort.enable=false
推荐答案
基于以下错误:
The Service "nginx-ingress-controller" is invalid: spec.ports: Invalid value:
[]core.ServicePort
{core.ServicePort{Name:"proxied-udp-30001", Protocol:"UDP", Port:30001, TargetPort:intstr.IntOrString {Type:0, IntVal:30001, StrVal:""}, NodePort:0},
core.ServicePort{Name:"proxied-udp-30002", Protocol:"UDP",
Port:30002, TargetPort:intstr.IntOrString{Type:0, IntVal:30002, StrVal:""},
NodePort:0},
core.ServicePort{Name:"http", Protocol:"TCP", Port:80,
TargetPort:intstr.IntOrString{Type:1, IntVal:0, StrVal:"http"}, NodePort:32724},
core.ServicePort{Name:"https", Protocol:"TCP", Port:443,
TargetPort:intstr.IntOrString{Type:1, IntVal:0, StrVal:"https"},
NodePort:30127}}:
错误确切地告诉您您正在尝试使用端口类型中的混合匹配来更新服务.
The Error tell you exactly that you are trying to update the service with a mix match in PORT type.
cannot create an external load balancer with mix protocols
这是因为PATCH命令将通过添加的配置来扩展现有服务.(在您的情况下为2个新的公开UDP端口)位于现有配置(2个TCP端口)之上
This is because the PATCH command will augment the existing service with the added configuration.(in your case 2 new exposed UDP port) on top of the existing configuration (2 TCP port)
从TCP转换为UDP的最佳方法是重用名称端口名称(http
和https
),这将允许PATCH命令将字典条目合并在一起,替换TCP并倒入80/443与您的UDP端口设置.
The best way to convert from TCP to UDP would be to reuse the name port names (http
and https
) this will allow the PATCH command to merge the dictionary entries together, replacing the TCP and pour 80/443 with your UDP port settings.
如果您实际上正在考虑同时支持UDP/TCP和UDP,则需要将ServiceType更改为ClusterIP
,因为LoadBalancer
类型不支持单个公共IP的协议不匹配(Azure LoadBalancer FrontEnd IP)
If you are actually looking at supporting both UDP/TCP, you will need to change the ServiceType to ClusterIP
since the LoadBalancer
type doesn't support having a mismatch of protocol for a single Public IP (Azure LoadBalancer FrontEnd IP)
这篇关于使Nginx-ingress在Azure中使用UDP的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!