Как я могу включить внешний доступ к моей службе Kubernetes через master с Calico на GCP?

#kubernetes #google-cloud-platform #project-calico

#kubernetes #google-cloud-platform #проект-calico

Вопрос:

У меня есть один главный и один рабочий кластер Kubernetes с Calico, развернутый здесь, без изменений в манифестах. У master есть внутренний IP-адрес 10.132.0.30 , и я пытаюсь предоставить доступ к моей службе (запущенной на worker) на master следующим образом:

 apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  type: ClusterIP
  externalIPs: [10.132.0.30]
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: nginx
  

curl http://10.132.0.30 с master работает, как ожидалось, но запуск master с моего ноутбука по его внешнему IP-адресу зависает, хотя я могу видеть соединения с помощью tcpdump :

 # tcpdump -i eth0 dst 10.132.0.30 and dst port 80
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
22:52:16.692059 IP cpc102582-walt20-2-0-cust85.13-2.cable.virginm.net.62882 > fail5-luke-master.c.jetstack-luke.internal.http: Flags [S], seq 3014275997, win 65535, options [mss 1460,nop,wscale 6,nop,nop,TS val 181016377 ecr 0,sackOK,eol], length 0
...
  

При выполнении других tcpdump команд на других интерфейсах кажется, что пакеты достигают nginx, но не возвращаются ( cali3561fc118c0 это интерфейс моего модуля nginx на рабочем сервере в корневом сетевом пространстве имен и 192.168.1.4 это назначенный ему IP):

 # tcpdump -i cali3561fc118c0 dst 192.168.1.4
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on cali3561fc118c0, link-type EN10MB (Ethernet), capture size 262144 bytes
23:00:23.626170 IP 192.168.0.1.65495 > 192.168.1.4.http-alt: Flags [S], seq 2616662679, win 65535, options [mss 1460,nop,wscale 6,nop,nop,TS val 181480911 ecr 0,sackOK,eol], length 0
...
  

Я предполагаю, что существует много возможных проблем, но есть ли что-то очевидное, чего мне не хватает?

РЕДАКТИРОВАТЬ: Я последовал совету из приведенных здесь документов Calico, но безуспешно

Версия Kubernetes: 1.13.4

Ответ №1:

Я не установил --cluster-cidr вкл kube-proxy . Установка этого означала, что kube-proxy знал, что нужно маскировать внешний трафик, поскольку в противном случае обратный путь был бы асимметричным (он всегда передавался от узла к рабочему): https://github.com/kubernetes/kubernetes/blob/master/pkg/proxy/iptables/proxier.go#L841-L845