一、容器集群管理概述
1.1背景概述
1.2发展历程
- 高效的容器管理及编排。
- 容器的跨主机部署及调度。
- 容器的存储、网络、运维、安全等能力的拓展。
![](https://i-blog.csdnimg.cn/direct/62c65cb553ba4bf6ac4978284f69e76d.png)
1.3相关概念
什么是容器引擎
容器引擎允许你绑定一个和运行一个应用在容器里,这是一个松散隔离的环境。由于隔离性和安全性 ,你可以在一台主机上操作多个容器。
容器引擎利用了操作系统的内核资源隔离特性,可以在同一个操作系统上运行多个容器。人们通常把容器引擎比作虚拟机(VMS).
另外一方面,虚拟机利用物理硬件资源抽象层之上可执行代码封装了整个操作系统。
什么是容器
一个容器镜像是一个可运行的软件包,其中包含了一个完整的可执行程序,包括代码和运行时需要应用,系统库和全部重要设置的默认值。
应用程序通过使用容器与底层的宿主机架构解耦,如图所示,我们可以利用底层机器在容器引擎之上运行多个容器。这促进了容器在各种操作系统和云场景中的部署。
什么是容器编排
容器编排与容器的生命周期管理相关,特别是在大型动态环境中。软件团队用容器编排器来控制和自动化容器管理的各种任务。
容器编排器可以工作在使用容器的任何环境。他可以帮助你在多个环境中部署相同的程序,而不需要重新编写它。
1.4 K8s特性
1) 自动装箱:基于容器对应用运行环境的资源配置
2)自动修复
3)水平修复 :有更多的请求之后,让副本数量增加,满足我们的需求
4)负载均衡 (服务发现) :两个结点对外提供服务,有统一的入口,订单服务,访问订单的结点,10个请求,每一个结点5个。对外提供统一的入口,让它做到结点调度,负载均衡,这是服务发现
5)滚动更新:加上三个功能,不是直接加上应用就提供服务,检测没问题才提供服务
6)版本回退:
7)密钥和配置管理:热部署,不需要集群都重启起来
8)存储编排
9)批处理:
1.5部署
二、Kubernetes架构与核心概念
2.1Kubernetes架构
Master节点
- API server ---集群统一入口----集群中部署应用的入口,协调者,以restful方式,交给etcd存储
- scheduler ----结点调度,选择node节点应用部署,master部署,看部署给谁,结点调度
- controller-manager: 处理集群中常规后台任务,,一个资源对应控制器 (假如专门对订单管理)
- etcd 存储系统,用于保存集群中的相关数据,存储,保存集群中的各种数据 例状态数据,pod数据,
Node节点
- kubelet:master派到node节点的代表,管理本机容器
- kube-proxy :提供网络代理,负载均衡等操作
开放接口CRI、CNI、CSI
- CRI(Container Runtime Interface):容器运行时接口,提供计算能力,是定义了容器和镜像的服务的接口,常见的CRI后端有Docker、rkt、kata-containers等。
- CNI(Container Network Interface):容器网络接口,提供网络能力,由一组用于配置Linux 容器的网络接口的规范和库组成,同时还包含了一些插件,它仅关心容器创建时的网络分配,和当容器被删除时释放网络资源。
- CSI(Container Storage Interface):容器存储接口,提供存储能力,通过它,Kubernetes可以将任意存储系统暴露给自己的容器工作负载。
2.2Kubernetes工作流程
2.3Kubernetes核心概念
Pod
![](https://i-blog.csdnimg.cn/direct/e731d1b6313543919c55b9159811c813.png)
- 将联系紧密的容器封装在一个Pod单元内,以Pod整体进行调度、扩展和实现生命周期管理。
- Pod内所有容器使用相同的网络Namespace和共享 存储。即Pod内容器拥有相同IP地址和Port空间容器间直接使用localhost通信。当挂载volume到Pod,即可实现将volume挂载到Pod中的每个容器。
Label
Namespace
- default:所有未指定Namespace的对象都会被分配在default命名空间。
- kube-public:此命名空间下的资源可以被所有人访问(包括未认证用户),用来部署公共插件、容器模板等。
- kube-system:所有由Kubernetes系统创建的资源都处于这个命名空间。
- kube-node-lease:每个节点在该命名空间中都有一个关联的“Lease”对象,该对象由节点定期更新,被用来记录节点的心跳信号。
Controller
![](https://i-blog.csdnimg.cn/direct/d201aa0ab7da42e59f7268eed4a46e0b.png)
Service![](https://i-blog.csdnimg.cn/direct/429d74ebad6b4e2ab62165da53057b43.png)
Volume![](https://i-blog.csdnimg.cn/direct/1bbdddedc52d4bb787efc8278849d55c.png)
三、Kubernetes应用编排与管理
3.1Kubectl介绍
- 指令式:通过kubectl内置的驱动命令,如:kubectl + create/scale/delete/… + 参数 的形式, 直接快速创建、更新和删除Kubernetes对象。
- 声明式:使用 kubectl apply 创建指定目录中配置文件所定义的所有对象。通常,此配置文件采用yaml进行描述。
命令行语法
![](https://i-blog.csdnimg.cn/direct/4e52d39e6a0040ae9f6a7c16a9cd30ac.png)
yaml示例
apiVersion: apps/v1 # 指定Kubernetes API的版本,这里是apps/v1,表示使用AppsV1版本的API
kind: Deployment # 指定资源类型为Deployment,表示这是一个部署资源
metadata: # 元数据部分,包含资源的基本信息
name: nginx-deployment # 资源的名称,这里是nginx-deployment
labels: # 标签,用于标识和选择资源
app: nginx # 标签键值对,这里将app设置为nginx
spec: # 规格部分,定义了资源的详细配置
replicas: 2 # 副本数,表示需要创建两个nginx容器实例
selector: # 选择器,用于选择要管理的Pod
matchLabels: # 匹配标签,这里的选择器匹配所有具有app=nginx标签的Pod
app: nginx
template: # 模板,用于定义Pod的结构和配置
metadata: # Pod的元数据
labels: # Pod的标签,这里同样设置为app=nginx
app: nginx
spec: # Pod的规格
containers: # 容器列表,这里只有一个容器
- name: nginx # 容器名称,这里是nginx
image: nginx:1.14.2 # 容器使用的镜像,这里是nginx的1.14.2版本
ports: # 容器暴露的端口列表
- containerPort: 80 # 容器暴露的端口号,这里是80
工作负载类型
3.2Deployment概述
使用命令行创建Deployment
创建一个简单的deployment:
$ kubectl create deployment mydep --image=nginx --replicas=3
使用如下语句查看deployment的创建情况:
$ kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
mydep 1/1 1 1 2m3s
NAME
:部署的名称;READY
:表示当前已准备好的副本数量;UP-TO-DATE
:表示当前已更新到最新版本的副本数量;AVAILABLE
:表示当前可用的副本数量;AGE
:表示部署创建的时间。
使用yaml创建Deployment
查看容器内部详情
kubectl describe deployment jzb-base-report
滚动更新
3.3StatefulSet概述
![](https://i-blog.csdnimg.cn/direct/dea4b5e621734c9f8b26c705f1d94e03.png)
创建StatefulSet
apiVersion: apps/v1 # 指定Kubernetes API的版本,这里是apps/v1版本
kind: StatefulSet # 定义资源类型为StatefulSet,用于管理有状态应用
metadata: # 元数据部分,包含资源的基本信息
name: web # 资源的名称
spec: # 规格说明部分,描述了资源的具体配置
selector: # 选择器,用于匹配符合条件的Pod
matchLabels: # 标签匹配规则
app: nginx # 匹配具有app=nginx标签的Pod
serviceName: nginx # 关联的服务名称,这里关联的是名为nginx的服务
replicas: 3 # 副本数量,表示需要创建3个副本
template: # Pod模板,用于创建新的Pod
metadata: # Pod的元数据部分
labels: # Pod的标签
app: nginx # 设置Pod的标签为app=nginx
spec: # Pod的规格说明部分
containers: # 容器列表
- name: nginx # 容器名称
image: nginx # 容器使用的镜像
ports: # 容器暴露的端口列表
- containerPort: 80 # 容器监听的端口号
name: web # 端口的名称
volumeMounts: # 卷挂载信息
- name: www # 卷的名称
mountPath: /usr/share/nginx/html # 挂载到容器内的路径
3.4DaemonSet概述
- 确保每一个节点或者期望的节点(通过nodeSelector实现)上运行一个Pod。
- 新增节点时自动部署一个Pod。
- 移除节点时自动删除Pod。
创建DaemonSet
这是一个Kubernetes命令,用于获取集群中所有Pod的详细信息。其中:
kubectl
是Kubernetes的命令行工具;get pod
表示获取Pod的信息;-o wide
是一个选项,表示以宽格式输出结果,包括更多的信息字段。输出的结果包含了以下字段:
NAME
: Pod的名称;READY
: Pod中的容器就绪状态,显示已就绪的容器数量和总容器数量;STATUS
: Pod的状态,如Running、Pending等;RESTARTS
: Pod重启的次数;AGE
: Pod的年龄,即创建时间;IP
: Pod的IP地址;NODE
: Pod所在的节点名称;NOMINATED NODE
: 如果Pod被分配了特定的节点,则显示该节点的名称;READINESS GATES
: Pod的就绪门状态,用于控制Pod是否准备好接收流量。
3.5Jobs概述
创建Jobs
3.6CronJob概述
创建CronJob
四、Kubernetes服务发布
4.1Pod的特征
4.2Service概述
创建后端Deployment
ClusterIP模型
创建集群内访问Service(ClusterIP)
使用Service
$ kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
httpd-svc ClusterIP 10.103.76.128 <none> 8080/TCP 41m
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 134m
$ curl 10.103.76.128:8080
<html><body><h1>It works!</h1></body></html>
kubectl describe service my-service
NodePort模型
![](https://i-blog.csdnimg.cn/direct/410aa851ae48475aa73fc901047733b0.png)
LoadBalancer模型
![](https://i-blog.csdnimg.cn/direct/ec1d3e63c3e94afcb0c34504218f6aff.png)
4.3Ingress概述
![](https://i-blog.csdnimg.cn/direct/0213559e98a640cfb9101670e06a1d28.png)
五、Kubernetes存储管理
5.1Volume概述
5.2Volume类型
5.3Volume管理
![](https://i-blog.csdnimg.cn/direct/031ad5d2b5e1462cb0384216996eb6e7.png)
EmptyDir简介
![](https://i-blog.csdnimg.cn/direct/2c24d13048c7425d8becddf5f0a23cb2.png)
HostPath简介
ConfigMap简介
![](https://i-blog.csdnimg.cn/direct/fc79b2eff1874bcd85abc5fee7bb10ed.png)
Secret简介
PV/PVC/SC概念介绍
![](https://i-blog.csdnimg.cn/direct/66b406600acf46acb71049facc600caf.png)
六、K8S 监控和日志
6.1 监控指标
Kubernetes 提供了一套完整的监控体系,可以帮助我们对集群、服务和应用程序进行监控和警报。下面介绍两种常见的监控指标:Node 监控和 Pod 监控。
Node 监控
Node 监控指标主要包括以下几个方面:
- CPU 使用率
- 内存使用率
- 网络 IO
- 磁盘 IO
- 负载均衡器负载
这些监控指标可以通过 Kubernetes API Server 提供的 kubelet API 获取。在 Kubernetes 中,kubelet 是负责管理节点的核心组件,它会定期采集节点的监控指标,并将采集到的数据暴露给 API Server。
可以使用 Prometheus 等工具来对采集到的监控指标进行展示和分析,以便及时发现异常情况并采取相应措施。
Pod 监控
Pod 监控指标主要包括以下几个方面:
- CPU 使用率
- 内存使用率
- 网络 IO
- 磁盘 IO
这些监控指标可以通过 Kubernetes API Server 提供的 Metrics API 获取。Metrics API 是 Kubernetes 自带的一种监控指标暴露机制,它可以让用户通过 API Server 直接获取到节点和 Pod 的监控指标信息。
可以使用 Heapster、Prometheus 等工具来对采集到的监控指标进行展示和分析,以便及时发现异常情况并采取相应措施。
6.2 日志管理
在 Kubernetes 中,我们通常需要对容器中的日志进行收集、存储、查询和分析。下面介绍两种常见的日志管理方式:Kubernetes 自带日志收集和第三方日志收集器。
Kubernetes 自带日志收集
Kubernetes 自带了一个日志收集器:kubelet。kubelet 会负责收集容器的标准输出(stdout)和标准错误输出(stderr),并将其重定向到文件中。这些文件可以通过以下方式查看:
- 使用 kubectl logs 命令查看 Pod 中容器的日志;
- 在节点上查看容器的日志文件。默认情况下,这些文件位于 /var/log/pods 目录中,文件名的格式为 namespace_podname_containername_xxxxxx.log。
该日志收集方式的优点是简单易用,无需安装额外的组件。缺点是不够灵活,只能收集容器的标准输出和标准错误输出,无法收集其他类型的日志。
第三方日志收集器
第三方日志收集器可以帮助我们更加灵活地收集和管理容器中的日志。常见的第三方日志收集器包括:
- Fluentd:是一个轻量级的日志收集和转发工具,可以将多个容器的日志聚合到一起,并将其发送到指定的存储后端(如 Elasticsearch 或者 Amazon S3)。
- Logstash:是一个开源的数据收集引擎,支持多种数据源和输出方式,可以与 Elasticsearch、Kibana 等工具一起使用来构建强大的日志管理系统。
- Sysdig:是一个安全监控和故障排除工具,支持实时容器日志收集和查询,可以帮助我们更快地定位容器中的问题。
这些工具各有优缺点,可以根据实际需求进行选型。需要注意的是,在使用第三方日志收集器时,需要对容器进行相应的配置,以便将日志发送给指定的收集器。
七、K8S 生态系统
7.1 Helm
Helm 是一个 Kubernetes 应用程序包管理器,允许您轻松安装、升级和管理 Kubernetes 应用程序。Helm 使用称为 charts 的包来描述 Kubernetes 资源。Chart 定义了一组相关的 Kubernetes 资源,以及一些参数,允许您自定义这些资源的行为。通过使用 Helm,您可以简化 Kubernetes 应用程序的部署和维护,使得管理和扩展 Kubernetes 应用程序更加容易。
7.2 Istio
Istio 是一个开源的服务网格平台,允许您连接、保护、控制和观察 Kubernetes 中的服务。Istio 提供了一些功能来增强 Kubernetes 网络的可靠性、安全性和可观测性,包括流量管理、安全、监控和跟踪等方面。它使用 sidecar 容器的方式将其与应用程序部署在一起,从而提供了对网络、安全和其他服务的通用控制。
7.3 Prometheus
Prometheus 是一个开源的监控系统,广泛用于 Kubernetes 中的应用程序和基础设施监控。Prometheus 可以收集、存储和查询各种类型的时间序列数据,并提供灵活的查询语言(PromQL)来分析和聚合这些数据。它还提供了图形化仪表板和告警系统,方便您了解应用程序和基础设施的运行状况。
Kubernetes API Server Metrics
Kubernetes API Server Metrics 描述了 Kubernetes API Server 的健康状况和性能指标,包括 API Server 的响应时间、请求成功率、并发连接数等。这些指标可以帮助您了解集群 API Server 的负载和稳定性,并帮助您检测和处理问题。
Kubernetes Node Metrics
Kubernetes Node Metrics 描述了 Kubernetes Node 上的资源使用情况,包括 CPU、内存、磁盘和网络等。这些指标可以帮助您了解节点的资源利用率和容量规划,并帮助您检测和解决问题,如节点故障、资源耗尽等。
应用程序 Metrics
应用程序 Metrics 描述了 Kubernetes 中应用程序的健康状况和性能指标,包括应用程序的请求延迟、响应时间、错误率等。这些指标可以帮助您了解应用程序的运行状况,并帮助您检测和处理问题,如应用程序错误、性能下降等。
7.4 Grafana
Grafana 是一个开源的数据可视化平台,与 Prometheus 集成广泛使用于 Kubernetes 环境中。通过 Grafana,您可以创建各种类型的仪表板,并动态地可视化 Prometheus 中的数据。Grafana 还提供了丰富的图表和面板,方便您对 Kubernetes 应用程序和基础设施进行监控和分析。您可以使用 Grafana 对 Kubernetes 中的各种指标进行可视化展示,例如 Kubernetes API Server Metrics、Kubernetes Node Metrics、应用程序 Metrics 等。