Kubernetes 中的 Service

一、简介

Kubernetes 中的 Service 是一个重要的概念,它将一组 Pod 封装成一个逻辑单元,并提供网络访问,对外暴露一个统一的 IP 和端口号。这样,无论后端 Pod 如何变化,用户都可以使用相同的地址访问服务。

Service 是基于 Labels 进行匹配的,使用 Selector 进行 Pod 的筛选,从而建立了后端 Pod 到 Service 的映射关系,并提供负载均衡和服务发现功能。同时,Service 还支持多种负载均衡算法和多种协议,如 TCP、UDP、HTTP、HTTPS。

二、基本使用

在 Kubernetes 中创建 Service 有多种方式,其中最简单的方式是使用 kubectl expose 命令,如下所示:

kubectl expose deployment nginx --port=80 --type=LoadBalancer

这样就创建了一个 Service,它会自动将所有具有 label app=nginx 的 Pod 进行负载均衡,并向外部暴露端口号 80。

另一种常见的方法是使用 YAML 文件进行定义,如下所示:

apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  selector:
    app: nginx
  ports:
  - name: http
    port: 80
    targetPort: 80

这里的 selector 指定了将哪些 Pod 加入到 Service 中,ports 用于指定端口号和协议。

三、负载均衡和服务发现

Service 提供了内置的负载均衡功能,可以将请求分发到后端 Pod 上,从而实现高可用性。同时,Service 还支持不同的负载均衡算法,例如 round-robin、least connections、IP hash、random 等等。

服务发现是指通过 DNS 或其他方式,自动获取服务的 IP 和端口,从而使客户端无需知道后端 Pod 的具体 IP 和端口。这样,当 Pod 发生变化时,Service 可以自动更新 DNS 记录,从而实现无缝的服务迁移。

四、Session Affinity

在默认情况下,Service 使用 round-robin 的负载均衡算法,将每个请求按顺序分配到不同的后端 Pod 上。但是,在某些场景下,需要确保同一个用户的请求都被分配到同一个后端 Pod 上,从而实现 session 的持久化。这时可以使用 Session Affinity。

Session Affinity 可以指定一个 key,例如用户的 ID,将同一个 key 的请求都路由到同一个后端 Pod 上。可以选择两种模式,一种是 ClientIP,根据客户端 IP 进行负载均衡,一种是 None,禁用 Session Affinity。

使用 YAML 文件可以指定 Session Affinity,如下所示:

apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  selector:
    app: nginx
  ports:
  - name: http
    port: 80
    targetPort: 80
  sessionAffinity: ClientIP

五、网络策略

Kubernetes 中的网络策略允许对 Service 的访问进行精细控制,可以限制来自特定 Pod 的流量、限制访问特定的端口、禁止访问特定 IP 地址等等。

具体实现上,需要定义一个 NetworkPolicy 对象,其中包含了需要限制的 Pod 的选择器和限制规则。例如,下面的 YAML 文件表示禁止来自 label app=nginx 的 Pod 访问本 Service 的 8080 端口:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: nginx-policy
spec:
  podSelector:
    matchLabels:
      app: nginx
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector: {}
    ports:
    - port: 8080

六、安全性

在 Kubernetes 中,Service 可以通过 TLS 加密来保证网络传输的安全性。可以通过设置 Secret 对象来管理证书和私钥,然后在 Service 中指定使用 TLS 加密。

使用 YAML 文件可以指定 TLS 加密,如下所示:

apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  selector:
    app: nginx
  ports:
  - name: http
    port: 80
    targetPort: 80
  - name: https
    port: 443
    targetPort: 443
  tls:
  - secretName: tls-secret

这里的 tls 指定了使用哪个 Secret 对象来进行 TLS 加密。

七、总结

Kubernetes 中的 Service 是一个重要的概念,它提供了负载均衡、服务发现、Session Affinity、网络策略和安全性等多种功能。在实际应用中,需要根据具体情况选择不同的负载均衡算法和 Session Affinity 模式,同时也需要注意安全性和网络策略的设置。

原创文章,作者:QSJWI,如若转载,请注明出处:https://www.506064.com/n/372381.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
QSJWIQSJWI
上一篇 2025-04-24 06:40
下一篇 2025-04-24 06:40

相关推荐

  • Kubernetes安装Drone教程

    本文将通过多个方面详细介绍如何在Kubernetes中安装Drone,让您快速上手使用。 一、前置条件 1、已经安装了Kubernetes环境 2、拥有一个Github账户 3、已…

    编程 2025-04-27
  • CentOS安装Kubernetes教程

    一、安装必备组件 在开始安装Kubernetes之前,需要安装一些必备组件: sudo yum install -y yum-utils device-mapper-persist…

    编程 2025-04-25
  • 深入了解systemd service

    一、什么是systemd service systemd是一个Linux系统初始化的系统和服务管理器,它为系统的引导和服务管理提供了新的解决方案。systemd service是s…

    编程 2025-04-24
  • 使用Kubernetes(K8s)搭建分布式系统

    一、Kubernetes概述 Kubernetes是一个用于自动部署、扩展和管理容器化应用程序的开源平台。其提供了高可用性、自我修复能力和易于扩展的特征,使得大规模、高度可用的分布…

    编程 2025-04-24
  • Docker.service文件详解

    一、docker.service文件介绍 Docker是一种流行的开源容器化技术,可以在多个操作系统上运行,包括Linux、Windows和MacOS。Docker提供一个平台来构…

    编程 2025-04-23
  • k8scpu: Kubernetes资源调度中的CPU管理

    在Kubernetes中,我们可以使用k8scpu来管理CPU资源。这个工具可以帮助我们确保每个容器都有足够的CPU资源来运行应用程序,同时避免浪费资源。本文将从多个方面对k8sc…

    编程 2025-04-23
  • Kubernetes和Kafka在微服务架构中的应用

    一、Kubernetes和Kafka的基本介绍 Kubernetes是Google开源的容器集群管理系统,用于自动化部署、扩展和管理容器化应用程序。它简化了容器的部署和管理,使得应…

    编程 2025-04-23
  • 如何安装Kubernetes(K8s)

    一、安装前的准备工作 在进行K8s的安装前,请确保您已完成以下步骤: 1、准备至少2台服务器,一台作为master,一个或多个作为node; 2、确保所有服务器上已经安装了Dock…

    编程 2025-04-23
  • Kubernetes

    一、什么是Kubernetes Kubernetes是一个开源的、可移植的、扩展的容器编排引擎,用于管理容器化应用程序和服务的部署、扩展和运行。 Kubernetes被设计成可扩展…

    编程 2025-04-23
  • Vue-cli-service build –mode详解

    一、模式概述 Vue-cli-service是一个基于webpack的项目脚手架,用于快速搭建Vue项目。在Vue-cli-service的build命令中,我们可以通过指定mod…

    编程 2025-04-22

发表回复

登录后才能评论