Kubernetes yaml 之 Service yaml 文件

Service 有四种 type: ClusterIP(默认)、NodePort、LoadBalancer、ExternalName。其中 NodePort 和 LoadBalancer 两类型的 Services 可以对外提供服务。

Service yaml 文件包含四个部分:

  • apiVersion:表示版本。版本查看命令:kubectl api-versions
  • kind:表示资源
  • metadata:表示元信息
  • spec:资源规范字段

示例如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
apiVersion: v1             # API 的版本号,版本号可以用 kubectl api-versions 查询到
kind: Service # 表明资源对象,例如 Pod、RC、Service、Namespace 及 Node 等
metadata: # 资源对象的元数据定义
name: demo # 资源的名字,在同一个namespace中必须唯一
namespace: default # 部署在哪个namespace中。不指定时默认为default命名空间
labels: # 设定资源的标签
- app: demo
annotations: # 自定义注解属性列表

spec: # 资源对象的详细定义,持久化到 etcd 中保存
type: ClusterIP # Service类型,指定 service 的访问方式,默认ClusterIP。
# ClusterIP:虚拟的服务 ip 地址,用于 k8s 集群内部的pod访问,在 Node 上 kube-porxy 通过设置的 iptables 规则进行转发
# NodePort:使用宿主机端口,能够访问各个 Node 的外部客户端通过 Node 的 IP 和端口就能访问服务器
# LoadBalancer:使用外部负载均衡器完成到服务器的负载分发,需要在 spec.status.loadBalancer 字段指定外部负载均衡服务器的 IP,并同时定义 nodePort 和 clusterIP 用于公有云环境。
clusterIP: string # 虚拟服务IP地址,当 type=ClusterIP 时,如不指定,则系统会自动进行分配,也可以手动指定。当 type=loadBalancer,需要指定
sessionAffinity: string # 是否支持s ession,可选值为 ClietIP,默认值为空。ClientIP 表示将同一个客户端(根据客户端IP地址决定)的访问请求都转发到同一个后端Pod
ports: # 暴露的端口列表
- port: 8080 # Service 监听的端口,对应 ClusterIP,即 ClusterIP+ServicePort 供集群内部pod访问的
nodePort: 8080 # port 和 nodePort 都是service的端口,前者暴露给 k8s 集群内部服务访问,后者暴露给
# k8s 集群外部流量访问。从上两个端口过来的数据都需要经过反向代理 kube-proxy,流
# 入后端 pod 的 targetPort 上,最后到达 pod 内的容器。
targetPort: 8080 # 对应 pod 中容器的端口
protocol: TCP # 协议,支持TCP、UDP,默认 TCP
name: http # 端口名称
selector: # label选择器,管理 label 对应的 pod
name: enginehttpmanage # pod 的 label
status: # 当type=LoadBalancer时,设置外部负载均衡的地址,用于公有云环境
loadBalancer: # 外部负载均衡器
ingress:
ip: string # 外部负载均衡器的IP地址
hostname: string # 外部负载均衡器的主机名

补充:NodePort 类型的 service 可供外部集群访问是因为 service 监听了宿主机上的端口,即监听了(所有节点)nodePort,该端口的请求会发送给 service,service 再经由负载均衡转发给 Endpoints 的节点。


Kubernetes yaml 之 Service yaml 文件
https://flepeng.github.io/042-云原生-02-kubernetes-31-核心概念-Kubernetes-yaml-之-Service-yaml-文件/
作者
Lepeng
发布于
2023年3月1日
许可协议