Владелец ранчо: балансировщик L4 застрял в ожидании, несмотря на работу L7 Ingress
Запуск Rancher v 2.4.5 с кластером из 2 узлов. Я попытался установить Wordpress с помощью Helm Chart от Bitnami.
Все прошло хорошо, я могу получить доступ к сайту через вход, за исключением того, что L4 Balancer, созданный диаграммой, по какой-то причине все еще находится в состоянии ожидания.
> kubectl get svc -n wordpress -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
ingress-d5bf098ee05c3bbaa0a93a2ceedd8d1a ClusterIP 10.43.51.5 <none> 80/TCP 15m workloadID_ingress-d5bf098ee05c3bbaa0a93a2ceedd8d1a=true
wordpress LoadBalancer 10.43.137.240 <pending> 80:31672/TCP,443:31400/TCP 5d22h app.kubernetes.io/instance=wordpress,app.kubernetes.io/name=wordpress
wordpress-mariadb ClusterIP 10.43.7.73 <none> 3306/TCP 5d22h app=mariadb,component=master,release=wordpress
Сервису wordpress не назначен вход LoadBalancer:
> kubectl describe services wordpress -n wordpress
Name: wordpress
Namespace: wordpress
Labels: app.kubernetes.io/instance=wordpress
app.kubernetes.io/managed-by=Tiller
app.kubernetes.io/name=wordpress
helm.sh/chart=wordpress-9.5.1
io.cattle.field/appId=wordpress
Annotations: <none>
Selector: app.kubernetes.io/instance=wordpress,app.kubernetes.io/name=wordpress
Type: LoadBalancer
IP: 10.43.137.240
Port: http 80/TCP
TargetPort: http/TCP
NodePort: http 31672/TCP
Endpoints: 10.42.1.16:8080
Port: https 443/TCP
TargetPort: https/TCP
NodePort: https 31400/TCP
Endpoints: 10.42.1.16:8443
Session Affinity: None
External Traffic Policy: Cluster
Events
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
field.cattle.io/creatorId: user-6qmpk
field.cattle.io/ingressState: '{"d29yZHByZXNzLWluZ3Jlc3Mvd29yZHByZXNzL3hpcC5pby8vLzgw":""}'
field.cattle.io/publicEndpoints: '[{"addresses":["10.105.1.77"],"port":80,"protocol":"HTTP","serviceName":"wordpress:wordpress","ingressName":"wordpress:my","hostname":"my.wordpress.10.105.1.77.xip.io","path":"/","allNodes":true}]'
creationTimestamp: "2020-09-01T19:32:27Z"
generation: 3
labels:
cattle.io/creator: norman
managedFields:
- apiVersion: networking.k8s.io/v1beta1
fieldsType: FieldsV1
fieldsV1:
f:status:
f:loadBalancer:
f:ingress: {}
manager: nginx-ingress-controller
operation: Update
time: "2020-09-01T19:32:27Z"
- apiVersion: extensions/v1beta1
fieldsType: FieldsV1
fieldsV1:
f:metadata:
f:annotations:
.: {}
f:field.cattle.io/creatorId: {}
f:field.cattle.io/ingressState: {}
f:field.cattle.io/publicEndpoints: {}
f:labels:
.: {}
f:cattle.io/creator: {}
f:spec:
f:rules: {}
manager: Go-http-client
operation: Update
time: "2020-09-01T19:49:08Z"
name: my
namespace: wordpress
resourceVersion: "6073928"
selfLink: /apis/extensions/v1beta1/namespaces/wordpress/ingresses/my
uid: 8a88e16e-cbda-4f1f-bb1c-9d63d0af1b93
spec:
rules:
- host: my.wordpress.10.105.1.77.xip.io
http:
paths:
- backend:
serviceName: wordpress
servicePort: 80
path: /
pathType: ImplementationSpecific
status:
loadBalancer:
ingress:
- ip: 10.105.1.77
- ip: 10.105.1.78
Я открыл проблему на Bitnami github, но, судя по ответам, проблема возникла на стороне Rancher/RKE.
Есть мысли об этом?
PS.
Должен ли я иметь L7 Ingress и L4 Balancer для Rancher, работающие на голом железе, или L7 Ingress можно настроить как балансировщик нагрузки и удалить L4 Balancer из этого проекта?
0 ответов
Я решил эту проблему, очистив брандмауэр, перезапустив докер (чтобы он получил новый брандмауэр), а затем установил Metallb (или все, что у вас есть в качестве балансировщика нагрузки). Если у вас еще нет балансировщика нагрузки L2, этот шаг можно пропустить, поскольку в моем случае проблема была вызвана тем, что брандмауэр балансировщика нагрузки не зарегистрирован.
Балансировщику нагрузки необходимо получить IP-адрес от Metallb, вашего облачного провайдера, облачного хранилища или чего-то подобного. Он внешний, значит, сам кубернетес его предоставлять не собирается.
Вам необходимо использовать балансировщик нагрузки L2, который предоставляет IP-адреса. Если у вас его нет, вы можете попробовать https://metallb.universe.tf.
Вы также можете просто оставить его, вы никогда не получите внешний IP-адрес, но nginx/traefik все равно будет маршрутизировать трафик, поскольку не находит другого маршрута.