使Nginx-ingress在Azure中使用UDP [英] Getting nginx-ingress to use UDP in Azure

查看:117
本文介绍了使Nginx-ingress在Azure中使用UDP的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当前此设置适用于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的最佳方法是重用名称端口名称(httphttps),这将允许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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆