k8s概述
文章目录
- 一、什么是Kubernetes
- 1、官网链接
- 2、概述
- 3、特点
- 4、功能
- 二、Kubernetes架构
- 1、架构图
- 2、核心组件
- 2.1、控制平面组件(Control Plane Components)
- 2.1.1、kube-apiserver
- 2.1.2、etcd
- 2.1.3、kube-scheduler
- 2.1.4、kube-controller-manager
- 2.2、Node组件
- 2.2.1、kubelet
- 2.2.2、kube-proxy
- 2.2.3、容器运行时(Container Runtime)
- 2.3、插件(Addons)
- 3、Kubernetes核心概念
- 3.1、pod
- 3.1.1、概述
- 3.1.2、pod生命周期
- 3.1.4、pod状态
- 3.1.5、pod创建过程
- 3.1.6、pod终止过程
- 3.2、Service
- 3.2.1、概述
- 3.2.2、service的类型
- 3.3、RC
- 3.3.1、概述
- 3.3.2、功能
- 3.4、Namespace
- 3.4.1、概述
- 3.4.2、默认提供的三个Namespace
- 3.4.3、基本操作
- 3.5、Deployment
- 3.5.1、概述
- 3.5.2、功能
- 3.5.3、示例
- 3.6、StatefulSet
- 3.6.1、概述
- 3.6.2、功能
- 3.6.3、示例
- 3.7、DaemonSet
- 3.7.1、概述
- 3.7.2、功能
- 3.8、PV(PersistentVolume,持久卷)
- 3.8.1、概述
- 3.8.2、功能
- 3.9、PVC(PersistentVolumeClaim,持久卷申领)
- 3.9.1、概述
- 3.9.2、功能
- 3.9.3、工作流程
- 三、Kubernetes常见命令
- 1、kubectl 命令的语法
- 2、集群管理命令
- 2.1、显示集群的基本信息
- 2.2、切换到指定的上下文
- 2.3、列出集群中的节点
- 2.4、显示节点的详细信息
- 3、命令空间管理命令
- 3.1、列出所有命名空间
- 3.2、创建一个命令空间
- 3.3、删除一个命令空间及其所有的资源
- 3.4、设置当前上下文的命名空间
- 4、资源查看和操作命令
- 4.1、列出指定类型的资源
- 4.2、显示指定资源的详细信息
- 4.3、根据 YAML 文件创建资源
- 4.4、根据 YAML 文件创建或更新资源
- 4.5、删除指定的资源
- 5、Pod相关命令
- 5.1、列出所有 Pod
- 5.2、显示 Pod 的详细信息
- 5.3、 查看 Pod 的日志
- 5.4、在 Pod 内部执行命令
- 6、服务相关命令
- 6.1、列出所有服务
- 6.2、显示服务的详细信息
- 6.3、将本地端口转发到 Pod 的端口
- 7、部署相关命令
- 7.1、列出所有部署
- 7.2、显示部署的详细信息
- 7.3、扩展或缩减部署的副本数量
- 8、配置和密钥相关命令
- 8.1、创建配置映射
- 8.2、创建密钥
- 9、水平自动扩展
- 9.1、创建水平自动扩展
- 9.2、列出所有水平自动扩展
- 9.3、显示水平自动扩展的详细信息
- 10、集群节点管理
- 10.1、标记节点为不可调度状态
- 10.2、取消标记节点的不可调度状态
- 10.3、逐渐驱逐节点上的 Pod 并将其删除
- 11、配置文件操作
- 11.1、从目录中递归地创建或更新所有资源
- 11.2、比较文件中的配置与集群中的当前配置的差异
- 11.3、获取资源的 YAML 配置
- 11.4、编辑资源的配置
- 12、高级资源查询和筛选命令
- 12.1、列出所有命名空间中的指定类型的资源
- 12.2、根据标签筛选指定类型的资源
- 13、持久化存储
- 13.1、列出所有持久卷
- 13.2、列出所有持久卷声明
- 13.3、显示持久卷的详细信息
- 13.4、显示持久卷声明的详细信息
- 14、集群状态和健康检查命令
- 14.1、显示集群组件的状态
- 14.2、显示集群组件的状态的简写形式
- 14.3、实时监视节点的状态变化
- 15、状态和调试
- 15.1、列出集群中的事件
- 15.2、显示指定事件的详细信息
- 15.3、显示集群节点的资源使用情况
- 15.4、显示集群中 Pod 的资源使用情况
- 16、执行命令和调试容器内部
- 16.1、在 Pod 内部执行命令
- 16.2、查看 Pod 的日志
- 16.3、实时跟踪 Pod 的日志输出
- 17、集群网络相关
- 17.1、列出所有服务
- 17.2、显示服务的详细信息
- 17.3、暴露部署的端口
- 18、升级和回滚应用程序
- 18.1、更新部署中容器的镜像
- 18.2、检查部署的滚动更新状态
- 18.3、查看部署的历史版本
- 18.4、回滚部署到先前的版本
- 19、节点调度和亲和性
- 19.1、为节点添加标签
- 19.2、删除节点上的标签
- 19.3、在节点上设置容忍性
一、什么是Kubernetes
1、官网链接
k8s中文官网:kubernetes.io
Github:github.com/kubernetes/kubernetes
2、概述
K8s,全称Kubernetes,是一个开源的容器编排和管理平台,用于自动部署、扩展和管理容器化应用程序的开源系统。Kubernetes由Google在2014年开源,基于其内部容器管理系统Borg的理念发展而来。"K8s"这个名字来源于将"ubernetes"之间的8个字母用"8"来代替的缩写形式。
k8s 本质上就是用来简化微服务的开发和部署的,关注点包括自愈和自动伸缩、调度和发布、调用链监控、配置管理、Metrics 监控、日志监控、弹性和容错、API 管理、服务安全等,k8s 将这些微服务的公共关注点以组件形式封装打包到 k8s 这个大平台中,让开发人员在开发微服务时专注于业务逻辑的实现,而不需要去特别关系微服务底层的这些公共关注点,大大简化了微服务应用的开发和部署,提高了开发效率。
3、特点
1、可移植: 支持公有云,私有云,混合云,多重云(multi-cloud)
2、可扩展: 模块化, 插件化, 可挂载, 可组合
3、自动化: 自动部署,自动重启,自动复制,自动伸缩/扩展
4、快速部署应用,快速扩展应用
5、无缝对接新的应用功能
6、节省资源,优化硬件资源的使用
4、功能
- 容器编排:自动部署和管理容器,确保指定数量的容器副本始终运行。
- 服务发现与负载均衡:自动发现容器应用的服务,并在容器间分配网络流量。
- 自动扩展:根据CPU、内存等资源利用率自动增加或减少容器的数量。
- 存储编排:自动化管理存储卷的挂载与卸载,支持多种存储解决方案。
- 自我修复:当容器或节点失败时,自动重启容器或重新调度到其他节点。
- 密钥与配置管理:安全地存储和分发敏感信息,如密码、OAuth tokens等。
- 滚动更新与回滚:支持平滑地更新应用,同时提供一键回滚功能以应对新版本问题。
二、Kubernetes架构
1、架构图
2、核心组件
2.1、控制平面组件(Control Plane Components)
控制平面组件会为集群做出全局决策,比如资源的调度。 以及检测和响应集群事件。
2.1.1、kube-apiserver
kube-apiserver
集群中所有资源的统一访问入口;提供http Rest接口,完成集群管理,资源配额,访问控制,认证授权,以及对etcd的操作。
2.1.2、etcd
etcd
一致且高可用的键值存储,用作 Kubernetes 所有集群数据的后台数据库。保存集群中的所有资源对象的数据。是Kubernetes的存储状态数据库
etcd不仅能够提供键值数据存储,而且还为其提供了监听机制,用于监听和推送变更。Kubernetes集群系统中,etcd中的键值发生变化时会通知到api server。
2.1.3、kube-scheduler
kube-scheduler
负责资源调度,将新创建的pod调度到合适的节点上。监听Apiserver,查询是否有未调度的pod。
2.1.4、kube-controller-manager
kube-controller-manager
集群中所有资源对象的自动化控制中心;负责pod和node的管理,常见的控制器有节点控制器,服务控制器,副本控制器,服务账户和令牌控制器等
2.2、Node组件
2.2.1、kubelet
kubelet
在每个 Node 上运行,负责维护 Pod 的生命周期。从 API Server 获取 Pod 的期望状态,与容器运行时(如 Docker)交互,管理 Pod 的创建、启动、停止,并将节点状态报告给 API Server。
2.2.2、kube-proxy
kube-proxy
负责为Service提供cluster内部的服务发现和负载均衡,将对service的访问转发到后端的一组pod上;监听 API Server 中 Service 和 Endpoint 的变化,按需为service资源对象生成iptables或者ipvs规则,从而捕获当前service的流量并将其转发至正确的后端pod对象。
2.2.3、容器运行时(Container Runtime)
容器运行时(Container Runtime)
容器运行时是负责管理 Kubernetes 环境中容器的执行和生命周期。Kubernetes 支持许多容器运行环境,例如 containerd、 CRI-O 以及 Kubernetes CRI (容器运行环境接口) 的其他任何实现。
2.3、插件(Addons)
插件(Addons)
插件使用 Kubernetes 资源(DaemonSet、 Deployment 等)实现集群功能。 因为这些插件提供集群级别的功能,插件中命名空间域的资源属于
kube-system
命名空间。
组件名称 | 说明 |
---|---|
kube-dns | 负责为整个集群提供DNS服务 |
Ingress Controller | 为服务提供外网入口 |
Heapster | 提供资源监控 |
Dashboard | 提供GUI |
Federation | 提供跨可用区的集群 |
Fluentd-elasticsearch | 提供集群日志采集、存储与查询 |
3、Kubernetes核心概念
3.1、pod
3.1.1、概述
Pod 是 Kubernetes 中最小的调度和管理单元,它代表着集群中运行的一个或多个容器实例。在一个 Pod 中,所有容器共享相同的网络命名空间、进程命名空间和存储卷,因此它们可以互相通信和共享数据。Pod 可以通过控制器进行创建、扩缩容和更新等操作。
同一个Pod下的多个容器共用一个IP,所以不能出现重复的端口号.一个Pod下的多个容器可以使用localhost加端口号的方式来访问对方的端口.理论上就是创建了一系列独立的Linux Namespace
,然后同一个Pod下的所有容器都使用这个Linux Namespace
.
3.1.2、pod生命周期
pod生命周期有的5种状态(也称5种相位)
- Pending(挂起):API server已经创建pod,但是该pod还有一个或多个容器的镜像没有创建,包括正在下载镜像的过程;
- Running(运行中):Pod内所有的容器已经创建,且至少有一个容器处于运行状态、正在启动括正在重启状态;
- Succeed(成功):Pod内所有容器均已退出,且不会再重启;
- Failed(失败):Pod内所有容器均已退出,且至少有一个容器为退出失败状态
- Unknown(未知):某于某种原因api-server无法获取该pod的状态,可能由于网络通行问题导致;
3.1.4、pod状态
- ContainerCreating(容器正在创建):容器正在创建中
- Pending(挂起):API server已经创建pod,但是该pod还有一个或多个容器的镜像没有创建,包括正在下载镜像的过程;
- Running(运行中):Pod内所有的容器已经创建,且至少有一个容器处于运行状态、正在启动括正在重启状态;
- MatchNodeSelector (匹配节点选择器):Pod正在等待被调度到匹配其nodeSelector的节点上,当一个Pod定义有节点选择器但没有任何节点存在指定的标签时,Pod将处于“MatchNodeSelector”状态。
- ErrImagePull(镜像拉取异常): 这个错误表示Kubernetes无法从指定的镜像仓库拉取镜像。可能的原因有很多,比如网络问题、镜像名称或标签错误、或者没有权限访问这个镜像仓库等。
- ImagePullBackOff(镜像拉取异常): 这个错误表示Kubernetes尝试拉取镜像,但是失败了,然后它回滚了之前的操作。这通常是因为镜像仓库的问题,比如网络问题、镜像不存在、或者没有权限访问这个镜像仓库等。
- Error(pod异常):可能是容器运行时异常
CrashLoopBackOff(崩溃重启) :Pod正在经历一个无限循环的崩溃和重启过程。 - Succeed(成功):Pod内所有容器均已退出,且不会再重启;
- Failed(失败):Pod内所有容器均已退出,且至少有一个容器为退出失败状态
- Unknown(未知):某于某种原因api-server无法获取该pod的状态,可能由于网络通行问题导致;
3.1.5、pod创建过程
使用kubectl run命令创建的pod
1、首先,用户通过kubectl或其他api客户端工具提交需要创建的pod信息给api-server;2、api-server验证客户端的用户权限信息,验证通过开始处理创建请求生成pod对象信息,并将信息存入etcd,然后返回确认信息给客户端;3、api-server开始反馈etcd中pod对象的变化,其他组件使用watch机制跟踪api-server上的变动;4、scheduler发现有新的pod对象要创建,开始调用内部算法机制为pod分配最佳的主机,并将结果信息更新至api-server;5、node节点上的kubelet通过watch机制跟踪api-server发现有pod调度到本节点,尝试调用docker启动容器,并将结果反馈api-server;6、api-server将收到的pod状态信息存入etcd中。
使用deployment来创建pod
1、首先,用户使用kubectl create命令或者kubectl apply命令提交了要创建一个deployment资源请求;2、api-server收到创建资源的请求后,会对客户端操作进行身份认证,在客户端的~/.kube文件夹下,已经设置好了相关的用户认证信息,这样api-server会知道是哪个用户请求,并对此用户进行鉴权,当api-server确定客户端的请求合法后,就会接受本次操作,并把相关的信息保存到etcd中,然后返回确认信息给客户端。(仅返回创建的信息并不是返回是否成功创建的结果)3、api-server开始反馈etcd中过程创建的对象的变化,其他组件使用watch机制跟踪api-server上的变动。4、controller-manager组件会监听api-server的信息,controller-manager是有多个类型的,比如Deployment Controller, 它的作用就是负责监听Deployment,此时Deployment Controller发现有新的deployment要创建,那么它就会去创建一个ReplicaSet,一个ReplicaSet的产生,又被另一个叫做ReplicaSet Controller监听到了,紧接着它就会去分析ReplicaSet的语义,它了解到是要依照ReplicaSet的template去创建Pod, 它一看这个Pod并不存在,那么就新建此Pod,当Pod刚被创建时,它的nodeName属性值为空,代表着此Pod未被调度。5、接着调度器Scheduler组件开始介入工作,Scheduler也是通过watch机制跟踪api-server上的变动,发现有未调度的Pod,则根据内部算法、节点资源情况,pod定义的亲和性反亲和性等等,调度器会综合的选出一批候选节点,在候选节点中选择一个最优的节点,然后将pod绑定到该节点,将信息反馈给api-server。6、kubelet组件布署于Node之上,它也是通过watch机制跟踪api-server上的变动,监听到有一个Pod应该要被调度到自身所在Node上来,kubelet首先判断本地是否在此Pod,如果不存在,则会进入创建Pod流程,创建Pod有分为几种情况,第一种是容器不需要挂载外部存储,则相当于直接docker run把容器启动,但不会直接挂载docker网络,而是通过CNI调用网络插件配置容器网络,如果需要挂载外部存储,则还要调用CSI来挂载存储。kubelet创建完pod,将信息反馈给api-server,api-servier将pod信息写入etcd。7、Pod建立成功后,ReplicaSet Controller会对其持续进行关注,如果Pod因意外或被我们手动退出,ReplicaSet Controller会知道,并创建新的Pod,以保持replicas数量期望值。
3.1.6、pod终止过程
1、用户向api-server发送删除pod对象的命令;2、api-server中的pod对象信息会随着时间的推移而更新,在宽限期内(默认30s),pod被视为dead;3、将pod标记为terminating状态;4、kubectl通过watch机制监听api-server,监控到pod对象为terminating状态了就会启动pod关闭过程;5、endpoint控制器监控到pod对象的关闭行为时将其从所有匹配到此endpoint的server资源endpoint列表中删除;6、如果当前pod对象定义了preStop钩子处理器,则在其被标记为terminating后会以同步的方式启动执行;7、pod对象中的容器进程收到停止信息;8、宽限期结束后,若pod中还存在运行的进程,那么pod对象会收到立即终止的信息;9、kubelet请求api-server将此pod资源的宽限期设置为0从而完成删除操作,此时pod对用户已不可见。
3.2、Service
3.2.1、概述
Kubernetes 中 Service 是 将运行在一个或一组 Pod 上的网络应用程序公开为网络服务的方法。
Service 是 Kubernetes 中用于提供内部负载均衡和服务发现的组件,它可以将同一个应用程序的不同副本暴露在集群内部,并为这些副本提供唯一的虚拟 IP 地址和 DNS 域名。Service 可以通过控制器进行创建、更新和删除操作。
3.2.2、service的类型
一般情况下,service都是ClusterIP类型的,通过ingress接入的外部流量。
- ClusterIP:表示service仅供集群内部使用,默认值就是ClusterIP类型
- NodePort:表示service可以对外访问应用,会在每个节点上暴露一个端口,这样外部浏览器访问地址为:任意节点的IP:NodePort就能连上service了
- LoadBalancer:表示service对外访问应用,这种类型的service是公有云环境下的service,此模式需要外部云厂商的支持,需要有一个公网IP地址
- ExternalName:这种类型的service会把集群外部的服务引入集群内部,这样集群内直接访问service就可以间接的使用集群外部服务了
3.3、RC
3.3.1、概述
应用托管在k8s之后,k8s需要保证应用能够持续运行,这就是RC的工作内容。它会确保无论任何时间k8s中都有指定数量的Pod在运行.在此基础上,RC还提供了一些更高级的特性,比如弹性伸缩、滚动升级等。
3.3.2、功能
- 弹性伸缩
- 弹性伸缩是指适应负载的变化,以弹性可伸缩的方式提供资源.反映到k8s中,使之可以根据负载的高低动态调整Pod的副本数量.例如在双十一将Pod数量调整为100,双十一结束后数量调整为10.
- 滚动升级
- 滚动升级是一种平滑过渡的升级方式,通过逐步替换的策略,来保证系统的整体稳定性,在初始升级的时候就可以及时发现问题并进行调整,以保证问题的影响程度不会被扩大.回退操作通过滚动升级的逆操作即可完成.
3.4、Namespace
3.4.1、概述
Namespace 是一种将集群资源进行逻辑隔离的方法,允许将不同的资源(如Pods、Services、Deployments等)分组在一起,并为这些资源提供一个唯一的、可区分的作用域。Namespace有助于实现多租户环境、团队间的工作隔离以及资源的组织和管理。
Namespace中包含的资源通常有:Pod、Service和RC等.但是一些较底层的资源并不属于任何一个Namespace。如Node、 PersistentVolume。同一个Namespace下的资源名称必须是唯一的,但是 不同Namespace下的资源名称可以重复。
3.4.2、默认提供的三个Namespace
Kubernetes 默认提供三个Namespace:
default
、kube-system
和kube-public
。
default
是没有明确指定Namespace时资源被创建的地方;kube-system
通常包含集群的核心组件和服务;kube-public
是一个可读的Namespace,用于存放希望集群内所有用户都能访问的公共资源。
3.4.3、基本操作
-
创建Namespace:可以通过YAML配置文件或者直接使用
kubectl
命令来创建Namespace。例如,使用命令创建名为my-namespace
的Namespace:kubectl create namespace my-namespace
-
指定Namespace:在创建或管理资源时,可以通过
-n
或--namespace
参数指定操作的Namespace。如:kubectl get pods -n my-namespace
-
删除Namespace时需谨慎,因为这会一并删除该Namespace下所有未被其他对象引用的资源。使用以下命令删除Namespace:
kubectl delete namespace my-namespace
3.5、Deployment
3.5.1、概述
Deployment 是 Kubernetes 中用于管理 Pod 副本集的控制器,Deployment自动管理关联的ReplicaSet,从而间接控制Pod的数量和状态。它可以控制一组 Pod 的创建、扩缩容和更新等操作。Deployment 支持滚动更新和回滚等功能,可以实现无缝的应用程序版本升级。
3.5.2、功能
- 滚动更新:可以逐步更新应用,先部署新版本的Pod,同时保持旧版本运行,直至所有Pod都更新到新版本。
- 自动回滚:如果检测到部署失败(比如健康检查不通过),Deployment可以自动回滚到之前的稳定版本。
- 版本控制:保留历史版本记录,方便查看和回滚到任意历史版本。
- 扩容与缩容:轻松调整应用实例数量,以应对负载变化。
- 声明式更新:通过修改Deployment的配置即可触发更新,无需手动干预每个Pod。
3.5.3、示例
其中创建了一个 ReplicaSet,负责启动三个
nginx
Pod
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploymentlabels:app: nginx
spec:replicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.14.2ports:- containerPort: 80
- 创建名为
nginx-deployment
(由.metadata.name
字段标明)的 Deployment。 该名称将成为后续创建 ReplicaSet 和 Pod 的命名基础。- 该 Deployment 创建一个 ReplicaSet,它创建三个(由
.spec.replicas
字段标明)Pod 副本。.spec.selector
字段定义所创建的 ReplicaSet 如何查找要管理的 Pod。 在这里,你选择在 Pod 模板中定义的标签(app: nginx
)。 不过,更复杂的选择规则是也可能的,只要 Pod 模板本身满足所给规则即可。- template字段包含以下子字段:
- Pod 被使用
.metadata.labels
字段打上app: nginx
标签。- Pod 模板规约(即
.template.spec
字段)指示 Pod 运行一个nginx
容器, 该容器运行版本为 1.14.2 的nginx
Docker Hub 镜像。- 创建一个容器并使用
.spec.template.spec.containers[0].name
字段将其命名为nginx
。
3.6、StatefulSet
3.6.1、概述
StatefulSet 是一种专门用于管理有状态应用的工作负载的资源对象。与用于无状态应用的Deployment或ReplicaSet不同,StatefulSet为每个Pod提供了持久性唯一的标识符和稳定的存储,确保即使在Pod重启或规模变化时也能维持应用的状态一致性。
3.6.2、功能
- 持久身份:每个Pod都有一个唯一的、持久的标识符,通常格式为
statefulset-name-ordinal
(例如mysql-0
、mysql-1
),其中ordinal从0开始递增。这保证了Pod的可预测性和持久性,即便Pod重启或迁移,其网络标识符和存储也不会改变。 - 有序操作:StatefulSet保证Pod的创建、更新和删除按照Pod的ordinal顺序进行,这对于有状态应用(如数据库集群)来说至关重要,因为它们往往依赖于严格的初始化顺序或主从关系。
- 稳定存储:通过Persistent Volume Claims (PVCs) 实现持久化存储,确保每个Pod实例都能绑定到专属的存储资源,即使Pod重建或迁移,数据也不会丢失。
- 网络拓扑:为每个Pod提供固定的网络标识和稳定的网络接口,确保Pod间通信的一致性,这对于需要持久连接的应用场景(如分布式数据库)非常重要。
3.6.3、示例
apiVersion: v1
kind: Service
metadata:name: nginxlabels:app: nginx
spec:ports:- port: 80name: webclusterIP: Noneselector:app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:name: web
spec:selector:matchLabels:app: nginx # 必须匹配 .spec.template.metadata.labelsserviceName: "nginx"replicas: 3 # 默认值是 1minReadySeconds: 10 # 默认值是 0template:metadata:labels:app: nginx # 必须匹配 .spec.selector.matchLabelsspec:terminationGracePeriodSeconds: 10containers:- name: nginximage: registry.k8s.io/nginx-slim:0.8ports:- containerPort: 80name: webvolumeMounts:- name: wwwmountPath: /usr/share/nginx/htmlvolumeClaimTemplates:- metadata:name: wwwspec:accessModes: [ "ReadWriteOnce" ]storageClassName: "my-storage-class"resources:requests:storage: 1Gi
- StatefulSet部分
- apiVersion:
apps/v1
指定使用Apps API v1版本。- kind:
StatefulSet
表示这是一个有状态应用工作负载。- metadata.name:
web
给StatefulSet起名为web
。- spec
- selector.matchLabels.app: nginx 用于选择已存在的Pods或用来验证新创建的Pods是否属于此StatefulSet,确保它们具有
app: nginx
标签。- serviceName: “nginx” 指定了关联的Service名称,这里与之前定义的Headless Service对应,用于Pod之间的稳定通信和发现。
- replicas: 3 设置副本数量为3,即部署3个Nginx实例。
- minReadySeconds: 10 指定Pod在被认为是就绪前至少需要保持Ready状态的时间,这里是10秒。
- template
- metadata.labels.app: nginx 确保每个Pod被打上正确的标签以匹配StatefulSet的selector。
- spec
- terminationGracePeriodSeconds: 10 容器优雅终止的等待时间,默认为30秒,这里设置为10秒。
- containers
- name: nginx 容器名称。
- image: registry.k8s.io/nginx-slim:0.8 使用的Nginx Slim镜像。
- ports.containerPort: 80 容器暴露的端口。
- volumeMounts
- name: www 挂载卷名称。
- mountPath: /usr/share/nginx/html 容器内的挂载点,Nginx Web内容目录。
- volumeClaimTemplates
- metadata.name: www PVC模板的名称。
- spec
- accessodes: [“ReadWriteOnce”] PVC的访问模式,表示单个节点读写。
- storageClassName: “my-storage-class” 指定存储类名称,用于动态分配PV。
- resources.requests.storage: 1Gi 请求的存储容量为1GiB。
3.7、DaemonSet
3.7.1、概述
在Kubernetes(K8s)中,DaemonSet 是一种控制器资源对象,用于确保在集群的每个节点(或满足特定条件的节点)上运行一个且仅运行一个Pod实例。DaemonSet特别适用于那些需要在每个节点上部署守护进程类型的应用场景,如日志收集、监控代理、节点级安全软件等。
3.7.2、功能
- 节点覆盖性:确保集群中的每个节点(或匹配特定标签的节点)上都有一个Pod运行。当新节点加入集群时,会在该节点上自动创建相应的Pod;节点离开时,则对应的Pod会被清理。
- 单一实例:每个节点上最多只有一个DaemonSet管理的Pod实例,这与Deployment或ReplicaSet维护固定数量的Pod副本不同。
- 自动恢复:如果DaemonSet管理的Pod因某种原因被意外删除或节点故障,Kubernetes会自动在相应节点上重新创建该Pod。
3.8、PV(PersistentVolume,持久卷)
3.8.1、概述
是集群中的一块存储,可以由管理员事先制备, 或者使用存储类(Storage Class)来动态制备。 持久卷是集群资源,就像节点也是集群资源一样。PV 持久卷和普通的 Volume 一样, 也是使用卷插件来实现的,只是它们拥有独立于任何使用 PV 的 Pod 的生命周期。 此 API 对象中记述了存储的实现细节,无论其背后是 NFS、iSCSI 还是特定于云平台的存储系统。
3.8.2、功能
- 静态配置:管理员手动创建PV,并定义其大小、访问模式(如ReadWriteOnce、ReadOnlyMany、ReadWriteMany)、存储类等。
- 资源抽象:PV为存储资源提供了统一的抽象,使得存储后端的差异对用户透明。
- 生命周期独立:即使使用PV的Pod被删除,PV本身不会被自动删除,除非设置了回收策略(Retain、Recycle、Delete)。
3.9、PVC(PersistentVolumeClaim,持久卷申领)
3.9.1、概述
表达的是用户对存储的请求。概念上与 Pod 类似。 Pod 会耗用节点资源,而 PVC 申领会耗用 PV 资源。Pod 可以请求特定数量的资源(CPU 和内存)。同样 PVC 申领也可以请求特定的大小和访问模式 (例如,可以挂载为 ReadWriteOnce、ReadOnlyMany、ReadWriteMany 或 ReadWriteOncePod)
3.9.2、功能
- 动态分配:如果不存在合适的PV,Kubernetes可以根据PVC的请求参数自动创建PV(需要存储类支持动态分配)。
- 资源请求:PVC中声明了所需的存储大小、访问模式等需求,Kubernetes会尝试找到符合条件的PV并与之绑定。
- 可移植性:PVC使得应用可以在不同节点间迁移,而存储资源随之迁移,保持数据的连续性。
3.9.3、工作流程
- 创建PV:管理员定义并创建PV,指定存储资源的大小、访问模式、存储类型等。
- 创建PVC:开发者或应用通过PVC声明需要的存储资源,指定存储大小、访问模式等要求。
- 绑定:Kubernetes自动将PVC与满足条件的PV绑定,或根据PVC需求动态创建PV后绑定。
- 挂载:Pod在创建时,通过引用PVC,Kubernetes会自动将PV挂载到Pod的指定路径,使Pod可以访问存储资源。
- 释放与回收:当不再需要存储资源时,删除PVC,Kubernetes会根据PV的回收策略回收存储资源。
三、Kubernetes常见命令
1、kubectl 命令的语法
kubectl [command] [TYPE] [NAME] [flags]
- command: 指定要对资源执行的操作子命令。常见的命令包括
get
,describe
,create
,apply
,delete
,exec
,logs
,rollout
, 等。 - TYPE: 要操作的资源类型。Kubernetes 中的资源类型有很多,比如
pods
,services
,deployments
,replicasets
,configmaps
,secrets
,nodes
, 等。这个字段可以是资源类型的单数、复数形式或其简写。 - NAME: 资源的名称。当你想要操作特定的资源实例时,需要指定它的名字。
- flags: 可选参数,用于进一步指定命令的行为。例如,
-o wide
用于获取更多列出来的信息,--dry-run
用于查看操作的效果而不实际执行,-n NAMESPACE
用于指定操作的命名空间等。
2、集群管理命令
2.1、显示集群的基本信息
kubectl cluster-info
2.2、切换到指定的上下文
kubectl config use-context <context_name>
2.3、列出集群中的节点
kubectl get nodes
2.4、显示节点的详细信息
kubectl describe node <node_name>
3、命令空间管理命令
3.1、列出所有命名空间
kubectl get namespaces
3.2、创建一个命令空间
kubectl create namespace <namespace_name>
3.3、删除一个命令空间及其所有的资源
kubectl delete namespace <namespace_name>
3.4、设置当前上下文的命名空间
kubectl config set-context --current --namespace=<namespace_name>
4、资源查看和操作命令
4.1、列出指定类型的资源
kubectl get <resource_type>
4.2、显示指定资源的详细信息
kubectl describe <resource_type> <resource_name>
4.3、根据 YAML 文件创建资源
kubectl create -f <yaml_file>
4.4、根据 YAML 文件创建或更新资源
kubectl apply -f <yaml_file>
4.5、删除指定的资源
kubectl delete <resource_type> <resource_name>
5、Pod相关命令
5.1、列出所有 Pod
kubectl get pods
5.2、显示 Pod 的详细信息
kubectl describe pod <pod_name>
5.3、 查看 Pod 的日志
kubectl logs <pod_name>
5.4、在 Pod 内部执行命令
kubectl exec -it <pod_name> -- <command>
6、服务相关命令
6.1、列出所有服务
kubectl get services
6.2、显示服务的详细信息
kubectl describe service <service_name>
6.3、将本地端口转发到 Pod 的端口
kubectl port-forward <pod_name> <host_port>:<container_port>
7、部署相关命令
7.1、列出所有部署
kubectl get deployments
7.2、显示部署的详细信息
kubectl describe deployment <deployment_name>
7.3、扩展或缩减部署的副本数量
kubectl scale deployment <deployment_name> --replicas=<replica_count>
8、配置和密钥相关命令
8.1、创建配置映射
kubectl create configmap <configmap_name> --from-file=<file_path>
8.2、创建密钥
kubectl create secret <secret_type> <secret_name> --from-literal=<key>=<value>
9、水平自动扩展
9.1、创建水平自动扩展
kubectl autoscale deployment <deployment_name> --min=<min_replicas> --max=<max_replicas> --cpu-percent=<cpu_percentage>
9.2、列出所有水平自动扩展
kubectl get hpa
9.3、显示水平自动扩展的详细信息
kubectl describe hpa <hpa_name>
10、集群节点管理
10.1、标记节点为不可调度状态
kubectl cordon <node_name>
10.2、取消标记节点的不可调度状态
kubectl uncordon <node_name>
10.3、逐渐驱逐节点上的 Pod 并将其删除
kubectl drain <node_name>
11、配置文件操作
11.1、从目录中递归地创建或更新所有资源
kubectl apply -f <directory>
11.2、比较文件中的配置与集群中的当前配置的差异
kubectl diff -f <yaml_file>
11.3、获取资源的 YAML 配置
kubectl get -o yaml <resource_type> <resource_name>
11.4、编辑资源的配置
kubectl edit <resource_type> <resource_name>
12、高级资源查询和筛选命令
12.1、列出所有命名空间中的指定类型的资源
kubectl get <resource_type> --all-namespaces
12.2、根据标签筛选指定类型的资源
kubectl get <resource_type> -l <label_key>=<label_value>
13、持久化存储
13.1、列出所有持久卷
kubectl get pv
13.2、列出所有持久卷声明
kubectl get pvc
13.3、显示持久卷的详细信息
kubectl describe pv <pv_name>
13.4、显示持久卷声明的详细信息
kubectl describe pvc <pvc_name>
14、集群状态和健康检查命令
14.1、显示集群组件的状态
kubectl get componentstatuses
14.2、显示集群组件的状态的简写形式
kubectl get cs
14.3、实时监视节点的状态变化
kubectl get nodes --watch
15、状态和调试
15.1、列出集群中的事件
kubectl get events
15.2、显示指定事件的详细信息
kubectl describe event <event_name>
15.3、显示集群节点的资源使用情况
kubectl top nodes
15.4、显示集群中 Pod 的资源使用情况
kubectl top pods
16、执行命令和调试容器内部
16.1、在 Pod 内部执行命令
kubectl exec -it <pod_name> -- <command>
16.2、查看 Pod 的日志
kubectl logs <pod_name>
16.3、实时跟踪 Pod 的日志输出
kubectl logs -f <pod_name>
17、集群网络相关
17.1、列出所有服务
kubectl get services
17.2、显示服务的详细信息
kubectl describe service <service_name>
17.3、暴露部署的端口
kubectl expose deployment <deployment_name> --port=<port> --target-port=<target_port>
18、升级和回滚应用程序
18.1、更新部署中容器的镜像
kubectl set image deployment/<deployment_name> <container_name>=<new_image>
18.2、检查部署的滚动更新状态
kubectl rollout status deployment/<deployment_name>
18.3、查看部署的历史版本
kubectl rollout history deployment/<deployment_name>
18.4、回滚部署到先前的版本
kubectl rollout undo deployment/<deployment_name>
19、节点调度和亲和性
19.1、为节点添加标签
kubectl label nodes <node_name> <label_key>=<label_value>
19.2、删除节点上的标签
kubectl label nodes <node_name> <label_key>-
19.3、在节点上设置容忍性
kubectl taint nodes <node_name> <taint_key>=<taint_value>:<taint_effect>
相关文章:
k8s概述
文章目录 一、什么是Kubernetes1、官网链接2、概述3、特点4、功能 二、Kubernetes架构1、架构图2、核心组件2.1、控制平面组件(Control Plane Components)2.1.1、kube-apiserver2.1.2、etcd2.1.3、kube-scheduler2.1.4、kube-controller-manager 2.2、No…...
多线程的运用
在现代软件开发中,多线程编程是一个非常重要的技能。多线程编程不仅可以提高应用程序的性能,还可以提升用户体验,特别是在需要处理大量数据或执行复杂计算的情况下。本文将详细介绍Java中的多线程编程,包括其基本概念、实现方法、…...
TF-IDF(Term Frequency-Inverse Document Frequency)算法
TF-IDF(Term Frequency-Inverse Document Frequency)是一种用于文本挖掘和信息检索的统计方法,主要用于评估一个单词在一个文档或一组文档中的重要性。它结合了词频(TF)和逆文档频率(IDF)两个指…...
富格林:细心发现虚假确保安全
富格林指出,现货黄金市场内蕴藏着丰富的盈利机会,然而并非所有人都能够抓住这些机会。要想从市场中获取丰厚的利润并且保障交易的安全,必须要求我们掌握一些交易技巧利用此去发现虚假陷阱。当我们不断汲取技巧过后,才可利用此来发…...
6.2 文件的缓存位置
1. 文件的缓冲 1.1 缓冲说明 将文件内容写入到硬件设备时, 则需要进行系统调用, 这类I/O操作的耗时很长, 为了减少I/O操作的次数, 文件通常使用缓冲区. 当需要写入的字节数不足一个块时, 将数据放入缓冲区, 当数据凑够一个块的大小后才进行系统调用(即I/O操作).系统调用: 向…...
在Elasticsearch中,过滤器(Filter)是用于数据筛选的一种机制
在Elasticsearch中,过滤器(Filter)是用于数据筛选的一种机制,它通常用于结构化数据的精确匹配,如数字范围、日期范围、布尔值、前缀匹配等。过滤器不计算相关性评分,因此比查询(Query࿰…...
MySQL----主键、唯一、普通索引的创建与删除
创建索引 CREATE INDEX index_name ON table_name (column1 [ASC|DESC], column2 [ASC|DESC], ...);CREATE INDEX: 用于创建普通索引的关键字。index_name: 指定要创建的索引的名称。索引名称在表中必须是唯一的。table_name: 指定要在哪个表上创建索引。(column1, column2, ……...
css预处理是什么?作用是什么?
CSS预处理器是一种增强和扩展标准CSS的工具。它们允许开发者使用变量、嵌套规则、Mixin(混合)以及函数等高级功能,以更模块化和可维护的方式编写CSS代码。预处理器如Sass(SCSS)、Less和Stylus等,通过引入这…...
镜像拉取失败:[ERROR] Failed to pull docker image
问题描述 执行 bash docker/scripts/dev_start.sh 命令提示错误: permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post “http://%2Fvar%2Frun%2Fdocker.sock/v1.45/images/create?fromImageregistry.b…...
FM全网自动采集聚合影视搜索源码
源码介绍 FM 全网聚合影视搜索(响应式布局),基于 TP5.1 开发的聚合影视搜索程序,本程序无数据库,本程序内置P2P 版播放器,承诺无广告无捆绑。片源内部滚动广告与本站无关,谨防上当受骗,资源搜索全部来自于网络。 环境…...
【DevOps】什么是 pfSense?免费构建SDWAN
目录 一、详细介绍pfSense 1、 什么是 pfSense? 2、原理 3、 特点 4、 优点 5、 缺点 6、应用场景 7、 典型部署 二、pfSense实战:免费构建企业SD-WAN 1、拓扑图 2、准备工作 3、安装和基本配置pfSense 4、配置VPN 配置IPsec VPN 配置OpenV…...
elementui table超出两行显示...鼠标已入tip显示
elementui el-table超出两行显示…鼠标已入tip显示 方式一 <el-table-column label"描述"prop"note"class-name"myNoteBox"><template slot-scope"scope"><!-- tips悬浮提示 --><el-tooltip placement"to…...
空白服务器安装系统
一、准备工作 确定服务器的硬件配置,包括处理器、内存、硬盘等信息。选择合适的操作系统镜像文件,可以从官方网站或者第三方网站下载。 二、制作启动盘或镜像 如果服务器支持从光盘启动,可以使用光盘制作软件(如UltraISO&#…...
【车载音视频电脑】嵌入式AI分析车载DVR,支持8路1080P
产品特点 采用H.265 & H.264编解码,节约存储空间、传输流量; 高分辨率:支持8路1080P*15FPS/4路1080P*30FPS、720P、D1等编解码; 支持1张SATA硬盘,取用方便,满足大容量存储要求; 支持1个…...
Java实现Mysql批量插入与更新
第一、批量插入语句 Insert({"<script>","INSERT INTO TABLE_NAME (" "ID," "IS_DELETE," "GMT_CREATE," "GMT_MODIFIED" ")VALUES","<foreach collection list item item separator …...
李沐团队发布Higgs-Llama-3-70B,角色扮演专用模型
前言 近年来,大语言模型(LLM)在各个领域都展现出强大的能力,尤其是其在对话、写作、代码生成等方面的应用越来越广泛。然而,想要让 LLM 真正地融入人类社会,扮演各种角色,还需要具备更强大的角…...
2024年护网行动全国各地面试题汇总(4)作者:————LJS
面试过程及回答 自我介绍这里就如实回答的工作经历,参与的项目,尽量简短的把你参与的项目和成果说出来就行 使用过哪些设备,出现误报怎么办 天眼、EDR、全流量告警、态势感知、APT、蜜罐设备先去查看设备的完整流量日志等信息确认是否为误报&…...
秋招突击——6/11——复习{(树形DP)树的最长路径、电话号码的字母组合}——新作{重复序列中前最小的数字}
文章目录 引言复习树形DP——树的最长路径电话号码的字母组合 新作重复序列中前最小的数字个人实现参考实现 总结 引言 这两天可能有点波动,但是算法题还是尽量保证复习和新作一块弄,数量上可能有所差别。 复习 树形DP——树的最长路径 这道题是没有…...
Lua与C交互API接口总结
Lua与C交互 1. 常见Lua相关的C API压入元素查询元素获取元素检查元素栈的相关数据操作 2. C调用Lua核心调用函数示例 3. Lua调用C1. C函数注册到Lua(lua_register)示例2. 批量注册(luaL_Reg)示例 1. 常见Lua相关的C API 压入元素…...
DT浏览器很好用
简单的浏览器,又是强大的浏览器,界面简洁大方,操作起来非常流畅😎,几乎不会有卡顿的情况。 搜索功能也十分强大👍,能够快速精准地找到想要的信息。 而且还有出色的兼容性,各种网页都…...
RabbitMQ实践——在管理后台测试消息收发功能
在《RabbitMQ实践——在Ubuntu上安装并启用管理后台》中,我们搭建完RabbitMQ服务以及管理后台。本文我们将管理后台,进行一次简单的消息收发实验。 赋予admin账户权限 登录到管理后台,进入到用户admin的管理页面 点击“set permission”&a…...
vscode卡顿问题处理(vue-official插件)
vue官方扩展由volar升级为vue-official,部分人的ide会变得非常卡顿,这是由于vscode本身一些问题导致,如下图作者解释: 解决方式: 通过禁用Hybrid模式,不使用tsserver来接管语言支持,卡顿会缓解…...
使用Kube-Bench对Kubernetes进行安全检测
使用Kube-Bench对Kubernetes进行安全检测 1. 工具介绍 Kube-Bench是一个开源的Go语言工具,用于自动化检查Kubernetes集群是否符合CIS Kubernetes基准。这些基准包括一系列关于Kubernetes配置和部署安全性的建议和最佳实践。 Kube-Bench执行了一系列针对Kubernete…...
STM32开发过程中碰到的问题总结 - 1
文章目录 前言1. 怎么生成keil下可以使用的文件和gcc下编译使用的makefile2. STM32的时钟树3.怎么查看keil5下的编译工具链用的是哪个4. Arm编译工具链和GCC编译工具链有什么区别吗?5. 怎么查看Linux虚拟机是x86的还是aarch646. 怎么下载gcc-arm的编译工具链7.怎么修…...
hiberfil.sys文件在Windows系统作用
hiberfil.sys文件在Windows系统中起着关键的作用,主要涉及到计算机的休眠功能。以下是关于hiberfil.sys的详细解释: 定义与功能: hiberfil.sys是Windows休眠功能(Windows Hibernation)将内存数据与会话保存至硬盘所需…...
智能制造前沿:ARMxy工控机在机器人控制中
机器人控制系统正逐步成为现代制造业的核心引擎。在这个过程中,ARMxy工业计算机以其独特的优势,成为了驱动这一变革的关键力量。本文将以自动化装配线机器人为例,探讨ARMxy如何通过其低功耗、高性能特性,以及高度灵活性的设计&…...
【CS.AI】AI引领编程新时代:深度探索GitHub Copilot
文章目录 引言0. TOP TAKEAWAYS 重要要点1. Copilot的基本功能2. 技术原理3. 优势与局限优势局限 4. 使用体验4.1 初次使用4.2 在 JetBrains 全家桶中使用 GitHub Copilot1. 安装插件2. 配置插件3. 使用 GitHub Copilot 4.3 日常开发4.4 体验与反馈 5. 对开发者生态系统的影响5…...
Java:爬虫htmlunit抓取a标签
如果对htmlunit还不了解的话可以参考Java:爬虫htmlunit-CSDN博客 了解了htmlunit之后,我们再来学习如何在页面中抓取我们想要的数据,我们在学习初期可以找一些结构比较清晰的网站来做测试爬取,首先我们随意找个网站如下ÿ…...
电池包断路单元DBU的预充电电阻应用案例
当电池组接触器闭合到电机和逆变器上时,逆变器电容器中会有电流涌入。这种非常高的电流至少可能会使接触器老化,并可能永久损坏接触器。 因此,当我们关闭电池组上的接触器时,我们分三个步骤执行此操作: 1.关闭主负极…...
车载网络安全指南 系统层面开发阶段(六)
返回总目录->返回总目录<- 目录 前言 一、统层面产品开发启动 二、系统层面漏洞分析 三、网络安全策略具体化 四、确定网络安全技术需求 五、系统设计 六、系统集成与测试 七、网络安全验证 八、系统层面网络安全评估 九、系统层面产品开发阶段检查 十、产品发…...
北京企业做网站/百度推广课程
华商网讯 据陕视新闻 11月4日消息,陕西省教育厅关于10月29日印发《陕西省初中学业水平体育与健康考试工作方案》的通知,自2021 年1 月1 日起执行,2025 年12 月31 日自行废止。其中有两处明显变化:1、考试项目中增加了游泳200米的自…...
长春模板网站建设企业/百度应用
一、 Web平台的安全审计评审方法分别从黑盒和白盒两方面考虑。黑盒着重从几种常用的攻击手段入手谈谈如何防御。白盒方面,谈谈从代码级做好防御,这方面的攻击往往不太容易,但也要防范于未然。 1)、黑盒攻击及防御Web入侵分为两个步…...
学网站建设培训班/做网上推广
最近在看effective-python,第二章函数中提到了优先排序的概念,具体代码如下:values [1, 5, 3, 9, 7, 4, 2, 8, 6]group [7, 9]def sort_priority(values, group):def helper(x):if x in group:return (0, x)return (1, x)values.sort(keyhe…...
一元云购网站建设模块/南宁网络推广培训机构
有数据显示,现在的职场人,跳槽越来越频繁,95后平均7个月就离职。 对于面试官来说,一个跳槽过于频繁的人总是存在潜在风险,比如抗压力差、稳定性不好、心不定这山望着那山高、职业规划不清晰等等。 我一直强调一个观点…...
天河区建设和水务局网站/东莞网站推广的公司
NVIDIA GeForce GTX1050ti显卡驱动是一款非常不错的显卡驱动应用,这个显卡对新的游戏有着良好的兼容性,适用于所有的win7、win10各个版本,且玩游戏不会出现任何的黑屏现象,大型游戏运行起来也非常流畅。快来下载吧! 显卡说明 从参数对比来看,GTX1050 Ti配备了更高规格的架…...
甘肃网站建设项目/哪里有竞价推广托管
注意: 标签通常需要指定一个id属性 (脚本中经常引用), width 和 height 属性定义的画布的大小。提示:你可以在HTML页面中使用多个 canvas元素。使用 style 属性来添加边框。 <!DOCTYPE HTML> <html> <head> <meta charset"utf-8"> <titl…...