k8s-Pod中的網絡通信(3)
部署的pod都會涉及到和內外網絡通信,我們部署的pod 有一個ip,這個IP 是集群內部的IP ,只能在集群內被訪問,k8s中pod的網路通信是交給service來管理的,簡稱svc。負責將外部流量引入,和內部流量引出。
1.外部流量訪問內部
我們pod部署的時候是有一個標簽label的,service在創建的時候也會指定一個標簽,這樣就可以把對應label的pod關聯起來,podIP+端口形成一個端點-ednpoint,service也有自己的IP和端口,service的端口和宿主機的端口通過NodePort形成映射,這樣訪問宿主機的端口就能訪問到service,service再轉發到對應的pod上。
service的這能力都是kude-proxy來實現的(部署k8s的時候對應的有一個kube-proxy:v1.28.15鏡像)。kude-proxy最終會把這這些映射規則轉化成iptables規則,來完成流量的轉發。

創建service的方式
命令:expose
清單文件:apply -f 文件
kubectl expose deployment my-nginx-deploment --port=8001 --target-port=80 --type=NodePort
創建一個service將流量引入到my-nginx-deploment部署的pod上,
--port是service暴露的端口,
--target-port是背后實際應用容器的端口,我們部署的nginx是80端口
--type=NodePort 映射到宿主機端口 取值有這幾個 ClusterIP, NodePort, LoadBalancer, or ExternalName. Default is 'ClusterIP'.
kubectl expose deployment my-nginx-deploment --port=8001 --target-port=80 --type=NodePort --dry-run=client -o yaml > my-nginx-svc.yaml

apply -f my-nginx-svc.yaml
kubectl get svc 查看service
kubectl describe svc my-nginx-deploment 查看詳細的信息

啟了一個service 給svc分配的ip是 10.108.229.67 這個IP 也是集群內部的IP,端口8001,指向了10.244.2.6:80,
在集群其他節點可以訪問這個地址curl 10.104.212.94:8001 也能訪問我們之前啟動的nginx
集群外部訪問的話就需要用到NodePort暴露的端口
任意node宿主機節點IP:NodePort暴露的端口
我的是
192.168.255.102:31101
192.168.255.103:31101
都可以訪問到我們部署k8s里面的nginx了

2.內部訪問外部:
pod——service——endpoint——外部服務
外部訪問內部的時候endpoint 是pod的IP和端口,k8s自己可以知道是啥,內部訪問外部的,走出去的時候K8s就不知道關聯外部的endpoint了,這就需要手工配置endpoint了

我在vmware宿主機 IP:192.168.255.1 上面部署一個nginx:

創建資源清單文件:out-ng.yaml 內容如下
apiVersion: v1 kind: Service metadata: name: out-ng spec: ports: - port: 80 targetPort: 80 # 注意:沒有 selector! --- apiVersion: v1 kind: Endpoints # 手動配置的端點 metadata: name: out-ng # 必須和 Service 同名! subsets: - addresses: - ip: 192.168.255.1 # 外部服務的 IP ports: - port: 80
kubectl apply -f out-ng.yaml

分配給service 的ip是 10.107.74.203 對應端點的是192.168.255.1:80
進入我們之前的pod里面,再訪問service 的ip,就能看到訪問到了我們外面機器部署的nginx
kubectl exec my-nginx-deploment-799c59bc4d-nkgbc -it -- /bin/bash
curl 10.107.74.203

我們現在建了兩個svc,內部訪問外部和外部訪問內部是不同的svc負責。

浙公網安備 33010602011771號