1、k8s基础概念
- 官网: https://kubernetes.io
- GitHub : https://aithub.com/kubernetes/kubernetes
- 由来∶谷歌的Borg系统,后经Go语言重写并捐献给CNCF基金会开源含义:词根源于希腊语∶舵手/飞行员,K8S →K12345678S
- 重要作用:开源的容器编排框架工具(生态极其丰富)
- 学习的意义︰解决跑裸docker的若干痛点
使用Docker容器化封装应用程序的缺点(坏处)·
- 单机使用,无法有效集群·随着容器数量的上升,管理成本攀升
- 没有有效的容灾/自愈机制
- 没有预设编排模板,无法实现快速、大规模容器调度·
- 没有统一的配置管理中心工具
- 没有容器生命周期的管理工具·
- 没有图形化运维管理工具
Kubernetes优势·
自动装箱,水平扩展,自我修复
- 服务发现和负载均衡
- 自动发布(默认滚动发布模式)和回滚·
- 集中化配置管理和密钥管理
- 存储编排
- 任务批处理运行
2、四组基本概念.
Pod/Pod控制器
pod
- Pod- Pod是K8S里能够被运行的最小的逻辑单元(原子单元)
- 1个Pod里面可以运行多个容器,它们共享UTS+NET+IPC名称空间。
- 可以把Pod理解成豌豆荚,而同一Pod内的每个容器是一颗颗豌豆.
- 一个Pod里运行多个容器,又叫:边车(SideCar)模式
pod控制器
Pod控制器是Pod启动的一种模板,用来保证在K8S里启动的Pod应始终按照人们的预期运行(副本数、生命周期、健康状态检查…)K8S内提供了众多的Pod控制器,常用的有以下几种
- DeploymentDaemonSet.
- ReplicaSet.
- StatefulSet.
- Job
- Cronjob
Name/Namespace
- Name
- 由于K8S内部,使用“资源”来定义每一种逻辑概念(功能)故每种“资源”,都应该有自己的“名称”。
- 资源”有api版本(apiVersion)类别(kind )、元数据( metadata)、定义清单( spec )、状态( status )等配置信息。
- “名称”通常定义在“资源”的“元数据”信息里。
- Name
- NameSpace
- 随着项目增多、人员增加、集群规模的扩大,需要一种能够隔离K8S内各种“资源”的方法,这就是名称空间名称空间可以理解为K8S内部的虚拟集群组。
- 不尚名称空间内的“资源”,名称可以相同,相同名称空间内的同种“资源”,“名称”不能相同。
- 合理的使用K8S的名称空间,使得集群管理员能够更好的对交付到K8S里的服务进行分类管理和浏览
- .K8S里默认存在的名称空间有:default、 kube-system、kube-public·查询K8S里特定“资源”要带上相应的名称空间
Label/Label选择器
- Label
- 标签是k8s特色的管理方式,便于分类管理资源对象。
- 一个标签可以对应多个资源,一个资源也可以有多个标签,它们是多对多的关系。
- 一个资源拥有多个标签,可以实现不同维度的管理。
- 标签的组成: key=value与标签类似的,还有一种“注解”( annotations )
- Label
- Label选择器
- 给资源打上标签后,可以使用标签选择器过滤指定的标签标签
- 选择器目前有两个:基于等值关系(等于、不等于)和基于集合关系(属于、不属于、存在)
- 许多资源支持内嵌标签选择器字段
- matchLabels
- matchExpressions
Service/Ingress
非关系型数据库,Etcd 是一个分布式的,依赖key-value存储的,最重要的分布式数据存储系统
- 完全复制:集群中的每个节点都可以使用完整的存档高可用性:Etcd可用于避免硬件的单点故障或网络问题
- 一致性:每次读取都会返回跨多主机的最新写入
- 简单:包括一个定义良好、面向用户的API(gRPC)
- 安全:实现了带有可选的客户端证书身份验证的自动化TLS
- 快速:每秒10000次写入的基准速度
- 可靠:使用Raft算法实现了强一致、高可用的服务存储目录
主控节点master
kube-apiserver服务
- 提供了集群管理的REST API接口(包括认证授权、数据校验以及集群状态变更);
- 提供其他模块之间的数据交互和通信的枢纽(其他模块通过API Server查询或修改数据,只有API Server才直接操作etcd);
- 是资源配额控制的入口;
- 拥有完备的集群安全机制.
kube-controller-manager服务
资源控制器主要是为了控制各种资源的变更信息,例如pod的创建新增,副本控制器和账户控制器等信息,资源控制器的主要职责就是通过list-watch机制,从APIServer处获取所有的操作,从而将资源的操作依次解耦,通过不同的事件来驱动整个k8s的步骤。最容易理解的一张图
- kube-scheduler服务
- 公平调度
- 资源高效利用
- QoS
- affinity 和 anti-affinity
- 数据本地化(data locality)
- 内部负载干扰(inter-workload interference)
- deadlines
运算节点node
kube-proxy
- userspace:最早的负载均衡方案,它在用户空间监听一个端口,所有服务通过 iptables 转发到这个端口,然后在其内部负载均衡到实际的 Pod。该方式最主要的问题是效率低,有明显的性能瓶颈。
- iptables:目前推荐的方案,完全以 iptables 规则的方式来实现 service 负载均衡。该方式最主要的问题是在服务多的时候产生太多的 iptables 规则,非增量式更新会引入一定的时延,大规模情况下有明显的性能问题
- ipvs:为解决 iptables 模式的性能问题,v1.11 新增了 ipvs 模式(v1.8 开始支持测试版,并在 v1.11 GA),采用增量式更新,并可以保证 service 更新期间连接保持不断开
- winuserspace:同 userspace,但仅工作在 windows 节点上
kube-kubelet
每个Node节点上都运行一个 Kubelet 服务进程,默认监听 10250 端口,接收并执行 Master 发来的指令,管理 Pod 及 Pod 中的容器。每个 Kubelet 进程会在 API Server 上注册所在Node节点的信息,定期向 Master 节点汇报该节点的资源使用情况,并通过 cAdvisor 监控节点和容器的资源。
CLI客户端kubectl
kubectl 是 Kubernetes 的命令行工具(CLI),是 Kubernetes 用户和管理员必备的管理工具。
kubectl 提供了大量的子命令,方便管理 Kubernetes 集群中的各种功能。这里不再罗列各种子命令的格式,而是介绍下如何查询命令的帮助
- kubectl -h 查看子命令列表
- kubectl options 查看全局选项
- kubectl <command> --help 查看子命令的帮助
- kubectl [command] [PARAMS] -o=<format> 设置输出格式(如 json、yaml、jsonpath 等)
- kubectl explain [RESOURCE] 查看资源的定义
- 核心附件
- CNI fannel/calico
- 服务发现插件
- 服务暴露插件
- GUI插件