Estou tendo problemas para obter um SingleStack
LoadBalancer
serviço IPv6 do kubernetes passando pelo endereço IP de origem correto para os pods. Funciona bem em um IPv4 irmão SingleStack
LoadBalancer
que passa o tráfego para os mesmos pods.
O cluster é um cluster dual-stack bare-metal v1.21.1 criado com kubeadm
e usa Calico v3.18 como cni e MetalLB para alocar IPs de balanceador de carga para serviços configurados com type: LoadBalancer
. O Calico é então configurado para anunciar os IPs do balanceador de carga para o roteador local pelo BGP. Tomando um exemplo de brinquedo de uma única nginx
implantação com dois serviços (um para IPv4, um para IPv6), se eu enrolar o IP através do endereço IPv4, o log de acesso do nginx imprime o IP do cliente correto em 192.168.2.0/24
:
192.168.2.128 - - [01/Jun/2021:19:32:37 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.64.1" "-"
Mas enrolando o endereço IPv6 do mesmo cliente em 2001:8b0:c8f:e8b0::/64
, o nginx mostra um endereço IP do cliente defd5a:1111:1111::f31f
fd5a:1111:1111::f31f - - [01/Jun/2021:19:34:23 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.64.1" "-"
Este endereço é do cluster serviceSubnet
e fd5a:1111:1111::/112
passa a ser o clusterIP
endereço do serviço IPv6. Parece que algo está realmente fazendo algum proxy TCP aqui (ipvs?), mas não está claro por que está se comportando dessa maneira. Eu esperaria isso se externalTrafficPolicy
fosse Cluster
- na verdade, se eu alterar os serviços de Local
para Cluster
, recebo o endereço IP local do nó do cluster encaminhando a solicitação no IPv4 (como esperado) e o mesmo endereço do clusterIP no IPv6. externalTrafficPolicy
parece não ter efeito no caso IPv6.
Estou perdendo algo óbvio ou esses serviços devem se comportar da mesma maneira que os outros?
Manifesto do teste:
---
apiVersion: v1
kind: Service
metadata:
name: test-service-source-ip-v4
namespace: default
labels:
k8s-app: test-service-source-ip
spec:
selector:
k8s-app: test-service-source-ip
type: LoadBalancer
ipFamilies:
- IPv4
ipFamilyPolicy: SingleStack
loadBalancerIP: 192.168.254.11
externalTrafficPolicy: "Local"
ports:
- name: http-tcp
protocol: TCP
port: 80
---
apiVersion: v1
kind: Service
metadata:
name: test-service-source-ip-v6
namespace: default
labels:
k8s-app: test-service-source-ip
spec:
selector:
k8s-app: test-service-source-ip
type: LoadBalancer
ipFamilies:
- IPv6
ipFamilyPolicy: SingleStack
loadBalancerIP: 2001:8b0:c8f:e8b1:beef:f00d::11
externalTrafficPolicy: "Local"
ports:
- name: http-tcp
protocol: TCP
port: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: default
name: test-service-source-ip
labels:
k8s-app: test-service-source-ip
spec:
replicas: 1
selector:
matchLabels:
k8s-app: test-service-source-ip
template:
metadata:
labels:
k8s-app: test-service-source-ip
spec:
containers:
- name: test-service-source-ip
image: nginx:1
ports:
- containerPort: 80
protocol: TCP