1

我有两台 Ubuntu 18.04 裸机服务器。使用 devstack 部署,我建立了一个多节点(2 个节点)集群,其中一台服务器具有控制器服务和计算,而第二台服务器只有计算。在控制器节点中,我使用 Octavia 启用了 lbaas v2。

# LBaaS
enable_plugin neutron-lbaas https://git.openstack.org/openstack/neutron-lbaas stable/queens
enable_plugin octavia https://git.openstack.org/openstack/octavia stable/queens
enable_service q-lbaasv2 octavia o-cw o-hk o-hm o-api

我创建了一个具有 1 个主节点和 2 个小节点的 Kubernetes 集群。一些初步测试是成功的。通过 Helm 部署 WordPress 创建了一个负载均衡器,我能够按预期访问该应用程序。

我现在正在尝试设置一个 nginx-ingress 控制器。当我部署我的 nginx-ingress 控制器 LoadBalancer 服务时,我可以看到在 OpenStack 中创建的负载均衡器。但是,尝试使用外部 IP 访问入口控制器总是会导致空回复。

使用 CLI,我可以看到负载均衡器、池和成员。成员条目表明存在错误:

+---------------------+-------------------------- ------------+
| 领域 | 价值 |
+---------------------+-------------------------- ------------+
| 地址 | 10.0.0.9 |
| admin_state_up | 真 |
| created_at | 2018-09-28T22:15:51 |
| 编号 | 109ad896-5953-4b2b-bbc9-d251d44c3817 |
| 姓名 | |
| 操作状态 | 错误 |
| 项目 ID | 12b95a935dc3481688eb840249c9b167 |
| 协议端口 | 31042 |
| 供应状态 | 活跃 |
| 子网ID | 1e5efaa0-f95f-44a1-a271-541197f372ab |
| 更新了 | 2018-09-28T22:16:33 |
| 重量 | 1 |
| 监控端口 | 无 |
| 监视器地址 | 无 |
+---------------------+-------------------------- ------------+

但是,没有迹象表明错误是什么。日志中没有我能找到的相应错误。

使用 kubectl port-forward 我验证了 nginx 入口控制器已启动/运行并正确配置。问题似乎出在负载均衡器上。

我的问题是如何诊断错误是什么?

我只找到了一份与 lbaas v2 相关的故障排除指南,它声称我应该能够在运行时看到 q-lbaas-命名空间:ip netns list. 但是,没有定义。

使用 helm --dry-run --debug 服务 yaml 是:

# Source: nginx-ingress/templates/controller-service.yaml
apiVersion: v1
kind: Service
metadata:
  labels:
    app: nginx-ingress
    chart: nginx-ingress-0.25.1
    component: "controller"
    heritage: Tiller
    release: oslb2
  name: oslb2-nginx-ingress-controller
spec:
  clusterIP: ""
  externalTrafficPolicy: "Local"
  ports:
    - name: http
      port: 80
      protocol: TCP
      targetPort: http
    - name: https
      port: 443
      protocol: TCP
      targetPort: https
  selector:
    app: nginx-ingress
    component: "controller"
    release: oslb2
  type: "LoadBalancer"

有趣的是,与以前的(wordpress)LoadBalancer 服务相比,我注意到 nginx-ingress externalRoutingPolicy 设置为Local,而 wordpress 指定了 Cluster。我更改了 nginx-ingress 图表的 values.yaml 以将 externalRoutingPolicy 设置为 Cluster,现在负载均衡器正在工作。

我们希望将策略保留在“本地”以保留源 IP。关于为什么它不起作用的任何想法?

4

1 回答 1

2

事实证明我在叫错树(道歉)。负载均衡器没有问题。

问题源于 Kubernetes 无法将 minion/worker 主机名与其​​节点名匹配。节点采用主机名的缩写形式,例如: k8s-cluster-fj7cs2gokrnz-minion-1而 kube-proxy 根据完全限定名称进行查找:k8s-cluster-fj7cs2gokrnz-minion-1.novalocal

我在 kube-proxy 的日志中找到了这个:

Sep 27 23:26:20 k8s-cluster-fj7cs2gokrnz-minion-1.novalocal runc[2205]: W0927 23:26:20.050146       1 server.go:586]
 Failed to retrieve node info: nodes "k8s-cluster-fj7cs2gokrnz-minion-1.novalocal" not found
Sep 27 23:26:20 k8s-cluster-fj7cs2gokrnz-minion-1.novalocal runc[2205]: W0927 23:26:20.050241       1 proxier.go:463] invalid nodeIP, initializing kube-proxy with 127.0.0.1 as nodeIP

这会导致 Kubernetes 无法找到 LoadBalancer(或其他)服务的“本地”端点。当您指定externalTrafficPolicy: "Local"K8s 将丢弃数据包时,因为它 i)仅限于路由到节点本地的端点,并且 ii)它认为没有本地端点。

遇到此问题的其他人配置 kube-proxyhostname-override以使两者匹配。

于 2018-10-01T20:32:57.763 回答