{"id":1646,"date":"2020-06-22T01:03:26","date_gmt":"2020-06-21T17:03:26","guid":{"rendered":"http:\/\/39.97.231.10\/?p=1646"},"modified":"2020-06-22T01:03:26","modified_gmt":"2020-06-21T17:03:26","slug":"kubernetes-%e4%bd%bf%e7%94%a8source-ip","status":"publish","type":"post","link":"http:\/\/www.weijing.co\/?p=1646","title":{"rendered":"kubernetes\u4f7f\u7528Source IP"},"content":{"rendered":"<h1>\u4f7f\u7528 Source IP<\/h1>\n<p>Kubernetes \u96c6\u7fa4\u4e2d\u8fd0\u884c\u7684\u5e94\u7528\u901a\u8fc7 Service \u62bd\u8c61\u6765\u4e92\u76f8\u67e5\u627e\u3001\u901a\u4fe1\u548c\u4e0e\u5916\u90e8\u4e16\u754c\u6c9f\u901a\u3002\u672c\u6587\u4ecb\u7ecd\u88ab\u53d1\u9001\u5230\u4e0d\u540c\u7c7b\u578b Services \u7684\u6570\u636e\u5305\u6e90 IP \u7684\u53d8\u5316\u8fc7\u7a0b\uff0c\u4f60\u53ef\u4ee5\u6839\u636e\u4f60\u7684\u9700\u6c42\u6539\u53d8\u8fd9\u4e9b\u884c\u4e3a\u3002<\/p>\n<h2 id=\\\"\u51c6\u5907\u5f00\u59cb\\\">\u51c6\u5907\u5f00\u59cb<\/h2>\n<p>\u4f60\u5fc5\u987b\u62e5\u6709\u4e00\u4e2a Kubernetes \u7684\u96c6\u7fa4\uff0c\u540c\u65f6\u4f60\u7684 Kubernetes \u96c6\u7fa4\u5fc5\u987b\u5e26\u6709 kubectl \u547d\u4ee4\u884c\u5de5\u5177\u3002 \u5982\u679c\u4f60\u8fd8\u6ca1\u6709\u96c6\u7fa4\uff0c\u4f60\u53ef\u4ee5\u901a\u8fc7\u00a0<a href=\\\"https:\/\/kubernetes.io\/docs\/getting-started-guides\/minikube\\\">Minikube<\/a>\u00a0\u6784\u5efa\u4e00 \u4e2a\u4f60\u81ea\u5df1\u7684\u96c6\u7fa4\uff0c\u6216\u8005\u4f60\u53ef\u4ee5\u4f7f\u7528\u4e0b\u9762\u4efb\u610f\u4e00\u4e2a Kubernetes \u5de5\u5177\u6784\u5efa\uff1a<\/p>\n<ul>\n<li><a href=\\\"https:\/\/www.katacoda.com\/courses\/kubernetes\/playground\\\">Katacoda<\/a><\/li>\n<li><a href=\\\"http:\/\/labs.play-with-k8s.com\/\\\">Play with Kubernetes<\/a><\/li>\n<\/ul>\n<h2 id=\\\"\u672f\u8bed\u8868\\\">\u672f\u8bed\u8868<\/h2>\n<p>\u672c\u6587\u4f7f\u7528\u4e86\u4e0b\u5217\u672f\u8bed\uff1a<\/p>\n<ul>\n<li>NAT: \u7f51\u7edc\u5730\u5740\u8f6c\u6362<\/li>\n<li>Source NAT: \u66ff\u6362\u6570\u636e\u5305\u7684\u6e90 IP, \u901a\u5e38\u4e3a\u8282\u70b9\u7684 IP<\/li>\n<li>Destination NAT: \u66ff\u6362\u6570\u636e\u5305\u7684\u76ee\u7684 IP, \u901a\u5e38\u4e3a Pod \u7684 IP<\/li>\n<li>VIP: \u4e00\u4e2a\u865a\u62df IP, \u4f8b\u5982\u5206\u914d\u7ed9\u6bcf\u4e2a Kubernetes Service \u7684 IP<\/li>\n<li>Kube-proxy: \u4e00\u4e2a\u7f51\u7edc\u5b88\u62a4\u7a0b\u5e8f\uff0c\u5728\u6bcf\u4e2a\u8282\u70b9\u4e0a\u534f\u8c03 Service VIP \u7ba1\u7406<\/li>\n<\/ul>\n<h2 id=\\\"\u51c6\u5907\u5de5\u4f5c\\\">\u51c6\u5907\u5de5\u4f5c<\/h2>\n<p>\u4f60\u5fc5\u987b\u62e5\u6709\u4e00\u4e2a\u6b63\u5e38\u5de5\u4f5c\u7684 Kubernetes 1.5 \u96c6\u7fa4\u6765\u8fd0\u884c\u6b64\u6587\u6863\u4e2d\u7684\u793a\u4f8b\u3002\u8be5\u793a\u4f8b\u4f7f\u7528\u4e00\u4e2a\u7b80\u5355\u7684 nginx webserver\uff0c\u901a\u8fc7\u4e00\u4e2aHTTP\u6d88\u606f\u5934\u8fd4\u56de\u5b83\u63a5\u6536\u5230\u8bf7\u6c42\u7684\u6e90IP\u3002\u4f60\u53ef\u4ee5\u50cf\u4e0b\u9762\u8fd9\u6837\u521b\u5efa\u5b83\uff1a<\/p>\n<pre>kubectl run source-ip-app --image=k8s.gcr.io\/echoserver:1.4\n<\/pre>\n<p>\u8f93\u51fa\u7ed3\u679c\u4e3a<\/p>\n<pre>deployment.apps\/source-ip-app created\n<\/pre>\n<h2 id=\\\"\u6559\u7a0b\u76ee\u6807\\\">\u6559\u7a0b\u76ee\u6807<\/h2>\n<ul>\n<li>\u901a\u8fc7\u591a\u79cd\u7c7b\u578b\u7684 Services \u66b4\u9732\u4e00\u4e2a\u7b80\u5355\u5e94\u7528<\/li>\n<li>\u7406\u89e3\u6bcf\u79cd Service \u7c7b\u578b\u5982\u4f55\u5904\u7406\u6e90 IP NAT<\/li>\n<li>\u7406\u89e3\u4fdd\u7559\u6e90IP\u6240\u6d89\u53ca\u7684\u6298\u4e2d<\/li>\n<\/ul>\n<h2 id=\\\"type-clusterip-\u7c7b\u578b-services-\u7684-source-ip\\\">Type=ClusterIP \u7c7b\u578b<\/h2>\n<p>\u5982\u679c\u4f60\u7684 kube-proxy \u8fd0\u884c\u5728\u00a0iptables \u6a21\u5f0f\u4e0b\uff0c\u4ece\u96c6\u7fa4\u5185\u90e8\u53d1\u9001\u5230 ClusterIP \u7684\u5305\u6c38\u8fdc\u4e0d\u4f1a\u8fdb\u884c\u6e90\u5730\u5740 NAT\uff0c\u8fd9\u4ece Kubernetes 1.2 \u5f00\u59cb\u662f\u9ed8\u8ba4\u9009\u9879\u3002Kube-proxy \u901a\u8fc7\u4e00\u4e2a\u00a0proxyMode\u00a0endpoint \u66b4\u9732\u5b83\u7684\u6a21\u5f0f\u3002<\/p>\n<pre>kubectl get nodes\n<\/pre>\n<p>\u8f93\u51fa\u7ed3\u679c\u4e0e\u4ee5\u4e0b\u7ed3\u679c\u7c7b\u4f3c:<\/p>\n<pre>NAME                           STATUS     ROLES    AGE     VERSION\nkubernetes-node-6jst   Ready      &lt;none&gt;   2h      v1.13.0\nkubernetes-node-cx31   Ready      &lt;none&gt;   2h      v1.13.0\nkubernetes-node-jj1t   Ready      &lt;none&gt;   2h      v1.13.0\n<\/pre>\n<p>\u4ece\u5176\u4e2d\u4e00\u4e2a\u8282\u70b9\u4e2d\u5f97\u5230\u4ee3\u7406\u6a21\u5f0f<\/p>\n<pre>kubernetes-node-6jst $ curl localhost:10249\/proxyMode\n<\/pre>\n<p>\u8f93\u51fa\u7ed3\u679c\u4e3a\uff1a<\/p>\n<pre>iptables\n<\/pre>\n<p>\u4f60\u53ef\u4ee5\u901a\u8fc7\u5728source IP\u5e94\u7528\u4e0a\u521b\u5efa\u4e00\u4e2aService\u6765\u6d4b\u8bd5\u6e90IP\u4fdd\u7559\u3002<\/p>\n<pre>kubectl expose deployment source-ip-app --name=clusterip --port=80 --target-port=8080\n<\/pre>\n<p>\u8f93\u51fa\u7ed3\u679c\u4e3a\uff1a<\/p>\n<pre>service\/clusterip exposed\n<\/pre>\n<pre>kubectl get svc clusterip\n<\/pre>\n<p>\u8f93\u51fa\u7ed3\u679c\u4e0e\u4ee5\u4e0b\u7ed3\u679c\u7c7b\u4f3c\uff1a<\/p>\n<pre>NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE\nclusterip    ClusterIP   10.0.170.92   &lt;none&gt;        80\/TCP    51s\n<\/pre>\n<p>\u4ece\u76f8\u540c\u96c6\u7fa4\u4e2d\u7684\u4e00\u4e2a pod \u8bbf\u95ee\u8fd9\u4e2a\u00a0ClusterIP\uff1a<\/p>\n<pre>kubectl run busybox -it --image=busybox --restart=Never --rm\n<\/pre>\n<p>\u8f93\u51fa\u7ed3\u679c\u4e0e\u4ee5\u4e0b\u7ed3\u679c\u7c7b\u4f3c\uff1a<\/p>\n<pre>Waiting for pod default\/busybox to be running, status is Pending, pod ready: false\nIf you don\\'t see a command prompt, try pressing enter.\n# ip addr\n1: lo: &lt;LOOPBACK,UP,LOWER_UP&gt; mtu 65536 qdisc noqueue\n    link\/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00\n    inet 127.0.0.1\/8 scope host lo\n       valid_lft forever preferred_lft forever\n    inet6 ::1\/128 scope host\n       valid_lft forever preferred_lft forever\n3: eth0: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1460 qdisc noqueue\n    link\/ether 0a:58:0a:f4:03:08 brd ff:ff:ff:ff:ff:ff\n    inet 10.244.3.8\/24 scope global eth0\n       valid_lft forever preferred_lft forever\n    inet6 fe80::188a:84ff:feb0:26a5\/64 scope link\n       valid_lft forever preferred_lft forever\n# wget -qO - 10.0.170.92\nCLIENT VALUES:\nclient_address=10.244.3.8\ncommand=GET\n...\n<\/pre>\n<p>\u65e0\u8bba\u5ba2\u6237\u7aef pod \u548c \u670d\u52a1\u7aef pod \u662f\u5426\u5728\u76f8\u540c\u7684\u8282\u70b9\u4e0a\uff0cclient_address \u59cb\u7ec8\u662f\u5ba2\u6237\u7aef pod \u7684 IP \u5730\u5740\u3002<\/p>\n<h2 id=\\\"type-nodeport-\u7c7b\u578b-services-\u7684-source-ip\\\">Type=NodePort \u7c7b\u578b<\/h2>\n<p>\u4ece Kubernetes 1.5 \u5f00\u59cb\uff0c\u53d1\u9001\u7ed9\u7c7b\u578b\u4e3a\u00a0Type=NodePort\u00a0Services \u7684\u6570\u636e\u5305\u9ed8\u8ba4\u8fdb\u884c\u6e90\u5730\u5740 NAT\u3002\u4f60\u53ef\u4ee5\u901a\u8fc7\u521b\u5efa\u4e00\u4e2a\u00a0NodePort\u00a0Service \u6765\u8fdb\u884c\u6d4b\u8bd5\uff1a<\/p>\n<pre>kubectl expose deployment source-ip-app --name=nodeport --port=80 --target-port=8080 --type=NodePort\n<\/pre>\n<p>\u8f93\u51fa\u7ed3\u679c\u4e3a\uff1a<\/p>\n<pre>service\/nodeport exposed\n<\/pre>\n<pre>NODEPORT=$(kubectl get -o jsonpath=\\\"{.spec.ports[0].nodePort}\\\" services nodeport)\nNODES=$(kubectl get nodes -o jsonpath=\\'{ $.items[*].status.addresses[?(@.type==\\\"ExternalIP\\\")].address }\\')\n<\/pre>\n<p>\u5982\u679c\u4f60\u7684\u96c6\u7fa4\u8fd0\u884c\u5728\u4e00\u4e2a\u4e91\u670d\u52a1\u4e0a\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u4e3a\u4e0a\u9762\u62a5\u544a\u7684\u00a0nodes:nodeport\u00a0\u5f00\u542f\u4e00\u6761\u9632\u706b\u5899\u89c4\u5219\u3002 \u73b0\u5728\uff0c\u4f60\u53ef\u4ee5\u901a\u8fc7\u4e0a\u9762\u5206\u914d\u7684\u8282\u70b9\u7aef\u53e3\u4ece\u5916\u90e8\u8bbf\u95ee\u8fd9\u4e2a Service\u3002<\/p>\n<pre>for node in $NODES; do curl -s $node:$NODEPORT | grep -i client_address; done\n<\/pre>\n<p>\u8f93\u51fa\u7ed3\u679c\u4e0e\u4ee5\u4e0b\u7ed3\u679c\u7c7b\u4f3c\uff1a<\/p>\n<pre>client_address=10.180.1.1\nclient_address=10.240.0.5\nclient_address=10.240.0.3\n<\/pre>\n<p>\u8bf7\u6ce8\u610f\uff0c\u8fd9\u4e9b\u5e76\u4e0d\u662f\u6b63\u786e\u7684\u5ba2\u6237\u7aef IP\uff0c\u5b83\u4eec\u662f\u96c6\u7fa4\u7684\u5185\u90e8 IP\u3002\u8fd9\u662f\u6240\u53d1\u751f\u7684\u4e8b\u60c5\uff1a<\/p>\n<ul>\n<li>\u5ba2\u6237\u7aef\u53d1\u9001\u6570\u636e\u5305\u5230\u00a0node2:nodePort<\/li>\n<li>node2\u00a0\u4f7f\u7528\u5b83\u81ea\u5df1\u7684 IP \u5730\u5740\u66ff\u6362\u6570\u636e\u5305\u7684\u6e90 IP \u5730\u5740\uff08SNAT\uff09<\/li>\n<li>node2\u00a0\u4f7f\u7528 pod IP \u5730\u5740\u66ff\u6362\u6570\u636e\u5305\u7684\u76ee\u7684 IP \u5730\u5740<\/li>\n<li>\u6570\u636e\u5305\u88ab\u8def\u7531\u5230 node 1\uff0c\u7136\u540e\u4ea4\u7ed9 endpoint<\/li>\n<li>Pod \u7684\u56de\u590d\u88ab\u8def\u7531\u56de node2<\/li>\n<li>Pod \u7684\u56de\u590d\u88ab\u53d1\u9001\u56de\u7ed9\u5ba2\u6237\u7aef<\/li>\n<\/ul>\n<p>\u7528\u56fe\u8868\u793a\uff1a<\/p>\n<pre>          client\n             \\\\ ^\n              \\\\ \\\\\n               v \\\\\n   node 1 &lt;--- node 2\n    | ^   SNAT\n    | |   ---&gt;\n    v |\n endpoint\n<\/pre>\n<p>\u4e3a\u4e86\u9632\u6b62\u8fd9\u79cd\u60c5\u51b5\u53d1\u751f\uff0cKubernetes \u63d0\u4f9b\u4e86\u4e00\u4e2a\u7279\u6027\u6765\u4fdd\u7559\u5ba2\u6237\u7aef\u7684\u6e90 IP \u5730\u5740\u3002\u8bbe\u7f6e\u00a0service.spec.externalTrafficPolicy\u00a0\u7684\u503c\u4e3a\u00a0Local\uff0c\u8bf7\u6c42\u5c31\u53ea\u4f1a\u88ab\u4ee3\u7406\u5230\u672c\u5730 endpoints \u800c\u4e0d\u4f1a\u88ab\u8f6c\u53d1\u5230\u5176\u5b83\u8282\u70b9\u3002\u8fd9\u6837\u5c31\u4fdd\u7559\u4e86\u6700\u521d\u7684\u6e90 IP \u5730\u5740\u3002\u5982\u679c\u6ca1\u6709\u672c\u5730 endpoints\uff0c\u53d1\u9001\u5230\u8fd9\u4e2a\u8282\u70b9\u7684\u6570\u636e\u5305\u5c06\u4f1a\u88ab\u4e22\u5f03\u3002\u8fd9\u6837\u5728\u5e94\u7528\u5230\u6570\u636e\u5305\u7684\u4efb\u4f55\u5305\u5904\u7406\u89c4\u5219\u4e0b\uff0c\u4f60\u90fd\u80fd\u4f9d\u8d56\u8fd9\u4e2a\u6b63\u786e\u7684 source-ip \u4f7f\u6570\u636e\u5305\u901a\u8fc7\u5e76\u5230\u8fbe endpoint\u3002<br \/>\n\u8bbe\u7f6e\u00a0service.spec.externalTrafficPolicy\u00a0\u5b57\u6bb5\u5982\u4e0b\uff1a<\/p>\n<pre>kubectl patch svc nodeport -p \\'{\\\"spec\\\":{\\\"externalTrafficPolicy\\\":\\\"Local\\\"}}\\'\n<\/pre>\n<p>\u8f93\u51fa\u7ed3\u679c\u4e3a\uff1a<\/p>\n<pre>service\/nodeport patched\n<\/pre>\n<p>\u73b0\u5728\uff0c\u91cd\u65b0\u8fd0\u884c\u6d4b\u8bd5\uff1a<\/p>\n<pre>for node in $NODES; do curl --connect-timeout 1 -s $node:$NODEPORT | grep -i client_address; done\n<\/pre>\n<p>\u8f93\u51fa\u7ed3\u679c\u4e3a\uff1a<\/p>\n<pre>client_address=104.132.1.79\n<\/pre>\n<p>\u8bf7\u6ce8\u610f\uff0c\u4f60\u53ea\u4ece endpoint pod \u8fd0\u884c\u7684\u90a3\u4e2a\u8282\u70b9\u5f97\u5230\u4e86\u4e00\u4e2a\u56de\u590d\uff0c\u8fd9\u4e2a\u56de\u590d\u6709\u6b63\u786e\u7684\u5ba2\u6237\u7aef IP\u3002<br \/>\n\u8fd9\u662f\u53d1\u751f\u7684\u4e8b\u60c5\uff1a<\/p>\n<ul>\n<li>\u5ba2\u6237\u7aef\u53d1\u9001\u6570\u636e\u5305\u5230\u00a0node2:nodePort\uff0c\u5b83\u6ca1\u6709\u4efb\u4f55 endpoints<\/li>\n<li>\u6570\u636e\u5305\u88ab\u4e22\u5f03<\/li>\n<li>\u5ba2\u6237\u7aef\u53d1\u9001\u6570\u636e\u5305\u5230\u00a0node1:nodePort\uff0c\u5b83\u6709endpoints<\/li>\n<li>node1 \u4f7f\u7528\u6b63\u786e\u7684\u6e90 IP \u5730\u5740\u5c06\u6570\u636e\u5305\u8def\u7531\u5230 endpoint<\/li>\n<\/ul>\n<p>\u7528\u56fe\u8868\u793a\uff1a<\/p>\n<pre>        client\n       ^ \/   \\\\\n      \/ \/     \\\\\n     \/ v       X\n   node 1     node 2\n    ^ |\n    | |\n    | v\n endpoint\n<\/pre>\n<h2 id=\\\"type-loadbalancer-\u7c7b\u578b-services-\u7684-source-ip\\\">Type=LoadBalancer \u7c7b\u578b<\/h2>\n<p>\u4eceKubernetes1.5\u5f00\u59cb\uff0c\u53d1\u9001\u7ed9\u7c7b\u578b\u4e3a\u00a0Type=LoadBalancer\u00a0Services \u7684\u6570\u636e\u5305\u9ed8\u8ba4\u8fdb\u884c\u6e90\u5730\u5740 NAT\uff0c\u8fd9\u662f\u56e0\u4e3a\u6240\u6709\u5904\u4e8e\u00a0Ready\u00a0\u72b6\u6001\u7684\u53ef\u8c03\u5ea6 Kubernetes \u8282\u70b9\u5bf9\u4e8e\u8d1f\u8f7d\u5747\u8861\u7684\u6d41\u91cf\u90fd\u662f\u7b26\u5408\u6761\u4ef6\u7684\u3002\u6240\u4ee5\u5982\u679c\u6570\u636e\u5305\u5230\u8fbe\u4e00\u4e2a\u6ca1\u6709 endpoint \u7684\u8282\u70b9\uff0c\u7cfb\u7edf\u5c06\u628a\u8fd9\u4e2a\u5305\u4ee3\u7406\u5230\u6709\u00a0endpoint \u7684\u8282\u70b9\uff0c\u5e76\u66ff\u6362\u6570\u636e\u5305\u7684\u6e90 IP \u4e3a\u8282\u70b9\u7684 IP\uff08\u5982\u524d\u9762\u7ae0\u8282\u6240\u8ff0\uff09\u3002<br \/>\n\u4f60\u53ef\u4ee5\u901a\u8fc7\u5728\u4e00\u4e2a loadbalancer \u4e0a\u66b4\u9732\u8fd9\u4e2a source-ip-app \u6765\u8fdb\u884c\u6d4b\u8bd5\u3002<\/p>\n<pre>kubectl expose deployment source-ip-app --name=loadbalancer --port=80 --target-port=8080 --type=LoadBalancer\n<\/pre>\n<p>\u8f93\u51fa\u7ed3\u679c\u4e3a\uff1a<\/p>\n<pre>service\/loadbalancer exposed\n<\/pre>\n<p>\u6253\u5370Service\u7684IPs\uff1a<\/p>\n<pre>kubectl get svc loadbalancer\n<\/pre>\n<p>\u8f93\u51fa\u7ed3\u679c\u4e0e\u4ee5\u4e0b\u7ed3\u679c\u7c7b\u4f3c\uff1a<\/p>\n<pre>NAME           TYPE           CLUSTER-IP    EXTERNAL-IP       PORT(S)   AGE\nloadbalancer   LoadBalancer   10.0.65.118   104.198.149.140   80\/TCP    5m\n<\/pre>\n<pre>curl 104.198.149.140\n<\/pre>\n<p>\u8f93\u51fa\u7ed3\u679c\u4e0e\u4ee5\u4e0b\u7ed3\u679c\u7c7b\u4f3c\uff1a<\/p>\n<pre>CLIENT VALUES:\nclient_address=10.240.0.5\n...\n<\/pre>\n<p>\u7136\u800c\uff0c\u5982\u679c\u4f60\u7684\u96c6\u7fa4\u8fd0\u884c\u5728 Google Kubernetes Engine\/GCE \u4e0a\uff0c\u53ef\u4ee5\u901a\u8fc7\u8bbe\u7f6e service.spec.externalTrafficPolicy \u5b57\u6bb5\u503c\u4e3a Local \uff0c\u6545\u610f\u5bfc\u81f4\u5065\u5eb7\u68c0\u67e5\u5931\u8d25\u6765\u5f3a\u5236\u4f7f\u6ca1\u6709 endpoints \u7684\u8282\u70b9\u628a\u81ea\u5df1\u4ece\u8d1f\u8f7d\u5747\u8861\u6d41\u91cf\u7684\u53ef\u9009\u8282\u70b9\u5217\u8868\u4e2d\u5220\u9664\u3002<br \/>\n\u7528\u56fe\u8868\u793a\uff1a<\/p>\n<pre>                      client\n                        |\n                      lb VIP\n                     \/ ^\n                    v \/\nhealth check ---&gt;   node 1   node 2 &lt;--- health check\n        200  &lt;---   ^ |             ---&gt; 500\n                    | V\n                 endpoint\n<\/pre>\n<p>\u4f60\u53ef\u4ee5\u8bbe\u7f6e annotation \u6765\u8fdb\u884c\u6d4b\u8bd5\uff1a<\/p>\n<pre>kubectl patch svc loadbalancer -p \\'{\\\"spec\\\":{\\\"externalTrafficPolicy\\\":\\\"Local\\\"}}\\'\n<\/pre>\n<p>\u4f60\u5e94\u8be5\u80fd\u591f\u7acb\u5373\u770b\u5230 Kubernetes \u5206\u914d\u7684\u00a0service.spec.healthCheckNodePort\u00a0\u5b57\u6bb5\uff1a<\/p>\n<pre>kubectl get svc loadbalancer -o yaml | grep -i healthCheckNodePort\n<\/pre>\n<p>\u8f93\u51fa\u7ed3\u679c\u4e0e\u4ee5\u4e0b\u7ed3\u679c\u7c7b\u4f3c\uff1a<\/p>\n<pre>  healthCheckNodePort: 32122\n<\/pre>\n<p>service.spec.healthCheckNodePort\u00a0\u5b57\u6bb5\u6307\u5411\u6bcf\u4e2a\u8282\u70b9\u5728\u00a0\/healthz\u00a0\u8def\u5f84\u4e0a\u63d0\u4f9b\u7684\u7528\u4e8e\u5065\u5eb7\u68c0\u67e5\u7684\u7aef\u53e3\u3002\u4f60\u53ef\u4ee5\u8fd9\u6837\u6d4b\u8bd5\uff1a<\/p>\n<pre>kubectl get pod -o wide -l run=source-ip-app\n<\/pre>\n<p>\u8f93\u51fa\u7ed3\u679c\u4e0e\u4ee5\u4e0b\u7ed3\u679c\u7c7b\u4f3c\uff1a<\/p>\n<pre>NAME                            READY     STATUS    RESTARTS   AGE       IP             NODE\nsource-ip-app-826191075-qehz4   1\/1       Running   0          20h       10.180.1.136   kubernetes-node-6jst\n<\/pre>\n<p>\u4f7f\u7528 curl \u547d\u4ee4\u53d1\u9001\u8bf7\u6c42\u5230\u6bcf\u4e2a\u8282\u70b9\u7684\u00a0\/healthz\u00a0\u8def\u5f84\u3002<\/p>\n<pre>kubernetes-node-6jst $ curl localhost:32122\/healthz\n<\/pre>\n<p>\u8f93\u51fa\u7ed3\u679c\u4e0e\u4ee5\u4e0b\u7ed3\u679c\u7c7b\u4f3c\uff1a<\/p>\n<pre>1 Service Endpoints found\n<\/pre>\n<pre>kubernetes-node-jj1t $ curl localhost:32122\/healthz\n<\/pre>\n<p>\u8f93\u51fa\u7ed3\u679c\u4e0e\u4ee5\u4e0b\u7ed3\u679c\u7c7b\u4f3c\uff1a<\/p>\n<pre>No Service Endpoints Found\n<\/pre>\n<p>\u4e3b\u8282\u70b9\u8fd0\u884c\u7684 service \u63a7\u5236\u5668\u8d1f\u8d23\u5206\u914d cloud loadbalancer\u3002\u5728\u8fd9\u6837\u505a\u7684\u540c\u65f6\uff0c\u5b83\u4e5f\u4f1a\u5206\u914d\u6307\u5411\u6bcf\u4e2a\u8282\u70b9\u7684 HTTP \u5065\u5eb7\u68c0\u67e5\u7684 port\/path\u3002\u7b49\u5f85\u5927\u7ea6 10 \u79d2\u949f\u4e4b\u540e\uff0c\u6ca1\u6709 endpoints \u7684\u4e24\u4e2a\u8282\u70b9\u7684\u5065\u5eb7\u68c0\u67e5\u4f1a\u5931\u8d25\uff0c\u7136\u540e curl \u8d1f\u8f7d\u5747\u8861\u5668\u7684 ip\uff1a<\/p>\n<pre>curl 104.198.149.140\n<\/pre>\n<p>\u8f93\u51fa\u7ed3\u679c\u4e0e\u4ee5\u4e0b\u7ed3\u679c\u7c7b\u4f3c\uff1a<\/p>\n<pre>CLIENT VALUES:\nclient_address=104.132.1.79\n...\n<\/pre>\n<p>\u8de8\u5e73\u53f0\u652f\u6301<br \/>\n\u4ece Kubernetes 1.5 \u5f00\u59cb\uff0c\u901a\u8fc7\u7c7b\u578b\u4e3a Type=LoadBalancer \u7684 Services \u8fdb\u884c\u6e90 IP \u4fdd\u5b58\u7684\u652f\u6301\u4ec5\u5728\u4e00\u90e8\u5206 cloudproviders \u4e2d\u5b9e\u73b0\uff08GCP and Azure\uff09\u3002\u4f60\u7684\u96c6\u7fa4\u8fd0\u884c\u7684 cloudprovider \u53ef\u80fd\u4ee5\u67d0\u4e9b\u4e0d\u540c\u7684\u65b9\u5f0f\u6ee1\u8db3 loadbalancer \u7684\u8981\u6c42\uff1a<\/p>\n<ol>\n<li>\u4f7f\u7528\u4e00\u4e2a\u4ee3\u7406\u7ec8\u6b62\u5ba2\u6237\u7aef\u8fde\u63a5\u5e76\u6253\u5f00\u4e00\u4e2a\u5230\u4f60\u7684 nodes\/endpoints \u7684\u65b0\u8fde\u63a5\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u6e90 IP \u5730\u5740\u5c06\u6c38\u8fdc\u662f\u4e91\u8d1f\u8f7d\u5747\u8861\u5668\u7684\u5730\u5740\u800c\u4e0d\u662f\u5ba2\u6237\u7aef\u7684\u3002<\/li>\n<li>\u4f7f\u7528\u4e00\u4e2a\u5305\u8f6c\u53d1\u5668\uff0c\u56e0\u6b64\u4ece\u5ba2\u6237\u7aef\u53d1\u9001\u5230\u8d1f\u8f7d\u5747\u8861\u5668 VIP \u7684\u8bf7\u6c42\u5728\u62e5\u6709\u5ba2\u6237\u7aef\u6e90 IP \u5730\u5740\u7684\u8282\u70b9\u7ec8\u6b62\uff0c\u800c\u4e0d\u88ab\u4e2d\u95f4\u4ee3\u7406\u3002<\/li>\n<\/ol>\n<p>\u7b2c\u4e00\u7c7b\u8d1f\u8f7d\u5747\u8861\u5668\u5fc5\u987b\u4f7f\u7528\u4e00\u79cd\u5b83\u548c\u540e\u7aef\u4e4b\u95f4\u7ea6\u5b9a\u7684\u534f\u8bae\u6765\u548c\u771f\u5b9e\u7684\u5ba2\u6237\u7aef IP \u901a\u4fe1\uff0c\u4f8b\u5982 HTTP\u00a0X-FORWARDED-FOR\u00a0\u5934\uff0c\u6216\u8005\u00a0proxy \u534f\u8bae\u3002 \u7b2c\u4e8c\u7c7b\u8d1f\u8f7d\u5747\u8861\u5668\u53ef\u4ee5\u901a\u8fc7\u7b80\u5355\u7684\u5728\u4fdd\u5b58\u4e8e Service \u7684\u00a0service.spec.healthCheckNodePort\u00a0\u5b57\u6bb5\u4e0a\u521b\u5efa\u4e00\u4e2a HTTP \u5065\u5eb7\u68c0\u67e5\u70b9\u6765\u4f7f\u7528\u4e0a\u9762\u63cf\u8ff0\u7684\u7279\u6027\u3002<\/p>\n<h2 id=\\\"\u6e05\u7406\u73b0\u573a\\\">\u6e05\u7406\u73b0\u573a<\/h2>\n<p>\u5220\u9664\u670d\u52a1\uff1a<\/p>\n<pre>$ kubectl delete svc -l run=source-ip-app\n<\/pre>\n<p>\u5220\u9664 Deployment\u3001ReplicaSet \u548c Pod\uff1a<\/p>\n<pre>$ kubectl delete deployment source-ip-app<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u4f7f\u7528 Source IP Kubernetes \u96c6\u7fa4\u4e2d\u8fd0\u884c\u7684\u5e94\u7528\u901a\u8fc7 Service \u62bd\u8c61\u6765\u4e92\u76f8\u67e5\u627e\u3001\u901a\u4fe1\u548c\u4e0e &hellip;<\/p>\n<p class=\"read-more\"> <a class=\"\" href=\"http:\/\/www.weijing.co\/?p=1646\"> <span class=\"screen-reader-text\">kubernetes\u4f7f\u7528Source IP<\/span> \u67e5\u770b\u5168\u6587 &raquo;<\/a><\/p>\n","protected":false},"author":4,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"default","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"default","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":""},"categories":[104,123],"tags":[],"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false,"mailpoet_newsletter_max":false,"woocommerce_thumbnail":false,"woocommerce_single":false,"woocommerce_gallery_thumbnail":false,"shop_catalog":false,"shop_single":false,"shop_thumbnail":false},"uagb_author_info":{"display_name":"weijing","author_link":"http:\/\/www.weijing.co\/?author=4"},"uagb_comment_info":0,"uagb_excerpt":"\u4f7f\u7528 Source IP Kubernetes \u96c6\u7fa4\u4e2d\u8fd0\u884c\u7684\u5e94\u7528\u901a\u8fc7 Service \u62bd\u8c61\u6765\u4e92\u76f8\u67e5\u627e\u3001\u901a\u4fe1\u548c\u4e0e&hellip;","_links":{"self":[{"href":"http:\/\/www.weijing.co\/index.php?rest_route=\/wp\/v2\/posts\/1646"}],"collection":[{"href":"http:\/\/www.weijing.co\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.weijing.co\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.weijing.co\/index.php?rest_route=\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"http:\/\/www.weijing.co\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1646"}],"version-history":[{"count":0,"href":"http:\/\/www.weijing.co\/index.php?rest_route=\/wp\/v2\/posts\/1646\/revisions"}],"wp:attachment":[{"href":"http:\/\/www.weijing.co\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1646"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.weijing.co\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1646"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.weijing.co\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1646"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}