揭秘CKA认证:Service四层代理的神秘面纱

本文涉及的产品
可观测可视化 Grafana 版,10个用户账号 1个月
可观测监控 Prometheus 版,每月50GB免费额度
应用实时监控服务-可观测链路OpenTelemetry版,每月50GB免费额度
简介: 【4月更文挑战第1天】:揭秘CKA认证:Service四层代理的神秘面纱

Service概念

当谈到容器编排和管理时,Kubernetes(简称K8s)无疑是当今最热门的选择之一。而在K8s中,Service(服务)是一个至关重要的概念,它为应用程序提供了稳定的网络终结点,使得微服务能够相互通信,无论它们在集群中的位置如何。

K8s Service的魅力在于它为应用程序提供了一个虚拟的IP地址,通过该地址,其他应用程序可以轻松地访问到服务提供的功能。这为开发者提供了更高层次的抽象,使得他们无需关心底层的网络细节,而专注于应用程序的逻辑。

使用K8s Service,我们可以轻松实现负载均衡,确保应用程序的高可用性。而且,Service的选择不仅仅局限于单一的负载均衡算法,K8s支持多种不同的Service类型,如ClusterIPNodePort、和LoadBalancer,开发者可以根据应用程序的需求选择最适合的类型。

此外,通过Service的标签选择器,我们可以方便地进行服务发现,无论是内部服务还是外部服务。这为构建复杂的微服务架构提供了便利,使得各个微服务可以松散耦合,更好地实现了容器编排的目标。

Service的三种类型

Cluster IP(默认类型)

ClusterIP是默认的Service类型。它为集群内部的Pod提供了一个虚拟的IP地址,使得同一集群内的其他服务可以通过该虚拟IP与该Service通信。

适用于那些只需要在集群内部进行通信的服务。对于集群外的请求,需要通过其他手段,比如Ingress来实现访问。

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: my-app
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 9376

上述 YAML 文件可用来创建一个 Service:

  • 名字为 my-service
  • 目标端口为 TCP 9376
  • 选取所有包含标签 app=my-app 的 Pod

NodePort

NodePort类型的Service会为每个Node分配一个静态端口,并通过该端口将流量路由到Service。这使得外部可以通过Node的IP地址和分配的静态端口访问该Service。

适用于需要从集群外部访问Service的场景,但不适用于生产环境的高负载服务,因为NodePort会暴露端口到整个集群,可能会引起端口冲突和安全隐患。

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: my-app
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 9376
  type: NodePort

LoadBlancer

LoadBalancer类型的Service通过云服务提供商的负载均衡器(如AWS ELB、GCP LoadBalancer)为Service分配一个外部可访问的IP,并将流量均衡分配到集群中的Pod。

适用于需要在集群外提供稳定访问入口的场景,且云服务提供商支持该类型。

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: my-app
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 9376
  type: LoadBalancer

这三种Service类型满足了不同场景下的需求,开发者可以根据应用程序的特性和部署环境选择适合的类型。详细关于Service的知识点查阅官方文档

代理模式

Kubernetes 支持三种 proxy mode(代理模式),他们的版本兼容性如下:

代理模式

Kubernetes 版本

是否默认

User space proxy mode

v1.0 +

Iptables proxy mode

v1.1 +

默认

Ipvs proxy mode

v1.8 +

User space 代理模式

user space proxy mode 下:

  • kube-proxy 监听 kubernetes master 以获得添加和移除 Service / Endpoint 的事件
  • kube-proxy 在其所在的节点(每个节点都有 kube-proxy)上为每一个 Service 打开一个随机端口
  • kube-proxy 安装 iptables 规则,将发送到该 Service ClusterIP(虚拟 IP)/ Port 的请求重定向到该随机端口
  • 任何发送到该随机端口的请求将被代理转发到该 Service 的后端 Pod 上(kube-proxy 从 Endpoint 信息中获得可用 Pod)
  • kube-proxy 在决定将请求转发到后端哪一个 Pod 时,默认使用 round-robin(轮询)算法,并会考虑到 Service 中的 SessionAffinity 的设定。

Iptables 代理模式

iptables proxy mode 下:

  • kube-proxy 监听 kubernetes master 以获得添加和移除 Service / Endpoint 的事件
  • kube-proxy 在其所在的节点(每个节点都有 kube-proxy)上为每一个 Service 安装 iptable 规则
  • iptables 将发送到 ServiceClusterIP / Port 的请求重定向到 Service 的后端 Pod
  • 对于 Service 中的每一个 Endpointkube-proxy 安装一个 iptable 规则
  • 默认情况下,kube-proxy 随机选择一个 Service 的后端 Pod

iptables proxy mode 的优点:

  • 更低的系统开销:在 linux netfilter 处理请求,无需在 userspace kernel space 之间切换
  • 更稳定

user space mode 的差异:

  • 使用 iptables mode 时,如果第一个 Pod 没有响应,则创建连接失败
  • 使用 user space mode 时,如果第一个 Pod 没有响应,kube-proxy 会自动尝试连接另外一个后端 Pod

IPVS 代理模式

IPVS proxy mode 下:

  • kube-proxy 监听 kubernetes master 以获得添加和移除 Service / Endpoint 的事件
  • kube-proxy 根据监听到的事件,调用 netlink 接口,创建 IPVS 规则;并且将 Service/Endpoint 的变化同步到 IPVS 规则中
  • 当访问一个 Service 时,IPVS 将请求重定向到后端 Pod

IPVS 模式的优点

IPVS proxy mode 基于 netfilterhook 功能,与 iptables 代理模式相似,但是 IPVS 代理模式使用 hash table 作为底层的数据结构,并在 kernel space 运作。这就意味着

  • IPVS 代理模式可以比 iptables 代理模式有更低的网络延迟,在同步代理规则时,也有更高的效率
  • user space 代理模式 / iptables 代理模式相比,IPVS 模式可以支持更大的网络流量。

CKA真题

以下这题是关于service四层代理CKA真题,相对也是非常简单的。

中文解析

切换 k8s 集群环境:kubectl config use-context k8s

Task

       重新配置一个已经存在的front-enddeployment,在名字为 nginx 的容器里面添加一个端口配置,名字为 http,暴露端口号为 80,然后创建一个 service,名字为 front-end-svc,暴露该deploymenthttp 端,并且 service 的类型为 NodePort

参考官方文档

服务(Service)

做题解答

  1. 先按照题目的要求切换集群环境
kubectl config use-context k8s
  1. 检查集群上是否存在front-enddeployment
controlplane $ kubectl get deployments.apps 
NAME        READY   UP-TO-DATE   AVAILABLE   AGE
front-end   2/3     3            2           8s
controlplane $ kubectl get pod
NAME                         READY   STATUS    RESTARTS   AGE
front-end-65b66568d4-4hgww   1/1     Running   0          15s
front-end-65b66568d4-dsxnx   1/1     Running   0          15s
front-end-65b66568d4-vql52   1/1     Running   0          15s
controlplane $
  1. 创建名字为 front-end-svc的service。
  • 资源清单方法,新建一个front-end-svc.yaml文件,内容如下:
apiVersion: v1
kind: Service
metadata:
  name: front-end-svc
spec:
  selector:
    app: nginx
  ports:
  - name: http
    protocol: TCP
    port: 80
    targetPort: 80
  type: NodePort

然后,执行如下命令创建

controlplane $ kubectl create -f front-end-svc.yaml 
service/front-end-svc created
  • 通过命令行方式创建(考试时首选这种方式)
controlplane $ kubectl expose deployment front-end --type=NodePort --port=80 --target-port=80 --name=front-end-svc
service/front-end-svc exposed

--port 是 service 的端口号,--target-port 是 deployment里容器的端口号。

  1. 检测Service状态
controlplane $ kubectl describe svc front-end-svc 
Name:                     front-end-svc
Namespace:                default
Labels:                   app=nginx
Annotations:              <none>
Selector:                 app=nginx
Type:                     NodePort
IP Family Policy:         SingleStack
IP Families:              IPv4
IP:                       10.108.182.66
IPs:                      10.108.182.66
Port:                     <unset>  80/TCP
TargetPort:               80/TCP
NodePort:                 <unset>  31323/TCP
Endpoints:                192.168.0.4:80,192.168.1.4:80,192.168.1.5:80
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>
相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
6月前
|
存储 前端开发 Java
一篇文章带你搞懂Controller、Service等各层的功能与作用
本文将深入探讨这些controller.service等层的作用与功能,帮助读者更好地理解它们在软件开发中的重要性和运作原理。
2119 0
|
6月前
|
Kubernetes 容器 Perl
k8s学习-CKA真题-sidecar代理
k8s学习-CKA真题-sidecar代理
91 0
|
4月前
|
测试技术
领域驱动设计问题之什么是领域服务(Domain Service),它与应用层服务有何区别
领域驱动设计问题之什么是领域服务(Domain Service),它与应用层服务有何区别
8159 0
|
3月前
|
开发框架 前端开发 .NET
【Azure微服务 Service Fabric 】Service Fabric中应用开启外部访问端口及微服务之间通过反向代理端口访问问题
【Azure微服务 Service Fabric 】Service Fabric中应用开启外部访问端口及微服务之间通过反向代理端口访问问题
|
6月前
|
负载均衡 Dubbo Java
Service Mesh 的基本模式
【5月更文挑战第16天】Service Mesh分为两种模式:Sidecar和第二代Service Mesh。
|
6月前
|
Kubernetes 应用服务中间件 nginx
提升CKA认证成功率:Kubernetes Ingress七层代理全攻略!
提升CKA认证成功率:Kubernetes Ingress七层代理全攻略!
114 0
|
6月前
|
Kubernetes 负载均衡 应用服务中间件
k8s学习-CKA真题-负载均衡service
k8s学习-CKA真题-负载均衡service
68 0
|
11月前
|
Kubernetes 网络协议 应用服务中间件
k8s教程(service篇)-ingress 7层路由机制(上)
k8s教程(service篇)-ingress 7层路由机制(上)
881 0
|
11月前
|
Kubernetes 安全 网络协议
k8s教程(service篇)-ingress 7层路由机制(下)
k8s教程(service篇)-ingress 7层路由机制(下)
335 0
|
Kubernetes 前端开发 网络协议
【k8s 系列】k8s 学习十九,service 2 暴露服务的 3种 方式
之前我们简单的了解一下 k8s 中 service 的玩法,今天我们来分享一下 service 涉及到的相关细节,我们开始吧
236 0