K8s - 3 核心概念 - 11 Service
一、kubernetes 核心技术-Service
1. Service 概述
Service 是 Kubernetes 最核心概念,通过创建 Service,可以为一组具有相同功能的容器应用提供一个统一的入口地 址,并且将请求负载分发到后端的各个容器应用上。
2. Service 的定义
2.1 yaml 格式的 Service 定义文件
apiVersion: v1
kind: Service
metadata:
#元数据
name: string
#Service名称
namespace: string
#命名空间,不指定时默认为default命名空间
labels:
#自定义标签属性列表
- name: string
annotations:
#自定义注解属性列表
- name: string
spec:
#详细描述
selector: []
#Label Selector配置,选择具有指定label标签的pod作为管理范围
type: string
#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
#是否支持session,可选值为ClietIP,默认值为空
#ClientIP表示将同一个客户端(根据客户端IP地址决定)的访问请求都转发到同一个后端Pod
ports:
#service需要暴露的端口列表
- name: string
#端口名称
protocol: string
#端口协议,支持TCP或UDP,默认TCP
port: int
#服务监听的端口号
targetPort: int
#需要转发到后端的端口号
nodePort: int
#当type=NodePort时,指定映射到物理机的端口号
status:
#当type=LoadBalancer时,设置外部负载均衡的地址,用于公有云环境
loadBalancer:
#外部负载均衡器
ingress:
#外部负载均衡器
ip: string
#外部负载均衡器的IP地址
hostname: string
#外部负载均衡器的机主机
属性名称 | 取值类型 | 是否必选 | 取值说明 |
---|---|---|---|
3. Service 的基本用法
(1)一般来说,对外提供服务的应用程序需要通过某种机制来实现,对于容器应用最简便的方式就是通过 TCP/IP 机制及监听 IP 和端口号来实现。创建一个基本功能的 Service。
apiVersion: v1
kind: ReplicationController
metadata:
name: mywebapp
spec:
replicas: 2
template:
metadata:
name: mywebapp
labels:
app: mywebapp
spec:
containers:
- name: mywebapp
image: tomcat
ports:
- containerPort: 8080
(2)我们可以通过 kubectl get pods -l app=mywebapp -o yaml | grep podIP 来获取 Pod 的 IP 地址和端口号来访问 Tomcat 服务,但是直接通过 Pod 的 IP 地址和端口访问应用服务是不可靠的,因为当 Pod 所在的 Node 发生故障时, Pod 将被 kubernetes 重新调度到 另一台 Node,Pod 的地址会发生改变。我们可以通过配置文件来定义 Service,再通过 kubectl create 来创建,这样可以通过 Service 地址来访问后端的 Pod。
apiVersion: v1
kind: Service
metadata:
name: mywebAppService
spec:
ports:
- port: 8081
targetPort: 8080
selector:
app: mywebapp
4. 多端口 Service
有时一个容器应用也可能需要提供多个端口的服务,那么在 Service 的定义中也可以相应地设置为将多个端口对应到多个应用服务。
apiVersion: v1
kind: Service
metadata:
name: mywebAppService
spec:
ports:
- port: 8080
targetPort: 8080
name: web
- port: 8005
targetPort: 8005
name: management
selector:
app: mywebapp
5. 外部服务 Service
在某些特殊环境中,应用系统需要将一个外部数据库作为后端服务进行连接,或将另一个集群或 Namespace 中的服务作为服务的后端,这时可以通过创建一个无 Label Selector 的 Service 来实现。
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
ports:
- protocol: TCP
port: 80
targetPort: 80
---
apiVersion: v1
kind: Endpoints
metadata:
name: my-service
subsets:
- addresses:
- ip: 10.254.74.3
ports:
- port: 8080