
Kubernetes 中的服务(Service)是一个抽象概念,它定义了 Pod 的逻辑集和访问 Pod 的协议。
集群中的每个 Pod 都有一个唯一的 IP 地址,但是如果没有 Service,这些 IP 不会被公开到集群外部。Service 允许应用接收流量。通过设置 Service 的 spec 中的 type,可以用不同的方式公开 Service:
ClusterIP(默认)- 在集群的内部 IP 上公开 Service。这种类型的 Service 只能从集群内访问。
NodePort - 使用 NAT 在集群中每个选定 Node 的相同端口上公开 Service 。使用<NodeIP>:<NodePort> 从集群外部访问 Service。是 ClusterIP 的超集。
LoadBalancer - 在当前公有云中创建一个外部负载均衡器,并为 Service 分配一个固定的外部IP。是 NodePort 的超集。
ExternalName - 将 Service 映射到 externalName 字段的内容(例如 xxx.example.com),通过返回带有该名称的 CNAME 记录实现。不设置任何类型的代理。这种类型需要 kube-dns 的 v1.7 或更高版本,或者 CoreDNS 的 0.8 或更高版本。
下面是针对Kubernetes中四种Service类型的YAML配置示例。
1.ClusterIP
apiVersion: v1kind: Servicemetadata:name: my-clusterip-servicespec:selector:app: my-appports:- protocol: TCPport: 80targetPort: 8080
这个示例创建了一个名为my-clusterip-service的ClusterIP类型的Service,它会选择所有带有app=my-app标签的Pod,并将这些Pod的8080端口映射到Service的80端口上。
2. NodePort
apiVersion: v1kind: Servicemetadata:name: my-nodeport-servicespec:type: NodePortselector:app: my-appports:- protocol: TCPport: 80targetPort: 8080nodePort: 30000
这个示例创建了一个NodePort类型的Service,名为my-nodeport-service。除了具有ClusterIP的功能外,它还在每个节点上开放了一个30000的端口,通过NodeIP:30000可以访问Service。
3. LoadBalancer
apiVersion: v1kind: Servicemetadata:name: my-loadbalancer-servicespec:type: LoadBalancerselector:app: my-appports:- protocol: TCPport: 80targetPort: 8080
这个示例创建了一个LoadBalancer类型的Service,名为my-loadbalancer-service。在支持LoadBalancer的公有云环境中,云提供商会自动为这个Service配置一个负载均衡器,并将流量转发到Service的NodePort上。
4. ExternalName
apiVersion: v1kind: Servicemetadata:name: my-externalname-servicenamespace: defaultspec:type: ExternalNameexternalName: external.example.com
这个示例创建了一个ExternalName类型的Service,名为my-externalname-service。它将Service的名称映射到一个外部域名external.example.com,使得集群内部可以通过这个Service名称来访问外部的域名。
“运维笔谈”公众号,对话回复 “阿里云k8s” 可以获取 “阿里云Kubernetes项目实战手册”
如果您在日常运维工作中遇到了任何问题或挑战,无论是关于系统配置、性能优化、故障排除还是其他方面,都欢迎您随时留言或私信我。我会尽我所能为您提供解决方案或建议。相互学习,积累更多的经验和知识,让工作更加顺畅高效!




