Service

概念

在 Kubernetes 中,Service 是一种抽象,用于定义一个逻辑服务,该服务由一组运行在集群中的 Pod 提供支持。Service 为这些 Pod 定义了稳定的虚拟 IP 地址和 DNS 名称,并提供负载均衡、服务发现和会话亲和等功能。

具体来讲,当创建了一个 Service 后,Kubernetes 会自动为其分配一个唯一的 ClusterIP(仅在集群内部可访问的虚拟 IP 地址),并将其关联到一组 Pod 上。当客户端以 Service 的 ClusterIP 为目标进行连接时,Kubernetes 会自动将请求转发到这组 Pod 中的任意一个实例上,从而实现负载均衡的效果。

Service四种访问方式

  1. ClusterIP:这是 Service 的默认访问方式,将为 Service 创建一个仅集群内部可访问的虚拟 IP 地址,用于在 Kubernetes 集群内部访问 Service。使用该方式,请求将通过 kube-proxy 转发到后端 Pod。
  2. NodePort:该方式会将 Service 暴露在每个节点的高阶端口上,并将流量从该端口转发到 Service 中的后端 Pod。这样,客户端可以通过任意节点的 IP 地址和暴露的端口号访问 Service。需要注意的是,NodePort 3. 通常只适用于测试和开发环境,正式环境应该使用其他访问方式。
  3. LoadBalancer:该方式通过云厂商提供的负载均衡器将外部流量路由到 Service 中的后端 Pod。使用该方式,能够自动分配公网 IP 和域名,并且支持负载均衡、故障检测等功能,更适合于生产环境中的应用。
  4. ExternalName:该方式将 Service 映射到一个外部域名地址,这样客户端就可以通过 Service 名称访问外部服务。需要注意的是,使用 ExternalName 访问的服务必须通过 DNS 解析得到真实的 IP 地址,否则会出现错误。

定义一个Service

定义service的yaml文件

kind: Service
apiVersion: v1
metadata:
 name: my-service
spec:
 selector:
   app: nginx
 ports:
 - protocol: TCP
   port: 80 #service自己的端口
   targetPort: 80 #容器的端口

创建服务

apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
  labels:
    app: nginx
  managedFields:
  name: nginx
  namespace: default
spec:
  progressDeadlineSeconds: 600
  replicas: 3
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: nginx
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: nginx
    spec:
      containers:
      - image: registry.cn-beijing.aliyuncs.com/dotbalo/nginx:1.15.12-alpine
        imagePullPolicy: IfNotPresent
        name: nginx
        ports:
        - containerPort: 80
        resources:
          limits:
            cpu: 200m
            memory: 512Mi
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30

说明:
该示例为 my-service:80 即可访问到具有 app=nginx 标签的 Pod 的 80 端口上。
需要注意的是,Service 能够将一个接收端口映射到任意的 targetPort,如果 targetPort 为空,
targetPort 将被设置为与 Port 字段相同的值。targetPort 可以设置为一个字符串,引用 backend
Pod 的一个端口的名称,这样的话即使更改了 Pod 的端口,也不会对 Service 的访问造成影响。
Kubernetes Service 能够支持 TCP、UDP、SCTP 等协议,默认为 TCP 协议。

posted @ 2023-03-29 23:04  Yusir-SRE  阅读(107)  评论(0编辑  收藏  举报