Kubernetes介绍

K8S 是什么

Kubernetes,又称为 k8s(首字母为 k、首字母与尾字母之间有 8 个字符、尾字母为 s,所以简称 k8s)或者简称为 “kube”。一个开源平台,用来干嘛的?用来自动化部署,缩扩容和管理容器应用的。下面这张图是 K8S 集群的架构图。

K8S 的整体架构

基本概念和术语

  • 预期状态管理(Desired State Management)

    • K8S API 对象(声明预期状态)
      • ConfigMap
        • why
          解耦配置文件和容器
        • 典型用法
          1. 作为环境变量,为容器所使用
          2. 设置容器启动命令的启动参数(需要设置为环境变量)
          3. 以 Volume 的形式挂载为容器内部的文件或者目录
        • 创建
          1. yaml 文件,kubectl create -f configmap.yaml
          2. 命令行
            格式:kubectl create configmap --from-file=[key=]source --from-file=[key=]source
            (1)–from-file=文件名,就是从文件中创建
            (2)–from-file=文件夹名,就是目录中创建
            (3)–from-file=key=value 键值对,就是直接从 key-value 键值对创建
        • 使用
          • 通过环境变量的方式使用
          • 通过 volumeMount 的方式使用
        • 限制
          必须在 pod 创建之前完成
    • K8S Control Plane
      确保集群当前状态匹配预期状态
  • 工作负载

    • Pod
      最小的调度和计算单位,由一个或者多个 container 组成,Pod 中的所有 container 共享存储,网络空间和 cgroup 的资源
    • 工作负载资源(Controllers)
      • Deployment & ReplicaSet
        Deployment 部署无状态应用,可以 rollout、update、rollback ReplicaSet。 ReplicaSet 保证特定数量的 Pod 副本始终保持运行状态,ReplicaSet 并不是直接部署,而是通过 Deployment 来部署。

      • StatefulSet
        StatefulSet 部署有状态的应用,StatefulSet 要求一个 headless Service 搭配使用。

        为什么要用 headless service + StatefulSet 部署有状态应用?

        1. headless service会为关联的Pod分配一个域
          <service name>.$<namespace name>.svc.cluster.local
        2. StatefulSet会为关联的Pod保持一个不变的Pod Name
          statefulset中Pod的hostname格式为$(StatefulSet name)-$(pod序号)
        3. StatefulSet会为关联的Pod分配一个dnsName
          $<Pod Name>.$<service name>.$<namespace name>.svc.cluster.local
      • DaemonSet
        保证所有或者部分 Nodes 运行 Pod 的副本。使用场景在集群存储进程,日志收集进程,节点监控进程

      • Job & CronJob
        Job 和 CronJob 都是任务,前者是直到特定数量的 Job 被成功执行,后者是重复间隔执行一次。

核心组件的运行机制

  • K8S Master

    • kube-apiserver (API Server)
      1. 对外提供各种对象的CRUD REST接口
      2. 对外提供Watch机制,通知对象变化
      3. 将对象存储到 Etcd 中
    • kube-controller-mamager (守护进程)
      通过 apiserver 监视集群的状态,并做出相应更改,以使得集群的当前状态向预期状态靠拢,通过 Controller 会尝试将状态调整为期望的状态。Controller 包括:Replication ControllerNode ControllerResourceQuota ControllerNamespace ControllerServiceAccount ControllerToken ControllerService ControllerEndpoint Controller
    • kube-scheduler (调度器)
      将待调度的 Pod 按照特定的调度算法和调度策略绑定到集群中某个适合的 Node 上,并将绑定信息写入到 etcd 中,调度需要考虑的因素有:资源需求,服务治理要求,硬件/软件/策略限制,亲和以及反亲和要求,数据局域性,负载间的干扰等。
  • Work Node

    • Kubelet(节点代理)
      接受通过各种机制(主要是通过 apiserver )提供的一组 PodSpec,确保 PodSpec 中描述的容器处于运行状态且运行状况良好
    • Kube-proxy(节点网络代理)
      在节点上提供 Kubernetes API 中定义 Service,设置Service对应的 IPtables 规则,进行流量转发(userspace模式)

共享存储原理

  • PV(PersistentVolume)

    它是对底层网络存储的抽象,由管理员创建和配置,挂载到 node 上。PV 的生命周期:
    1. available
      资源的产生来源:
      • 静态模式
        管理员手动创建许多 PV
      • 动态模式
        通过 StorageClass 的设置对后端存储进行描述,标记为某种类型
    2. Bound
    3. Released
    4. Failed
  • PVC(PersistentVolumeClaim)

    对 PV 的 一个申请,就像 pod 消费 node 资源一样,PVC StorageClass 生命为 “”,说明PVC禁止使用动态模式,多个 pod 可以挂载同一个 PVC
  • StorageClass

    管理员定义储存资源为某种类别,用户根据 storage class 直观了解存储资源的特性
  • CSI 机制 (Container Storage Interface)容器存储接口

    • why ?
      上面的方式都是 in-tree,耦合太重
    • what ?
      与容器对接的存储接口标准,存储提供方只需要基于接口标准进行存储插件的实现,就能使用K8S 的原生存储机制为容器提供存储
  • 动态存储

安全机制

  • 基础概念

    User类型:

    • Service Account
      K8S 管理它,并且绑定在特定的 namespace
    • Normal User
      存在于 K8S 集群外,使用集群的 CA 证书授权
  • Authentication — 客户端认证

    • 最严格的 HTTPS 正数认证: 基于 CA 根证书签名的双向数字证书认证方式
    • HTTP token 认证: 通过一个 Token 来识别用户
    • HTTP base 认证: 通过用户名 + 密码的方式认证
  • Authorization — 授权

    • RBAC
      • Namespace Scope
        • Role
        • RoleBinding:把一个角色绑定到一个目标上 User,Group,Service Account
      • Cluster Scope
        • ClusterRole
        • CluseterRoleBinding:只对集群级别角色生效
    • 授权策略来决定一个 API 调用是否合法
    • API Server 授权策略
      • AlawaysDeny: 拒绝所有请求,用于测试
      • AlawaysAllow: K8S 默认设置,允许接收所有请求,集群不需要授权流程,可以采用
      • ABAC (Attribute-Based Access Control): 基于属性的访问控制,使用用户配置的授权规则对用户请求进行匹配和控制
      • RBAC (Role-Base Access Control): 基于角色的访问控制
      • Node: 专用模式,对 kubelet 发出的请求进行访问控制
      • Webhook: 调用外部 REST 服务对用户进行授权
        鉴权的流程,可以通过命令看详细的请求,kubectl --v=8 version,流程如下图:
        K8S 鉴权流程
  • Admission Control — 准入控制

    准入控制器的插件列表中的每个准入控制器检查请求,插件举例:LimitRanger,ServiceAccount 等

  • Service Account — 服务账户

    不是给用户用的,给运行在 Pod 中的进程提供必要的身份证明,与API Server 交互流程为:

    1. Pod 访问 API Server 的服务时,以 service 方式调用名为 Kubernetes 的这个服务的,而 Kubernetes 服务只在HTTPS 安全端口 443 上提供
    2. 请求时,类似于 HTTP Token,Header 中加了 token 字符串,来自于 /run/secrets/kubernetes.io/serviceaccount/token
    3. 建立链接时,用 Pod 里指定路径下的一个 CA 证书 (/run/secrets/kubernetes.io/serviceaccount/ca.rt),验证 API Server 发来的证书
    4. API Server 在收到这个 Token,会对这个 token 进行合法性验证
    5. /run/secrets/kubernetes.io/serviceaccount/namespace 会作为参数调用 Kubernetes API

    每个 Namespace 下都有个 default 的默认 Service Account 对象,名为 Tokens 的可以当作 Volume 被挂载到 Pod 里的 Secret,Pod 启动时挂载,协助进程访问 API Server 时的鉴权。

  • Secret — 私密凭据

    保管私密凭据,从属于 Service Account,一旦 Secret 的使用方式:

    1. 创建 Pod 时,为 Pod 指定 Service Account 自动使用改 Secret
    2. 挂载该 Secret 到 Pod 使用,执行 ls /etc/{secret name} 可以看到 Secret 的 data 域中的 key 值作为目录中文件
    3. 在 Docker image 下载时,指定 Pod 的 spec.ImagePullSecrets

网络原理

K8S 的网络原理比较复杂,基于 Docker 的网络之上有封装很多东西,深入了解还需要时间。

  • 基础概念

    需要了解网络里面的一些概念和原理

    • Linux Network Virtualization, Linux Tun/Tap
    • Linux Network Namespace
    • Veth Pair
    • Linux Bridge
    • Vlan
    • VxlAN
    • Routing Protocol
      Distance Vector Protocol,BGP
      Link-State Protocol,OSPF
  • K8S Network

    • Service
      • Cluster IP
      • Headless
      • NodePort
      • LoadBalancer
        • Ingress
          • K8S Ingress
          • lstio Ingress Gateway
    • API Gateway + Service Mesh
    • Kubernetes CNI 插件, Calico
作者

操先森

发布于

2021-09-27

更新于

2021-09-27

许可协议

评论