SERVICE

一、基本概念

在 Kubernetes 中,Service 是一种用于暴露和管理一组 Pods 的网络访问的资源对象。

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

二、Service 类型

  • ClusterIP: 默认类型,提供一个集群内部的虚拟 IP 地址,服务只能在集群内部访问。适用于只需要内部通信的服务。

  • NodePort: 在每个节点上开放一个端口,将流量转发到 ClusterIP 类型的服务上。可以通过 <NodeIP>:<NodePort> 从集群外部访问服务。适合用于测试或小型集群。

  • LoadBalancer: 自动配置一个外部负载均衡器(通常由云提供商提供),并将流量转发到 ClusterIP 类型的服务上。适用于需要从外部访问的服务,如生产环境。

  • ExternalName: 将服务映射到一个外部的 DNS 名称。服务请求被转发到指定的外部名称,并不涉及 Kubernetes 的负载均衡或网络规则。适用于需要将服务映射到集群外部的场景。

#ExternalName详细解释
定义: ExternalName 类型的 Service 通过 DNS 名称将服务请求转发到外部主机。它不创建任何代理或负载均衡器,而是将请求直接转发到指定的外部地址。
用途: 适用于将 Kubernetes 内部服务与集群外部的服务进行集成。例如,可以用来访问外部数据库或第三方 API。
配置: 在 Service 的 YAML 文件中,配置 type 为 ExternalName,并设置 externalName 字段为目标外部主机名
#行为
DNS 解析: 当在 Kubernetes 集群内部访问 my-external-service 时,它会解析为 external.example.com 的 DNS 名称。
不进行流量管理: ExternalName 类型的 Service 不处理流量路由或负载均衡,流量直接发送到 externalName 指定的外部地址。
#使用场景
与外部资源对接: 当需要与集群外的服务进行通信时,ExternalName 提供了一种简单的方式来实现。
简化配置: 使集群内部的服务可以通过 DNS 名称访问外部资源,无需修改集群内部服务的配置。

示例(ExternalName):

#yaml1,部署一个centos7的pod
apiVersion: v1
kind: Pod
metadata:
  name: centos7
spec:
  containers:
  - name: centos7
    image: centos:7
imagePullPolicy: Never
command: ["/bin/sh"] args: ["-c","while true; do echo hello; sleep 10; done"]
#command: 容器启动时执行的命令,这里是 /bin/sh。 #args: 传递给命令的参数,容器将运行一个无限循环,每 10 秒输出一次hello。 #yaml2,部署一个svc,用于external类型 apiVersion: v1 kind: Service metadata: name: external-test spec: type: ExternalName externalName: baidu.com #externalName: baidu.com: 这个服务将请求转发到 baidu.com。 kubectl apply -f external.yaml kubectl apply -f service1.yaml kubectl get pod -o wide kubectl get svc kubectl exec -it external-pod bash

三、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)。

四、示例定义(NodePort)

YAML 配置示例:

#Service 名为 myapp-service,类型为 NodePort,将流量通过端口 30007 转发到 Pods 上的端口 80。这样,你可以通过集群中任意节点的 IP 地址和端口 30007 访问 nginx 服务。
apiVersion: v1 kind: Service metadata: name: myapp
-service spec: type: NodePort ports: - port: 80 targetPort: 80 nodePort: 30007 selector: app: nginx

#nodePort: 30007: 在每个节点上开放的端口,用于外部访问。
#app: nginx: 选择具有 app: nginx 标签的 Pods。这意味着这个 Service 会将流量转发到 Deployment 创建的 Pods 上。

通过Deployment添加pod

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx-dep
spec:
  replicas: 4
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: harbor.hiuiu.com/nginx/nginx:1.21.5
        imagePullPolicy: Never
        ports:
        - containerPort: 80

五、Service相关命令

 1.查看 Service

 列出当前ns的所有 Services

kubectl get services

查看特定 Service 的详细信息

kubectl describe service <service-name>

查看特定 Service 的 YAML 配置

kubectl get service <service-name> -o yaml

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

2.创建 Service

 从 YAML 文件创建 Service

kubectl apply -f <file-name>.yaml

使用命令行创建 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

3.更新 Service

 编辑 Service

kubectl edit service <service-name>

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

替换 Service 的配置

kubectl replace -f <file-name>.yaml

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

4.删除 Service

kubectl delete service <service-name>

5.获取 Service 的端口映射

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

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

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

kubectl get services --all-namespaces

 

posted @ 2024-08-23 17:32  hx_ky36  阅读(3)  评论(0编辑  收藏  举报