简介
本教程将全面介绍 Kubernetes 服务,这是 Kubernetes 生态系统中的一个基本概念。你将了解不同类型的服务、如何将应用程序暴露到网络以及与 Kubernetes 服务相关的高级概念。
理解 Kubernetes 服务
Kubernetes 服务是 Kubernetes 生态系统中的一个基本概念,它提供了一种将在 Pod 中运行的应用程序暴露到网络的方式。服务抽象了底层的 Pod,允许客户端连接到应用程序,而无需了解 Pod 的详细信息。
Kubernetes 服务类型
Kubernetes 提供了几种类型的服务,以适应不同的网络需求:
- ClusterIP:这是默认的服务类型,它在集群内部 IP 地址上暴露服务。这种类型的服务只能从集群内部访问。
graph LR
Client --> ClusterIP
ClusterIP --> Pods
- NodePort:这种服务类型使用静态端口在每个节点的 IP 地址上暴露应用程序。这允许外部客户端从集群外部访问应用程序。
graph LR
Client --> NodePort
NodePort --> Nodes
Nodes --> Pods
- LoadBalancer:这种服务类型为应用程序配置一个负载均衡器,通常在云环境中。负载均衡器将流量分配到 Pod。
graph LR
Client --> LoadBalancer
LoadBalancer --> Nodes
Nodes --> Pods
- ExternalName:这种服务类型将服务映射到一个 DNS 名称,没有任何 Pod 或端点。这对于与外部服务集成很有用。
服务组件
Kubernetes 服务由几个关键组件组成:
- Selector:Selector 是一组标签,用于确定哪些 Pod 将成为服务的一部分。
- Port:服务将在其上可访问的端口。
- TargetPort:Pod 正在监听的端口。
- ClusterIP:分配给服务的内部 IP 地址。
- Type:如前所述的服务类型。
这是一个服务配置示例:
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: my-app
ports:
- port: 80
targetPort: 8080
type: LoadBalancer
在此示例中,服务将在端口 80 上暴露带有标签 app: my-app 的 Pod,将流量转发到 Pod 的端口 8080。
暴露 Kubernetes 应用程序
一旦你定义了一个 Kubernetes 服务,下一步就是将你的应用程序暴露给外部世界。Kubernetes 提供了几种方法来实现这一点,每种方法都有其自身的优点和用例。
NodePort 服务
NodePort 服务类型使用静态端口在每个节点的 IP 地址上暴露应用程序。这允许外部客户端从集群外部访问应用程序。以下是一个示例:
apiVersion: v1
kind: Service
metadata:
name: my-nodeport-service
spec:
type: NodePort
selector:
app: my-app
ports:
- port: 80
targetPort: 8080
在此示例中,该服务将在每个节点的 IP 地址上通过 30000 - 32767 范围内随机分配的端口进行访问。
负载均衡器服务
LoadBalancer 服务类型为应用程序配置一个负载均衡器,通常在云环境中。负载均衡器将流量分配到 Pod。以下是一个示例:
apiVersion: v1
kind: Service
metadata:
name: my-loadbalancer-service
spec:
type: LoadBalancer
selector:
app: my-app
ports:
- port: 80
targetPort: 8080
在此示例中,云提供商会配置一个负载均衡器,并将其配置为将流量分配到 Pod。
入口
入口(Ingress)是一种 Kubernetes 资源,提供高级路由和负载均衡功能。入口允许你在单个 IP 地址下暴露多个服务,并且可以处理诸如 SSL/TLS 终止、基于路径的路由等功能。以下是一个入口配置示例:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
rules:
- host: example.com
http:
paths:
- path: /api
pathType: Prefix
backend:
service:
name: my-api-service
port:
number: 80
- path: /web
pathType: Prefix
backend:
service:
name: my-web-service
port:
number: 80
在此示例中,入口在 example.com 域名下暴露了两个不同的服务,即 /api 和 /web。
Kubernetes 服务高级概念
虽然基本的 Kubernetes 服务类型涵盖了许多用例,但仍有一些高级概念可以为你的应用程序网络提供更大的灵活性和控制权。
服务发现
Kubernetes 提供了内置的服务发现机制,允许 Pod 相互查找和通信。这是通过使用环境变量和 Kubernetes DNS 服务器来实现的。
创建新服务时,Kubernetes 会自动为其分配一个格式为 <服务名称>.<命名空间>.svc.cluster.local 的 DNS 名称。然后,Pod 可以使用此 DNS 名称连接到该服务。
Kubernetes 还会为每个服务注入环境变量,例如 MY_SERVICE_HOST 和 MY_SERVICE_PORT,Pod 可以使用这些变量连接到该服务。
服务网络
Kubernetes 使用 kube-proxy 组件来处理服务的网络。kube-proxy 负责设置必要的 iptables 规则,并将流量转发到相应的 Pod。
Kubernetes 支持多种网络模型,例如 iptables 和 ipvs,可以根据你的需求进行配置。
服务扩展
Kubernetes 服务可以根据可用 Pod 的数量自动扩展。当你通过添加或删除 Pod 来扩展应用程序时,服务会自动调整其负载均衡以相应地分配流量。
你还可以配置高级扩展选项,例如水平 Pod 自动缩放,以根据 CPU 利用率或自定义指标等指标自动扩展你的应用程序。
这是一个水平 Pod 自动缩放器的示例:
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
name: my-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-app
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
targetAverageUtilization: 50
在此示例中,水平 Pod 自动缩放器将根据 Pod 的平均 CPU 利用率在 2 到 10 个 Pod 之间自动扩展 my-app 部署。
总结
在本教程中,你已经了解了 Kubernetes 服务的不同类型,包括 ClusterIP、NodePort 和 LoadBalancer,以及如何使用它们将你的应用程序暴露到网络。你还探索了 Kubernetes 服务的关键组件以及如何配置它们。通过理解 Kubernetes 服务,你可以有效地管理和暴露在 Pod 中运行的应用程序,使客户端能够连接到你的应用程序,而无需了解底层 Pod 的详细信息。


