k8s

1. Kubernetes概述

什么是Kubernetes,容器编排的必要性

Kubernetes(K8s)是一个开源的容器编排平台,旨在自动化部署、扩展和管理容器化应用。容器编排的必要性体现在:

  • 容器化应用管理的复杂性:随着容器的广泛应用,如何高效地管理成千上万个容器成为了一个挑战。Kubernetes解决了容器的生命周期管理、服务发现、负载均衡等问题。
  • 高可用性和弹性扩展:容器编排工具(如Kubernetes)提供自动扩容、故障恢复和负载均衡等能力,保证应用在集群中始终可用。

Kubernetes的架构(Master Node, Worker Node)

  • Master Node:负责管理集群的状态和控制,处理调度、监控、集群健康检查等工作。它包括以下组件:
    • API Server:处理外部请求并进行认证授权。
    • Controller Manager:负责控制器管理,确保集群状态符合期望。
    • Scheduler:决定将容器调度到哪个Node上。
    • etcd:集群的分布式数据库,存储集群的所有配置和状态数据。
  • Worker Node:也叫Node,是实际运行容器的节点。每个Node都包含以下组件:
    • Kubelet:负责管理Node上的Pod生命周期,确保Pod的容器按预期运行。
    • Kube Proxy:负责处理Pod间的网络通信。
    • Container Runtime:运行容器的实际运行时(如Docker、containerd等)。

Kubernetes的主要组件:Pod, ReplicaSet, Deployment, Service, Namespace等

  • Pod:Kubernetes中最小的部署单元,一个Pod可以包含一个或多个容器,它们共享存储和网络资源。
  • ReplicaSet:保证Pod的副本数量与期望一致,提供Pod的高可用性。
  • Deployment:用于管理Pod的部署与版本控制,支持自动化的滚动更新和回滚。
  • Service:提供稳定的网络地址,暴露Pod的访问入口,支持负载均衡。
  • Namespace:用于多租户环境中资源的隔离,每个Namespace可以包含不同的资源,如Pod、Service等。

Kubernetes与Docker的关系

  • Docker提供了容器化的解决方案,而Kubernetes负责管理容器的部署、扩展和监控。
  • Docker是容器运行时(Container Runtime),而Kubernetes是容器编排工具,两者互相补充。Kubernetes可以使用Docker作为其容器运行时,然而Kubernetes也支持其他容器运行时(如containerd、CRI-O等)。

2. Kubernetes安装与配置

部署Kubernetes集群

  • Minikube:适用于开发和学习环境,提供单节点的Kubernetes集群。
  • kubeadm:用于在物理或虚拟机上手动部署Kubernetes集群,适合生产环境。
  • Kind:在Docker容器中运行Kubernetes集群,适用于本地开发和测试。
  • K3s:轻量级的Kubernetes发行版,适用于资源有限的环境。

配置kubectl工具

kubectl是与Kubernetes集群交互的命令行工具。通过配置~/.kube/config文件,用户可以指定Kubernetes API Server的位置、认证方式等信息。

使用Kubernetes Dashboard

Kubernetes Dashboard是一个基于Web的UI,允许用户管理和监控Kubernetes集群及其资源。它提供了对Pods、Services、Deployments等资源的图形化管理界面。

常见的安装与配置问题及解决

  • kubectl连接问题:确保kubeconfig文件配置正确,并且API Server可访问。
  • 集群网络问题:检查CNI插件是否正确安装,以及各节点之间的网络连接是否正常。

3. Kubernetes核心概念与资源管理

Pod:Pod的概念,Pod内的容器管理

Pod是Kubernetes中的基本部署单元,它封装了一个或多个容器,容器共享存储、网络和其他资源。Pod内的容器通常是紧密相关的、需要共享资源的。

ReplicaSet:Pod的副本控制

ReplicaSet确保某个Pod的副本数量与期望数量一致。它监控Pod的健康状态,并在Pod失败时自动创建新的副本以维持期望数量。

Deployment:自动化管理应用的部署与扩展

Deployment是一种用于声明式管理Pod和ReplicaSet的Kubernetes资源对象。它支持Pod的滚动更新、回滚操作以及Pod的扩缩容。

Service:暴露Pod的方式

  • ClusterIP:默认方式,Service只能在集群内访问。
  • NodePort:允许集群外部通过指定端口访问Service。
  • LoadBalancer:为Service创建一个外部负载均衡器,适用于云环境。
  • Ingress:管理HTTP和HTTPS路由,允许外部流量访问集群内的服务。

Namespace:多租户的资源隔离

Namespace为Kubernetes集群提供逻辑上的分隔,支持资源的多租户隔离。通过Namespace,可以隔离开发、测试、生产环境中的资源。

ConfigMap与Secret:配置管理与敏感信息存储

  • ConfigMap:用于存储非敏感的配置信息,Pod可以通过环境变量或挂载文件的方式使用ConfigMap中的数据。
  • Secret:用于存储敏感数据(如密码、API密钥等),可以加密存储和传输。

4. Kubernetes工作负载与调度

Deployment:创建、更新和回滚应用

Deployment用于定义应用的期望状态,支持滚动更新和回滚到先前的版本,确保高可用性。

StatefulSet:管理有状态应用

StatefulSet用于管理有状态应用(如数据库),它提供稳定的网络标识、持久化存储和顺序部署能力。

DaemonSet:为每个节点运行一个Pod

DaemonSet确保集群中的每个节点都运行一个Pod,适用于需要在每个节点上运行的服务,如日志收集器和监控代理。

Job和CronJob:批处理和定时任务

  • Job:用于运行一次性任务,确保任务成功完成。
  • CronJob:用于定期调度任务,类似于Linux中的Cron作业。

Pod调度与资源管理

Pod调度策略决定了Pod在哪个Node上运行,Kubernetes调度器基于资源需求、优先级、约束条件等进行调度。资源请求和限制(CPU、内存)帮助调度器合理分配集群资源。


5. Kubernetes网络与服务发现

Pod通信与网络模型

Kubernetes使用CNI(Container Network Interface)插件为集群中的Pod提供网络功能。Pod内的容器共享网络命名空间,因此它们可以通过localhost相互通信。

服务发现与负载均衡

Kubernetes的Service对象提供了Pod的稳定访问入口,Service通过负载均衡将流量分发到相应的Pod。Ingress控制器提供了更为复杂的HTTP路由功能。

Network Policies:定义Pod间的网络通信策略

Network Policies用于限制Pod间的通信,增强安全性。可以通过定义Ingress和Egress规则来控制哪些Pod或IP地址可以与Pod通信。

DNS与CoreDNS

CoreDNS是Kubernetes集群中的DNS服务器,它支持Service发现功能,可以通过域名访问集群中的Pod和Service。


6. 存储与持久化

Persistent Volume (PV) 与 Persistent Volume Claim (PVC)

  • Persistent Volume (PV):集群中的存储资源,由管理员预先创建。
  • Persistent Volume Claim (PVC):用户请求存储资源的方式,PVC与PV进行绑定,Pod通过PVC访问存储。

StorageClass:动态存储卷管理

StorageClass定义了存储卷的属性,如存储类型、访问模式等。可以实现动态创建存储卷。

StatefulSet与持久化存储

StatefulSet适用于需要持久化存储的有状态应用,它可以与PVC结合,确保每个Pod都拥有独立且持久的存储。

分布式存储与云存储

Kubernetes支持与各种分布式存储系统(如Ceph、GlusterFS)以及云存储(如EBS、NFS)集成,以满足存储需求。


7. Kubernetes的安全性

RBAC(Role-Based Access Control)

RBAC用于基于角色控制对Kubernetes资源的访问。通过定义Role和RoleBinding,限制用户和服务账户的权限。

Pod安全策略(PSP)

Pod安全策略(PSP)用于定义Pod的安全性要求,例如限制容器使用特权模式、运行用户等。

Kubernetes API的认证与授权

Kubernetes提供多种认证方式(如X.509证书、Bearer Token)和授权机制(如RBAC、ABAC)来保护API Server。

加密与Secret管理

Kubernetes通过加密存储敏感信息,并通过Secret管理存储密钥、密码等数据。Secret可与Pod挂载,也可以作为环境变量使用。

k8s yaml 示例

apiVersion: apps/v1  # 资源类型,指定API版本,这里是apps/v1表示Deployment属于这个版本
kind: Deployment  # 资源类型,Deployment是Kubernetes中的一种资源对象
metadata:
  name: nginx-deployment  # Deployment的名称
  labels:
    app: nginx  # 为Deployment附加一个标签
spec:
  replicas: 3  # 指定Pod副本数,Kubernetes会保持3个Nginx实例在集群中运行
  selector:
    matchLabels:
      app: nginx  # 用于选择应用的Pod,这里选择所有标签为app: nginx的Pod
  template:  # Pod的模板,用于创建Pod副本
    metadata:
      labels:
        app: nginx  # Pod的标签,与Deployment的selector中的matchLabels匹配
    spec:
      containers:
      - name: nginx  # 容器名称
        image: nginx:latest  # 使用nginx的官方镜像
        ports:
        - containerPort: 80  # 容器暴露的端口,Kubernetes将此端口映射到集群内部的服务

---
apiVersion: v1  # 资源类型,Service属于v1版本
kind: Service  # 资源类型,Service用于暴露Pod的网络访问
metadata:
  name: nginx-service  # Service的名称
spec:
  selector:
    app: nginx  # Service选择器,将流量路由到所有标签为app: nginx的Pod
  ports:
    - protocol: TCP  # 使用TCP协议
      port: 80  # 暴露Service的端口
      targetPort: 80  # 目标端口,指向容器的80端口
  type: LoadBalancer  # 将Service暴露为负载均衡器,可以使其被外部访问