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
posted @ 2025-04-09 21:33  丁志岩  阅读(31)  评论(0)    收藏  举报