Сервис кластера microk8s, похоже, выполняет исходный NAT, когда в документации сказано, что это не должно - PullRequest
1 голос
/ 10 февраля 2020

У меня проблема с сетью в Кубернетесе. Я пытаюсь сохранить исходный IP-адрес входящих запросов к службе clusterIP, но обнаружил, что запросы выглядят как исходные NAT. То есть они несут IP-адрес узла в качестве исходного IP-адреса, а не IP-адрес модуля, выполняющего запрос. Я следую примеру IP-адресов кластеров: https://kubernetes.io/docs/tutorials/services/source-ip/#source -ip-for-services-with-type-clusterip , но я обнаружил, что поведение Kubernetes для меня совершенно иное. В приведенном выше примере я развернул эхо-сервер, который сообщает исходный IP-адрес. Это развернуто за службой clusterIP, которую я запрашиваю из отдельного модуля, работающего с busybox. Ответ от эхо-сервера ниже:

CLIENT VALUES:
client_address=10.1.36.1
command=GET
real path=/
query=nil
request_version=1.1
request_uri=http://10.152.183.99:8080/
SERVER VALUES:
server_version=nginx: 1.10.0 - lua: 10001
HEADERS RECEIVED:
connection=close
host=10.152.183.99
user-agent=Wget
BODY

Исходный IP-адрес 10.1.36.1 принадлежит узлу. Я ожидал увидеть адрес busybox, который является 10.1.36.168. Кто-нибудь знает, почему SNAT будет включен для кластера IP? Мне действительно странно, что это прямо противоречит официальной документации. (отредактировано)

Все это выполняется на одном узле. Узел работает в режиме iptables. Я использую microk8s.

Моя версия microk8s:

Client:
  Version:  v1.2.5
  Revision: bb71b10fd8f58240ca47fbb579b9d1028eea7c84
Server:
  Version:  v1.2.5
  Revision: bb71b10fd8f58240ca47fbb579b9d1028eea7c84

Вывод kubectl describe service clusterip:

Name:              clusterip
Namespace:         default
Labels:            app=source-ip-app
Annotations:       <none>
Selector:          app=source-ip-app
Type:              ClusterIP
IP:                10.152.183.106
Port:              <unset>  80/TCP
TargetPort:        8080/TCP
Endpoints:         10.1.36.225:8080
Session Affinity:  None
Events:            <none>

Вывод kubectl describe pod source-ip-app-7c79c78698-xgd5w:

Name:         source-ip-app-7c79c78698-xgd5w
Namespace:    default
Priority:     0
Node:         riley-virtualbox/10.0.2.15
Start Time:   Wed, 12 Feb 2020 09:19:18 -0600
Labels:       app=source-ip-app
              pod-template-hash=7c79c78698
Annotations:  <none>
Status:       Running
IP:           10.1.36.225
IPs:
  IP:           10.1.36.225
Controlled By:  ReplicaSet/source-ip-app-7c79c78698
Containers:
  echoserver:
    Container ID:   containerd://6775c010145d3951d067e3bb062bea9b70d305f96f84aa870963a8b385a4a118
    Image:          k8s.gcr.io/echoserver:1.4
    Image ID:       sha256:523cad1a4df732d41406c9de49f932cd60d56ffd50619158a2977fd1066028f9
    Port:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Wed, 12 Feb 2020 09:19:23 -0600
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-7pszf (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  default-token-7pszf:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-7pszf
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type    Reason     Age        From                       Message
  ----    ------     ----       ----                       -------
  Normal  Scheduled  <unknown>  default-scheduler          Successfully assigned default/source-ip-app-7c79c78698-xgd5w to riley-virtualbox
  Normal  Pulled     2m58s      kubelet, riley-virtualbox  Container image "k8s.gcr.io/echoserver:1.4" already present on machine
  Normal  Created    2m55s      kubelet, riley-virtualbox  Created container echoserver
  Normal  Started    2m54s      kubelet, riley-virtualbox  Started container echoserver
...