每日一题

This commit is contained in:
huanqing.shao
2019-11-21 20:38:25 +08:00
parent aa902cebe4
commit 793e7dc038
20 changed files with 389 additions and 7 deletions

BIN
t/cka/daily.assets/640.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

46
t/cka/daily.md Normal file
View File

@ -0,0 +1,46 @@
---
vssueId: 162
# layout: StepLayout
sharingTitle: CKA备考每日一题
description: CKA备考每日一题
meta:
- name: keywords
content: Kubernetes,K8S,CKA,Certified Kubernetes Administrator
---
# CKA考试备战--每日一题
<AdSenseTitle/>
> CKA 考试每日一题系列,全部内容由 [我的小碗汤](https://mp.weixin.qq.com/s/5tYgb_eSzHz_TMsi0U32gw) 创作,本站仅做转载
这两年 Kubernetes 已经成为容器编排的事实标准,预计未来两年内将全面普及,现在企业招这块人才需求也越来越大,工资也是很高的,未来这块的发展空间也很大。
最近正准备备考CKACKA是什么有些人可能还不知道这里简单普及一下
CKA 证书是云原生计算基金会 CNCF 组织的,考察的是你是否具备足够管理 Kubernetes 集群的必备知识。考试形式是上机直接在集群上操作,限时 3 小时,非常考验个人知识的扎实程度和 Kubernetes 实践经验。考上 75 分你就能拿到证书。考试期间只可查阅K8S官方手册。证书有效期两年考试费用300美元国外考试费用就是贵一年内可有一次免费补考的机会。
CKA证书的含金量如何考不考这个证完全取决于个人因为持证并不等于上岗尤其是上心仪公司的岗。考证可以帮你获得初级职位但高级职位需要个人经验的大量积累。而站在面试官的角度看有这个证至少可以为你搏一个面试机会尤其是应届生和有转岗想法的程序员。这些人可能缺乏足够经验但 CKA 证很能体现个人技术水平,行业认可程度也很高。
**考纲如下:**
<p style="max-width: 600px">
<img src="./daily.assets/640.png" alt="CKA考纲">
</p>
可访问 [https://github.com/cncf/curriculum](https://github.com/cncf/curriculum) 关注最新的考纲变化!
------
作为在Kubernetes技术上摸爬滚打1年多的老鸟最近正准备备考CKA鉴于此我希望想证明自己kubernetes开发运维能力的小伙伴能一起从今天开始我们一起每日一题在留言区答题打卡我会在其中选出3位认真并坚持打卡21天的小伙伴送出3本书。
[CKA每日一题 - Day 1](./daily/001.html)
[CKA每日一题 - Day 2](./daily/002.html)
<JoinCKACommunity/>

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 215 KiB

167
t/cka/daily/001.md Normal file
View File

@ -0,0 +1,167 @@
---
vssueId: 163
# layout: StepLayout
sharingTitle: CKA备考每日一题 - Day 1
description: CKA备考每日一题 - Day 1
meta:
- name: keywords
content: Kubernetes,K8S,CKA,Certified Kubernetes Administrator
---
# CKA每日一题 --- Day 1
<AdSenseTitle/>
**今日考题**
以下 Daemonset yaml 中,哪些是正确的?(多选)
A.
``` yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd-elasticsearch
namespace: default
labels: k8s-app: fluentd-logging
spec:
selector:
matchLabels:
name: fluentd-elasticsearch
template:
metadata:
labels:
name: fluentd-elasticsearch
spec:
containers:
- name: fluentd-elasticsearch
image: gcr.io/fluentd-elasticsearch/fluentd:v2.5.1
restartPolicy: Never
```
B.
``` yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd-elasticsearch
namespace: default
labels:
k8s-app: fluentd-logging
spec:
selector:
matchLabels:
name: fluentd-elasticsearch
template:
metadata:
labels: name: fluentd-elasticsearch
spec:
containers:
- name: fluentd-elasticsearch
image: gcr.io/fluentd-elasticsearch/fluentd:v2.5.1
restartPolicy: Onfailure
```
C.
``` yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd-elasticsearch
namespace: default
labels:
k8s-app: fluentd-logging
spec:
selector:
matchLabels:
name: fluentd-elasticsearch
template:
metadata:
labels: name: fluentd-elasticsearch
spec:
containers:
- name: fluentd-elasticsearch
image: gcr.io/fluentd-elasticsearch/fluentd:v2.5.1
restartPolicy: Always
```
D.
``` yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd-elasticsearch
namespace: default
labels:
k8s-app: fluentd-logging
spec:
selector:
matchLabels:
name: fluentd-elasticsearch
template:
metadata:
labels:
name: fluentd-elasticsearch
spec:
containers:
- name: fluentd-elasticsearch
image: gcr.io/fluentd-elasticsearch/fluentd:v2.5.1
```
<b-button v-b-toggle.collapse-join-error variant="danger" size="sm" style="margin-top: 1rem;" v-on:click="$sendGaEvent('cka-daily', 'cka-daily', 'CKA每日一题001')">答案及解析</b-button>
<b-collapse id="collapse-join-error" class="mt-2">
<b-card style="background-color: rgb(254, 240, 240); border: solid 1px #F56C6C;">
**答案: C、D**
在考试时只允许有考试网站和k8s官网两个标签页。所以平常学习时尽可能去找官网文档去学习官网才是最权威的。熟悉 [https://kubernetes.io/concepts/](https://kubernetes.io/concepts/) 目录下的内容对考试通过非常有帮助。
[https://kuboard.cn/learning/](https://kuboard.cn/learning/) 目录下提供了 [https://kubernetes.io/concepts/](https://kubernetes.io/concepts/) 目录下的中文翻译,可以对照着学习。
以这个问题为例直接打开daemonset的官网说明文档见以下链接
[https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/](https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/)
![img](./001.assets/640.jpeg)
> A Pod Template in a DaemonSet must have a RestartPolicy equal to Always, or be unspecified, which defaults to Always. Daemonset里的pod Template下必须有RestartPolicy如果没指定会默认为Always
在 [https://kuboard.cn](https://kuboard.cn) 上也可以找到对应的中文内容:
[https://kuboard.cn/learning/k8s-intermediate/workload/wl-daemonset/create.html](https://kuboard.cn/learning/k8s-intermediate/workload/wl-daemonset/create.html)
![image-20191120225243614](./001.assets/image-20191120225243614.png)
restartPolicy 字段,可选值为 Always、OnFailure 和 Never。默认为 Always。一个Pod中可以有多个容器restartPolicy适用于Pod 中的所有容器。restartPolicy作用是让kubelet重启失败的容器。
另外Deployment、Statefulset的restartPolicy也必须为Always保证pod异常退出或者健康检查 livenessProbe失败后由kubelet重启容器。[https://kubernetes.io/zh/docs/concepts/workloads/controllers/deployment](https://kubernetes.io/zh/docs/concepts/workloads/controllers/deployment) 或者 [https://kuboard.cn/learning/k8s-intermediate/workload/wl-deployment](https://kuboard.cn/learning/k8s-intermediate/workload/wl-deployment)
Job和CronJob是运行一次的podrestartPolicy只能为OnFailure或Never确保容器执行完成后不再重启。[https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/](https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/) 或者 [https://kuboard.cn/learning/k8s-intermediate/workload/wl-job/](https://kuboard.cn/learning/k8s-intermediate/workload/wl-job/)
> 实际考试以上机实操为主
</b-card>
</b-collapse>
> CKA 考试每日一题系列,全部内容由 [我的小碗汤](https://mp.weixin.qq.com/s/5tYgb_eSzHz_TMsi0U32gw) 创作,本站仅做转载
<JoinCKACommunity/>

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

72
t/cka/daily/002.md Normal file
View File

@ -0,0 +1,72 @@
---
vssueId: 166
# layout: StepLayout
sharingTitle: CKA备考打卡 - 每日一题 - Day 2
description: CKA备考打卡 - 每日一题 - Day 2
meta:
- name: keywords
content: Kubernetes,K8S,CKA,Certified Kubernetes Administrator
---
# CKA每日一题 --- Day 2
<AdSenseTitle/>
**今日考题**
在Kubernetes PVC+PV 体系下通过 CSI 实现的 volume plugins 动态创建 pv 到 pv 可被 pod 使用有哪些组件需要参与?
A. PersistentVolumeController + CSI-Provisoner + CSI controller plugin
B. AttachDetachController + CSI-Attacher + CSI controller plugin
C. Kubelet + CSI node plugin
<b-button v-b-toggle.collapse-join-error variant="danger" size="sm" style="margin-top: 1rem;" v-on:click="$sendGaEvent('cka-daily', 'cka-daily', 'CKA每日一题001')">答案及解析</b-button>
<b-collapse id="collapse-join-error" class="mt-2">
<b-card style="background-color: rgb(254, 240, 240); border: solid 1px #F56C6C;">
**答案: A、B、C**
k8s中利用PVC 描述Pod 所希望使用的持久化存储的大小可读写权限等一般由开发人员去创建利用PV描述具体存储类型存储地址挂载目录等一般由运维人员去提前创建。而不是直接在pod里写上volume的信息。一来可以使得开发运维职责分明二来利用PVC、PV机制可以很好扩展支持市面上不同的存储实现如k8s v1.10版本对Local Persistent Volume的支持。
**我们试着理一下Pod创建到volume可用的整体流程。**
用户提交请求创建podPersistentVolumeController发现这个pod声明使用了PVC那就会帮它找一个PV配对。
没有现成的PV就去找对应的StorageClass帮它新创建一个PV然后和PVC完成绑定。
新创建的PV还只是一个API 对象,需要经过“**两阶段处理**”,才能变成宿主机上的“持久化 Volume”真正被使用
**第一阶段**由运行在master上的AttachDetachController负责为这个PV完成 Attach 操作,为宿主机挂载远程磁盘;
**第二阶段**是运行在每个节点上kubelet组件的内部把第一步attach的远程磁盘 mount 到宿主机目录。这个控制循环叫VolumeManagerReconciler运行在独立的Goroutine不会阻塞kubelet主控制循环。
完成这两步PV对应的“持久化 Volume”就准备好了POD可以正常启动将“持久化 Volume”挂载在容器内指定的路径。
k8s支持编写自己的存储插件FlexVolume 与 CSI。不管哪种方式都需要经过“两阶段处理”FlexVolume相比CSI局限性大一般我们采用CSI方式对接存储。
CSI 插件体系的设计思想把这个Provision阶段动态创建PV以及 Kubernetes 里的一部分存储管理功能,从主干代码里剥离出来,做成了几个单独的组件。这些组件会通过 Watch API 监听 Kubernetes 里与存储相关的事件变化,比如 PVC 的创建,来执行具体的存储管理动作。
![CKA每日一题](./002.assets/640.jpeg)
上图中CSI这套存储插件体系中三个独立的外部组件External ComponentsDriver Registrar、External Provisioner 和 External Attacher对应的是从 Kubernetes 项目里面剥离出来的部分存储管理功能。
我们需要实现Custom Components这一个二进制会以gRpc方式提供三个服务CSI Identity、CSI Controller、CSI Node。
Driver Registrar 组件,负责将插件注册到 kubelet 里面Driver Registrar调用CSI Identity 服务来获取插件信息External Provisioner 组件监听APIServer 里的 PVC 对象。当一个 PVC 被创建时,它就会调用 CSI Controller 的 CreateVolume 方法,创建对应 PV
External Attacher 组件负责Attach阶段。Mount阶段由kubelet里的VolumeManagerReconciler控制循环直接调用CSI Node服务完成。
两阶段完成后kubelet将mount参数传递给docker创建、启动容器。
**整体流程如下图:**
![CKA每日一题](./002.assets/640.png)
</b-card>
</b-collapse>