马哥 Linux SRE + AIOps智能运维文档
第 39 章 / 42

Kubernetes

← 上一章:DevOps 之 Jenkins 的 CICD | 返回总目录 | 下一章:Prometheus →


  • Kubernetes将所有工作节点的资源集结在一起形成一台更加强大的“服务器”

  • 计算和存储接口通过Master之上的API Server暴露

  • 客户端通过API提交应用程序的运行请求,而后由Master通过调度算法将其自动指派至某特定的工作节点以

  • Pod对象的形式运行

  • Master会自动处理因工作节点的添加、故障或移除等变动对Pod的影响

http://www.magedu.com

Kubernetes集群架构

  • Kubernetes属于典型的Server-Client形式的二层架构

    • Master主要由API Server、Controller-Manager和Scheduler三个组件,以及一个用于集群状态存储的Etcd存储服务组成,它们构成整个集群的控制平面

    • 而每个Node节点则主要包含Kubelet、Kube Proxy及容器运行时(docker是最为常用的实现)三个组件,它们承载运行各类应用容器

http://www.magedu.com

Kubernetes Master Components

 API Server

◼ 整个集群的API网关,相关应用程序为kube-apiserver

◼ 基于http/https协议以REST风格提供,几乎所有功能全部抽象为“资源”及相关的“对象”

◼ 声明式API,用于只需要声明对象的“终态”,具体的业务逻辑由各资源相关的Controller负责完成 ◼ 无状态,数据存储于etcd中

  • Cluster Store

    • 集群状态数据存储系统,通常指的就是etcd

    • 仅会同API Server交互

  • Controller Manager

    • 负责实现客户端通过API提交的终态声明,相应应用程序为kube-controller-manager

    • 由相关代码通过一系列步骤驱动API对象的“实际状态”接近或等同“期望状态”

      • 工作于loop模式
  • Scheduler

    • 调度器,负责为Pod挑选出(评估这一刻)最合适的运行节点

    • 相关程序为kube-scheduler

http://www.magedu.com

Kubernetes Worker Components

  • Kubelet

    • Kubernetes集群于每个Worker节点上的代理,相应程序为kubelet

    • 接收并执行Master发来的指令,管理由Scheduler绑定至当前节点上的Pod对象的容器

      • 通过API Server接收Pod资源定义,或从节点本地目录中加载静态Pod配置

      • 借助于兼容CRI的容器运行时管理和监控Pod相关的容器

  • Kube Proxy

    • 运行于每个Worker节点上,专用于负责将Service资源的定义转为节点本地的实现 ◆ iptables模式:将Service资源的定义转为适配当前节点视角的iptables规则

      • ipvs模式:将Service资源的定义转为适配当前节点视角的ipvs和少量iptables规则
    • 是打通Pod网络在Service网络的关键所在

http://www.magedu.com

Kubernetes Add-ons

  • 负责扩展Kubernetes集群的功能的应用程序,通常以Pod形式托管运行于Kubernetes集群之上

  • 必选插件

    • Network Plugin:网络插件,经由CNI接口,负责为Pod提供专用的通信网络,有多种实现

    • Cluster DNS:集群DNS服务器,负责服务注册、发现和名称解析,当下的实现是CoreDNS

  • 重要插件

    • Ingress Controller:Ingress控制器,负责为Ingress资源提供具体的实现,实现http/https协议的七层路由和流量调度,有多种实现,例如Ingress-Nginx、Contour等

    • Dashboard:基于Web的UI

    • 指标监控系统:Prometheus

    • 日志系统:ELK、PLG等

http://www.magedu.com

2 应用编排的基本工作逻辑

Pod和应用

  • Kubernetes本质上是“以应用为中心”的现代应用基础设施, Pod 是其运行应用及应用调度的最小逻辑单元

    • 本质上是共享Network、IPC和UTS名称空间以及存储资源的容器集

      • 可将其想象成一台物理机或虚拟机,各容器就是该主机上的进程

      • 各容器共享网络协议栈、网络设备、路由、IP地址和端口等,但Mount、PID和USER仍隔离

      • 每个Pod上还可附加一个“存储卷(Volume)”作为该“主机”的外部存储,独立于Pod的生命周期,可由Pod内的

      • 各容器共享

    • 模拟“不可变基础设施”,删除后可通过资源清单重建

      • 具有动态性,可容忍误删除或主机故障等异常

      • 存储卷可以确保数据能超越Pod的生命周期

  • 在设计上,仅应该将具有“超亲密”关系的应用分别以不同容器的形式运行于同一Pod内部

http://www.magedu.com

为什么要设计Service资源?

  • Pod具有动态性,其IP地址也会在基于配置清单重构后重新进行分配,因而需要服务发现机制的支撑

  • Kubernetes使用Service资源和DNS服务(CoreDNS)进行服务发现

    • Service能够为一组提供了相同服务的Pod提供负载均衡机制,其IP地址(Service IP,也称为Cluster IP)即为客户端流量入口

    • 一个Service对象存在于集群中的各节点之上,不会因个别节点故障而丢失,可为Pod提供固定的前端入口

    • Service使用标签选择器 (Label Selector)筛选并匹配Pod对象上的标签(Label),从而发现Pod

      • 仅具有符合其标签选择器筛选条件的标签的Pod才可

由Service对象作为后端端点使用

http://www.magedu.com

Pod 和工作负载型控制器

  • Pod是运行应用的原子单元,其生命周期管理和健康状态监测由kubelet负责完成,而诸如更新、扩缩容和重建等应用编排功能需要由专用的控制器实现,这类控制器即工作负载型控制器

    • ReplicaSet和Deployment

    • DaemonSet

    • StatefulSet

    • Job和CronJob

 工作负载型控制器也通过标签选择器筛选Pod标签从而完成关联

 工作负载型控制器的工作重心

◼ 确保选定的Pod精确符合期望的数量

◆ 数量不足时依据 Pod模板创建,超出时销毁多余的对象

  • 按配置定义进行扩容和缩容

  • 依照策略和配置进行应用更新

http://www.magedu.com

部署并访问应用

  • 部署应用

    • 依照编排需求,选定合适类型的工作负载型控制器

    • 创建工作负载型控制器对象,由其确保运行合适数量的Pod对象

    • 创建Service对象,为该组Pod对象提供固定的访问入口

http://www.magedu.com

部署并访问应用(2)

  • 请求访问Service对象上的服务

    • 集群内部的通信流量也称为东西向流量,客户端也是集群上的Pod对象;

    • Service同集群外部的客户端之间的通信流量称为南北向流量,客户端是集群外部的进程;

      • 另外,集群上的Pod也可能会与集群外部的服务进程通信,

http://www.magedu.com

3 Kubernetes网络基础

Kubernetes网络模型

  • Kubernetes集群上会存在三个分别用于节点、Pod和Service的网络

    • 于worker上完成交汇

    • 由节点内核中的路由模块,以及iptables/netfilter和ipvs等完成网络间的流量转发

http://www.magedu.com

Kubernetes网络模型(2)

  • 节点网络

    • 集群节点间的通信网络,并负责打通与集群外部端点间的通信

    • 网络及各节点地址需要于Kubernetes部署前完成配置,非由Kubernetes管理,因而,需要由管理员手动进行,

    • 或借助于主机虚拟化管理程序进行

  • Pod网络

    • 为集群上的Pod对象提供的网络

    • 虚拟网络, 需要经由CNI网络插件实现 ,例如Flannel、Calico、Cilium等

  • Service网络

    • 在部署Kubernetes集群时指定,各Service对象使用的地址将从该网络中分配

    • Service对象的IP地址存在于其相关的iptables或ipvs规则中

    • 由Kubernetes集群自行管理

http://www.magedu.com

Kubernetes集群中的通信流量

  • Kubernetes网络中主要存在4种类型的通信流量

    • 同一Pod内的容器间通信

    • Pod间的通信

    • Pod与Service间的通信

    • 集群外部流量与Service间的通信

  • Pod网络需要借助于第三方兼容CNI规范的网络插件完成,这些插件需要满足以下功能要求 ◼ 所有Pod间均可不经NAT机制而直接通信

    • 所有节点均可不经NAT机制直接与所有Pod通信

    • 所有Pod对象都位于同一平面网络中

http://www.magedu.com

集群部署与应用编排

 讲师:马永亮(马哥)  http://www.magedu.com  https://github.com/ikubernetes/

本节大纲

  • 部署分布式Kubernetes集群

    • 集群组件运行模式

    • 可用的集群部署工具

    • 使用kubeadm部署高可用的K8S集群

  • API资源规范

    • 类型元数据

    • 对象元数据

    • spec和status

  • 应用编排快速入门

  • kubectl命令格式

  • 应用编排示例

http://www.magedu.com

1 部署Kubernetes集群

Kubernetes集群组件运行模式

  • 独立组件模式

    • 除Add-ons以外,各关键组件以二进制方式部署于节点上,并运行于守护进程;

    • 各Add-ons以Pod形式运行

  • 静态Pod模式

    • 控制平面各组件以静态Pod对象运行于Master主机之上

    • kubelet和docker以二进制部署,运行为守护进程

    • kube-proxy等则以Pod形式运行

    • k8s.gcr.io

http://www.magedu.com

安装工具

  • 原生安装工具kubeadm

 CNCF认证的安装工具

http://www.magedu.com

kubeadm

  • Kubernetes社区提供的集群构建工具

    • 负责执行构建一个最小化可用集群并将其启动等必要的基本步骤

    • Kubernetes集群全生命周期管理工具,可用于实现集群的部署、升级/降级及卸载等

    • kubeadm仅关心如何初始化并拉起一个集群,其职责仅限于下图中背景着色的部分

http://www.magedu.com

kubeadm支持的控制平面高可用模型

 kubeadm HA topology - stacked etcd

http://www.magedu.com

kubeadm支持的控制平面高可用模型

 kubeadm HA topology - external etcd

http://www.magedu.com

部署前提

  • 使用kubeadm部署Kubernetes集群的前提条件

◼ 支持Kubernetes运行的Linux主机,例如Debian、RedHat及其变体等

  • 每主机2GB以上的内存,以及2颗以上的CPU

  • 各主机间能够通过网络无障碍通信

  • 独占的hostname、MAC地址以及product_uuid,主机名能够正常解析

  • 放行由Kubernetes使用到的各端口,或直接禁用iptables

  • 禁用各主机的上的Swap设备

  • 各主机时间同步

  • 准备代理服务,以便接入k8s.gcr.io,或根据部署过程提示的方法获取相应的Image

http://www.magedu.com

需要开放的端口

http://www.magedu.com

Kubernetes集群示例环境

 OS: Ubuntu 20.04.2 LTS

  • Docker:20.10.21,CGroup Driver: systemd

  • Kubernetes:v1.25.3, CRI: cri-dockerd, CNI: Flannel

  • 网络环境

    • 节点网络:172.29.0.0/16

◼ Pod网络:10.244.0.0/16

◼ Service网络:10.96.0.0/12

IP地址 主机名 角色
172.29.9.1 K8s-master01.magedu.com, K8s-master01, kubeapi.magedu.com Master
172.29.9.2 K8s-master02.magedu.com, K8s-master02 Master
172.29.9.3 K8s-master03.magedu.com, K8s-master03 Master
172.29.9.11 K8s-node01.magedu.com, K8s-node01 Worker
172.29.9.12 K8s-node02.magedu.com, K8s-node02 Worker
172.29.9.13 K8s-node03.magedu.com, K8s-node03 Worker

http://www.magedu.com

集群部署步骤

  • 验证各前提条件是否已然满足

  • 在各节点上安装容器运行时

    - 本示例选用Docker 20.10.21,但Kubernetes将直接使用Containerd
    
    - 必要时,为Docker设置使用的代理服务
    
  • 在各节点上安装kubeadm、kubelet和kubectl

  • 创建集群

    • ① 在控制平面的第一个节点上,使用kubeadm init命令拉起控制平面

      - 会生成token以认证后续加入的节点
      
    • ② (实验环境可选)将其它几个控制平面节点使用kubeadm join命令加入到控制平面集群中

      - 提示:需要先从第一个控制平面节点上拿到CA及API Server等相应的证书
      
    • ③ 将各worker节点使用kubeadm join命令加入到集群中

    • ④ 确认各节点状态正常转为“Ready”

http://www.magedu.com

Bootstrapping clusters with kubeadm

 部署高可用的Kubernetes集群

  • 简单的示例发表在公众号iKubernetes 上

  • 或者参考Kubernetes网站上的部署文档

    • https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

http://www.magedu.com

2 API资源规范

核心资源类型

  • Kubernetes API Primitive

    • 用于描述在Kubernetes上运行应用程序的基本组件,即俗称的Kubernetes对象(Object)

    • 它们持久存储于API Server上,用于描述集群的状态

  • 依据资源的主要功能作为分类标准,Kubernetes的API对象大体可分为如下几个类别

    • 工作负载(Workload)

    • 服务发现和负载均衡(Discovery & LB)

    • 配置和存储(Config & Storage)

    • 集群(Cluster)

    • 元数据(Metadata)

  • “以应用为中心”

    • Kubernetes API Primitive基本都是围绕一个核心目的而设计:如何更好地运行和丰富Pod资源,从而为容器化应用提供更灵活和更完善的操作与管理组件

http://www.magedu.com

核心资源类型(2)

  • 工作负载型资源负责应用编排

 服务发现和负载均衡型资源完成服务注册、发现及流量调度

http://www.magedu.com

API资源规范

 资源规范

◼ 绝大多数的Kubernetes对象都包含spec和status两个嵌套字段

  • spec字段存储对象的期望状态(或称为应有状态) ⚫ 由用户在创建时提供,随后也可按需进行更新(但有些属性并不支持就地更新机制)

⚫ 不同资源类型的spec格式不尽相同

◆ status字段存储对象的实际状态(或称为当前状态)

⚫ 由Kubernetes系统控制平面相关的组件负责实时维护和更新 ◼ 对象元数据 ◆ 名称、标签、注解和隶属的名称空间(不包括集群级别的资源)等 ◼ kind和apiVersion两个字段负责指明对象的类型(资源类型)元数据

  • 前者用于指定类型标识

◆ 后者负责标明该类型所隶属的API群组(API Group)

apiVersion: <GROUP/VERSION> kind: metadata: name: … namespace: … labels: { … } annotations: { … } spec: { … }

http://www.magedu.com

API资源规范(2)

  • API Server

    • 基于HTTP(S)协议暴露了一个RESTful风格的API

    • kubectl命令或其它UI通过该API查询或请求变更API对象的状态

      • 施加于对象之上的基本操作包括增、删、改、查等

      • 通过HTTP协议的GET、POST、DELETE和PUT等方法完成,而对应于kubectl命令,它们则是create、get、describe、 delete、patch和edit等子命令

  • API对象管理

    • 创建对象时,必须向API Server提供描述其所需状态的对象规范、对象元数据及类型元数据

    • 需要在请求报文的body中以JSON格式提供

      • 用户也能够以YAML格式定义对象,提交给API Server后由其自行完成格式转换
  • 资源规范的具体格式

    • https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.22/

    • 内建文档:kubectl explain 命令获取

    • 参考现有资源对象:kubectl get TYPE/NAME -o {yaml|json}

http://www.magedu.com

3 应用编排快速入门

API资源对象管理

  • 使用客户端程序,对API Server的REST服务端点发请求

    • 请求的body部分要遵循API资源规范
  • kubectl命令提供了三种类型的对象管理机制

    • 指令式命令(Imperative commands)

      • 直接作用于集群上的活动对象(Live objects)

      • 适合在开发环境中完成一次性的操作任务

    • 指令式对象配置(Imperative object configuration)

      • 基于资源配置文件执行对象管理操作,但只能独立引用每个配置清单文件

  • 可用于生产环境的管理任务

  • 声明式对象配置(Declarative object configuration)

    • 基于配置文件执行对象管理操作

    • 可直接引用目录下的所有配置清单文件,也可直接作用于单个配置文件

http://www.magedu.com

部署并访问应用

  • 部署应用

    • 依照编排需求,选定合适类型的工作负载型控制器

    • 创建工作负载型控制器对象,由其确保运行合适数量的Pod对象

    • 创建Service对象,为该组Pod对象提供固定的访问入口

http://www.magedu.com

指令式命令

 编排应用

◼ 仅打印资源清单

◆ kubectl create deployment demoapp --image=ikubernetes/demoapp:v1.0 --port=80 --dry-run=client --replicas=3 -o yaml

◼ 创建deployment对象

  • kubectl create deployment demoapp --image=ikubernetes/demoapp:v1.0 --port=80 --replicas=3

◆ Deployment控制器确保deployment/demoapp中定义,

◼ 了解完整的资源规范及状态

◆ kubectl get deployments [-o yaml|json]

◼ 了解Pod对象的相关信息

◆ kubectl get pods -l app=demoapp -o wide

apiVersion: apps/v1 kind: Deployment metadata: creationTimestamp: null labels:

app: demoapp

name: demoapp

spec: replicas: 3 selector: matchLabels:

app: demoapp

strategy: {} template:

metadata: creationTimestamp: null labels:

app: demoapp

spec: containers:

  • image: ikubernetes/demoapp:v1.0

name: demoapp resources: {} status: {}

http://www.magedu.com

指令式命令(2)

 创建Service对象

◼ 仅打印资源清单

◆ kubectl create service clusterip demoapp --tcp=80:80 --dry-run=client -o yaml ◼ 创建Service对象

◆ kubectl create service clusterip demoapp --tcp=80:80

◼ 了解Service的相关信息

◆ kubectl get services demoapp -o wide

◼ 访问Service

◆ demoappIP=$(kubectl get services demoapp -o jsonpath={.spec.clusterIP}) ◆ curl $demoappIP

apiVersion: v1 kind: Service metadata: creationTimestamp: null labels: app: demoapp name: demoapp spec: ports: - name: 80-80 port: 80 protocol: TCP targetPort: 80 selector: app: demoapp type: ClusterIP status: loadBalancer: {}

http://www.magedu.com

Pod和容器设计模式

 讲师:马永亮(马哥)  http://www.magedu.com  https://github.com/ikubernetes/

本节大纲

  • Pod及资源规范

    • Pod资源规范

    • 创建Pod资源配置文件

    • 管理Pod资源对象

  • 配置Pod

    • 容器探针及示例

    • 安全上下文及使用示例

    • 资源需求、资源限制及使用示例

  • 容器设计模式

  • Sidecar容器及示例

  • Ambassador容器及示例

  • Adapter容器及示例

  • Init容器及示例

http://www.magedu.com

1 定义Pod资源

关于Pod

  • 什么是Pod?

    • 一个或多个容器的集合,因而也可称为容器集,但却是Kubernetes调度、部署和运行应用的原子单元

    • ◼ 另外封装的内容:可被该组容器共享的存储资源、网络协议栈及容器的运行控制策略等

    • 依赖于 pause 容器事先创建出可被各应用容器共享的基础环境,它默认共享Network、IPC和UTS名称空间给各容器,PID名称空间也可以共享,但需要用户显式定义

  • Pod的组成形式有两种

    • 单容器Pod:仅含有单个容器

    • 多容器Pod:含有多个具有“超亲密”关系的容器

      • 同一Pod内的所有容器都将运行于由Scheduler选定的同一个节点上

http://www.magedu.com

Pod资源规范的基础框架

 一个极简的Pod定义,仅需要为其指定一个要运行的容器即可

  • 给出该容器的名称和使用的Image

Pod资源规范的基础框架

apiVersion:v1 kind: Pod metadata: name: … # Pod的标识名,在名称空间中必须惟一; namespace: … # 该Pod所属的名称空间,省略时使用默认名称空间default; spec: containers: # 定义容器,它是一个列表对象,可包括多个容器的定义,至少得有一个; - name: … # 容器名称,必选字段,在当前Pod中必须惟一; image: … # 创建容器时使用的镜像;

  • pause容器无需定义

  • 下面是一个简单的Pod资源示例

apiVersion: v1 kind: Pod metadata: name: pod-demo namespace: default spec: containers: - name: demo image: ikubernetes/demoapp:v1.0

http://www.magedu.com

阿里云知行实验室

  • 更加便捷的在线实验室

    • 后面几节的内容将以实验场景“Kubernetes CKAD 认证实践”中实验为基础进行

    • ◼ https://start.aliyun.com

http://www.magedu.com

了解Pod的运行状况

 打印Pod完整的资源规范,通过status字段了解

◼ kubectl get TYPE NAME -o yaml|json

  • 例如

    • kubectl get pods demoapp -o yaml

◆ kubectl get pods demoapp -o json

  • 打印Pod资源的详细状态

◼ kubectl describe TYPE NAME

  • 例如

◆ kubectl describe pods demoapp

  • 获取Pod中容器应用的日志

◼ kubectl logs [-f] [-p] (POD | TYPE/NAME) [-c CONTAINER]

  • 例如

◆ kubectl logs demoapp -c demoapp

http://www.magedu.com

阿里云知行实验室上的实验

  • “K8SAPI基础及Pod基本应用”一节

http://www.magedu.com

Pod的phase和重启策略

 Pod的相位

  • 容器的状态

 Pod的重启策略:决定了容器终止后是否应该重启

  • Always:无论何种exit code,都要重启容器

◼ OnFailure:仅在exit code为非0值(即错误退出)时才重启容器

◼ Never:无论何种exit code,都不重启容器

图片来源:https://livebook.manning.com/book/kubernetes-in-action-second-edition/chapter-6/v-6/18

http://www.magedu.com

2 配置Pod

通过环境变量向容器传递参数

 环境变量是容器化应用的常用配置方式之一

 在容器上嵌套使用env字段

◼ 每个环境变量需要通过name给出既定的名称

◼ 传递的值则定义在value字段上

apiVersion: v1 kind: Pod metadata: name: mydb namespace: default spec: containers: - name: mysql image: mysql:8.0 env: - name: MYSQL_RANDOM_ROOT_PASSWORD value: 1 - name: MYSQL_DATABASE value: wpdb - name: MYSQL_USER value: wpuser - name: MYSQL_PASSWORD value: magedu.com

apiVersion: v1 kind: Pod metadata: name: wordpress namespace: default spec: containers: - name: wordpress image: wordpress:5.7 env: - name: WORDPRESS_DB_HOST value: ??? - name: WORDPRESS_DB_NAME value: wpdb - name: WORDPRESS_DB_USER value: wpuser - name: WORDPRESS_DB_PASSWORD value: magedu.com

http://www.magedu.com

应用监控

  • 容器式运行的应用类似于“黑盒”,为了便于平台对其进行监测,云原生应用应该输出用于监视自身 API

    • 包括健康状态、指标、分布式跟踪和日志等

    • 至少应该提供用于健康状态监测的API

图片来源:https://www.Redhat.com

http://www.magedu.com

Pod的健康状态监测机制

 Pod支持的监测类型

  • startup Probe

  • liveness Probe

  • readiness Probe

  • 监测机制

    • Exec Action:根据指定命令的结果状态码判定

    • TcpSocket Action:根据相应TCP套接字连接建立状态判定

    • HTTPGet Action:根据指定https/http服务URL的响应结果判定

  • 配置参数

    • initialDelaySeconds

    • periodSeconds

    • timeoutSeconds

    • successThreshold

    • failureThreshold

图片来源:https://loft.sh/blog

http://www.magedu.com

健康探针配置示例

 同时定义了三种探针

◼ startup使用了Exec Action

◼ liveness和readiness使用HTTPGet Action

 测试效果

◼ liveness

  • URL “/livez” 支持以POST方法为livez参数设定不同值, 非OK值都以5xx响应码响应;

◼ readiness

◆ URL “/readyz” 支持以POST方法为readyz参数设定不同值,非OK值都以5xx响应码响应;

apiVersion: v1 kind: Pod metadata: name: pod-probe-demo namespace: default spec: containers: - name: demo image: ikubernetes/demoapp:v1.0 imagePullPolicy: IfNotPresent startupProbe: exec: command: ['/bin/sh','-c','test','"$(curl -s 127.0.0.1/livez)"=="OK"'] initialDelaySeconds: 0 failureThreshold: 3 periodSeconds: 2 livenessProbe: httpGet: path: '/livez' port: 80 scheme: HTTP initialDelaySeconds: 3 timeoutSeconds: 2 readinessProbe: httpGet: path: '/readyz' port: 80 scheme: HTTP initialDelaySeconds: 15 timeoutSeconds: 2 restartPolicy: Always

http://www.magedu.com

阿里云知行实验室上的实验

  • “容器存活状态及就绪状态探测”一节

http://www.magedu.com

Security Context

  • Pod及容器的安全上下文

    • 一组用来决定容器是如何创建和运行的约束条件,这些条件代表创建和运行容器时使用的运行时参数

    • ◼ 给了用户为Pod或容器定义特权和访问控制机制

  • Pod和容器的安全上下文设置主要包括以下几个方面

    • 自主访问控制DAC

    • 容器进程运行身份及资源访问权限

    • Linux Capabilities

    • seccomp

    • AppArmor

    • SELinux

    • Privilgege Mode

    • Privilege Escalation

  • Kubernetes支持在Pod及容器级别分别使用安全上下文

  • 阿里云知行实验室上的实验:“理解及使用Security Context”

http://www.magedu.com

资源需求(requests)和限制(limits)

 资源需求和资源限制

  • 资源需求(requests)

    • 定义需要系统预留给该容器使用的资源最小可用值

    • 容器运行时可能用不到这些额度的资源,但用到时必须确保有相应数量的资源可用

    • 资源需求的定义会影响调度器的决策

  • 资源限制(limits)

    • 定义该容器可以申请使用的资源最大可用值,超出该额度的资源使用请求将被拒绝

    • 该限制需要大于等于requests的值,但系统在其某项资源紧张时,会从容器那里回收其使用的超出其requests值的那部分

  • requests和limits定义在容器级别,主要围绕cpu、memory和hugepages三种资源

  • 阿里云知行实验室上的实验:“资源需求和资源限制”

http://www.magedu.com

3 Pod设计模式

关于容器设计模式

  • 基于容器的分布式系统中常用的3类设计模式

    • 单容器模式:单一容器形式运行的应用

    • 单节点模式:由强耦合的多个容器协同共生

    • 多节点模式:基于特定部署单元(Pod)实现分布式算法

 单节点多容器模式

  • 一种跨容器的设计模式

  • 目的是在单个节点之上同时运行多个共生关系的容器,因而容器管理系统需要由将它们作为一个原子单位进行统一调度

  • Pod概念就是这个设计模式的实现之一

http://www.magedu.com

容器设计模式(2)

  • 单节点多容器模式的常见实现

    • Sidecar模式

      • Pod中的应用由主应用程序(通常是基于HTTP协议的应用程序)以及一个Sidecar容器组成

      • 辅助容器用于为主容器提供辅助服务以增强主容器的功能,是主应用程序是必不可少的一部分,但却未必非得运行为应用的一部分

    • Ambassador模式

      • Pod中的应用由主应用程序和一个Ambassador容器组成

      • 辅助容器代表主容器发送网络请求至外部环境中,因此可以将其视作主容器应用的“大使”

      • 应用场景:云原生应用程序需要诸如断路、路由、计量和监视等功能,但更新已有的应用程序或现有代码库以添加这些功能可能很困难,甚至难以实现,进程外代理便成了一种有效的解决方案

http://www.magedu.com

容器设计模式(3)

  • 单节点多容器模式的常见实现

    • Adapter模式

      • Pod中的应用由主应用程序和一个Adapter容器组成

      • Adapter容器为主应用程序提供一致的接口,实现了模块重用,支持标准化和规范化主容器应用程序的输出以便于外部服务进行聚合

    • Init Container模式

      • 一个Pod中可以同时定义多个Init容器

      • Init容器负责以不同于主容器的生命周期来完成那些必要的初始化任务,包括在文件系统上设置必要的特殊权限、 数据库模式设置或为主应用程序提供初始数据等,但这些初始化逻辑无法包含在应用程序的镜像文件中,或者出于安全原因,应用程序镜像没有执行初始化活动的权限等等

      • Init容器需要串行运行,且在所有Init容器均正常终止后,才能运行主容器

http://www.magedu.com

存储卷

 讲师:马永亮(马哥)  http://www.magedu.com  https://github.com/ikubernetes/

本节大纲

  • 存储卷基础

    • 存储卷的基础概念

    • 卷类型及卷插件

    • 卷规范及基本用法

  • 持久卷

    • 持久卷的功用及工作逻辑

    • PV和PVC规范及用法

    • StorageClass及用法

  • Kubernetes存储架构及CSI简介

    • 存储架构简介

    • CSI存储组件及部署架构

  • 示例:基于NFS的CSI

http://www.magedu.com

1 存储卷基础

存储卷基础

  • 从概念上讲,存储卷是可供Pod中的所有容器访问的目录

    • Pod规范中声明的存储卷来源决定了目录的创建方式、使用的存储介质以及目录的初始内容

      • 存储卷插件(存储驱动)决定了支持的后端存储介质或存储服务,例如 hostPath插件使用宿主机文件系统,而nfs插件则对接指定的NFS存储服务等

      • kubelet内置支持多种存储卷插件

    • Pod在规范中需要指定其包含的卷以及这些卷在容器中的挂载路径

  • 存储卷对象并非Kubernetes系统一等公民,它定义在Pod上,因而卷本身的生命周期同Pod,但其后端的存储及相关数据的生命周期通常要取决于存储介质

图源https://medium.com/

http://www.magedu.com

存储卷类型和相应的插件

 In-Tree存储卷插件

◼ 临时存储卷

◆ emptyDir

◼ 节点本地存储卷

◆ hostPath, local

◼ 网络存储卷

◆ 文件系统:NFS、GlusterFS、CephFS和Cinder

◆ 块设备:iSCSI、FC、RBD和vSphereVolume

◆ 存储平台:Quobyte、PortworxVolume、StorageOS和ScaleIO

◆ 云存储:awsElasticBlockStore、gcePersistentDisk、azureDisk和azureFile

◼ 特殊存储卷

◆ Secret、ConfigMap、DownwardAPI和Projected

◼ 扩展接口

◆ CSI和FlexVolume

 Out-of-Tree存储卷插件

◼ 经由CSI或FlexVolume接口扩展出的存储系统称为Out-of-Tree类的存储插件

http://www.magedu.com

存储卷资源规范

  • 定义存储卷

    • 存储卷对象并非Kubernetes系统一等公民,它需要定义在 Pod上

    • 卷本身的生命周期同Pod,但其后端的存储及相关数据的生命周期通常要取决于存储介质

  • 存储卷的配置由两部分组成

    • 通过.spec.volumes字段定义在Pod之上的存储卷列表,它经由特定的存储卷插件并结合特定的存储供给方的访问接口进行定义

    • 嵌套定义在容器的volumeMounts字段上的存储卷挂载列表, 它只能挂载当前Pod对象中定义的存储卷

spec:

volumes: