service特性
- Service 通过 label 关联对应的 Pod
- Servcie 生命周期不跟 Pod 绑定,不会因为 Pod 重建改变 IP
- 提供了负载均衡功能,自动转发流量到不同 Pod
- 可对集群外部提供访问端口
- 集群内部可通过服务名字访问
创建service
通过标签test-k8s跟对应的 Pod 关联上
apiVersion: v1
kind: Service
metadata:
name: test-k8s
spec:
selector:
app: test-k8s
type: ClusterIP
ports:
- port: 8080 # 本 Service 的端口
targetPort: 8080 # 容器端口
该service的名字是test-k8s;
通过标签app: test-k8s
与pod进行关联。我们前面创建deployment时也是使用这个标签进行关联,所以该service和deployment共用pod:
service关联的pod:

deployment关联的也是这两个pod,两者都是通过标签进行关联:

service的IP为10.110.66.197
通过端口映射,访问service的8080端口即为pod容器8080端口,为负载均衡:

对外暴露服务
apiVersion: v1
kind: Service
metadata:
name: test-k8s
spec:
selector:
app: test-k8s
# 默认 ClusterIP 集群内可访问,NodePort 节点可访问,LoadBalancer 负载均衡模式(需要负载均衡器才可用)
type: NodePort
ports:
- port: 8080 # 本 Service 的端口
targetPort: 8080 # 容器端口
nodePort: 31000 # 节点端口,范围固定 30000 ~ 32767

那么我们就可以直接通过节点IP进行访问了:

同样通过节点的公网IP可以访问:

经过本地尝试,在master和两个work共三个节点,均可通过节点IP访问这个31000端口服务。
service类型
ClusterIP
默认的,仅在集群内可用
NodePort
暴露端口到节点,提供了集群外部访问的入口
端口范围固定 30000 ~ 32767
LoadBalancer
需要负载均衡器(通常都需要云服务商提供)
会额外生成一个 IP 对外服务
Headless
适合数据库
clusterIp 设置为 None 就变成 Headless 了,不会再分配 IP
参考链接
https://k8s.easydoc.net/docs/dRiQjyTY/28366845/6GiNOzyZ/C0fakgwO