目录

玛卡巴卡的k8s知识点问答题三

玛卡巴卡的k8s知识点问答题(三)


9. Calico 网络插件在 K8s 集群的作用。

Calico是一个开源的网络和网络安全解决方案,在k8s集群中是非常重要的角色,主要用于提高网络连接、网络策略和网络安全功能。以下是主要作用:

1. 提供容器网络连接

Calico 为 Kubernetes 集群中的 Pod 提供网络连接,确保 Pod 之间可以相互通信。它通过以下方式实现:

  • IP 地址管理(IPAM) :Calico 为每个 Pod 分配唯一的 IP 地址,并管理 IP 地址的分配和回收。
  • 路由分发 :Calico 使用 BGP(Border Gateway Protocol) 协议在集群节点之间分发路由信息,确保 Pod 之间的流量能够正确路由。
  • 支持多种网络模式
  • Overlay 模式 :使用 IP-in-IP 或 VXLAN 封装技术,适用于跨子网的集群。
  • 非 Overlay 模式 :直接路由模式,适用于同一子网内的集群,性能更高。

2. 实现网络策略(Network Policy)

Calico 提供了强大的网络策略功能,允许用户定义精细化的网络访问规则,控制 Pod 之间的通信。这些策略可以用于:

  • 限制 Pod 的入口和出口流量 :例如,只允许特定的 Pod 或命名空间之间的通信。
  • 实现微服务的安全隔离 :通过策略限制服务之间的访问,提高安全性。
  • 支持 Kubernetes 原生的 NetworkPolicy API :Calico 完全兼容 Kubernetes 的 NetworkPolicy 资源,用户可以通过 YAML 文件定义策略。 示例 NetworkPolicy
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-frontend-to-backend
namespace: default
spec:
podSelector:
matchLabels:
role: backend
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
role: frontend
ports:
- protocol: TCP
port: 80

3. 提供网络安全功能

Calico 通过以下方式增强 Kubernetes 集群的安全性:

  • 基于身份的微隔离 :通过标签(Labels)和选择器(Selectors)定义策略,实现基于身份的访问控制。
  • 加密通信 :支持 WireGuard 加密技术,确保 Pod 之间的通信安全。
  • 防止 IP 欺骗 :Calico 会验证 Pod 的 IP 地址,防止 IP 欺骗攻击。

4. 高性能和可扩展性

  • 高性能 :Calico 的非 Overlay 模式(直接路由)避免了额外的封装和解封装开销,提供了接近原生网络的性能。
  • 可扩展性 :Calico 支持大规模的 Kubernetes 集群,能够处理数千个节点和数万个 Pod。

5. 多平台支持

Calico 不仅支持 Kubernetes,还支持其他容器编排平台,如 OpenShift、Rancher 等。此外,Calico 还可以与云服务商(如 AWS、GCP、Azure)的网络集成。

6. 灵活的部署选项

Calico 支持多种部署方式,包括:

  • Kubernetes 集成 :通过 Kubernetes 的 CNI(Container Network Interface)插件部署。
  • 独立部署 :可以作为独立的网络解决方案部署在非 Kubernetes 环境中。
  • 托管服务 :通过 Tigera 提供的托管服务(如 Calico Cloud)获得企业级支持。

7. 可视化和监控

Calico 提供了丰富的可视化和监控工具,帮助用户更好地理解和管理集群中的网络流量和策略:

  • Calico UI :提供网络拓扑、策略状态和流量监控的可视化界面。
  • Prometheus 集成 :支持将网络指标导出到 Prometheus,方便用户进行监控和告警。

总结

Calico 在 Kubernetes 集群中的作用可以概括为:

  1. 提供高效的容器网络连接
  2. 实现精细化的网络策略 ,增强安全性。
  3. 支持高性能和可扩展性 ,适用于大规模集群。
  4. 提供丰富的网络安全功能 ,如加密通信和微隔离。
  5. 支持多平台和灵活的部署选项

10. kube-apiserver, etcd, kube-controller-manager, kube-scheduler 的作用。

首先先来看官网的一张图: https://i-blog.csdnimg.cn/direct/7bf0c17af2394512b28b80c57e2b44d0.png

1. kube-apiserver

  • 作用 :Kubernetes API 服务器,是 Kubernetes 集群的 前端接口 ,所有与集群的交互都通过它进行。
  • 功能
  • 提供 RESTful API,供用户、命令行工具(如 kubectl )和其他组件访问。
  • 验证和授权请求(通过认证、授权和准入控制机制)。
  • 处理资源的创建、更新、删除和查询操作(如 Pod、Service、Deployment 等)。
  • 将集群的期望状态(Desired State)写入 etcd
  • 特点
  • 是无状态的,所有状态都存储在 etcd 中。
  • 支持水平扩展,可以通过 部署多个实例来提高可用性和性能 。

2. etcd

  • 作用 :分布式键值存储,是 Kubernetes 集群的 持久化存储 ,用于保存集群的所有配置数据和状态信息。
  • 功能
  • 存储 Kubernetes 集群的元数据,如节点信息、Pod 信息、服务信息、配置信息等。
  • 提供高可用性和一致性,确保集群状态的一致性和可靠性。
  • 支持 Watch 机制,其他组件可以通过 Watch 监听 etcd 中的数据变化。
  • 特点
  • 是 Kubernetes 集群的 唯一数据源 ,所有组件都依赖 etcd 获取集群状态。
  • 支持分布式部署,确保高可用性

3. kube-controller-manager

  • 作用 :控制器管理器,负责运行 Kubernetes 中的各种 控制器 ,确保集群的当前状态与期望状态一致。
  • 功能
  • 包含多个控制器,每个控制器负责管理特定类型的资源。常见的控制器包括:
  • Node Controller :监控节点的状态,处理节点故障。
  • Replication Controller :确保 Pod 的副本数与期望值一致。
  • Deployment Controller :管理 Deployment 的创建、更新和回滚。
  • Service Controller :管理 Service 和 Endpoints 的创建和更新。
  • Namespace Controller :管理命名空间的生命周期。
  • 通过 Watch 机制监听 etcd 中的资源变化,并根据期望状态进行调整。
  • 特点
  • 控制器是 Kubernetes 实现 声明式 API 的核心组件。
  • 控制器通过不断调谐(Reconcile)确保集群状态与期望状态一致。

4. kube-scheduler

  • 作用 :调度器,负责将新创建的 Pod 分配到合适的节点上运行。
  • 功能
  • 根据 Pod 的资源需求(如 CPU、内存)和节点的可用资源,选择合适的节点。
  • 考虑调度策略和约束条件,如节点亲和性(Node Affinity)、Pod 亲和性(Pod Affinity)、污点和容忍(Taints and Tolerations)等。
  • 支持扩展和自定义调度策略。
  • 特点
  • 调度器只负责决策,不负责实际的 Pod 启动和运行。
  • 调度器是无状态的,所有调度决策都基于当前集群状态。

组件之间的协作关系

  1. 用户通过 kubectl 或其他客户端工具向 kube-apiserver 发送请求 ,例如创建 Pod。
  2. kube-apiserver 验证请求并将资源信息写入 etcd
  3. kube-scheduler 监听 etcd 中的未调度 Pod ,并根据调度策略为 Pod 选择合适的节点,然后将调度结果写入 etcd
  4. kube-controller-manager 监听 etcd 中的资源状态 ,并根据期望状态进行调整。例如,确保 Pod 的副本数与期望值一致。
  5. 节点上的 kubeletkube-apiserver 获取调度到本节点的 Pod 信息 ,并启动 Pod。

总结

组件作用关键功能
kube-apiserverKubernetes 的前端接口,处理所有请求提供 API、验证请求、写入 etcd
etcd分布式键值存储,保存集群状态存储集群元数据、提供高可用性和一致性
kube-controller-manager运行控制器,确保集群状态与期望状态一致管理节点、Pod、Service 等资源的状态
kube-scheduler调度 Pod 到合适的节点根据资源需求和调度策略选择节点

11. kubelet, kube-proxy 作用。

kubelete会在集群中的每个节点上运行,它保证容器都运行在Pod中。

1. kubelet

  • 作用 :Kubernetes 节点上的主要代理组件,负责管理节点上的 Pod 和容器。
  • 功能
  1. Pod 生命周期管理
  • kube-apiserver 获取调度到本节点的 Pod 信息。
  • 根据 Pod 的配置启动、停止和管理容器。
  • 确保 Pod 中的容器处于运行状态,并在容器失败时重启它们。
  1. 资源监控
  • 监控节点上的资源使用情况(如 CPU、内存、磁盘等),并将这些信息上报给 kube-apiserver
  1. 容器健康检查
  • 执行 livenessProbereadinessProbe ,确保容器的健康状态。
  1. 镜像管理
  • 拉取 Pod 所需的容器镜像,并管理镜像的缓存。
  1. 与容器运行时交互
  • 通过 CRI(Container Runtime Interface)与容器运行时(如 Docker、containerd)交互,执行容器的创建、启动和停止操作。
  1. Volume 和网络管理
  • 挂载 Pod 所需的 Volume(如 ConfigMap、Secret、Persistent Volume 等)。
  • 配置 Pod 的网络命名空间和网络接口。
  • 特点
  • 是 Kubernetes 集群中每个节点上必须运行的组件。
  • 直接与容器运行时和操作系统交互,是 Kubernetes 管理容器的核心组件。

2. kube-proxy

  • 作用 :Kubernetes 节点上的网络代理组件,负责实现 Service 的网络转发和负载均衡。
  • 功能
  1. Service 的实现
  • 监听 kube-apiserver 中的 Service 和 Endpoints 变化。
  • 根据 Service 的配置,为每个 Service 创建虚拟 IP(ClusterIP)和端口。
  1. 流量转发
  • 将发送到 Service ClusterIP 的流量转发到后端的 Pod。
  • 支持多种代理模式:
  • userspace 模式 :流量通过用户空间的代理程序转发(性能较低,已逐渐淘汰)。
  • iptables 模式 :使用 Linux 的 iptables 规则实现流量转发(性能较高,是默认模式)。
  • IPVS 模式 :使用 Linux 的 IPVS(IP Virtual Server)实现流量转发(性能最高,支持更复杂的负载均衡算法)。
  1. 负载均衡
  • 在多个 Pod 之间分配流量,实现负载均衡。
  1. 网络策略支持
  • 配合网络插件(如 Calico、Cilium)实现网络策略(Network Policy)的流量控制。
  • 特点
  • 是 Kubernetes 集群中每个节点上必须运行的组件。
  • 通过维护节点上的网络规则,确保 Service 的流量能够正确转发到后端的 Pod。

组件之间的协作关系

  1. kubeletkube-apiserver 的交互
  • kubeletkube-apiserver 获取调度到本节点的 Pod 信息。
  • kubelet 将节点的状态(如资源使用情况、Pod 状态)上报给 kube-apiserver
  1. kube-proxykube-apiserver 的交互
  • kube-proxy 监听 kube-apiserver 中的 Service 和 Endpoints 变化。
  • kube-proxy 根据 Service 的配置更新节点上的网络规则。
  1. kubeletkube-proxy 的协作
  • kubelet 负责启动和管理 Pod 中的容器。
  • kube-proxy 负责将 Service 的流量转发到这些容器。

总结

组件作用关键功能
kubelet管理节点上的 Pod 和容器启动/停止容器、监控资源、健康检查、镜像管理、Volume 挂载
kube-proxy实现 Service 的网络转发和负载均衡流量转发、负载均衡、维护网络规则

12. 什么是 K8s 的 namespace?

在k8s中,namespace提供一种机制,将同一集群中的资源划分未相互隔离的组。同一命名空间中的资源名称要唯一,但是跨命名空间没这个要求。

13.namespace和cgroup的关系?

1. Namespace(命名空间)

  • 作用 :Namespace 是 Kubernetes 中的一种逻辑分区机制,用于将集群资源划分为多个虚拟集群。
  • 功能
  • 资源隔离:将资源(如 Pod、Service、Deployment 等)划分到不同的命名空间中。
  • 权限控制:通过 RBAC 限制用户或团队对特定命名空间的访问权限。
  • 资源配额管理:为命名空间设置资源配额,限制其资源使用量。
  • 级别 :Namespace 是 Kubernetes 集群级别的概念,主要用于组织和隔离 Kubernetes 资源。

2. 控制组(cgroups)

  • 作用 :cgroups 是 Linux 内核的一种机制,用于限制、记录和隔离进程组的资源使用(如 CPU、内存、磁盘 I/O 等)。
  • 功能
  • 资源限制:限制进程组可以使用的资源量(如 CPU、内存)。
  • 资源统计:记录进程组的资源使用情况。
  • 优先级控制:为进程组分配不同的资源使用优先级。
  • 级别 :cgroups 是操作系统级别的概念,主要用于管理单个节点上的进程资源。

3. Namespace 和 cgroups 的关系

虽然 Namespace 和 cgroups 都涉及资源隔离和管理,但它们的作用范围和层次不同:

(1) 作用范围
  • Namespace :作用于 Kubernetes 集群级别,用于隔离 Kubernetes 资源(如 Pod、Service 等)。
  • cgroups :作用于操作系统级别,用于隔离和管理单个节点上的进程资源。
(2) 资源管理
  • Namespace :通过资源配额(Resource Quota)和限制范围(Limit Range)管理 Kubernetes 资源的使用。
  • cgroups :通过 Linux 内核机制管理进程的资源使用(如 CPU、内存)。
(3) 协作关系
  • 在 Kubernetes 中, cgroups 是实现资源限制的基础 。例如,当你在 Kubernetes 中为 Pod 设置资源请求(requests)和限制(limits)时,Kubernetes 会通过 cgroups 在节点上实施这些限制。
  • Namespace 的资源配额 (如 CPU、内存)最终会通过 cgroups 在节点上生效。例如,如果你为某个命名空间设置了 CPU 配额,Kubernetes 会通过 cgroups 限制该命名空间中所有 Pod 的 CPU 使用。

4. 示例:Namespace 和 cgroups 的协作

假设你在 Kubernetes 中创建了一个命名空间 my-namespace ,并为其设置了资源配额:

apiVersion: v1
kind: ResourceQuota
metadata:
name: my-quota
namespace: my-namespace
spec:
hard:
requests.cpu: "2"
requests.memory: "4Gi"
limits.cpu: "4"
limits.memory: "8Gi"

当你在 my-namespace 中创建 Pod 时,Kubernetes 会通过以下步骤实施资源管理:

  1. Kubernetes 调度器 :根据 Pod 的资源请求(requests)和节点的可用资源,将 Pod 调度到合适的节点。
  2. kubelet :在节点上启动 Pod 的容器,并通过 cgroups 设置容器的资源限制(如 CPU、内存)。
  3. cgroups :在操作系统级别限制容器的资源使用,确保其不超过命名空间的资源配额。

5. 总结

  • Namespace 是 Kubernetes 中的逻辑分区机制,用于隔离和管理 Kubernetes 资源。
  • cgroups 是 Linux 内核的机制,用于隔离和管理进程资源。
  • 协作关系
  • Namespace 的资源配额和限制通过 cgroups 在节点上实施。
  • cgroups 是实现 Kubernetes 资源管理的基础。