文章目录
主要内容
- Service
- Ingress
预备知识
Service是Kubernetes中的一种抽象,用于定义一组Pod的访问方式和网络策略。Service提供了一个稳定的虚拟IP地址和一个DNS名称,用于将流量路由到后端Pod。
Service的主要作用包括:
-
服务发现:通过Service的虚拟IP地址和DNS名称,其他应用或服务可以方便地发现和访问后端Pod。
-
负载均衡:Service可以将流量均匀地分发到后端Pod,实现负载均衡,提高应用的可用性和性能。
-
会话保持:Service可以通过设置Session Affinity,将同一会话的请求路由到同一个后端Pod,确保会话的连续性。
-
网络策略:通过Service可以定义访问控制策略,限制流量只能从特定的IP范围或特定的命名空间访问。
Service的用法如下:
-
创建Service:可以通过YAML文件或命令行创建Service。YAML文件中需要指定Service的名称、标签选择器用于选择后端Pod、服务端口和协议等信息。
-
访问Service:通过Service的虚拟IP地址或DNS名称,可以从集群内部或外部访问Service。可以使用
kubectl get services
命令查看Service的详细信息,包括虚拟IP地址和端口。 -
负载均衡:Service可以将流量均匀地分发到后端Pod。可以通过设置Service的类型为
LoadBalancer
或NodePort
来实现负载均衡。 -
会话保持:可以通过设置Service的Session Affinity为
ClientIP
,将同一会话的请求路由到同一个后端Pod,确保会话的连续性。 -
网络策略:可以通过设置Service的访问控制策略,限制流量只能从特定的IP范围或特定的命名空间访问。
-
更新和删除Service:可以通过修改或删除Service的YAML文件,或使用
kubectl edit
和kubectl delete
命令来更新和删除Service。
总结来说,Service是Kubernetes中用于定义一组Pod的访问方式和网络策略的抽象。通过Service,可以实现服务发现、负载均衡、会话保持和网络策略等功能,提高应用的可用性和性能。
一.Service
Pod 是非永久性资源,每个 Pod 都有自己的 IP 地址,这导致了一个问题: 如果一组 Pod(称为“后
端”)为集群内的其他 Pod(称为“前端”)提供功能, 那么前端如何找出并跟踪要连接的 IP 地址,
以便前端可以使用提供工作负载的后端部分?Kubernetes 通过 service 实现这一功能。
iptables 代理模式的 Service:
kube-proxy 会监视 Kubernetes 控制节点对 Service 对象和 Endpoints 对象的添加和移除。对每个 Service,它会配置 iptables 规则,从而捕获到达该 Service 的clusterIP 和端口的请求,进而将请求重定向到 Service 的一组后端中的某个 Pod 上面。对于每个 Endpoints 对象,它也会配置 iptables 规则,这个规则会选择一个后端组合。默认的策略是,kube-proxy 在iptables 模式下随机选择一个后端。
使用 iptables 处理流量具有较低的系统开销,因为流量由 Linux netfilter 处理,而无需在用户空间和内核空间之间切换。
IPVS 代理模式的 Service:
在 IPVS (IP Virtual Server)模式下,kube-proxy 监视 Kubernetes 服务和端点,调用netlink 接口相应地创建 IPVS 规则,并定期将 IPVS 规则与 Kubernetes 服务和端点同步。该控制循环可确保 IPVS 状态与所需状态匹配。访问服务时,IPVS 将流量定向到后端 Pod 之一。
IPVS 代理模式基于类似于 iptables 模式的 netfilter 挂钩函数,但是使用哈希表作为基础数据结构,并且在内核空间中工作, 这意味着,与 iptables 模式下的 kube-proxy 相比,IPVS 模式下的 kube-proxy 重定向通信的延迟要短,并且在同步代理规则时具有更好的性能。与其他代理模式相比,IPVS 模式还支持更高的网络流量吞吐量。
1.service,用NGINX镜像准备一个3副本的deployment作为后端,并开放80端口。
代码如下(示例):
cat > deployment-service.yml <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment-servicetest
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
EOF
2.然后用kubectl expose 的命令创建一个针对deployment的服务,并查询endpoint是否准备就绪。
代码如下(示例):
kubectl create -f deployment-service.yml
kubectl expose deployment nginx-deployment-servicetest --port=9000 --name=myservice --target-port=80 --type=NodePort
kubectl get service,endpoints
curl http://192.168.30.130:31537
kubectl delete service myservice
3.解释
让我来解释每一句命令的含义:
-
cat > deployment-service.yml <<EOF
:这是一个shell命令,用于创建一个名为deployment-service.yml
的文件,并将后续输入的内容写入该文件。 -
apiVersion: apps/v1
:指定使用的Kubernetes API版本。 -
kind: Deployment
:定义创建的资源类型为Deployment。 -
metadata
:定义Deployment的元数据,包括名称和标签。 -
replicas: 3
:指定Deployment副本数为3,即创建3个Pod副本。 -
selector
:定义用于选择Pod的标签选择器。 -
template
:定义用于创建Pod的模板。 -
containers
:定义Pod中的容器配置。 -
image: nginx
:指定容器使用的镜像为nginx。 -
imagePullPolicy: IfNotPresent
:指定镜像拉取策略为如果本地不存在则拉取。 -
ports
:定义容器监听的端口。 -
kubectl create -f deployment-service.yml
:使用kubectl命令创建Deployment,根据提供的YAML文件进行配置。 -
kubectl expose deployment nginx-deployment-servicetest --port=9000 --name=myservice --target-port=80 --type=NodePort
:使用kubectl命令创建一个Service,将Deployment暴露在集群外部。--port
指定Service监听的端口,--name
指定Service的名称,--target-port
指定将流量转发到Deployment的哪个端口,--type=NodePort
指定Service的类型为NodePort,即通过节点的IP和随机端口访问Service。 -
kubectl get service,endpoints
:使用kubectl命令查看Service和Endpoints的信息。Service用于暴露Deployment,Endpoints用于显示与Service关联的Pod的IP地址和端口。 -
curl http://192.168.30.130:31537
:使用curl命令发送HTTP请求,访问Service的IP和端口,以测试是否能够成功访问到Deployment。 -
kubectl delete service myservice
:使用kubectl命令删除名为myservice
的Service,从集群中移除对Deployment的暴露。
这些命令的组合操作的目的是创建一个名为nginx-deployment-servicetest
的Deployment,将其暴露为名为myservice
的Service,并通过curl命令测试访问该Service。最后,通过删除Service将其从集群中移除。
二.Ingress
Ingress是Kubernetes中的一种资源对象,用于管理集群中的入口流量。它充当了一个入口点,将外部流量路由到集群内部的Service或Pod。Ingress通过定义规则和配置来实现流量的路由和负载均衡。
Ingress 是对集群中服务的外部访问进行管理的 API 对象,典型的访问方式是 HTTP。
Ingress 可以提供负载均衡、SSL 终结和基于名称的虚拟托管。
Ingress 公开了从集群外部到集群内服务的 HTTP 和 HTTPS 路由,流量路由由 Ingress 资源上定义的规则控制。为了让 Ingress 资源工作,集群必须有一个正在运行的 Ingress 控制器。
下图是一个将所有流量都发送到同一 Service 的简单 Ingress 示例:
Ingress的主要特点和用法如下:
-
流量路由:Ingress通过定义规则来路由流量。可以根据域名、路径、HTTP方法等条件将流量转发到不同的Service或Pod。通过Ingress规则,可以实现多个域名和路径的流量路由。
-
负载均衡:Ingress可以实现基于负载均衡的流量分发。可以将流量均匀地分发到后端的多个Service或Pod上,以实现高可用和性能优化。
-
SSL/TLS支持:Ingress可以配置SSL/TLS证书,以实现加密的流量传输。可以为每个域名配置不同的证书,保护传输过程中的数据安全。
-
URL重写和重定向:Ingress可以通过配置URL重写和重定向来实现对流量的处理。可以将请求的URL重写为不同的路径,或者将请求重定向到其他URL。
-
基于名称的虚拟主机:Ingress支持基于名称的虚拟主机,可以为不同的域名配置不同的规则和后端服务。这使得在同一个集群中托管多个应用程序或网站变得更加方便。
-
创建和使用:可以通过YAML文件或命令行创建Ingress。在YAML文件中,需要指定Ingress的名称、规则、后端服务等信息。可以使用
kubectl get ingress
命令查看Ingress的详细信息。
下面是一个示例的Ingress配置文件:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
rules:
- host: example.com
http:
paths:
- path: /app1
pathType: Prefix
backend:
service:
name: service1
port:
number: 80
- path: /app2
pathType: Prefix
backend:
service:
name: service2
port:
number: 80
在这个示例中,Ingress将example.com/app1
的请求转发到名为service1
的Service,将example.com/app2
的请求转发到名为service2
的Service。
总结来说,Ingress是Kubernetes中用于管理入口流量的一种资源对象。通过定义规则和配置,可以实现流量的路由、负载均衡、SSL/TLS支持、URL重写和重定向等功能。通过Ingress,可以更方便地管理集群中的入口流量,并实现灵活的流量控制和管理。
1.Ingress 需要 Ingress 控制器支持,先部署控制器
代码如下(示例):
kubectl apply -f https://gitee.com/cnlxh/Kubernetes/raw/master/cka-yaml/ingressdeploy.yaml
kubectl get pod -n ingress-nginx
2.用 nginx 镜像生成一个具有 3 副本的 Pod,并通过 Service 提供服务,然后再用 ingress 以特定域名的方式对外暴露
代码如下(示例):
cat > ingress.yml <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment-ingress
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: ingressservice
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: testingress
spec:
ingressClassName: nginx
rules:
- host: www.testingress.com
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: ingressservice
port:
number: 80
EOF
kubectl create -f ingress.yml
kubectl get deployments,service,ingress
echo 192.168.30.131 www.testingress.com >> /etc/hosts
curl http://www.testingress.com
kubectl delete -f ingress.yml
3.解释
让我来解释每一句命令的含义:
1.
-
cat > ingress.yml <<EOF
:这是一个shell命令,用于创建一个名为ingress.yml
的文件,并将后续输入的内容写入该文件。 -
apiVersion: apps/v1
:指定使用的Kubernetes API版本。 -
kind: Deployment
:定义创建的资源类型为Deployment。 -
metadata
:定义Deployment的元数据,包括名称和标签。 -
name: nginx-deployment-ingress
:指定Deployment的名称为nginx-deployment-ingress
。 -
labels
:为Deployment添加标签。 -
app: nginx
:为Deployment添加一个名为app
,值为nginx
的标签。 -
spec
:定义Deployment的规格。 -
replicas: 3
:指定Deployment的副本数量为3,即创建3个Pod。 -
selector
:定义用于选择Pod的标签选择器。 -
matchLabels
:指定选择具有哪些标签的Pod。 -
app: nginx
:指定选择具有名为app
,值为nginx
的标签的Pod。 -
template
:定义创建Pod的模板。 -
metadata
:定义Pod的元数据,包括标签。 -
labels
:为Pod添加标签。 -
app: nginx
:为Pod添加一个名为app
,值为nginx
的标签。 -
spec
:定义Pod的规格。 -
containers
:定义Pod中的容器。 -
name: nginx
:指定容器的名称为nginx
。 -
image: nginx
:指定容器使用的镜像为nginx
。 -
imagePullPolicy: IfNotPresent
:指定容器的镜像拉取策略为如果本地不存在该镜像,则拉取。 -
ports
:定义容器监听的端口。 -
containerPort: 80
:指定容器监听的端口号为80。
这些命令的组合操作的目的是创建一个名为nginx-deployment-ingress
的Deployment,其中包含3个副本的Pod,每个Pod中运行一个名为nginx
的容器,该容器使用nginx
镜像,并监听80端口。
2.
-
apiVersion: v1
:指定使用的Kubernetes API版本。 -
kind: Service
:定义创建的资源类型为Service。 -
metadata
:定义Service的元数据,包括名称。 -
name: ingressservice
:指定Service的名称为ingressservice
。 -
spec
:定义Service的规格。 -
selector
:定义用于选择Pod的标签选择器。 -
app: nginx
:指定选择具有名为app
,值为nginx
的标签的Pod。 -
ports
:定义Service监听的端口。 -
protocol: TCP
:指定Service监听的协议为TCP。 -
port: 80
:指定Service监听的端口号为80。 -
targetPort: 80
:指定将流量转发到Pod的端口号为80。
这些命令的组合操作的目的是创建一个名为ingressservice
的Service,该Service使用标签选择器选择具有app: nginx
标签的Pod,并将流量转发到这些Pod的80端口。
3.
-
apiVersion: networking.k8s.io/v1
:指定使用的Kubernetes API版本为Networking API的v1版本。 -
kind: Ingress
:定义创建的资源类型为Ingress。 -
metadata
:定义Ingress的元数据,包括名称。 -
name: testingress
:指定Ingress的名称为testingress
。 -
spec
:定义Ingress的规格。 -
ingressClassName: nginx
:指定使用名为nginx
的Ingress Controller来处理该Ingress。 -
rules
:定义Ingress的规则。 -
- host: www.testingress.com
:指定Ingress的主机为www.testingress.com
。 -
http
:定义Ingress的HTTP配置。 -
paths
:定义Ingress的路径配置。 -
- pathType: Prefix
:指定路径匹配类型为前缀匹配。 -
path: "/"
:指定匹配的路径为根路径。 -
backend
:定义后端服务配置。 -
service
:指定后端服务为一个Service。 -
name: ingressservice
:指定Service的名称为ingressservice
。 -
port
:指定Service监听的端口。 -
number: 80
:指定Service监听的端口号为80。
这些命令的组合操作的目的是创建一个名为testingress
的Ingress,该Ingress使用nginx
Ingress Controller处理请求,并将www.testingress.com
的流量转发到名为ingressservice
的Service的80端口。
4.
接下来的命令:
-
kubectl create -f ingress.yml
:使用kubectl
命令创建Ingress资源,从ingress.yml
文件中读取配置。 -
kubectl get deployments,service,ingress
:使用kubectl
命令获取部署、服务和Ingress的信息。 -
echo 192.168.30.131 www.testingress.com >> /etc/hosts
:将www.testingress.com
映射到IP地址192.168.30.131
,以便在本地主机上访问该域名。 -
curl http://www.testingress.com
:使用curl
命令发送HTTP请求到www.testingress.com
,以测试Ingress是否正常工作。 -
kubectl delete -f ingress.yml
:使用kubectl
命令删除之前创建的Ingress资源,从ingress.yml
文件中读取配置。
这些命令的组合操作的目的是创建、测试和删除Ingress资源,并验证Ingress的功能是否正常。
总结
以上是今天要讲的内容,学到了Service,Ingress。