CNCF Alibaba 云原生技术底层知识点以及核心概念
1.Kubernetes 并不支持为应用固定 IP,于是我自己通过编写网络插件把应用 IP 管理在了 etcd 里,然后上线。请问这破坏了云原生的理念了吗?A
A. 否
B. 是
2.云原生技术与容器技术的关系是? B
A. 完全相同
B. 容器技术是云原生的基础技术之一
C. 没有关系
3.容器启动后,我会时常 SSH 进入到容器里然后写很多文件。请问这破坏了云原生理念了吗? B
A. 否
B. 是
4.如果我想学习一键部署 Kubernetes 集群,应该关注本课程大纲里的哪个知识点? B
A. Kubernetes 基础
B. 集群安装配置与验证
C. Kubernetes 进阶
D. 应用配置管理
5.云原生架构必须只使用 CNCF 里的项目。 A
A. 否
B. 是
6.我编写的容器化应用,会将日志文件写在某路径写死的目录里。请问这破坏了云原生理念了吗? B
A. 否
B. 是
7.以下哪些项目跟 Kubernetes 项目功能重合度最高? C
A. Mesos
B. Docker Swarm
C. Docker Swarm 模式(SwarmKit)
D. Cloud Foundry
8.以下哪些能力不是标准 Kubernetes 项目提供的? B
A. 容器编排与调度
B. PaaS
C. 资源管理
D. 服务注册与发现
9.云原生架构必须选型 Kubernetes 方案。 A
A. 否
B. 是
10.以下哪些标准,可以用来考察一个应用的架构是不是云原生的? ABC
A. 应用实例能否快速水平扩展
B. 应用是否使用镜像机制打包来保证环境一致性
C. 应用数据是否都写在容器数据卷中
D. 应用是否有状态
2、容器基本概念
1.已运行 docker run -d -t —name demo ubuntu top 命令,以下哪个 docker 命令创建出的容器能看见 demo 容器进程? B
A. docker run --name demo-x --net container:demo ubuntu ps
B. docker run --name demo-x --pid container:demo ubuntu ps
C. docker run --name demo-x --ipc container:demo ubuntu ps
2.以下哪个 docker 命令可以用来创建一个使用宿主机主机名的容器? A
A. docker run --uts=host ubuntu hostname
B. docker run ubuntu hostname
C. docker run --ipc host ubuntu ps
3.已运行 docker run -d -t —name demo ubuntu top 和 docker run --name demo-x --pid container:demo ubuntu ps 命令,
如果 demo 容器退出了,正在运行的 demo-x 容器是否会退出? A
A. 是
B. 否
4.已运行 docker run -d —name demo busybox:1.25 top 命令,如何使用 docker 命令来获取容器 demo 的 Init 进程 PID? A
A. docker inspect demo -f '{{.State.Pid}}'
B. docker inspect demo -f '{{.Pid}}'
5.已运行 docker run -d -t —name demo ubuntu top 命令, 在 demo 这个容器内看到 top 命令的 PID 是什么? B
A. 随机数字
B. 1
6.已知容器 Init 进程 PID,在宿主机上通过 kill -9 PID 的方式结束该进程,容器当前的状态是什么? A
A. Exited
B. Stopped
7.已运行 docker run -d -t —name demo ubuntu top 命令, docker exec -it demo kill -9 1
强行给容器内一号进程发KILL信号,容器是否会退出? B
A. 是
B. 否
8.已运行 docker run -d -t —name demo ubuntu top 和 docker run --name demo-x --pid
container:demo ubuntu ps 命令,是否可以在 demo-x 容器内部停止容器? A
A. 是
B. 否
9.以下哪个 docker 命令创建出来的容器可以自动重启? C
A. docker run -d busybox top
B. docker run --restart always busybox top
C. docker run -d --restart always busybox top
10.如何快速判断 docker daemon 是否支持动态接管运行容器? AB
A. docker info | grep 'Live Restore Enabled'
B. docker info -f '{{.LiveRestoreEnabled}}'
C. docker info -f "{{.Live_Restore_Enabled}}"
注: 在国内访问 Docker Hub 速度比较慢,可以在Docker引擎中设置镜像加速器加速对Docker Hub的访问。
更新 /etc/docker/daemon.json
,添加如下参数,并重启Docker引擎。
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
阿里云注册链接:https://account.aliyun.com/register/register.htm
阿里云登录链接:https://account.aliyun.com/login/login.htm
阿里云容器镜像服务页面:https://cr.console.aliyun.com
容器镜像服务(Container Registry)提供安全的应用镜像托管能力,精确的镜像安全扫描功能,稳定的国内外镜像构建服务,便捷的镜像授权功能,方便用户进行镜像全生命周期管理。 1、当我们拥有阿里云容器镜像服务账号,并在访问凭证页面设置固定密码后,就可以使用 docker 客户端来登录服务。回到ECS实例,执行以下命令:
$ docker login -username=**** registry.cn-hangzhou.aliyuncs.com
Password:
Login Succeeded
注意:此处的密码是在容器镜像服务-访问凭证页面 设置的固定密码。
2、在推送到镜像之前,我们在容器镜像服务的杭州地域,建立一个命名空间为mydemo、仓库名为demo的本地仓库。之后,我们在ECS上将镜像地址修改为对应的镜像仓库地址:
# mydemo 可以替换成自己的命名空间
$ docker tag demo:v1 registry.cn-hangzhou.aliyuncs.com/mydemo/demo:v1
$ docker push registry.cn-hangzhou.aliyuncs.com/mydemo/demo:v1
3、在本地下载demo:v1镜像
登出 ECS 实例,在本地(已安装docker环境) docker pull 来下载镜像。
# mydemo 请替换成第5小节步骤中指定的命令空间
$ docker pull registry.cn-hangzhou.aliyuncs.com/mydemo/demo:v1
下载完毕之后,我们就可以直接运行该镜像。
$ docker run -d -p 8000:80 registry.cn-hangzhou.aliyuncs.com/mydemo/demo:v1
并查看本地的 8000
端口。
$ curl localhost:8000
扩容到2个POD
[root@cce-7day-fudonghai-24106 01CNL]# kubectl scale deployment nginx --replicas=2
deployment.extensions/nginx scaled
扩容成功
[root@cce-7day-fudonghai-24106 01CNL]# kubectl get deploy/nginx -owide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
nginx 2/2 2 2 14m nginx nginx run=nginx
使用run命令建立yaml文件,而不是真正建立对象
[root@cce-7day-fudonghai-24106 ~]# kubectl run --image=nginx my-deploy -o yaml --dry-run > my-deploy.yaml
可以使用下列命令启动自动补全功能
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc
如果报错,升级一下bash-completion软件
yum install bash-completion
查看资源定义
[root@cce-7day-fudonghai-24106 027day]# kubectl explain pod.spec.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution
查看集群状态
[root@master1 ~]# kubectl cluster-info
Kubernetes master is running at https://192.168.57.130:6443
KubeDNS is running at https://192.168.57.130:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
[root@master1 ~]#
改变资源升级
[root@cce-7day-fudonghai-24106 027day]# kubectl set resources deploy nginx -c=nginx --limits=cpu=200m,memory=256Mi
deployment.extensions/nginx resource requirements updated
[root@cce-7day-fudonghai-24106 027day]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-6bc5c66cdd-dqwdm 1/1 Running 0 14s
nginx-6bc5c66cdd-xz85d 1/1 Running 0 14s
[root@cce-7day-fudonghai-24106 027day]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-6bc5c66cdd-dqwdm 1/1 Running 0 19s
nginx-6bc5c66cdd-xz85d 1/1 Running 0 19s
[root@cce-7day-fudonghai-24106 027day]# kubectl rollout history deploy nginx --revision=3
deployments "nginx" with revision #3
Pod Template:
Labels: pod-template-hash=6bc5c66cdd
run=nginx
Containers:
nginx:
Image: nginx:1.9.1
Port: <none>
Host Port: <none>
Limits:
cpu: 200m
memory: 256Mi
Environment: <none>
Mounts: <none>
Volumes: <none>
回滚到版本2
[root@cce-7day-fudonghai-24106 027day]# kubectl rollout undo deploy nginx --to-revision=2
deployment.extensions/nginx
水平扩容
[root@cce-7day-fudonghai-24106 027day]# kubectl scale deploy nginx --replicas=4
deployment.extensions/nginx scaled
[root@cce-7day-fudonghai-24106 027day]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-8676fdbb6d-2g4np 1/1 Running 0 3m39s
nginx-8676fdbb6d-c9k78 0/1 ContainerCreating 0 7s
nginx-8676fdbb6d-rj4np 1/1 Running 0 3m39s
nginx-8676fdbb6d-vjtln 0/1 ContainerCreating 0 7s
[root@cce-7day-fudonghai-24106 027day]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-8676fdbb6d-2g4np 1/1 Running 0 3m45s
nginx-8676fdbb6d-c9k78 0/1 ContainerCreating 0 13s
nginx-8676fdbb6d-rj4np 1/1 Running 0 3m45s
nginx-8676fdbb6d-vjtln 1/1 Running 0 13s
[root@cce-7day-fudonghai-24106 027day]# kubectl rollout history deploy nginx
deployments "nginx"
REVISION CHANGE-CAUSE
1 <none>
3 <none>
4 <none>
3、核心概念
master核心组件
1、API server 所有组件和这里连接进行消息传送
2、Controller 控制器,集群状态管理,容器修复,水平扩张 热备
3、Scheduler 调度器,找合适的节点放置 热备
4、etcd 存储,高可用系统,保证master组件的系统
node核心组件
1、Kubelet 关键组件,通过apiserver获取状态,创建环境运行容器
2、Container Runtime 拿到指令进行部署
3、Storage Plugin 存储
4、Network Plugin 网络
5、Kube-proxy
例子:生命周期
Kubernetes Watch 机制可以看作是基于 SSE 的实时事件推送机制。它提供了一种高效、即时、实时的方式来监控和响应 Kubernetes 资源的变化
HTTP 长连接和 Server-Sent Events(SSE)来实现的
完整生命周期:
用户可以通过 UI、CLI提交一个pod给kubernetes进行部署,这个pod的请求首先会通过UI、CLI提交一个pod给kubernetes进行部署,那这个pod的请求首先会通过UI、CLI提交给kubernetes API Server,下一步,API server会把信息写入到存储系统etcd里面,之后Scheduler会通过API Server的watch或实时事件推送机制得到这个信息,有一个pod需要被调度,这时候Scheduler会根据他的内存状态进行一次调度决策,在完成调度之后,他会像API Server report说;OK这个pod需要被调度到某一个节点上,这时候API Server接收到这次操作之后,会把这个结果写入到etcd中,然后API Server通知对应的节点进行这次pod的真正的执行、启动,相应节点的kubectl会得到通知,kubectl会调用Container Runtime来真正启动配置容器和容器运行环境,去调度这个Storage Plugin配合存储,Network Plugin配置网络
Deployment
应用控制单元
Service
网络 支持多种访问 ClusterIP NodePort LoadBalancer
Namespaces
一个集群内部的逻辑隔离机制(鉴权、资源额度)
API基础知识
APIVersion: 路径二级目录 /api/v1
Kind: 定义,比如pod 操作那种资源
Metadata:写pod名字 打标签labels 写资源额外用户层的描述
Spec:希望pod达到预期状态,内部哪些containers需要被运行,所需要的image是什么,所暴露的端口是什么,当我们从API中获取,一般会有一个states,状态调度、running或terminalt(被执行完毕)
练习
1.Kubelet 或者 Scheduler 是否会和 etcd 直接通讯? B
A. 是
B. 否
2.如果想要改变 Deployment 中的 Pod 副本数,需要________ B
A. 通过 API 调用,通知 Kubernetes 需要在Deployment中增加的 Pod 副本具体数目
B. 通过 API 调用,通知 Kubernetes 需要 Deployment到达到的 Pod 副本最终数目
C. 通过 API 调用,生成新的 Pod 副本,并且把新的 Pod 副本赋予 Deployment
D. 无法改变 Deployment的Pod副本数,只能重新生成一个新的 Deployment
3.Kubernetes 的中文含义是________ B
A. 船
B. 舵手
C. 容器平台
D. 起重机
4.API Server 的主要功能是________ A
A. 暴露 Kubernetes API,Kubernetes 控制面的前端,也是内部组件互相通讯的中枢
B. 暴露 Kubernetes API,Kubernetes 控制面的前端,但是内部组件会直接通讯而不经过 API Server
C. 暴露 Kubernetes API,持久化存储 Kubernetes 的 API object
D. 管理 Kubernetes 的 API object 的在集群中的生命周期
5.Scheduler 的主要功能是________ A
A. Pod 的在Node上的放置
B. Pod 的生命周期管理
C. Node 上具体的资源分配
D. Node 的生命周期管理
6.Kubectl 是________ A
A. 一个与 Kubernetes 集群进行交互、管理的命令行工具
B. 一个与 Kubernetes 集群进行交互、管理的Web UI 界面
C. 一个 用来管理 Deployment 等作业负载的 Kubernetes 控制器
D. 一个对 Kubernetes 节点进行监控的服务
7.Kubernetes 进行资源调度的最小粒度是________ C
A. 进程
B. 容器
C. Pod
D. 虚拟机
8.Kubernetes 的主要功能不包括________ EF
A. Service discovery and load balancing
B. Automatic bin packing
C. Storage orchestration
D. Self-healing
E. Continuous integration
F. Canary Analysis
G. Automated rollouts and rollbacks
H. Secret and configuration management
I. Horizontal scaling
J. Batch execution
9.属于 Node 上的基本组件有________ ABD
A. Kubelet
B. Kube-proxy
C. Controller Manager
D. Container runtime engine
10.Kubernetes 的 API Object通常包含那几部分? ABCDE
A. apiVersion
B. kind
C. metadata
D. spec
E. status
4、pod和容器设计模式
1.容器的“单进程”模型的具体含义是? B
A. 容器里只能运行一个进程
B. 容器里PID=1 的进程是应用本身,一般情况下不具备像 systemd 这样完善的进程管理能力
C. 容器不支持多进程的编程模型
D. 我不能 exec 进入容器然后启动一个新进程
2.如果:Kubernetes 比作操作系统,容器比作进程,那么:Pod 可以比作进程组 B
A. 否
B. 是
3.容器的PID=1 的进程是应用本身 B
A. 否
B. 是
4.如果容器 A 要获取容器 B 里的某个文件,我该怎么做? B
A. A 进入 B 的 Mount Namespace
B. A、B 放在一个 Pod 里通过共享 Volume 来传递文件
C. A 和 B 共享 Mount Namespace
D. 把需要的文件打进 A 的镜像
5.一个 Pod 里Infra Container 的启动顺序是? D
A. 无所谓
B. 最后一个
C. 先于主业务容器启动即可
D. 第一个
6.关于 Pod 的描述不正确的是 A
A. 一个 Pod 里一个容器是最佳实践
B. 一个逻辑概念
C. 多个容器的组合
D. Kubernetes 的原子调度单位
7.Istio 项目会往用户的 Pod 里注入 Envoy 容器,用来代理 Pod 的进出流量,这是什么设计模式? B
A. 装饰器
B. sidecar
C. 工厂模式
D. 单例
8.关于 Google Borg 论文论述正确的是? BCD
A. 应用互相之间往往相互独立,毫不相关
B. 应用互相之间往往存在协作关系
C. 很多应用需要部署永远部署在同一台机器上
D. Google 在进行应用开发的过程中,天生就具备微服务的概念
9.如果没有 Pod 概念,但我要用多个容器模拟 Pod 的话,可能需要做哪些工作? ABCD
A. resource hoarding
B. 乐观调度
C. 共享这些容器的Network Namespace
D. 设置 Affinity 约束
10.两个容器之间的超亲密关系可能包括哪些情况? BD
A. 需要运行在同一台宿主机上
B. 直接发生文件交换
C. 低频率的 RPC 调用
D. 共享某些 Linux Namespace
1.controller中reflector不会对 apiserver进行 LIST 操作的场景 D
A. controller 重启的时候
B. 和 apiserver watch 操作异常的情况
C. 配置定期的执行 LIST
D. controller中需要筛选符合标签的 pod 时候
2.在controller的event handler中, 不适合执行的操作是 D
A. 根据资源的 ownerreference 找到资源的创建者
B. 判断资源信息,对于不关心的对象, 直接返回
C. 在workqueue中加入资源
D. 执行控制器的实际处理工作
3.下列哪个场景不是 selector 的使用场景 C
A. 设计一个查询的界面,根据 label 筛选资源
B. 配置应用的调度规则, 选择必需调度到包含某些 label 的节点
C. 存储数据库应用的配置信息
D. 判断可能归属于 replicaset 的 pod
4.下列哪个键值对无法作为Kubernetes对象的label? D
A. app.kubernetes.io/version=3.4.1
B. failure-domain.beta.kubernetes.io/region=cn-shanghai
C. app-name=trade
D. scaling-config=“min-replicas:50”
5.Controller中的 workerqueue 中可以存放什么内容 A
A. Namespace名+ pod 名
B. Namespace名+pod 名+事件的类型
C. Pod 的列表
D. Pod对象的指针
6.下列哪个键值对不适合做为 annotations B
A. statefulset 的历史配置 yaml
B. service对应的应用名,用来方便筛选
C. 用来表示ingress路由的正则表达式值
D. 用来扩展 pod 状态,表示对应pod 在第三方数据库的记录情况
7.controller 中 worker 最不适合做什么操作 D
A. 创建其他资源对象
B. 重新往 workqueue 中塞入对象
C. 更新资源对象的 status
D. 调用其他耗时的web 服务并等待返回
E. 什么都不做
8.下列关于controller中workqueue描述不正确的 B
A. 因为workqueue具备去重功能,可以往 workqueue中反复加入资源
B. 为了加速controller的处理,可以往 workqueue中加入资源的指针
C. 一个控制器的workqueue一般只存储一种类型资源的名字
D. 对于处理 node 的控制器,可以只在 workqueue 中加入节点的名字而不包括命名空间
9.Controller中的object store默认以什么作为索引? C
A. 对象的 label
B. 对象的annotation
C. 对象的namespace
D. 对象的名字
10.以下不是声明式的API 设计 ABC
A. 创建一个容器的 API 是 POST /containers/create,请求参数是容器的各种规格, 返回系统生成的容器 id
B. 删除一个容器的 API 是 DELETE /containers/<containerid>, 返回一个异步删除的工单号,可以根据工单号查询删除进度
C. 给应用扩容的 API 是 PUT /containers/create?increaseReplicas=1, 参数指定扩容的增量容器数量
D. 更新一个容器镜像的 API 是 PATCH /containers/<containerid>?image=nginx, 返回的是容器新的目标状态
6、应用编排与管理-Deployment
1.创建Deployment描述文件中写的template,用处不包括: D
A. 声明Pod的挂载目录
B. 计算ReplicaSet的hash
C. 指定镜像版本
D. 指定期望数量
2.以下哪个明显不是deployment扩容出来的pod name: B
A. nginx-deployment-77964d65f-5h52m
B. nginx-deployment-676cc869
C. nginx-deployment-6987cdb55b-r4tnr
D. nginx-deployment-5c689d88bb-vqf4b
3.以下关于revision历史版本说法正确的是: B
A. 使用deployment可以rollout回滚到任何一个历史上的版本
B. pod-template-hash标识了pod的revision版本
C. revisionHistoryLimit字段不设置默认没有数量限制
D. 更新了deployment任意字段,最新revision会发生变化
4.一个Deployment中,哪些labels/selector必须一致: C
A. deployment.Labels与deployment.Spec.Template.Labels一致
B. deployment.Labels与deployment.Spec.Selector一致
C. deployment.Spec.Selector与deployment.Spec.Template.Labels一致
D. deployment.Labels、deployment.Spec.Selector、deployment.Spec.Template.Labels三者都要一致
5.Deployment与ReplicaSet的关系与以下哪组资源最像? C
A. Pod与Node
B. Pod与Container
C. ReplicaSet与Pod
D. Deployment与Pod
6.关于MaxUnavailable以下说法正确的是: B
A. MaxUnavailable不可以设置为0,否则无法发布
B. MaxUnavailable可以设置超过replicas
C. MaxUnavailable可以和MaxSurge同时设置为0
D. MaxUnavailable可以设置超过100%
7.以下关于paused说法错误的是: D
A. 可以在deployment发布的过程中修改paused字段
B. paused默认值为false
C. paused不可以用来暂停扩缩容操作
D. deployment controller在发布出现问题时会自动设置paused
8.通过Deployment不能实现以下功能: C
A. 应用扩缩容
B. 应用发布回滚
C. 应用重启
D. 应用副本数量维持
9.以下关于Deployment的说法正确的有哪些? AC
A. Deployment下running的Pod数量可能大于replicas数量
B. Deployment更新镜像时一定会创建一个ReplicaSet
C. 用kubectl rollout undo命令回滚Deployment,不会创建新的ReplicaSet
D. 滚动发布的时候MaxUnavailable和MaxSurge可以同时设为0
10.指定Deployment回滚到某个历史版本执行成功的过程中,不会发生以下哪些事件: BC
A. Pod创建和销毁
B. ReplicaSet创建和销毁
C. Deployment期望数量变化
D. Deployment template变化
7、Job和DaemonSet
1.Job 中 spec 可否指定replicas 参数? B
A. 可以
B. 不可以
2.CronJob 中 schedule 字段书写规范,以下哪一个代表每分钟执行一次? A
A. */1 * * * *
B. * */1 * * *
C. * * */1 * *
D. * * * */1 *
3.如果 Job 的 activeDeadlineSeconds 设置为 10s, backoffLimit 为 5 次。 当任务运行到第三次时候,时间已经到达 10s,请问此任务会继续重试运行,还是会 DeadlineExceeded? A
A. DeadlineExceeded
B. 继续重试
4.有一个任务会偶发失败,我们希望失败的时候能够不断的重试直到任务能够运行成功,应该使用哪几个标签配合完成? B
A. restartPolicy: Never
B. restartPolicy: OnFailure
C. restartPolicy: Always
5.以下哪几个参数配合能够实现将任务一共运行 10 次,每次均运行 2 个pod? A
A. .spec.completions: 10 .spec.parallelism: 2
B. .spec.completions: 2 .spec.parallelism: 10
C. .spec.completions: 2
D. .spec.parallelism: 10
6.DaemonSet 不能帮助我们做什么事情? D
A. 保证集群内每一个(或者一些)节点都运行一组相同的Pod
B. 跟踪集群节点状态,保证新加入的节点自动创建对应的Pod
C. 跟踪集群节点状态,保证移除的节点删除对应的Pod
D. 能够设置Pod重试次数,到达指定重试次数后停止
7.Job 能帮助我们做的事情不包括如下哪个? A
A. 确保每一台机器都能运行指定的Pod
B. 跟踪Pod状态,根据配置及时重试失败的 Pod
C. 确定依赖关系,保证上一个任务运行完毕后再运行下一个任务
D. 控制任务并行度,并根据配置确保Pod 队列大小
8.以下 Daemonset yaml 中,哪些是正确的? CD
A. apiVersion