CNCF Alibaba 云原生技术底层知识点以及核心概念

发布时间 2023-06-12 14:29:36作者: Security

1、入门:

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