9.kubernetes Service
  IS4yhiOomKTv 2023年11月02日 40 0

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
    
创建新版本,新版本就绪后,会发现新版本会替换旧版本
默认滚动更新,加一个删一个
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  4Txe79BjyroE   2023年12月08日   30   0   0 TCP
  Yoru5qB4TSKM   2023年12月10日   39   0   0 服务器重启IP
  ozzp9aSSE46S   2023年11月30日   33   0   0 DNSIPPod
  48fXx4UfWSFg   2023年12月06日   58   0   0 bcIPbundle
  pfb3gDAOHucg   2023年12月09日   42   0   0 TCP网络层协议UDP
  mjtHZIki74si   2023年12月06日   34   0   0 TCP重传
  aYmIB3fiUdn9   2023年12月08日   50   0   0 客户端IPNATlvs