容器技术
ubuntu使用APT安装docker并指定版本
Helm部署与使用
Helm常用命令
从Helm仓库创建应用流程示例
Helm部署与使用
K8S中部署mysql-ha高可用集群
helm启动mysql-ha
helm几个常用仓库
Kubernetes使用helm部署Mysql-Ha
k8s入门:Helm 构建 MySQL
docker批量修改tag(批量push)
k8s之yaml文件详解
将 MySQL 通过 bitpoke/mysql-operator 部署到 k8s 内部
k8s pvc扩容:pvc创建后扩容
K8S性能分析
部署Metrics Server
Kubernetes集群搭建
kubespray 部署常见问题和优化汇总
kubernetes-sigs/kubespray at release-2.15
K8S-pod配置文件详解
KubeSphere知识库
在 Kubernetes 上最小化安装 KubeSphere
卸载 KubeSphere 和 Kubernetes
KubeSphere 应用商店
修改pod中容器的时区
k8s之Pod安全策略
Harbor 登陆失败,用户名或者密码不正确。405 Not Allowed
Docker-leanote_n1
kubesphere/kubekey
Kubernetes Static Pod (静态Pod)
kubernets kube-proxy的代理 iptables和ipvs - 30岁再次出发 - 博客园
k8s生产实践之获取客户端真实IP - SSgeek - 博客园
kube-proxy ip-tables故障解决
k8s入门:Helm 构建 MySQL
docker批量修改tag(批量push)
prometheus operator 监控redis-exporter
Helm3 安装 ElasticSearch & Kibana 7.x 版本
kubernete强力删除namespace_redis删除namespace命令
EFK (Elasticsearch + Fluentd + Kibana) 日志分析系统
k8s日志收集实战(无坑)
fluentd收集k8s集群pod日志
Elasticsearch+Fluentd+Kibana 日志收集系统的搭建
TKE/EKS之configmap,secret只读挂载
K8s基于Reloader的ConfigMap/Secret热更新
使用 Reloader 实现热部署_k8s reloader
k8s使用Reloader实现更新configmap后自动重启pod
在 Kubernetes 上对 gRPC 服务器进行健康检查 | Kubernetes
Kubernetes ( k8s ) gRPC服务 健康检查 ( livenessProbe ) 与 就绪检查 ( readinessProbe )
排查kubernetes中高磁盘占用pod
helm 安装 MongoDB 集群
helm 安装 Redis 1 主 2 从 3哨兵
【k8s】使用 Reloader 实现热部署
k8s证书过期,更新后kubelet启动失败
kubeadm证书/etcd证书过期处理
三种监控 Kubernetes 集群证书过期方案
K8s 集群(kubeadm) CA 证书过期解决方案
k8s调度、污点、容忍、不可调度、排水、数据卷挂载
5分钟搞懂K8S的污点和容忍度(理论+实战)
Kubernetes进阶-8基于Istio实现微服务治理
macvlan案例配置
快速解决Dockerhub镜像站无法访问问题
info_scan开源漏洞扫描主系统部署
本文档使用 MrDoc 发布
-
+
首页
kubernets kube-proxy的代理 iptables和ipvs - 30岁再次出发 - 博客园
service 的代理是 kube-proxy kube-proxy 运行在所有节点上,它监听 apiserver 中 service 和 endpoint 的变化情况,创建路由规则以提供服务 IP 和负载均衡功能。简单理解此进程是Service的透明代理兼负载均衡器,其核心功能是将到某个Service的访问请求转发到后端的多个Pod实例上,而kube-proxy底层又是通过iptables和ipvs实现的。 ### iptables原理 Kubernetes从1.2版本开始,将iptables作为kube-proxy的默认模式。iptables模式下的kube-proxy不再起到Proxy的作用,其核心功能:通过API Server的Watch接口实时跟踪Service与Endpoint的变更信息,并更新对应的iptables规则,Client的请求流量则通过iptables的NAT机制“直接路由”到目标Pod。 ### ipvs原理 IPVS在Kubernetes1.11中升级为GA稳定版。IPVS则专门用于高性能负载均衡,并使用更高效的数据结构(Hash表),允许几乎无限的规模扩张,因此被kube-proxy采纳为最新模式。 在IPVS模式下,使用iptables的扩展ipset,而不是直接调用iptables来生成规则链。iptables规则链是一个线性的数据结构,ipset则引入了带索引的数据结构,因此当规则很多时,也可以很高效地查找和匹配。 可以将ipset简单理解为一个IP(段)的集合,这个集合的内容可以是IP地址、IP网段、端口等,iptables可以直接添加规则对这个“可变的集合”进行操作,这样做的好处在于可以大大减少iptables规则的数量,从而减少性能损耗。 ### kube-proxy ipvs和iptables的异同 iptables与IPVS都是基于Netfilter实现的,但因为定位不同,二者有着本质的差别:iptables是为防火墙而设计的;IPVS则专门用于高性能负载均衡,并使用更高效的数据结构(Hash表),允许几乎无限的规模扩张。 与iptables相比,IPVS拥有以下明显优势: - 为大型集群提供了更好的可扩展性和性能; - 支持比iptables更复杂的复制均衡算法(最小负载、最少连接、加权等); - 支持服务器健康检查和连接重试等功能; - 可以动态修改ipset的集合,即使iptables的规则正在使用这个集合。  ### 二、k8s集群中分析service和kube-proxy  **访问Service的请求,不论是Cluster IP+TargetPort的方式;还是用Node节点IP+NodePort的方式,都被Node节点的Iptables规则重定向到Kube-proxy监听Service服务代理端口。kube-proxy接收到Service的访问请求后,根据负载策略,转发到后端的Pod。** \# kubectl logs kube-proxy-5clwf -n kube-system (查看某一个节点的kube-proxy日志) <table><tbody><tr><td class="gutter"><p class="line">1</p><p class="line">2</p><p class="line">3</p><p class="line">4</p><p class="line">5</p></td><td class="code"><div class="container"><p class="line"><code class="cpp plain">W1014 13:25:02.120810 1 server_others.go:559] Unknown proxy mode</code><code class="cpp string">""</code><code class="cpp plain">, assuming iptables proxy</code></p><p class="line"><code class="cpp plain">I1014 13:25:02.137813 1 node.go:136] Successfully retrieved node IP: 192.168.40.133</code></p><p class="line"><code class="cpp plain">I1014 13:25:02.137952 1 server_others.go:186] Using iptables Proxier.</code></p><p class="line"><code class="cpp plain">I1014 13:25:02.138750 1 server.go:583] Version: v1.18.0</code></p><p class="line"><code class="cpp plain">I1014 13:25:02.139344 1 conntrack.go:100] Set sysctl</code><code class="cpp string">'net/netfilter/nf_conntrack_max'</code> <code class="cpp plain">to 131072</code></p></div></td></tr></tbody></table> \# iptables -vnL 查看所有的规则 <table><tbody><tr><td class="gutter"><p class="line">1</p><p class="line">2</p><p class="line">3</p><p class="line">4</p><p class="line">5</p><p class="line">6</p></td><td class="code"><div class="container"><p class="line"><code class="cpp plain">Chain INPUT (policy ACCEPT 19577 packets, 3755K bytes)</code></p><p class="line"><code class="cpp spaces"> </code><code class="cpp plain">pkts bytes target prot opt in out source destination </code></p><p class="line"><code class="cpp spaces"> </code><code class="cpp plain">622K 121M cali-INPUT all -- * * 0.0.0.0/0 0.0.0.0/0 </code></p><p class="line"><code class="cpp spaces"> </code><code class="cpp plain">3017 162K KUBE-SERVICES all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate NEW</code></p><p class="line"><code class="cpp spaces"> </code><code class="cpp plain">3017 162K KUBE-EXTERNAL-SERVICES all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate NEW</code></p><p class="line"><code class="cpp spaces"> </code><code class="cpp plain">652K 140M KUBE-FIREWALL all -- * * 0.0.0.0/0 0.0.0.0/0 </code></p></div></td></tr></tbody></table> \# iptables-save > iptables 保存规则,并输出到屏幕 <table><tbody><tr><td class="gutter"><p class="line">1</p><p class="line">2</p><p class="line">3</p><p class="line">4</p><p class="line">5</p><p class="line">6</p></td><td class="code"><div class="container"><p class="line"><code class="cpp plain">:cali-OUTPUT - [0:0]</code></p><p class="line"><code class="cpp plain">:cali-PREROUTING - [0:0]</code></p><p class="line"><code class="cpp plain">:cali-from-host-endpoint - [0:0]</code></p><p class="line"><code class="cpp plain">:cali-to-host-endpoint - [0:0]</code></p><p class="line"><code class="cpp plain">-A PREROUTING -m comment --comment</code><code class="cpp string">"cali:6gwbT8clXdHdC1b1"</code> <code class="cpp plain">-j cali-PREROUTING</code></p><p class="line"><code class="cpp plain">-A OUTPUT -m comment --comment</code><code class="cpp string">"cali:tVnHkvAo15HuiPy0"</code> <code class="cpp plain">-j cali-OUTPUT</code></p></div></td></tr></tbody></table> 第一步:接收流量 NodePort访问入口规则: <table><tbody><tr><td class="gutter"><p class="line">1</p><p class="line">2</p><p class="line">3</p><p class="line">4</p><p class="line">5</p><p class="line">6</p><p class="line">7</p><p class="line">8</p><p class="line">9</p><p class="line">10</p><p class="line">11</p></td><td class="code"><div class="container"><p class="line"><code class="cpp preprocessor"># kubectl get svc</code></p><p class="line"><code class="cpp plain">NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE</code></p><p class="line"><code class="cpp plain">kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 78d</code></p><p class="line"><code class="cpp plain">mydb ClusterIP 10.108.118.149 <none> 80/TCP 50d</code></p><p class="line"><code class="cpp plain">nginx-dns NodePort 10.103.206.148 <none> 80:30296/TCP 49d</code></p><p class="line"><code class="cpp plain">web-service NodePort 10.111.113.171 <none> 80:32681/TCP 49d</code></p><p class="line"><code class="cpp plain">web1 NodePort 10.110.180.143 <none> 80:30746/TCP 12h</code></p><p class="line"><code class="cpp preprocessor"># iptables -S -t nat | grep 30746</code></p><p class="line"><code class="cpp plain">-A KUBE-NODEPORTS -p tcp -m comment --comment</code><code class="cpp string">"default/web1:"</code> <code class="cpp plain">-m tcp --dport 30746 -j KUBE-MARK-MASQ</code></p><p class="line"><code class="cpp plain">-A KUBE-NODEPORTS -p tcp -m comment --comment</code><code class="cpp string">"default/web1:"</code> <code class="cpp plain">-m tcp --dport 30746 -j KUBE-SVC-7YBM6NGNJ6RVLVXL</code></p></div></td></tr></tbody></table> CLUSTER-IP 访问入口规则: <table><tbody><tr><td class="gutter"><p class="line">1</p><p class="line">2</p><p class="line">3</p></td><td class="code"><div class="container"><p class="line"><code class="cpp preprocessor"># iptables -S -t nat | grep 10.110.180.143 (cluster IP)</code></p><p class="line"><code class="cpp plain">-A KUBE-SERVICES ! -s 10.244.0.0/16 -d 10.110.180.143/32 -p tcp -m comment --comment</code><code class="cpp string">"default/web1: cluster IP"</code> <code class="cpp plain">-m tcp --dport 80 -j KUBE-MARK-MASQ</code></p><p class="line"><code class="cpp plain">-A KUBE-SERVICES -d 10.110.180.143/32 -p tcp -m comment --comment</code><code class="cpp string">"default/web1: cluster IP"</code> <code class="cpp plain">-m tcp --dport 80 -j KUBE-SVC-7YBM6NGNJ6RVLVXL</code></p></div></td></tr></tbody></table> 第二步:按概率(probability)分配 (web1有3个pod副本,负载规则如下) <table><tbody><tr><td class="gutter"><p class="line">1</p><p class="line">2</p><p class="line">3</p><p class="line">4</p><p class="line">5</p><p class="line">6</p><p class="line">7</p></td><td class="code"><div class="container"><p class="line"><code class="cpp preprocessor"># iptables -S -t nat | grep KUBE-SVC-7YBM6NGNJ6RVLVXL</code></p><p class="line"><code class="cpp plain">-N KUBE-SVC-7YBM6NGNJ6RVLVXL</code></p><p class="line"><code class="cpp plain">-A KUBE-NODEPORTS -p tcp -m comment --comment</code><code class="cpp string">"default/web1:"</code> <code class="cpp plain">-m tcp --dport 30746 -j KUBE-SVC-7YBM6NGNJ6RVLVXL</code></p><p class="line"><code class="cpp plain">-A KUBE-SERVICES -d 10.110.180.143/32 -p tcp -m comment --comment</code><code class="cpp string">"default/web1: cluster IP"</code> <code class="cpp plain">-m tcp --dport 80 -j KUBE-SVC-7YBM6NGNJ6RVLVXL</code></p><p class="line"><code class="cpp plain">-A KUBE-SVC-7YBM6NGNJ6RVLVXL -m comment --comment</code><code class="cpp string">"default/web1:"</code> <code class="cpp plain">-m statistic --mode random --probability 0.33333333349 -j KUBE-SEP-IXSCGLPBJ6ROUJNA</code></p><p class="line"><code class="cpp plain">-A KUBE-SVC-7YBM6NGNJ6RVLVXL -m comment --comment</code><code class="cpp string">"default/web1:"</code> <code class="cpp plain">-m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-5MMDFR2YQS26JCDP (概论大,因为有两个pod在同一节点)</code></p><p class="line"><code class="cpp plain">-A KUBE-SVC-7YBM6NGNJ6RVLVXL -m comment --comment</code><code class="cpp string">"default/web1:"</code> <code class="cpp plain">-j KUBE-SEP-DHYUVI6YLCFCEZBW</code></p></div></td></tr></tbody></table> 第三步:根据分配转发到实际pod中 <table><tbody><tr><td class="gutter"><p class="line">1</p><p class="line">2</p><p class="line">3</p><p class="line">4</p><p class="line">5</p><p class="line">6</p><p class="line">7</p><p class="line">8</p><p class="line">9</p><p class="line">10</p><p class="line">11</p><p class="line">12</p></td><td class="code"><div class="container"><p class="line"><code class="cpp preprocessor"># kubectl get ep</code></p><p class="line"><code class="cpp plain">NAME ENDPOINTS AGE</code></p><p class="line"><code class="cpp plain">kubernetes 192.168.40.132:6443 78d</code></p><p class="line"><code class="cpp plain">nginx-dns 10.244.166.145:80 49d</code></p><p class="line"><code class="cpp plain">web-service 10.244.166.139:80 49d</code></p><p class="line"><code class="cpp plain">web1 10.244.104.9:80,10.244.166.140:80,10.244.166.146:80 12h</code></p><p class="line"><code class="cpp preprocessor"># iptables -S -t nat | grep KUBE-SEP-5MMDFR2YQS26JCDP</code></p><p class="line"><code class="cpp plain">-N KUBE-SEP-5MMDFR2YQS26JCDP</code></p><p class="line"><code class="cpp plain">-A KUBE-SEP-5MMDFR2YQS26JCDP -s 10.244.166.140/32 -m comment --comment</code><code class="cpp string">"default/web1:"</code> <code class="cpp plain">-j KUBE-MARK-MASQ</code></p><p class="line"><code class="cpp plain">-A KUBE-SEP-5MMDFR2YQS26JCDP -p tcp -m comment --comment</code><code class="cpp string">"default/web1:"</code> <code class="cpp plain">-m tcp -j DNAT --to-destination 10.244.166.140:80(ep,到达某一节点的具体pod中)</code></p><p class="line"><code class="cpp plain">-A KUBE-SVC-7YBM6NGNJ6RVLVXL -m comment --comment</code><code class="cpp string">"default/web1:"</code> <code class="cpp plain">-m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-5MMDFR2YQS26JCDP</code></p></div></td></tr></tbody></table> ### 三、kube-proxy 工作原理 kube-proxy当前实现了三种代理模式:userspace, iptables, ipvs (1)userspace mode: userspace是在用户空间,通过kube-proxy来实现service的代理服务 (2)iptables mode, 该模式完全利用内核iptables来实现service的代理和LB, 这是K8s在v1.2及之后版本默认模式  API Server 对内(集群中的其他组件)和对外(用户)提供统一的 REST API,其他组件均通过 API Server 进行通信 Controller Manager、Scheduler、Kube-proxy 和 Kubelet 等均通过 API Server watch API 监测资源变化情况,并对资源作相应的操作 (3)ipvs mode. 在kubernetes 1.8以上的版本中,对于kube-proxy组件增加了除iptables模式和用户模式之外还支持ipvs模式。 kube-proxy ipvs 是基于 NAT 实现的,通过ipvs的NAT模式,对访问k8s service的请求进行虚IP到POD IP的转发。当创建一个 service 后,kubernetes 会在每个节点上创建一个网卡,同时帮你将 Service IP(VIP) 绑定上,此时相当于每个 Node 都是一个 ds,而其他任何 Node 上的 Pod,甚至是宿主机服务(比如 kube-apiserver 的 6443)都可能成为 rs; 与iptables、userspace 模式一样,kube-proxy 依然监听Service以及Endpoints对象的变化, 不过它并不创建反向代理, 也不创建大量的 iptables 规则, 而是通过netlink 创建ipvs规则,并使用k8s Service与Endpoints信息,对所在节点的ipvs规则进行定期同步; netlink 与 iptables 底层都是基于 netfilter 钩子,但是 netlink 由于采用了 hash table 而且直接工作在内核态,在性能上比 iptables 更优。其工作流程大体如下:  **k8s的service和endpoine是如何关联和相互影响的?**1、 api-server创建service对象,与service绑定的pod地址:称之为endpoints(kubectl get ep可以查看) 2、服务发现方面:kube-proxy监控service后端endpoint的动态变化,并且维护service和endpoint的映射关系 #### kubernetes服务注册(dns),服务发现是service http://www.dockone.io/article/9936 有详细讲解 Kubernetes提供了两种方式进行服务发现, 即环境变量和DNS (1)**环境变量**: 当你创建一个Pod的时候,kubelet会在该Pod中注入集群内所有Service的相关环境变量。**需要注意:** 要想一个Pod中注入某个Service的环境变量,则必须Service要先比该Pod创建。这一点,几乎使得这种方式进行服务发现不可用。比如,一个ServiceName为redis-master的Service,对应的ClusterIP:Port为172.16.50.11:6379,则其对应的环境变量为: <table><tbody><tr><td class="gutter"><p class="line">1</p><p class="line">2</p><p class="line">3</p><p class="line">4</p><p class="line">5</p><p class="line">6</p><p class="line">7</p></td><td class="code"><div class="container"><p class="line"><code class="cpp plain">REDIS_MASTER_SERVICE_HOST=172.16.50.11</code></p><p class="line"><code class="cpp plain">REDIS_MASTER_SERVICE_PORT=6379</code></p><p class="line"><code class="cpp plain">REDIS_MASTER_PORT=tcp:</code></p><p class="line"><code class="cpp plain">REDIS_MASTER_PORT_6379_TCP=tcp:</code></p><p class="line"><code class="cpp plain">REDIS_MASTER_PORT_6379_TCP_PROTO=tcp</code></p><p class="line"><code class="cpp plain">REDIS_MASTER_PORT_6379_TCP_PORT=6379</code></p><p class="line"><code class="cpp plain">REDIS_MASTER_PORT_6379_TCP_ADDR=172.16.50.11</code></p></div></td></tr></tbody></table> (2)**DNS**:这是k8s官方强烈推荐的方式!!! 可以通过cluster add-on方式轻松的创建KubeDNS来对集群内的Service进行服务发现。 ### 四、修改kube-proxy模式为ipvs(默认为iptables) 1、加载内核模块 \# lsmod | grep ip\_vs <table><tbody><tr><td class="gutter"><p class="line">1</p><p class="line">2</p><p class="line">3</p><p class="line">4</p><p class="line">5</p><p class="line">6</p></td><td class="code"><div class="container"><p class="line"><code class="cpp plain">ip_vs_sh 12688 0</code></p><p class="line"><code class="cpp plain">ip_vs_wrr 12697 0</code></p><p class="line"><code class="cpp plain">ip_vs_rr 12600 0</code></p><p class="line"><code class="cpp plain">ip_vs 145497 6 ip_vs_rr,ip_vs_sh,ip_vs_wrr</code></p><p class="line"><code class="cpp plain">nf_conntrack 139264 7 ip_vs,nf_nat,nf_nat_ipv4,xt_conntrack,nf_nat_masquerade_ipv4,nf_conntrack_netlink,nf_conntrack_ipv4</code></p><p class="line"><code class="cpp plain">libcrc32c 12644 4 xfs,ip_vs,nf_nat,nf_conntrack</code></p></div></td></tr></tbody></table> 2、升级内核模块,ipvs对内核版本有要求 3、查看kube-proxy组件 <table><tbody><tr><td class="gutter"><p class="line">1</p><p class="line">2</p><p class="line">3</p><p class="line">4</p><p class="line">5</p><p class="line">6</p><p class="line">7</p></td><td class="code"><div class="container"><p class="line"><code class="cpp preprocessor"># kubectl get pod -n kube-system </code></p><p class="line"><code class="cpp plain">NAME READY STATUS RESTARTS AGE</code></p><p class="line"><code class="cpp plain">kube-proxy-5clwf 1/1 Running 29 78d</code></p><p class="line"><code class="cpp plain">kube-proxy-ht25x 1/1 Running 30 78d</code></p><p class="line"><code class="cpp plain">kube-proxy-x9ml8 1/1 Running 30 78d</code></p><p class="line"><code class="cpp plain">kube-scheduler-master 1/1 Running 49 78d</code></p><p class="line"><code class="cpp plain">metrics-server-584b5f4754-7vlhm 1/1 Running 56 78d</code></p></div></td></tr></tbody></table> 4、产看kube-proxy的配置文件configmaps <table><tbody><tr><td class="gutter"><p class="line">1</p><p class="line">2</p><p class="line">3</p><p class="line">4</p><p class="line">5</p><p class="line">6</p><p class="line">7</p><p class="line">8</p></td><td class="code"><div class="container"><p class="line"><code class="cpp preprocessor"># kubectl get configmaps -n kube-system </code></p><p class="line"><code class="cpp plain">NAME DATA AGE</code></p><p class="line"><code class="cpp plain">calico-config 4 78d</code></p><p class="line"><code class="cpp plain">coredns 1 78d</code></p><p class="line"><code class="cpp plain">extension-apiserver-authentication 6 78d</code></p><p class="line"><code class="cpp plain">kube-proxy 2 78d</code></p><p class="line"><code class="cpp plain">kubeadm-config 2 78d</code></p><p class="line"><code class="cpp plain">kubelet-config-1.18 1 78d</code></p></div></td></tr></tbody></table> 5、编辑kube-proxy的configmaps <table><tbody><tr><td class="gutter"><p class="line">1</p><p class="line">2</p><p class="line">3</p><p class="line">4</p><p class="line">5</p><p class="line">6</p><p class="line">7</p><p class="line">8</p><p class="line">9</p><p class="line">10</p><p class="line">11</p><p class="line">12</p><p class="line">13</p></td><td class="code"><div class="container"><p class="line"><code class="cpp preprocessor"># kubectl edit configmaps kube-proxy -n kube-system</code></p><p class="line"><code class="cpp plain">mode</code><code class="cpp string">"ipvs"</code></p><p class="line"><code class="cpp plain">删除旧的kube-proxy,kubelet自动重新拉起,应用ipvs</code></p><p class="line"><code class="cpp preprocessor"># kubectl delete pod kube-proxy-x9ml8 -n kube-system </code></p><p class="line"><code class="cpp plain">pod</code><code class="cpp string">"kube-proxy-x9ml8"</code> <code class="cpp plain">deleted</code></p><p class="line"><code class="cpp plain">[root@master ~]# kubectl</code><code class="cpp keyword bold">delete</code> <code class="cpp plain">pod kube-proxy-ht25x -n kube-</code><code class="cpp functions bold">system</code> </p><p class="line"><code class="cpp plain">pod</code><code class="cpp string">"kube-proxy-ht25x"</code> <code class="cpp plain">deleted</code></p><p class="line"><code class="cpp preprocessor"># kubectl logs kube-proxy-4cnbn -n kube-system</code></p><p class="line"><code class="cpp plain">I1015 14:03:08.402147 1 node.go:136] Successfully retrieved node IP: 192.168.40.132</code></p><p class="line"><code class="cpp plain">I1015 14:03:08.402259 1 server_others.go:259] Using ipvs Proxier.</code></p><p class="line"><code class="cpp plain">W1015 14:03:08.402618 1 proxier.go:429] IPVS scheduler not specified, use rr by</code><code class="cpp keyword bold">default</code></p></div></td></tr></tbody></table> 6、安装ipvsadm <table><tbody><tr><td class="gutter"><p class="line">1</p><p class="line">2</p><p class="line">3</p><p class="line">4</p><p class="line">5</p><p class="line">6</p><p class="line">7</p><p class="line">8</p><p class="line">9</p><p class="line">10</p><p class="line">11</p><p class="line">12</p><p class="line">13</p></td><td class="code"><div class="container"><p class="line"><code class="cpp preprocessor"># yum install -y ipvsadm.x86_64</code></p><p class="line"><code class="cpp preprocessor"># ipvsadm -L -n</code></p><p class="line"><code class="cpp plain">IP Virtual Server version 1.2.1 (size=4096)</code></p><p class="line"><code class="cpp plain">Prot LocalAddress:Port Scheduler Flags</code></p><p class="line"><code class="cpp spaces"> </code><code class="cpp plain">-> RemoteAddress:Port Forward Weight ActiveConn InActConn</code></p><p class="line"><code class="cpp plain">TCP 127.0.0.1:30564 rr (轮询规则)</code></p><p class="line"><code class="cpp spaces"> </code><code class="cpp plain">-> 10.244.104.36:8080 Masq 1 0 0 </code></p><p class="line"><code class="cpp spaces"> </code><code class="cpp plain">-> 10.244.166.147:8080 Masq 1 0 0 </code></p><p class="line"><code class="cpp plain">TCP 127.0.0.1:32618 rr</code></p><p class="line"><code class="cpp spaces"> </code><code class="cpp plain">-> 10.244.104.20:80 Masq 1 0 0 </code></p><p class="line"><code class="cpp plain">TCP 172.17.0.1:30564 rr</code></p><p class="line"><code class="cpp spaces"> </code><code class="cpp plain">-> 10.244.104.36:8080 Masq 1 0 0 </code></p></div></td></tr></tbody></table> 7、系统生成虚拟网卡kube-ipvs0 <table><tbody><tr><td class="gutter"><p class="line">1</p><p class="line">2</p><p class="line">3</p><p class="line">4</p><p class="line">5</p><p class="line">6</p></td><td class="code"><div class="container"><p class="line"><code class="cpp preprocessor"># ip a</code></p><p class="line"><code class="cpp plain">6: kube-ipvs0: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN group</code><code class="cpp keyword bold">default</code></p><p class="line"><code class="cpp spaces"> </code><code class="cpp plain">link/ether a2:09:a4:9d:fb:f8 brd ff:ff:ff:ff:ff:ff</code></p><p class="line"><code class="cpp spaces"> </code><code class="cpp plain">inet 10.110.180.143/32 brd 10.110.180.143 scope global kube-ipvs0</code></p><p class="line"><code class="cpp spaces"> </code><code class="cpp plain">valid_lft forever preferred_lft forever</code></p><p class="line"><code class="cpp plain">inet 10.110.180.143/32专门用于接收svc web1的请求</code></p></div></td></tr></tbody></table> 8、svc的流量被ipvs分发 <table><tbody><tr><td class="gutter"><p class="line">1</p><p class="line">2</p><p class="line">3</p><p class="line">4</p><p class="line">5</p><p class="line">6</p><p class="line">7</p><p class="line">8</p><p class="line">9</p><p class="line">10</p><p class="line">11</p><p class="line">12</p><p class="line">13</p><p class="line">14</p><p class="line">15</p><p class="line">16</p><p class="line">17</p><p class="line">18</p><p class="line">19</p><p class="line">20</p></td><td class="code"><div class="container"><p class="line"><code class="cpp preprocessor"># kubectl get svc</code></p><p class="line"><code class="cpp plain">NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE</code></p><p class="line"><code class="cpp plain">web1 NodePort 10.110.180.143 <none> 80:30746/TCP 23h</code></p><p class="line"><code class="cpp preprocessor"># curl 10.110.180.143</code></p><p class="line"><code class="cpp plain">...</code></p><p class="line"><code class="cpp plain"><title>Welcome to nginx!</title></code></p><p class="line"><code class="cpp plain">...</code></p><p class="line"><code class="cpp preprocessor"># kubectl get ep</code></p><p class="line"><code class="cpp plain">NAME ENDPOINTS AGE</code></p><p class="line"><code class="cpp plain">kubernetes 192.168.40.132:6443 78d</code></p><p class="line"><code class="cpp plain">web1 10.244.104.15:80,10.244.166.143:80,10.244.166.148:80 23h</code></p><p class="line"><code class="cpp plain">ipvs捕捉到svc的流量</code></p><p class="line"><code class="cpp preprocessor"># ipvsadm -L -n</code></p><p class="line"><code class="cpp plain">TCP 10.110.180.143:80 rr</code></p><p class="line"><code class="cpp spaces"> </code><code class="cpp plain">-> 10.244.104.15:80 Masq 1 0 0 </code></p><p class="line"><code class="cpp spaces"> </code><code class="cpp plain">-> 10.244.166.143:80 Masq 1 0 0 </code></p><p class="line"><code class="cpp spaces"> </code><code class="cpp plain">-> 10.244.166.148:80 Masq 1 0 1 </code></p></div></td></tr></tbody></table>
adouk
2023年3月18日 14:17
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码