• k8s service


    Service 基础概念

    在 Kubernetes(K8s)中,Service 是一个抽象的概念,表示一个应用程序的逻辑集合和访问这些应用程序的策略。通常,Service 都通过标签(Label)与 Pod 连接,服务会自动为这些 Pod 创建端口映射关系,有利于流量的负载均衡和服务发现。

    Service 类型:

    k8s service主要包括以下几种类型:

    1. ClusterIP: ClusterIP 是默认的 ServiceType。该类型的 Service 只有一个集群内部的 IP 地址,可以实现服务发现并允许 Pod 之间的通信。

    2. NodePort: NodePort 会在每个 Node 上打开一个端口,并将来自该端口的流量转发到 Service。这使得 Service 能够从集群外部访问。

    3. LoadBalancer: LoadBalancer 会为 Service 创建一个外部负载均衡器,并将 NodePort 服务和 ClusterIP 服务都映射到这个负载均衡器上,默认从外面的请求只能访问到这个 load balancer。

    4. ExternalName: ExternalName 是另一种特殊的 Service 类型,与上述三种类型的 Service 不同,它没有选择器,没有定义任何端口,也没有要代理的 IP 或者其他一切。只做一件事,返回 CNAME 记录,也就是别名记录。

    Service 的工作流程:

    1. 当在 Kubernetes 中创建一个 Service,并且这个 Service 的选定了一个或多个 Pod,Kubernetes 会为这个 Service 分配一个 IP 地址,也称为集群 IP。
    2. Kubernetes 会在整个集群范围内为这个新的 Service 创建一个代理服务,代理会负责将对该 Service 的所有请求转发到它管理的 Pod 上。
    3. 当你的应用程序需要和其他服务交互时,只需要使用这个 Service 的 IP 或者 DNS 名字进行通信,Kubernetes 会自动将请求转发到正确的 Pod。

    这种方式可以很好地将服务的消费者与服务的提供者进行解耦,使得服务的消费者不需要关心具体的服务提供者是谁,也无需关心服务提供者的数量、位置和状态等。

    东西流量,南北流量

    在网络架构中,术语"南北流量"和"东西流量"常常用来描述数据包在数据中心中的流动方向。

    • 南北流量:术语“南北流量”用于描述客户端与服务器之间,或者是网络的入口和出口之间的流量。这种流量主要是从数据中心流出或流入的流量,这就好比数据中心的"南"和"北"边界。在 Kubernetes(K8s)环境中,南北流量主要由 Kubernetes Ingress 或者 Service(类型为 LoadBalancer 或 NodePort)负责处理。例如,一个从互联网发来的请求进入 Kubernetes 集群,就是一种南北流量的例子。

    • 东西流量:术语“东西流量”用于描述在数据中心内部,服务与服务之间的流量。这种流量主要是数据中心内部各个服务之间的互相通信,就好比数据中心的"东"和"西"边界。在 Kubernetes 环境中,东西流量主要由 Kubernetes Service 负责处理。例如,一个 Pod 发送请求给另一个 Pod,就是一种东西流量的例子。

    这两种流量模式在微服务架构中尤其重要,因为微服务架构中的服务数量可能上千个,且每个服务间可能需要频繁通信。理解南北流量和东西流量的不同,对于设计和管理 Kubernetes 网络策略、提高网络性能和安全性都有很大的帮助。
    在这里插入图片描述
    在这里插入图片描述
    例如在这张图中,有两个service分别管理商品服务和订单服务;用户访问商品的时候,商品服务需要去查询订单,这时候蓝色的容器1内的商品服务就可以直接访问同为蓝色的service订单。同理,绿色的容器订单服务可以访问绿色的商品service获取商品信息。

    NodePort

    关于k8s各种类型port参考文章:http://t.csdnimg.cn/68crH

    NodePort.yaml

    apiVersion: v1
    kind: Service
    metadata:
      labels:
      	app: test		# service自己本身的标签
      name: nodeport-study
      namespace: my-ns-nodeport
    spec:
      externalTrafficPolicy: Cluster
      internalTrafficPolicy: Cluster
      ipFamilies:
      - IPv4
      ipFamilyPolicy: SingleStack
      ports:
      - name: port1
        port: 81    # port字段定义了Service暴露给集群内部和外部的端口号
        protocol: TCP
        targetPort: 80    # targetPort字段定义了Service将流量转发到后端Pod的容器端口号
      selector:	# 匹配哪些pod会被service代理,所有匹配到以下标签的pod都可以通过该service进行访问
        app: test-app
        city: shanghai
        project: k8s-study
      type: NodePort
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    在这里插入图片描述

    nginx-pod.yaml

    apiVersion: v1
    kind: Pod
    metadata:
      labels:
        app: test-app
        project: k8s-study
        city: shanghai
      name: nginx-pod
      namespace: my-ns-nodeport
    spec:
      containers:
      - image: nginx:1.9.1
        imagePullPolicy: IfNotPresent
        name: nginx
        ports:
        - containerPort: 80
          name: nginx-port
          protocol: TCP
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    在这里插入图片描述

    kb edit svc nodeport-study -n my-ns-nodeport 可以看到自动开启了一个和k8s node物理机绑定的端口。

    在这里插入图片描述

    1. 通过nodePort物理机端口连接
      在这里插入图片描述
    2. kb exec -it toolbox-0 bash 从一个其它命名空间的pod中访问。这个时候需要用yaml配置的集群内端口81访问。
      在这里插入图片描述

    LoadBalancer

    LoadBalancer.yaml

    apiVersion: v1
    kind: Service
    metadata:
      name: loadbalancer-study
      namespace: my-ns-nodeport
    spec:
      ports:
      - name: port2
        port: 82    # port字段定义了Service暴露给集群内部和外部的端口号
        protocol: TCP
        targetPort: 80    # targetPort字段定义了Service将流量转发到后端Pod的容器端口号
      selector:
        city: beijing
        project: loadbalancer-study
      type: LoadBalancer
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    nginx-pod.yaml

    apiVersion: v1
    kind: Pod
    metadata:
      labels:
        project: loadbalancer-study
        city: beijing
      name: nginx-pod-loadbalancer
      namespace: my-ns-nodeport
    spec:
      containers:
      - image: nginx:1.9.1
        imagePullPolicy: IfNotPresent
        name: nginx
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        ports:
        - containerPort: 80
          name: nginx-port
          protocol: TCP
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    在这里插入图片描述
    可以看到新创建处理的LoadBalancer类型的service有一个对外的EXTERNAL-IP。

    1. 这个ip是可以在集群外部直接访问。
      在这里插入图片描述
    2. 集群内部访问。
      在这里插入图片描述
  • 相关阅读:
    【SA8295P 源码分析】126 - 摄像头 POC (Power over Coax) 同轴电缆供电技术原理分析
    逆向-beginners之字符串数组
    加密算法、哈希算法及其区别+国密简介
    【华为OD机试】删除目录
    微服务项目使用RabbitMQ
    navicat16 破解(注意破解时候要断网)
    小侃设计模式(七)-桥接模式
    python requests.post请求404问题
    ElasticSearch+Kibana搭建与问题
    C/C++学生综合测评系统
  • 原文地址:https://blog.csdn.net/Zx13170918986/article/details/134225254