kubernetes 官网
https://kubernetes.io/zh-cn/docs/concepts/services-networking/service-traffic-policy/
k8s Service Internal Traffic Policy(服务内部流量策略)
最近整理k8s相关知识的时候在官网看见了这个服务内部流量策略,所以用自己的k8s 环境浅试一下到底怎么个事。
k8s 官网说我们可以通过将 Service 的 .spec.internalTrafficPolicy
项设置为 Local
, 来为它指定一个内部专用的流量策略。 此设置就相当于告诉 kube-proxy 对于集群内部流量只能使用节点本地的服务端口。
创建测试环境
kubectl create deployment web --image=nginx -n test --port=8080 --dry-run=client -o yaml > nginx.yaml
让pod 运行在node01 上
给node 打上lable
kubectl label nodes k8s-node01 name=node01
kubectl label nodes k8s-node02 name=node02
kubectl get node --show-labels
编辑deployment 加nodeSelector 让其调度到node01 上
root@k8s-master:~# cat nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: web
name: web
namespace: test
spec:
replicas: 1
selector:
matchLabels:
app: web
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: web
spec:
nodeSelector:
name: node01
containers:
- image: nginx
name: nginx
ports:
- containerPort: 80
resources: {}
status: {}
改一下nginx index.html 内容
kubectl exec -it -n test web-6bbb9dc4c6-5fg5v -- bash
echo 'hello' > /usr/share/nginx/html/index.html
root@k8s-master:~# curl http://10.244.85.195
hello
root@k8s-master:~#
依此在两个node 上curl 均有结果
将deployment expose 成svc
kubectl expose deployment -n test web --port=8080 --target-port=80 --protocol=TCP --dry-run=client -o yaml > nginx-svc.yaml
使用 `internalTrafficPolicy: Local`
root@k8s-master:~# cat nginx-svc.yaml
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
labels:
app: web
name: web
namespace: test
spec:
ports:
- port: 80
protocol: TCP
targetPort: 8080
selector:
app: web
internalTrafficPolicy: Local
status:
loadBalancer: {}
root@k8s-master:~#kubectl create -f nginx-svc.yaml
root@k8s-master:~#kubectl get svc -n test web
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
web ClusterIP 10.99.246.160 <none> 8080/TCP 10s
在node01 可以直接curl 出hello,但是在master 和node02 无法curl 通
root@k8s-node01:/var/lib/kubelet/pki# curl http://10.99.246.160:8080
hello
**工作原理**
- kube-proxy 基于 spec.internalTrafficPolicy 的设置来过滤路由的目标服务端点。 当它的值设为 Local 时,只会选择节点本地的服务端点。 当它的值设为 Cluster 或缺省时,Kubernetes 会选择所有的服务端点。
`kubectl edit -n test service web ` 将 `internalTrafficPolicy: Local` 改成Cluster 之后所有节点都可以可以curl 通nginx.