负载平衡器获取随机端口时的Kubernetes nginx入口控制器

负载平衡器获取随机端口时的Kubernetes nginx入口控制器,nginx,kubernetes,metallb,Nginx,Kubernetes,Metallb,我试图通过单个主裸机集群上的入口公开kubernetes仪表板。问题是我正在使用的LoadBalancer nginx ingress controller服务没有打开我希望它打开/使用的80/443端口。相反,它会从30-32k范围内获取一些随机端口。我知道我可以使用-service节点端口范围设置此范围,但我很确定一年前我不必在另一台服务器上这样做。我是不是遗漏了什么 目前这是我对Ubuntu 16.04的堆栈/安装清理安装: 通过头盔安装的Nginx入口控制器 金属 库伯内特斯仪表盘 Ku

我试图通过单个主裸机集群上的入口公开kubernetes仪表板。问题是我正在使用的LoadBalancer nginx ingress controller服务没有打开我希望它打开/使用的80/443端口。相反,它会从30-32k范围内获取一些随机端口。我知道我可以使用-service节点端口范围设置此范围,但我很确定一年前我不必在另一台服务器上这样做。我是不是遗漏了什么

目前这是我对Ubuntu 16.04的堆栈/安装清理安装:

通过头盔安装的Nginx入口控制器 金属 库伯内特斯仪表盘 Kubernetes仪表板入口,以便在 通过helm安装Cert Manager k8s-dashboard-ingress.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    # add an annotation indicating the issuer to use.
    cert-manager.io/cluster-issuer: letsencrypt-staging
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
    nginx.ingress.kubernetes.io/secure-backends: "true"
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
  name: kubernetes-dashboard-ingress
  namespace: kubernetes-dashboard
spec:
  rules:
  - host: <domain>
    http:
      paths:
      - backend:
          serviceName: kubernetes-dashboard
          servicePort: 443
        path: /
  tls:
  - hosts:
    - <domain>
    secretName: kubernetes-dashboard-staging-cert
下面是一些正在发生的事情的更多示例:

curl-D-http://:31122-H“主机:”

返回308,因为协议是http而不是https。这是意料之中的 curl-D-http://-H'主机:'

curl:7无法连接到端口80:连接被拒绝 端口80关闭 curl-D——不安全https://10.65.106.240 -H主持人:

通过内部IP访问仪表板显然是可行的,我得到了正确的k8s仪表板html。 -不安全是由于let's encrypt尚未工作,因为无法访问端口80上的acme质询。 简单地说,我如何得到2。工作例如,通过80/443到达服务

编辑:Nginx入口控制器.yaml

apiVersion: v1
kind: Service
metadata:
  creationTimestamp: "2020-02-12T20:20:45Z"
  labels:
    app: nginx-ingress
    chart: nginx-ingress-1.30.1
    component: controller
    heritage: Helm
    release: nginx-ingress
  name: nginx-ingress-controller
  namespace: ingress-nginx
  resourceVersion: "1785264"
  selfLink: /api/v1/namespaces/ingress-nginx/services/nginx-ingress-controller
  uid: b3ce0ff2-ad3e-46f7-bb02-4dc45c1e3a62
spec:
  clusterIP: 10.100.64.210
  externalTrafficPolicy: Cluster
  ports:
  - name: http
    nodePort: 31122
    port: 80
    protocol: TCP
    targetPort: http
  - name: https
    nodePort: 32697
    port: 443
    protocol: TCP
    targetPort: https
  selector:
    app: nginx-ingress
    component: controller
    release: nginx-ingress
  sessionAffinity: None
  type: LoadBalancer
status:
  loadBalancer:
    ingress:
    - ip: 10.65.106.240
编辑2:metallb配置映射yaml

kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      -  10.65.106.240-10.65.106.250
更新:

当我写这个答案时,我没有看到问题的编辑部分。考虑到提供的额外信息,这没有意义。请不要理会

原件:


显然,您正在使用的集群现在通过节点端口类型服务而不是负载平衡器设置入口控制器。为了获得所需的行为,您需要更改入口控制器的配置。请参阅如何执行此操作。

因此,要解决第二个问题,正如我所建议的,您可以使用hostNetwork:true参数将容器端口映射到它正在运行的主机。请注意,这不是推荐的做法,除非你有理由,否则你应该始终避免这样做

例如:

当我部署这个yaml时,我可以检查pod在哪里运行,并卷曲主机的端口80

root@v1-16-master:~# kubectl get po -owide
NAME                     READY   STATUS    RESTARTS   AGE     IP                NODE             NOMINATED NODE   READINESS GATES
nginx                    1/1     Running   0          105s    10.132.0.50       v1-16-worker-2   <none>           <none>
注意:现在我知道pod正在工作节点2上运行。我只需要它的IP地址

root@v1-16-master:~# kubectl get no -owide
NAME             STATUS   ROLES    AGE   VERSION   INTERNAL-IP   EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION    CONTAINER-RUNTIME
v1-16-master     Ready    master   52d   v1.16.4   10.132.0.48   xxxx        Ubuntu 16.04.6 LTS   4.15.0-1052-gcp   docker://19.3.5
v1-16-worker-1   Ready    <none>   52d   v1.16.4   10.132.0.49   xxxx        Ubuntu 16.04.6 LTS   4.15.0-1052-gcp   docker://19.3.5
v1-16-worker-2   Ready    <none>   52d   v1.16.4   10.132.0.50   xxxx        Ubuntu 16.04.6 LTS   4.15.0-1052-gcp   docker://19.3.5
v1-16-worker-3   Ready    <none>   20d   v1.16.4   10.132.0.51   xxxx        Ubuntu 16.04.6 LTS   4.15.0-1052-gcp   docker://19.3.5
root@v1-16-master:~# curl 10.132.0.50 2>/dev/null | grep title
<title>Welcome to nginx!</title>
root@v1-16-master:~# kubectl delete po nginx
pod "nginx" deleted
root@v1-16-master:~# curl 10.132.0.50
curl: (7) Failed to connect to 10.132.0.50 port 80: Connection refused

当然,如果我在浏览器上使用公共IP,它也会起作用。

您使用了哪种图表?默认值应为80:80/TCP,443:443/TCP,并带有官方舵图。你能添加nginx ingress控制器服务的yaml吗?@Jean PhilippeBond helm install nginx ingress-名称空间ingress nginx stable/nginx Ingres这正是我用于Ingres控制器的命令。如何检查当前yaml?使用kubectl编辑?kubectl获取svc nginx ingress controller-n ingress nginx-o yamlI将重现这一点。这就是我要求配置的原因。@dvdblk您有2个入口点指向入口控制器。1至10.65.106.240,2至节点ip:31122 | 32697。其他一切都会失败。什么是你的公共知识产权;在您的问题中?它的行为类似于NodePort,但如果您检查yaml,它的类型是LoadBalancer LoadBalancer只是NodePort的一种特殊类型,但行为是相同的。@dvdblk抱歉,我在写答案时没有看到编辑部分。没有想法:/如果这不是推荐的方式,那么我想知道如果有人正在进行裸机设置,实际情况是什么。所有这些方法似乎都有缺点,在端口80上部署echo应用程序应该很常见,对吧?另外,对于hostNetwork:true,似乎根本不需要MetalLB。您是否认为通过通道添加外部负载平衡器,删除metalLB和hostNetwork:false将使其以相同的方式工作,而不存在hostNet的缺点?是的。如果您设置一个普通LB并将其指向端口31122和32697,它应该可以工作。这就是所有LBs在云提供商上的实际工作方式。只是确认它在正常的LBs上正常工作。谢谢!
root@v1-16-master:~# kubectl get po -owide
NAME                     READY   STATUS    RESTARTS   AGE     IP                NODE             NOMINATED NODE   READINESS GATES
nginx                    1/1     Running   0          105s    10.132.0.50       v1-16-worker-2   <none>           <none>
root@v1-16-master:~# kubectl get no -owide
NAME             STATUS   ROLES    AGE   VERSION   INTERNAL-IP   EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION    CONTAINER-RUNTIME
v1-16-master     Ready    master   52d   v1.16.4   10.132.0.48   xxxx        Ubuntu 16.04.6 LTS   4.15.0-1052-gcp   docker://19.3.5
v1-16-worker-1   Ready    <none>   52d   v1.16.4   10.132.0.49   xxxx        Ubuntu 16.04.6 LTS   4.15.0-1052-gcp   docker://19.3.5
v1-16-worker-2   Ready    <none>   52d   v1.16.4   10.132.0.50   xxxx        Ubuntu 16.04.6 LTS   4.15.0-1052-gcp   docker://19.3.5
v1-16-worker-3   Ready    <none>   20d   v1.16.4   10.132.0.51   xxxx        Ubuntu 16.04.6 LTS   4.15.0-1052-gcp   docker://19.3.5
root@v1-16-master:~# curl 10.132.0.50 2>/dev/null | grep title
<title>Welcome to nginx!</title>
root@v1-16-master:~# kubectl delete po nginx
pod "nginx" deleted
root@v1-16-master:~# curl 10.132.0.50
curl: (7) Failed to connect to 10.132.0.50 port 80: Connection refused