【K8S系列】第十二讲:Service进阶
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
目录
序言
当发现自己的才华撑不起野心时就安静下来学习吧
三言两语不如细心探索
今天学习一下Service相关内容希望此文能帮助读者对 k8s Service有进一步的认识
文章标记颜色说明
- 黄色重要标题
- 红色用来标记结论
- 绿色用来标记一级论点
- 蓝色用来标记二级论点
1.Service介绍
1.1 什么是Service
Kubernetes Service 定义了这样一种抽象
- 一个 Pod 的逻辑分组
- 一种可以访问这组Pod的策略
也可以理解为微服务。 这一组 Pod 能够被 Service 访问到通常是通过 Label Selector实现的。
Service 通过标签来选取服务后端一般配合
- Replication Controller
- Deployment
从而保证后端容器的正常运行。
这些匹配标签的 Pod IP 和端口列表组成 endpoints由 kube-proxy 负责将服务 IP 负载均衡到这些 endpoints 上。
如下图展示的是Service与Pod、RC的关系
总结
k8s的Service定义了一个服务的访问入口地址。
前端的应用通过这个入口地址访问其背后的一组由Pod副本组成的集群实例来自外部的访问请求被负载均衡到后端的各个容器应用上。
1.2 Service 类型
Service 类型有四种总接下来
- NodePort
- LoadBalancer
- ExternalName
- ClusterIP
在定义Service的时候可以指定一个需要的类型的Service。
如果不指定则默认是ClusterIP类型。
1.2.1 NodePort
只对外部可见
通过每个 Node 节点上的 IP 和静态端口NodePort暴露服务。
NodePort 服务会路由到 ClusterIP 服务这个 ClusterIP 服务会自动创建。
通过请求可以从集群的外部访问一个 NodePort 服务
主要适合集群外业务访问的场景。
如下
apiVersion: v1 kind: Service metadata: name: test-service spec: selector: app: test type: NodePort # 指定service 类型 ports: - protocol: TCP port: 80 targetPort: 80 name: test-http nodePort: 30000 # 范围30000-32767
设置 type 的值为 "NodePort"Kubernetes master 将从给定的配置范围内默认30000-32767分配端口
每个 Node 将从该端口每个 Node 上的同一端口代理到 Service。
该端口将通过 Service 的 spec.ports[*].nodePort 字段被指定这里指定的是30000
如果不指定的话会自动生成一个端口。
1.2.2 LoadBalancer
使用云提供商的负载局衡器可以向外部暴露服务。
外部的负载均衡器可以路由到 NodePort 服务和 ClusterIP 服务
需要结合具体的云厂商进行操作
1.2.3 ExternalName
ExternalName 是 Service 的特例
- 没有 selector
- 没有定义任何的端口和 Endpoint
对于运行在集群外部的服务它通过返回该外部服务的别名这种方式来提供服务。
示例
kind: Service apiVersion: v1 metadata: name: test-service namespace: test spec: type: ExternalName # 类型 externalName: test.service.com
1.2.4 ClusterIP
只对内部可见外部无法访问
Service的IP地址通过集群的内部 IP 暴露服务服务只能够在kubernetes集群内部可以访问此为虚拟IP地址
是默认的ServiceType。
kubectl -n test get Service # 即可看到ClusterIP
test 是命名空间
2.yaml名词解释
以下为yaml名词解释
apiVersion: v1 # 版本
kind: Service # 类型
metadata: #元数据 类型string
name: test #Service名称 类型string
namespace: test #命名空间不指定时默认为default命名空间
labels: #自定义标签属性列表 类型string
- name: string
annotations: #自定义注解属性列表
- name: string
spec: #详细描述 类型list[]
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 #端口名称 类型string
protocol: TCP #端口协议支持TCP或UDP默认TCP 类型string
port: 80 #服务监听的端口号 类型int
targetPort: 8080 #需要转发到后端的端口号 类型int
nodePort: 8080 #当type=NodePort时指定映射到物理机的端口号 类型int
status: #当type=LoadBalancer时设置外部负载均衡的地址用于公有云环境
loadBalancer: #外部负载均衡器
ingress: #外部负载均衡器
ip: string #外部负载均衡器的IP地址
hostname: string #外部负载均衡器的机主机