• 【云原生】kubernetes中Service深度学习


    Service

    目录

    1 什么是 Service

    2 特性

    3 Service 和 Pod 关系

    4 使用 Service

    5 多端口

    6 类型 type

    7 内部通信


    1 什么是 Service

    1.1 定义

    官网地址: 服务(Service) | Kubernetes

    将运行在一个或一组 Pod 上的网络应用程序公开为网络服务的方法。

    通俗定义: Service 用来为 pod 提供网络服务的一种方式。

    1.2 为什么需要 Service

    问题: 如果一组 Pod(称为“后端”)为集群内的其他 Pod(称为“前端”)提供功能, 那么前端如何找出并跟踪要连接的 IP 地址,以便前端可以使用提供工作负载的后端部分?

    image-20230307133342270

    如果这是一个图片处理后端,它运行了 3 个副本。这些副本是可互换的 —— 前端不需要关心它们调用了哪个后端副本。 然而组成这一组后端程序的 Pod 实际上可能会发生变化, 前端客户端不应该也没必要知道,而且也不需要跟踪这一组后端的状态。Service 定义的抽象能够解耦这种关联

    2 特性

    • Service 通过 label 关联对应的 Pod

    • Servcie 生命周期不跟 Pod 绑定,不会因为 Pod 重新创建而改变 IP

    • 提供了负载均衡功能,自动转发流量到不同 Pod

    • 可对集群外部提供访问端口

    • 集群内部可通过服务名字访问

    3 Service 和 Pod 关系

    4 使用 Service

    1. apiVersion: apps/v1
    2. kind: Deployment
    3. metadata:
    4. name: nginx
    5. labels:
    6.   app: nginx
    7. spec:
    8. replicas: 1
    9. template:
    10.   metadata:
    11.     name: nginx
    12.     labels:
    13.       app: nginx
    14.   spec:
    15.     containers:
    16.       - name: nginx
    17.         image: nginx:1.19
    18.         imagePullPolicy: IfNotPresent
    19.         ports:
    20.           - containerPort: 80
    21.     restartPolicy: Always
    22. selector:
    23.   matchLabels:
    24.     app: nginx
    25. ---
    26. apiVersion: v1
    27. kind: Service
    28. metadata:
    29. name: nginx
    30. spec:
    31. selector:
    32.   app: nginx
    33. ports:
    34.   - port: 8080 #service 端口
    35.     targetPort: 80 #容器端口
    36.     nodePort: 31001 #node 节点端口 固定在 30000-32767 之间
    37. type: NodePort

    注意:节点端口固定在 30000-32767 之间

    5 多端口

    1. apiVersion: apps/v1
    2. kind: Deployment
    3. metadata:
    4. name: nginx
    5. labels:
    6.   app: nginx
    7. spec:
    8. replicas: 1
    9. template:
    10.   metadata:
    11.     name: nginx
    12.     labels:
    13.       app: nginx
    14.   spec:
    15.     containers:
    16.       - name: nginx
    17.         image: nginx:1.19
    18.         imagePullPolicy: IfNotPresent
    19.         ports:
    20.           - containerPort: 80
    21.     restartPolicy: Always
    22. selector:
    23.   matchLabels:
    24.     app: nginx
    25. ---
    26. apiVersion: v1
    27. kind: Service
    28. metadata:
    29. name: nginx
    30. spec:
    31. selector:
    32.   app: nginx
    33. ports:
    34.   - port: 8080 #service 端口
    35.     name: write
    36.     targetPort: 80 #容器端口
    37.     nodePort: 31001 #node 节点端口 固定在 30000-32767 之间
    38.   - port: 8081
    39.     name: read
    40.     targetPort: 80
    41.     nodePort: 31002
    42. type: NodePort

    6 类型 type

    服务(Service) | Kubernetes

    对一些应用的某些部分(如前端),可能希望将其暴露给 Kubernetes 集群外部的 IP 地址。

    Kubernetes ServiceTypes 允许指定你所需要的 Service 类型。

    • ClusterIP:在集群内部暴露 Service,只能被集群内部的其他对象访问,通常用于内部服务发现,不会向集群外部暴露。

    • NodePort:将 Service 暴露在 Node 的某个端口上,从而可以通过 Node 的 IP 地址和端口号来访问 Service,通常用于开发和测试环境。

    • LoadBalancer:通过云服务商提供的负载均衡器来将 Service 暴露到公网上,使得外部用户可以访问 Service。

    • ExternalName:将 Service 映射到一个 DNS 名称上,从而可以通过 DNS 名称来访问 Service,通常用于访问外部服务。

    6.1 ClusterIP 类型
    • 这是最常用的 Service 类型之一。在集群内部创建一个虚拟 IP 地址,它可以被其他在同一集群内的 Pod 访问,但不能被集群外部的请求所访问。这种类型的服务通常用于内部服务的暴露,例如数据库或者缓存服务。比如在一个 Web 应用中,你可能需要连接到一个数据库,但是这个数据库并不需要在应用之外暴露。这时候,你可以使用 ClusterIP 类型的 Service,让应用可以访问到数据库。

    6.2 NodePort 类型
    • 这种类型的 Service 将会创建一个端口,并绑定到每个集群节点上,从而允许外部流量访问 Service。这个类型通常用于公共服务的暴露,例如 Web 应用或者 API。比如你需要在集群外部访问到一个运行在集群中的 Web 应用,你就可以创建一个 NodePort 类型的 Service,通过指定 Service 的 nodePort 字段,来将 Service 暴露给集群外部。

    • 如果你将 type 字段设置为 NodePort,则 Kubernetes 控制平面将在 --service-node-port-range 标志指定的范围内分配端口(默认值:30000-32767)。

    6.3 LoadBalancer 类型
    • 这种类型的 Service 类似于 NodePort,但是会在云厂商中创建一个负载均衡器。这个类型通常用于在云平台上部署应用。云平台的负载均衡器将流量分发到集群中的节点。这个类型的 Service 只能在云平台上使用,并且需要云厂商提供支持。

    6.4 ExternalName 类型
    • 这种类型的 Service 允许 Service 到任何需要访问的 CNAME DNS 条目的转发。与其它类型的 Service 不同,它并不会代理请求到任何 Pod。相反,它将请求转发到配置的外部地址。这种类型的 Service 通常用于将服务代理到集群外部的其他服务。比如你有一个运行在外部网络上的服务,你希望在 Kubernetes 集群中使用该服务,这时候你可以创建一个 ExternalName 类型的 Service,将服务的 DNS 解析到 Kubernetes 集群中。

    7 内部通信

    7.1 创建 pod
    1. apiVersion: apps/v1
    2. kind: Deployment
    3. metadata:
    4. name: mysql
    5. labels:
    6.   app: mysql
    7. spec:
    8. selector:
    9.   matchLabels:
    10.     app: mysql
    11. replicas: 1
    12. template:
    13.   metadata:
    14.     labels:
    15.       app: mysql
    16.   spec:
    17.     containers:
    18.     - name: mysql
    19.       image: mysql/mysql-server:8.0
    20.       env:
    21.       - name: MYSQL_ROOT_PASSWORD
    22.         value: root
    23.       ports:
    24.       - name: mysql
    25.         containerPort: 3306
    26. ---
    27. apiVersion: v1
    28. kind: Service
    29. metadata:
    30. name: mysql
    31. spec:
    32. selector:
    33.   app: mysql
    34. ports:
    35. - name: mysql
    36.   port: 3306
    37.   targetPort: 3306
    38. type: ClusterIP
    39. apiVersion: apps/v1
    40. kind: Deployment
    41. metadata:
    42. name: nginx
    43. labels:
    44.   app: nginx
    45. spec:
    46. selector:
    47.   matchLabels:
    48.     app: nginx
    49. replicas: 1
    50. template:
    51.   metadata:
    52.     labels:
    53.       app: nginx
    54.   spec:
    55.     hostNetwork: true
    56.     containers:
    57.     - name: nginx
    58.       image: nginx:latest
    59.        #command: ["/bin/sh", "-c"]
    60.        #args:
    61.        #- apt-get update && apt-get install -y mysql-client && nginx -g 'daemon off;'
    62.       ports:
    63.       - name: http
    64.         containerPort: 80
    65. ---
    66. apiVersion: v1
    67. kind: Service
    68. metadata:
    69. name: nginx
    70. spec:
    71. selector:
    72.   app: nginx
    73. ports:
    74. - name: http
    75.   port: 8081
    76.   targetPort: 80
    77. type: ClusterIP
    7.2 相互访问
    # 进入 nginx 访问mysql
    $ mysql -h mysql -uroot -ppassword
    # 注意:这里的 mysql 是 MySQL Service 的名称,而不是 Pod 的名称。
    
  • 相关阅读:
    普通用户使用spark的client无法更新Ranger策略
    【算法——双指针】LeetCode 18 四数之和
    从输入URL到渲染的过程中到底发生了什么?
    如何使用CodeceptJS、Playwright和GitHub Actions构建端到端测试流水线
    艾美捷细胞衰老β-半乳糖苷酶染色试剂盒说明书
    R语言—数据结构
    企业数字化转型落地实施,应该围绕这三大方向展开
    eyb:工资账套页面设计到聊天数据显示(五)
    2010-2017年WIND分省政府性债务余额面板数据
    tf_course4
  • 原文地址:https://blog.csdn.net/weixin_53678904/article/details/132308877