云原生面试
- Kubernetes
-
- 原理
-
- [Kubernetes 如何保证集群的安全性。](#Kubernetes 如何保证集群的安全性。)
- [简述 Kubernetes 准入机制](#简述 Kubernetes 准入机制)
- [简述Kubernetes Secret 有哪些使用方式](#简述Kubernetes Secret 有哪些使用方式)
- [简述Kubernetes PodSecurityPolicy机制](#简述Kubernetes PodSecurityPolicy机制)
- [简述Kubernetes PodSecurityPolicy机制能实现哪些安全策略](#简述Kubernetes PodSecurityPolicy机制能实现哪些安全策略)
- [简述Kubernetes 网络策略原理](#简述Kubernetes 网络策略原理)
- [简述Kubernetes 数据持久化的方式有哪些](#简述Kubernetes 数据持久化的方式有哪些)
- [ipvs 和 iptables的区别](#ipvs 和 iptables的区别)
- [简述 Helm 及其优势](#简述 Helm 及其优势)
- [什么是 Google 容器引擎](#什么是 Google 容器引擎)
- 简述kube-proxy的三种工作模式和原理
- 指针探测失败的可能原因
- Pod启动失败的原因
- Pod异常崩溃,如何排查原因
- [Docker 的网络通信模式](#Docker 的网络通信模式)
- [Kubernetes 最佳安全实践](#Kubernetes 最佳安全实践)
- Ingress
- [Ingress-controller 工作原理](#Ingress-controller 工作原理)
- 应用架构(可用性、扩展性、性能、安全、成本)
- 组件
- 计算、数据库、云安全、运维
- 网络
- 存储
- 监控
-
- IaaS层基础资源监控、中间件监控及升级
- 应用级故障分析、应用告警管理、指标阈值告警
-
- 日志监控分析
- 接口性能监控、调用链监控
-
- SkyWalking
- [Jaeger + Kali](#Jaeger + Kali)
- Deepflow
- 成本监控
Kubernetes
原理
Kubernetes 如何保证集群的安全性。
- 基础设施方面: 基于容器技术与宿主机的隔离
- 权限方面:
- 最小权限原则: 合理限制所有组件的权限,确保组件只执行它被授权行为,通过限制单个组件的能力来限制它的权限范围。
- 用户权限: 划分普通用户和管理员的角色
- 集群方面:
- API Server的认证授权: Kubernetes集群中所有资源的访问和变更都是通过Kubernetes API Server 来实现的,因此需要建议采用更安全的HTTPS或Token来识别和认证客户端身份(Authentication),以及随后访问权限的授权(Authorization)环节。
- API Server 的授权管理: 通过授权策略来决定一个API调用是否合法。对合法用户进行授权并且随后在用户访问时进行鉴权,建议采用更安全的RBAC方式来提升集群安全授权。
- 敏感数据引入Secret机制: 对于集群敏感数据建议使用Secret方式进行保护。
- AdmissionControl(准入机制): 对Kubernetes api的请求过程中,顺序为:先经过认证 & 授权,然后执行准入操作,最后对目标对象进行操作。
简述 Kubernetes 准入机制
在对集群进行请求时,每个准入控制代码都按照一定顺序执行。如果有一个准入控制拒绝了此次请求,那么整个请求的结果将会立即返回,并提示用户相应的error信息。
准入控制(AdmissionControl)准入控制本质上为一段准入代码,在对Kubernetes api 的请求过程中,顺序为:先经过认证 & 授权,然后执行准入操作,最后对目标对象进行操作。常用组件如下:
- AlwaysAdmit: 允许所有请求
- AlwaysDeny: 禁止所有请求,多用于测试环境。
- ServiceAccount: 它将ServiceAccount 实现了自动化,它会辅助ServiceAccount做一些事情,比如如果Pod没有ServiceAccount属性,它会自动添加一个default,并确保Pod的ServiceAccount始终存在。
- LimitRanger: 观察所有的请求,确保没有违法已经定义好的约束条件,这些条件定义在namespace中LimitRange对象中。
- NamespaceExists: 观察所有请求,如果请求尝试创建一个不存在的namespace,则这个请求被拒绝。
简述Kubernetes Secret 有哪些使用方式
- 在创建Pod时,通过为Pod指定ServiceAccount来自动使用该Secret。
- 通过挂载该Secret到Pod来使用它。
- 在Docker镜像下载时使用,通过指定Pod的spec.ImagePullSecrets来使用它。
简述Kubernetes PodSecurityPolicy机制
Kubernetes PodSecurityPolicy是为了更精细地控制Pod对资源的使用方式以及提升安全策略。在开启PodSecurityPolicy准入控制器后,Kubernetes默认不允许创建任何Pod,需要创建PodSecurityPolicy策略和相应的RBAC授权策略(Authorizing Policies),Pod才能创建成功。
简述Kubernetes PodSecurityPolicy机制能实现哪些安全策略
在PodSecurityPolicy对象中可以设置不同字段来控制Pod运行时的各种安全策略,常见的有:
- 特权模式:privileged是否允许Pod以特权模式运行。
- 宿主机资源:控制Pod对宿主机资源的控制,如hostPID:是否允许Pod共享宿主机的进程空间。
- 用户和组:设置运行容器的用户ID(范围)或组(范围)。
- 提升权限:AllowPrivilegeEscalation: 设置容器内的子进程是否可以提升权限,通常在设置非root用户(MustRunAsNonRoot)时进行设置。
- SELinux:进行SELinux的相关配置。
简述Kubernetes 网络策略原理
Network Policy的工作原理主要为:policy controller 需要实现一个API Listener,监听用户设置的Network Policy定义,并将网络访问规则通过各Node Agent进行实际设置(Agent则需要通过CNI网络插件实现)。
简述Kubernetes 数据持久化的方式有哪些
- EmptyDir(空目录): 没有指定要挂载宿主机上的某个目录,直接由Pod内部映射到宿主机上。类似于docker中的manager volume。
- 只需要临时将数据保存在磁盘上,比如在合并/排序算法中。
- 作为两个容器的共享存储。
- 同个Pod里面的不同容器,共享同一个持久化目录,当Pod节点删除时,volume的数据也会被删除。
- emptyDir的数据持久化的生命周期和使用的Pod一致,一般是作为临时存储使用。
- Hostpath: 将宿主机上已存在的目录或文件挂载到容器内部。类似于docker 中的bind mount 挂载方式。
- 增加了pod与节点之间的耦合。
- PersistentVolume(简称PV): 如基于NFS服务的PV。
ipvs 和 iptables的区别
iptables和ipvs都是基于Netfilter实现的,iptables是为防火墙而设计的;ipvs是为高性能负载设计的,并且使用更高效的数据结构(Hash表),允许几乎无限的规模扩张。
- 为大型集群提供了更好的可扩展性和性能
- 支持比iptables更复杂的负载均衡算法(最小负载、最少链接、加权等)
- 支持服务器健康检查和连接重试等功能。
- 可以动态修改ipset的集合,即使iptables的规则正在使用这个集合。
简述 Helm 及其优势
Helm 是 Kubernetes 的软件包管理工具。Helm 能够将一组K8S资源打包统一管理,是查找、共享和使用为Kubernetes构建的软件的最佳方式。
Helm 中通常每个包称为一个Chart,一个Chart是一个目录(一般情况下会将目录进行打包压缩,形成name-version.tgz格式的单一文件,方便传输和存储)。
- 统一管理、配置和更新这些分散的K8S的应用资源文件
- 分发和复用一套应用模板
- 将应用的一系列资源当做一个软件包管理
- 对于使用者而言,使用Helm后不用需要编写复杂的应用部署文件,可以以简单的方式在Kubernetes上查找、安装、升级、回滚、卸载应用程序。
什么是 Google 容器引擎
GKE: Google Container Engine 是Docker容器和集群的开源管理平台。这个基于 Kubernetes 的引擎仅支持在Google的公共云服务中运行。
简述kube-proxy的三种工作模式和原理
- userspace 模式
- 该模式下 kube-proxy 会为每一个Service创建一个监听端口。发向Cluster IP的请求被Iptables规则重定向到kube-proxy监听的端口上,kube-proxy根据LB算法选择一个提供服务的Pod并和其建立链接,以将请求转发到Pod上。
- 该模式下,kube-proxy 充当了一个四层 Load balancer 的角色。由于 kube-proxy 运行在 userspace 中,在进行转发处理时会增加两次内核和用户空间之间的数据拷贝,效率较两外两种模式低一些。好处是当后端的Pod不可用时,kube-proxy 可以重试其他Pod。
- iptables 模式
- 为了避免增加内核和用户空间的数据拷贝操作,提高转发效率,kube-proxy 提供了 iptables 模式。在该模式下,kube-proxy 为 service 后端的每个Pod创建对应的 iptables 规则,直接将发送 Cluster IP 的请求重定向到下一个Pod IP。
- 该模式下 kube-proxy 不承担四层代理的角色,只负责创建 iptables 规则。该模式的优点是较 userspace 模式效率更高,但不能提供灵活的LB策略,当后端Pod不可用时也无法进行重试。
- ipvs模式
- 该模式和 iptables 类似,kube-proxy 监控Pod的变化并创建相应的ipvs rules。ipvs也是在kernel模式下通过netfilter实现的,但采用了hash table 来存储规则,因此在规则较多的情况下,ipvs 相对 iptables 转发效率更高。除此之外,ipvs支持更多的LB算法。如果要设置 kube-proxy 为ipvs模式,必须在操作系统中安装ipvs内核模块。
指针探测失败的可能原因
- 容器未成功启动(如服务无法正常启动运行)
- 执行命令失败(如用于检测的exec、http get等本身就不能执行成功)
- docker、docker-shim、containerd存在故障
- 宿主机node到容器ip的网络不通(因为http和tcp都是kubelet自node节点发起的,向容器的ip进行探测)
Pod启动失败的原因
- K8S集群资源不足。一般kubectl get pods 会发现Pod处于Pending状态,kubectl describe pod 会发现 0/n 个节点可用,kubectl describe node k8snode1 会发现节点可分配的资源不足。
- 排查K8S组件(apiserver、dns)日志
- 排查网络插件日志
Pod异常崩溃,如何排查原因
- kubectl describe pod xxx ,可以查看到上次Pod终止的原因(比如 OOM killed)
- kubectl logs --previed,可以查看上次Pod终止前容器最后输出的日志。
Docker 的网络通信模式
- host 模式: 和宿主机共用一个 Network Namespace。容器将不会虚拟出自己的网卡和IP,而是直接使用宿主机的IP和端口。
- container 模式: 指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。
- none 模式: 告诉 docker 将新容器放到自己的网络堆栈中,但是不需要配置它的网络。
- bridge 模式: 是 docker 默认的网络设置,此模式会为每一个容器分配 Network Namespace、设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上。
Kubernetes 最佳安全实践
- 定期对环境应用安全更新。
- 严格限制访问ETCD。
- 记录生产环境的所有内容。
- 使用网络隔离。
- 为资源定义严格的策略/规则。
- 实现持续的安全漏洞扫描。
- 开启审计功能。
- 提供对K8S节点的有限直接访问。
- 设置资源限额。
- 仅使用已认证仓库的镜像。
Ingress
-
Service是基于四层TCP和UDP协议转发
-
Ingress可以基于七层HTTP和HTTPS协议转发,可以通过域名和路径做到更细粒度的划分
-
Ingress 是 Kubernetes 中的一种资源对象,用来管理集群外部访问集群内部服务的方式
- 可以通过 Ingress 资源来配置不同的转发规则,从而达到根据不同的规则设置访问集群内不同的 Service 所对应的后端 Pod
- Ingress 通过http或https暴露集群内部Service,给Service提供外部URL、负载均衡、SSL/TLS能力以及基于host的反向代理。
-
Ingress-controller 是具体实现反向代理及负载均衡的程序,对 ingress 定义的规则进行解析,根据配置的规则来实现转发
- Ingress-controller 并不是 Kubernetes 自带的组件,用户可以选择不同的ingress-controller实现,比如 Kubernetes 官方维护的 NGINX Ingress Controller、华为云CCE使用华为云ELB实现Ingress的七层负载均衡。
Ingress-controller 工作原理
当用户创建更新 Ingress 资源后,Ingress-controller 就会根据其中定义的转发规则刷新 LoadBalancer 配置文件(如:nginx.conf,或者华为云ELB配置)。在外部流量访问集群时,由 LoadBalancer 组件根据转发规则将其转发至对应的各个工作负载。
Ingress-controller 以Pod的形式运行在 K8S 集群中,里面包含两个进程,一个是 ingress controller(daemon程序),另一个是负责转发的反向代理程序(如nginx)。
当外部请求到达 ingress controller 的时候,ingress controller 会根据 Ingress的路由规则查找对应的Service,进而通过Endpoint查询到Pod的IP地址,然后由反向代理程序nginx将请求转发到后端Pod。
应用架构(可用性、扩展性、性能、安全、成本)
组件
计算、数据库、云安全、运维
网络
WireGuard
WireGuard:是一款可以组建虚拟私人局域网(VPN)的软件,允许用户通过公共网络(如互联网)安全地传输数据,同时保持数据的机密性和完整性。
- https://blog.csdn.net/hzf0701/article/details/134433969
- https://github.com/orgs/WireGuard/repositories
- https://zhuanlan.zhihu.com/p/108365587
WireGuard 是一个易于配置、快速且安全的开源 VPN,它利用了最新的加密技术。目的是提供一种更快、更简单、更精简的通用 VPN,它可以轻松地在树莓派这类低端设备到高端服务器上部署。
WireGuard 最初是为 Linux 开发的,但现在可用于 Windows、macOS、BSD、iOS 和 Android。它仍在活跃开发中。
Tailscale
基于 WireGuard 异地组建虚拟局域网
- https://zhuanlan.zhihu.com/p/481100424
- https://blog.csdn.net/github_36665118/article/details/128733646
- https://blog.csdn.net/weixin_45508265/article/details/135361374
MetalLB
为自建的kubernetes裸机集群提供LoadBalancer服务。
- https://cloud.tencent.com/developer/article/2146391
- https://zhuanlan.zhihu.com/p/617807098
- https://blog.51cto.com/zhangxueliang/5746562