一、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: 10Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /mnt/data

# PersistentVolumeClaim 示例
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    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
  1. 使用 K8S 部署 Prometheus Operator,这是管理 Prometheus 实例的推荐方式。可以通过以下命令快速安装:

    kubectl apply -f https://github.com/prometheus-operator/prometheus-operator/raw/master/bundle.yaml
    
  2. 部署 Prometheus 实例,创建一个 Prometheus CRD(Custom Resource Definition):

    apiVersion: monitoring.coreos.com/v1
    kind: Prometheus
    metadata:
      name: my-prometheus
      labels:
        app: prometheus
    spec:
      serviceAccountName: prometheus
      replicas: 1
      resources:
        requests:
          memory: 400Mi
      storage:
        volumes:
          - name: prometheus-storage
            emptyDir: {}
        volumeClaimTemplate:
          spec:
            accessModes: ["ReadWriteOnce"]
            resources:
              requests:
                storage: 10Gi
    
  3. 使用 kubectl apply -f 部署 Prometheus。

配置监控指标
  1. 配置 Prometheus 监控目标,通过创建 ServiceMonitor 对象来指定需要监控的服务:

    apiVersion: monitoring.coreos.com/v1
    kind: ServiceMonitor
    metadata:
      name: my-service-monitor
      labels:
        app: my-app
    spec:
      selector:
        matchLabels:
          app: my-app
      endpoints:
        - port: http
          interval: 30s
    
  2. 在 Prometheus 的配置中添加此 ServiceMonitor,Prometheus 将会自动发现并开始收集这些服务的指标。

5.1.2 Grafana

Grafana 是一个开源的可视化工具,能够从多个数据源(包括 Prometheus)中提取数据并展示在仪表板上。

安装 Grafana
  1. 使用 Helm 来安装 Grafana,首先确保 Helm 已经安装并配置好:

    helm repo add grafana https://grafana.github.io/helm-charts
    helm repo update
    helm install my-grafana grafana/grafana
    
  2. 安装完成后,可以通过以下命令获取 Grafana 的服务 URL:

    kubectl get svc --namespace default -w my-grafana
    
配置 Grafana 连接 Prometheus
  1. 登录 Grafana(默认用户名和密码均为 admin),然后在 Grafana 界面中添加数据源。
  2. 选择 Prometheus 作为数据源,并配置 URL 为 http://:9090
  3. 通过创建仪表板,选择监控指标并进行可视化。

5.2 如何进行 K8S 集群的升级和回滚

在升级 K8S 集群时,确保兼容性和集群状态是至关重要的。以下是进行 K8S 升级和回滚的常见步骤。

5.2.1 升级 K8S 集群

  1. 备份集群状态: 在升级之前,使用 kubectl 或其他工具备份关键数据,特别是 etcd 数据库。

    ETCDCTL_API=3 etcdctl snapshot save <snapshot-file>
    
  2. 使用 kubeadm 进行升级: 运行以下命令来检查可用的升级版本:

    kubeadm upgrade plan
    

    根据输出的信息,选择合适的版本进行升级:

    kubeadm upgrade apply v1.x.x
    
  3. 节点升级后,验证功能: 升级完成后,确保所有节点和 Pods 正常运行。使用以下命令检查节点状态:

    kubectl get nodes
    

5.2.2 回滚操作

如果升级后发现问题,可以通过以下方式回滚:

  1. 使用之前备份的 etcd 数据恢复集群状态:

    ETCDCTL_API=3 etcdctl snapshot restore <snapshot-file>
    
  2. 确保所有组件使用正确的版本,并重启相关的 Pods 和服务。

  3. 再次验证集群状态,确保应用和服务恢复正常。

通过以上步骤,您可以有效地管理 K8S 集群的监控和维护。监控可以确保系统的健康状态,而升级和回滚则是保障系统持续可用的重要手段。

Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐