# K8s 服务发布 Service
# 1. Service 类型
Kubernetes Service Type(服务类型)主要包括以下几种:
- ClusterIP:在集群内部使用,默认值,只能从集群中访问。
- NodePort:在所有安装了 Kube-Proxy 的节点上打开一个端口,此端口可以代理至后端 Pod,可以通过 NodePort 从集群外部访问集群内的服务,格式为 NodeIP:NodePort。
- LoadBalancer:使用云提供商的负载均衡器公开服务,成本较高。
- ExternalName:通过返回定义的 CNAME 别名,没有设置任何类型的代理,需要 1.7 或更高版本 kube-dns 支持。
# 1.1 NodePort 类型
如果将 Service 的 type 字段设置为 NodePort,则 Kubernetes 将从 --service-node-port-range 参数指定的范围(默认为 30000-32767)中自动分配端口,也可以手动指定 NodePort,创建该 Service 后,集群每个节点都将暴露一个端口,通过某个宿主机的 IP + 端口即可访问到后端的应用。
apiVersion: v1 | |
kind: Service | |
metadata: | |
name: nginx-svc | |
namespace: default | |
labels: | |
app: nginx-svc | |
spec: | |
ports: | |
- port: 80 | |
targetPort: 80 | |
protocol: TCP | |
name: http | |
selector: | |
app: nginx | |
type: NodePort |
# 1.2 ClusterIP 类型
apiVersion: v1 | |
kind: Service | |
metadata: | |
name: nginx-svc | |
namespace: default | |
labels: | |
app: nginx-svc | |
spec: | |
ports: | |
- port: 80 | |
targetPort: 80 | |
protocol: TCP | |
name: http | |
selector: | |
app: nginx | |
type: ClusterIP |
# 1.3 使用 Service 代理 K8s 外部服务
使用场景:
- 希望在生产环境中使用某个固定的名称而非 IP 地址访问外部的中间件服务;
- 希望 Service 指向另一个 Namespace 中或其他集群中的服务;
- 正在将工作负载转移到 Kubernetes 集群,但是一部分服务仍运行在 Kubernetes 集群之外的 backend。
apiVersion: v1 | |
kind: Service | |
metadata: | |
labels: | |
app: mysql-svc-external | |
name: mysql-svc-external | |
spec: | |
clusterIP: None | |
ports: | |
- name: mysql | |
port: 3306 | |
protocol: TCP | |
targetPort: 3306 | |
type: ClusterIP | |
--- | |
apiVersion: v1 | |
kind: Endpoints | |
metadata: | |
labels: | |
app: mysql-svc-external | |
name: mysql-svc-external | |
subsets: | |
- addresses: | |
- ip: 192.168.40.150 | |
ports: | |
- name: mysql | |
port: 3306 | |
protocol: TCP |
# 1.4 ExternalName Service
ExternalName Service 是 Service 的特例,它没有 Selector,也没有定义任何端口和 Endpoint,它通过返回该外部服务的别名来提供服务。
比如可以定义一个 Service,后端设置为一个外部域名,这样通过 Service 的名称即可访问到该域名。使用 nslookup 解析以下文件定义的 Service,集群的 DNS 服务将返回一个值为 my.database.example.com 的 CNAME 记录:
kind: Service | |
apiVersion: v1 | |
metadata: | |
name: my-service | |
namespace: prod | |
spec: | |
type: ExternalName | |
externalName: my.database.example.com |
# 1.5 多端口 Service
apiVersion: v1 | |
kind: Service | |
metadata: | |
name: nginx-svc | |
namespace: default | |
labels: | |
app: nginx-svc | |
spec: | |
ports: | |
- port: 80 | |
targetPort: 80 | |
protocol: TCP | |
name: http | |
- port: 443 | |
targetPort: 443 | |
protocol: TCP | |
name: https | |
selector: | |
app: nginx | |
type: ClusterIP |