Kubernetes 学习笔记

发布于:2025-07-20 ⋅ 阅读:(20) ⋅ 点赞:(0)

Kubernetes

一、Kubernetes 简介

1.1 容器编排背景

  • 传统部署方式:应用直接部署在物理机上,资源无法隔离,利用率低,部署和扩缩容困难。
  • 虚拟化部署方式:通过虚拟机实现资源隔离,但虚拟化层开销大,启动慢。
  • 容器部署方式:轻量级隔离,共享宿主机内核,启动快、资源利用率高,但容器数量增多时管理复杂,需要容器编排工具。

1.2 Kubernetes 定义

Kubernetes(简称K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。它提供了跨多个节点的容器集群管理能力,解决了容器化应用的部署、扩缩容、服务发现、负载均衡、故障恢复等问题。

1.3 Kubernetes 优势

  • 自动化部署与扩缩容:根据负载自动调整应用实例数量。
  • 服务发现与负载均衡:通过内置服务发现机制和负载均衡器,使应用可以方便地互相访问。
  • 高可用性:确保应用始终有足够的实例运行,自动替换失败的容器。
  • 资源管理:精确控制容器对CPU、内存等资源的使用。
  • 滚动更新与回滚:支持平滑更新应用版本,出现问题时可快速回滚。
  • 存储编排:自动挂载存储系统,支持多种存储类型。
  • 批处理作业:支持运行一次性任务和批处理作业。

二、Kubernetes 核心概念

2.1 节点(Node)

  • 定义:Kubernetes集群中的工作机器,可以是物理机或虚拟机,负责运行容器。
  • 组件
    • kubelet:负责与API Server通信,管理节点上的容器生命周期。
    • kube-proxy:实现服务的网络代理和负载均衡。
    • 容器运行时:如Docker、containerd等,负责运行容器。

2.2 Pod

  • 定义:Kubernetes中最小的可部署单元,是一组紧密关联的容器集合,共享网络和存储。
  • 特点
    • 同一Pod内的容器共享IP地址和端口空间,可通过localhost直接通信。
    • 共享存储卷,可在容器间共享数据。
    • 总是运行在同一个节点上。
  • 生命周期:短暂的,创建后不会自动重启,需要通过控制器管理。

2.3 控制器(Controller)

  • 定义:负责管理Pod的生命周期,确保Pod按预期运行。
  • 常见控制器
    • Deployment:用于无状态应用的部署和管理,支持滚动更新和回滚。
    • StatefulSet:用于有状态应用的部署,保证Pod的有序性和持久化存储。
    • DaemonSet:确保每个节点上都运行一个相同的Pod副本,常用于监控、日志收集等系统服务。
    • Job:用于运行一次性任务,任务完成后Pod终止。
    • CronJob:基于时间的Job,按指定时间间隔重复执行任务。

2.4 服务(Service)

  • 定义:为一组功能相同的Pod提供统一的访问入口,实现服务发现和负载均衡。
  • 类型
    • ClusterIP:默认类型,在集群内部暴露服务,通过集群内部IP访问。
    • NodePort:在每个节点上开放一个端口,通过节点IP和端口访问服务。
    • LoadBalancer:利用云提供商的负载均衡器向外部暴露服务。
    • ExternalName:将服务映射到外部域名。

2.5 存储卷(Volume)

  • 定义:Pod中容器可以访问的存储目录,用于持久化数据和容器间共享数据。
  • 常见类型
    • emptyDir:临时存储,Pod删除时数据丢失。
    • hostPath:挂载节点上的文件或目录,用于容器与节点间共享数据。
    • persistentVolumeClaim(PVC):声明使用持久化存储,通过PersistentVolume(PV)提供。
    • NFS、Ceph、AWS EBS等:各种网络存储和云存储。

2.6 命名空间(Namespace)

  • 定义:将集群资源划分为多个虚拟空间,用于多租户隔离和资源分组管理。
  • 适用场景
    • 大型组织中不同团队使用不同命名空间。
    • 开发、测试、生产环境使用不同命名空间。
  • 默认命名空间
    • default:未指定命名空间的资源默认放入此命名空间。
    • kube-system:Kubernetes系统组件使用的命名空间。
    • kube-public:公共资源使用的命名空间。

三、Kubernetes 架构

3.1 控制平面(Control Plane)

  • 定义:负责整个集群的决策和管理,包括集群状态的维护、资源调度等。
  • 组件
    • kube-apiserver:集群的统一入口,处理REST API请求,是其他组件通信的中心。
    • etcd:高可用的键值存储,保存集群的所有状态数据。
    • kube-scheduler:负责将Pod调度到合适的节点上运行。
    • kube-controller-manager:运行各种控制器,确保集群状态与期望状态一致。
    • cloud-controller-manager:与云提供商的API交互,管理云资源。

3.2 工作节点(Worker Node)

  • 定义:运行应用容器的节点。
  • 组件
    • kubelet:与API Server通信,管理节点上的Pod和容器。
    • kube-proxy:实现服务的网络代理和负载均衡。
    • 容器运行时:如Docker、containerd等,负责运行容器。

3.3 网络组件

  • CNI(容器网络接口):Kubernetes的网络插件标准,常见的CNI插件有Flannel、Calico、Weave Net等。
  • CoreDNS:集群内部的DNS服务,为服务提供域名解析。

四、Kubernetes 对象与配置

4.1 YAML 配置文件

  • 定义:Kubernetes使用YAML格式的配置文件来定义和管理资源。
  • 基本结构
    apiVersion: v1  # API版本
    kind: Pod       # 对象类型
    metadata:       # 元数据
      name: my-pod
      labels:
        app: my-app
    spec:           # 规格
      containers:
      - name: my-container
        image: nginx:1.14.2
        ports:
        - containerPort: 80
    

4.2 常用命令

  • kubectl:Kubernetes的命令行工具,用于与集群交互。
  • 常用命令示例
    # 创建资源
    kubectl create -f resource.yaml
    
    # 查看资源
    kubectl get pods
    kubectl get services
    kubectl get nodes
    
    # 查看资源详细信息
    kubectl describe pod my-pod
    
    # 更新资源
    kubectl apply -f resource.yaml
    
    # 删除资源
    kubectl delete -f resource.yaml
    kubectl delete pod my-pod
    
    # 查看日志
    kubectl logs my-pod
    
    # 执行命令
    kubectl exec -it my-pod -- /bin/bash
    

五、Kubernetes 网络模型

5.1 网络模型原则

  • 所有Pod可以在不使用NAT的情况下与其他Pod通信。
  • 所有节点可以在不使用NAT的情况下与所有Pod通信。
  • Pod的IP地址是全局唯一的,并且可以直接访问。

5.2 网络插件

  • Flannel:简单的覆盖网络,使用VXLAN或UDP封装数据包。
  • Calico:基于BGP的网络插件,提供网络策略功能。
  • Weave Net:自组织网络,支持加密和多租户。
  • Canal:结合了Flannel的网络和Calico的网络策略。

5.3 服务发现与负载均衡

  • Service:为一组Pod提供稳定的IP地址和DNS名称。
  • kube-proxy:在每个节点上运行,实现Service的负载均衡和流量转发。
  • Endpoint:Service的后端Pod的IP和端口集合。

六、Kubernetes 存储

6.1 持久化存储

  • PersistentVolume(PV):集群中的存储资源,由管理员创建和管理。
  • PersistentVolumeClaim(PVC):用户对存储资源的请求,绑定到合适的PV。
  • StorageClass:动态创建PV的模板,定义存储类型和参数。

6.2 存储卷类型

  • 本地存储:emptyDir、hostPath。
  • 网络存储:NFS、iSCSI、Ceph、GlusterFS等。
  • 云存储:AWS EBS、GCP PD、Azure Disk等。

七、Kubernetes 安全

7.1 认证与授权

  • 认证:验证用户或服务的身份,支持多种认证方式:
    • 客户端证书
    • 令牌(Token)
    • OpenID Connect
    • Webhook
  • 授权:决定用户可以执行哪些操作,常见的授权模式:
    • Node:用于kubelet的特殊授权模式
    • RBAC(基于角色的访问控制)
    • ABAC(基于属性的访问控制)
    • Webhook

7.2 网络策略

  • 定义:基于标签选择Pod,控制Pod之间的网络通信。
  • 示例
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: allow-frontend
    spec:
      podSelector:
        matchLabels:
          role: backend
      ingress:
      - from:
        - podSelector:
            matchLabels:
              role: frontend
        ports:
        - protocol: TCP
          port: 80
    

7.3 安全上下文

  • 定义:定义Pod或容器的安全设置,如用户ID、权限、SELinux标签等。
  • 示例
    apiVersion: v1
    kind: Pod
    metadata:
      name: security-context-demo
    spec:
      securityContext:
        runAsUser: 1000
        fsGroup: 2000
      containers:
      - name: sec-ctx-demo
        image: busybox
        command: [ "sh", "-c", "sleep 1h" ]
        volumeMounts:
        - name: sec-ctx-vol
          mountPath: /data/demo
      volumes:
      - name: sec-ctx-vol
        emptyDir: {}
    

八、Kubernetes 应用部署与管理

8.1 部署无状态应用

  • 使用Deployment
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx:1.14.2
            ports:
            - containerPort: 80
    

8.2 部署有状态应用

  • 使用StatefulSet
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: mysql
    spec:
      serviceName: "mysql"
      replicas: 3
      selector:
        matchLabels:
          app: mysql
      template:
        metadata:
          labels:
            app: mysql
        spec:
          containers:
          - name: mysql
            image: mysql:8.0
            ports:
            - containerPort: 3306
            volumeMounts:
            - name: mysql-persistent-storage
              mountPath: /var/lib/mysql
      volumeClaimTemplates:
      - metadata:
          name: mysql-persistent-storage
        spec:
          accessModes: [ "ReadWriteOnce" ]
          resources:
            requests:
              storage: 10Gi
    

8.3 滚动更新与回滚

  • 滚动更新:逐步替换旧版本Pod为新版本,不影响服务可用性。
    # 更新镜像版本
    kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1
    
    # 查看更新状态
    kubectl rollout status deployment/nginx-deployment
    
  • 回滚:当更新出现问题时,回滚到之前的稳定版本。
    # 回滚到上一个版本
    kubectl rollout undo deployment/nginx-deployment
    
    # 回滚到指定版本
    kubectl rollout undo deployment/nginx-deployment --to-revision=2
    

九、Kubernetes 监控与日志

9.1 监控

  • Metrics Server:收集集群资源使用情况的轻量级服务。
  • Prometheus:开源监控系统,收集和存储时间序列数据。
  • Grafana:数据可视化工具,与Prometheus集成展示监控数据。

9.2 日志

  • 容器日志:使用kubectl logs命令查看容器日志。
  • 集中式日志
    • Fluentd:日志收集器,将日志发送到存储系统。
    • Elasticsearch:存储和检索日志数据。
    • Kibana:可视化和查询日志数据。

十、Kubernetes 高级特性

10.1 自动扩缩容

  • Horizontal Pod Autoscaler(HPA):基于CPU、内存或自定义指标自动调整Pod数量。
    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: nginx-hpa
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: nginx-deployment
      minReplicas: 1
      maxReplicas: 10
      metrics:
      - type: Resource
        resource:
          name: cpu
          target:
            type: Utilization
            averageUtilization: 50
    

10.2 自定义资源定义(CRD)

  • 定义:允许用户扩展Kubernetes API,添加自定义资源类型。
  • 示例
    apiVersion: apiextensions.k8s.io/v1
    kind: CustomResourceDefinition
    metadata:
      name: foos.example.com
    spec:
      group: example.com
      versions:
        - name: v1
          served: true
          storage: true
          schema:
            openAPIV3Schema:
              type: object
              properties:
                spec:
                  type: object
                  properties:
                    replicas:
                      type: integer
      scope: Namespaced
      names:
        plural: foos
        singular: foo
        kind: Foo
        shortNames:
        - fo
    

10.3 服务网格(Service Mesh)

  • 定义:专用的基础设施层,用于管理服务间的通信,提供流量控制、可观测性和安全等功能。
  • 常见服务网格
    • Istio:Google、IBM和Lyft共同开发的开源服务网格。
    • Linkerd:轻量级服务网格。
    • Consul:HashiCorp的服务网格解决方案。

十一、Kubernetes 实践指南

11.1 集群安装

  • kubeadm:官方推荐的集群安装工具,适合生产环境。
  • Minikube:单节点本地集群,适合开发和测试。
  • 云提供商服务:AWS EKS、GCP GKE、Azure AKS等。

11.2 最佳实践

  • 资源请求与限制:为Pod设置合理的资源请求和限制,避免资源竞争。
  • 健康检查:配置存活探针(liveness probe)和就绪探针(readiness probe),确保应用健康运行。
  • 配置管理:使用ConfigMap和Secret管理应用配置和敏感信息。
  • 安全加固:遵循最小权限原则,限制容器特权,使用网络策略隔离流量。

11.3 故障排查

  • 常用命令
    # 查看Pod状态
    kubectl get pods
    
    # 查看Pod详细信息
    kubectl describe pod <pod-name>
    
    # 查看容器日志
    kubectl logs <pod-name>
    
    # 进入容器
    kubectl exec -it <pod-name> -- /bin/bash
    
    # 查看事件
    kubectl get events
    

十二、Kubernetes 生态系统

12.1 CI/CD 工具

  • Jenkins:开源CI/CD工具,支持Kubernetes插件。
  • GitLab CI/CD:集成GitLab的CI/CD平台,支持Kubernetes部署。
  • Argo CD:声明式GitOps持续交付工具,专为Kubernetes设计。

12.2 配置管理工具

  • Helm:Kubernetes包管理器,简化复杂应用的部署和管理。
  • Kustomize:原生Kubernetes配置管理工具,支持配置定制。

12.3 安全工具

  • Trivy:容器镜像漏洞扫描工具。
  • Kyverno:Kubernetes策略引擎,实施安全和配置策略。
  • OPA(Open Policy Agent):通用策略引擎,可用于Kubernetes授权。

十三、Kubernetes 发展趋势

13.1 无服务器计算(Serverless)

  • Knative:基于Kubernetes的Serverless平台,由Google主导开发。
  • OpenFaaS:开源的Serverless框架,可部署在Kubernetes上。

13.2 边缘计算

  • KubeEdge:华为开源的Kubernetes边缘计算平台。
  • K3s:轻量级Kubernetes发行版,适合资源受限的边缘环境。

13.3 AI/ML 集成

  • Kubeflow:用于在Kubernetes上部署和管理机器学习工作流的平台。
  • KServe:Kubernetes原生的模型推理平台。

十四、Kubernetes 工作组件详解

14.1 Master 节点组件

14.1.1 kube-apiserver
  • 功能:作为Kubernetes集群的API接口,是所有组件通信的中心枢纽。提供RESTful API,处理认证、授权、访问控制、API注册和发现等功能。
  • 特点:水平扩展,可部署多个实例提高可用性。
14.1.2 etcd
  • 功能:高可用的键值存储系统,保存集群的所有状态数据,如Pod、Service、Node等资源的配置和状态。
  • 特点:使用Raft算法保证数据一致性,需备份数据以防丢失。
14.1.3 kube-scheduler
  • 功能:负责将Pod调度到合适的Node节点上运行。根据资源可用情况、节点标签、Pod亲和性/反亲和性等因素做出调度决策。
  • 调度过程:过滤节点(找出符合Pod资源请求的节点)→ 对剩余节点打分 → 选择得分最高的节点。
14.1.4 kube-controller-manager
  • 功能:运行各种控制器,监控集群状态并确保集群状态与期望状态一致。
  • 主要控制器
    • Node Controller:监控Node状态,处理节点故障。
    • Replication Controller:维护Pod副本数量。
    • Deployment Controller:处理Deployment的创建、更新和回滚。
    • Service Controller:创建、更新和删除Service。
    • Endpoint Controller:维护Service和Pod的关联关系。
14.1.5 cloud-controller-manager
  • 功能:与云服务提供商的API交互,管理云资源,如负载均衡器、存储卷等。
  • 适用场景:在公有云或私有云环境中使用Kubernetes时。

14.2 Node 节点组件

14.2.1 kubelet
  • 功能:作为Node节点上的代理,与API Server通信,管理节点上的Pod和容器生命周期。确保容器按照Pod规范运行。
  • 工作内容
    • 接收API Server分配的Pod。
    • 下载Pod的配置和Secret。
    • 启动和监控容器。
    • 向API Server报告Pod状态。
14.2.2 kube-proxy
  • 功能:实现Service的网络代理和负载均衡。在每个Node节点上运行,维护网络规则,将流量转发到正确的Pod。
  • 实现模式
    • iptables:基于iptables规则实现流量转发,性能较高。
    • IPVS:基于IPVS实现负载均衡,支持更多负载均衡算法。
    • Userspace:早期模式,性能较低,已不推荐使用。
14.2.3 容器运行时(Container Runtime)
  • 功能:负责运行容器的软件。
  • 常见容器运行时
    • Docker:最流行的容器运行时。
    • containerd:轻量级容器运行时,直接与容器运行时接口(CRI)交互。
    • CRI-O:专为Kubernetes设计的容器运行时。
    • rkt:CoreOS开发的容器运行时。
14.2.4 网络插件(CNI)
  • 功能:实现Kubernetes的网络模型,为Pod分配IP地址,实现Pod间通信。
  • 常见网络插件
    • Flannel:简单的覆盖网络,使用VXLAN或UDP封装数据包。
    • Calico:基于BGP的网络插件,提供网络策略功能。
    • Weave Net:自组织网络,支持加密和多租户。
    • Canal:结合了Flannel的网络和Calico的网络策略。

14.3 附加组件

14.3.1 CoreDNS
  • 功能:集群内部的DNS服务,为服务提供域名解析。Pod可以通过服务名直接访问其他服务。
  • 工作原理:监听DNS请求,将服务名解析为对应的ClusterIP或Endpoint IP。
14.3.2 容器网络接口(CNI)插件
  • 功能:实现Kubernetes的网络模型,确保Pod间可以通信。
  • 与kubelet的关系:kubelet通过CNI接口调用网络插件为Pod配置网络。
14.3.3 容器存储接口(CSI)插件
  • 功能:实现存储卷的挂载和卸载,支持多种存储系统。
  • 常见CSI插件:NFS CSI、AWS EBS CSI、Ceph CSI等。
14.3.4 监控和日志组件
  • Prometheus:收集和存储时间序列数据,监控集群和应用性能。
  • Grafana:可视化监控数据。
  • Elasticsearch、Fluentd、Kibana(EFK):集中式日志管理。
14.3.5 入口控制器(Ingress Controller)
  • 功能:管理外部对集群内服务的访问,实现HTTP负载均衡。
  • 常见Ingress Controller
    • Nginx Ingress Controller:基于Nginx的Ingress控制器。
    • Traefik:轻量级、支持动态配置的Ingress控制器。
    • Istio:服务网格,也提供Ingress功能。

14.4 组件间通信

14.4.1 控制平面内部通信
  • 组件间通过API Server通信:所有组件都与API Server交互,不直接互相通信。
  • etcd安全通信:使用TLS加密,保证数据传输安全。
14.4.2 控制平面与Node节点通信
  • API Server → kubelet:API Server通过HTTPS向kubelet发送指令。
  • kubelet → API Server:kubelet通过HTTPS向API Server报告节点和Pod状态。
14.4.3 节点间通信
  • Pod间通信:通过CNI插件实现,遵循Kubernetes网络模型。
  • Service通信:通过kube-proxy实现负载均衡和流量转发。

14.5 组件部署方式

14.5.1 Master节点组件
  • 静态Pod:kube-apiserver、kube-scheduler、kube-controller-manager通常作为静态Pod部署在Master节点上。
  • 容器化:通过kubelet管理这些组件的生命周期。
14.5.2 Node节点组件
  • DaemonSet:部分组件(如网络插件)以DaemonSet形式部署,确保每个节点都运行一份。
  • 直接安装:kubelet、kube-proxy通常直接安装在Node节点上。

14.6 总结

组件 所在节点 主要功能
kube-apiserver Master 集群API接口,所有组件通信的中心
etcd Master 存储集群状态数据
kube-scheduler Master 将Pod调度到合适的Node节点
kube-controller-manager Master 运行各种控制器,维护集群状态
cloud-controller-manager Master 与云服务提供商API交互,管理云资源
kubelet Node 管理节点上的Pod和容器生命周期
kube-proxy Node 实现Service的网络代理和负载均衡
容器运行时 Node 运行容器
CNI网络插件 Node 实现Pod间通信
CoreDNS 集群 集群内部DNS服务,解析服务名
Ingress Controller 集群 管理外部对集群内服务的访问

理解这些组件的功能和工作原理是深入掌握Kubernetes的关键,它们共同协作,确保容器化应用在集群中高效、稳定地运行。

十五、总结

Kubernetes是容器编排领域的事实标准,提供了强大的容器集群管理能力。通过掌握Kubernetes的核心概念、架构、网络、存储、安全等知识,能够高效地部署、扩展和管理容器化应用。随着云原生技术的发展,Kubernetes的应用场景将不断扩大,生态系统也将更加完善。


网站公告

今日签到

点亮在社区的每一天
去签到