我有两个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-inress控制器。当我部署Nginx-ingress控制器LoadBalancer服务时,我可以看到在OpenStack中创建的负载均衡器。但是,尝试使用外部IP访问入口控制器总是导致空答复。
使用CLI,我可以看到负载平衡器,池和成员。成员条目指示存在错误:
+---------------------+--------------------------------------+ | Field | Value | +---------------------+--------------------------------------+ | address | 10.0.0.9 | | admin_state_up | True | | created_at | 2018-09-28T22:15:51 | | id | 109ad896-5953-4b2b-bbc9-d251d44c3817 | | name | | | operating_status | ERROR | | project_id | 12b95a935dc3481688eb840249c9b167 | | protocol_port | 31042 | | provisioning_status | ACTIVE | | subnet_id | 1e5efaa0-f95f-44a1-a271-541197f372ab | | updated_at | 2018-09-28T22:16:33 | | weight | 1 | | monitor_port | None | | monitor_address | None | +---------------------+--------------------------------------+
但是,没有迹象表明错误是什么。我可以找到的日志中没有相应的错误。
使用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。有什么想法为什么不起作用?
答案 0 :(得分: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"
时,K8将丢弃数据包,因为它i)仅限于路由到该节点本地的端点,并且ii)认为没有本地端点。
其他曾解决此问题的人使用hostname-override
配置kube-proxy,以使两者匹配。