美文网首页
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详解

    yaml格式的pod定义文件完整内容 App Deployment nginx 部署示例 创建Service提供对...

  • k8s service

    Service代理: kube-proxy组件详解 Kubernetes service只是把应用对外提供服务的方...

  • Kubernetes学习笔记--Service

    Kubernetes 中的服务(Service)是将运行在一组上的应用程序公开为网络服务的抽象方法。Service...

  • 连接跟踪(conntrack)

    概述 连接跟踪是很多网络服务和应用的基础。例如,kubernetes的service,ServiceMesh si...

  • Kubernetes-Service和Ingress详细讲解

    Service详解 1.Service介绍 在kubernetes中,pod是应用程序的载体,我们可以通过pod的...

  • Kubernetes YAML文件详解

    本文以部署showdoc为例来讲解yaml配置文件 定义StatefulSet 定义Service 定义Ingress

  • kubernetes容器编排YAML详解

    简单认识 k8s 集群中对资源管理和资源对象编排部署都可以通过声明样式( YAML)文件来解决, 也 就是可以把需...

  • docker-compose link 导致服务不可用

    问题是这样的,一般我们在写 docker-compose.yaml 中的 service 时,service 之...

  • Kubernetes

    kubernetes yaml语法参考 一个kubernetes yaml文件中必须要有的三个字段,apiVers...

  • kubernetes之service

    每创建一个pod,kubernetes都会为pod创建一个虚拟的ip地址,基于这样一个虚拟的IP地址,kebern...

网友评论

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

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