K8S 企业容器云01 - 资源管理
《Kubernetes权威指南-企业级容器云实战》 学习笔记
计算资源管理
解决多租户间不同应用容器的 CPU、内存等资源共享和分配,并提供不同级别的 QoS
跨集群资源
通过 Federation 组件将多个 Kubernetes 集群纳管
资源分区
Namespace 将 K8S 集群划分为多个虚拟分区,从逻辑上将租户间的应用隔离
资源配额 & 限制
从三个级别实现租户资源配额和控制
1- Container 级别
Requests <–> Limits
2- Pod 级别
LimitRange
3- Namespace 级别
ResourceQuota
服务端口号
1- 查看当前对外服务 NodePort
2- 纳入现有业务端口
3- 新业务创建时规避以上端口
网络资源管理
跨主机容器网络方案
K8S 网络模型设计原则: 每个 Pod 拥有一个独立 IP,所有 Pod 都在一个可以直接联通的、扁平的网络空间中,运行在不同 Node 上也可以通过 IP 进行访问。
Overlay 网络: 在不改变现有网络配置的前提下,通过某种额外的网络协议,将原 IP 报文封装起来,形成逻辑上的新网络。
CNI(Container Network Interface): 定义容器运行环境与网络插件之间的接口规范,仅关心容器创建时的网络配置和容器被销毁时的网络资源释放。
目前常用网络方案
1- Flannel
-
为每个 Node 上的 docker0 网桥配置一个互不冲突的 IP 地址池;
-
为各 Node 的 docker0 虚拟网络建立一个 Overlay Network,通过覆盖网络将原数据包封包后传输再解包
2- Calico
基于 BGP 的纯三层网络方案
Calico 使容器间流量通过 IP 路由的方式互联互通,直接利用数据中心的网络结构,不需要额外的 NAT、隧道或 Overlay 网络,没有额外封包,节约 CPU 运算且提高网络效率。
3- macvlan
基于 Linux Kernel,在 Node 的一个网络接口上配置多个虚拟的网络接口,这些接口有独立的 MAC 和 IP,使得容器网络和主机网络在同一网段中。
4- Linen
基于 Open vSwitch 的 Overlay 网络方案
5- 直接路由
为每个 Pod 配置 Node 上的路由规则
网络策略
使用 Network Policy 机制对容器间网络通信进行限制和准入控制
集群边界路由器 Ingress
Service 作用于 K8S 集群内部,对外需要 Ingress 将服务暴露出去
常用的 Ingress Controller:Nginx、HAProxy、Traefik
集群 DNS 域名服务
K8S 集群内推荐用 Service Name 作为目的服务的访问地址
1- 集群内部 DNS
skyDNS -> kubeDNS -> CoreDNS
2- 自定义 DNS 和上游 DNS
存储资源管理
存储资源使用需求
-
应用配置文件、密钥
-
应用数据的持久化存储
-
应用间共享数据
Volume 类型
1- 临时目录:生命周期随 Pod 同步
- emptyDir
2- 配置类:将配置以 Volume 形式挂载到 Pod 上
-
ConfigMap
-
Secret:密码密钥
-
downwardAPI
-
gitRepo:Git 代码库
3- 本地存储类
-
hostPath:容器挂载宿主机目录
-
local:本地存储以 PV 的形式提供给容器
4- 共享存储类
- PV:Persistent Volume,供多个容器应用共享的持久存储卷
共享存储
CSI(Container Storage Interface):在容器和共享存储之间建立一套标准的存储访问接口,将存储供应商的代码与 K8S 代码完全解耦
K8S 通过 PV/StorageClass 和 PVC(Persistent Volume Claim)来完成共享存储资源的定义,并通过 volumeMount 挂载到容器的目录或文件进行使用
PV 即可用的存储资源,PVC 是对存储资源的需求
-
静态模式:先指定存储后端定义一部分 PV,以供业务调用
-
动态模式:通过对 StorageClass 的设置标记好后端存储类型,系统自动完成 PV 的创建及与 PVC 的绑定
支持的共享存储类型:FC、Flocker、NFS、iSCSI、CephFS、CephRBD、Cinder、GlusterFS、vSphere、Quobyte、Portworx、Dell EMC ScaleIO、StorageOS、gcePersistentDisk、AWS EBS、AzureFile、AzureDisk 等
存储资源应用场景
1- 存储放置于容器内部
-
配置简单、易于水平扩展、I/O 性能无额外损耗
-
难以持久化保存、要求容器间文件无交互关联
适用于存储运行中产生的临时文件
2- 存储挂载在宿主机上
-
生命周期与容器本身解绑、I/O 性能无额外损耗
-
实例间目录干扰、和宿主机绑定
适合有状态类型的容器应用;及 I/O 性能要求高的应用,如数据库类
3- 使用外部共享存储
-
数据持久化、便于容器水平扩展
-
网络传输对存储的性能影响
适合有状态类型的容器应用;对 I/O 性能不特别敏感;可以水平扩展
镜像资源管理
镜像生命周期
基于持续集成(Continuous Integration)流程,由 DevOps 工具链完成镜像的自动化构建过程,记录镜像版本信息,存入镜像仓库。
基于持续部署(Continuous Deployment)流程,使用仓库内的镜像完成应用的部署和更新
镜像库多租户权限
1- 不同租户的镜像互相隔离
2- 不同租户对镜像拥有不同权限(上传、下载、删除)
镜像库远程复制
多数据中心或跨地域多站点环境,通过总镜像库加多个子镜像库的两级镜像库设置,提高下载效率。
总镜像库的变更自动触发子镜像库远程同步。
镜像库操作审计
保留镜像操作记录
常用开源镜像库
1- Docker Registry
2- VMware Harbor
3- Sonatype Nexus
4- SUSE Portus