一、Service YAML
Service
四层代理,简写svc
基于 IP 和 端口号
Service
定义一个服务访问的入口,客户端通过这个入口访问服务后面的资源。
Service
是一组 Pod 的逻辑集合,这组 Pod 有相同的标签,Service 通过labelSelector
查找 Pod 标签来实现访问。
-
查看
Service
相关 yaml 字段说明, 与pod.metadata
相同
kubectl explain service
-
Service 的
service.meatdata
字段, 与pod.metadata
相同
kubectl explain service.meatdata
-
Service 的
service.spec
字段
kubectl explain service.spec
字段 | 值类型 | 说明 |
---|---|---|
allocateLoadBalancerNodePorts |
boolean |
|
clusterIP |
string |
定义集群 IP,type 为 ClusterIP 时默认是随机分配的,不需要 ip 为空就行 clusterIP: none
|
clusterIPs |
[]string |
|
externalIPs |
[]string |
|
externalName |
string |
当 type 为 externalName 时这里是请求其他命名空间时用的 pod 的域名 |
externalTrafficPolicy |
string |
|
healthCheckNodePort |
integer |
|
internalTrafficPolicy |
string |
|
ipFamilies |
[]string |
|
ipFamilyPolicy |
string |
|
loadBalancerClass |
string |
|
loadBalancerIP |
string |
|
loadBalancerSourceRanges |
[]string |
|
ports |
[]Object |
端口appProtocol : name : 端口名nodePort : 物理机端口号,将 Service 的端口映射到物理机的端口* port : service 自己的端口号protocol : 协议 SCTP TCP UDP targetPort : 目标端口号,资源中容器的端口号,或给端口定义的名字 |
publishNotReadyAddresses |
boolean |
|
selector |
map[string]string |
容器标签选择器,直接写标签就行 如 app:123
|
sessionAffinity |
string |
|
sessionAffinityConfig |
Object |
|
type |
string |
Service 类型ExternalName : 跨命名空间访问,服务仅通过域名(即服务名,名组合方式: SVC_NAME(service 名).NS_NAME(命名空间名).DOMAIN.LTD(集群默认的域名后缀 svc.cluster.loca) 示例: nginx-service.default.svc.cluster.local )提供对外的服务; ClusterIP : 默认 ,服务只能在群集内访问, 通过群集 IP 的方式NodePort : 服务映射到物理机的一个端口上,对外提供服务LoadBalancer : 通过外部负载均衡对外提供服务 |
示例:
创建 nginx deployment 服务
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
labels: # 定义 deployment 标签
my_deploy: nginx
spec:
replicas: 3
selector: # 定义标签选择器
matchLabels: # 定义标签筛选
app: nginx
version: v1
template:
metadata:
labels: # 定义 pod 标签
app: nginx
version: v1
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
创建 ClusterIP
类型的 Service
apiVersion: v1
kind: Service
metadata:
name: nginx-service
labels: # 定义 service 标签
my_service: service
spec:
type: ClusterIP # service 类型
ports: # 定义端口数据
- port: 80 # Service 的端口号
protocol: TCP # 使用的协议
targetPort: 80 # deployment 中 template 中 containers 的端口号
selector: # 标签选择器,找 app=nginx 的 pod
app: nginx
创建 NodePort
类型的 Service
使用命令
ipvsadm -Ln
可以看到物理机的 31180 端口转发到 pod 的 80 端口
其他节点也有这个规则root@master:~# ipvsadm -Ln TCP 192.168.17.130:31180 rr -> 10.244.104.15:80 Masq 1 0 0 -> 10.244.104.16:80 Masq 1 0 0 -> 10.244.166.136:80 Masq 1 0 0
......
spec:
type: NodePort # service 类型
ports: # 定义端口数据
- port: 80 # Service 的端口号
protocol: TCP # 使用的协议
targetPort: 80 # deployment 中 template 中 containers 的端口号
nodePort: 31180 # 映射到物理机的端口号,将 Service 的 80 映射到物理机 31180
......
创建 ExternalName
类型的 Service
......
spec:
type: ExternalName # 定义 ExternalName 类型
externalName: nginx-service.xxxx.svc.cluster.local # 定义其他命名空间 pod 的域名
......
二、Endpoints YAML
简写
ep
引用外部资源,如:mysql
kubectl explain endpoints
-
Endpoints 的
endpoints.meatdata
字段,与pod
相同
kubectl explain endpoints.meatdata
:
endpoints
与service
关联时endpoints.metadata.name
必须与service.metadata.name
一致
-
Endpoints 的
endpoints.subsets
字段
kubectl explain endpoints.subsets
字段 | 值类型 | 说明 |
---|---|---|
addresses |
[]Object |
访问地址hostname : 主机名ip : IP 地址nodeName : 节点名targetRef : |
notReadyAddresses |
[]Object |
|
ports |
[]Object |
端口appProtocol : name : 端口名nodePort : 物理机端口号,将 Service 的端口映射到物理机的端口* port : service 自己的端口号protocol : 协议 SCTP TCP UDP targetPort : 目标端口号,资源中容器的端口号 |
示例:
创建 mysql 的 service 服务
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
type: ClusterIP
ports:
- port: 3306
创建 endpoints 服务
apiVersion: v1
kind: Endpoints
metadata:
name: mysql # 这里的名字必须和 service.metadata.name 一致
subsets:
- addresses:
- ip: 192.168.17.131 # 定义 mysql 机器的 ip
ports:
- port: 3306 # mysql 端口号
网友评论