前世今生
[阿里云] Infrastructure as a service
[新浪云] platform as a service
[office 365] software as a service
分布式资源管理器
MeSoS 伯克利、Twitter、2019-05弃用
Docker Swarm 2019-7 阿里弃用
Kubernetes 谷歌,2010年 borg系统,go语言翻写 borg 系统 => Kubernetes
borg 系统
config file/borgcfg | command lines tools | web browers
scheduler -> BorgMaster(备份3个以上奇数个)[Paxos] —link shard—> BorgletKubernetes
scheduler | replication controller -> api server <—-> etcd
node [ kubelet | kube proxy —-> firewall | Pod {container [Docker]}]etcd
etcd: 可信赖的分布式键值存储服务 V2 内存,V3 Database(V1.11后支持)
HTTP server -> (Raft、Store) –> WAL(预写日志) | Entry | Snapshot
Kubernetes 特点
轻量级:消耗资源小
开源
弹性伸缩
负载均衡 IPVS
IPVS: IP虚拟服务器,运行在LVS(ipvsadm程序完成该功能)下提供负载均衡
组件和核心
组件 | 介绍 |
---|---|
APIServer | 所有服务访问的统一入口 |
ControllerManager | 维持副本期望数目 |
Scheduler | 负责介绍任务,选择合适的节点分配任务 |
ETCD | 键值对数据库,存储集群的重要信息,进行持久化 |
Kuberlet | 直接和容器引擎交互实现容器的生命周期管理 |
KuberProxy | 负责写入规则至IPTABLES\IPVS实现服务映射访问 |
CoreDNS | 为集群中的SVC创建一个域名解析 |
Dashboard | 为K8S集群提供B\S架构支持 |
INGRESS Controller | 从4层支持到7层 |
Fedetation | 支持多集群统一管理 |
Prometheus | 提供集群监控能力 |
Elk | 日志统一分析介入平台 |
Pod
自主式Pod、控制器管理的Pod
只要运行Pod,Pause容器就会启动存在
一个Pod可以存在多个容器(尾根隔离,进程不隔离,容器端口不能冲突),多个容器公用Pause的网络栈,存储卷
控制器:
ReplicationController 确保副本期望数目
ReplicaSet 本质同上,支持集合 selector
Deployment 建议使用,自动管理 RS,支持 rolling update
Horizontal Pod Autoscaling HPA CPU利用率扩容
StatefulSet 解决有状态服务问题
稳定的持久化存储:基于PVC,Pod重新调度后访问的持久化数据不变
稳定的网络标志:基于Headless Service,Pod重新调度后 PodName、HostName不变
有序部署
有序收缩
DaemonSet
Job、Cron Job 负责批处理任务,即仅执行一次的任务,确保任务成功结束
服务发现
RR:轮询
网络通讯模式
网络模型:所有Pod在一个可以直接连通的扁平化网络空间中
不同节点上的 Docker 容器间的互相访问需要打通,然后运行 K8S
同一 Pod 内的多个容器:Pause 共享网络栈
Pod 间的通讯:Overlay Nerwork
Pod 和 Service 间的通讯:各节点的 Iptables 规则、LVS
Overlay Nerwork
Flannel –> Flanneld
etcd 存储管理 Flannel 可分配的 IP 地址段资源
监控每个 Pod 的实际地址,并在内存中 维护 Pod 节点路由表
资源清单
资源
名称空间级别
工作负载型资源:Pod、控制器
服务发现及负载均衡资源:service、ingress
配置和存储型资源:Volume(存储卷)、CSI(容器存储接口、可扩展第三方存储卷)
特殊类型存储卷:ConfigMap(配置文件热更新)、Secret(保存敏感数据)、DownwardAPI(把外部环境中的信息输出给容器)
集群级别
Namespace、Node、Role、ClusterRole、RoleBinding、ClusterRoleBinding
元数据级别
HPA、PodTemplate、LimitRange
YAML 文件及资源清单
YAML:可读性高,表达数据序列的格式,一种标记语言
基本语法:
缩进只允许使用空格
# 标识注释
数据结构:
对象、数组、纯量
常用字段:
name | 介绍 |
---|---|
version | K8S API 版本 |
kind | 文件定义的资源类型和角色 |
metadata | 元数据对象 |
metadata.name | 元数据对象的名称,如命名Pod的名称 |
metadata.namespace | 元数据对象的命名空间 |
Spec | 详细定义对象 |
Spec.containers[] | 容器列表 |
Spec.containers[].name | 容器的名称 |
Spec.containers[].image | 使用到的镜像名称 |
容器生命周期:
存储
调度器
集群安全机制
HELM
安装
koolshare 软路由
系统初始化
设置系统主机名和 Host 文件相互解析
安装依赖包
设置防火墙位 Iptables 设置空规则
关闭 Selinux
调整内核参数(开启网桥,关闭ipv6)
调整系统时区
关闭不需要的服务
设置 rsyslogd 和 systemd journald
升级系统内核为4.44
kube-proxy 开启 ipvs 前置条件
安装 Docker、Docker-ce
配置 docker\daemon.json
安装 Kubeadm、Kubectl、Kubelet
初始化主节点、加入节点
部署网络
配置私有仓库
Harbor 安装