Docs/CloudNative/Kubernetes/Base/问题.md
2022-10-18 16:59:37 +08:00

27 KiB
Raw Blame History

docker网络模式

Docker使用了Linux的Namespaces技术来进行资源隔离如PID Namespace隔离进程Mount Namespace隔离文件系统Network Namespace隔离网络等。一个Network Namespace提供了一份独立的网络环境包括网卡、路由、Iptable规则等都与其他的Network Namespace隔离。一个Docker容器一般会分配一个独立的Network Namespace

host模式使用--net=host指定

容器将不会获得一个独立的Network Namespace而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡配置自己的IP等而是使用宿主机的IP和端口.文件系统等隔离,但网络不隔离。

container模式使用--net=container:NAME_or_ID指定

新创建的容器和已经存在的一个容器共享一个Network Namespace而不是和宿主机共享。新创建的容器不会创建自己的网卡配置自己的IP而是和一个指定的容器共享IP、端口范围等。同样两个容器除了网络方面其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。

none模式使用--net=none指定

Docker容器拥有自己的Network Namespace但是并不为Docker容器进行任何网络配置。也就是说这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等

bridge模式使用--net=bridge指定。默认模式

为每一个容器分配、设置IP等并将容器连接到一个docker0虚拟网桥通过docker0网桥以及Iptables nat表配置与宿主机通信

docker swarm与k8s的区别

swarm是docker公司开发的集群编排工具k8s是google开发的运用十年的borg的开源版本 1、docker swarm架构简单部署成本低但是集群健壮性比较差k8s部署比较复杂健壮性比较强 2、swarm与k8s有很高的扩展性扩展速度也很快。但k8s扩展速度很快 3、swarm可以在不同容器中自动实现负载均衡k8s需要手动在不同pod的不同容器间配置负载 4、都可以滚动更新但是swarm不能自动回滚 5、k8s数据卷只能同一个pod中不同容器共享但是swarm可以与其它容器共享

如何在 Kubernetes 中实现负载均衡?

kube-proxy实现4层负载均衡ipvs哟很多调度算法负责把service请求转发到后台的pod ingress实现7层负载均衡负责把内部服务暴露到外网访问

在生产中,你如何实现 Kubernetes 自动化?

日志

使用efk、promethuse等日志收集与监控套件过滤与标记异常

自我修复

k8s定期检测pod与容器的健康状况立即采取措施处理pod状态podstatus和containerstatus。容器探针readinessProbe和livenessProbereadiness探针很重要容器可能是运行状态但是未就绪并不传送任何流量

弹性测试

需要使用贪心测试工具kube-monkey等不懂

例行审计

需要工具

自动扩展

扩展pod扩展节点node 扩展pod主要看heapster的度量标准执行确认是否需要创建新pod。hpahorizontal pod autoscaler自动扩展 扩展node需要iaas支持

资源配额

限制k8s中的namespace确保某个应用程序不会占用所有资源

容器资源约束

限制容器的内存与cpu等

你如何扩展 Kubernetes 集群?


你能解释 Deployment、ReplicaSet、DaemonSet、StatefulSet、Pod、Job、CronJob 的不同用途吗?

Deployment、ReplicaSet等对应的服务是service而statefulSet使用的是headless service。无头服务headless serviece与service不同的地方是无头服务没有设置clusterIP访问它的时候直接访问的是无头服务后面对应的pod

Deployment

Deployment为Pod和Replica Set提供声明式更新。 只需要在 Deployment 中描述想要的目标状态是什么Deployment controller 就会帮您将 Pod 和ReplicaSet 的实际状态改变到您的目标状态。您可以定义一个全新的 Deployment 来创建 ReplicaSet 或者删除已有的 Deployment 并创建一个新的来替换

Deployment实际上是通过ReplicaSet实现滚动更新 Deployment控制ReplicaSetReplicaSet控制Pod

ReplicaSet

ReplicaSet是为了替换ReplicationControllerrc只支持灯饰的selector如version=v1等但rs支持集合形式的selector如vsersion in (v1,v2),或version not in (v1,v2)

DaemonSet

DaemonSet 确保全部或者一些Node 上运行一个 Pod 的副本。当有 Node 加入集群时,也会为他们新增一个 Pod 。当有 Node 从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod 典型用途: 运行集群存储 daemon例如在每个 Node 上运行 glusterd、ceph。 日志收集比如fluentdlogstash等 系统监控比如Prometheus Node ExportercollectdNew Relic agentGanglia gmond等 系统程序比如kube-proxy, kube-dns, glusterd, ceph等

StatefulSet

面向有状态的服务管理的pod有固定的名称、起停顺序等还要保持数据一致性需要用到持久化存储PersistentVolumeClaim

Pod

pod是k8s集群管理中的最小单位.是一个或多个容器的集合。同一个pod中的容器共享网络存储、命名空间等

Job

用于批处理一次性任务,并保证一个或多个任务成功结束

CronJob

在Job基础上加上时间调度执行周期性任务

Kubernetes 如何处理持久性?

pv和pvc。pv是集群中的一块存储空间由集群管理员或者存储类Storage Class管理pv是一个资源对象 pvcPersistentVolueClaim代表应用使用存储的请求pvc通过与pv绑定使用。满足的条件是pv与pvc spec字段匹配例如pvc申请的字段必须要小于等于pv大小pv与pvc的StorageClassName必须一样

service和 ingress 的作用是什么?

负载均衡提供k8s集群外部访问的入口。ingres接收到来自外部的请求会根据规则转发到serviceservice后有多个pod转发一个pod中这个pod处理请求 Service是通过规则定义出由多个Pod对象组合而成的逻辑组合以及访问这组Pod的策略。Service资源为此类Pod对象提供了一个固定、统一的访问入口及负载均衡的能力并支持借助于新一代DNS系统的服务发现功能解决客户端发现并访问容器化应用的难题 service并不是直接与pod连接service与pod之间还有一个中间层-endpoints资源第项它是由ip与端口组成的列表一般情况下service创建以后关联的endpoints也会自动创建

你何时会使用像 ConfigMap 或 secret 这样的东西?

configmap 核心作用是让配置信息和镜像解耦pod使用configMap中的配置信息如果后端pod配置文件有变化只需要修改configMap就好了pod会动态改变配置信息 ConfigMap对像是一系列配置的集合k8s会将这一集合注入到对应的Pod中并为容器成功启动使用。注入的方式一般有两种一种是挂载存储卷一种是传递变量。ConfigMap被引用之前必须存在属于名称空间级别不能跨名称空间使用内容明文显示。ConfigMap内容修改后对应的pod必须重启或者重新加载配置。

secret与configmap类似存储的信息使用base64编码一般用于docker-registrydocker仓库使用tls证书比如说https证书和一般generic

Pod 亲和性作用是什么?

pod的亲和性主要用来解决pod可以和哪些pod部署在同一个集群里面即拓扑域由node组成的集群里面而pod的反亲和性是为了解决pod不能和哪些pod部署在一起的问题二者都是为了解决pod之间部署问题。需要注意的是Pod 间亲和与反亲和需要大量的处理这可能会显著减慢大规模集群中的调度不建议在具有几百个节点的集群中使用而且Pod 反亲和需要对节点进行一致的标记,即集群中的每个节点必须具有适当的标签能够匹配 topologyKey。如果某些或所有节点缺少指定的 topologyKey 标签,可能会导致意外行为 Pod亲和性调度需要各相关的Pod对象运行于“同一位置” 而反亲和性调度则要求它们不能运行于“同一位置” 。同一位置取决于节点的位置拓扑, 拓扑的方式不同 如果以基于各节点的kubernetes.io/hostname标签作为评判标准那么很显然“同一位置” 意味着同一个节点,不同节点即不同的位置, 如图所示 如果是基于所划分的故障转移域来进行评判,同一位置, 而server2和server3属于另一个意义上的同一位置 因此在定义Pod对象的亲和性与反亲和性时需要借助于标签选择器来选择被依赖的Pod对象并根据选出的Pod对象所在节点的标签来判定“同一位置”的具体意义

你能举例说明何时使用 Init Container 么?

初始化容器顾名思义容器启动的时候会先启动可一个或多个容器如果有多个那么这几个Init Container按照定义的顺序依次执行一个执行成功才能执行下一个只有所有的Init Container执行完后主容器才会启动。由于一个Pod里的存储卷是共享的所以Init Container里产生的数据可以被主容器使用到。

Init Container可以在多种K8S资源里被使用到如Deployment、Daemon Set、StatefulSet、Job等但归根结底都是在Pod启动时在主容器启动前执行做初始化工作。

Init 容器支持应用容器的全部字段和特性包括资源限制、数据卷和安全设置。然而Init 容器不支持 Readiness Probe因为它们必须在 Pod 就绪之前运行完成;在资源限制、调度方面也会略有不同。

等待其它模块Ready比如有一个应用里面有两个容器化的服务一个是Web Server另一个是数据库。其中Web Server需要访问数据库。但是当我们启动这个应用的时候并不能保证数据库服务先启动起来所以可能出现在一段时间内Web Server连接数据库错误。为了解决这个问题我们可以在运行Web Server服务的Pod里使用一个InitContainer去检查数据库是否准备好直到数据库可以连接Init Container才结束退出然后Web Server容器被启动发起正式的数据库连接请求。 初始化配置:比如集群里检测所有已经存在的成员节点,为主容器准备好集群的配置信息,这样主容器起来后就能用这个配置信息加入集群;目前在容器化,初始化集群配置文件时经常用到; 提供一种阻塞容器启动的方式必须在initContainer容器启动成功后才会运行下一个容器保证了一组条件运行成功的方式 其它使用场景将pod注册到一个中央数据库、下载应用依赖等。

什么是 sidecar 容器?你能给出一个用例,说明你为什么要使用它么?

在构建和管理生产集群时遇到的主要问题是什么?

为什么你会建议公司在云中构建自己的 K8S 集群而不是使用托管服务?

什么是 Istio 和 Linkerd

Istio和Linkerd都支持以主流的外挂Sidecar模式部署。在这种模式下每个微服务都被分配一个单独的代理。微服务间的通信并不直接进行而是通过自身的代理转发。代理会将请求路由到目标微服务的代理该代理再将请求转发到目标微服务。所有这些服务代理构成了数据层。在服务网格的架构下数据层由控制层control plane来进行配置和监控控制层一般另行独立部署。 Istio 提供一种简单的方式来为已部署的服务建立网络,该网络具有负载均衡、服务间认证、监控等功能,而不需要对服务的代码做任何改动。

什么是 Kubernetes Operator

operator旨在简化负载的有状态应用管理的框架。是一个用于感知应用状态的控制器通过扩展k8s api来创建、管理配置应用 operator通过扩展k8s定义custom controllor观察情况并根据运行情况自定义任务。管理自定义crcustom resource Operator是一个感知应用状态的控制器所以实现一个Operator最关键的就是把管理应用状态的所有操作封装到配置资源和控制器中。通常来说Operator需要包括以下功能

  Operator自身以deployment的方式部署   Operator自动创建一个Third Party Resources资源类型用户可以用该类型创建应用实例   Operator应该利用Kubernetes内置的Serivce/ReplicaSet等管理应用   Operator应该向后兼容并且在Operator自身退出或删除时不影响应用的状态

  Operator应该支持应用版本更新

  Operator应该测试Pod失效、配置错误、网络错误等异常情况

kubernetes包含几个组件。 各个组件的功能是什么。组件之间是如何交互的。

c/s架构

kube-controller-manager

负责维护集群的状态,比如故障检测、自动扩展、滚动更新等

kube-scheduler

负责资源的调度按照预定的调度策略将Pod调度到相应的机器上

etcd

etcd 是兼具一致性和高可用性的键值数据库,可以作为保存 Kubernetes 所有集群数据的后台数据库。 存储集群状态等

kube-apiserver

外部管理k8s集群的唯一入口并提供认证、授权、访问控制、API注册和发现等机制。通过apiserver完成对k8s集群管理交互如pod的增删改查等

kubectl

k8s集群的命令行工具使用该工具与apiserver交互完成对k8s的管理

kubelet

负责维护容器的生命周期同时也负责VolumeCVI和网络CNI的管理

kube-proxy

负责为Service提供cluster内部的服务发现和负载均衡

ingress-controller

为外部提供集群内部应用访问入口

dns

负责为整个集群提供DNS服务

heapter

监控

dashboard

gui

k8s的pause容器有什么用。是否可以去掉。

pause是k8s基础容器很稳定。pod中的所有容器都与pause 共享namespace。pid=1负责处理僵尸进程。

k8s中的pod内几个容器之间的关系是什么。

共享各种namespace通过localhost通信

一个经典pod的完整生命周期。

初始化容器 initc 启动后 存活探针livenessProbe 就绪探针readinessProbe 结束前 pod创建过程总可能有pending创建但未调度完成running容器被创建至少一个容器正常运行succeeded所有容器都正常停止failed至少一个容器非正常退出unknown未知原因无法知道pod状态状态

k8s的service和endpoint是如何关联和相互影响的。

service与pod关联需要通过endpoint。endpoint是在service创建的时候由k8s自动创建 service要动态感知后端IP的变化得介入一个endpoints控制器也就是每个service都有对应一个endpoints控制器endpoints帮它关联后端的podservice 通过selector标签选择器关联pod, 具体实现动态IP变化由endpoints来实现

详述kube-proxy原理, 一个请求是如何经过层层转发落到某个pod上的整个过程。请求可能来自pod也可能来自外部。

deployment/rs有什么区别。 其使用方式使用条件和原理是什么。

cgroup中的cpu有哪几种限制方式。 k8s是如何使用实现request和limit的。

rc/rs 功能是怎么实现的。详述从 API 接收到一个创建 rc/rs 的请求,到最终在节点上创建 pod 的全过程,尽可能详细。另外,当一个 pod 失效时kubernetes 是如何发现并重启另一个 pod 的?

设想一个一千台物理机,上万规模的容器的 kubernetes 集群,请详述使用 kubernetes 时需要注意哪些问题?应该怎样解决?(提示可以从高可用,高性能等方向,覆盖到从镜像中心到 kubernetes 各个组件等)

设想 kubernetes 集群管理从一千台节点到五千台节点,可能会遇到什么样的瓶颈。应该如何解决。

kubernetes 的运营中有哪些注意的要点。

集群发生雪崩的条件,以及预防手段。

设计一种可以替代 kube-proxy 的实现。

sidecar 的设计模式如何在 k8s 中进行应用。有什么意义。

灰度发布是什么。如何使用 k8s 现有的资源实现灰度发布。

介绍 k8s 实践中踩过的比较大的一个坑和解决方式。

什么是k8s

Kubernetes是一个开源容器管理工具负责容器部署容器扩缩容以及负载平衡。作为Google的创意之作它提供了出色的社区并与所有云提供商合作。因此我们可以说Kubernetes不是一个容器化平台而是一个多容器管理解决方案

docker与k8s的关系

docker是一种容器提供容器生命周期管理但是本身不具备自愈负载均衡的功能而且不同容器(包括不同主机容器),若要互相通信,需要比较繁琐的配置

k8s专门用于容器编排组织提供docker 缺少的功能

主机和容器上部署应用的区别

主机上部署的应用共享系统的资源,静态库等,更新与配置比较麻烦,在新系统上部署的话,还需要配置环境,很容易出问题。 容器部署应用,各应用资源隔离,应用本身可以快速迭代开发,一次部署,可以导出在其他地方运行,节约了环境配置时间。

什么是容器编排

组成应用的一组容器,需要组织起来,协同合作,使应用按照既定的设计运行,这种组织流程就是容器编排

容器编排需要什么能力

1、负载均衡 2、自动伸缩 3、故障转移 4、监控状态 5、自动恢复自愈 6、回滚 7、自动调度

k8s特点

1、自动调度 2、自愈 3、自动更新与回滚 4、自动伸缩 5、负载均衡

k8s如何简化容器化部署

k8s可以在不同主机不同机房或云提供商上部署需要负载均衡网络配置自动伸缩监控等

对k8s集群了解多少

什么是heapster

Heapster是容器集群监控和性能分析工具收集监控数据。heapster首相从master获取所有的node信息然后通过这些node上的kubelet获取有用数据而kubelet的数据从cAdvisor得到所有获取到的数据都被推送到heapster配置的后端存储中。

什么是minikube

单节点运行的k8s

什么是kubelet

负责维护容器的生命周期同时也负责VolumeCVI和网络CNI的管理 监控pod状态并通知给其他组件 监控node并汇报给master 负责为pod准备运行环境 周期性执行pod中定义的指针

什么是kubectl

k8s集群的命令行工具。可用通过kubectl完成对集群的管理最后通过api-server

对k8s一个节点有什么了解

1、可以是物理机或虚拟机 2、提供pod的运行环境 3、被matser管理 4、需要安装容器、kubelet、kube-proxy

Kubernetes Architecture的不同组件有哪些

你对Kube-proxy有什么了解

在k8s每个节点上运行完成service与内部pod之间的数据转发提供4层负载均衡

您能否介绍一下Kubernetes中主节点的工作情况

kube-apiserver和kube-scheduler的作用是什么

kube-apiserver是外部管理集群的唯一入口完成认证、授权、访问控制api注册和发现等机制

kube-scheduler负责资源调度安装预定的调度规则把pod调度到相应的机器上

你能简要介绍一下Kubernetes控制管理器吗

负责维护集群状态Kubernetes 自带的控制器例子包括副本控制器、节点控制器、命名空间控制器和服务账号控制器等

什么是ETCD

兼具一致性与高可用的键值数据库用于存储k8s的集群状态

Kubernetes有哪些不同类型的service

ClusterIP NodePortLoad BalancerExternal Name外部Cname

你对Kubernetes的负载均衡器有什么了解

两种分法内部与外部4层kube-proxy与7层ingress

什么是Ingress网络它是如何工作的

Ingress定义了一组规则是外部访问集群内部服务的入口提供ssl负载均衡等服务

您对云控制器管理器有何了解

什么是Container资源监控

用户需要了解容器的性能及资源使用情况。就需要对容器pod服务集群等各层级进行管理。heapsterinfluxdb

Replica Set 和 Replication Controller之间有什么区别

基本相同但是rs可以支持集合的selectorrc支持基于等式的selector

什么是Headless Service

与普通service不同的地方在于没有ClusterIP通过它直接访问后端的pod中间没有代理一般用于有状态服务

使用Kubernetes时可以采取哪些最佳安全措施

什么是集群联邦

多个集群当成一个集群进行管理

cni

container network interface容器网络接口是一个标准的通用的接口。现在容器平台dockerkubernetesmesos容器网络解决方案flannelcalicoweave。只要提供一个标准的接口就能为同样满足该协议的所有容器平台提供网络功能而CNI正是这样的一个标准接口协议。 CNI用于连接容器管理系统和网络插件。提供一个容器所在的network namespace将network interface插入该network namespace中比如veth的一端并且在宿主机做一些必要的配置例如将veth的另一端加入bridge中最后对namespace中的interface进行IP和路由的配置。

CNI的工作是从容器管理系统处获取运行时信息包括network namespace的路径容器ID以及network interface name再从容器网络的配置文件中加载网络配置信息再将这些信息传递给对应的插件由插件进行具体的网络配置工作并将配置的结果再返回到容器管理系统中。

runc

RunC 是一个轻量级的工具,它是用来运行容器的,只用来做这一件事,并且这一件事要做好。我们可以认为它就是个命令行小工具,可以不用通过 docker 引擎直接运行容器。事实上runC 是标准化的产物,它根据 OCI 标准来创建和运行容器 Docker就是基于runC创建的简单地说runC是Docker中最为核心的部分容器的创建运行销毁等等操作最终都将通过调用runC完成

k8s控制器类型

rsdeploymentdaemonSetstatefulSetservicepodjobcronjob

k8s调度过程

为什么要用systemd替换cgroup

控制组用来约束分配给进程的资源。

当某个 Linux 系统发行版使用 systemd 作为其初始化系统时,初始化进程会生成并使用一个 root 控制组 (cgroup), 并充当 cgroup 管理器。 Systemd 与 cgroup 集成紧密,并将为每个 systemd 单元分配一个 cgroup。 你也可以配置容器运行时和 kubelet 使用 cgroupfs。 连同 systemd 一起使用 cgroupfs 意味着将有两个不同的 cgroup 管理器。

单个 cgroup 管理器将简化分配资源的视图,并且默认情况下将对可用资源和使用中的资源具有更一致的视图。 当有两个管理器共存于一个系统中时,最终将对这些资源产生两种视图。 在此领域人们已经报告过一些案例,某些节点配置让 kubelet 和 docker 使用 cgroupfs而节点上运行的其余进程则使用 systemd; 这类节点在资源压力下会变得不稳定。

更改设置,令容器运行时和 kubelet 使用 systemd 作为 cgroup 驱动,以此使系统更为稳定。 对于 Docker, 设置 native.cgroupdriver=systemd 选项。

注意:非常 不 建议更改已加入集群的节点的 cgroup 驱动。 如果 kubelet 已经使用某 cgroup 驱动的语义创建了 pod更改运行时以使用别的 cgroup 驱动,当为现有 Pods 重新创建 PodSandbox 时会产生错误。重启 kubelet 也可能无法解决此类问题。 如果你有切实可行的自动化方案,使用其他已更新配置的节点来替换该节点,或者使用自动化方案来重新安装

k8s网络插件

flannelcalicocannel

k8s三种认证方式

token方式比如新增node节点
证书认证
serviceaccount

etcd备份恢复

podrsdeploymentsvcingress如何关联

亲和性与反亲和性使用

调度器默认情况下会优先选择资源充足负载平均的节点进行调度。比如说内部的代码服务器不希望与其他应用服务共用节点但是有时两个pod通信比较频繁又会希望他们在同一个节点上这就需要亲和性与反亲和性 节点亲和性是指定pod在node上调度的约束。requiredDuringSchedulingIgnoredDuringExecution和preferredDuringSchedulingIgnoredDuringExecution可以认为前一种是必须满足如果不满足则不进行调度后一种是倾向满足不满足的情况下会调度到不符合条件的Node上。IgnoreDuringExecution表示如果在Pod运行期间Node的标签发生变化导致亲和性策略不能满足则继续运行当前的Pod。

pod亲和性允许用户通过已经运行的Pod上的标签来决定调度策略用文字描述就是“如果Node X上运行了一个或多个满足Y条件的Pod那么这个Pod在Node应该运行在Pod X”因为Node没有命名空间Pod有命名空间这样就允许管理员在配置的时候指定这个亲和性策略适用于哪个命名空间可以通过topologyKey来指定。topology是一个范围的概念可以是一个Node、一个机柜、一个机房或者是一个区域如北美、亚洲实际上对应的还是Node上的标签。

有两种类型

requiredDuringSchedulingIgnoredDuringExecution刚性要求必须精确匹配 preferredDuringSchedulingIgnoredDuringExecution软性要求

反亲和性的应用举例说明pod反亲和性如果一个node上已经有了具有相同标签的pod那么新node就不在上面部署避免了节点故障导致的服务不可用 node反亲和性就是应用不部署在相应的服务器上。比如说这个应用可能产生很大流量这个小出水口的服务器明显不能满足需要就不调度到这些节点上

污点,污点容忍场景

当节点标记Taint时除非Pod也被识别为可以容忍Toleration有污点的节点,否则默认情况下Kubernetes scheduler不会将Pod调度到有污点的节点上 Taint 和 toleration 相互配合可以用来避免pod被分配到不合适的节点上。每个节点上都可以应用一个或多个taint这表示对于那些不能容忍这些taint的 pod是不会被该节点接受的。如果将toleration应用于pod上则表示这些pod可以但不要求被调度到具有相应taint的节点上

pv与pvc

flannel三种模式具体流程

host-gw vxlan flannel-vxlan udp。默认udp flannel-udp

封包与解包是怎样的

vxlan与hostgw区别

calico三种模式具体流程

calico路由模式

怎么跨路由

多集群多租户如何管理

怎么理解crd

custom resource defination

怎么理解operator

service mesh

istio osm nginx-service-mesh

helm

类似yum的别人已经编辑好的

traefic

harbor

本地仓库

promethues怎么监控k8s

efk日志采集优缺点

jenkins pipe

sonarqube