У меня проблема с сетью в Кубернетесе. Я пытаюсь сохранить исходный 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