PaaS(Platform as a Service)课程考试以前备考的知识点整理,翻了出来,都很集中和重要的知识点摘要,二八法则。阅读前,前提是对这门课程有过系统的了解,否则应该是没效果的。对其软件基础原理、机制的理解,而非只是相关软件的使用命令。当前其中有些功能支持可能已经支持了或过时了。
Docker
1. Docker基本原理以及虚拟机平台的差异
2. Namespace与Cgroups以及daemon功能
1)Namespace是Linux内核提供的资源隔离机制,Namespace的目标是实现轻量级虚拟化服务。
有6种Namespace,如下:
| namespace | parameter | isolation |
|---|---|---|
| UTS | CLONE_NEWUTS | host&domain |
| IPC | CLONE_NEWIPC | Message queue&shared memory |
| PID | CLONE_NEWPID | Process id |
| Network | CLONE_NEWNET | Network |
| Mount | CLONE_NEWNS | FS |
| User | CLONE_NEWUSER | USER |
2)Cgroups是Linux内核功能,它限制、计算和隔离一组进程的资源使用情况(CPU,内存,磁盘I/O,网络等)。 Docker依靠Cgroups来控制和隔离资源限制。
Cgroups的作用:
-
资源限制:限制任务使用的资源总额
-
优先级分配:通过CPU时间片与磁盘IO大小,控制任务执行优先级
-
资源统计: 统计资源使用量
-
任务控制:对任务执行挂起、恢复等操作
Cgroups的资源控制系统,每种子系统控制一种资源,Docker包含9个子系统。
3)Docker deamon,最核心后台进程,负责响应来自Docker client的请求,然后翻译成系统调用完成容器管理操作。后台启动API Server, 负责接收请求,分发调度给相关函数执行。
-
execdriver,对Linux操作系统的namespace, cgroups, apparmor, SELinux等的二次封装,类似LXC,默认实现是Docker官方的libcontainer。
-
volumedriver是volume数据卷存储操作的最终执行者,负责volume增删操作,屏蔽不同实现的差异,为上层提供统一接口。默认实现为local,其他通过外部插件实现。
-
graphdriver是所有容器镜像相关操作的最终执行者,维护与镜像层对应的目录,以及镜像层间的关系和相关元数据。
Docker daemon的组件 有张图
3. docker的常用命令
有张图
4. 知道各种driver
1) NetworkDriver
-
bridge: Docker默认的容器网络驱动。Container通过一对veth连接到docker0网桥上,由Docker为容器动态分配IP及配置路由、防火墙规则等。
-
host: 容器与主机共享同一Network Namespace,共享同一套网络协议栈、路由表及iptables规则等。容器与主机看到的是相同的网络视图。
-
null: 容器内网络配置为空,需要用户手动为容器配置网络接口及路由等。
-
remote: Docker网络插件的实现。Remote driver使得Libnetwork可以通过HTTP RESTful API对接第三方的网络方案,类似SocketPlane的SDN方案只要实现了约定的HTTP URL处理函数及底层的网络接口配置方法,就可以替换Docker原生的网络实现。
-
overlay: Docker原生的跨主机多子网网络方案。主要通过使用Linux bridge和vxlan隧道实现,底层通过类似于etcd或consul的KV存储系统实现多机的信息同步。overlay驱动当前还未正式发布,但开发者可以通过编译实验版的Docker来尝试使用,Docker实验版同时提供了额外的network和service子命令来进行更灵活的网络操作,不过,需要内核版本>=3.16才可正常使用。
2)GraphDriver
5. Docker使用到的Linux网络有关的主要技术
-
Network Namespace(网络命名空间)
-
Veth 设备对
-
Iptables/Netfilter
-
网桥
-
路由
-
Libnetwork
几道问答题
Kubernetes
1. Kubernetes关键概念,kublet,pod,service,volume,scheduler,HPA以及CNI、CNM、CRI、CSI
组件的意义
Master上的组件:
1)API Server 提供了以下的功能:
-
整个集群管理的 API 接口:所有对集群进行的查询和管理都要通过 API 来进行
-
集群内部各个模块之间通信的枢纽:所有模块之前并不会之间互相调用,而是通过和 API Server 打交道来完成自己那部分的工作
-
集群安全控制:API Server 提供的验证和授权保证了整个集群的安全
2)Controller Manager为集群内部的管理控制中心,负责集群内的副本控制(Replication Controller)、端点控制(Endpoint Controller)、命名空间控制(Namespace Controller)和服务账号控制(ServiceAccount)等。
3)Scheduler的作用是将待调度的Pod按照特定的调度算法和调度策略绑定到集群中的某个合适的Node上,并将绑定信息写入etcd中。
分类:
-
RC - 全自动化调度
-
定向调度 NodeSelector
-
亲和调度 NodeAffinity
-
Daemon Set - 特定场景调度
-
Job - 批处理调度
-
Job Template Expansion
-
Queue with Pod Per Work Item
-
Queue with Variable Pod Count
预选策略、优选策略
Kubernetes scheduler当前提供的默认调度流程分为以下两步。
(1)预选调度过程,即遍历所有目标Node,筛选出符合要求的候选节点。为此,Kubernetes内置了多种预选策略(XXX Predicates)供用户选择。
(2)确定最优节点,在第1步的基础上,采用优选策略(ⅹ XX Priority)计算出每个候选节点的积分,积分最高者胜出
4)Etcd 键值对存储
Node上的组件:
1)kubelet 做什么事情 PPT
kubelet负责处理 Master节点下发到本节点的任务,管理和维护在这台主机上运行着的所有容器。本质上,它的工作可以归结为使得Pod的运行状态(status)与它的期望值(spec)一致。
-
节点管理: 监控和汇报当前节点健康状态
-
容器管理:管理容器的生命周期,容器的增删改查以及其他的行为
-
健康检查: 利用容器探针进行应用业务层面的健康检查和故障恢复
-
资源监控: 集成cAdviser搜集主机和容器的资源使用信息
2)kube-proxy 通过查询和监听API server中service和endpoint的变化,为每个Service都建立了一个服务代理对象,并自动同步,且实现了Service的负载均衡功能。
其他-关于POD:
POD是一组紧耦合的容器组合。
-
一个POD内部的容器享有共同的生命周期:共同产生、调度和消亡。
-
共享存储系统
-
共享命名空间
Pause容器是POD中的根容器。POD的状态代表这组容器的状态。
POD里多个业务容器共享POD的IP和数据卷。
在POD中定义容器的时候可以为单个容器配置Volume,然后也可以为一个POD中的多个容器定义一个共享的POD级别的Volume。Kubernetes中的Volume与POD生命周期相同。当容器终止或停止时,Volume不会丢失。
Pod的重启策略应用于Pod内的所有容器。
POD使用场景:
-
数据同步服务
-
日志数据搜集
-
监控数据搜集
-
网络数据搜集
POD一共有四种状态:
-
Pending
-
Running
-
Failed
-
Unknown
Service,分布式架构集群的核心,微服务架构中“服务”的概念。
-
唯一指定的服务名称
-
虚拟IP和端口号
-
能够提供远程服务能力
-
被映射到能够服务的一组容器应用上
Volume,pod中多个容器共享的存储目录,与pod生命周期相同
Kubernetes内部通过2种探针,实现了对POD的健康检查:
-
LivenessProbe探针:判断容器是否存活(running)
-
ReadinessProbe探针: 用于判断容器是否启动完成(ready)
volume、network知道一些类型,有些了解 不在考试中体现
yaml的关键词填空 key
一个样例
apiversion: v1
kind: pod
metadata:
name: myweb
labels:
name: my web
spec:
containers:
- name: myweb
image: kubeguide/tomcat-app: v1 //对应镜像
ports:
- containerPort: 8080 //进程启动的端口
env: //环境变量设置
- name: MYSQL_SERVICE_HOST
value: 'mysql'
- name: MYSQL_SERVICE_PORT
value: '3306'
apiVersion: extensions/v1beta1
kind: ReplicaSet
metadata:
name: frontend
spec:
replicas: 3
selector:
matchLabels:
tier: frontend
template:
metadata:
labels:
app: guestbook
tier: frontend
spec:
定制Scheduler
apiVersion: v1
kind: Pod
metadata:
name: with-pod-affinity
spec:
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: security
operator: In
values:
- S1
topologyKey: failure-domain.beta.kubernetes.io/zone
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: security
operator: In
values:
- S2
topologyKey: kubernetes.io/hostname
containers:
-name: with-pod-affinity
image: gcr.io/google_containers/pause:2.0
HPA 得知道原理
HPA(Horizontal Pod Autoscaler)Pod横向自动扩容
HPA的默认指标:CPU
cpu使用率是考heapster组件来获取的
-
CNI、CNM、CRI、CSI 试卷中简称出现
-
网络方案 CNI与CNM的区别
-
CRI 容器运行时
-
CSI 容器存储接口
选择题,选CNM,不属于K8s接口。
Kubernetes中一个应用服务会有一个或多个实例(Pod),每个实例(Pod)的IP地址由网络插件动态随机分配(Pod重启后IP地址会改变)。为屏蔽这些后端实例的动态变化和对多实例的负载均衡,引入了Service这个资源对象。Service会分配一个Cluster IP的虚拟IP,全局不变。
2. Scheduler调度策略、扩展、亲和调度和定向调度;副本策略
定向调度和亲和调度
可能填yaml的key nodeSelector,定向调度,通过Label选择。
书中 代码和命令 几乎不考
2次PPT
3. k8s设计原则、network模式、常见存储模式
网络模式:
IP-per-Pod模型
- Flannel(overlay) 原生
- Calico 基于BGP三层交换
- Contiv Plugin
Kubernetes的IP-per-Pod模型和Docker原生的动态端口映射方式实现的多节点访问模式有什么区别呢?
区别是后者的动态端口映射会引入端口管理的复杂性,而且访问者看到的IP地址和端口与访问提供者实际绑定的不同,这会引起应用配置的复杂化,甚至服务注册和发现机制都将受到挑战。
总的来说,IP-per-Pod模型是一个简单的兼容性较好的模型。从该模型的网络的端口分配、域名解析、服务发现、负载均衡、应用配置和迁移等角度来看,Pod都能够被看作一台独立的“虚拟机”或“物理机”。
K8s namespace是多租户隔离主要手段,是对资源对象进行细分的类似DNS子域名的概念。
授权机制:ABAC模式,基于属性的访问控制;RABC模式,基于角色的访问控制
存储模式:
存储机制
声明式
PV(也是一种volume插件)、PVC(用户通过PVC申请存储资源)、StrorageClass(存储级别 提供不同PV属性、隐藏底层细节)
Frakti是kubernetes组织下面的一个官方shim项目。
-
cri-containerd:Google主导的shim项目,直接跳过docker对接containerd。
-
Crio:Redhat主导的shim项目,可以对接所有符合oci标准的runtime,例如runc和runv。
-
Dockershim:k8s默认的shim直接对接docker。
4. DevOps概念、Prometheus特点及微服务概念
DevOps概念 知道一些
DevOps(Development和Operations的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。
它是一种重视“软件开发人员(Dev)”和“IT运维技术人员(Ops)”之间沟通合作的文化、运动或惯例。透过自动化“软件交付”和“架构变更”的流程,来使得构建、测试、发布软件能够更加地快捷、频繁和可靠。
Prometheus特点
1. 多维度数据模型(由键/值对确定的时间序列数据模型)
2. 具有一个灵活的查询语言来利用这些维度(promQL)
3. 不依赖分布式存储;单个服务器节点工作。
4. 时间序列的采集是通过HTTP pull的形式,解决很多push架构的问题。
5. 通过中介网关支持短时间序列数据的收集
6. 监控目标是通过服务发现或静态配置
7. 多种数据展示面板支持,例如grafana
微服务概念
5. 常见监控工具、全链路监控原理
日志搜集
Kubernetes推荐采用 Fluentd+ ElasticSearch+ Kibana完成对日志的采集、查询和展现工作。
-
Fluentd 是一个免费,而且完全开源的日志管理工具,简化了日志的收集、处理、和存储,你可以不需要在维护编写特殊的日志处理脚本。Fluentd的性能已经在各领域得到了证明:目前最大的用户从5000+服务器收集日志,每天5TB的数据量,在高峰时间处理50,000条信息每秒
-
Elasticsearch 允许您以任何您想要的方式执行和组合许多类型的搜索 - 结构化,非结构化,地理位置,度量标准。
-
Kafka 是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因素。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。
监控工具 知道有哪些
-
Prometheus 是由 SoundCloud 开发的开源监控报警系统和时序列数据库(TSDB).自2012年起,许多公司及组织已经采用 Prometheus,并且该项目有着非常活跃的开发者和用户社区.现在已经成为一个独立的开源项目核,并且保持独立于任何公司,Prometheus 在2016加入 CNCF (Cloud Native Computing Foundation), 作为在 kubernetes 之后的第二个由基金会主持的项目。
-
cAdvisor:分析正在运行的容器的资源使用情况和性能特点。cAdvisor默认集成在k8s中。
-
Heapster:计算容器集群的资源使用分析和监控。Heapster是容器集群监控和性能分析工具,天然的支持Kubernetes和CoreOS。Heapster是一个收集者,将每个Node上的cAdvisor的数据进行汇总,然后导到第三方工具(如InfluxDB)。
-
influxdb:influxdb是目前比较流行的时间序列数据库。
-
grafana:为Graphite,InfluxDB&Prometheus&More提供漂亮的监视和度量分析和仪表板的工具。
APM是什么?
Application Performance Management 深入应用代码的性能监控
全链路监控原理
-
TraceID的生成机制
-
调用链的第一个节点生成TraceID
-
SpanID与ParentSpanId的生成机制
-
SpanID使用UUID随机数生成机制即可,保证唯一性,每次请求都有唯一的spanid
-
ParentSpanid使用上一个节点传递过来spanid替代
-
TraceID、spanid和parentSpanid的传递机制
-
Restful接口、webservice等服务调用,实际底层走的协议是HTTP协议,所以只需要在HTTP Request请求头中添加Traceid、SpanID,ParentSpanID
-
Dubbo等RPC调用框架,需要在扩展域添加Traceid、SpanID、ParentSpanID
-
MQ等消息中间件,需要在消息中间件支持的扩展域添加TraceID、SpanID、ParentSpanID
整理几道简答题:
1. 如何访问服务:
① 前端对服务的访问,由后端的Pod集群来提供
② 每个Pod都提供独立的EndPoint(Pod IP + Container Port),访问请求如何映射到具体的Pod?
-
开启负载均衡器kube-proxy,客户端通过负载均衡器调度到相应的pod
-
每个Service分配一个全局唯一的虚拟IP地址(Cluster IP)
-
Pod的Endpoint地址会随着pod的销毁和创新创建而改变,但是cluster ip在Service生命周期内不会改变,因此用servcie name和cluster ip作为DNS域名,就可以解决服务访问问题
2. Service & Kube-proxy 负载均衡原理
① 通过API创建一个Service,会涉及Controller Manager的Service Controller和Endpoint Controller两个控制器,该Service会分配到一个全局不变的Cluster IP虚拟IP,并将该映射存储在Etcd中。
② Node为每个Service proxy在本地节点打开一个随机选择的端口。kube-proxy决定哪个后台POD被选定。任何访问该端口的连接都将被代理到相应的某个后端应用。
③ kube-proxy安装iptables规则,这些规则用于捕获通过Cluster IP和Port访问Service的请求,并重定向这些请求到②中提及的随机端口。
2. 服务发现(一定要搞清服务发现怎么做的)重点
Kubernetes支持两种服务发现方式:容器环境变量、DNS。
Kubernetes创建Service后,会在每个容器中添加环境变量。
“{SVCNAME}_SERVICE_HOST”和“{SVCNAME}_SERVICE_PORT”。用户通过环境变量访问服务。但是使用环境变量,Service必须在Pod之前被创建出来。
DNS则没有这个限制,其通过提供全局的DNS服务器来完成服务的注册与发现。Kubernetes提供的DNS由以下三个组件组成。
-
etcd:DNS存储。
-
kube2sky:将Kubernetes Master中的Service(服务)注册到etcd。
-
skyDNS:提供DNS域名解析服务。
选择题:
1. 有状态服务
2. PV只能是网络存储,PV并不是定义在Pod上的,而是独立于Pod之外定义。
3. 容器编排三大阵营:Swarm、Mesos、Kubernetes。
4. execdriver默认实现是Docker官方的libcontainer
5. Docker网络库:libnetwork。
6. Kubernetes的Volume类型:emptyDir、hostPath……
7. PV访问属性:
ReadWriteOnce:读写权限,只能被单个Node挂载
ReadOnlyMany: 只读权限,允许多个Node挂载
ReadWriteMany:读写权限,允许多个Node挂载
8. DevOps的四个阶段:简单自动化、CI与静态Docker、增强与动态Docker、全面CI与自动化。
9. 常见微服务框架:Dubbo/DubboX、Spring Cloud、Linkerd、Istio、Motan、Thrift、GRPC、……
10. 第一代 service mesh 以 Linkerd 和 Envoy 为代表。这两个开源实现都是以Sidecar 为核心。第二代service mesh主要改进集中在更加强大的控制面功能(与之对应的 sidecar proxy 被称之为数据面),典型代表有 Istio 和 Conduit。
11. 服务注册中心:Consul、zooKeeper、etcd、Eureka(推荐)
12. 服务网关:Zuul、Kong、Nginx+lua。
13. 配置中心:Diamond、Disconf、Apollo、QConf、Spring Cloud Config。
14. 服务监控:zipkin、pinpoint、商业APM
填空题:
1. Cloud Foundry是VMware于推出的业界第一个开源PaaS云平台。
2. Docker三个基本元素:Containers、Images、Dockerfile。Docker的三个基本元素,解决了PaaS平台最根本的两个问题:一是封装、二是标准。
3. Docker使用客户机-服务器体系结构。 Docker客户端与Docker守护进程通信,Docker守护进程负责构建,运行和分发Docker容器。 Docker客户端和守护进程使用REST API通过UNIX套接字或网络接口进行通信。
4. Docker CNM 标准中网络模型由Sandbox、Endpoint、Network 三部分组成。
5. 删除虚悬镜像:docker rmi $(docker images -q -f dangling=true)
6. Dockerfile中只能有一个CMD指令。如果列出多个CMD,则只有最后一个CMD才会生效。也可以省略在这种情况下,必须指定一个 ENTRYPOINT 指令。
7. Kubernetes中资源进行配额限定的两个参数:Requests、Limits。
8. HPA的默认指标:CPU利用率。
9. Kubernetes设计原则:声明式 状态驱动、行动、观测。
10. Kubernetes namespace是多租户隔离主要手段,是对资源对象进行细分的类似DNS子域名的概念。