K8S的基础概念
K8S是由多台主机构成的一个大集群,在集群中运行容器,而这些容器都受到K8S的管理。可以实现容器集群的自动化部署、自动扩缩容、维护等功能。
K8S的特性
- 自动装箱:基于资源依赖打包,自动完成新容器的部署而不影响旧容器的可用性
- 自我修复:基于容器的轻量性,能快速重新启动容器
- 自动扩展:根据业务量自动调整业务容器的数量
- 服务发现:业务容器的新建,会自动关联至前端负载上
- 负载均衡:将用户请求负载至多台业务容器
- 自动发布和回滚:修改容器配置信息,使得业务容器的版本更新和回滚
- 密钥和配置管理:当启动容器时,自动加载配置中心的配置信息,无需下载至容器中
- 存储排版:存储卷自动供给业务容器
- 任务批处理执行
K8S集群的组件
K8S集群分为两个角色:
- master: 管理中心,负责管理和调度集群的资源在node上运行
- node:使用集群资源运行容器,提供服务
Master上的核心组件
- api server : 负责响应用户的管理请求、进行指挥协调K8S所有组件进行工作
- scheduler: 从众多Node节点中选取最优node节点处理请求
- controller-manager:是控制器的管理器,控制器的作用是确保各资源在node节点上按需运行, 而控制器的管理器则确保控制器正常运行。
- etcd 保存K8S的配置信息和各种资源的状态信息。当发生变化时,etcd 会通知K8S的相关组件
node上的核心组件
- kubelet 用于和master上的api server交互,管理Node节点中的资源
- docker 作为容器引擎,提供容器的实现。
- kube-proxy 将service的流量转发到对应endpoint
- flannel 维持各个节点上pod之间的通信。
K8S集群架构图
K8S的核心资源对象
- workload:Pod,controller-manager(各类控制器)
- 服务发现及负载均衡相关:service(四层负载),ingress(实现url七层负载)
- 配置与存储相关的:
Volume基于CSI容器接口来扩展的第三方存储卷,本地是分布式存储,
configmap作为配置信息的存储,
Secret敏感配置信息的存储 - 集群级的资源 Namespace,Node,Role,ClusterRole,Rolebind,ClusterRolebind
- 元数据型资源 HPA,PodTemplate,LimitRange
这些核心资源后面会进行单独列文详解
K8S资源的管理
K8S所有资源的管理都是向api-server发送资源定义,再有api-server调度各组件协调工作以实现请求。但api-server仅接收JSON格式的资源定义。
使用kubectl命令操作时都是自动将yaml格式转换为JSON格式发送给api-server
yaml格式更方便人写,yaml格式提供的内容能被无损转换为JSON格式
使用方式:kubectl apply -f yaml文件
查看某类资源的定义说明
kubectl explain pod ##资源的定义内容分层进行,例如kubectl explain pod.spec
查看指定资源的配置清单
kubectl get pod myapp -o yaml
大部分资源的配置清单内容如下:
apiVersion:标记资源版本 格式group/version 使用命令kebectl api-version查看
kind:标记资源类别
metadata:元数据
- name:资源实例化后的名称,在同一个namespace下的同类资源中必须是唯一的
- namespace:名称空间
- labels:资源标签,格式为键值对
- annotation:资源注解
- uid:在K8S中的唯一标识,由系统自动生成
spec:由用户定义的期望的状态(通过kubectl explain 资源.spec 获取更详细)
status:当前系统的状态。本字段由K8S生成,K8s会不断调整集群使其最终达到spec
举例一个pod实例的定义清单,如下:
apiVersion: v1
kind: Pod
metadata:
name: pod-demo
namespace: default
labels:
app: myapp
tier: frontend
spec:
containers:
- name: myapp
image: 192.168.80.146:5000/my_ngx:v1
创建此Pod
[root@k8s-master k8s-yaml]# kubectl create -f my_ngx_v1.yaml
pod/pod-demo created
[root@k8s-master k8s-yaml]# kubectl get pod -w
NAME READY STATUS RESTARTS AGE
pod-demo 0/1 ContainerCreating 0 9s
pod-demo 1/1 Running 0 11s
每个资源都有引用PATH
/api/GROUP/VERSION/namespace/NAMESPACE/TYPE/NAME
资源的label
label是Kubernetes系统中的一个核心概念。label以key/value键值对的形式附加到任何资源上,如Pod、Service、Node和控制器等。Label可以在创建对象时就附加到对象上,也可以在对象创建后通过API进行额外添加或修改。
资源实例都有自己的label,也会有自己的label selector 用于选择心仪的资源进行关联;