云原生面试

云原生面试

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)的软件,允许用户通过公共网络(如互联网)安全地传输数据,同时保持数据的机密性和完整性。

WireGuard 是一个易于配置、快速且安全的开源 VPN,它利用了最新的加密技术。目的是提供一种更快、更简单、更精简的通用 VPN,它可以轻松地在树莓派这类低端设备到高端服务器上部署。

WireGuard 最初是为 Linux 开发的,但现在可用于 Windows、macOS、BSD、iOS 和 Android。它仍在活跃开发中。

Tailscale

基于 WireGuard 异地组建虚拟局域网

MetalLB

为自建的kubernetes裸机集群提供LoadBalancer服务。

存储

Etcd

Kubernetes&&etcd

OpenEBS

Kubernetes&&OpenEBS

Ceph

k8s 基于cepf实现数据持久化

NFS

监控

IaaS层基础资源监控、中间件监控及升级

Prometheus

网络

应用级故障分析、应用告警管理、指标阈值告警

日志监控分析

EFK

Loki

接口性能监控、调用链监控

SkyWalking

Jaeger + Kali

Deepflow

成本监控

相关推荐
Code_Artist42 分钟前
使用Portainer来管理并编排Docker容器
docker·云原生·容器
陪学1 小时前
百度遭初创企业指控抄袭,维权还是碰瓷?
人工智能·百度·面试·职场和发展·产品运营
大数据编程之光3 小时前
Flink Standalone集群模式安装部署全攻略
java·大数据·开发语言·面试·flink
ifanatic5 小时前
[面试]-golang基础面试题总结
面试·职场和发展·golang
梅见十柒5 小时前
wsl2中kali linux下的docker使用教程(教程总结)
linux·经验分享·docker·云原生
程序猿进阶6 小时前
堆外内存泄露排查经历
java·jvm·后端·面试·性能优化·oom·内存泄露
运维&陈同学7 小时前
【zookeeper01】消息队列与微服务之zookeeper工作原理
运维·分布式·微服务·zookeeper·云原生·架构·消息队列
长风清留扬7 小时前
一篇文章了解何为 “大数据治理“ 理论与实践
大数据·数据库·面试·数据治理
O&REO8 小时前
单机部署kubernetes环境下Overleaf-基于MicroK8s的Overleaf应用部署指南
云原生·容器·kubernetes
运维小文8 小时前
K8S资源限制之LimitRange
云原生·容器·kubernetes·k8s资源限制