ClusterIP
通过集群的内部 IP 暴露服务,选择该值,服务只能够在集群内部可以访问,这也是默认的 ServiceType。
需要启动 Kubernetes proxy 服务才能使外部可以访问。
apiVersion: v1
kind: Service
metadata:
name: demo-service
selector:
app: nginx-pod
spec:
type: ClusterIP
ports:
- name: http
port: 80
targetPort: 80
protocol: TCP
- name: https
port: 443
targetPort: 443
protocol: TCP
NodePort
在所有节点(虚拟机)上开放一个特定端口,任何发送到该端口的流量都被转发到对应服务。
通过每个 Node 上的 IP 和静态端口(NodePort)暴露服务。NodePort 服务会路由到 ClusterIP 服务,这个 ClusterIP 服务会自动创建。通过请求[NodeIP]:[NodePort],可以从集群的外部访问一个 NodePort 服务。
apiVersion: v1
kind: Service
metadata:
name: demo-service
namespace: demo-space
labels:
name: demo-service
spec:
type: NodePort
selector:
app: nginx-pod
ports:
- protocol: TCP
port: 8081 # k8s集群通讯端口
targetPort: 80 # 容器暴露的端口
nodePort: 30080 # 所有节点主机对外暴露的端口
LoadBalancer
使用云提供商的负载局衡器,可以向外部暴露服务。外部的负载均衡器可以路由到 NodePort 服务和 ClusterIP 服务
apiVersion: v1
kind: Service
metadata:
name: demo-service
namespace: demo-space
labels:
name: demo-service
spec:
type: LoadBalancer
selector:
app: nginx-pod
ports:
- protocol: TCP
port: 80
targetPort: 9376
clusterIP: 10.0.171.239
loadBalancerIP: 78.11.24.19
status:
loadBalancer:
ingress:
- ip: 146.148.47.155
外部 IP
如果外部的 IP 路由到集群中一个或多个 Node 上,Kubernetes Service 会被暴露给这些 externalIPs。 通过外部 IP(作为目的 IP 地址)进入到集群,打到 Service 的端口上的流量,将会被路由到 Service 的 Endpoint 上。 externalIPs 不会被 Kubernetes 管理,它属于集群管理员的职责范畴。
apiVersion: v1
kind: Service
metadata:
name: demo-service
namespace: demo-space
labels:
name: demo-service
spec:
selector:
app: nginx-pod
ports:
- protocol: TCP
port: 8081
targetPort: 80
externalIPs:
- 192.168.1.50