了解 Kubernetes 服务的工作方式以及它们如何让应用不同组件间及与外部客户端的沟通变得容易。
📖 情景:你已经部署了多个运行你应用程序不同组件的Pod,并且你需要让这些Pod能够互相通信,以便让你的应用程序对外公开,使外部客户端可以访问。
📘 解释:Kubernetes服务为访问一组Pods提供了一个稳定的端点(IP地址和端口)。服务将工作定义与Pods分离。服务可以用于公开运行在一组Pods上的应用程序,并负责这些Pods之间的负载均衡。
🔑 重要概念:ClusterIP (集群IP):
- 在集群内部使用内部IP来暴露服务。
- 让服务仅对集群内的其他部分可见。
NodePort(节点端口):
- 在每个节点的 IP 地址上以固定端口提供服务。
- 可以从集群外部通过 <NodeIP>:<NodePort> 访问服务。
负载均衡:
- 通过云提供商的负载均衡器将服务暴露给外部。
- 自动为服务分配一个外部 IP 地址。
无头服务:
- 不要分配 ClusterIP。
- 用于直接管理各个 Pod 端点的场合。
服务使用 YAML 配置文件来定义。这里有一个简单的 ClusterIP 服务示例:
📑 集群IP服务示例apiVersion: v1
kind: Service
metadata:
name: my-clusterip-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP
# 这是一个用于Nginx应用的服务
📑 NodePort 示例:
apiVersion: v1
kind: 服务
metadata:
name: my-nodeport-service
spec:
规范定义:
选择器:
app: nginx
端口列表:
- protocol: TCP
port: 80
目标端口: 80
节点端口: 30007
类型: NodePort
📑 负载均衡示例
apiVersion: v1
kind: Service
metadata:
name: my-loadbalancer-service
spec:
选择器:
app: nginx
端口:
- 协议: TCP
port: 80
targetPort: 80
type: 负载均衡器 # LoadBalancer
🛠️ 创建和管理服务的步骤如下:
1. 创建一个 ClusterIP 服务。
将上述 ClusterIP 服务的 YAML 定义保存到文件里(例如 "clusterip-service.yaml"
)。
应用以下配置:
kubectl apply -f clusterip-service.yaml # 应用clusterip-service.yaml文件中的定义
检查服务:
kubectl get services
2. 让我们创建一个 NodePort 服务吧。
- 将上述 NodePort 服务的 YAML 定义保存到一个文件中,例如
nodeport-service.yaml
。 - 应用此配置。
kubectl apply -f nodeport-service.yaml
执行此命令来应用NodePort服务配置文件
检查一下服务:
kubectl get services (kubectl,Kubernetes命令行工具)
3. 创建一个负载均衡服务:
- 将上述 LoadBalancer 的 YAML 定义文件保存到文件中(例如
loadbalancer-service.yaml
)。 - 应用此配置:
# 应用负载均衡服务配置文件
kubectl apply -f loadbalancer-service.yaml
检查服务。
kubectl get services
🔍 下面是一个详细的例子解释:
集群IP服务:
这使应用在集群内可被访问。集群中的其他 Pod 可以通过该服务的名称来访问它。
NodePort:
- 在集群中每个节点的静态端口上暴露应用程序。外部流量可以使用
<NodeIP>:<NodePort>
访问。
负载均衡器:
- 通过云提供商的负载均衡器将应用程序公开给外部。自动为服务分配一个外部 IP 地址。
- 服务发现:服务提供了一个稳定的访问点以访问 POD,即使底层的 POD 有所变动。
- 负载均衡:服务自动在可用的 POD 之间分配流量,确保高可用性和扩展性。
- 外部访问:服务使外部客户端能够访问在集群内运行的应用程序。
- 对于需要发现并和每个独立的 Pod 通信的应用程序来说,无头服务很有用。
例子:
apiVersion: v1 # API版本为v1
kind: Service # 类型为服务
metadata: # 元数据部分
name: my-headless-service # 服务名称为my-headless-service
spec: # 规格部分
clusterIP: None # 不分配集群IP
selector: # 选择器
app: nginx # app标签为nginx
ports: # 端口设置
- protocol: TCP # 协议为TCP
port: 80 # 服务端口为80
targetPort: 80 # 目标端口为80
📑 端点:
*Kubernetes 自动为 Service 创建 Endpoints,这些 Endpoints 列出了由 Service 选择的 Pods 的 IP 地址。
例子:
kubectl get endpoints my-clusterip-service
获取名为my-clusterip-service的端点信息
📑 使用服务:- 要访问一个服务,您可以使用由Kubernetes提供的DNS名称或IP地址。
- ClusterIP:这是集群内的服务IP。
运行如下命令:curl http://my-clusterip-service
NodePort:
运行这个命令来访问节点: curl http://<节点IP>:30007
负载均衡:
curl http://<External-IP> # curl命令用于从指定的外部IP地址获取数据
🧪 手动活动:
创建一个集群IP服务:
根据提供的 YAML 定义创建一个 ClusterIP 服务,以便在集群内部署和访问 Nginx 应用。
创建一个 NodePort 类型的服务。
- 根据提供的 YAML 定义创建一个 NodePort 服务,确保 Nginx 应用程序在每个节点的静态端口上公开。
创建一个负载均衡器服务
根据提供的 YAML 定义来创建一个负载均衡服务,以便外部可以访问 Nginx 应用程序。
创建一个无头服务实例:
- 使用提供的 YAML 定义创建一个无头服务(Headless Service),并检查其端点地址。
使用服务。
- 测试使用各自的端点访问API服务。
YouTube# 油管
观看此视频: https://youtu.be/9PHFMltSD4c 🤝 互动一下,想一想:理解 Kubernetes 中的服务和网络通讯至关重要,这能让应用组件间及与外部客户端的通信顺畅。
💬 快来和我们聊聊:您对Kubernetes服务有什么新的理解和看法?您打算在项目中如何使用服务?分享您的使用经验和想法吧!
👉 关注更多学习机会,持续提升您的 Kubernetes 技能,以保持在不断变化的云原生技术领域的领先地位。让我们继续探索、创新,实现自动化!