文章目录
主要内容
- ClusterIP 类型的Service
- NodePort 类型的Service
- Headless 类型的Service
一.ClusterIP 类型的Service
ClusterIP 类型服务发现通过集群的内部 IP 暴露服务,选择该值时服务只能够在集群内部访问。这也是默认的 ServiceType。
ClusterIP是Kubernetes中一种常见的Service类型,它为后端Pod提供了一个稳定的虚拟IP地址。ClusterIP类型的Service只能在集群内部访问,外部无法直接访问。
ClusterIP的主要特点和用法如下:
-
访问方式:ClusterIP类型的Service使用集群内部的虚拟IP地址来提供访问,可以通过该IP地址和Service的端口来访问后端Pod。集群内的其他应用或服务可以使用该IP地址来发现和访问Service。
-
服务发现:通过Service的虚拟IP地址,其他应用或服务可以方便地发现和访问后端Pod。可以通过Service的DNS名称来访问Service,格式为
<service-name>.<namespace>.svc.cluster.local
。 -
负载均衡:ClusterIP类型的Service会将流量均匀地分发到后端Pod,实现负载均衡。当有多个Pod时,Service会根据Pod的标签选择器来选择后端Pod。
-
会话保持:ClusterIP类型的Service默认不支持会话保持,每个请求都会被分发到不同的后端Pod。如果需要会话保持,可以设置Service的Session Affinity为
ClientIP
,将同一会话的请求路由到同一个后端Pod。 -
网络策略:ClusterIP类型的Service默认允许集群内的所有IP访问,可以通过设置Service的访问控制策略来限制访问。可以设置
spec.ipBlocks
字段来指定允许访问的IP范围。 -
创建和使用:可以通过YAML文件或命令行创建ClusterIP类型的Service。在YAML文件中,需要指定Service的名称、标签选择器用于选择后端Pod、服务端口和协议等信息。可以使用
kubectl get services
命令查看Service的详细信息。 -
更新和删除:可以通过修改或删除Service的YAML文件,或使用
kubectl edit
和kubectl delete
命令来更新和删除ClusterIP类型的Service。
总结来说,ClusterIP类型的Service为后端Pod提供了一个稳定的虚拟IP地址,可以通过该IP地址和Service的端口在集群内部访问后端Pod。ClusterIP提供了服务发现、负载均衡和网络策略等功能,适用于集群内部的应用和服务。
1.创建服务,对外提供 8000 端口,并把流量引流到具有 app: nginx 的后端 80 端口上
代码如下(示例):
cat > clusterip.yml <<EOF
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 8000
targetPort: 80
EOF
kubectl create -f clusterip.yml
kubectl get service
curl http://10.106.107.20:8000
kubectl delete -f clusterip.yml
2.解释
让我来解释每一句命令的含义:
-
cat > clusterip.yml <<EOF
:这是一个shell命令,用于创建一个名为clusterip.yml
的文件,并将后续输入的内容写入该文件。 -
apiVersion: v1
:指定使用的Kubernetes API版本。 -
kind: Service
:定义创建的资源类型为Service。 -
metadata
:定义Service的元数据,包括名称。 -
spec
:定义Service的规格。 -
selector
:定义用于选择Pod的标签选择器,这里选择具有app: nginx
标签的Pod。 -
ports
:定义Service监听的端口。 -
protocol: TCP
:指定端口使用的协议为TCP。 -
port: 8000
:指定Service监听的端口号为8000。 -
targetPort: 80
:指定将流量转发到Pod的哪个端口,这里将流量转发到Pod的80端口。 -
kubectl create -f clusterip.yml
:使用kubectl命令创建一个ClusterIP类型的Service,根据提供的YAML文件进行配置。 -
kubectl get service
:使用kubectl命令查看Service的信息,包括名称、类型、端口等。 -
curl http://10.106.107.20:8000
:使用curl命令发送HTTP请求,访问Service的ClusterIP和端口,以测试是否能够成功访问到Service。 -
kubectl delete -f clusterip.yml
:使用kubectl命令删除通过YAML文件创建的Service,将其从集群中移除。
这些命令的组合操作的目的是创建一个名为my-service
的ClusterIP类型的Service,将其绑定到具有app: nginx
标签的Pod,并通过curl命令测试访问该Service。最后,通过删除Service将其从集群中移除。
二.NodePort 类型的 Service
NodePort 类型服务发现通过每个节点上的 IP 和静态端口(NodePort)暴露服务。NodePort 服务会路由到自动创建的 ClusterIP 服务,通过请求<节点 IP>:<节点端口>,就可以从集群的外部访问一个 NodePort 服务。
NodePort是Kubernetes中一种常见的Service类型,它为后端Pod提供了一个固定的端口,并将该端口映射到每个节点上。NodePort类型的Service可以通过节点的IP地址和映射的端口来访问后端Pod。
NodePort的主要特点和用法如下:
-
访问方式:NodePort类型的Service使用每个节点的IP地址和映射的端口来提供访问。可以通过任何节点的IP地址和映射的端口来访问后端Pod。
-
服务发现:可以通过任何节点的IP地址和映射的端口来访问NodePort类型的Service。可以使用
<node-ip>:<node-port>
的格式来访问Service。 -
负载均衡:NodePort类型的Service会将流量均匀地分发到后端Pod,实现负载均衡。当有多个Pod时,Service会根据Pod的标签选择器来选择后端Pod。
-
会话保持:NodePort类型的Service默认不支持会话保持,每个请求都会被分发到不同的后端Pod。如果需要会话保持,可以设置Service的Session Affinity为
ClientIP
,将同一会话的请求路由到同一个后端Pod。 -
网络策略:NodePort类型的Service默认允许从任何IP访问,可以通过设置Service的访问控制策略来限制访问。可以设置
spec.ipBlocks
字段来指定允许访问的IP范围。 -
创建和使用:可以通过YAML文件或命令行创建NodePort类型的Service。在YAML文件中,需要指定Service的名称、标签选择器用于选择后端Pod、服务端口和目标端口等信息。可以使用
kubectl get services
命令查看Service的详细信息。 -
更新和删除:可以通过修改或删除Service的YAML文件,或使用
kubectl edit
和kubectl delete
命令来更新和删除NodePort类型的Service。
总结来说,NodePort类型的Service为后端Pod提供了一个固定的端口,并将该端口映射到每个节点上。可以通过任何节点的IP地址和映射的端口来访问后端Pod。NodePort提供了服务发现、负载均衡和网络策略等功能,适用于需要从集群外部访问的应用和服务。
1.NodePort 会在节点的特定端口上开通服务,本实验中,我们指定的端口为 31788
代码如下(示例):
cat > nodeport.yml <<EOF
apiVersion: v1
kind: Service
metadata:
name: nodeservice
spec:
type: NodePort
selector:
app: nginx
ports:
- protocol: TCP
port: 8000
targetPort: 80
nodePort: 31788
EOF
kubectl create -f nodeport.yml
kubectl get service
curl http://192.168.30.130:31788
2.解释
让我来解释每一句命令的含义:
-
cat > nodeport.yml <<EOF
:这是一个shell命令,用于创建一个名为nodeport.yml
的文件,并将后续输入的内容写入该文件。 -
apiVersion: v1
:指定使用的Kubernetes API版本。 -
kind: Service
:定义创建的资源类型为Service。 -
metadata
:定义Service的元数据,包括名称。 -
spec
:定义Service的规格。 -
type: NodePort
:指定Service的类型为NodePort,即通过节点的IP和随机端口访问Service。 -
selector
:定义用于选择Pod的标签选择器,这里选择具有app: nginx
标签的Pod。 -
ports
:定义Service监听的端口。 -
protocol: TCP
:指定端口使用的协议为TCP。 -
port: 8000
:指定Service监听的端口号为8000。 -
targetPort: 80
:指定将流量转发到Pod的哪个端口,这里将流量转发到Pod的80端口。 -
nodePort: 31788
:指定Service在节点上暴露的端口号为31788。 -
kubectl create -f nodeport.yml
:使用kubectl命令创建一个NodePort类型的Service,根据提供的YAML文件进行配置。 -
kubectl get service
:使用kubectl命令查看Service的信息,包括名称、类型、端口等。 -
curl http://192.168.30.130:31788
:使用curl命令发送HTTP请求,访问Service的节点IP和暴露的端口号,以测试是否能够成功访问到Service。
这些命令的组合操作的目的是创建一个名为nodeservice
的NodePort类型的Service,将其绑定到具有app: nginx
标签的Pod,并通过curl命令测试访问该Service。
三.Headless 类型的 Service
Headless类型的Service是Kubernetes中一种特殊的Service类型,它不会为后端Pod提供一个稳定的虚拟IP地址,而是直接将DNS解析的责任交给后端Pod。这意味着每个后端Pod都会被分配一个唯一的DNS名称,并且可以通过该名称直接访问后端Pod。
Headless类型的Service的主要特点和用法如下:
-
DNS解析:Headless类型的Service不会为后端Pod提供一个虚拟IP地址,而是通过DNS解析为每个后端Pod分配一个唯一的DNS名称。可以通过该名称直接访问后端Pod。
-
服务发现:可以通过后端Pod的DNS名称来访问Headless类型的Service。每个后端Pod都有一个唯一的DNS名称,可以使用
<pod-name>.<service-name>.<namespace>.svc.cluster.local
的格式来访问Pod。 -
负载均衡:Headless类型的Service不会提供负载均衡功能,每个后端Pod都是直接可访问的。如果有多个后端Pod,可以使用DNS轮询来实现简单的负载均衡。
-
会话保持:Headless类型的Service默认不支持会话保持,每个请求都会被分发到不同的后端Pod。如果需要会话保持,可以在后端Pod中实现自己的会话保持机制。
-
网络策略:Headless类型的Service默认允许集群内的所有IP访问,可以通过设置Service的访问控制策略来限制访问。可以设置
spec.ipBlocks
字段来指定允许访问的IP范围。 -
创建和使用:可以通过YAML文件或命令行创建Headless类型的Service。在YAML文件中,需要指定Service的名称、标签选择器用于选择后端Pod等信息。可以使用
kubectl get services
命令查看Service的详细信息。 -
更新和删除:可以通过修改或删除Service的YAML文件,或使用
kubectl edit
和kubectl delete
命令来更新和删除Headless类型的Service。
总结来说,Headless类型的Service不会为后端Pod提供一个虚拟IP地址,而是通过DNS解析为每个后端Pod分配一个唯一的DNS名称。可以通过该名称直接访问后端Pod。Headless类型的Service适用于需要直接访问后端Pod的场景,例如数据库集群或分布式系统。
1.在此类型的 Service 中,将不会只返回 Service IP,而是直接返回众多 Pod 的 IP 地址,所以需要进入 pod 中用集群内 DNS进行测试
代码如下(示例):
cat > headless.yml <<EOF
apiVersion: v1
kind: Service
metadata:
name: headless
spec:
clusterIP: None
selector:
app: nginx
ports:
- protocol: TCP
port: 8000
targetPort: 80
EOF
kubectl create -f headless.yml
kubectl get service
kubectl run --rm --image=docker.io/busybox:1.28 -it testpod
kubectl delete -f headless.yml
kubectl delete deployments.apps nginx-deployment-servicetest
2.解释
让我来解释每一句命令的含义:
-
cat > headless.yml <<EOF
:这是一个shell命令,用于创建一个名为headless.yml
的文件,并将后续输入的内容写入该文件。 -
apiVersion: v1
:指定使用的Kubernetes API版本。 -
kind: Service
:定义创建的资源类型为Service。 -
metadata
:定义Service的元数据,包括名称。 -
spec
:定义Service的规格。 -
clusterIP: None
:指定Service的ClusterIP为None,将其设置为无头(Service)类型。 -
selector
:定义用于选择Pod的标签选择器,这里选择具有app: nginx
标签的Pod。 -
ports
:定义Service监听的端口。 -
protocol: TCP
:指定端口使用的协议为TCP。 -
port: 8000
:指定Service监听的端口号为8000。 -
targetPort: 80
:指定将流量转发到Pod的哪个端口,这里将流量转发到Pod的80端口。 -
kubectl create -f headless.yml
:使用kubectl命令创建一个无头(Service)类型的Service,根据提供的YAML文件进行配置。 -
kubectl get service
:使用kubectl命令查看Service的信息,包括名称、类型、端口等。 -
kubectl run --rm --image=docker.io/busybox:1.28 -it testpod
:使用kubectl命令创建一个名为testpod
的临时Pod,使用Busybox镜像,并进入该Pod的交互式终端。 -
kubectl delete -f headless.yml
:使用kubectl命令删除通过YAML文件创建的Service,将其从集群中移除。 -
kubectl delete deployments.apps nginx-deployment-servicetest
:使用kubectl命令删除名为nginx-deployment-servicetest
的Deployment,将其从集群中移除。
这些命令的组合操作的目的是创建一个名为headless
的无头(Service)类型的Service,将其绑定到具有app: nginx
标签的Pod,并通过kubectl命令创建一个临时Pod进行测试。最后,通过删除Service和Deployment将它们从集群中移除。
总结
以上是今天要讲的内容,学到了ClusterIP 类型Service;NodePort 类型的Service;Headless 类型的Service。