k8s-152习题【内含k8s、docker、prometheus、ELK、Jenkins等面试内容】

声明:内容来源于BV1ZTDEYmEbL, 石老师。 自学用。

1.k8s 中常见类型的资源介绍和区别

常用资源介绍:
Pod、最早的控制器RS、deployment(RS的升级)、daemonSet、statefulSet、service、Ingress
Ingress-controller、configmap、secret 、serviceAccount(服务账号)

Pod:运行服务器部署中的最小工作单元,pod里运行服务的容器,可以运行一个或者多个容器,一般运行一个一个容器。

RS控制器/ReplicaSet,是Pod的控制器,维护pod的副本数,更新pod时候,手动删除pod才能更新。

Deployment控制器:和RS作用一样,也是pod的控制器,维护pod的副本数,但是比RS更好用,
更新pod的时候,能自动更新升级,不用手动进行删除,在yaml文件里修改pod数量,自动会删除旧的pod,
升级成新的pod。它是RS的升级版本。

DaemonSet控制器:作用是保证k8s中所有节点都运行同一个pod,主要用于部署监控pod或日志收集的pod。

statefulSet控制器:管理有状态pod的控制器,主要部署需要有持久化存储数据的pod(如mysql、redis、es的pod)
或pod中多个容器之间有严格的启动顺序(如:mysql主从等)

Service资源:主要通过匹配pod的label标签,对pod实现负载均衡。

Ingress/ingress-controller资源:主要是把部署好的服务,通过域名暴露出去,匹配service的标签,能够实现对外访问的作用。
ingress-controller可以理解为:就是一个nginx的代理服务,但没有修改过nginx的配置,只是保持了默认的nginx配置。
而ingress,可以理解为,通过编写ingress的yaml文件,前段匹配域名,后端匹配响应服务的service名,达到修改nginx服务配置文件的目的。

configmap资源:主要起到修改服务配置文件,解耦的作用。想要修改服务的配置文件,直接进行修改pod的配置文件不方便。
尤其是多副本的时候,而且pod可能随时会重建。可以通过configmap简洁修改,将配置文件的内容创建成configmap资源,
pod挂载该configmap,修改configmap的内容,pod的配置文件内容也会跟着更新,这样就修改好了pod的配置文件。

Secret资源:创建加密内容的时候,使用的资源。如:创建相应的账号和密码的时候。

ServiceAccount资源:服务账号,用来登录k8s验证登录时候使用,不通的服务账号绑定不同的角色,访问不同的k8s资源等。
RBAC

2、k8s中pod服务健康检查方式有哪两种?

有livenessProbe(存活检查)和 readinessProbe(就绪检查)
存活检查:当检查出pod的状态或服务不健康时,会重启pod,重启容器。
就绪检查:当检查出pod状态或服务不健康时,不会重建pod,而是设为不可用。

3、k8s认证方式有哪几种?

有两种:
x509证书+role、rolebinding认证。
服务账号+role、rolebinding认证。 

4、k8s中的证书和私钥种类有哪些?

证书一共有三类:
etcd数据库集群内部的证书、
apiserver到etcd数据库的证书、
其他到apiserver的证书。

5、k8s中各个节点上组件有哪些?各自作用是什么?

Master节点:
kube-apiserver: 访问整个k8s集群的入口
kube-controller-manager:整个k8s集群的核心控制管理组件,主要负责管理和维护集群的状态。
kube-scheduler:k8s中调度服务相关组件,主要做分析资源,通过预选和优选机制,调度服务pod部署在那个节点。

Node节点:
kubelet服务:用来创建、管理、删除pod的组件,启动时向api-server中心注册,然后定时的向api-server汇报本节点信息状态,资源使用状态等等
kube-proxy服务:它运行在集群的每个节点上,负责实现服务发现和负载均衡功能。
比如:多个pod副本,可以通过service,进行label标签匹配,通过service作为统一的访问入口,
负载均衡访问后面的多个pod副本服务,实现多个pod的负载均衡,就会用到kube-proxy服务。

公共组件:etcd数据库集群,flannel网络或calico网络【都属于overlay网络】、coreDNS提供集群内部DNS服务,用于服务发现。

6、k6s集群中有没有高可用?你们公司的高可用架构是什么样的?

我们公司初始化的高可用集群是:3个master 、 50台node节点机器。
k8s的高可用:主要是针对组件apiserver进行高可用,它是集群的入口,都是通过访问apiserver来访问k8s集群的。

k8s的高可用 可以用两种方式进行部署:
方式1: 二进制方式进行安装
3个master上都安装相同的组件,controller-manager、scheduler、apiserver,3个节点都再加部署一个haproxy+keepalived,实现用haproxy代理apiserver,
提供一个haproxy的代理访问地址【即:vip访问地址:haproxy服务端口】,
其他node节点的kebelet服务和kube-proxy服务配置连接代理apiserver服务的haproxy地址,
通过haproxy代理apiserver,实现apiserver的高可用。

方式2:kubeadm初始化安装
3个master节点:都先安装keepalived+haproxy , 让haproxy代理3个master的apiserver
第1台master节点 然后初始化集群,初始化后,会生成两种加入集群信息的提示:
一种是以“主”的身份加入集群,另一种事以“从”的身份加入,自带了加入地址:vip:haproxy的端口,
后面2台master节点复制给的提示信息,以“主”的身份加入k8s集群即可。
其他的node节点复制给的提示信息,以“从”的身份加入k8s集群。


7、k8s中镜像的下载策略有哪几种?

always 、 Never 、 ifNotPresent

8、k8s中pod故障重启策略有哪几种?

always 、 Never 、 OnFailure

9、k8s中pv有几种访问模式?

3种:只让一个节点读写、 同时多个节点读写、 同时多个节点读。

10、k8s中pv和pvc的作用是什么?pv和pvc和底层存储的关联顺序是什么?

pv和pvc都是用来做持久化存储数据的。
pv是持久化存储卷,定义的持久化存储在宿主机上的目录或其他共享目录,nfs等其他,是具体实现的。
PVC只是对某种持久化存储的描述,提供具体的实现。

关联顺序:应用pod关联pvc【通过pvc的名字】-- pvc关联pv【通过容器和访问模式】
          -- pv关联底层存储设备【如:host宿主机、nfs共享存储、ceph或glusterfs分布式存储等】

pv和pvc需要绑定后才能使用。		  

11、客户端访问k8s资源需要经过几关?分别是什么?

验证通过 -- 权限授权通过 -- 资源限制

12、k8s集群中的数据是存储在那个位置?

k8s集群中的数据都存储在etcd数据库中

13、什么是 headless service ?

无头Service ,类似普通服务,没有集群ip,可以直接访问pod,不需要通过代理访问它。

14、docker怎么用dockerfile文件构建镜像?具体命令是什么?

进入Dockerfile文件所在目录执行:
docker build -t 镜像名:tag . [--build-arg Dockerfile 中变量名=]

15、docker怎么用镜像运行一个容器?如何设置在后台运行?

运行容器的命令: -d 是后台运行
docker run -d --name 容器名 --net=host -v 宿主机目录:容器目录  镜像名 

16、docker-harbor是怎么安装的?有几种安装方式?

在线安装或者离线包安装 。 也可以docker-compose拉起安装。

17 Dockerfile中都有哪些关键字?各自的作用是什么?

FROM: 定义一个基础镜像,以这个基础镜像进行扩展构建成其他服务镜像
WORKDIR: 登录容器后,切换到容器时候的落脚点路径定义
ARG:指令用于定义构建时的参数,可以在构建镜像时,通过 --build-arg 选项传递数值,
     build的时候传递参数数值给下面的变量,下面的变量可以接收到传进来的值。
ENV: 指令用于设置环境变量,这些环境变量在容器运行时可用。

EXPOSE:暴露服务的端口。
RUN:用于构建镜像时执行的命令,用于在构建镜像时使用。
CMD:容器运行启动后执行的命令。CMD特点:
1).设置的命令能被docker run ... 后面的命令行参数替换。
2).存在多个CMD时,仅最后一个生效,最后一个会覆盖掉上面所有的。

ENTRYPOINT:容器启动时执行的命令,设置的命令不会被docker run ... 后面的命令行参数替换,
           里面设置的命令【肯定能被执行】,可以和CMD配合使用。	 

18、如何使用docker快速运行相关服务?比如docker安装nginx、mysql、redis、tomcat等?

准备好相应服务的镜像,可以运行时在线拉取,也可提前导入,运行运行命令:
docker run -d --name 容器名  --net=host (或者-p 端口映射) -v 映射数据目录或配置文件 镜像名 

19、使用过docker-compose吗? 比docker来讲,它有什么优点?相关命令是啥?

docker只是管理运行单个容器,docker-compose可以将要运行的很多容器编写在yaml文件中,可以一键拉起很多容器,部署效率会提高很多。
常用指令:
docker-compose build 
docker-compose up -d
docker-compose stop/start/down/rm

20、会编写docker-compose的yaml文件吗?使用docker-compose拉起一串的服务?

会编写,拉取一连串的多个容器服务,是docker-compose的基本功能,在yaml文件中,先定义拉取一个服务,
相关任务配置好后,包括: build镜像,需不需要和宿主机映射、服务端口映射等,
先调试好一个服务,其他服务直接进行复制修改,所有服务修改好后,
直接执行docker-compose命令一键拉起所有服务。

21、docker有几种网络模式?作用是?

host:以宿主机网络映射出去提供服务。
container:容器共享ip网络模式,多个容器共享同一个ip。
None:无网络模式,进行内部测试使用。
Bridge(nat):默认的,nat桥接网络模式。

22、你们用的k8s版本是什么?

k8s v1.20.4 或者其他版本  【在2026年7月时,最新的版本是 k8s v1.36】

23、Dockerfile中RUN 、 CMD 、ENTRYPOINT的区别?

RUN:用于构建镜像时,执行的命令,用于在构建镜像时使用。
CMD:容器运行启动后执行的命令。CMD特点:
1).设置的命令能被docker run ...后面的命令行参数替换。
2).存在多个CMD时,仅最后一个生效,最后一个会覆盖掉上面所有的。

ENTRYPOINT:容器启动时执行的命令,设置的命令不会被docker run ...后面的命令行参数替换。
            里面设置的命令【肯定能被执行】,可以和CMD配合使用。

24、Dockerfile中ADD和COPY的区别?

COPY:能拷贝本地文件或目录到容器中【拷贝目录时,容器里也要带上该目录】
ADD:
1).拷贝本地文件或目录到容器中,该功能和上面的功能一样,一般此功能用上面的COPY即可。
2).拷贝本地压缩文件到容器中 可以自动进行解压
3).还可以拷贝网络文件到容器中,并可以自动解压。如 https://xxxx/a.tar.gz

25、docker中的镜像分层是怎么样的?

1).镜像时分层创建的。
2).每一条指令都会新建一层。
3).当前层不会影响上一层。

第四集 10:38

26、k8s中pod是如何实现代理和负载均衡的?

通过创建service资源,通过label标签匹配到后端的pod,代理pod,实现pod的负载均衡。

27、k8s中创建pod的过程或流程是怎么样的?

1).kubelet命令向apiserver发送一个创建pod的请求。
2).k8s中apiserver接收到请求后,不是直接去创建pod,而是生成一个创建pod信息的yaml文件,将yaml文件写入到etcd数据库中,添加一条记录。
3).scheduler调度服务会查看etcd数据库类型【类似有通知机制 会通知给schedule调度服务组件】,
   判断这条信息是不是新来的,若是新来的信息 则需创建,则会进行调度计算,找到节点中“最闲”的,
   资源使用率最低的node节点,让其调度到节点上面,将这个调度信息更新到etcd数据中。
4).各个node节点上的kubelet服务,也是不停的监控etcd数据库,发现有新来的数据进行,也会自行判断,
   根据分配的调度信息和自己对号入座,如果发现任务不是分配给自己的就不操作,
   如果发现任务是分配给自己的,那么就会调用自己的节点的容器api【如docker api】来创建出pod容器

28、k8s中如何批量删除pod?

批量过滤出需要删除的pod,使用命令或脚本进行删除。
如:过滤出状态为Error的pod进行批量删除
kubectl get pod -n 名称空间 | grep Error | awk '{print $1}' | xargs kubelet delete pod -n 名称空间

29、kubeadm 初始化的k8s集群,token过期后,集群中如何增加一个新node节点?

1).以k8s-master上重新生成 新的token  在k8s-master节点操作
kubeadm token create #创建新的token
kubeadm token list   #查看token

在这里插入图片描述

2).在k8s-master上根据ca证书获取hash值 , 在k8s-master节点操作
#获取hash
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin-outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.*//'

在这里插入图片描述

3).在新node节点上根据token和hash值加入k8s集群, 在新节点上操作
新节点也需要安装基础环境:kubeadm , kubelet 和 kubectl
yum install -y kubelet-1.20.4 kubeadm-1.20.4 kubectl-1.20.4
节点根据token值和hash值加入集群:
kubeadm join --token nv9rsh.kwiv52ieug7j891d --discovery-token-ca-cert-hash sha256:7f5117bbdbab102327242534572033b9d0ff7506675f46a503a118624912e609  192.168.60.128:6443

在这里插入图片描述

30、k8s运维过程中遇到过那些问题,如何解决的?

1).kubeadm init 初始化k8s集群时候,初始化失败
查看原因:是之前初始化用过的机器,之前机器没有删除干净,有部分遗留文件,重新清空原来环境,删除原来文件后,重新初始化成功。

2).k8s部署服务时候,pod一直处于pending状态,无法部署
以下几种原因都遇到过:
	a).node节点的资源不足,yaml文件中资源限制中分配的内存,cpu资源太大。node宿主机资源没有那么大,导致无法调度部署
	   临时解决:yaml文件中资源限制处 资源分配小一点
	   永久解决:扩展node节点,增加宿主机资源。
	b).部署pod的yaml文件中有标签选择器节点 亲和性nodeAffinity的名称配置,并且采用的硬策略,但是所有node节点上没有相应的节点标签,
	   导致无法部署。
	   解决:把yaml文件中节点亲和性配置去掉,或者在相应node节点上打上相应的标签。
	c).node节点上有污点,而部署pod的yaml文件中没有配置污点容忍度,导致无法调度部署。
	   当时同事为了分组,不让不相关的服务部署到相应节点。
	   解决:在yaml文件中,配置污点容忍或者将node节点上的 打的污点去掉。

END 第五集

31、执行kubectl get node 命令后看不到某些节点的原因?

若节点没有部署kubelet服务,就看不到【一般二进制方式部署的master节点未部署,就看不到】

32、执行kubectl get cs查看集群状态不正常,显示unhealthy,如何解决?

这是因为k8s组件kubelet服务配置文件里没有配置本地监听端口或者设置成了0 ,可以在本地kubelet服务配置文件中,
将端口改成kubelet服务对应的端口,或者将里面的port=0 注释,然后重启kubelet服务。

33、kubectl命令中create和apply创建资源的区别?

create: 一般用来初次创建,当创建资源后,修改了yaml文件,再create会报错,显示已经创建,
create仅支持第一次创建,不支持后续更新。

apply:不仅支持创建,还支持后续更新,应用较多。

34、pod资源共享机制如何实现?即:如何实现pod中两个容器共享同一个存储数据资源?

首先在pod的yaml文件里定义一个emptyDir空目录,挂载宿主机上的临时目录【会随pod生存而生存】。
然后定义个名字,pod中的两个容器,同时挂载同一个名字,将资源挂载到自己容器的响应路径,
此后两个容器就可以共享该数据资源了。

35、容器之间是通过什么进行隔离的?

通过namespace命名空间进行隔离。

36、pod常用的状态?

pending:pod未调度或者调度正在拉去镜像。
running:pod已经运行,正常状态。
failed: pod内的容器停止运行。
Success:pod内容器运行成功结束。【是任务型的pod ,crontab job】
Unknwon: master节点和node节点失联,pod状态无法获取到。

37、节点选择器都有什么?各自区别是什么?

有3种节点选择器:
分别是:nodeSelector 、 nodeAffinity、nodeName[一般不经过调度器,很少用]
nodeSelector节点选择器:通过给node节点打标签,yaml文件中需要配置匹配到相应node标签上,
从而将pod调度到相应node节点上,若没有匹配到相应的node标签,则无法调度。

nodeAffinity节点亲和性:与nodeSelector作用一样,但比较灵活,调度策略分为:软策略和硬策略。
硬策略:是必须满足条件,才能给调度。
软策略:是尝试满足,尽量满足,但不能保证。

硬策略选举:在yaml文件中指定了打在具体标签的node节点上,就必须只能在该标签的node节点上创建资源,
            如果所有节点都没有符合的标签,就不给调度创建。
软策略举例:在yaml文件中指定了打在具体标签的node节点上,尽可能在该标签的node节点上创建资源,
             如果所有节点都没有符合的该标签,	则再按其他调度算法创建在相应的节点上。

END 第六集

38、污点和污点容忍是什么? 两者是如何配合使用的?

污点【taint】作用:避免pod调度到特定node节点上,主要用于分组管理。
污点容忍【toleration】:允许pod调度到持有taint污点的node节点上,需要和taint结合使用。

39、service的4种类型

clusterIP:
默认值,k8s系统给service自动分配的虚拟IP,只能在集群内部访问,集群内部使用的ip【默认类型,只能集群内访问】

NodePort:
对外暴露应用,通过访问node节点的ip和端口,可以访问到对应应用【集群外访问】,将service通过指定的node上的端口暴露给外部,
访问任意一个 NodeIp:nodePort 都将路由到ClusterIP.

LoadBalance: [是升级版的nodePort]
对外暴露应用【适用于公有云】,在nodePort的基础上,借助cloud provider创建一个外部的负载均衡器,
并将请求转发到 <NodeIp>:NodePort , 此模式只能在云服务器上使用。

ExternalName:
ExternalName类型的service,就是将该service名跟集群外部服务地址做一个映射,使之访问service名称就是访问外部服务。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

40、service两种代理模式?

两种代理模式:iptables 和 ipvs 模式
iptables:通过iptables规则 进行转发代理。
ipvs:使用了类似lvs负载均衡技术,使用rr轮询模式进行转发代理。
iptables模式和ipvs模式可以相互转换。

41、k8s提供了那些对外暴露访问方式?

nodeport方式: 通过node节点的ip和暴露端口,提供外部访问。
loadbalance模式:适用于云产品厂商进行暴露访问。
ingress模式:通过提供域名,代理分流不同域名进行各自访问。

42、k8s的监控Prometheus 常用监控组件有那些?作用?

1).alertmanager 告警组件安装:
可以在宿主机直接安装,也可以部署在k8s集群当中,服务的配置文件中可以定义收发邮件人,
进行邮件的告警通知,也可以配置钉钉告警【或微信告警】,先部署一个dingtalk服务,
dingtalk里面配置了连接到钉钉群的webhook地址,dingtalk地址部署好后,暴露出一个访问地址,
包括ip:端口,altermanager的配置中可以配置dingtalk服务的ip和端口,调用dingtalk服务,
将告警信息通过dingtalk服务发送到指定的钉钉群。

2).安装部署node_exporter服务或者其他各类export服务:
以node_exporter服务为例:node_exporter主要是手机k8s集群中宿主机节点上的资源信息,
包括cpu、内存、磁盘空间等,通过这些信息对宿主机节点进行监控。可以手动部署到各个宿主机上。
也可以daemonSet方式部署在k8s集群中, 最终暴露出一个访问地址即可,暴露出的访问地址供Prometheus连接。
其他各类exporter服务也是类似。

3).安装Prometheus服务 【自带cadvisor服务采集pod容器的数据信息】
Prometheus服务以daemenset或deployment方式部署在k8s集群中【有官方的yaml文件,可自定义修改配置】
主要是采集pod容器的数据信息,对容器进行监控。
Prometheus的配置文件中,定义了连接altermanager的地址,进行告警通知,连接了node_exporter等各类exporter的地址,
收集采集各exporter的数据,对宿主机和其他mysql、redis等进行监控,定义各种告警规则和触发条件,用于实现监控触发告警机制。

4).安装metric服务,收集k8s资源组件的数据信息,对k8s内部资源进行监控
metric服务以daemenSet方式部署在k8s集群中。

5).安装grafana服务,进行监控大屏展示。
可以以deployment方式 部署在k8s集群中,访问grafana的访问地址,web界面上添加数据源为Prometheus,
并添加Prometheus的地址,从Prometheus收集过来的监控数据,进行大屏展示。

43、pod常见的状态有那些?

running: 正常状态。
pending: 正在调度或者无法调度,可能是node节点资源不够,可能nodeName和nodeSelector不匹配,也可能node节点有污点。

containerCreating:后面node节点故障不能工作,或者网络ip已被注册,也可能没有挂载到pv存储卷。
imagepullbackoff:为拉下来镜像,可能拉镜像超时,可能镜像名字不存在,可能无法访问镜像,
                 可能参数secret未配置,无法访问镜像。
				 
Crashloopbackoff: pod里面的容器退出,多次重启或准备删除。
Error:可能依赖的configmap、secret、pv等不存在,资源超过limit限制,无法访问集群内资源。

terminating:容器里的应用挂了。
unknown: master节点和node节点失联,pod状态无法获取到。需要查看node节点上kebelet服务是否正常,
          是在不行可以先剔除node节点,重置后重新加入。				 

44、node节点不能工作的处理?

1、先将该节点正在运行的pod驱逐到其他node节点
2、kubetadm reset 重置node节点【相当于清空所有东西】
3、停止kubelet服务
4、停止docker服务
5、删除清空相关就得配置  rm -rf /var/lib/kubelet/*   ;  rm -rf /etc/cni/
6、网卡向down掉   ifconfig cni0 down  ; ifconfig flanenl.1 down 
7、iplink delete cni0  ; iplink delete flanenl.1
8、启动docker
9、启动kubelet服务
10、重新加入集群, kubeadm join ...

45、k8s常见健康检查的探针有几种?

1、httpGet: 状态码检测,响应2xx, 则认为成功。
2、tcpSocket: 建立tcp连接检测,探针与容器指定端口建立tcp连接,连接成功则探测成功。
3、exec: 在容器内执行任意命令,并检测命令退出状态码,状态码为0,则认为成功。

46、k8s中网络通信类型有几种?

1、同一个pod中的多个容器间的通信
2、pod之间的通信、从一个pod到另一个pod之间的通信
3、pod与service通信: pod的ip到clusterIP的通信
4、与外部通信:集群和外部客户端的通信,可通过nodePort 或 ingress暴露出访问地址。

47、k8s中网络插件有那些?各自特点是什么?

1、flannel网络:能提供ip,但不能配置网络策略。
2、calico网络:既能提供ip,也能配置网络策略【可以限制pod允许从哪个网段访问】
3、cannel网络:技能提供ip,也能配置网络策略【是flannel网络和calico网络的结合】

那个性能好?从性能上讲,calico和flannel网络差不多
flannel网络模式:vxlan、host-gw、 udp模式【性能差,已启用】
vxlan模式:叠加网络模式,就是增加一个flannel.1网卡,连接docker网桥和宿主机网卡,进行通信。
host-gw模式:以宿主机充当网关。

calico的三种网络模式: BGP模式、IPIP模式和VXLAN模式。

48、pod网络连接超时的几种情况?

1、pod和pod之间的连接超时【不分跨不跨宿主机】
解决排查:查看calico或flannel网络是否running,查看calico或flannel网络组件的日志,提取重要信息,
           查看pod网段和宿主机网段是否重合【不能让其重合】

2、pod和虚拟主机【宿主机】的服务器连接超时
解决排查:检查pod网络,能否ping通同网段pod的ip

3、pod和外网连接超时
解决排查:检查物理网络,在容器内ping外网域名或其他pod的ip,如www.baidu.com ,不通时可抓包测试。

49、访问pod的ip:端口或service的ip显示超时,如何处理?

宿主机上检查是否开启Ipv4的转发

vi /etc/sysctl.conf
net.ipv4.ip_forward=1

#sysctl -p

50、pod的生命周期阶段?

pending:开始创建
runing: 正常运行
terminating: 容器终止

51、pod处于running,但应用不正常的几种状况

1、端口配置错误
如果应用实际需要监控的端口与pod定义中配置的端口不相符,可能会导致虽然pod运行起来了,
但是外部无法通过正确的端口访问到应用,从而表现为应用不正常。

2、应用自身代码错误或故障
应用的代码中可能存在逻辑漏洞、未处理的异常情况等,导致即使进程启动了,也不能正常执行功能。

3、依赖项缺失或异常
应用可能依赖其他的服务、数据库、组件。如果这些依赖项不可用、配置错误或版本不兼容等,
应用也不能正常工作。

4、网络配置问题
虽然pod与网络连接看似正常,但可能存在网络策略限制、路由错误、dns解析问题等,
导致应用看似running,但是内部的网络通信不能按预期进行。

5、环境变量配置错误
应用可能依赖特定的环境变量来正确运行,如果这些环境变量的值不正确或缺失,
就是导致pod看似running,但访问不正常。

6、容器内存OOM【内存泄漏】,已经僵死,虽然进程还在,但无响应。

52、当遇到coreDNS经常重启和报错,如何排查?

1、检查基本系统状况
1.1、检查系统资源监控:使用系统监控工具,top持续观察cpu、 磁盘I/O等资源的使用情况,
看是否存在资源耗尽或过度使用的情况,因为这可能导致coreDNS不稳定。

1.2、检查系统日志:查看/var/log/messages等,看是否与coreDNS相关的系统层面的提示或错误。

2、针对coreDNS本身检查
2.1、coreDNS服务的日志,查看报错信息,根据日志报错进行分析。
2.2、检查coreDNS的配置文件,确保配置参数设置正确,没有语法错误或不合理的配置项没检查域名解析规则等
2.3、确定当前使用的coreDNS版本是否存在已知问题或是否有更新版本可用,有时候更新可能会解决一些潜在的故障。

3、网络相关检查
3.1、网络连接测试:使用网络测试工具,如ping,traceroute等,检查coreDNS与其他相关服务器或网络节点的连接性
                    看是否存在网络延迟、丢包等问题
3.2、DNS流量分析:可以使用网络分析工具查看coreDNS处理的DNS请求和响应的流量模式,发现可能的异常流量或请求类型。

4、依赖服务检查
coreDNS可能依赖于其他服务或组件:如数据库、缓存等,确保这些依赖项都正常工作且配置正确

5、安全因素排查
检查是否存在安全策略或防火墙规则等限制了coreDNS的正常运行

6、考虑与其他应用兼容性问题
排查近期是否安装或更新的其他应用程序,是否与coreDNS存在兼容性问题,可能会导致冲突。

53、k8s集群节点状态为not ready的都有那些情况?

1、刚安装好的k8s集群的node节点为not ready:
可能是没有部署网络插件calico或flannel网络插件。

2、k8s运行一段时间后,node节点为not ready。
2.1、可能宿主机资源不足【磁盘、cpu、内存资源不足】
2.2、可能是node节点上kubelet服务不正常,需要查看kubelet服务是否正常,必要时重启kubelet
2.3、通过describe查看node节点的详细信息。

END 第十一集

54、k8s的几种调度方式?

1、scheduler的预选和优选,选择合适node节点调度
预选:通过资源不足问题,过滤一些不符合要求的node节点,如:资源request不符合。
优选:调度考虑整体的优化,如:多个副本尽量分布到不同的主机节点上,负载均衡。

2、通过定义nodeName或nodeSelector标签选择器进行调度

3、可以根据节点亲和性nodeAffinity进行调度
节点亲和性:nodeAffinity,作用和nodeSelector一样,但更灵活,有软策略和硬策略。

55、k8s中一个node节点突然断电,恢复后上面的pod无法启动,如何排查?

当node节点宕机,k8s会自动为这个节点加上不可调度的污点,有可能开机后,污点没有自动消失,导致pod无法调度
解决: 
1、describe查看node节点是否有污点存在,如果有污点,可删掉污点。

2、检查node节点主机名是否修改,主机名更改后连接不到k8s集群,也会添加污点,无法调度。
   可将主机名的名称修改正确,重启kubelet服务恢复。

3、检查node节点kubelet服务是否正常,kubelet服务不正常,为not ready状态,也会被打上污点,可重启kubelet服务,恢复正常解决。

56、pod超过节点资源限制的故障情况有那些?

1、pod数量太多,超过物理节点数量限制:
现象:大量pod批量重启后,pod一直处于pending状态,无法调度。
处理思路:
1.1、查看相应node节点上pod数量是否超过了默认的110个,node节点上默认能运行的最大pod数量是110个,
     如果node节点有资源,可以修改node节点kubelet服务的配置文件,将pod运行数量调大。
	 vi /var/lib/kubelet/config.yaml, 修改参数 maxPosd为指定的值,重启kubelet服务即可。
	 如果node节点上资源不够,可扩展几个node节点,将部分pod分配到新node节点上。
1.2、通过describe命令查看pod的信息。
1.3、通过describe命令查看 node节点信息。

2、pod的资源配置超过了宿主机节点的资源限制:
例如:pod的yaml文中,有配置cpu、内存的资源限制,宿主机上所以运行的pod,yaml文件中配置的cpu、内存等的总和,
      超过了该宿主机的最大cpu、内存,也会导致pod处于pending状态,无法调度到该节点上。
处理思路:	  
2.1、查看pod的信息或日志,看有无污点,有无OOM内存溢出,cpu、内存、磁盘等资源。

2.2、查看podyaml文件中limit限制的配置,降低limit的值,在pod能运行的许可范围内,给pod分配较小的资源。

2.3、扩展宿主机的资源或者增加node节点等扩展资源。

57、pod的自动扩容和缩容的方法有哪些?

1、HPA方式*:
利用监控指标【cpu使用率、磁盘、内存】等自动扩容或缩容pod的数量

2、KPA方式:
基于请求数对pod自动扩缩容【但不支持cpu的自动扩缩容】

3、VPA方式:
基于pod资源使用情况,自动为集群设置资源占用限制和要求比例,保持最初的比例值。
如:request和limit的比值。

58、k8s中service访问异常的常见问题有那些?如何处理?

1、service没有正确匹配到后端pod的label标签
可以排查service的yaml文件里定义的标签和pod的标签是否匹配上,修改匹配一致即可。

2、kube-proxy服务故障,导致service无法提供服务
暴露service访问的时候,kube-proxy会在iptables中追加一些规则【SNAT或DNAT转发】,或通过ipvs负载均衡模式,
为我们实现路由和负载均衡功能,使得我们通过service能访问到后端的pod服务,
如果kube-proxy服务有问题,则会导致访问不正常,可以查看kube-proxy服务是否正常,
查看kube-proxy相关日志,有无资源报错、cpu内存啥的错误信息。如果是资源不够问题,可以增加资源或node节点,
同时限制kube-proxy的yaml文件,limit限制调整小点资源。

59、k8s中pod删除失败,有哪些情况?如何解决?

1、pod被其他资源引用,无法删除pod:
pod可能被其他资源【如:deployment、replicatSet等】引用,导致无法直接删除。
解决:先删除引用该pod的资源,再删除pod

2、pod处于异常状态:持续崩溃重启crashLoopBackOff、镜像拉去错误ImagePullError等
会影响删除操作,可能导致删除失败。
解决:先解决pod的异常状态。如修复镜像问题,调整应用配置等,让pod恢复到正常状态,再尝试删除。

3、k8s版本问题
某些旧版本的k8s可能存在特定情况下与pod删除相关的bug问题或兼容性问题,可能导致pod删除失败。
解决:升级到最新或较新的k8s版本。

4、node节点故障,可能会导致pod删除失败
如果节点出现故障,如网络问题,存储故障等。可能导致pod删除异常。
解决:对节点进行诊断和修复,修复节点故障,恢复到正常运行状态,然后再删除pod

5、网络问题,可能会导致pod删除失败:
网络问题:如 网络不稳定或存在连接问题时,可能会导致pod删除命令无法正确传递到k8s集群,从而导致删除失败。
解决:检查网络连接,确保能够正常访问k8s集群

6、强制删除pod
如果以上问题都无法解决问题,可尝试使用强制删除命令
kubectl delete pod pod名称 --force --grace-period=0
# --grace-period=0 立即删除pod而不等待默认的优雅停机时长。

60、pause容器的概念和作用

每个pod里面运行这一个特殊的根容器pause容器,也叫初始化容器,其他容器为业务容器。
pod中pause容器是第一个被创建,先提前运行,提前准备好相应的运行环境。
如网络ip和volume存储数据卷资源,其他业务容器通过join加入的方式,和pause容器联在一起。

Pause容器启动前,会为容器创建虚拟一对ethernet接口,一个保留在宿主机网卡 vethxx【插在网桥上】
另一个保留在容器网络命名空间内,并重新命名为eth0,两个虚拟接口,一端进,一端出。

61、同一个节点多个pod之间通信示意图

在这里插入图片描述

62、跨主机之间的多个pod之间通信示意图

flannel 默认是vxlan方式,如下图
在这里插入图片描述

解释:flannel会为所在主机从集群网络地址中,获取一个小的网段子网subnet,本主机内所有容器ip地址从中分配。
pause容器创建一堆ethernet:一个在宿主机,插在网桥上veth1,另一个在pod空间中eth0 

63、k8s中同一个命名空间下服务间是怎么调用的?

在同一个namespace命名空间中,服务间调用,是通过service name【服务名】访问的。

64、k8s中不同命名空间下服务是怎么调用的?

对于跨命名空间的服务访问,service提供了2种访问方式:
1、直接访问:访问service名称,需要带命名空间,带集群域名的全路径访问。
可以直接使用 {SERVICE_NAME}.{NAMESPACE_NAME}.svc.cluster.local的格式进行跨命名空间访问。

2、创建一个externalName类型的service
创建一个externalName类型的service,
然后用{SERVICE_NAME}.{NAMESPACE_NAME}.svc.cluster.local的格式访问目标命名空间下的服务。

解释:
{SERVICE_NAME} 是服务名称
{NAMESPACE_NAME} 是服务所在的命名空间的名称
svc: 是固定的后缀,表示这是一个服务。
cluster.local: 是集群的域名。

在k8s中,每个服务都有一个唯一的域名,通过这个域名可以访问的服务。
这种域名格式使得服务可以在集群内被轻松访问,并且可以在不同的命名空间之间进行隔离和访问控制。

externalName类型的service:
就是将service名 跟集群外部服务地址【或集群内其他命名空间的服务】做一个映射,
使之访问service名称就是访问外部服务。 

65、externalName类型的Service的概念的理解?

理解1:externalName类型的service: 就是将该Service名跟集群外部服务地址做一个映射,使之访问service名称就是访问外部服务。

理解2:externalName类型的service:用于引入集群外部的服务,它通过externalName属性,指定外部一个服务的地址,
然后在集群内部访问此service就可以访问到外部的服务了。
外部服务的地址,可以是一个域名,如 www.baidu.com,也可以是其他命名空间的服务地址【FQDN,带命名空间,带集群名的全路径的service名称】

详见参考地址:https://www.cnblogs.com/tz90/p/15593814.html#_label0_3

END 第十五集

66、docker镜像的优化方法有哪些?

1、选择最精简的基础镜像

2、减少镜像的层数,将所有运行命令放到一层,如RUN 命令1 命令2

3、清理镜像构建过程中的中间产物,如: RUN 命令1 命令2  && rm -rf 不需要的中间产物

4、多阶段构建镜像,一个Dockerfile中,有两个FROM基础镜像,上面基础镜像运行过程中产物镜像,被下面的部署接着引用。

5、去除非必要的文件。

67、k8s中针对【标准化输出方式的日志】,如何进行收集?

标准化输出方式的日志,都会存放在各自宿主机上的/var/lib/docker/containers/各个容器id/ 的目录中,
所以只需采集宿主机上的该目录下所有容器id的日志即可。
以daemonSet方式在每一个node节点部署一个filebeat的pod, 该pod中的容器配置挂载宿主机上相应目录,
将宿主机上相应目录的日志路径挂载到filebeat的pod容器中的相应路径,filebeat的配置文件和pod容器中挂载的日志路径保持一致,
进而就可以搜集到pod挂载的相应宿主机上的容器的日志。

68、k8s中针对【容器内部的日志】,如何进行收集?

对于应用容器内部日志,一般采用边车模式,一个pod中跑两个容器,一个容器是应用容器,另一个容器是收集日志的filebeat容器,
两个容器配置共享存储日志的资源进行收集。

具体是:pod的yaml文件中,定义一个空目录资源emptyDir【挂载宿主机上的临时目录,随pod的消失而消失】
定义一个挂载卷名称,应用容器和filebeat容器同事挂载该空目录的挂载卷名称,挂载到各自容器相应的目录中,
实现filebeat容器和应用容器共享日志资源, 因为filebeat的容器已经将日志挂载到了自己容器的相应路径下,
可以修改filebeat的配置文件,收集日志的路径和挂载日志到自己容器的路径保持一致,就能搜集相应的应用容器的日志。

69、k8s中阿里云开源软件 log-pilot如何收集标准化输出的日志?

1、使用log-pilot.yaml里的镜像部署一个log-pilot组件服务,里面配置了连接es的地址

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

2、创建要收集日志的k8s资源的pod,并将容器内日志路径按log-pilot收集使用的变量格式定义全局变量 并映射到宿主机。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

70、无


71、k8s中pod的亲和性和反亲和性的概念?如何配置亲和性 和 反亲和性?

1、pod亲和性和反亲和性的概念:
【pod亲和性】:希望将带有某些标签的多个pod部署在同一个域或同一个node节点上。
           主要是想把pod和某个依赖的pod放在一起。
例如:一个pod在一个节点上了,那么我这个pod也得在这个节点上【注:两个pod标签不一定要相同,只是根据匹配规则决定】。
注意:是以pod的标签进行标记的:如pod1的标签是app=love,部署在node1节点 , pod2的标签是app=love2 ,
      那么配置pod亲和性,通过匹配规则限制,当pod2匹配上pod1标签的时候,让pod2也部署在node1,和pod1放在一起。		   

【pod反亲和性】:某个或某些pod部署时,希望不要和带有某些标签的pod部署在同一个域或同一个node节点上。
                 主要想把pod和某个pod分开 【有点daemonSet的效果】
例如:你这个pod在节点1上了,那么我就不想和你待在同一个节点1上【注:两个pod标签 不一定要相同,只是根据匹配规则决定】。
注意:是以pod的标签进行标记的:如pod1的标签是app=love, 部署在node1节点 , pod2的标签是app=love2,
      那么配置pod反亲和性,不让pod2部署在node1,不要和pod1放在一起。
				 
2、对于亲和性和反亲和性都有这两种规则可以设置,软策略和硬策略:
软策略:perferedDuringSchedulingIgnoredDuringExecution
硬策略:requiredDuringSchedulingIgnoredDuringExecution

亲和度可以分成软策略和硬策略两种方式:
软策略:尽量满足条件,满足条件最好,不满足也无所谓,若没有满足调度要求的节点的话,pod会忽略这条规则,继续完成调度过程。
硬策略:必须满足条件,如果没有满足条件的节点的话,就不断重试,直到满足条件为止。

对于亲和性和反亲和性都有两种规则可以设置

3).pod亲和性和反亲和性案例:

(1)
在这里插入图片描述
(2)
在这里插入图片描述
(3)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

72、简述k8s中PV生命周期内的阶段有那些

provisioning:配置阶段
	1、静态配置:管理员手动创建PV。
	2、动态配置:根据PVC请求,自动创建PV。
	
binding:绑定阶段
	k8s将符合要求的PV绑定到PVC上
	
Using:使用阶段
    PV被挂载到POD,pod可以通过PVC访问和使用存储资源。	
	
Reclaiming:回收阶段
	Retain【保留】:数据保留,PV标记为Released,管理员手动处理。
	Delete【删除】:PV和存储资源被删除。
	
Available:可用阶段
	回收后,还未与某个PVC绑定,PV可以重新绑定到新的PVC。
	
Released:释放阶段
	PVC 删除后,PV进入released状态,等待回收处理。

Failed:失败阶段
	回收失败或其他错误, PV进入Failed状态,需要管理员干预。

73、k8s中ETCD的特点

一致性:提供强一致性的数据模型,确保在分布式环境中数据的一致性。
高可用性:支持多节点部署,通过Raft算法实现高可用性,即使在节点故障时也能保持系统可用。

分布式:可以在多个节点上运行,适应大规模数据和高并发读写请求。
支持事务:提供原子事务支持,确保一组操作要么全部成功,要么全部失败。

监控和通知:具备监控功能,支持watcher机制,可订阅数据变更通知。
安全性:支持TLS安全通信,提供身份验证机制和访问控制,确保数据传输的安全性。
轻量级:是一个轻量级系统,易于部署和管理,适用于简单的分布式存储需求。

74、简述ETCD适应的场景

1、适用于需要数据高一致性的场景,确保分布式环境中的数据是一致性的。
2、适用于服务高可用时的场景。

3、适用于多节点数据分布式存储的场景。
4、适用于服务之间协调和交互使用的场景。

75、ectd集群节点之间是怎么同步数据的?

在etcd集群中,节点之间通过Raft一致性算法实现数据同步。
Raft保证了数据的高可用性和一致性,确保在集群中的节点保持相同的数据状态。

76、简述k8s和docker的关系和区别?

k8s和docker是现代容器化技术中的两个核心组件:
两者关系:
docker提供容器运行时的环境,能确保单个容器的运行,k8s在docker之上运行,可以管理多个容器的集群,
提供高层次的自动化和编排能力,两种可配合使用。

两者区别:
1、管理对象上:docker适用于管理单个容器,k8s适用于管理多个容器的集群。
2、组成部分上:docker的组件功能较少,k8s提供了多个复杂的组件运行。
3、网络和存储上:docker提供的是基本的网络和存储功能,k8s提供比较复杂的网络和存储抽象。


77、简述k8s的CNI模型

CNI模型是k8s中用于管理和配置容器网络接口的标准。CNI是一个通用接口,
允许k8s使用不同的网络插件来实现容器网络的配置和管理。

不同的网络插件:如calico、flannel等都是CNI插件的一部分。
CNI插件的作用:用于配置容器的网络。每个插件负责将容器连接到网络,分配IP地址,并处理网络策略等
CNI插件的工作过程:包括网络创建和网络删除。

网络创建:
当k8s创建一个pod时,它通过kubelet调用CNI插件来配置Pod的网络,
CNI插件根据配置文件中的指示,设置网络接口,分配IP地址,并配置必要的网络路由和规则。

网络删除:
当Pod被删除时,kubelet调用CNI插件来清理网络配置,释放IP地址,并删除网络接口和相关的路由和规则。

END 第十九集

78、简述k8s如何实现集群管理?

在集群管理方面,k8s将集群中的机器划分为一个master节点和一群工作节点Node。
其中,在master节点运行着集群管理相关的一组进程kube=apiserver、kube-controller-manager和kube-scheduler,
这些进程实现了整个集群的资源管理、pod调度、弹性伸缩、安全控制和负载均衡等管理能力。

node节点上有kubelet组件和kube-proxy组件:可以管理和运行pod,实现负载均衡访问。

79、简述k8s的优势、适应场景及其特点

优势:可以体现在容器集群的批量编排、轻量级、开源、弹性伸缩、负载均衡等方面;
场景:快速部署应用、快速扩展应用、合理使用资源、节省资源。
特点:
可移植:支持公有云、私有云、混合云、多重云。
可扩展:模块化、插件化、可挂载、可组合。
自动化:自动部署、自动重启、自动复制、自动伸缩/扩展。

80、同一个节点上pod的通信?

如果两个pod运行在同一个节点上,他们可以通过本地网络直接通信,不需要离开节点。
这种通信是直接、快速且低延迟的。

81、不同节点上的pod通信?

当两个pod分别运行在不同的节点上时,通信则需要跨越集群网络。这时候就涉及到k8s CNI的网络模型。
CNI插件负责为pod分配ip地址,并确保pod能够在集群网络中进行通信。

82、简述k8s scheduler使用那两种算法将pod绑定到worker节点?

预选【predicates】:输入是所有节点,输出是满足预选条件的节点。kube-scheduler根据预选策略过滤掉不满足策略的Nodes.
					如果某节点的资源不足或者不满足预选策略的条件则无法通过预选。
					
优选【priorities】:输入时预选节点筛选出的节点,优选会根据优先策略为通过预选的nodes进行打分排名,选择得分最高的node。

例如:资源越富裕、负载越小的node可能具有越高的排名。再如:尽量给每个节点都分配,做的负载均衡。				

83、简述k8s如何保证集群的安全性?

身份认证:用户和服务账号必须通过身份认证,支持多种认证方式,如证书、令牌等,即:x509证书认证或服务账号认证。
授权机制:使用RBAC进行授权,管理员可以定义和控制用户和服务账号的权限。

网络策略:允许管理员定义pod之间的网络通信规则,提高网络安全性。
加密通信:组件间通信通过TLS加密,保障集群内外通信的安全性。

敏感信息管理:使用secrets对象安全地存储和管理敏感信息,如密码、API秘钥。
安全上下文和隔离:使用命名空间对资源进行隔离,支持安全上下文来控制访问。
审计日志:启用审计日志记录所有集群操作,方便进行安全审计。

这些安全措施构建了k8s集群的多层安全保障,确保运行时的安全性和可信任性。管理员的开发者可以按需进行配置。		  

84、k8s中namespace的作用?

资源隔离:允许在同一集群中创建多个逻辑上隔离的虚拟集群,方便不同团队或应用程序共享资源。
唯一性和访问控制:确保同一命名空间内资源对象的名称唯一,同时支持访问控制,提高集群安全性。

环境隔离:用于隔离不同环境的资源,如开发、测试、生产。
监控和限制资源的使用:通过命名空间可以更好地监控和限制资源的使用。
总体来说:名称空间为多租户和资源隔离提供了有效的机制,有助于组织和管理k8s中的应用部署。

85、POD是什么?

pod是k8s中最基本的部署单元,它包含了一个应用程序容器【或者一组紧密相关的程序容器】、存储卷和唯一网络IP。
这些容器共享资源,他们可以在同一个节点上的同一宿主机上运行,彼此之间可以通过'localhost'直接通信。

86、什么是静态POD

静态POD是k8s中的一种特殊类型的pod:与常规的pod不同,它不由k8s的APIServer服务直接管理和调度,
静态pod是由kubelet进程直接管理的pod,而不是由APIserver服务管理。

适用场景:静态pod通常用于在k8s集群启动前启动一些核心服务,如网络CNI插件、DNS服务等。
他们可以确保这些关键服务始终在kubelet启动时运行,而不受ApiServer服务可用性或网络故障的影响。

87、简述k8s中pod的常见调度方式?

pod优选和预选调度:根据优选和预选机制,淘汰那些不符合的node节点,进行调度,比如淘汰那些资源不足的节点。

节点亲和性和反亲和性:通过设置规则,将需要部署在一起的pod部署在同一个域或同一个节点,不能部署在一起的pod,分开进行部署。

资源限制和请求:通过设置资源需求和限制,影响pod被调度到那个节点。

END 第二十一集

88、简述k8s中删除pod的流程

在k8s中,删除pod的流程可以简要描述如下:
1、触发删除请求:
用户或者控制器【如deployment、statefulSet等】发出删除pod的请求。这可以通过命令行工具kubectl或API请求来完成删除命令。

2、APIServer更新状态:
APIServer收到删除请求后,会更新pod的状态,将其标记为terminating【终止中】。

3、发送终止信息
k8s中向pod中的每个容器发送终止信号【SIGTERM】。这个信号通知容器需要开始优雅地关闭,进行清理操作,如关闭连接,保存状态等。

4、等待终止期限:
k8s等待一个预定义的终止期限【默认30秒】。在这段时间内,容器可以完成它们的清理工作。

5、强制终止【可选】
如果容器在规定时间内没有正常终止,k8s可能会发送强制终止信号【SIGKILL】,强制终止容器,但这可能会导致数据丢失。

6、资源释放:
当所有容器都已经成功终止并完成清理后,k8s会释放与pod相关的资源,包括网络端点、CPU、内存资源以及持久卷。

7、从etcd中删除对象:
最后 k8s会从etcd中删除pod的对象记录,这样就完成移除了pod的存在。

89、pod的资源请求限制如何定义?

可以直接在pod的yaml文件中定义:
主要包括两块内容:
limits:限制pod能使用的最大cpu和内存。
requests: pod启动时 申请的cpu和内存。

90、标签及标签选择器是什么?作用是什么?

标签:k8s中的标签【labels】是键值对,用于对资源对象进行分类和标识。
标签作用:通过为资源对象添加标签,可以灵活地组织和管理他们,例如根据标签进行筛选、分组、或标记不同的用途。

标签选择器【label Selectors】:根据标签的键值对来选择特定的资源对象。
标签选择器作用:使用标签选择器,可以根据标签的值 对资源进行过滤、查询或操作。

91、service的域名解析格式?

如果有一个名为`my-service`的service,位置于`my-namespace`命名空间中,而集群域名后缀为`cluster.local` ,
则该service的域名解析格式为: my-service.my-namespace.svc.cluster.local 
这种域名解析格式可用于在同一个集群内的pod中访问其他service。

92、pod与service通信是怎么样的?

k8s在创建service服务时,为服务分配一个虚拟IP,客户端通过该IP访问服务,服务则负责将请求转发到后端pod上。
Service是通过kube-proxy服务进程实现,该进程在每个node上均运行可以看做一个透明代理兼负载均衡器,
kube-proxy是通过iptables或ipvs负载均衡,实现到后端服务pod的访问转发。

93、在k8s集群内的应用如何访问外部的服务?

方法:创建一个externalName类的service
原理:externalName类型的service,就是将该service名跟集群外部服务地址做一个映射,使之访问service名称就是访问外部服务。

94、service、 endpoint、kube-proxys 三种关系是什么?

1、service的理解:
在k8s中,service是一种为一组功能相同的pod提供单一不变的接入点的资源。
当service被建立时,service的IP和端口不会改变,这样外部的客户端【也可以是集群内部的客户端】
通过service的IP和端口来建立连接,这些连接会被路由到提供该服务的任意一个pod上。
通过这样的方式,客户端不需要知道每个单独提供服务的pod地址,这样pod就可以在集群中随时被创建或销毁。

2、endpoint理解:
service维护一个叫endpoint的资源列表,endpoint资源对象保存着service关联的pod的ip和端口。
从表面上看,当pod消失,service会在endpoint列表中剔除pod,当有新的pod加入,service就会将pod ip加入endpoint列表;

3、kube-proxy理解:
kube-proxy运行在node节点上,在node节点上实现pod网络代理,维护网络规则和四层负载均衡工作,
kube-proxy会监听api-server,从而获取service和endpoint的变化情况,创建并维护路由规则以提供服务IP和负载均衡功能。

95、deployment怎么扩容或缩容?

1、直接修改pod副本数,可以通过下面方式
直接修改yaml文件的replicas字段数值,然后kubectl apply -f xxx.yaml来实现更新。

2、使用kubectl edit deployment xxx 修改replicas来实现在线更新:
使用kubectl scale --replicas=5 deployment/deployment-nginx命令来扩容/缩容。

3、借助HPA。
4、rancher图形化界面修改yaml文件配置。

96、k8s数据持久化的方式有哪些?

emptyDir:临时存储,数据在pod生命周期内存在,适用pod内容器间临时数据共享,随pod的消失而消失。

HostPath:使用宿主机节点文件系统路径存储数据,但不具备跨节点,可移植性,适用于节点依赖较高的场景。

PV和PVC:提供抽象层,允许将存储资源从pod中分离出来,支持多种存储后端,提供灵活的存储方案。

statefulSets:用于管理有状态应用,为每个pod分配稳定的网络标识符和存储卷,确保有状态应用在迁移或重启时保持数据稳定。

configMap和secrets:用于存储配置数据和敏感新消息,可以以卷的形式挂载到pod中,传递配置和密钥。
这些方式适用于不同的业务需求和存储场景,选择取决于应用程序的性质和部署环境。

97、什么是kubernetes,它主要目标是什么?

kubernetes是一个开源容器编排平台,用于自动化编排部署、扩展和管理容器化的应用程序。
他的目标是简化容器化应用的部署和管理,集中管理容器、并提供弹性、可靠的应用程序编排。

98、什么是replicaSet

replicaSet是k8s的控制器之一,用于确保在集群中运行指定数量的pod副本。如果pod的数量少于指定的副本数,
replicaSet将创建新的pod副本。
如果pod的数量多于指定的副本数,replicaSet将删除多于的pod

99、什么是deployment

deployment用于声明管理pod副本集。 他允许定义pod模板、副本数和更新策略。
使得应用程序的部署和更新变得简单可控。

100、什么是Service?

service是kubernetes的抽象层,用于暴露应用程序的一组pod,它为这些pod提供稳定的网络终结点,
并允许他们通过服务发现进行通信。

我需要知道 101~160 的具体主题/标题才能帮你生成准确的 markdown 文本。

如果你暂时只有标题列表,我可以先帮你生成带占位符的模板框架,你复制后自行填入内容。请告诉我:

  1. 这些题目是关于哪个技术领域的?(如 K8s、Docker、Linux、Java、Android、前端 等)
  2. 101~160 的标题分别是什么?(或者你提供标题列表,我帮你排版)

如果你现在就需要一个空白模板复制粘贴,以下是 101~160 的格式框架:

101、什么是名称空间【namespace】?

命名空间是一种在k8s集群中创建多个虚拟集群的机制。
它可以用于隔离和管理不同的应用程序、团队或环境。

102、如何进行应用程序的水平扩展?

可以使用deployment的副本数字段来进行水平扩展。
通过增加副本数,k8s会创建更多的pod副本以应对负载增加。

103、如何在k8s中进行滚动更新【rolling update】?

可以通过更新deployment的pod模板来进行滚动更新。
k8s会逐步替换现有的pod副本,确保在整个更新过程中应用程序的可用性。

104、如何在k8s中进行滚动 回滚【rollback】?

可以使用deployment的回滚功能来进行滚动 回滚。通过指定回滚到的特定修订版本
或回滚到上一个修订版本,k8s会自动恢复旧的pod副本。

105、什么是k8s的水平自动扩展HPA【horizontal Pod autoscaling】?

HPA根据应用程序的负载自动调整pod副本数。它基于CPU利用率或自定义指标来进行自动扩展。

106、如何进行存储卷【volume】的使用?

可以使用存储卷将持久化数据附加到pod中。k8s支持多种类型的存储卷,如空白存储卷、主机路径、pv/pvc持久卷等。

107、什么是init容器【init Container】?

init容器是pod中的一个额外容器,用于在主应用程序容器启动之前运行初始化任务。
它可以用于数据准备,配置下载等任务。

108、如何在k8s中进行配置文件的安全管理?

可以使用secret来安全地管理敏感配置信息,如数据库密码,API密钥等。
可以通过加密、访问控制和密钥轮换等措施来确保secret的安全性。

109、如何监控k8s集群?

可以使用k8s内置的指标和日志系统,如kube-state-metrics 、 heapster 和 EFK堆栈,来监控集群的运行状态和性能。

110、如何进行跨集群部署和管理?

1、使用federation【联邦】
联邦控制平面:使用联邦控制平面,可以将多个集群中的资源进行统一管理。创建、更新或删除资源时,
联邦控制平面会自动将这些操作应用到所有目标集群中。
跨集群服务发现:联邦可以帮助实现跨集群的服务发现和负载均衡,从而使应用程序能够跨多个集群无缝运行。

2、使用服务网格【Service Mesh】
服务网格是一种用于管理微服务之间通信的基础设施层。常见的服务网格工具包括:Istio、Linkerd和consul。
Istio:通过Istio,可以实现跨多个k8s集群的流量管理、安全策略和监控,Istio的控制平面可以管理多个k8s集群中的代理,
      以实现一致的策略和流量控制。
跨集群通信:服务网格可以实现跨集群的服务发现和通信,从而简化微服务在不同集群之间的交互。	  

3、使用CI/CD工具
CI/CD工具可以配置管道,以在多个集群中进行构建、测试和部署。
跨集群部署:通过配置不同集群的上下文【或通过使用不同的kubeconfig文件 连接到不同的k8s集群】
CI/CD工具可以在不同的环境中部署和更新应用程序。

4、使用多集群管理工具
多集群管理工具专门用于跨多个k8s集群的管理和监控,工具如下:
Rancher:Rancher是一个开源的多集群管理工具,可以管理和监控多个Kubernetes集群。它提供统一的用户界面和API来管理不同的集群。
Anthos、Azure Arc、Red Hat Advanced Cluster Management:这些是云提供商提供的多集群管理解决方案,支持跨云和本地的Kubernetes集群管理。

111、什么是kubernetes的生命周期钩子?【lifecycle hook】?

k8s的生命周期钩子是一种机制,允许在容器的生命周期中的特定点 执行用户定义的操作。
通过这些钩子,用户可以在容器启动和终止时执行自定义的逻辑操作。
这对于在容器的启动前准备环境,或在容器终止前进行清理操作非常有用。

例如:
生命周期钩子可以在pod的定义中通过`lifecycle`字段进行配置。
下面示例展示如何配置 PostStart 和 PreStop 钩子
PostStart钩子会在容器启动后立即执行,并输出“hello from the PostStart handler”。
PreStop钩子会在容器终止之前执行,并输出“Goodbye from the PreStop handler”

在这里插入图片描述

112、什么是pod的探针【probe】?

pod的探针用于定期检查容器的健康状态。kubernetes支持三种类型探针:
存活探针【liveness Probe】、就绪探针【readiness Probe】、启动探针【startup Probe】

113、什么是k8s的安全性措施?

k8s提供了多种安全性措施,如访问控制、网络策略、身份验证和授权、安全上下文等。
此外,可使用第三方工具和插件来增强kubernetes的安全性。

114、什么是容器资源限制【Resource limit】和容器资源请求【resource request】

容器资源限制用于限制容器使用的CPU和内存资源。
容器资源请求用于向调度器声明容器所需的CPU和内存资源。

115、什么是kubernetes中的水平和垂直扩展?

水平扩展【horizontal scaling】指的是增加pod副本数来处理更多的负载。
垂直扩展【vertical scaling】指的是增加或减少单个pod的资源限制。

116、什么是kubernetes的事件【event】

事件是k8s集群中:发生的重要操作或状态更改的记录。 可以使用kubectl 命令或 API查看集群中的事件。

117、什么是helm

helm是一个k8s的包管理工具,它简化了应用程序在k8s集群中的部署、管理和维护。
概念对比举例:类似rpm包和yum之间的关系。
k8s传统方式:类似于rpm安装包的方式,逐步进行安装,遇到依赖还得解决依赖问题。
helm方式:类似于 使用yum安装,一键封装进行安装,自动解决依赖问题。

传统k8s和helm的各方面的对比:
1、部署方式方面
使用k8s方式部署pod应用程序:需要手动编写和管理多个yaml文件,定义各种kubernetes资源,逐步部署。
使用helm方式部署pod应用程序: 通过helm charts 将应用程序及所有依赖打包成一个单独的包,可以轻松快速部署。

2、管理和升级方面:
k8s: k8s本身没有内置的版本管理机制,需要手动管理应用程序的版本。
helm: helm维护应用程序的版本历史,可以轻松进行版本升级和回滚。

3、重要性和共享:
k8s: 手动管理资源文件,资源文件通常是项目专用的,缺乏直接的共享和复用机制。
helm:helm charts有公用的模板yaml文件,通过传递不同的变量,快速拉起一套新的服务。
     可以在不同环境中复用,并且可以共享和分发到helm仓库。

118、如何进行kubernetes集群的高可用性配置?

配置k8s集群高可用性【high available,HA】是确保集群在节点或组件,发生故障时,仍能正常运行的关键步骤。
高可用性配置主要涉及以下几个方面:
1、控制平面的高可用性
控制平面包括API Server 、controller Manager、scheduler等组件,确保这些组件的高可用性是首要任务,
部署多个控制平面【通常为3个或5个】以实现高可用性,这样即使一个或者两个节点发生故障,集群仍能正常工作。

2、etcd的高可用性
etcd是k8s的后端数据存储,确保etcd的高可用性职高重要。
部署奇数个etcd示例【如3个或5个】,并确保这些实例分布在不同的节点上。

3、工作节点的高可用性
工作节点运行着用户的应用程序pod,确保这些节点的高可用性是保证应用程序 正常运行的基础,
将工作节点分布在多个可用区或物理机房,以减少单点故障的风险。

4、网络插件和负载均衡的高可用性
网络插件负责pod之间的通信,负载均衡则分发流量,确保它们的高可用性至关重要。
选择支持高可用配置的网络插件【如calico、flannel、weave】,并配置冗余路径,以确保网络插件组件的高可用性。
使用云提供商的负载均衡器【如 AWS ELB、GCP LB】或开源负载均衡解决方案【如MetalLB】,并配置冗余实例,以确保流量分发的高可用性。

119、什么是k8s的配置管理工具?

k8s提供了多种配置管理工具,如kubectl 、kubeadm、kubeconfig文件、configMap、secret、 helm等
这些工具可以用于管理和传递应用程序的配置信息

120、什么是k8s的网络模型?

k8s的网络模型基于容器间和容器与外部的通信。每个pod都具有唯一的ip地址,并且可以通过服务和ingress
来实现内部和外部的网络通信。

121、kubernetes的升级策略有哪些?

在k8s中,升级策略是指应用程序、集群组件或整个集群进行更新时,如何控制和管理升级过程,以确保系统的高可用性和稳定性

1、应用程序的升级策略【主要是deployment和 statefulSet】:
1.1、deployment提供了两种主要的升级策略
滚动更新【rolling update】:逐步替换旧版本的pod为新版本的pod,按顺序进行更新,以确保每个pod都按顺序更新并保持状态。
在yaml文件中增加配置:
  ...
  replicas: 3
  strategy:
    type: RollingUpdate

重建【recreate】:先删除所有旧版本的pod,然后创建新版本的pod。 在更新过程中,服务会有一段时间不可用
  ...
  replicas: 3
  strategy:
    type: Recreate
	
1.2、statefulSet 提供两种主要的升级策略:
滚动更新【RollingUpdate】:逐步替换旧版本的pod为新版本的pod,按顺序进行更新,以确保每个pod都按顺序更新并保持状态。
在yaml文件中增加配置:
  ...
  replicas: 3
  strategy:
    type: RollingUpdate

OnDelete:只有在手动删除pod时才会创建新版本的pod,适用于对顺序性和状态有严格要求的应用程序。	
在yaml文件中增加配置:
  ...
  replicas: 3
  strategy:
    type: OnDelete

2、集群组件的升级策略:
k8s集群的升级设计控制平面组件【如API Server、controller manager 、scheduler和etcd】以及工作节点的升级。

控制平面组件的升级:通常通过滚动更新的方式进行,以确保集群的高可用性,
	步骤:备份etcd数据 -> 升级etcd集群 -> 升级API Server实例 -> 升级controller manager 和 scheduler。
	
工作节点和主节点的升级:通常通过逐个节点进行,以确保在升级过程中集群保持可用状态
	步骤:排空节点,确保节点上的pod迁移到其他节点 -> 升级节点上kubelet 和 kubeadm -> 重启kubelet 服务 
	      -> 取消排空节点,使其重新加入集群。

122、什么是kubernetes的监控和日志记录解决方案?

k8s提供了多种监控和日志记录解决方案: 如prometheus 、 grafana、 ELK堆栈等。
这些工具可以用于监控集群的性能指标和应用日志。

123、怎么从一个镜像创建一个pod

可以使用kubectl命令行工具或编写一个pod的yaml文件,然后使用 kubectl apply 命令创建pod。

124、如何将应用程序部署到kubernetes?

可以使用deployment 、 statefulSet 、 daemonSet等资源对象来部署应用程序。

125、什么是?


126、什么是?


127、什么是?


128、什么是?


129、什么是?


130、什么是?


131、如何在prometheus中定义监控指标?

1、定义和暴露指标
要在prometheus中定义监控指标,首先需要在应用程序中暴露出这些指标。 prometheus使用http协议
和/metrics 端点来采集应用程序的指标数据。

2、配置prometheus抓取指标
在应用程序暴露指标后,需要配置prometheus抓取这些指标。
编辑prometheus的配置文件prometheus.yml,添加目标 targets

3、查询和可视化指标
配置完成后,prometheus将开始抓取并存储这些指标数据。你可以使用prometheus的web界面
或grafana来查询和可视化指标

4、设置告警规则
在prometheus中,还可以定义告警规则,当某些条件满足时触发告警。

132、如何配置prometheus进行目标抓取?

可以通过prometheus的配置文件 prometheus.yml来定义抓取配置。
在配置文件中指定要抓取的目标【如exporter的地址和端口,可配置静态地址,也可使用自动发现机制】
并设置抓取频率等参数。

133、prometheus如何处理数据库存储和保留策略?

prometheus使用时间序列数据库 TSDB 来存储和管理其采集的数据。
它的存储和保留策略可通过配置文件prometheus.yml来进行管理。

1、prometheus的数据存储架构由以下几个部分组成:
内存存储【in-Memory storage】:用于存储最新的数据点,以便快速查询。
本地磁盘存储【local disk storage】:定期将内存中的数据刷写到磁盘,以确保数据的持久化。
块存储【block storage】:数据按时间分块存储,每个块通常覆盖两小时的数据。

2、配置数据存储文职和保留策略:
在prometheus.yml文件中,可以通过命令行参数配置prometheus的数据存储位置和数据保留策略。
例如:
配置存储位置 --storage.tsdb.path=/prometheus/data
配置数据保留时间 --storage-tsdb.retention.time=15d
配置存储空间上限 --storage-tsdb.retention.size=30GB

134、如何设置警报规则并配置 altermanager

可以使用prometheus的配置文件 prometheus.yml来定义警报规则,并配置alertmanager的通知方式
和接收者,比如邮件或钉钉。

135、prometheus支持西那些查询操作和聚合函数?

prometheus支持丰富的查询操作和聚合函数。如过滤、计算率、求和、平均值、最大值、最小值等
以便对监控指标进行灵活的数据查询和分析。

136、什么是Prometheus的服务发现机制?

Prometheus提供多种服务发现机制,如静态配置、文件发现、consul、kubernetes等,用于自动发现和抓取要监控的目标。
静态配置:用户手动在Prometheus配置文件中指定目标的列表。适用于少量且不经常变化的目标。

文件发现:通过指定一个文件路径,Prometheus定期读取该文件,以获取目标列表。
		  文件内容是yaml或json的目标目标定义。这种方法适合使用外部脚本生成目标列表的场景。
		  
consul:通过集成consul、Prometheus可以发现注册在consul中的服务。consul是一个流行的服务发现和配置工具,常用于微服务架构中。

kubernetes:Prometheus与kubernetes紧密集成,支持多种kubernetes资源的服务发现,
			如pod、service、endpoint等。 Prometheus可以自动发现集群中的这些资源并进行监控。

137、Prometheus的可视化查询界面是什么?

Prometheus的可视化查询界面主要有两个:Prometheus自身的内置查询界面【Prometheus express browser】
和与Prometheus紧密集成的grafana。

Prometheus提供一个内置的可视化和查询界面,称为Prometheus web UI,可在浏览器中访问,并通过PromQL进行数据查询和展示。

grafana是一个开源数据可视化的监控工具,常用于与Prometheus配合使用。它提供了比Prometheus内置查询界面更强大和灵活的可视化能力。

138、什么是Prometheus的推模式【push】和拉模式【pull】抓取?

Prometheus主要采用拉模式来抓取监控数据,但他也支持通过PushGateway实现有限的“推模式”功能。

拉模式:Prometheus主动抓取,Prometheus服务器定期从被监控的目标targets中拉取scrape 监控数据。

推模式:客户端主动推送,监控数据由客户端主动推送到中间的pushGateway,再由Prometheus从
pushGateway中抓取数据。

139、如何在Prometheus中配置持久化存储?

在Prometheus中配置持久化存储时确保监控数据在Prometheus重启后仍然可用的关键步骤。
Prometheus支持多种存储后端和配置选项来实现数据持久化:
1、使用本地存储
Prometheus默认使用本地磁盘作为存储介质。要配置本地存储,只需在Prometheus的配置文件中指定存储路径和保留策略。

在这里插入图片描述

2、使用远程存储
Prometheus支持将数据写入和读取自外部存储系统【例如cortex、Thanos、InfluxDB】
这种方式适用于需要跨实例持久化数据或者需要更大的存储容量的场景。

在这里插入图片描述

3、在kubernetes中配置持久化存储
在kubernetes环境中,可以使用持久化卷【persistent volume,PV】和持久化卷声明【persistent volume Claim,PVC】
来持久化Prometheus的数据

在这里插入图片描述

4、数据压缩和保留策略
prometheus允许配置数据压缩和保留策略,以优化存储使用

在这里插入图片描述

140、Prometheus是否支持高可用【HA】部署?

Prometheus支持高可用性【HA】部署,但其原生设计并不直接包含HA特性。实现prometheus的高可用性
通常需要结合其他工具和组件。例如Thanos 或 cortex。
以下是实现Prometheus高可用性的一些方法和步骤:
1、多Prometheus实例部署:
通过部署多个Prometheus实例,并将它们配置为监控相同的目标,可以实现数据的冗余和容错。

2、使用thanos实现高可用
使用thanos可让Prometheus实现高可用性HA,同时提供长时间存储、跨实例查询等功能。
以下是实现Prometheus的高可用性的步骤:
2.1、部署多个Prometheus实例
首先,需要部署多个Prometheus实例,确保它们监控相同的目标targets。

2.2、部署thanos sidecar
每个Prometheus实例都需要部署一个thanos sidecar,用于将Prometheus的数据上传到远程对象存储,
并提供thanos的查询和聚合功能。
为每个Prometheus实例部署一个thanos sidecar。部署Prometheus实例并配置其运行参数,同时在
同一个pod中部署thanos sidecar。
thanos sidecar需要连接到prometheus,并将数据上传到对象存储。thanos sidecar配置中指定了Prometheus的
地址和数据存储路径。

3、配置对象存储
thanos sidecar需要配置对象存储【如Amazon S3、google cloud storage等】来存储时序数据。

4、部署thanos store 、 querier、 compactor 和Buckket web 
这些组件用于从对象存储中读取数据、进行查询、数据压缩和合并,并提供查询接口。
及时一个Prometheus实例宕机,另一个实例仍然可以继续收集数据,确保监控系统的高可用性。
同时通过thanos组件,可以实现数据的长期存储和统一查询。


141、什么Prometheus的持续查询

Prometheus的持续查询【continuous Queries】是一种机制,用于定期计算和存储查询结果,
并将这些结果保存为新的时间序列数据,以供后续持续的查询和展示使用。

142、K8S中的RBAC【role-based Access Control】是什么?如何配置和管理RBAC?

在k8s中RBAC【role-based Access Control】是一种用于管理对集群资源的访问权限的安全机制。
RBAC通过定义角色【roles】和角色绑定【role bingdings】来控制用户或服务账号对于集群中资源的操作权限。

Roles:角色定义了一组操作权限,例如可以读取、创建或修改某些资源的权限。
Role Bindings: 角色绑定将用户、组或服务账号绑定到角色上,从而赋予其角色定义的权限。

143、k8s中如何安全地传递敏感信息【如密码、密钥等】给容器?

1、k8s中创建secrets资源:
k8s提供了secrets对象来安全地存储和传递敏感信息。secrets可以用来存储如:用户名、密码、API密钥、
OAuth令牌等敏感数据,并且可以安全地挂载到pod中。

2、通过环境变量,使用secret资源:
可以将secrets中的数据作为环境变量传递给容器,这样容器就可以从环境变量中读取敏感信息。

在这里插入图片描述

3、通过挂载、使用secret资源:
将secrets挂载为文件系统中的文件,使容器可以直接读取文件中敏感信息。

在这里插入图片描述

144、k8s中如何管理容器的安全性?举例说明

1、使用最小特权原则
Least Privilege Principle:尽可能使用最小的权限来运行容器。

2、安全上下文配置 
security context configuration:在pod或容器级别设置安全上下文,如设置容器的运行用户、selinux选项等。

3、使用网络策略
Network Policies:使用网络策略控制容器之间和外部通信的流量。网络策略可以定义允许或拒绝来自特定IP地址、
端口等的流量。

4、使用容器镜像安全扫描
container image security scanning :在部署之前 扫描容器镜像,检查是否存在已知的漏洞和安全问题。
可以使用工具Clair 、Trivy 、Aqua security等。

5、实施访问控制和认证
Access control and authentication:使用RBAC和其他认证机制【如OIDC 、 LDAP】
确保只有授权用户或服务能够访问k8s资源和容器。

6、定期更新和维护
Regular updates and maintenance:及时更新k8s集群和容器中使用的操作系统、库和应用程序,
以修复已知的安全漏洞。

7、监控和审计
monitoring and auditing:配置监控系统,实时监视容器的运行状态和安全事件,记录审计日志以便追溯和分析安全事件。

8、使用安全审计工具和服务
security audit tools and Services:使用安全审计工具【如kube-bench、kube-hunter】
来评估和检查k8s集群的安全性,及时发现和解决潜在的安全问题。

145、如何查看和分析pod的日志?有那些工具可以帮助实现日志集中管理?

1、使用kubectl
kubectl logs <pod-name> [-c <container-name>] [-n <namespace>]

2、使用kubernetes Dashboard
kubernetes Dashboard提供了一个web界面,可以查看pod的详细日志和日志。
在dashboard中,找到pod并选择相应容器,即可查看其日志。

146、如何使用k8s进行多环境部署【如开发、测试、生产环境】

1、使用命名空间【namespace】
kubernetes中的命名空间是用于逻辑隔离和资源分组的一种方式。可以为每个环境【如开发、测试、生产环境】
创建单独的命名空间,以便隔离和资源管理。

2、使用环境变量和配置文件
通过环境变量和配置文件来管理不同环境的配置信息。
例如数据库连接、API密钥等。可以使用configMap和secret对象来管理这些配置信息。

3、使用标签【labels】和选择器【selectors】
使用标签为不同环境中资源进行分类和标记,然后通过标签选择器在不同环境中进行筛选和部署。

147、如何在k8s中实现应用程序的配置管理?

1、使用configmap和secret
k8s中configmap和secret对象可以用来存储应用程序的配置信息和敏感数据。
他们提供了一种集中管理的方式,并且支持动态更新。

2、使用环境变量和配置文件
将应用程序配置作为环境变量注入到容器中,可以方便的管理和更新配置。

148、k8s与CI/CD工具【如jenkins、gitlab CI等】的集成方式有那些?

1、使用k8s插件或插件集成
许多CI/CD工具提供了专门的k8s插件或集成选项,使得在构建和部署流水线中可以直接操作k8s集群。
例如:Jenkins kubernetes插件。

2、使用kubernetes API进行直接集成
CI/CD工具可能没有直接的插件或集成选项,但可以通过kubernetes的API直接与集群交互。
CI/CD工具可以使用kubectl命令行工具调用 kubernetes API 【或指定k8s集群的kubeconfig文件连接到k8s集群】
在流水线中执行部署、拓展、回滚等操作

3、使用helm进行包管理
在CI/CD流水线中,可以通过helm安装、升级和删除charts,确保应用程序的版本控制和配置管理。

149、如何实现kubernetes集群的备份?

1、备份策略:全集群备份、增量备份、周期性备份、存储多个备份版本。
全集群备份:
完整备份整个kubernetes集群的状态,包括所有命名空间、pod、service、configmap、secret等对象的配置和数据

增量备份:
只备份上次完整备份后来更改的部分。这样可以减少备份过程中数据传输和存储成本。

周期性备份:
设定备份计划,定期执行备份操作。备份的频率可以根据业务需求和数量重要性来确定,例如每日备份或每周备份

存储多个备份版本:
保留多个备份版本,以便在需要时可以回溯到特定时间节点的备份数据。

22.1使用etcd备份
kubernetes的所有集群状态数据存储在etcd中,因此备份etcd数据是恢复整个集群状态的关键。
手动备份etcd数据:  ETCDCTL_API=3 etcdctl snapshot svae /path/snapshot.db
自动化备份etcd数据: 使用velero工具。

2.2使用备份工具velero 【可支持全集群备份和增量备份】
velero是一个开源的备份和恢复工具,特别设计用于kubernetes和openshift。
它支持全集群备份、增量备份、存储多个备份版本等功能,提供灵活的策略和调度管理。

150、k8s中如何管理和优化资源【如cpu、内存】的使用

1、资源请求和限制【配置request和limits】
资源请求request:Pod可以指定对CPU和内存的最小需求量。
k8s使用这些请求来调度pod到适当的节点上,并确保节点上有足够的资源可用pod的正常运行。

资源限制limits:pod可以使用的最大资源量。
这防止pod消耗过多的资源,并可能导致其他pod受到影响。

2、水平和垂直扩展
水平扩展【HPA】:HPA根据指定的CPU或内存使用率监控指标 自动调整pod的副本数量,以满足应用程序的负载需求,从而确保资源的合理使用和效率。
垂直扩展【VPA】:VPA可以自动调整pod的资源请求和限制比例,以匹配其实际使用情况,从而优化资源利用率和性能。

3、节点资源管理
节点资源配额:设置节点级别的资源配额,配置节点上运行的pod使用的资源总量,避免资源竞争和过度分配。
节点选择器和亲和性/反亲和性:通过节点选择器和亲和性/反亲和性的规则,可以更加精确地控制pod在节点上的调度,以确保资源的有效利用和负载均衡。

4、资源监控和优化

151、k8s中如何管理和更新容器的安全补丁?

1、使用基础镜像的最新版本
选择官方和信任的基础镜像:始终选择官方源或受信任的镜像仓库的基础镜像,确保及时更新到最新版本。

2、定期更新容器镜像
定期更新镜像:建立良好的容器镜像更新策略,定期检查和更新容器中使用的基础镜像。
可以通过自动化或脚本实现自动化的镜像更新

3、使用漏洞扫描工具
漏洞扫描:使用漏洞扫工具【如clair、trivy、Aqua Security等】扫描容器镜像,及时发现和修复镜像中的安全漏洞。

4、更新应用程序和依赖项
应用程序和依赖项更新:及时更新应用程序和依赖项,包括操作系统、应用程序和架构,以确保使用的软件都是最新和安全的版本。

5、配置安全上下文
安全上下文配置:在pod和容器的配置中,确保使用最小权限原则,并遵循最佳实践,如限制特权容器、使用安全上下文、配置网络策略等。

152、k8s中如何实现故障转移和自动恢复?

k8s提供了多种机制来实现故障转移和自动恢复。
包括:控制器对象【如replicaSet、deployment】、自动重启和健康检查、控制平面自我修复的高可用性
以及水平扩展和负载均衡。

replicaSet:是k8s中的控制器对象,用于确保应用程序的副本数量始终保持在设定的期望值。如果某个pod发生故障或终止,控制器会自动启动新的pod,
以确保达到配置的副本数量。

健康检查机制:通过livenessProbe和readinessProbe可以定期检查容器的健康状态。如果容器失败
【例如由于应用程序崩溃或无响应】,k8s将自动重启该容器。

控制平面自我修复:
k8s的控制平面【如kube-apiserver、kube-controller-manager、kube-scheduler】本身也是通过多实例运行,
使用etcd存储状态。如果控制平面的某个组件出现故障,其他实例可以自动接管其职责,保障集群的稳定运行。

水平扩展和负载均衡:
k8s持水平扩展应用程序,通过增加pod的副本数量来处理更多的流量和负载。
结合服务发现和负载均衡功能,k8s可以自动将流量分发到健康的pod上,实现故障转移和自动恢复。

END 第三十三集,最后一集。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值