CKAD备战笔记(1)- 核心概念介绍
1. 考试形式
- 远程,详细要求可以在官网上找到
- 考试时可用的资源:k8s官方文档
2. 基本概念
- 容器(container):包含了App,和运行App所需的所有配置与环境。比起虚拟机(VM)来更高效,更灵活
- Pod:是k8s中的最小单位,Pod中的内容分享了同样的网络(Network)和存储(Storage)。Pod封装了一个或多个container(如果是多个container,那么大概率这些container包含了不同的App,比如一个前端App,一个数据库App)。
⚠️ Pod常被用于扩大应用的规模,假设你的App访问人数在某个节假日激增,那我们就新建一个pod,然后把同样的App部署到新建的pod上;同样的,Pod也可以被用于降低App的规模 - 节点(node):安装了k8s的机器,Pod就是在node上跑的。(节点出问题被自动关闭的时候,其上面的容器中的App自然也会被关闭,所以一般我们会多节点运行)
- 工作节点(worker node):真正存放容器,干活的节点
- master节点(master node):监视集群中的worker nodes,并负责对worker nodes上的容器进行实际编排。一个cluster中可以有一个或者多个master nodes
- 集群(cluster):由一群nodes组成
Master node VS Worker node
Master node | Worker node | ||
---|---|---|---|
Server | 带kube-apiserver 服务 |
带kubelet agent 代理 |
kube-apiserver 与kubelet agent 之间有相互的沟通,比如kubelet 提供worker node是否健康的信息,kube-apiserver 给kubelet 发送任务信息等等。所有信息都存储在master node上的etcd数据库中 |
ETCD | ✓ | ✗ | |
Controller | ✓ | ✗ | |
Scheduler | ✓ | ✗ |
3. k8s的六大组件
当你安装k8s时,你实际上安装了以下组件:
(1) API Server
相当于k8s的前端,所有的users,devices,CLIs都通过API Server与k8s集群进行沟通。
(2) ETCD Service
一个存储键值对(key-value) 的数据库,用于实现node的锁,以防止冲突的产生。
(3) Kubelet Service
是在cluster中每个node上运行的代理(agent)。负责确保按预期在节点上运行。
(4) Container Runtime
是用于运行容器的底层软件。通常这个软件是 Docker,但也有其他容器技术。
(5) Controllers
控制器(Controllers)负责编排(orchestration)。负责在node、container或endpoint出现故障时进行通知和响应。(比如,在特定情况下,Controller会决定启动新容器)。在k8s中有多个Controllers,每个负责不同的工作。
(6) Scheduler
负责nodes之间的工作分配和调度。如果有新建的container,Scheduler会将container分配给node
4. k8s中的YAML
YAML
基本介绍见3分钟看懂YAML。k8s中,我们可以选择用kubectl
命令行工具来部署应用,也可以用YAML
文件定义”如何部署应用“,然后再一次性将YAML
文件执行到k8s集群上。相比kubectl
,使用YAML
的优点有:
- Devops as code:可以用git对
YAML
进行版本控制,像写软件代码一样写devops的部署,且多个程序猿可同时进行协作,不会出现信息不同步的问题 - Single source of truth:所有和devops相关的信息都可以查看对应的
YAML
文件 - 容易debug
- 容易进行项目重建:假设你要把现有的部署挪到另一个云供应商平台上去,只需要在部署一遍
YAML
文件即可
在k8s中的YAML
文件都默认应该有四个属性:
apiVersion
:版本,可以是v1或者apps/v1kind
:资源种类,可以是Pod,Service,ReplicaSet或Deployment等metadata
:该资源的元数据,包括name,labels等字典类型数据,不允许其他键的存在spec
:配置信息,每个资源应有的spec都不一样
以下是一个Pod的YAML
文件的例子:
# pod-definition.yml
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels: # ‼️在`lables`中,你可以定义任意到键值对,以帮助你之后快速地找到相关资源
app: myapp
type: frontend
author: chuuuing