更新 kubernetes-Service详解.md

This commit is contained in:
wxin 2025-05-17 14:32:06 +08:00
parent 276976f553
commit 07c52b76bf

View File

@ -8,11 +8,11 @@
为了解决这个问题kubernetes提供了Service资源Service会对提供同一个服务的多个pod进行聚合并且提供一个统一的入口地址。通过访问Service的入口地址就能访问到后面的pod服务。
![](accents\images-202505080020.png)
![](http://182.92.143.66:40072/directlink/img/kubernetes/images-202505080020.png)
Service在很多情况下只是一个概念真正起作用的其实是kube-proxy服务进程每个Node节点上都运行着一个kube-proxy服务进程。当创建Service的时候会通过api-server向etcd写入创建的service的信息而kube-proxy会基于监听的机制发现这种Service的变动然后它会将最新的Service信息转换成对应的访问规则。
![](accents\images-202505080021.png)
![](http://182.92.143.66:40072/directlink/img/kubernetes/images-202505080021.png)
```bash
# 10.97.97.97:80 是service提供的访问入口
@ -35,19 +35,19 @@ kube-proxy目前支持三种工作模式
userspace模式下kube-proxy会为每一个Service创建一个监听端口发向Cluster IP的请求被Iptables规则重定向到kube-proxy监听的端口上kube-proxy根据LB算法选择一个提供服务的Pod并和其建立链接以将请求转发到Pod上。 该模式下kube-proxy充当了一个四层负责均衡器的角色。由于kube-proxy运行在userspace中在进行转发处理时会增加内核和用户空间之间的数据拷贝虽然比较稳定但是效率比较低。
![](accents\images-202505080022.png)
![](http://182.92.143.66:40072/directlink/img/kubernetes/images-202505080022.png)
### 2. iptables 模式
iptables模式下kube-proxy为service后端的每个Pod创建对应的iptables规则直接将发向Cluster IP的请求重定向到一个Pod IP。 该模式下kube-proxy不承担四层负责均衡器的角色只负责创建iptables规则。该模式的优点是较userspace模式效率更高但不能提供灵活的LB策略当后端Pod不可用时也无法进行重试。
![](accents\images-202505080023.png)
![](http://182.92.143.66:40072/directlink/img/kubernetes/images-202505080023.png)
### 3. ipvs 模式
ipvs模式和iptables类似kube-proxy监控Pod的变化并创建相应的ipvs规则。ipvs相对iptables转发效率更高。除此以外ipvs支持更多的LB算法。
![](accents\images-202505080024.png)
![](http://182.92.143.66:40072/directlink/img/kubernetes/images-202505080024.png)
```bash
# 此模式必须安装ipvs内核模块否则会降级为iptables
@ -222,7 +222,7 @@ Endpoint是kubernetes中的一个资源对象存储在etcd中用来记录
一个Service由一组Pod组成这些Pod通过Endpoints暴露出来Endpoints是实现实际服务的端点集合。换句话说service和pod之间的联系是通过endpoints实现的。
![](accents\images-202505080025.png)
![](http://182.92.143.66:40072/directlink/img/kubernetes/images-202505080025.png)
**负载分发策略**
@ -346,7 +346,7 @@ service-headliness.dev.svc.cluster.local. 30 IN A 10.244.2.2
在之前的样例中创建的Service的ip地址只有集群内部才可以访问如果希望将Service暴露给集群外部使用那么就要使用到另外一种类型的Service称为NodePort类型。NodePort的工作原理其实就是将service的端口映射到Node的一个端口上然后就可以通过NodeIp:NodePort来访问service了。
![](accents\images-202505080026.png)
![](http://182.92.143.66:40072/directlink/img/kubernetes/images-202505080026.png)
创建service-nodeport.yaml
@ -381,13 +381,13 @@ service-nodeport NodePort 10.104.5.98 <none> 80:30002/TCP 15s
LoadBalancer和NodePort很相似目的都是向外部暴露一个端口区别在于LoadBalancer会在集群的外部再来做一个负载均衡设备而这个设备需要外部环境支持的外部服务发送到这个设备上的请求会被设备负载之后转发到集群中。
![](accents\images-202505080027.png)
![](http://182.92.143.66:40072/directlink/img/kubernetes/images-202505080027.png)
### 7. ExternalName 类型的 Service
ExternalName类型的Service用于引入集群外部的服务它通过externalName属性指定外部一个服务的地址然后在集群内部访问此service就可以访问到外部的服务了。
![](accents\images-202505080028.png)
![](http://182.92.143.66:40072/directlink/img/kubernetes/images-202505080028.png)
创建service-externalname.yaml
@ -423,7 +423,7 @@ www.a.shifen.com. 5 IN A 39.156.70.239
基于这种现状kubernetes提供了Ingress资源对象Ingress只需要一个NodePort或者一个LB就可以满足暴露多个Service的需求。工作机制大致如下图表示
![](accents\images-202505080029.png)
![](http://182.92.143.66:40072/directlink/img/kubernetes/images-202505080029.png)
实际上Ingress相当于一个7层的负载均衡器是kubernetes对反向代理的一个抽象它的工作原理类似于Nginx可以理解成在Ingress里建立诸多映射规则Ingress Controller通过监听这些配置规则并转化成Nginx的反向代理配置 , 然后对外部提供服务。在这里有两个核心概念:
@ -437,7 +437,7 @@ Ingress以Nginx为例的工作原理如下
3. Ingress控制器会将生成的Nginx配置写入到一个运行着的Nginx服务中并动态更新
4. 到此为止其实真正在工作的就是一个Nginx了内部配置了用户定义的请求转发规则
![](accents\images-202505080030.png)
![](http://182.92.143.66:40072/directlink/img/kubernetes/images-202505080030.png)
## 五Ingress使用
@ -451,7 +451,7 @@ Ingress以Nginx为例的工作原理如下
为了后面的实验比较方便,创建如下图所示的模型
![](accents\images-202505080031.png)
![](http://182.92.143.66:40072/directlink/img/kubernetes/images-202505080031.png)
创建tomcat-nginx.yaml