【kubernetes】k8s的面试宝典,等你来拿哦
面试宝典
目录
8.1在k8s中如何查看命名空间nanjing中的pod的IP
一、pod的生命周期
收到kubectl指令-->初始化容器(init container),生成文件(init可以有多个,但是不可以同时运行)-->创建容器成功-->start容器-->readnessProbe(就绪性探针:就绪检测--> liveness Probe (存活性探针):生存检测-->stop容器
① Pause 阶段:当 Pod 中的容器被暂停时,Pod 会进入 Pause 阶段。这通常发生在节点上发生调度变化时,为了确保容器状态的一致性,Pod 会被暂停并且等待恢复。
② Init 阶段:如果 Pod 中定义了 Init 容器,那么在主容器启动之前,Init 容器会先启动并执行其初始化任务。Pod 进入 Init 阶段直到所有 Init 容器都成功完成。
③应用启动阶段:一旦所有的 Init 容器成功完成,主容器将会启动并开始执行应用程序。
④ 存活阶段:Pod 中的容器正在运行,并且没有出现致命错误,此时 Pod 处于存活状态。
⑤ 就绪阶段:Pod 中的容器已经准备好接收流量。如果 Pod 中的所有容器都已经就绪,那么整个 Pod 就处于就绪状态,可以开始接收请求。
二、创建 pod 的工作流程
kubectl ->auth -> apiserver
apiserver -> etcd
scheduler/controller manager watch apiserver (create pod 的事件)
shceduler 发送list 给apiserver -> etcd 获取后端节点信息
以此来进行预选优选 -> 将结果返回给api-server
controller 来一轮以上的
kubelet watch api-server 发现create Pod 创建事件,获取创建pod所需资源与策略
kubelet 与cri 接口交互,调用docker 完成容器创建,并且调用控制器资源,完成Pod 创建
kubelet 通过metrics 监控、采集本地节点的资源状态信息 ——>周期性报告给api-server
api-server 再将信息写入etcd中
三、ingres 有哪些组件并且描述出组件作用 ?
Ingress 包含两大组件:Ingress Controller 和 Ingress
- Ingress Controller 会根据定义的 Ingress 对象,提供对应的代理能力。业界常用的各种反向代理项目,比如 Nginx、HAProxy、Envoy、Traefik 等,都已经为Kubernetes 专门维护了对应的 Ingress Controller
- Ingress 控制器不同于Deployment 控制器的是,Ingress控制器不直接运行为kube-controller-manager的一部分,它仅仅是Kubernetes集群的一个附件,类似于CoreDNS,需要在集群上单独部署
四、ingress 的工作原理
- ingress-controller是接受用户请求并且转发,外界看ingress-controller是转发给pod的, 其实并不是,而是转发到service上面,他是通过读取ingress-controller通过和 kubernetes APIServer 交互, ingress配置文件会保存在etcd当中并且ingress也配置定制了哪个域名发送到哪个service当中,
- 然后会生成一个nginx配置,并且他会写入到运行的控制器的pod当中。在pod当中会实现nginx服务以及导入到nginx配置文件中nginx.conf
- 然后reload加载,此时此刻控制器就知道了这个域名该转发到哪个service---endpoints(里面是不是有很多端点),
- 然后再由我们的service请求转到相应关联操作的pod上面,所以说对外界来看是ingress来转发的,实际上并不是,而是用户把请求转发给ingress-controller控制器, 根据ingress的资源配置找到所对应的service ,然后再由service转发到pod
五、ingress 暴露服务的方式
- 方式一:Deployment+LoadBalancer 模式的 Service
如果要把ingress部署在公有云,那用这种方式比较合适。用Deployment部署ingress-controller,创建一个 type为 LoadBalancer 的 service 关联这组 pod。大部分公有云,都会为 LoadBalancer 的 service 自动创建一个负载均衡器,通常还绑定了公网地址。 只要把域名解析指向该地址,就实现了集群服务的对外暴露
- 方式二:DaemonSet+HostNetwork+nodeSelector
用DaemonSet结合nodeselector来部署ingress-controller到特定的node上,然后使用HostNetwork直接把该pod与宿主机node的网络打通,直接使用宿主机的80/433端口就能访问服务。这时,ingress-controller所在的node机器就很类似传统架构的边缘节点,比如机房入口的nginx服务器。该方式整个请求链路最简单,性能相对NodePort模式更好。缺点是由于直接利用宿主机节点的网络和端口,一个node只能部署一个ingress-controller pod。 比较适合大并发的生产环境使用。
- 方式三:Deployment+NodePort模式的Service
同样用deployment模式部署ingress-controller,并创建对应的service,但是type为NodePort。这样,ingress就会暴露在集群节点ip的特定端口上。由于nodeport暴露的端口是随机端口,一般会在前面再搭建一套负载均衡器来转发请求。该方式一般用于宿主机是相对固定的环境ip地址不变的场景。
NodePort方式暴露ingress虽然简单方便,但是NodePort多了一层NAT,在请求量级很大时可能对性能会有一定影响。
六、pod 的组成
① Pod 中有几种容器
init 初始化 ,阻塞主容器运行,初始化后方可运行主容器
pause 基础容器: 提供network 的 namespace 和 共享存储
业务容器: 跑Pod 主应用
(POD中跑什么:微服务、数据库、监控、日志分析、mq、业务网关-类似Nginx的功能 SDK WSGI CGI等接口或协议的支持)
② Pod内网络环境
共享形式,类似于docker-container 模式 通过localhost 通讯
七、pod的本身性质(pod的种类与说明)
① 自主式pod:没有自愈能力( Pod被删除后不会重启拉起新的pod)
② 控制器管理的pod:有自愈能力( Pod被删除后会重启拉起新的pod)
八、k8s命令
8.1在k8s中如何查看命名空间nanjing中的pod的IP
kubectl get pods -n nanjing -o wide
8.2k8s 中pod无法启动怎么排查原因?
kubectl describe pod
kubectl logs
九、K8S 核心组件有哪些?功能是什么?
- api-server :所有请求都经过该组件,负责整个K8S 集群的协调、交互
- scheduler :为集群资源提供指向调度能力,分为默认调度、节点标签调度、亲和反亲和、污点容忍等调度方式
- etcd :记录K8S集群中所有集群资源信息
- controller manager :负责控制器资源管理的组件
- kubelet :节点的核心代理 负责与api-server 交互(watch api-server的事件)具体执行于节点,并周期统计节点资源信息,返回给api-server
- kube-proxy :K8S 集群中L4负载均衡、反向代理的组件
十、k8s 工作流程 (创建nginx 模版为例)
- 首先要明确有kubernetes环境,然后启动之后,master和node都会将自身的信息存储到etcd数据库中
- kubectl 首先创建命令 nginx服务 --> 他的安装请求会到->auth(认证)--> 然后被发送到master节点的apiServer(资源操作的唯一入口)组件
- apiServer组件会调用scheduler组件(负责集群资源调度)来决定到底应该把这个服务安装到哪个node节点上,在此时,它会从etcd中读取各个node节点的信息,然后按照一定的算法进行选择,并将结果告知apiServer
- apiServer调用controller-manager(负责维护集群的状态)去调度Node节点安装nginx服务
- kubelet(负责维护容器的生命周期)接收到指令后,会通知docker,然后由docker来启动一个nginx的pod,pod是kubernetes的最小操作单元,容器必须跑在pod中至此,
- 一个nginx服务就运行了,如果需要访问nginx,就需要通过kube-proxy(负责提供集群内部的服务发现和负载均衡)来对pod产生访问的代理
十二、ingress 你们用的哪种
Ingress:只需一个或者少量的公网IP和LB,即可同时将多个HTTP服务暴露到外网,七层反向代理。
可以简单理解为service的service,它其实就是一组基于域名和URL路径,把用户的请求转发到一个或多个service的规则。
十三、ingress使用443 怎么办
① 获取 SSL/TLS 证书和密钥。您可以通过自己的证书颁发机构获得证书,或使用 Let's Encrypt 等公共机构免费获取证书。
② 在 Kubernetes 中创建 Secret 对象,将证书和密钥添加到其中
③ 配置 Ingress 资源,指定要使用的 SSL/TLS 证书和密钥
注意,配置 Ingress HTTPS 访问需要做好负载均衡、端口转发等网络方面的配置,以确保请求可以正常转发到后端服务,并且证书和私钥可以被正确识别和使用
看累了吧,浅休息下
更多推荐
所有评论(0)