系列文章

前言

安装完了,我们看看 Cilium 有哪些组件和重要概念。

Cilium 组件

如上所述,安装 Cilium 时,会安装几个运行组件(有些是可选组件), 它们各是什么用途?

Cilium Operator

Cilium Operator 可以理解为 Cilium 的管理平面或操作运维平面。Cilium Operator 不处于任何转发或网络策略决策的关键路径上。如果 Operator 暂时不可用,集群一般也能继续运行。

Cilium Agent

Cilium Agent 以 daemonset 的形式运行,因此 Kubernetes 集群的每个节点上都有一个 Cilium agent pod 在运行。该 agent 执行与 Cilium 相关的大部分工作:

  • 与 Kubernetes API 服务器交互,同步集群状态
  • 与 Linux kernel 交互--加载 eBPF 程序并更新 eBPF map
  • 通过文件系统 socket 与 Cilium CNI 插件可执行文件交互,以获得新调度工作负载的通知
  • 根据要求的网络策略,按需创建 DNS 和 Envoy Proxy 服务器
  • 启用 Hubble 时创建 Hubble gRPC 服务

Cilium Client

Cilium Agent 守护进程中的每个 pod 都带有一个 Cilium Client 可执行文件,可用于检查该节点上安装的 Cilium Agent 和 eBPF map 资源的状态。Client 通过守护进程 pod 与 Cilium Agent 的 REST API 通信。

Warning:

上图图上没有画。

Cilium Client 不是 Cilium CLI.

这与安装在操作机/堡垒机上的 Cilium CLI 工具可执行文件不同。Cilium Client 可执行文件包含在每个 Cilium Agent pod 中,必要时可用作诊断工具,帮助排除 Cilium Agent 运行故障。在正常操作中,你很少会与 Cilium Client 交互,但在某些实验中,当我们使用某些 Cilium 功能时,我们会使用它来帮助我们查看 Cilium 网络状态的内部结构。

Cilium CNI Plugin

Cilium Agent 守护进程还会将 Cilium CNI 插件可执行文件安装到 Kubernetes 主机文件系统中,并重新配置节点的 CNI 以使用该插件。CNI 插件可执行文件与 Cilium Agent 分开,作为 Agent 守护程序初始化的一部分进行安装(即 install-cni-binaries init container)。需要时,Cilium CNI 插件将使用主机文件系统 socket 与运行中的 Cilium Agent 通信。

Hubble Relay

当 Hubble(哈勃望远镜) 作为 Cilium 管理集群的一部分启用时,每个节点上运行的 Cilium Agent 将重新启动,以启用 Hubble gRPC 服务,提供节点本地可观测性(会损耗一部分性能,但这是值得的)。为了实现集群范围内的可观测性,集群中将添加 hubble relay deploy 以及两个附加服务:Hubble Observer 服务和 the Hubble Peer 服务。

Hubble Relay Deploy 通过充当整个集群的 Hubble Observer 服务和每个 Cilium Agent 提供的 Hubble gRPC 服务之间的中介,提供集群范围内的可观测性。Hubble Peer 服务可让 Hubble Relay 在集群中启用新的 Hubble Cilium 代理时进行检测。作为用户,通常会使用 Hubble CLI 工具或 Hubble UI 与 Hubble Observer 服务交互,以便深入了解 Hubble 提供的群集网络流量。

Cluster Mesh API Server

Cluster Mesh API 服务器是一种可选部署,只有在启用 Cilium Cluster Mesh 功能时才会安装。Cilium Cluster Mesh 允许多个群集共享 Kubernetes 服务。

Cilium Cluster Mesh 会在每个群集中部署一个 etcd 键值存储,以保存有关 Cilium 身份的信息。它还为每个 etcd 存储提供代理服务。在同一集群网中的任何成员中运行的 Cilium 代理都可以使用该服务在整个集群网中读取有关 Cilium 身份状态的全局信息。这样就可以创建和访问跨越群集网格的全局服务。一旦 Cilium Cluster Mesh API 服务可用,在作为 Cluster Mesh 成员的任何 Kubernetes 集群中运行的 Cilium 代理就能安全地从每个集群的 etcd 代理中读取信息,从而了解整个集群的 Cilium 身份状态。这样就有可能创建跨越集群网状结构的全局服务。

Cilium 重要概念

Cilium Endpoints

简单理解就是一个 Pod, 以及 pod 被分配的 ip.

简单理解为基本等价于 Kubernetes 的 endpoints, 但是包含的信息更多。

示例如下:

$ k3s kubectl get ciliumendpoints.cilium.io -A
NAMESPACE NAME ENDPOINT ID IDENTITY ID INGRESS ENFORCEMENT EGRESS ENFORCEMENT VISIBILITY POLICY ENDPOINT STATE IPV4 IPV6
default my-nginx-754c4d44b4-949p2 1238 30982 <status disabled> <status disabled> <status disabled> ready 10.0.0.77
kube-system local-path-provisioner-76d776f6f9-d75kl 2157 12431 <status disabled> <status disabled> <status disabled> ready 10.0.0.133
default my-nginx-754c4d44b4-zs6fl 205 30982 <status disabled> <status disabled> <status disabled> ready 10.0.0.125
kube-system coredns-59b4f5bbd5-9q24h 646 55256 <status disabled> <status disabled> <status disabled> ready 10.0.0.82
kube-system svclb-traefik-29b9c193-67lk8 2511 4457 <status disabled> <status disabled> <status disabled> ready 10.0.0.211
kube-system traefik-57c84cf78d-wqq48 1515 52140 <status disabled> <status disabled> <status disabled> ready 10.0.0.218
kube-system metrics-server-566c578db4-h59fh 4083 892 <status disabled> <status disabled> <status disabled> ready 10.0.0.158
kube-system hubble-ui-68fb44f6f5-69ggm 2960 40657 <status disabled> <status disabled> <status disabled> ready 10.0.0.6
kube-system hubble-relay-5f68b89b76-pzkb5 483 37481 <status disabled> <status disabled> <status disabled> ready 10.0.0.119

这里可以看到,两个 my-nginx pod 的 endpoint id 不同,但是身份是同一个,都是 30982.

Cilium Identity(身份)

使 Cilium 能够高效工作的一个关键概念是 Cilium 的 身份 概念。所有 Cilium Endpoints 都有一个基于标签的标识。

Cilium 身份由标签决定,在整个集群中是唯一的。端点会被分配与端点安全相关标签相匹配的身份,也就是说,共享同一组安全相关标签的所有端点将共享相同的身份。与每个身份相关的唯一数字标识符会被 eBPF 程序用于网络数据路径中的快速查找,这也是 Hubble 能够提供 Kubernetes 感知网络可观察性的基础。

当网络数据包进入或离开节点时,Cilium 的 eBPF 程序会将源地址和目标 IP 地址映射到相应的数字身份标识符,然后根据引用这些数字身份标识符的策略配置来决定应采取哪些数据路径行动。每个 Cilium Agent 负责通过观察相关 Kubernetes 资源的更新,用与节点上本地运行的端点相关的数字标识符更新与身份相关的 eBPF 映射。

示例如下:

$ k3s kubectl get ciliumidentities.cilium.io -A
NAME NAMESPACE AGE
55256 kube-system 2d23h
892 kube-system 2d23h
12431 kube-system 2d23h
4457 kube-system 2d23h
52140 kube-system 2d23h
30982 default 33h
40657 kube-system 37m
37481 kube-system 37m

总结

本文趁热打铁介绍了 Cilium 的基本组件和重要概念。为我们后续 Cilium 的深入使用做好铺垫。

三人行, 必有我师; 知识共享, 天下为公. 本文由东风微鸣技术博客 EWhisper.cn 编写.

Cilium 系列-3-Cilium 的基本组件和重要概念的更多相关文章

  1. JS组件系列——又一款MVVM组件:Vue(二:构建自己的Vue组件)

    前言:转眼距离上篇 JS组件系列——又一款MVVM组件:Vue(一:30分钟搞定前端增删改查) 已有好几个月了,今天打算将它捡起来,发现好久不用,Vue相关技术点都生疏不少.经过这几个月的时间,Vue ...

  2. SpringBoot系列之Spring容器添加组件方式

    SpringBoot系列之Spring容器添加组件方式 本博客介绍SpringBoot项目中将组件添加到Spring容器中的方法,SpringBoot项目有一个很明显的优点,就是不需要再编写xml配置 ...

  3. 极客时间_Vue开发实战_05.Vue组件的核心概念(1):属性

    05.Vue组件的核心概念(1):属性 代码地址: https://github.com/tangjinzhou/geektime-vue-1/blob/master/%E6%BC%94%E7%A4% ...

  4. 极客时间_Vue开发实战_06.Vue组件的核心概念(2):事件

    06.Vue组件的核心概念(2):事件 通过emit传递给父组件 我们点击了重置失败,上层的div的click=handleDivClick是接收不到.重置失败的点击的行为的 通常情况下,你不用.st ...

  5. 极客时间_Vue开发实战_07.Vue组件的核心概念(3):插槽

    07.Vue组件的核心概念(3):插槽 严格来的说在2.0之后已经不分区这两种插槽的概念了. 因为它底层的实现已经趋向于相同了. 2.6为了兼容2.5的版本,现在依然可以用这两种写法 作用域插槽就是多 ...

  6. java高并发系列 - 第4天:JMM相关的一些概念

    JMM(java内存模型),由于并发程序要比串行程序复杂很多,其中一个重要原因是并发程序中数据访问一致性和安全性将会受到严重挑战.如何保证一个线程可以看到正确的数据呢?这个问题看起来很白痴.对于串行程 ...

  7. C#组件系列———又一款日志组件:Elmah的学习和分享

    前言:好久没动笔了,都有点生疏,12月都要接近尾声,可是这月连一篇的产出都没有,不能坏了“规矩”,今天还是来写一篇.最近个把月确实很忙,不过每天早上还是会抽空来园子里逛逛.一如既往,园子里每年这个时候 ...

  8. C#组件系列——又一款日志组件:Elmah的学习和分享

    前言:好久没动笔了,都有点生疏,12月都要接近尾声,可是这月连一篇的产出都没有,不能坏了“规矩”,今天还是来写一篇.最近个把月确实很忙,不过每天早上还是会抽空来园子里逛逛.一如既往,园子里每年这个时候 ...

  9. Vue系列(三):组件及数据传递、路由、单文件组件、vue-cli脚手架

    上一篇:Vue系列(二):发送Ajax.JSONP请求.Vue生命周期及实例属性和方法.自定义指令与过渡 一. 组件component 1. 什么是组件? 组件(Component)是 Vue.js ...

  10. Spring源码系列(三)--spring-aop的基础组件、架构和使用

    简介 前面已经讲完 spring-bean( 详见Spring ),这篇博客开始攻克 Spring 的另一个重要模块--spring-aop. spring-aop 可以实现动态代理(底层是使用 JD ...

随机推荐

  1. CS144 计算机网络 Lab2:TCP Receiver

    前言 Lab1 中我们使用双端队列实现了字节流重组器,可以将无序到达的数据重组为有序的字节流.Lab2 将在此基础上实现 TCP Receiver,在收到报文段之后将数据写入重组器中,并回复发送方. ...

  2. Docker快速部署Hadoop环境

    文章目录 安装环境 安装过程 拉取镜像 在Docker中创建网络,方便通信 创建Master节点 创建slave1和slave2节点 分别进入三个容器修改hosts文件 在Master执行集群初始化 ...

  3. 【Python基础】数据类型与类型转换

    五种基本数据类型 在 Python 中,基本数据类型是指不可变对象的数据类型.以下是 Python 中的基本数据类型: 整数类型(int):表示整数,例如 1.2.3 等等. 浮点数类型(float) ...

  4. 2021-10-30:有效的字母异位词。给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位

    2021-10-30:有效的字母异位词.给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词.注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位 ...

  5. 爆肝一周,我开源了ChatGPT 中文版接口,官方1:1镜像支持全部 官方接口

    这里实现我之前文章承诺承接上文 人人实现ChatGPT自由,手把手教你零撸部署自己聊天私服 现在ChatGPT 提供了api接口 可以让我自己对接去实现我们自己想要gpt应用,但是由于一些原因,国内也 ...

  6. 基于go语言的声明式流式ETL,高性能和弹性流处理器

    简要介绍Benthos,并给出若干示例,指导如何安装和运行. Benthos Benthos 是一个开源的.高性能和弹性的数据流处理器,能够以各种代理模式连接各种源和汇,可以帮助用户在不同的消息流之间 ...

  7. 没想到还有这种骚操作~如何使用Golang实现无头浏览器截图?

    前言 在Web开发中,有时需要对网页进行截图,以便进行页面预览.测试等操作. 而使用无头浏览器来实现截图功能,可以避免手动操作的繁琐和不稳定性. 这篇文章将介绍:使用Golang进行无头浏览器的截图, ...

  8. 自己动手写Docker学习笔记

    零.前言 本文为<自己动手写 Docker>的学习,对于各位学习 docker 的同学非常友好,非常建议买一本来学习. 书中有摘录书中的一些知识点,不过限于篇幅,没有全部摘录 (主要也是懒 ...

  9. Linux运维5月2号

    了解安装VMware虚拟机  镜像文件 以及镜像文件安装过程中的设置 vmware安装步骤                                                        ...

  10. 【前端方案】-表格排序列LRU缓存方案

    目标: 排序后的表格列,页面刷新或者用户重新登录后,能够保持之前的操作排序 完成效果: 解决方案: 利用localstorage对排序后的表格列属性进行存储,页面刷新或者用户重新进入该页面时都先从lo ...