14-svc的底层实现之kube-proxy的代理模式
一、kube-proxy组件代理模式
对于kube-proxy组件的作用就是为k8s集群外部或内部用户提供访问服务的路由。
kube-proxy监听K8S APIServer,一旦service资源发生变化,kube-proxy就会生成对应的负载调度的调整,这样就保证service的最新状态。
1.kube-proxy有三种调度模型
- userspace:
k8s 1.1之前。
- iptables:
k8s 1.2 ~ k8s 1.11之前。
- ipvs:
K8S 1.11之后,如果没有开启ipvs,则自动降级为iptables。
2.iptables与ipvs对比
相同点:
都工作在内核空间;
不同点:
iptables:
优点:
灵活,功能强大,可以在数据包不同阶段进行操作。
缺点:
表中规则过多时,响应变慢,即规则遍历匹配和更新,呈线性时延。
换句话说,时间复杂度为: O(N)
ipvs:
优点:
转发效率高,调度算法丰富,支持rr,wrr,lc,wlc,ip hash等。
缺点:
内核支持不全,低版本内核不能使用,需要升级到4.9+内核。
二、验证kube-proxy组件的默认工作模式
#查看指定标签下的资源的列表
[root@master231 ns]# kubectl get pods -n kube-system -l k8s-app=kube-proxy -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
kube-proxy-mlmf4 1/1 Running 3 (25h ago) 2d 10.0.0.231 master231 <none> <none>
kube-proxy-r9vhl 1/1 Running 1 (47h ago) 2d 10.0.0.232 worker232 <none> <none>
kube-proxy-w2qd4 1/1 Running 1 (47h ago) 2d 10.0.0.233 worker233 <none> <none>
#查看指定名称空间的日志信息,发现使用的是iptables
[root@master231 ns]# kubectl -n kube-system logs kube-proxy-w2qd4
I0407 04:15:58.736947 1 node.go:163] Successfully retrieved node IP: 10.0.0.233
I0407 04:15:58.737151 1 server_others.go:138] "Detected node IP" address="10.0.0.233"
I0407 04:15:58.737445 1 server_others.go:572] "Unknown proxy mode, assuming iptables proxy" proxyMode=""
I0407 04:15:58.808793 1 server_others.go:206] "Using iptables Proxier"
三、修改kube-proxy的代理模式
[root@master231 namespace]# kubectl get configmap kube-proxy -n kube-system -o yaml | \
sed -e "s/strictARP: false/strictARP: true/" | \
sed -e 's#mode: ""#mode: "ipvs"#' | \
kubectl apply -f - -n kube-system
四、配置生效
1.让Pod重新启动
[root@master231 ns]# kubectl delete pods -n kube-system -l k8s-app=kube-proxy
pod "kube-proxy-mlmf4" deleted
pod "kube-proxy-r9vhl" deleted
pod "kube-proxy-w2qd4" deleted
[root@master231 ns]# kubectl get pods -n kube-system -l k8s-app=kube-proxy -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
kube-proxy-7v7pq 1/1 Running 0 5s 10.0.0.233 worker233 <none> <none>
kube-proxy-czdnp 1/1 Running 0 5s 10.0.0.231 master231 <none> <none>
kube-proxy-dpxc5 1/1 Running 0 6s 10.0.0.232 worker232 <none> <none>
2.查看kube-proxy组件的日志信息
#使用了ipvs
[root@master231 ns]# kubectl -n kube-system logs kube-proxy-dpxc5
I0409 03:51:00.452447 1 node.go:163] Successfully retrieved node IP: 10.0.0.232
I0409 03:51:00.452514 1 server_others.go:138] "Detected node IP" address="10.0.0.232"
I0409 03:51:00.481318 1 server_others.go:269] "Using ipvs Proxier"
五、验证测试
1.下载必备软件包
[root@master231 ns]# apt -y install ipvsadm
2.查看指定名称空间详细信息
[root@master231 ns]# kubectl get svc -n kube-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kube-dns ClusterIP 10.200.0.10 <none> 53/UDP,53/TCP,9153/TCP 2d
[root@master231 ns]# kubectl describe svc -n kube-system
Name: kube-dns
Namespace: kube-system
Labels: k8s-app=kube-dns
kubernetes.io/cluster-service=true
kubernetes.io/name=CoreDNS
Annotations: prometheus.io/port: 9153
prometheus.io/scrape: true
Selector: k8s-app=kube-dns
Type: ClusterIP
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.200.0.10
IPs: 10.200.0.10
Port: dns 53/UDP
TargetPort: 53/UDP
Endpoints: 10.100.160.146:53,10.100.160.148:53
Port: dns-tcp 53/TCP
TargetPort: 53/TCP
Endpoints: 10.100.160.146:53,10.100.160.148:53
Port: metrics 9153/TCP
TargetPort: 9153/TCP
Endpoints: 10.100.160.146:9153,10.100.160.148:9153
Session Affinity: None
Events: <none>
3.使用ipvsadm查看
[root@master231 ns]# ipvsadm -ln | grep 10.200.0.10 -A 2
TCP 10.200.0.10:53 rr
-> 10.100.160.146:53 Masq 1 0 0
-> 10.100.160.148:53 Masq 1 0 0
TCP 10.200.0.10:9153 rr
-> 10.100.160.146:9153 Masq 1 0 0
-> 10.100.160.148:9153 Masq 1 0 0
--
UDP 10.200.0.10:53 rr
-> 10.100.160.146:53 Masq 1 0 0
-> 10.100.160.148:53 Masq 1 0 0
本文来自博客园,作者:丁志岩,转载请注明原文链接:https://www.cnblogs.com/dezyan/p/18817401

浙公网安备 33010602011771号