一、K8S 基本概念
1.1 什么是 Kubernetes(K8S)?
Kubernetes(通常缩写为 K8S)是一个开源的容器编排平台,旨在自动化容器化应用程序的部署、扩展和管理。K8S 提供了高可用性、弹性扩展以及简化的运维操作,使开发和运维团队能够快速交付应用。
1.2 K8S 的核心组件
K8S 由多个核心组件组成,每个组件都有其独特的功能:
- API Server:K8S 的前端接口,所有的 K8S 操作(如创建、更新、删除资源)都通过 API Server 进行。它负责处理 REST 请求,并将请求转发到相应的组件。
- etcd:一个高可用的分布式键值存储,用于存储集群的所有配置信息和状态数据。etcd 是 K8S 的数据持久化存储,确保集群状态的一致性。
- Controller Manager:负责管理集群的控制循环,包括处理节点状态、Pod 状态等。每个控制器负责监控特定资源的状态并采取行动。
- Scheduler:负责将新的 Pod 分配到合适的节点上,基于资源需求、硬件约束和其他约定来做出调度决策。
- Kubelet:运行在每个节点上的代理,负责维护节点的状态和管理 Pod 的生命周期。Kubelet 根据 API Server 的指示来启动和停止容器。
- Kube-Proxy:处理集群内部的网络通信,提供负载均衡功能,确保流量能够正确路由到运行的 Pods。
二、K8S 资源对象
2.1 Pod 的概念
Pod 是 K8S 的基本调度单位,表示一个或多个容器的集合。Pod 内的容器共享网络和存储,因此它们能够高效地通信和协作。每个 Pod 有一个独立的 IP 地址,所有容器共享同一个网络命名空间。
2.1.1 Pod 的生命周期
Pod 的生命周期包括以下几个阶段:
- Pending:Pod 被创建但尚未调度到节点上。
- Running:Pod 已被调度并且至少一个容器正在运行。
- Succeeded:Pod 中的所有容器均已成功完成。
- Failed:Pod 中的容器已终止,并且未能成功运行。
- Unknown:Pod 的状态无法确定,通常是由于网络问题。
2.2 Deployment、StatefulSet 和 DaemonSet 的区别与使用场景
- Deployment:用于管理无状态应用的部署,支持滚动更新和回滚等功能。适合处理短暂性和可替代的服务。
- StatefulSet:用于管理有状态应用,确保 Pods 的顺序和持久性。每个 Pod 具有唯一的身份和稳定的存储。适用于数据库等需要持久性存储的应用。
- DaemonSet:确保所有(或某些)节点上运行特定的 Pod,如日志收集或监控服务。适用于需要在每个节点上运行的守护进程。
2.3 Service 的类型和作用
K8S 中的 Service 提供了稳定的访问方式,用于在 Pod 之间进行通信。常见的 Service 类型包括:
- ClusterIP:默认类型,提供集群内部的访问,其他 Pod 通过服务名称访问。
- NodePort:在每个节点上开放一个特定端口,将流量转发到 ClusterIP 服务。适合于外部访问。
- LoadBalancer:集成云服务提供商的负载均衡器,自动分配一个外部 IP,用于访问服务。
三、K8S 存储
3.1 K8S 中的存储卷(Volume)类型
K8S 支持多种类型的存储卷,常见的包括:
- EmptyDir:当 Pod 被分配到节点时创建的空目录,存储在节点本地。适合临时数据存储。
- HostPath:将主机文件系统中的目录挂载到 Pod 中,适合需要访问节点文件系统的应用。
- PersistentVolumeClaim(PVC):请求存储资源的对象,动态绑定到 Persistent Volume(PV)。
3.2 Persistent Volume(PV)和 Persistent Volume Claim(PVC)的关系和工作原理
PV 是集群中的存储资源,而 PVC 是用户对存储资源的请求。创建 PVC 时,K8S 会根据 PVC 的需求自动选择一个适合的 PV。PV 和 PVC 的创建可以通过 YAML 文件进行管理。
# PersistentVolume 示例
apiVersion: v1
kind: PersistentVolume
metadata:name: my-pv
spec:capacity:storage: 10GiaccessModes:- ReadWriteOncehostPath:path: /mnt/data# PersistentVolumeClaim 示例
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: my-pvc
spec:accessModes:- ReadWriteOnceresources:requests:storage: 5Gi
四、K8S 网络
4.1 K8S 网络模型的基本原理
K8S 的网络模型保证每个 Pod 都有唯一的 IP 地址,并且 Pod 之间能够直接通信,而无需 NAT。这种模型简化了网络配置和服务发现。
4.2 CNI(容器网络接口)插件的了解
CNI 插件为 K8S 提供网络功能,常见的插件包括:
- Flannel:实现了简单的覆盖网络,适合小型集群。
- Calico:提供更复杂的网络策略和安全控制,适合大规模集群。
五、K8S 运维与监控
5.1 如何对 K8S 集群进行监控
在 K8S 集群中,监控是确保应用性能和系统稳定性的重要手段。常见的监控工具包括 Prometheus 和 Grafana,它们结合使用能够提供全面的监控解决方案。
5.1.1 Prometheus
Prometheus 是一个开源监控系统和时间序列数据库,专门用于收集和存储指标数据。它通过 HTTP 协议拉取(pull)目标的指标数据,非常适合容器化环境。
安装 Prometheus
-
使用 K8S 部署 Prometheus Operator,这是管理 Prometheus 实例的推荐方式。可以通过以下命令快速安装:
kubectl apply -f https://github.com/prometheus-operator/prometheus-operator/raw/master/bundle.yaml
-
部署 Prometheus 实例,创建一个
Prometheus
CRD(Custom Resource Definition):apiVersion: monitoring.coreos.com/v1 kind: Prometheus metadata:name: my-prometheuslabels:app: prometheus spec:serviceAccountName: prometheusreplicas: 1resources:requests:memory: 400Mistorage:volumes:- name: prometheus-storageemptyDir: {}volumeClaimTemplate:spec:accessModes: ["ReadWriteOnce"]resources:requests:storage: 10Gi
-
使用
kubectl apply -f
部署 Prometheus。
配置监控指标
-
配置 Prometheus 监控目标,通过创建 ServiceMonitor 对象来指定需要监控的服务:
apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata:name: my-service-monitorlabels:app: my-app spec:selector:matchLabels:app: my-appendpoints:- port: httpinterval: 30s
-
在 Prometheus 的配置中添加此 ServiceMonitor,Prometheus 将会自动发现并开始收集这些服务的指标。
5.1.2 Grafana
Grafana 是一个开源的可视化工具,能够从多个数据源(包括 Prometheus)中提取数据并展示在仪表板上。
安装 Grafana
-
使用 Helm 来安装 Grafana,首先确保 Helm 已经安装并配置好:
helm repo add grafana https://grafana.github.io/helm-charts helm repo update helm install my-grafana grafana/grafana
-
安装完成后,可以通过以下命令获取 Grafana 的服务 URL:
kubectl get svc --namespace default -w my-grafana
配置 Grafana 连接 Prometheus
- 登录 Grafana(默认用户名和密码均为
admin
),然后在 Grafana 界面中添加数据源。 - 选择 Prometheus 作为数据源,并配置 URL 为
http://:9090
。 - 通过创建仪表板,选择监控指标并进行可视化。
5.2 如何进行 K8S 集群的升级和回滚
在升级 K8S 集群时,确保兼容性和集群状态是至关重要的。以下是进行 K8S 升级和回滚的常见步骤。
5.2.1 升级 K8S 集群
-
备份集群状态: 在升级之前,使用
kubectl
或其他工具备份关键数据,特别是 etcd 数据库。ETCDCTL_API=3 etcdctl snapshot save <snapshot-file>
-
使用 kubeadm 进行升级: 运行以下命令来检查可用的升级版本:
kubeadm upgrade plan
根据输出的信息,选择合适的版本进行升级:
kubeadm upgrade apply v1.x.x
-
节点升级后,验证功能: 升级完成后,确保所有节点和 Pods 正常运行。使用以下命令检查节点状态:
kubectl get nodes
5.2.2 回滚操作
如果升级后发现问题,可以通过以下方式回滚:
-
使用之前备份的 etcd 数据恢复集群状态:
ETCDCTL_API=3 etcdctl snapshot restore <snapshot-file>
-
确保所有组件使用正确的版本,并重启相关的 Pods 和服务。
-
再次验证集群状态,确保应用和服务恢复正常。
通过以上步骤,您可以有效地管理 K8S 集群的监控和维护。监控可以确保系统的健康状态,而升级和回滚则是保障系统持续可用的重要手段。