kubernetes Service-01 基本用法

概述

Kubernetes Service是集群内部的负载均衡器,它定义了如何将请求路由到一组具有相同功能和标签选择器(label selector)的Pod上。通过创建Service资源对象,系统会在集群网络中分配一个固定的IP地址和端口,确保即使后端Pod发生动态变化(如扩缩容、更新等),对外提供的服务仍保持稳定可用。Service可以配置为ClusterIPNodePortLoadBalancerExternalName等多种类型,以满足不同场景下的服务发现与负载均衡需求,从而实现应用程序间的松耦合及弹性扩展。

基本用法

对容器应用最简便的方式就是通过IP+端口镜像访问。

yaml 复制代码
apiVersion: v1
kind: ReplicationController
metadata:
  name: webapp
spec:
  replicas: 2
  template:
    metadata:
      name: webapp
      labels:
        app: webapp
    spec:
      containers:
      - name: webapp
        image: tomcat
        ports:
        - containerPort: 8080

创建该RC

bash 复制代码
# 创建
[root@master1 service]# kubectl apply -f 01.yaml
replicationcontroller/webapp created

获取PodIP

bash 复制代码
[root@master1 service]# kubectl get pod -o wide
NAME           READY   STATUS    RESTARTS   AGE     IP               NODE    NOMINATED NODE   READINESS GATES
webapp-hgl2t   1/1     Running   0          2m37s   10.244.166.137   node1   <none>           <none>
webapp-nzxwt   1/1     Running   0          2m37s   10.244.166.139   node1   <none>           <none>

可以直接通过IP地址和端口访问Tomcat服务

curl 10.244.166.13:8080

html 复制代码
<!doctype html><html lang="en"><head><title>HTTP Status 404 -- Not Found</title><style type="text/css">body {font-family:Tahoma,Arial,sans-serif;} h1, h2, h3, b {color:white;background-color:#525D76;} h1 {font-size:22px;} h2 {font-size:16px;} h3 {font-size:14px;} p {font-size:12px;} a {color:black;} .line {height:1px;background-color:#525D76;border:none;}</style></head><body><h1>HTTP Status 404 -- Not Found</h1><hr class="line" /><p><b>Type</b> Status Report</p><p><b>Description</b> The origin server did not find a current representation for the target resource or is not willing to disclose that one exists.</p><hr class="line" /><h3>Apache Tomcat/10.0.14</h3></body></html>[

虽然可以通过PodIP访问服务,但是PodIP是不稳定的,并且还要有负载均衡。这就要求Pod前面有一个东西,既能够提供稳定IP也要有负载均衡功能,这样Service应运而生。

  • 通过命令创建Service

    bash 复制代码
    [root@master1 service]# kubectl expose rc webapp
      service/webapp exposed
      
    [root@master1 service]# kubectl get svc
      NAME     TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
      webapp   ClusterIP   10.10.171.92   <none>        8080/TCP   4s

    这样通过该ClusterIP就可以访问Pod提供的Tomcat服务,并且有负载均衡功能。

  • 通过配置文件创建Service

    yaml 复制代码
    apiVersion: v1
    kind: Service
    metadata:
      name: webapp
    spec:
      ports:
      - port: 8081
        targetPort: 8080
      selector:
        app: webapp

    查看创建的Service,生成的端口是8081。portService端口,targetPortPod端口。

    bash 复制代码
    [root@master1 service]# kubectl get svc
    NAME     TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
    webapp   ClusterIP   10.10.212.177   <none>        8081/TCP   2m6s

    其访问效果和命令生成的Service一致

Service提供两种负载均衡策略

  • RoundRobin:轮询模式(默认)
  • SessionAffinity:会话保持模式

多端口Service

一个容器应用可以提供多个端口,例如Tomcat有服务端口和管理端口

yaml 复制代码
apiVersion: v1
kind: Service
metadata:
  name: webapp
spec:
  ports:
  - port: 8080
    targetPort: 8080
    name: web
  - port: 8085
    targetPort: 8085
    name: management
  selector:
    app: webapp

创建并查看结果

bash 复制代码
[root@master1 service]# kubectl apply -f 03.yaml
service/webapp created

[root@master1 service]# kubectl get svc
NAME     TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)             AGE
webapp   ClusterIP   10.10.85.175   <none>        8080/TCP,8085/TCP   6s

外部服务Service

应用系统需要后端的数据库或者其他ns的集群作为后端服务,这时可以创建一个无Selector的Service

yaml 复制代码
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  ports:
  - port: 80
    targetPort: 80
    protocol: TCP

通过该定义创建了一个不带标签的Service,无法选择后端的Podk8s不会自动创建Endpoint,需要手动创建一个同名的Endpoint

Kubernetes 中的 Endpoints 资源是一个 API 对象,它存储了与某个 Service 相关联的一组后端 Pod IP 地址和端口信息。当 Service 使用标签选择器找到匹配的 Pod 后,Endpoints 资源会自动更新以反映这些 Pod 的实际网络端点。

yaml 复制代码
apiVersion: v1
kind: Endpoints
metadata:
  name: my-service
subsets:
- addresses:
  - ip: 1.2.3.4
  ports:
  - port: 80

创建并查看结果

bash 复制代码
[root@master1 service]# kubectl apply -f 05.yaml
endpoints/my-service created

[root@master1 service]# kubectl get ep
NAME         ENDPOINTS    AGE
my-service   1.2.3.4:80   2m55s

结语

总结来说,Kubernetes Services 是其核心的网络概念之一,主要用于定义集群内部的服务发现与负载均衡机制。基本用法包括以下关键步骤:

  1. 创建 Service:首先,您需要定义一个 Service YAML 文件,明确服务名称、类型(如 ClusterIPNodePortLoadBalancerExternalName)、标签选择器以及目标端口映射等属性。一旦应用此配置,Kubernetes 将依据标签选择器自动关联相应的 Pods,并为 Service 分配一个稳定的虚拟 IP 地址。
  2. 连接 PodService 根据定义的标签选择器查找符合要求的Pod,将其网络端点(IP 和端口)注册到对应的 Endpoints 对象中。这样,即便底层的 Pod 发生变化,如因扩容或故障转移导致 IP 变动,Service 仍能确保流量被正确转发至可用的 Pod
  3. 访问服务:应用内的其他组件可以通过环境变量、DNS 解析或直接使用 ServiceCluster IP 和端口进行通信。对于外部访问,可通过 NodePortLoadBalancer 类型 Service 映射到节点的端口,使外部客户端能够连接到集群内部的服务。

总之,Kubernetes Services 在简化服务发现、保障服务高可用性、实现灵活的负载均衡策略等方面发挥着至关重要的作用,极大地提升了云原生应用的管理和运维效率。

相关推荐
mit6.8242 小时前
论容器化 | 分析Go和Rust做医疗的后端服务
docker·golang·rust
东风微鸣2 小时前
Python 脚本最佳实践2025版
docker·云原生·kubernetes·可观察性
Andy杨2 小时前
20250710-2-Kubernetes 集群部署、配置和验证-网络组件存在的意义?_笔记
网络·笔记·kubernetes
不知疲倦的仄仄4 小时前
2025最新版Docker讲解/面试/命令/容器化技术
运维·docker·容器
哈里谢顿7 小时前
修改并重新部署docker项目流程
docker
David爱编程8 小时前
Deployment vs StatefulSet:怎么选?
后端·云原生·kubernetes
code喵喵8 小时前
docker-compose安装常用中间件
docker·中间件·容器
山岚的运维笔记9 小时前
AlpineLinux使用docker部署prometheus
docker·容器·prometheus
咚咚?10 小时前
docker 启动中间件
docker·中间件·容器