关于nginx:Kubernetes的Service概念

8次阅读

共计 2718 个字符,预计需要花费 7 分钟才能阅读完成。

将运行在一组 Pods 上的应用程序公开为网络服务的形象办法。
应用 Kubernetes,你无需批改应用程序即可应用不相熟的服务发现机制。Kubernetes 为 Pod 提供本人的 IP 地址,并为一组 Pod 提供雷同的 DNS 名,并且能够在它们之间进行负载平衡。

Service 的工作模式

  • userspace 代理模式
  • iptables 代理模式
  • IPVS 代理模式

多端口 Service, 如以下示例:

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app.kubernetes.io/name: MyApp
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 9376
    - name: https
      protocol: TCP
      port: 443
      targetPort: 9377

内部服务 Service

在某些环境中,利用零碎须要将一个内部数据库作为后端服务进行连贯,或将另一个集群或 Namespace 中的服务作为服务的后端,这时能够通过创立一个无 Label Selector 的 Service 来实现。

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

(此时须要创立一个和该 Service 同名的 Endpoint)。

apiVersion: v1
kind: Endpoints
metadata:
  name: mysql-test
  namespace: default
subsets:
  - addresses:
    - ip: 120.25.128.30
    ports:
      - port: 3306

Headless Service

在某些利用场景中,凋谢人员心愿本人管制负载平衡的策略,不应用 Service 提供的默认负载平衡的性能,或者应用程序心愿晓得属于同组的其余实例。此种服务不为 Service 设置 ClusterIP, 仅通过 Label Selector 找后端的 Pod 列表返回给调用的客户端。

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
 ports:
 - port: 80
 clusterIP: None
 selector:
  app: nginx

Service 的类型

  • ClusterIP:指定 Service 的拜访形式,默认值为 ClusterIP
  • NodePort:通过每个节点上的 IP 和动态端口(NodePort)裸露服务。NodePort 服务会路由到主动创立的 ClusterIP 服务。通过申请 < 节点 IP>:< 节点端口 >,你能够从集群的内部拜访一个 NodePort 服务。
  • LoadBalancer:应用云提供商的负载均衡器向内部裸露服务。内部负载均衡器能够将流量路由到主动创立的 NodePort 服务和 ClusterIP 服务上。
  • ExternalName:通过返回 CNAME 和对应值,能够将服务映射到 externalName 字段的内容(例如,foo.bar.example.com)。无需创立任何类型代理。

ClusterIP:这个 service 有一个 Cluster-IP,其实就一个 VIP。具体实现原理依附 kubeproxy 组件,通过 iptables 或是 ipvs 实现。

NodePort:在 ClusterIP 根底上为 Service 在每台机器上绑定一个端口,这样就能够通过: NodePort 来拜访该服务。

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: NodePort #类型
  selector:
    app.kubernetes.io/name: MyApp
  ports:
      # 默认状况下,为了不便起见,`targetPort` 被设置为与 `port` 字段雷同的值。- port: 80  # Service 端口
      targetPort: 80 # 容器端口
      protocol: TCP # 协定
      # 可选字段
      # 默认状况下,为了不便起见,Kubernetes 管制立体会从某个范畴内调配一个端口号(默认:30000-32767)nodePort: 30007 # 对外裸露的端口,能够指定 

LoadBalancer:在 NodePort 的根底上,借助 Cloud Provider 创立一个内部负载均衡器,并将申请转发到 NodePort

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app.kubernetes.io/name: MyApp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9376
  clusterIP: 10.0.171.239
  type: LoadBalancer
status:
  loadBalancer:
    ingress:
    - ip: 192.0.2.127

ExternalName:把集群内部的服务引入到集群外部来,在集群外部间接应用。没有任何类型代理被创立,这只有 Kubernetes 1.7 或更高版本的 kube-dns 才反对。

集群内部拜访 Pod 或 Service 的办法

将容器利用的端口号映射到物理机

  • 通过设置容器级别的 hostPort,将容器利用的端口映射到物理机上

    apiVersion: v1
    kind: Pod
    metadata:
    name: webapp
    labels:
     app: webapp
    spec:
     containers:
     - name: webapp
     image: tomcat
     ports:
     - containerPort: 8080
       hostPort: 8081
  • 通过设置 Pod 级别的 hostNetwork=true, 该 Pod 中所以容器的端口号都被间接映射到物理机上。

    apiVersion: v1
    kind: Pod
    metadata:
    name: webapp
    labels:
     app: webapp
    spec:
     hostNetwork: true
     containers:
     - name: webapp
     image: tomcat
     ports:
     - containerPort: 8080
将 Service 的端口号映射到物理机
  • 通过配置 nodePort 映射到物理机,同时设置 Service 的类型为 NodePort

    apiVersion: v1
    kind: Service
    metadata:
    name: nginx
    labels:
      app: nginx
    spec:
     type: NodePort
     ports:
     - port: 80
     targetPort: 8080
     nodePort: 8081
     selector:
    app: nginx

    如有 @侵权,请分割 2787950493@qq.com 改版。

正文完
 0