# 创建服务(Service) 在 Kubernetes 集群中,每个 Pod 都有一个内部独立的 IP 地址,但是工作负载中的 Pod 可能会被随时创建和删除,直接使用 Pod IP 地址并不能对外提供服务。 这就需要创建服务,通过服务您会获得一个固定的 IP 地址,从而实现工作负载前端和后端的解耦, 让外部用户能够访问服务。同时,服务还提供了负载均衡(LoadBalancer)功能,使用户能从公网访问到工作负载。 ## 前提条件 - 容器管理模块[已接入 Kubernetes 集群](../clusters/integrate-cluster.md)或者[已创建 Kubernetes 集群](../clusters/create-cluster.md),且能够访问集群的 UI 界面。 - 已完成一个[命名空间的创建](../namespaces/createns.md)、[用户的创建](../../../ghippo/user-guide/access-control/user.md),并将用户授权为 [NS Editor](../permissions/permission-brief.md#ns-editor) 角色 ,详情可参考[命名空间授权](../permissions/cluster-ns-auth.md)。 - 单个实例中有多个容器时,请确保容器使用的端口不冲突,否则部署会失效。 ## 创建服务 1. 以 __NS Editor__ 用户成功登录后,点击左上角的 __集群列表__ 进入 __集群列表__ 页面。在集群列表中,点击一个集群名称。 ![集群列表](https://docs.daocloud.io/daocloud-docs-images/docs/kpanda/images/service01.png) 1. 在左侧导航栏中,点击 __容器网络__ -> __服务__ 进入服务列表,点击右上角 __创建服务__ 按钮。 ![服务与路由](https://docs.daocloud.io/daocloud-docs-images/docs/kpanda/images/service02.png) !!! tip 也可以[通过 YAML 创建一个服务](#yaml)。 1. 打开 __创建服务__ 页面,选择一种访问类型,参考以下几个参数表进行配置。 ![创建服务](../images/service03.png) === "创建 ClusterIP 服务" 点选 __集群内访问(ClusterIP)__ ,这是指通过集群的内部 IP 暴露服务, 选择此项的服务只能在集群内部访问。这是默认的服务类型。 | 参数 | 说明 | 举例值 | | --- | :-- | :---- | | 访问类型 |【类型】必填
【含义】指定 Pod 服务发现的方式,这里选择集群内访问(ClusterIP)。| ClusterIP | | 服务名称 |【类型】必填
【含义】输入新建服务的名称。
【注意】请输入 4 到 63 个字符的字符串,可以包含小写英文字母、数字和中划线(-),并以小写英文字母开头,小写英文字母或数字结尾。| Svc-01 | | 命名空间 |【类型】必填
【含义】选择新建服务所在的命名空间。关于命名空间更多信息请参考[命名空间概述](../namespaces/createns.md)。
【注意】请输入 4 到 63 个字符的字符串,可以包含小写英文字母、数字和中划线(-),并以小写英文字母开头,小写英文字母或数字结尾。| default | | 标签选择器 |【类型】必填
【含义】添加标签,Service 根据标签选择 Pod,填写后点击 **添加** 。也可以引用已有工作负载的标签,点击 __引用负载标签__ ,在弹出的窗口中选择负载,系统会默认将所选的负载标签作为选择器。| app:job01 | | 端口配置 |【类型】必填
【含义】为服务添加协议端口,需要先选择端口协议类型,目前支持 TCP、UDP 两种传输协议。
**端口名称**:输入自定义的端口的名称。
**服务端口(port)**:Pod 对外提供服务的访问端口。
**容器端口(targetport)**:工作负载实际监听的容器端口,用来对集群内暴露服务。| | | 会话保持 |【类型】选填
【含义】开启后,相同客户端的请求将转发至同一 Pod | 开启 | | 会话保持最大时长 |【类型】选填
【含义】开启会话保持后,保持的最大时长 | 30 秒 | | 注解 |【类型】选填
【含义】为服务添加注解 | | === "创建 NodePort 服务" 点选 __节点访问(NodePort)__ ,这是指通过每个节点上的 IP 和静态端口( __NodePort__ )暴露服务。 __NodePort__ 服务会路由到自动创建的 __ClusterIP__ 服务。通过请求 __<节点 IP>:<节点端口>__ , 您可以从集群的外部访问一个 __NodePort__ 服务。 | 参数 | 说明 | 举例值 | | --- | :-- | :---- | | 访问类型 |【类型】必填
【含义】指定 Pod 服务发现的方式 | NodePort | | 服务名称 |【类型】必填
【含义】输入新建服务的名称。
【注意】请输入 4 到 63 个字符的字符串,可以包含小写英文字母、数字和中划线(-),并以小写英文字母开头,小写英文字母或数字结尾。| Svc-01 | | 命名空间 |【类型】必填
【含义】选择新建服务所在的命名空间。关于命名空间更多信息请参考[命名空间概述](../namespaces/createns.md)。
【注意】请输入 4 到 63 个字符的字符串,可以包含小写英文字母、数字和中划线(-),并以小写英文字母开头,小写英文字母或数字结尾。| default | | 标签选择器 |【类型】必填
【含义】添加标签,Service 根据标签选择 Pod,填写后点击 **添加** 。也可以引用已有工作负载的标签,点击 __引用负载标签__ ,在弹出的窗口中选择负载,系统会默认将所选的负载标签作为选择器。| | | 端口配置 |【类型】必填
【含义】为服务添加协议端口,需要先选择端口协议类型,目前支持 TCP、UDP 两种传输协议。
**端口名称**:输入自定义的端口的名称。
**服务端口(port)**:Pod 对外提供服务的访问端口。默认为了方便起见,服务端口被设置为与容器端口字段相同的值。
**容器端口(targetport)**:工作负载实际监听的容器端口。
**节点端口(nodeport)**:节点的端口,接收来自 ClusterIP 传输的流量。用来做外部流量访问的入口。| | | 会话保持 |【类型】选填
【含义】开启后,相同客户端的请求将转发至同一 Pod
开启后 Service 的 `.spec.sessionAffinity` 为 __ClientIP__ ,详情请参考 [Service 的会话亲和性](https://kubernetes.io/zh-cn/docs/reference/networking/virtual-ips/#session-affinity) | 开启 | | 会话保持最大时长 |【类型】选填
【含义】开启会话保持后,保持的最大时长
.spec.sessionAffinityConfig.clientIP.timeoutSeconds 默认设置为 30 秒 | 30 秒 | | 注解 |【类型】选填
【含义】为服务添加注解 | | === "创建 LoadBalancer 服务" 点选 __负载均衡(LoadBalancer)__ ,这是指使用云提供商的负载均衡器向外部暴露服务。 外部负载均衡器可以将流量路由到自动创建的 __NodePort__ 服务和 __ClusterIP__ 服务上。 | 参数 | 说明 | 举例值 | | --- | :--- | :--- | | 访问类型 |【类型】必填
【含义】指定 Pod 服务发现的方式 | LoadBalancer | | 服务名称 |【类型】必填
【含义】输入新建服务的名称。
【注意】请输入 4 到 63 个字符的字符串,可以包含小写英文字母、数字和中划线(-),并以小写英文字母开头,小写英文字母或数字结尾。| Svc-01 | | 命名空间 |【类型】必填
【含义】选择新建服务所在的命名空间。关于命名空间更多信息请参考[命名空间概述](../namespaces/createns.md)。
【注意】请输入 4 到 63 个字符的字符串,可以包含小写英文字母、数字和中划线(-),并以小写英文字母开头,小写英文字母或数字结尾。| default | | 外部流量策略 |【类型】必填
【含义】设置外部流量策略。
**Cluster**:流量可以转发到集群中所有节点上的 Pod。
**Local**:流量只发给本节点上的 Pod。
【注意】请输入 4 到 63 个字符的字符串,可以包含小写英文字母、数字和中划线(-),并以小写英文字母开头,小写英文字母或数字结尾。| Cluster | | 标签选择器 |【类型】必填
【含义】添加标签,Service 根据标签选择 Pod,填写后点击 **添加** 。也可以引用已有工作负载的标签,点击 __引用负载标签__ ,在弹出的窗口中选择负载,系统会默认将所选的负载标签作为选择器。| | | 负载均衡类型 |【类型】必填
【含义】使用的负载均衡类型,当前支持 MetalLB 和其他。| MetalLB | | MetalLB IP 池 |【类型】必填
【含义】选择的负载均衡类型为 MetalLB 时,LoadBalancer Service 默认会从这个池中分配 IP 地址, 并且通过 APR 宣告这个池中的所有 IP 地址,详情请参考[安装 MetalLB](../../../network/modules/metallb/install.md) | | | 负载均衡地址 |【类型】必填
【含义】
1. 如使用的是公有云 CloudProvider,此处填写的为云厂商提供的负载均衡地址;
2. 如果上述负载均衡类型选择为 MetalLB,默认从上述 IP 池中获取 IP,如果不填则自动获取。| 自动获取 | | 端口配置 |【类型】必填
【含义】为服务添加协议端口,需要先选择端口协议类型,目前支持 TCP、UDP 两种传输协议。
**端口名称**:输入自定义的端口的名称。
**服务端口(port)**:Pod 对外提供服务的访问端口。默认为了方便起见,服务端口被设置为与容器端口字段相同的值。
**容器端口(targetport)**:工作负载实际监听的容器端口。
**节点端口(nodeport)**:节点的端口,接收来自 ClusterIP 传输的流量。用来做外部流量访问的入口。| | | 注解 |【类型】选填
【含义】为服务添加注解 | | === "创建 ExternalName 服务" 点选 __外部服务(ExternalName)__ ,这是指通过将服务映射到外部域名来暴露服务。 选择此项的服务不会创建典型的 ClusterIP 或 NodePort,而是通过 DNS 名称解析将请求重定向到外部的服务地址。 | 参数 | 说明 | 举例值 | | --- | :--- | :--- | | 访问类型 |【类型】必填
【含义】指定 Pod 服务发现的方式,这里选择外部服务(ExternalName)。| ExternalName | | 服务名称 |【类型】必填
【含义】输入新建服务的名称。
【注意】请输入 4 到 63 个字符的字符串,可以包含小写英文字母、数字和中划线(-),并以小写英文字母开头,小写英文字母或数字结尾。| Svc-01 | | 命名空间 |【类型】必填
【含义】选择新建服务所在的命名空间。关于命名空间更多信息请参考[命名空间概述](../namespaces/createns.md)。
【注意】请输入 4 到 63 个字符的字符串,可以包含小写英文字母、数字和中划线(-),并以小写英文字母开头,小写英文字母或数字结尾。| default | | 域名 |【类型】必填 | | 1. 配置完所有参数后,点击 __确定__ 按钮,自动返回服务列表。在列表右侧,点击 __┇__ ,可以修改或删除所选服务。 ![服务列表](../images/service04.png) ## YAML 示例 ```yaml kind: Service apiVersion: v1 metadata: name: nvidia-dcgm-exporter namespace: gpu-operator uid: 7e412db9-2d23-4599-b48c-91e434aebef1 resourceVersion: '408861' creationTimestamp: '2024-12-09T09:11:41Z' labels: app: nvidia-dcgm-exporter annotations: prometheus.io/scrape: 'true' ownerReferences: - apiVersion: nvidia.com/v1 kind: ClusterPolicy name: cluster-policy uid: 59e6c966-abb9-45be-b13e-e51e31e7e55b controller: true blockOwnerDeletion: true spec: ports: - name: gpu-metrics protocol: TCP port: 9400 targetPort: 9400 selector: app: nvidia-dcgm-exporter clusterIP: 10.233.29.230 clusterIPs: - 10.233.29.230 type: ClusterIP sessionAffinity: None ipFamilies: - IPv4 ipFamilyPolicy: SingleStack internalTrafficPolicy: Cluster status: loadBalancer: {} ```