Kubernetes 基础知识、核心概念与安装配置

250 阅读10分钟

一、什么是 Kubernetes?

Kubernetes(简称 K8s)是一个开源的容器编排平台,旨在自动化应用程序的部署、扩展和管理。最初由 Google 开发,Kubernetes 是为了解决大规模、分布式的容器化应用管理问题而设计的。它通过提供一个统一的平台来管理容器应用的生命周期,使得开发者和运维人员能够更加高效地进行应用部署、弹性伸缩、服务发现、负载均衡等操作。

在容器化应用的背景下,Kubernetes 为现代云原生架构提供了强大的管理能力,已经成为许多企业生产环境中的标准平台。

Kubernetes 的核心组件

Kubernetes 主要由两部分组成:控制平面(Control Plane)工作节点(Node)

1. 控制平面(Control Plane)

控制平面负责集群的管理和调度,主要组件包括:

  • API Server:是 Kubernetes 集群的入口,所有对集群的操作都会通过它进行。
  • Controller Manager:负责管理集群的控制逻辑,如节点、Pod 的生命周期管理,自动修复等。
  • Scheduler:负责将待调度的 Pod 分配到合适的工作节点。
  • etcd:分布式键值存储,保存了 Kubernetes 集群的所有配置数据和状态。
2. 工作节点(Node)

工作节点是 Kubernetes 中实际运行容器化应用的地方,每个节点上运行着多个重要组件:

  • Kubelet:负责管理本地节点上的容器,确保容器的生命周期与集群期望状态一致。
  • Kube Proxy:实现网络代理和负载均衡,保证服务间的稳定通信。
  • 容器运行时:如 Docker 或 containerd,用于容器的创建和运行。
Kubernetes 架构图

下面是 Kubernetes 的架构图,展示了控制平面(Control Plane)和工作节点(Node)之间的关系:

graph TD;
  A[API Server] -->|与控制平面通信| B[Controller Manager];
  A -->|与控制平面通信| C[Scheduler];
  A -->|存储集群状态| D[etcd];
  E[Kubelet] -->|与控制平面通信| A;
  F[Kube Proxy] -->|与网络通信| E;
  G[Container Runtime] -->|容器运行| E;
  B -->|管理节点和Pod生命周期| E;
  C -->|调度Pod| E;
  D -->|持久化数据| A;
  subgraph Control_Plane [Control Plane]
    A;
    B;
    C;
    D;
  end
  subgraph Node [Node]
    E;
    F;
    G;
  end

Kubernetes 控制平面和工作节点的协作

控制平面和工作节点之间的协作是 Kubernetes 的关键。以下是一个简单的流程图,展示了控制平面如何通过 API Server 与工作节点通信,如何调度 Pod 到节点,并通过 KubeletKube Proxy 管理 Pod 的运行状态和网络。

graph TD;
  A[API Server] -->|调度 Pod 到节点| D[工作节点];
  D --> E[Kubelet];
  D --> F[Kube Proxy];
  E --> G[Pod];
  F --> G;

这个图简洁地展示了控制平面如何通过 API Server 与工作节点通信,如何调度 Pod 到节点,并通过 KubeletKube Proxy 管理 Pod 的运行状态和网络。 在这个架构图中,API Server 是 Kubernetes 的核心,负责与控制平面和工作节点之间进行通信。Controller Manager 负责管理集群状态,Scheduler 负责调度 Pod 到合适的节点,而 etcd 则存储集群的所有数据。

二、Kubernetes 核心概念

了解 Kubernetes 的核心概念是掌握它的基础。以下是 Kubernetes 中的一些关键概念:

1. Pod

Pod 是 Kubernetes 中最小的部署单位,一个 Pod 可以包含一个或多个容器,多个容器共享同一个网络命名空间和存储卷。Pod 代表的是部署在集群中的一组容器,通常一个 Pod 中的容器会共同处理某个业务逻辑或服务。可以理解为一个Spring Boot微服务。

2. Deployment

Deployment 是用来管理应用程序部署的控制器。它通过定义 Pod 的副本数、更新策略等来保证系统的高可用性。通过 Deployment 可以轻松实现滚动更新和回滚操作。

3. Service

Service 是 Kubernetes 中为 Pod 提供稳定网络访问的资源。由于 Pod 是动态创建和销毁的,它们的 IP 地址可能会发生变化,因此 Service 提供了一个稳定的入口,确保即使 Pod 的 IP 地址变化,客户端仍能稳定访问。

4. Namespace

Namespace 是 Kubernetes 用于资源隔离的机制,它允许在同一个集群中创建多个虚拟集群。每个 Namespace 内的资源相互独立,互不干扰。它非常适用于多租户环境或者资源的组织管理。

5. Persistent Volume (PV) 和 Persistent Volume Claim (PVC)

Kubernetes 提供了持久化存储的能力,PV 是集群中的存储资源,而 PVC 是用户请求存储资源的方式。PVC 绑定到 PV 上,确保应用可以使用持久化存储。

Kubernetes 安装与配置

1. 安装 Kubernetes 集群

在学习 Kubernetes 的过程中,首先需要安装一个集群。常见的 Kubernetes 安装方式有以下几种:

  • Minikube:Minikube 是一个用于在本地快速启动单机 Kubernetes 集群的工具,适合开发和学习使用。
  • kubeadm:kubeadm 是一个更为正式的 Kubernetes 安装工具,适用于在生产环境中搭建多节点集群。
  • K3s:K3s 是一个轻量级的 Kubernetes 版本,适合用于资源受限的环境,比如物联网设备。
使用 Minikube 安装 Kubernetes

对于初学者,Minikube 是最简单的安装方式。它会在你的本地创建一个虚拟机,并启动一个单节点的 Kubernetes 集群。

  1. 安装 Minikube

    • 下载 Minikube 安装包,并根据操作系统进行安装。
    curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
    sudo install minikube-linux-amd64 /usr/local/bin/minikube
    
  2. 启动 Minikube

    启动一个本地的 Kubernetes 集群:

    minikube start
    

    这将创建并启动一个虚拟机,并在其中部署 Kubernetes。

  3. 验证 Kubernetes 集群

    使用 kubectl 命令验证集群是否正常运行:

    kubectl get nodes
    

    如果集群正常运行,你将看到一个名为 minikube 的节点。

2. 使用 kubectl 操作 Kubernetes 集群

kubectl 是 Kubernetes 的命令行工具,它提供了对集群资源的管理和调度能力。

  • 查看集群中的节点

    kubectl get nodes
    
  • 查看 Pod

    kubectl get pods
    
  • 创建 Pod

    创建一个简单的 Pod:

    kubectl run nginx --image=nginx
    

    这将启动一个 Nginx 容器,并将其运行在 Pod 中。

Kubernetes Pod 生命周期

Pod 在 Kubernetes 中的生命周期是动态的,它会经历多个状态。以下是 Pod 生命周期的流程图:

graph LR;
  A[Pod 被创建] --> B[Pod 初始化];
  B --> C[Pod 运行中];
  C --> D[Pod 完成任务];
  D --> E[Pod 被终止];
  E --> F[Pod 被销毁];
  C --> G[Pod 出现故障];
  G --> H[Pod 重启];
  H --> C;

在 Kubernetes 中,Pod 会经历从创建到销毁的一系列状态。Pod 也可能出现故障并重新启动,确保服务的高可用性。

Pod 与 Service 交互流程

Pod 和 Service 之间的交互是 Kubernetes 中网络功能的核心。以下是一个简单的流程图,展示了客户端如何通过 Service 访问 Pod:

sequenceDiagram
  participant Client
  participant Service
  participant Pod
  Client->>Service: 发起请求
  Service->>Pod: 将请求路由到目标 Pod
  Pod->>Service: 返回响应
  Service->>Client: 返回响应给客户端

客户端请求通过 Service 路由到相应的 Pod,而 Pod 返回响应之后,服务再将响应返回给客户端。这种方式保证了服务的稳定访问。

三、基本操作与管理

1. Pod 管理

什么是 Pod?

在 Kubernetes 中,Pod 是最小的调度单位。它是由一个或多个容器组成的集合,这些容器共享存储和网络,并且在同一个节点上运行。Pod 中的容器相互配合,共享一个网络命名空间,因此它们能够通过 localhost 互相通信。

创建和删除 Pod

创建 Pod: 可以通过 kubectl run 或者 YAML 文件来创建 Pod。以下是通过 YAML 创建 Pod 的示例:

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: nginx
    image: nginx
    ports:
    - containerPort: 80

使用以下命令创建 Pod:

kubectl apply -f pod.yaml

删除 Pod:

kubectl delete pod mypod

查看 Pod 状态、日志、执行命令

  • 查看 Pod 状态:
kubectl get pods
  • 查看 Pod 的详细信息:
kubectl describe pod mypod
  • 查看 Pod 日志:
kubectl logs mypod
  • 在 Pod 中执行命令(kubectl exec):
kubectl exec -it mypod -- /bin/bash

Pod 限制和资源请求

在 Kubernetes 中,可以为 Pod 设置资源请求和限制,确保容器能够获得适量的资源,同时防止单个容器占用过多资源。

  • 资源请求(Resource Requests):定义容器启动时所需的最低资源量。
  • 资源限制(Resource Limits):定义容器可使用的最大资源量。

例如,设置 CPU 和内存的请求和限制:

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: nginx
    image: nginx
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"

2. Deployment 管理

什么是 Deployment?

Deployment 是一种 Kubernetes 控制器,旨在管理一组 Pod 的声明式更新。通过 Deployment,你可以轻松进行应用的滚动更新、回滚等操作。Deployment 主要用于管理 无状态(Stateless)应用

创建、更新和删除 Deployment

  • 创建 Deployment:
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80

使用以下命令创建 Deployment:

kubectl apply -f deployment.yaml
  • 更新 Deployment:

更新 Deployment 的镜像版本:

kubectl set image deployment/my-deployment nginx=nginx:latest
  • 删除 Deployment:
kubectl delete deployment my-deployment

配置滚动更新、回滚

  • 滚动更新:

Kubernetes 会在更新应用时逐步替换旧的 Pod,确保在更新过程中始终有一定数量的 Pod 在运行。例如,更新镜像版本时,Deployment 会逐步替换旧的 Pod。

kubectl set image deployment/my-deployment nginx=nginx:v2
  • 回滚:

如果更新导致应用出现问题,可以回滚到之前的版本:

kubectl rollout undo deployment/my-deployment

多副本和高可用配置

通过设置 replicas 参数,可以让 Deployment 管理多个副本(Pods),从而实现高可用性。

spec:
  replicas: 3  # 设置副本数量

Kubernetes 会确保始终保持指定数量的副本,如果某个 Pod 出现故障,Kubernetes 会自动重新调度新的 Pod 来替换它。


3. Service 管理

什么是 Service?

Service 是 Kubernetes 中用于暴露一组 Pod 的资源。它为 Pod 提供了一个稳定的虚拟 IP 地址和 DNS 名称,使得 Pod 即使被删除或重新调度,外部访问仍然可以通过 Service 进行。

创建 ClusterIP、NodePort、LoadBalancer 类型的 Service

  • ClusterIP(默认类型): 仅在集群内部可访问。适用于集群内部的服务之间的通信。比如,一个后端服务需要访问数据库或者多个微服务之间的相互调用,可以使用 ClusterIP。
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: myapp
  ports:
    - port: 80
      targetPort: 8080
  type: ClusterIP
  • NodePort: 在每个节点的某个端口上开放服务,使服务可以通过这个特定的端口从集群外部访问。NodePort 是在每个 Kubernetes 节点上分配一个端口(通常是 30000-32767 的范围)。
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: myapp
  ports:
    - port: 80
      targetPort: 8080
      nodePort: 30001
  type: NodePort
  • LoadBalancer: 在云环境中,LoadBalancer 类型会为每个 Service 创建一个云提供商的负载均衡器(如 AWS 的 ELB、GCP 的 GCLB 等)。它将请求直接转发到 Service(通常是 ClusterIP),并将负载均衡器暴露给外部用户。
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: myapp
  ports:
    - port: 80
      targetPort: 8080
  type: LoadBalancer

使用 Ingress 进行 HTTP 路由和负载均衡

Ingress 是 Kubernetes 中用于管理 HTTP 和 HTTPS 路由的资源。通过 Ingress,你可以根据请求的 URL 或主机名将流量路由到不同的服务。Ingress的实现方式有很多,比如Nginx/HAProxy等。

示例 Ingress 配置:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
spec:
  rules:
  - host: myapp.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: my-service
            port:
              number: 80

Ingress 控制器会根据 hostpath 路由流量。

下面是Ingress和service一级pod的逻辑关系图。

graph TD
  Ingress -->|Routes to| Service
  Service -->|Forwards to| Pod1
  Service -->|Forwards to| Pod2
  Service -->|Forwards to| Pod3

  subgraph Kubernetes Cluster
    Service
    Pod1
    Pod2
    Pod3
  end

  Ingress["Ingress"]
  Service["Service"]
  Pod1["Pod 1"]
  Pod2["Pod 2"]
  Pod3["Pod 3"]


总结

本文详细介绍了 Kubernetes 中的一些基本操作,包括 Pod、Deployment、Service。掌握这些基本概念和操作将帮助你高效管理 Kubernetes 集群中的应用。希望这篇博客能够为你提供有价值的信息。如果有任何问题,欢迎随时讨论!