Service

SERVICE

在 Kubernetes 中,Service 是一种用于暴露和管理一组 Pods 的网络访问的资源对象。以下是对 Service 的详细介绍:

1. 基本概念

  • 目的: Service 提供了一个稳定的网络端点,以便外部应用程序和其他 Pods 可以访问 Pods 集群中的服务,而无需直接引用 Pod 的 IP 地址,因为 Pods 的 IP 地址可能会变化。

2. Service 类型

  • ClusterIP: 默认类型,提供一个集群内部的虚拟 IP 地址,服务只能在集群内部访问。适用于只需要内部通信的服务。
  • NodePort: 在每个节点上开放一个端口,将流量转发到 ClusterIP 类型的服务上。可以通过 <NodeIP>:<NodePort> 从集群外部访问服务。适合用于测试或小型集群。
  • LoadBalancer: 自动配置一个外部负载均衡器(通常由云提供商提供),并将流量转发到 ClusterIP 类型的服务上。适用于需要从外部访问的服务,如生产环境。
  • ExternalName: 将服务映射到一个外部的 DNS 名称。服务请求被转发到指定的外部名称,并不涉及 Kubernetes 的负载均衡或网络规则。适用于需要将服务映射到集群外部的场景。
#详细解释
定义: ExternalName 类型的 Service 通过 DNS 名称将服务请求转发到外部主机。它不创建任何代理或负载均衡器,而是将请求直接转发到指定的外部地址。
用途: 适用于将 Kubernetes 内部服务与集群外部的服务进行集成。例如,可以用来访问外部数据库或第三方 API。
配置: 在 Service 的 YAML 文件中,配置 type 为 ExternalName,并设置 externalName 字段为目标外部主机名
#行为
DNS 解析: 当在 Kubernetes 集群内部访问 my-external-service 时,它会解析为 external.example.com 的 DNS 名称。
不进行流量管理: ExternalName 类型的 Service 不处理流量路由或负载均衡,流量直接发送到 externalName 指定的外部地址。
#使用场景
与外部资源对接: 当需要与集群外的服务进行通信时,ExternalName 提供了一种简单的方式来实现。
简化配置: 使集群内部的服务可以通过 DNS 名称访问外部资源,无需修改集群内部服务的配置。

示例:

yaml1
apiVersion: v1
kind: Pod
metadata:
  name: external-pod
spec:
  containers:
  - name: external-c
    image: centos:7
    command: ["/bin/sh"]
    args: ["-c","while true; do echo aaa; sleep 10; done"]
#apiVersion: v1: 使用 Kubernetes API 的 v1 版本。
#kind: Pod: 资源类型是 Pod。
#metadata: 元数据部分定义了 Pod 的名称(external-pod)。
#spec: 定义了 Pod 的规格。
#containers: 指定 Pod 内的容器。
#name: external-c: 容器的名称。
#image: centos:7: 容器使用的镜像是 CentOS 7。
#command: 容器启动时执行的命令,这里是 /bin/sh。
#args: 传递给命令的参数,容器将运行一个无限循环,不断输出 aaa,每 10 秒输出一次。

yaml2    
apiVersion: v1
kind: Service
metadata:
  name: external
spec:
  type: ExternalName
  externalName: baidu.com
  
#apiVersion: v1: 使用 Kubernetes API 的 v1 版本。
#kind: Service: 资源类型是 Service。
#metadata: 元数据部分定义了 Service 的名称(external)。
#spec: 定义了 Service 的规格。
#type: ExternalName: 这是一个 ExternalName 类型的 Service。ExternalName 服务可以将请求转发到集群外部的服务或主机名。
#externalName: baidu.com: 这个服务将请求转发到 baidu.com。

kubectl apply -f external.yaml
#这个命令将 external.yaml 文件中的 Pod 配置应用到 Kubernetes 集群中。它会创建一个名为 external-pod 的 Pod。
kubectl apply -f service1.yaml
#这个命令将 service1.yaml 文件中的 Service 配置应用到 Kubernetes 集群中。它会创建一个名为 external 的 Service,该 Service 会将请求转发到 baidu.com。
kubectl get pod  -o wide 
#这个命令列出集群中的所有 Pod,并显示详细信息,如 Pod 的 IP 地址、节点等
kubectl get svc
#这个命令列出集群中的所有 Service,并显示其详细信息,如 Service 的类型、Cluster IP、外部 IP 等。
kubectl exec -it external-pod bash
#这个命令以交互模式 (-it) 进入名为 external-pod 的 Pod,并启动一个 Bash shell。
ping external
#在进入 Pod 的 Bash shell 后,执行 ping external。这里的 external 是之前创建的 Service 的名称。由于这个 Service 的类型是 ExternalName,它将解析为 baidu.com。因此,这个命令实际上是在尝试 ping baidu.com。
yum install -y net-tools
nslookup baidu.com
Server:		10.96.0.10
Address:	10.96.0.10#53
Non-authoritative answer:
Name:	baidu.com
Address: 39.156.66.10
Name:	baidu.com
Address: 110.242.68.66

nslookup external
#检查 Kubernetes 集群内的 DNS 解析是否正常
Server:		10.96.0.10
Address:	10.96.0.10#53
external.default.svc.cluster.local	canonical name = baidu.com.
Name:	baidu.com
Address: 110.242.68.66
Name:	baidu.com
Address: 39.156.66.10
#external.default.svc.cluster.local
#external: 服务的名称。
#default: 命名空间的名称,在 Kubernetes 中,服务通常会被部署在特定的命名空间中,default 是默认的命名空间。
#svc: 代表服务(Service)。
#cluster: 表示这是一个集群内部的服务。
#local: 表示这是一个本地的、集群内部的 DNS 名称。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3. Service 组件

  • Selector: 用于选择哪些 Pods 属于这个服务。它是一个标签选择器,用于根据 Pod 的标签来决定流量转发的目标。
  • Endpoints: Service 维护一组后端 Pods 的 IP 地址和端口,这些 IP 和端口会被自动更新以反映当前的 Pods 状态。
Endpoint
#概述:endpoint是一个关键的核心对象,它承担着连接service和后端Pod的重要角色。
#定义:
1.资源对象:用于表示一个服务的网络终结点。
2.抽象层:将服务的网络地址与后端容器或节点上的实际服务进行关联。
#作用:
1.服务发现:自动识别和管理服务的网络终结点,从而实现服务发现和访问。
2.负载均衡:将流量负载均衡到后端Pod上,实现服务的高可用性和水平扩展。
3.动态更新:根据service和pod的标签选择器自动生成的,因此当service或pod的标签发生变化时,endpoint会自动更新,实现动态的服务发现和负载均衡。
#生成与管理:
1.自动生成:每个service对象都会自动创建一个对应的endpoint对象,其中包含了与该service相关联的后端pod的网络地址和端口号。
2.控制平面管理:endpoint资源通常由kubenetes控制平面自动创建和管理。
#结构:
IP地址与端口号:包含了与service相关联的后端pod的ip地址和端口号。一个endpoint可以包含多个ip地址和端口号的组合,这取决于与service相关联的pod的数量。
#endpoint的使用场景:
1.内部服务访问:endpoint主要在集群中内部使用,用于实现集群内部的服务发现和负载均衡,不直接对外暴露。
2.被其他资源引用:endpoint可以被其他kubernetes资源对象引用,例如Ingress,LoadBalancer等,从而实现对服务的访问和负载均衡。
  • Ports:
    • port: 服务暴露的端口号。
    • targetPort: 后端 Pods 上容器的端口号。
    • protocol: 通信协议(如 TCP 或 UDP)。

4. 示例定义

以下是一个详细的 Service YAML 配置示例:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx-dep
spec:
  replicas: 5
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: harbor.hiuiu.com/nginx/nginx:1.21.5
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
#apiVersion: apps/v1: 这是 Kubernetes API 版本,用于定义 Deployment 资源。apps/v1 是支持的版本之一。
#kind: Deployment: 指明这个配置文件定义的是一个 Deployment 资源。
#metadata:
#name: nginx-deployment: Deployment 的名称。
#labels: 用于标记 Deployment,这些标签可以用来选择和管理资源。
#spec:
#replicas: 5: 定义了 Pod 的副本数目,这里表示希望运行 5 个 nginx 实例。
#selector:
#matchLabels: 用于选择哪些 Pods 属于这个 Deployment。它会选择所有具有 app: nginx 标签的 Pods。
#template:
#metadata:
#labels: 这些标签会被应用到 Pod 上,以便 selector 能够选择这些 Pods。
#spec:
#containers:
#name: nginx: 容器的名称。
#image: harbor.hiuiu.com/nginx/nginx:1.21.5: 使用的 Docker 镜像及其版本。
#imagePullPolicy: IfNotPresent: 只有当本地不存在镜像时才从镜像仓库拉取镜像。
#ports:
#containerPort: 80: 容器内暴露的端口,nginx 在这个端口上提供服务。               
        
---
apiVersion: v1
kind: Service
metadata:
  name: myapp-service
spec:
  type: NodePort
  ports:
    - port: 80
      targetPort: 80
      nodePort: 30007
  selector:
    app: nginx
---
#apiVersion: v1: 这是 Kubernetes API 版本,用于定义 Service 资源。v1 是支持的版本之一。
#kind: Service: 指明这个配置文件定义的是一个 Service 资源。
#metadata:
#name: myapp-service: Service 的名称。
#spec:
#type: NodePort: Service 类型,这里使用 NodePort 使得服务能够通过每个节点的特定端口进行访问。
#ports:
#port: 80: Service 的端口,通过这个端口暴露服务。
#targetPort: 80: Service 将请求转发到 Pod 上的这个端口。
#nodePort: 30007: 在每个节点上开放的端口,用于外部访问。
#selector:
#app: nginx: 选择具有 app: nginx 标签的 Pods。这意味着这个 Service 会将流量转发到 Deployment 创建的 Pods 上。
#Service 名为 myapp-service,类型为 NodePort,将流量通过端口 30007 转发到 Pods 上的端口 80。这样,你可以通过集群中任意节点的 IP 地址和端口 30007 访问 nginx 服务。
root@master:/opt/zxy# kubectl apply -f service.yaml 
root@master:/opt/zxy# kubectl apply -f service1.yaml

在这里插入图片描述

在这里插入图片描述

5.Service相关命令

查看 Service

  1. 列出所有 Services

    kubectl get services
    

    或者简写为:

    kubectl get svc
    

    这将列出当前命名空间下所有的 Services。

  2. 查看特定 Service 的详细信息

    kubectl describe service <service-name>
    

    其中 <service-name> 是你想查看的 Service 的名称。这个命令会显示 Service 的详细信息,包括其端口配置、选择器等。

  3. 查看特定 Service 的 YAML 配置

    kubectl get service <service-name> -o yaml
    

    这将显示指定 Service 的 YAML 配置,方便查看或保存配置。

创建 Service

  1. 从 YAML 文件创建 Service

    kubectl apply -f <file-name>.yaml
    

    其中 <file-name>.yaml 是包含 Service 定义的 YAML 文件。

  2. 使用命令行创建 Service

    kubectl expose deployment <deployment-name> --port=<port> --target-port=<target-port> --name=<service-name>
    

    例如,暴露一个名为 nginx-deployment 的 Deployment,使其在端口 80 上可用,并创建一个名为 nginx-service 的 Service:

    kubectl expose deployment nginx-deployment --port=80 --target-port=80 --name=nginx-service
    

更新 Service

  1. 编辑 Service

    kubectl edit service <service-name>
    

    这将打开一个编辑器,你可以在其中修改 Service 的配置。保存后,Kubernetes 会应用这些更改。

  2. 替换 Service 的配置

    kubectl replace -f <file-name>.yaml
    

    其中 <file-name>.yaml 是新的 Service 配置文件。这个命令会用新的配置替换现有的 Service。

删除 Service

  1. 删除 Service

    kubectl delete service <service-name>
    

    这将删除指定的 Service。

其他有用的命令

  1. 获取 Service 的端口映射

    kubectl get service <service-name> -o jsonpath='{.spec.ports[*].nodePort}'
    

    这个命令会显示 Service 的 nodePort(如果 Service 类型是 NodePort)。

  2. 列出所有命名空间中的 Services

    kubectl get services --all-namespaces
    

    这个命令会列出所有命名空间下的 Services。

这些命令可以帮助你在 Kubernetes 集群中有效地管理和操作 Service 资源。

6. 总结

Service 在 Kubernetes 中扮演着至关重要的角色,确保服务的高可用性和稳定性,使 Pods 能够在动态环境中保持稳定的网络访问。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值