1 k8s基础
1.1 什么是Kubernetes?
k8s是开源容器管理工具,负责容器部署/扩缩容和负载均衡。
1.2 Kubernetes与Docker有什么关系?
docker提供容器生命周期管理,镜像构建运行时容器;
容器通过k8s通信。
1.3 在主机和容器上部署应用程序有什么区别?
主机部署时各应用共享操作系统以及各种库。应用之间不相互隔离。
容器部署时除了内核共享,容器内的应用各自隔离,各自有运行自己应用的不同的库。
1.4 什么是Container Orchestration?
Orchestration实际是容器编排,支持容器的部署和组织。
没有容器编排就无法进行通信,各个容器中所有服务协同工作满足单个服务器需求,
1.5 Container Orchestration需要什么?
容器之间通信需要容器编排。
1.6 Kubernetes有什么特点?
移植/扩展/自动化部署
可移植:支持公有云,私有云
可扩展: 模块化
自动化:自动部署,扩缩容
快速部署应用
1.7 对Kubernetes的集群了解多少?
k8s可以实施状态管理,提供特定配置的集群服务。
部署文件被提供给api,集群服务决定如何安排pod并正确运行pod的数量。
1.8 什么是Google容器引擎?
是Docker容器和集群的开源管理平台。
1.9 什么是Heapster?
heapster负责收集每个节点的数据,并作为pod运行。
它发现集群所有节点,通过k8s代理查询集群中k8s节点使用信息。
1.10 什么是Minikube?
在虚拟机中运行单结点k8s集群。
1.11 什么是Kubectl?
kubectl可以将命令传递给集群,创建和管理k8s组件。
1.12 什么是Kubelet?
在每个节点上运行,管理pod和容器,定期向api server注册节点自身信息,汇报
节点资源使用情况。
1.13 对Kubernetes的一个节点有什么了解?
k8s由master node和worker node组成。
master node是控制节点,对集群调度管理,包含api server,scheduler, cluster state store和 controller manager;
worker node:真正的工作节点,运行容器,包含kubelet, kube-proxy, container runtime
1.14 kubernetes中各种port关系是什么?kube-proxy的实现原理是什么?
containerPort:在容器上,被pod绑定;
nodePort:在节点上,负责集群外部通信,NodeIP:NodePort
targetPort:在pod上,服务需要转发到到后端Pod的端口号;负责与kube-proxy代理的port和NodePort数据通信。
port: 在service上,服务监听的端口号,负责处理集群内部通信,cluserIP:port
整个过程:
从port或者nodePort上的数据经过kube-proxy流入到后端pod的targetPort上进入容器,之后访问容器的
containerPort
处理流程如下:
port(service上)->targetPort(pod上)->containerPort(容器上)
NodePort(节点上)->targetPort(pod上)->containerPort(容器上)
总结:
port和NodePort都是service的端口,port用于集群内部访问,nodePort用于集群外部访问
从这两个端口来的数据都要经过kube-proxy(service的具体实现)流入后端的targetPort。
从而到达pod里面的容器。
2)kube-proxy实现原理
kube-proxy在本地node上创建iptables规则。它配置DNAT规则
(Destination Network Address Translation,目的地址转换)
从容器出来的访问,从本地主机出来的访问,将到服务地址的访问映射到本地的
kube-proxy端口(随机端口),然后kube-proxy会监听在本地对应端口,
将到这个端口的访问给传到真实的pod地址。
1.15 k8s的服务发现机制?
DNS:
通过cluster add-on方式创建kubedns对集群内的service进行服务发现。
dns是基于udp的,建立在四层协议之上。
1.16 pod中容器共享哪些资源?
pid命名空间: 不同应用可以看到其他应用的进程id
网络命名空间: 多个容器可以访问同一个ip和端口
IPC命名空间: 可以使用POSIX消息队列进行通信
UTS命名空间: 多个容器共享一个主机名
Volumes: 共享存储卷
1.17 6个CNI常用插件是什么?
CNI是容器网络接口(Container Network Interface),
是Linux容器网络配置的标准库。
有Bridge/MACvlan/IPvlan/PTP/Loopback/3rd-Party
1.18 IDC是什么?七层负载均衡的原理是什么?
1) IDC(网络数据中心Internet Data Center),即数据中心、机房,
放置服务器。IDC网络是服务器间通信的桥梁。
IDC架构如下
公网
自建BGP平台
外网核心路由器(Router) 外网核心路由器(Router)
MGW NAT MGW NAT <== 四层负载均衡/内外网边界
内网核心交换机(Core) 内网核心交换机(Core)
内网接入交换(TOR) 内网接入交换机(TOR) <== 40G光纤
服务器 服务器 服务器 服务器 <== 双万兆Bonding
内网接入交换机:
TOR,即top of rack,是服务器接入网络的设备。每台交换机连接40~48台服务器,使用一个掩码
为/24的网段作为服务器内网网段。
内网核心交换机: 负责数据中内各内网接入交换机的流量转发以及跨IDC流量转发。
MGW/NAT: MGW用LVS做负载均衡, NAT用内网设备访问外网时做地址转换
外网核心路由器: 通过静态互联运营商统一外网平台
2)
二层负载均衡: MAC地址负载均衡
三层负载均衡: IP的负载均衡
四层负载均衡: 基于IP+端口的负载均衡
七层负载均衡: 基于URL等应用层信息的负载均衡。
NodePory绑定主机某个端口,进行pod请求转发和负载均衡。
通过ingress,基于7层的方案,根据域名后的service ip转发。
nginx解决这个问题。
1.19 k8s网络模型原则是什么?各种ip的含义是什么?
1)IP-per-Pod模型:每个pod有独立的ip。同一pod内所有容器共享一个网络堆栈。
2)
proxy-ip: 公网ip,外部访问应用的网关服务器
service-ip:service的虚拟ip,外部无法寻址到
node-ip:结点ip
container-bridge-ip: 容器网桥(docker0)IP
pod-ip:pod的ip
container-ip:容器的ip
1.20 k8s创建一个pod的详细流程,涉及的组件怎么通信的?
通过api-server或者kubectl提交创建pod请求->
api-server接受到请求将pod信息存储到etcd->
kube-scheduler通过api-server监测到有未绑定的pod,通过预选策略遍历所有结点选择候选结点,
对候选结点打分,选择出得分最高的节点,进行pod绑定操作,并将结果存储到etcd->
目标结点的kubelet通过api-server监测到kube-scheduler产生的pod绑定事件,从etcd
中获取pod清单,下载镜像并启动容器。
1.21 flannel和ovs网络的区别是设么?
区别在于配置是否自动化和是否支持隔离。
1) 配置是否自动化
flannel支持建立覆盖网络实现pod和pod之间通信,flannel感知k8s中service对象,动态
维护自己路由表,通过etcd对docker0网段规范;
ovs是开源交换机软件,支持网络隧道,上述操作需手动完成,集群中N各节点
,需要建立N(N-1)/2个Vxlan或者gre链接。
2) 是否支持隔离
flannel不能支持多租户隔离,
ovs有单独住模式和多租户模式。
单租户模式:使用openvswitch + vxlan将pod网络组成大二层,所有pod可以通信;
多租户模式通过namespace分配虚拟网络,形成网络独立用户,一个namespace中
的pod无法访问其他namespace中的pod和svc对象。
1.22 k8s 中服务级别,怎样设置服务的级别才是最高的?
k8s的qos包含BestEffort, Burstable, Guaranteed
BestEffort: 什么都不设置
Burstable: pod中的容器至少一个设置了cpu或者memory的请求
Guaranteed: pod中所有容器必须设置cpu和memory,并且request和limit值相等。
1.23 容器隔离不彻底,Memory 和 CPU 隔离不彻底,怎么处理解决这个问题?
docker是通过cgroups进行资源限制的。
1.24 kubelet 监控 Node 节点资源使用是通过什么组件来实现的?
是通过cAdvisor实现的。实现原理是:kubelet启动时,自动启动
cAdvisior服务,会采集所在节点性能指标和节点运行的容器性能指标。
1.25
2 k8s架构基础
2.1 Kubernetes Architecture的不同组件有哪些?
组件有主节点和工作节点。
主节点包含: api server,controller manager, scheduler, etcd
工作节点包含: kubelet, kube-proxy
kubectl: 命令行工具,操作入口
kube-apiserver: 以rest api行驶提供接口
kube-controller-manager: 执行系统后台任务,包括pod个数,pods和service关联,节点状态状况等。
kube-scheduler: 负责节点资源管理,接受apiserver创建pods任务,并分配到某个节点。
etcd: 分布式键值对存储数据库,保存k8s集群配置数据和资源对象信息。
kube-proxy:运行在每个节点上,创建服务时给服务分配虚拟ip,客户访问虚拟ip来访问服务,服务请求转发到后端pod上。
kubelet: 运行在每个结点上,处理master节点下发到本节点的任务,管理pod和容器,向api server注册并汇报节点信息。
DNS: 为每个service创建dns记录,pod可以通过dns访问服务。
kubectl
scheduler apiserver controller-manager
============Master========================
kubelet kube-proxy
Docker Engine
============Worker Node===================
2.2 对Kube-proxy有什么了解?
请求转发和负载均衡。也就是service服务请求转发到pod,并进行负载均衡。
原理是:
1)每个node上运行一个kube-proxy进程,该进程是service的代理兼负载均衡器。
将某个service的访问请求转发到后端对应的多个pod实例中的某一个上。
2)会在node上建立SocketServer负责接收请求,默认用round robin负载均衡来转发到某个pod。
2.3 能否介绍一下kubernetes中主节点的工作情况?
k8s中的主节点是集群控制节点,负责集群管理和控制。
包含: apiserver,controller-manager,scheduler,etcd。
apiserver: rest接口,资源增删改查入口
controller-manager:所有资源对象的控制中心
scheduler:负责资源调度,例如pod调度
etcd: 保存资源对象数据
2.4 kube-apiserver和kube-scheduler的作用是什么?
kube-apiserver: rest接口,增删改查接口,集群内模块通信
kube-scheduler: 将待调度的pod按照调度算法绑定到合适的pod,并将绑定信息写入etcd。
2.5 介绍一下Kubernetes控制管理器吗?
是集群内部的控制中心,负责node,pod,namespace等管理,控制管理器负责管理这些
控制器,每个控制器通过api server监控资源对象状态,将现有状态修正到期望状态。
2.6 什么是ETCD?
etcd是go语言编写的分布式键值存储数据库,保存k8s集群配置数据和资源对象信息。
2.7 对Kubernetes的负载均衡器有什么了解?
内部负载均衡器和外部负载均衡器。
内部负载均衡器: 自动平衡负载并使用所虚配置分配容器
外部负载均衡器: 将流量从外部负载引导至后端。
2.8 什么是Ingress的?
ingress作用: 将不同url请求转发到不同的service,实现http层的业务路由机制。
ingress网络: 是一组规则,充当kubernetes集群的入口点。也是提供给外部客户访问的。
之前总结过k8s集群外部访问可以通过: nodePort,ingress方式。
ingress组成: ingress策略定义和具体的ingress controller。
ingress controller:将基于ingress规则将客户端请求直接转发到service对应的后端endpoint(即pod)上,
会跳过kube-proxy转发。
会以pod形式运行,监控apiserver的/ingress接口后端的backend services。
例子:
http://myweb.com/api的访问将被路由到后端为api的service
http://myweb.com/doc的访问将被路由到后端为doc的service
例如:
[root@node-1 ~]# kubectl get pods -n kube-system -o wide|grep ingress
ingress-api-wl2sp 1/1 Running 18 14d 10.10.1.4 node-1
ingress样例
[root@node-1 ~]# kubectl get ingress -n openstack
NAME HOSTS ADDRESS PORTS AGE
aodh aodh,aodh.openstack,aodh.openstack.svc.cluster.local 10.10.1.4 80 14d
ceilometer ceilometer,ceilometer.openstack,ceilometer.openstack.svc.cluster.local 10.10.1.4 80 14d
查看ceilometer的ingress样例
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
ingress.kubernetes.io/rewrite-target: /
kubernetes.io/ingress.class: nginx
name: ceilometer
namespace: openstack
selfLink: /apis/extensions/v1beta1/namespaces/openstack/ingresses/ceilometer
spec:
rules:
- host: ceilometer
http:
paths:
- backend:
serviceName: ceilometer-api
servicePort: ce-api
path: /
- host: ceilometer.openstack
http:
paths:
- backend:
serviceName: ceilometer-api
servicePort: ce-api
path: /
- host: ceilometer.openstack.svc.cluster.local
http:
paths:
- backend:
serviceName: ceilometer-api
servicePort: ce-api
path: /
status:
loadBalancer:
ingress:
- ip: 10.10.1.4
- ip: 10.10.1.5
- ip: 10.10.1.6
分析:
host字段: 表示目标url,具体拼接的url规则为:
http://
这里对应了3个,分别是:
http://ceilometer/
http://ceilometer.opensatck/
http://ceilometer.openstack.svc.cluster.local/
对上面3个的访问将会被转发到service上:
ceilometer-api:ce-api
验证ingress配置是否生效:
登录ingress的pod,查看nginx.cof配置文件内容,应该有
server_name ceilometer; # Ingress中定义的虚拟host名
server_name ceilometer.openstack;
server_name ceilometer.openstack.svc.cluster.local;
location / { # Ingress中定义的路径 /
proxy_pass http://ceilometer--api # service名
}
2.9 什么是Ingress网络,它是如何工作的?
参见flannel网络结构示意图。
===CoreOS Machine ===CoreOS Machine
Pod1 Pod2 Pod1 Pod2
容器1,容器2 容器1,容器2 容器1,容器2 容器1,容器2
veth0 veth1 veth0 veth1
10.1.15.2/24 10.1.15.3/24 10.1.20.2/24 10.1.20.3/24
docker0 docker0
10.1.15.1/24 10.1.20.1/24
flannel0 flannel0
10.1.15.0/16 10.1.20.0/16
flanneld flanneld
eth0 eth0
192.168.0.100 192.168.0.200
========== packet =========
MAC OuterIP UDP InnerIP Payload
source:192/168.0.100 source:10.1.15.2
dest: 10.1.20.3
原理:
1)Flannel创建了一个名为flannel0地网桥,这个网桥地一端连接docker0网桥,另一端
连接一个去叫作flanneld的服务进程。
2) flanneld进程连接etcd,利用etcd来管理可分配的IP地址段资源,
同时监控etcd中每个pod的实际地址,并在内存中建立了一个Pod节点路由表;
3) 然后下连docker0和物理网络,使用内存中的Pod节点路由表,将docker0发给它
的数据包包装起来,利用物理网络的连接将数据包投递到目标flanneld上,从而
完成Pod到Pod之间的直接的地址通信。
2.10 对云控制器管理器有何了解?
云控制管理器负责持久存储,网络路由,管理与底层云服务的通信。
分成几个不同的容器,例如:
Node Controller: 它检查和确认节点停止后,节点是否被正确删除
RouteController: 路由控制器管理底层云基础设置的路由。
2.11 什么是 Container 资源监控?
对容器占用的cpu,内存等资源进行监控,监控工具包括:
cAdvisor,Prometheus等。
2.12 Replica Set 和 Replication Controller 之间有什么区别?
两者都是pod运行指定数量的pod副本。
replica set是基于集合的选择器,replication controller是基于权限的选择器。
equity-based选择器:按照标签键值对进行过滤,假设标签为app=nginx,那么只能寻找标签为nginx的那些pod。
selector-based选择器: 允许根据一组值过滤键,假设标签键是nginx,apache,那么只能寻找标签为nginx的那些pod。只要
标签为apache或者nginx,都符合要求。
2.13 什么是 Headless Service?
headless service类似普通服务,但没有集群ip,可以直接访问pod而
无需通过代理访问。
2.14 kubernetes可以采取哪些安全错误
1)限制对etcd的访问
2)提供直连k8s结点的有限访问
3)定义资源配额
2.15 什么是集群联邦?
将多个k8s集群作为单个集群管理。
使用联邦来控制管理它们。
3 k8s应用场景
3.1 如何看待公司从单一服务转向微服务并部署其服务容器?
迁移服务到k8s平台,可以先迁移一部分服务,一旦运行顺利,可以将其余应用也迁移到k8s平台。
3.2 拥有分布式系统的跨国公司,拥有大量数据中心,虚拟机和许多从事各种任务的员工。
您认为这样的公司如何以 Kubernetes 一致的方式管理所有任务?
用k8s来定制调度架构并支持多种容器。
3.3 公司希望通过维持最低成本来提高其效率和技术运营速度。您认为公司将如何实现这一目标?
实施CI/CD,处理云环境,在集群上安排容器。缩短部署时间。
3.4 想要修改公司的部署方法,并希望建立一个更具可扩展性和响应性的平台
私有数据中心转移到云环境,实现微服务架构,使用容器。
3.5 非常分散的系统的跨国公司,期待解决整体代码库问题
将单片代码库转移到微服务设计,容器在k8s下部署协调。
3.6 从单片到微服务的转变解决了开发方面的问题,但却增加了部署方面的问题。公司如何解决部署方面的问题?
使用容器编排平台k8s。
3.7 公司希望通过采用新技术来优化其工作负载的分陪
k8s是容器编排工具,可以实现资源分配。
3.8 拼车公司希望通过同时扩展其平台来增加服务器数量。您认为公司如何处理服务器及其安装?
使用k8s进行编排,服务和运行的硬件之间存在抽象。
3.9 公司希望向具有各种环境的客户提供所有必需的分发。您认为他们如何以动态的方式实现这一关键目标?
使用k8s构建web应用程序。
3.10 公司希望在不同的云基础架构上运行各种工作负载,从裸机到公共云。公司将如何在不同界面的存在下实现这一目标?
将基础设置分解为微服务,采用k8s,在不同的云基础架构上运行各种工作负载。
3.11 Google 号称可以支撑5000个节点,在调度这方面是有做了哪些优化呢?
3.12 集群扩广遇到的挑战是什么?
部署规范流程: 每个pod设置资源限额和健康监测探针
调度均衡问题: 同一个节点可能运行很多pod,出现资源争用,需要均衡结点调度。
4 多项选择问题
4.1 什么是 Kubernetes 集群中的 minions?
minions:下属的意思,实际就是工作结点。
4.2 Kubernetes 集群数据存储在以下哪个位置?
ETCD
4.3 哪个是 Kubernetes 控制器?
ReplicaSet,Deployment
4.4 哪个是核心 Kubernetes 对象?
pods,services,volumes
4.5 Kubernetes Network 代理在哪个节点上运行?
运行在所有结点。
4.6 节点控制器的职责是什么?
将CIDR块分配给节点,维护节点列表,监视节点运行状况
4.7 Replication Controller 的职责是什么?
使用单个命令更新或删除多个 Pod, 有助于达到理想状态,
如果现有 Pod 崩溃,则创建新 Pod
4.8 如何在没有选择器的情况下定义服务?
指定外部名称
4.9 1.8 版本的 Kubernetes 引入了什么?
Taints and Tolerations
4.10 Kubelet 调用的处理检查容器的 IP 地址是否打开的程序是?
TCPSocketAction
因为:
HTTPGetAction:通过容器IP地址,端口号,路径调用HTTP Get方法
TcpSocketAction:通过容器的IP地址和端口号执行TCP检查,若端口能被访问,则健康
ExecAction: 在容器内部执行命令,退出码为0表示健康
5 其他
5.1 docker runc 漏洞是怎么修复的?
攻击者可以通过特定的容器进项或者exec操作获取宿主机的runc执行时文件句柄,
并修改掉runc的二进制文件,从而获取所在宿主机的root执行权限。
附:
查看aodh的ingress样例:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
ingress.kubernetes.io/rewrite-target: /
kubernetes.io/ingress.class: nginx
creationTimestamp: 2019-09-23T06:32:43Z
generation: 1
name: aodh
namespace: openstack
resourceVersion: "3707"
selfLink: /apis/extensions/v1beta1/namespaces/openstack/ingresses/aodh
uid: f2fbd18d-ddcb-11e9-b771-f8bc124e43a0
spec:
rules:
- host: aodh
http:
paths:
- backend:
serviceName: aodh-api
servicePort: aodh-api
path: /
- host: aodh.openstack
http:
paths:
- backend:
serviceName: aodh-api
servicePort: aodh-api
path: /
- host: aodh.openstack.svc.cluster.local
http:
paths:
- backend:
serviceName: aodh-api
servicePort: aodh-api
path: /
status:
loadBalancer:
ingress:
- ip: 10.10.1.4
- ip: 10.10.1.5
- ip: 10.10.1.6
参考:
kubernetes权威指南: 从docker到kubernetes实践纪念版
https://blog.csdn.net/easylife206/article/details/97723598
https://blog.csdn.net/huakai_sun/article/details/82378856
https://www.jianshu.com/p/2de643caefc1
https://blog.csdn.net/weixin_33797791/article/details/89548610
https://www.alibabacloud.com/zh/knowledge/what-is-containerization
https://blog.csdn.net/huangleijay/article/details/83040161
https://blog.csdn.net/xinghun_4/article/details/50492041