K8s - 3 核心概念 - 11 Service


K8s - 目录



一、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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qumy97

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值