service
service的功用:
服务的固定访问入口,用于实现服务发现
流量的负载均衡
发现机制:
service label selecter > 判断pod label
每创建一个service,系统会自动创建一个同名的Endpoint资源
(Endpoint,Endpointslice)
评估条件:
符合标签选择器的条件
pod处于ready状态
访问:
service:会自动分配一个IP地址,clusterIP,serviceIP
service name > service ip
clusterDNS:skyDNS --> kubeDNS --> CoreDNS
CoreDNS:自动从API server发现每一个service的定义,service Name,IP和Port,自动创建为资源记录
注册监视:
watch service
service mode
如何将发现的各端点(IP:port)构建为集群,并能够接收和分发流量?
客户端侧的负载均衡机制:
客户端pod所在的节点,就是客户端要访问的模板service的负载均衡器;
本节点的kube-proxy会将service落地
针对某一特定服务,如何将集群中的每个节点都变成其均衡器:
1,在每个节点上运行一个kube-proxy,由kube-proxy注册监视API service的service资源;(创建,修改和删除)
2,将service的定义,转为本地负载均衡功能的落地实现;
(1)userspace 已被废弃
(2)IPtables (kernel space)
(3)IPVS (kernel space)
3,一个集群只能选择使用一种mode
kube-system名称空间中,configmap/kube-proxy
kubeadm默认使用iptables模式:
#kubectl get cm kube-proxy -o yaml -n kube-system > kube-proxy.yaml
4,服务数量N,平均每服务的端点量M、
iptables:规则数量非常多,集群规模较大时,对性能不利
ipvs:适用于中大规模集群
Service资源
Service是Kubernetes标准的API资源类型之一
◼ 为动态的Pod资源提供近似静态的流量入口
◆服务发现:通过标签选择器筛选同一名称空间下的Pod资源的标签,
完成Pod筛选
⚫ 实际上是由与Service同名的Endpoint或EndpointSlice资源及控制器完
成
◆流量调度:由运行各工作节点的kube-proxy根据配置的模式生成相应
的流量调度规则
⚫ iptables
⚫ ipvs
◼ 持续监视着相关Pod资源的变动,并实时反映至相应的流量调度规
则之上
service的类型
1.clusterIP
serviceip,serviceport
2.nodeport
3.LoadBlancer
(1)LBaas
(2)外部软负载均衡服务的实现,要能够与API联动
4.externalName
目标:将外部服务,定义到集群上,成为集群的服务
实现方法:servicename --> 外部服务的DNS名称
在coreDNS上,servicename要通过CNAME记录,解析为外部服务的DNS名称
管理资源对象的label
通过对象配置清单
通过“kubrctl label"
显示标签:
kubectl get pods --show-labels
-l 指定标签选择器,指定需要过滤的pod
kubectl get pods -l
添加:
kubectl label TYPE NAME key=value
改标签:
kubectl label --overwrite pods 名字 version=标签名
删除标签:
kubectl label pods 名字 标签名
标签和标签选择器
标签:附加在资源对象上的键值型元数据
⚫ 键标识:由“键前缀(可选)”和“键名”组成,格式为“key_prefix/key_name”
◆ 键前缀必须使用DNS域名格式
◆ 键名的命名格式:支持字母、数字、连接号、下划线和点号,且只能以字母或数字开头;最长63个字符;
⚫ “kubectl label”命令可管理对象的标签
标签选择器:基于标签筛选对象的过滤条件,支持两种类型
⚫ 基于等值关系的选择器
◆ 操作符:=或==、!=
⚫ 基于集合关系的选择器
◆ 操作符:in、notin和exists
◆ 使用格式:KEY in (VALUE1, VALUE2, …)、 KEY notin (VALUE1, VALUE2, …)、KEY 和 !KEY
Kubernetes上标准的API资源类型
apiVersion: v1
kind: Service
metadata:
name: …
namespace: …
spec:
type <string> # Service类型,默认为ClusterIP
selector <map[string]string> # 等值类型的标签选择器,内含“与”逻辑
ports: # Service的端口对象列表
- name <string> # 端口名称
protocol <string> # 协议,目前仅支持TCP、UDP和SCTP,默认为TCP
port <integer> # Service的端口号
targetPort <string> # 后端目标进程的端口号或名称,名称需由Pod规范定义
nodePort <integer> # 节点端口号,仅适用于NodePort和LoadBalancer类型
clusterIP <string> # Service的集群IP,建议由系统自动分配
externalTrafficPolicy <string> # 外部流量策略处理方式,Local表示由当前节点处理,Cluster表示向集群范围调度
loadBalancerIP <string> # 外部负载均衡器使用的IP地址,仅适用于LoadBlancer
externalName <string> # 外部服务名称,该名称将作为Service的DNS CNAME值
Service资源示例
ClusterIP Service
kind: Service
apiVersion: v1
metadata:
name: demoapp
spec:
type: ClusterIP # 类型标识,默认即为ClusterIP;
selector:
app: demoapp
ports:
- name: http # 端口名称标识
protocol: TCP # 协议,支持TCP、UDP和SCTP
port: 80 # Service的端口号
targetPort: 80 # 目标端口号,即后端端点提供服务的监听端口号
NodePort Service
kind: Service
apiVersion: v1
metadata:
name: demoapp
spec:
type: NodePort # 必须明确给出Service类型
selector:
app: demoapp
ports:
- name: http
protocol: TCP
port: 80
targetPort: 80
nodePort: 30080 # 可选,为避免冲突,建议由系统动态分配
示例:
clusterIP类型:
[root@k8s-master02 chapter7]#vim services-clusterip-demo.yaml
kind: Service
apiVersion: v1
metadata:
name: demoapp-svc
namespace: default
spec:
clusterIP: 10.97.72.1
selector:
app: demoapp
ports:
- name: http
protocol: TCP
port: 80
targe tPort: 80
创建service:
[root@k8s-master02 chapter7]#kubectl apply -f services-clusterip-demo.yaml
service/demoapp-svc created
查询service:
[root@k8s-master02 chapter7]#kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
demoapp-svc ClusterIP 10.97.72.1 <none> 80/TCP 14s
查询service过滤的标签:
[root@k8s-master02 chapter7]#kubectl describe service demoapp-svc
Name: demoapp-svc
Namespace: default
Labels: <none>
Annotations: <none>
Selector: app=demoapp
Type: ClusterIP
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.97.72.1
IPs: 10.97.72.1
Port: http 80/TCP
TargetPort: 80/TCP
Endpoints: 192.168.108.2:80 #根据标签过滤符合的IP
Session Affinity: None
Events: <none>
NodePort类型:
[root@k8s-master02 chapter7]#vim services-nodeport-demo.yaml
kind: Service
apiVersion: v1
metadata:
name: demoapp-nodeport-svc
spec:
type: NodePort
selector:
app: demoapp
version: v1.1
ports:
- name: http
protocol: TCP
port: 80
targetPort: 80
nodePort: 31398
创建service:
[root@k8s-master02 chapter7]#kubectl apply -f services-nodeport-demo.yaml
service/demoapp-nodeport-svc created
查询service:
[root@k8s-master02 chapter7]#kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
demoapp-nodeport-svc NodePort 10.107.117.60 <none> 80:31398/TCP 93s
查询service过滤的标签:
[root@k8s-master02 chapter7]#kubectl describe service demoapp-nodeport-svc
此时通过集群外部访问service节点IP,就会被service转到标签过滤选择的pod上
service接入流量入口
clusterIP:内部流量
nodeport:外部流量
ExternalIP:外部流量
service配置文件:标签没有版本,所有新旧版本都可以匹配
[root@ubuntu2004 chapter8]#vim service-blue-green.yaml
apiVersion: v1
kind: Service
metadata:
name: demoapp-svc
namespace: default
spec:
type: ClusterIP
selector:
app: demoapp
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80
创建新版本,新版本就绪后,会发现新版本会替换旧版本
默认滚动更新,加一个删一个