14.k8s专题 你点到为止 我一醉方

76.简述Kubernetes和Docker的关系和区别?

Kubernetes和Docker是现代容器化技术中的两个核心组件:

两者关系:

docker提供了容器运行时的环境,能确保单个容器的运行,k8s在docker之上运行,可以管理多个容器的集群,提供高层次的自动化和编排能力,两种可配合使用。

两者区别:

1).管理对象上:docker适用于管理单个容器,k8s适用于管理多个容器的集群

2).组成部分上:docker的组件功能较少,k8s提供了多个复杂的组件运行

3).网络和存储上:docker提供的是基本的网络和存储功能,k8s提供比较复杂的网络和存储抽象,更复杂

77.简述Kubernetes的CNI模型?

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

不同的网络插件:如calico、flannel等都是cni插件的一部分。

CNI插件的主要作用:用于配置容器的网络,每个插件负责将容器连接到网络,分配IP地址,并处理网络策略等。

CNI插件的工作原理:包括网络创建和网络删除

网络创建

当k8s创建一个pod,它通过kubelet调用CNI插件来配置Pod的网络。

CNI插件根据配置文件中的指示,设置网络接口,分配IP地址,并配置必要的网络路由和规则。

网络删除

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

78.简述kubernetes如何实现集群管理?

在集群管理方面,Kubernetes将集群中的机器划分为一个Master节点和一群工作节点Node。

其中,在Master节点运行着集群管理相关的一组进程kube-apiserver、kube-controller-manager和kube-scheduler,这些进程实现了整个集群的资源管理,Pod调度、弹性伸缩、安全控制和负载均衡等管理能力。

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

79.简述Kubernetes的优势、适应场景及其特点?

优势:可以体现在容器集群的批量编排、轻量级、开源、弹性伸缩、负载均衡等方面。

场景:快速部署应用、快速扩展应用、合理使用资源、节省资源

特点:

可移植:支持公有云、私有云、混合云、多重云(multi-cloud)

可扩展:模块化、插件化、可挂载、可组合

自动化:自动部署、自动重启、自动复制、自动伸缩/扩展

80.同一节点上的Pod通信?

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

81.不同节点上Pod通信?

当两个Pod分别运行不同的节点上时,通信则需要跨越集群网络。这时候就涉及到Kubernetes

CNI(Container Network interface)的网络模型。

CNI插件负责为Pod分配IP地址,并确保Pod能够在集群网络中进行通信。

82.简述Kubernetes Scheduler使用哪两种算法将Pod绑定到worker节点?

预选(Predicates):输入是所有节点,输出是满足预选条件的节点,kube-scheduler根据预选策略过滤掉不满足策略的Nodes,如果某节点的资源不足或者不满足预选策略的条件则无法通过预选。

优选(Priorities):输入是预选阶段俗筛选出的节点,优选会根据优先策略为通过预选的Nodes进行打分排名,选择得分最高的Node.

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

83.简述Kubernetes如何保证集群的安全性?

身份认证:用户和服务账号必须通过身份认证,支持多种认证方式,如证书、令牌等,即:x509证书认证或服务账号认证。

授权机制:使用RBAC进行授权,管理员可以定义和控制用户和服务账号的权限。

网络策略:允许管理员定义pod之间的网络通信规则,提高网络安全性。

加密通信:组件间通信通过TLS加密:保障集群内外通信的安全性。

敏感信息管理:使用Secrets对象安全地存储和管理敏感信息,如密码、API密钥。(base64编码)

安全上下文和隔离:使用命名空间对资源进行隔离,支持安全上下文来控制访问。

审计日志:启用审计日志记录所有集群操作,方便进行安全审计。

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

84.k8s中namespace的作用?

资源隔离:允许在同一集群中创建多个逻辑上隔离的虚拟集群,方便不同团队或应用程序共享资源

唯一性和访问控制:允许在同一集群中创建多个逻辑上隔离的虚拟集群,方便不同团队或应用程序共享资源。

环境隔离:用于隔离不同环境的资源,如开发、测试和生产。

监控和限制资源使用:通过命名空间可以更好地监控和限制资源的使用。

总体来说:命名空间为多租户和资源隔离提供了有效的机制,有助于组织和管理Kubernetes中的应用部署。

85.Pod是什么?

pod是k8s中最基本的部署单元,它包含了一个应用程序容器(或者一组紧密相关的应用程序容器)、存储卷和唯一的网络ip。

这些容器共享资源,它们可以在同一节点上的同一宿主机上运行,彼此之间可以通过`localhost`直接通信。

86.什么是静态pod?

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

使用场景:静态pod通常用于在k8s集群启动前启动一些核心服务,如网络插件(CNI插件)、DNS服务等。

它们可以确保这些关键服务始终在kubelet启动时运行,而不受APIserver服务可用性或网络故障影响。

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

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

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

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

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)是键值对,用于对资源对象进行分类和标识

标签作用:通过为资源对象添加标签,可以更灵活地组织和管理他们,例如根据标签进行筛选、分组、或标记不同的用途。

标签选择器(Lablel 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或负载均衡,实现到后端服务pod的访问转发。

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

方法:创建一个ExternalName类型的Service

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

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

1).service理解:

在kubernetes中: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副本数既可,可以通过下面的方式来修改pod副本数

直接修改yaml文件的replicas字段数值,然后kubectl apply -f xxx.yaml来实现更新

2).使用kubectl edit deployment xxx 修改replicas来实现在线更新

使用kubectl scale --replicas=5 deployment/deployment-nginx命令来扩容缩容。

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

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

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

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

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

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

97.什么是kubernetes?它的主要目标是什么?

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

98.什么是ReplicaSet?

ReplicaSet是kubernetes的控制器之一,用于确保在集群中运行指定数量的Pod副本,如果pod的数量少于指定的副本数,ReplicaSet将创建新的Pod副本;

如果pod的数量多于指定的副本数,ReplicaSet将删除多于的pod.

99.什么是Deployment?

Deployment是kubernetes的控制器之一,用于声明管理pod副本数,它允许定义pod模版、副本数和更新策略,使得应用程序的部署和更新变得简单可控。

100.什么是service?

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

101.什么是命名空间(Namespace)?

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

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

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

103.如何在kubenetes中进行滚动更新(Rolling Update)?

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

104.如何在kubernetes中进行滚动回滚(Rollback)?

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

105.什么是kubernetes的水平自动扩展(Horizontal Pod Autoscaling)?

水平自动扩展是kubernetes的功能之一?根据应用程序的负载自动调整pod副本数,它基于cpu利用率或自定义指标来进行自动扩展。

106.如何进行存储卷(volume)的使用?

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

107.什么是Init容器(Init Container)?

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

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

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

109.如何监控kuberenetes集群?

可以使用kubernetes内置的指标和日志系统,如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的生命周期钩子(Lifecycle Hooks)是一种机制,允许在容器的生命周期中特定点执行用户定义的操作,通过这些钩子,用户可以在容器启动和终止时执行自定义的逻辑,这对于在容器的启动前准备环境,或在容器终止前进行清理操作非常有用。

例如:生命周期钩子可以在Pod的定义中通过`lifecycle`字段进行配置,以下是一个示例,展示了如何配置`PostStart`和`preStop`钩子:

 

在这个示例中:

`PostStart`钩子会在容器启动后立即执行,并输出`hello from PostStart handler`

`PreStop`钩子会在容器终止之前执行,并输出`Goodbye from the PreStop handler`

112.什么是Pod的探针(Probe)?

Pod的探针用于定期检查容器的健康状态。kubernetes支持三种类型的探针:存活探针(LivenessProbe)、就绪探针(Readiness Probe)和启动探针(Startup Probe)。

113.什么是Kubernetes的安全性措施?

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

114.什么是容器资源限制(Resource Limit)和容器资源请求(Resource Request)?

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

115.什么是Kubernetes中的水平和垂直扩展?

水平扩展(Horizontla Scaling)指的是增加Pod副本数来处理更多的负载。

垂直扩展(Vertical Scaling)指的是增加或减少的单个Pod的资源限制。

116.什么是Kubernetes的事件(Event)?

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

117.什么是Helm?

Helm是一个k8s的包管理工具,它简化了应用程序在k8s集群中的部署、管理和维护。

概念对比举例:类似rpm包和yum之间的关系。yaml和helm

k8s传统方式:类似于:rpm安装包的方式,逐步进行安装,遇到依赖还得解决依赖问题。

helm方式:类似于:yum安装,一键封装进行安装,自动解决依赖问题。

传统k8s和helm的各方面的对比:

1).部署方式方面:

使用k8s方式部署Pod应用程序:需要手动编写和管理多个YAML文件,定义各种kubernetes资源,逐步部署。

使用helm方式部署Pod应用程序:通过Helm Charts将应用程序及所有依据打包成一个单独的包,可以轻松快速部署。

2).管理和升级方面

k8s:k8s本身没有内置的版本管理机制,需要手动管理应用程序的版本。

helm:helm维护应用程序的版本历史,可以轻松进行版本升级和回滚。

3).重用性和共享:

k8s:手动管理资源文件,资源文件通常是项目专用的,缺乏直接的共享和复用机制

helm:Helm Cahrts有公用的模版yaml文件,通过传递不同的变量,快速拉起一套新的服务,可以在不同环境中复用,并且可以共享和分发到Helm仓库。

118.如何进行Kubernetes集群的高可用性配置?

配置k8s集群高可用性(High Avaliability:HA)是确保集群在节点或组件发生故障时仍能正常运行的关键步骤。

高可用性配置主要涉及以下几个方面:

1).控制平面的高可用性

控制平面包括 APIServer、Controller Manager、Scheduler等组件,确保这些组件的高可用性是首要任务。

部署多个控制平面节点(通常为3个或5个)以实现高可用性,这样即使一个或两个节点发生故障,集群仍能正常工作。

2).etcd的高可用性

etcd是k8s的后端数据存储,确保etcd的高可用性至关重要

部署奇数个etcd实例(如3个或5个),并确保这些实例分布在不同的节点上。

3).工作节点的高可用性

工作节点运行用户的应用程序Pod。确保这些节点的高可用性是保证应用程序正常运行的基础,

将工作节点分布在多个可用区(Availability Zones)或物理机房,以减少单点故障的风险。

4).网络插件和负载均衡的高可用性

网络插件负责pod之间的通信,负载均衡则分发流量,确保他们的高可用性至关重要。

选择支持高可用的配置和网络插件(如Calico、Flannel、Weave),并配置冗余路径,以确保网络插件组件的高可用性。

使用云提供商的负载均衡器(如 AWS ELB、GCP LB)或开源负载均衡解决方案(如 MetaILB),并配置冗余实例,以确保流量分发的高可用性。

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

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

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

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

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

 

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

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

123.怎样从一个镜像创建一个Pod?

可以使用kubectl命令行工具或编写一个Pod的YAML文件,然后使用kuebctl apply 命令创建Pod.

124.如何将应用程序部署到Kubernetes?

可以使用Deployment、StatefulSet或DaemonSet等资源对象来部署应用程序。

125.如何水平扩展Deployment?

可以通过更改Deployment的副本数来水平扩展应用程序,例如,使用kubectl scale 命令或更改Deployment的replicas字段。

126.怎样在Kubernetes中进行服务发现?

在k8s中服务发现是指在集群中如何找到和访问其他服务或应用程序。k8s提供了多种内置的服务发现机制,主要包括:环境变量、DNS和Headless Service。

以下是对k8s中服务发现机制的详细介绍:

环境变量方式:

当一个Pod被创建时,k8s会自动为同一个命名空间内的所有Service创建环境变量。这些环境变量可以用于Pod内部来访问这些服务

DNS方式:

k8s内置了一个DNS服务(通常是:CoreDNS),他会自动为集群中的每个服务创建DNS记录。Pod可以使用这些DNS记录来访问服务。

Headless Service方式:

Headless Service是一种特殊类型的服务,不会分配一个集群IP地址,而是直接返回后端Pod的IP地址。它通常用于Stateful应用程序或需要直接访问Pod的场景。

127.如何进行滚动更新(Rolling Update)?

 可以通过更新Deployment的Pod模版或修改Rolling Update策略来执行滚动更新。

128.怎样进行容器间通信?

 可以使用Pod的内部IP地址和端口进行容器间通信。此外,也可以使用Service对象来提供稳定的网络访问。

129.如何进行安全访问控制(RBAC)?

可以使用Kubernetes的Role-Based Access Control (RBAC)机制来定义和管理用户对集群资源的访问控制。

130.怎样进行热更新(Hot Deployment)?

热更新(Hot Deployment)是指在不停止应用程序的情况下,更新应用程序的代码或配置,是新的代码或配置立即生效,从而实现应用程序的无缝更新。

1).使用Deployment和配置滚动更新策略。

Deployment对象支持滚动更新策略,可以实现无缝的热更新,滚动更新会逐步替换旧版本的Pod为新版本的Pod,确保在更新过程中服务的高可用性。

2).使用DaemonSet部署方式的更新

如果你的应用程序使用DaemonSet部署,可以使用以下方式进行热更新。

步骤:更新DaemonSet的Pod模版,修改镜像版本或配置---k8s会自动在每个节点上更新DaemonSet中的Pod

3).使用StatefulSet部署方式的更新:

对于有状态应用程序,可以使用Statefulset来进行热更新

步骤:更新Statefuset的Pod模版,修改镜像版本或配置—StatefulSet会按照定义的更新策略逐步替换Pod。

通过以上方式,可以实现在Kubernetes环境中的热更新,无需停止应用程序或影响其他可用性,确保了应用程序的持续可用和服务的稳定性。

131.如何在Prometheus中定义监控指标?

1).定义和暴露指标

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

2).配置Prometheus抓取指标

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

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.如何设置警报规则并配置Alertmanager?

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

135.Prometheus支持那些查询操作和聚合函数?

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

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

Prometheus提供多种服务发现机制,如静态配置、文件发现、Consul、kubernetes等,用于自动发现和住区要监控的目标。

静态配置:这是最简单的方式,用户手动在Prometheus配置文件中指定目标的列表。适用于少量且不经常变化的目标。

文件发现:通过指定一个文件路径,Prometheus定期读取该文件以获取目标列表。文件内容是一个YAML或JSON格式的目标定义,这种方法适合使用外部脚步生成目标列表的场景。

consul:通过集成Consul,Prometheus可以发现注册在Consul中的服务,consul是一个流行的服务发现和配置工具,常用于微服务架构中。

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

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

Prometheus的可视化和查询界面主要有两个:Prometheus自身的内置查询界面(Prometheus Expression Browser)和与Prometheus紧密集成的Grafana。

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

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

138.什么是Prometheus的推模式(Push)和拉模式(Pull)抓取?

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

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

推模式:客户端主动推送,监控数据由客户端主动推送到中间的Pushgatway,再由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高可用性的步骤:

(1).部署多个Prometheus实例

首先,需要部署多个Prometheus实例,并确保他们监控相同的目标(targets)。

(2).部署Thanos Sidecar

每个Prometheus实例都需要部署一个Thanos sidecar,用于将Prometheus的数据上传到远程对象存储,并提供Thanos的查询和聚合功能。

为每个Prometheus实例部署一个Thanos Sidecar,部署Prometheus实例并配置其运行参数,同时在同一Pod中部署Thanos Sidecar.

Thanos Sidecar需要连接到Prometheus,并将数据上传到对象存储。Thanos Sidecar配置中指定了Prpmetheus的地址和数据存储路径。

(3).配置对象存储

Thanos Sidecar需要配置对象存储(如Amazon S3、Google Cloud storage等)来存储时序数据。

(4).部署Thanos Store、Querier、Compactor和Bucket Web

这些组件用于从对象存储中读取数据、进行查询、数据压缩和合并,并提供查询接口。

这样,即使一个Prometheus实例宕机,另一个实例仍然可以继续收集数据,确保监控系统的高可用性,同时,通过Thanos 组件,可以实现数据的长期存储和统一查询。

141.什么是Prometheus的持续查询?

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

142.Kubernetes中RBAC(Role-Based Access Control)是什么?如何配置和管理RBAC?

在kubernetes中,RBAC(Role-Based Access Control)是一种用于管理对集群资源的访问权限的安全机制。RBAC通过定义角色(Roles)和角色绑定(Role Bindings)来控制用于或服务账号对于集群中资源的操作权限。

Roles:角色定义了一组操作权限,例如可以读取、创建、或修改某些资源的权限。

Role Bindings:角色绑定将用户、组或服务账号绑定到角色上,从而赋予其角色定义的权限。

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

1).k8s中创建secrets资源:

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

2).通过环境变量,使用Secret资源

可以将secrets中的数据作为环境变量传递给容器,这样容器就可以从环境变量中读取敏感信息。

在pod中使用Secret作为环境变量

 

3).通过挂载,使用Secret资源

将Secrets挂载为文件系统中的文件,是容器可以直接读取文件中的敏感信息。

144.Kubernetes中如何管理容器的安全性?可以列举几种最佳实践吗?

1).使用最小特权原则

Least Priviege 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(Role-Based Access Control)和其他认证机制(如OIDC、LDAP)确保只有授权用户或服务能够访问Kubernetes资源和容器。

6).定期更新和维护

Regular Updates and Maintenance:及时更新Kubernetes集群和容器中使用的操作系统、库和应用程序,以修改已知的安全漏洞。

7).监控和审计

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

8).使用安全审计工具和服务

Security Audit Tools and Services:使用安全审计工具(如Kube-bench、kube-hunter)来评估和检查kubernetes集群的安全性,及时发现和解决潜在的安全问题。

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

1).使用kubectl命令行工具

Kubernetes提供了kubectl工具,可以通过以下命令查看Pod的日志

# kubecelt logs <pod-name> [<container-name>] [-n <namespace>]

2).使用Kubernetes Dashboard

Kubernetes Dashboard 提供了一个Web界面,可以查看Pod的详细信息和日志。在Dashboard中,找到Pod并选择相应的容器,既可查看其日志。

146.如何使用Kubernetes进行多环境部署(如开发、测试和生产环境)?

1).使用命名空间(Namespaces)

Kubernetes中的命名空间是用于逻辑隔离和资源分组的一种方式,可以为每个环境(如开发、测试、生产)

创建单独的命名空间,以便隔离和管理资源。

2).使用环境变量和配置文件

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

3).使用标签(Lables)和选择器(Selectors)

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

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

1).使用ConfigMap和Secret

Kubernetes中的ConfigMap和Secret对象可以用来存储应用程序的配置信息和敏感数据,它们提供了一种集中管理配置的方式,并且支持动态更新。

2).使用环境变量

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

148.Kubernetes与CI/CD工具(如Jenkins、GitLab CI等)的集成方式有哪些?

1).使用Kubernets插件或插件集成

许多CI/CD工具提供了专门的Kubernetes插件或集成选项,使得在构建和部署流水线中可以直接操作Kubenetes集群,例如: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等对象的配置和数据。

增量备份:

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

周期性备份:

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

存储多个备份版本:

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

2).备份方法

(1).使用etcd备份

kubernetes的所有集群状态数据存储在etcd中,因此备份etcd数据是恢复整个集群状态的关键。

手动备份etcd数据: # ETCDCTL_API=3 etcdctl snapshot save /path/to/snapshot.db

自动化备份etcd数据:使用velero 工具自动化备份etcd数据

(2).使用备份工具本分verlero(有兴趣可以了解一下,可支持全集群备份和增量备份)

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

150.Kubernetes中如何管理和优化资源(如CPU、内存)的使用?

1).资源请求和限制(配置Requests和Limits)

资源请求Requests:pod可以指定对CPU和内存的最小需求量。

k8s使用这些请求来调度pod到适当的节点上,并确保节点上有足够的资源可用pod的正常运行。

资源限制Limits:Pod可以使用的最大资源量。

这有助于防止pod消耗过多资源,并可能导致其他pod受影响。

2).水平和垂直扩展

水平扩展(HPA):HPA根据指定的CPU或内存使用率监控指标自动调整Pod的副本数量,以满足应用程序的负载需求,从而确保资源的合理使用和效率。

垂直扩展(VPA):VPA可以自动调整Pod的资源请求和限制比例,以匹配其实际使用情况,从而优化资源利用率和性能。

3).节点资源管理

节点资源管理:可以设置节点级别的资源配置,限制节点上运行的pod使用的资源总量,避免资源竞争和过渡分配。

节点选择器和亲和性/反亲和性:通过节点选择器和亲和性/反亲和性规则,可以更精确地控制Pod在节点上的调度,以确保资源的有效利用和负载均衡。

4).资源监控和优化

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

1).使用基础镜像的最新版本

选择官方和信任的基础镜像;始终选择来自官方源或受信任的镜像仓库的基础镜像,并确保及时更新到最新版本。

2).定期更新容器镜像

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

3).使用漏洞扫描工具

漏洞扫描:使用漏洞扫描工具(Clair、Trivy、Aqua Security等)扫描容器镜像,及时发现和修复镜像中的安全漏洞。

4).更新应用程序和依赖项

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

5).配置安全上下文

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

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

kubernetes提供了多种机制来实现故障转移和自动恢复。

包括:控制器对象(如:ReplicaSet、Deployment)、自动重启和健康检查、控制平面自我修复的高可用性以及水平扩展和负载均衡。

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

Deployment:是k8s中的一种高级控制器,建立在ReplicaSet之上,提供了应用部署、更新和滚动回滚的功能,Deployment可以指定pod的副本数量,并且支持自动故障恢复。

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

控制平面自我修复:

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

水平扩展和负载均衡:

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

———————————————————————————————————————————————————————————————————————————

                                                                                                                         无敌小马爱学习

posted on 2025-04-23 22:27  马俊南  阅读(70)  评论(0)    收藏  举报