美文网首页
Kubernetes YAML 详解之网络服务一(Service

Kubernetes YAML 详解之网络服务一(Service

作者: 河码匠 | 来源:发表于2023-02-20 10:13 被阅读0次

    一、Service YAML

    Service 四层代理,简写 svc

    基于 IP 和 端口号

    Service 定义一个服务访问的入口,客户端通过这个入口访问服务后面的资源。

    Service 是一组 Pod 的逻辑集合,这组 Pod 有相同的标签,Service 通过 labelSelector 查找 Pod 标签来实现访问。

    kubectl explain service
    
    kubectl explain service.meatdata
    
    • Service 的 service.spec 字段

    kubectl explain service.spec
    
    字段 值类型 说明
    allocateLoadBalancerNodePorts boolean
    clusterIP string 定义集群 IP,typeClusterIP 时默认是随机分配的,不需要 ip 为空就行 clusterIP: none
    clusterIPs []string
    externalIPs []string
    externalName string typeexternalName时这里是请求其他命名空间时用的 pod 的域名
    externalTrafficPolicy string
    healthCheckNodePort integer
    internalTrafficPolicy string
    ipFamilies []string
    ipFamilyPolicy string
    loadBalancerClass string
    loadBalancerIP string
    loadBalancerSourceRanges []string
    ports []Object 端口
    appProtocol:
    name: 端口名
    nodePort: 物理机端口号,将 Service 的端口映射到物理机的端口
    * port: service 自己的端口号
    protocol: 协议 SCTP TCP UDP
    targetPort: 目标端口号,资源中容器的端口号,或给端口定义的名字
    publishNotReadyAddresses boolean
    selector map[string]string 容器标签选择器,直接写标签就行 如 app:123
    sessionAffinity string
    sessionAffinityConfig Object
    type string Service 类型

    ExternalName: 跨命名空间访问,服务仅通过域名
    (即服务名,名组合方式:
    SVC_NAME(service 名).NS_NAME(命名空间名).DOMAIN.LTD(集群默认的域名后缀 svc.cluster.loca)
    示例:nginx-service.default.svc.cluster.local
    提供对外的服务; \color{blue}{用法看下面示例}

    ClusterIP: 默认,服务只能在群集内访问, 通过群集 IP 的方式

    NodePort: 服务映射到物理机的一个端口上,对外提供服务

    LoadBalancer: 通过外部负载均衡对外提供服务

    示例:
    创建 nginx deployment 服务

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx
      labels:               # 定义 deployment 标签
        my_deploy: nginx 
    spec:
      replicas: 3
      selector:             # 定义标签选择器
        matchLabels:        # 定义标签筛选
          app: nginx
          version: v1
      template:
        metadata:
          labels:           # 定义 pod 标签
             app: nginx
             version: v1
        spec:
          containers:
          - name: nginx
            image: nginx
            imagePullPolicy: IfNotPresent
            ports:
            - containerPort: 80
    

    创建 ClusterIP 类型的 Service

    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-service
      labels:               # 定义 service 标签
        my_service: service
    spec:
      type: ClusterIP       # service 类型
      ports:                # 定义端口数据
      - port: 80            # Service 的端口号
        protocol: TCP       # 使用的协议
        targetPort: 80      # deployment 中 template 中 containers 的端口号
      selector:             # 标签选择器,找 app=nginx 的 pod
        app: nginx
    

    创建 NodePort 类型的 Service

    使用命令 ipvsadm -Ln 可以看到物理机的 31180 端口转发到 pod 的 80 端口
    其他节点也有这个规则

    root@master:~# ipvsadm -Ln
    TCP  192.168.17.130:31180 rr
     -> 10.244.104.15:80             Masq    1      0          0
     -> 10.244.104.16:80             Masq    1      0          0
     -> 10.244.166.136:80            Masq    1      0          0
    
    ......
    spec:
      type: NodePort        # service 类型
      ports:                # 定义端口数据
      - port: 80            # Service 的端口号
        protocol: TCP       # 使用的协议
        targetPort: 80      # deployment 中 template 中 containers 的端口号
        nodePort: 31180     # 映射到物理机的端口号,将 Service 的 80 映射到物理机 31180
    ......
    

    创建 ExternalName 类型的 Service

    ......
    spec:
      type: ExternalName                                   # 定义 ExternalName 类型
      externalName: nginx-service.xxxx.svc.cluster.local   # 定义其他命名空间 pod 的域名
    ......
    

    二、Endpoints YAML

    简写 ep
    引用外部资源,如:mysql

    kubectl explain endpoints
    
    • Endpoints 的 endpoints.meatdata 字段,与 pod 相同

    kubectl explain endpoints.meatdata
    

    \color{red}{注意}endpointsservice 关联时 endpoints.metadata.name 必须与 service.metadata.name 一致

    • Endpoints 的 endpoints.subsets 字段

    kubectl explain endpoints.subsets
    
    字段 值类型 说明
    addresses []Object 访问地址
    hostname: 主机名
    ip: IP 地址
    nodeName: 节点名
    targetRef:
    notReadyAddresses []Object
    ports []Object 端口
    appProtocol:
    name: 端口名
    nodePort: 物理机端口号,将 Service 的端口映射到物理机的端口
    * port: service 自己的端口号
    protocol: 协议 SCTP TCP UDP
    targetPort: 目标端口号,资源中容器的端口号

    示例:

    创建 mysql 的 service 服务

    apiVersion: v1
    kind: Service
    metadata:
      name: mysql
    spec:
      type: ClusterIP
      ports:
      - port: 3306
    

    创建 endpoints 服务

    apiVersion: v1
    kind: Endpoints
    metadata: 
      name: mysql          # 这里的名字必须和 service.metadata.name 一致
    subsets:
    - addresses:
      - ip: 192.168.17.131 # 定义 mysql 机器的 ip
      ports:
      - port: 3306         # mysql 端口号
    

    相关文章

      网友评论

          本文标题:Kubernetes YAML 详解之网络服务一(Service

          本文链接:https://www.haomeiwen.com/subject/aknmkdtx.html