Kubernetes 介绍:从零开始学习 K8s

Kubernetes 介绍:从零开始学习 K8s

随着云计算的兴起,容器化技术(如 Docker)变得越来越流行。容器提供了一种轻量级、可移植的方式来打包和运行应用程序及其依赖项。然而,当您拥有大量容器时,手动管理这些容器的部署、扩展、网络和存储变得非常具有挑战性。这就是 Kubernetes(通常简称为 K8s)发挥作用的地方。

1. 什么是 Kubernetes?

Kubernetes 是一个开源的容器编排平台,最初由 Google 设计,现在由云原生计算基金会 (CNCF) 维护。它自动化了容器化应用程序的部署、扩展和管理,使您能够专注于应用程序的开发而不是底层基础设施。

核心功能:

  • 自动化部署和回滚: Kubernetes 可以根据您定义的配置自动部署应用程序的新版本,并在出现问题时回滚到以前的版本。
  • 服务发现和负载均衡: Kubernetes 可以自动发现运行在集群中的服务,并使用内置的负载均衡器将流量分配到不同的实例。
  • 存储编排: Kubernetes 可以自动挂载您选择的存储系统,无论是本地存储、网络存储(如 NFS、iSCSI)还是公有云提供商(如 AWS EBS、GCE Persistent Disk)的存储。
  • 自动扩缩容: Kubernetes 可以根据资源使用情况(如 CPU 或内存利用率)自动增加或减少应用程序的实例数量。
  • 自我修复: Kubernetes 可以监控容器的健康状况,并在容器失败时自动重启、替换或重新调度它们。
  • 配置管理和密钥管理: Kubernetes 可以安全地存储和管理敏感信息,如密码、OAuth 令牌和 SSH 密钥。
  • 批处理执行: Kubernetes 可以管理批处理和 CI 工作负载,替换失败的容器。

为什么选择 Kubernetes?

  • 提高资源利用率: Kubernetes 可以更有效地利用您的硬件资源,减少浪费。
  • 提高应用程序可用性: Kubernetes 的自我修复和自动扩缩容功能可以确保您的应用程序始终可用且响应迅速。
  • 加快开发周期: Kubernetes 可以自动化许多与部署和管理相关的任务,使开发人员能够更快地迭代和发布新功能。
  • 可移植性: Kubernetes 可以运行在各种环境中,包括公有云、私有云和混合云。
  • 强大的社区支持: Kubernetes 拥有一个庞大而活跃的社区,可以提供帮助和支持。

2. Kubernetes 的核心概念

在深入了解 Kubernetes 的工作原理之前,我们需要了解一些核心概念:

  • 集群(Cluster): Kubernetes 集群是一组运行容器化应用程序的节点(Node)。
  • 节点(Node): 节点是 Kubernetes 集群中的工作机器,可以是物理机或虚拟机。每个节点都运行着以下组件:
    • Kubelet: 负责与控制平面通信并管理节点上的容器。
    • Kube-proxy: 负责实现 Kubernetes 服务抽象的网络代理。
    • 容器运行时(Container Runtime): 负责运行容器的软件,如 Docker、containerd 或 CRI-O。
  • 控制平面(Control Plane): 控制平面是 Kubernetes 集群的“大脑”,负责管理整个集群的状态。它包括以下组件:
    • API Server(kube-apiserver): 提供 Kubernetes API,是所有组件交互的中心。
    • 调度器(kube-scheduler): 负责将 Pod 调度到合适的节点上运行。
    • 控制器管理器(kube-controller-manager): 运行各种控制器,负责维护集群的期望状态。
    • etcd: 一个高可用的键值存储,用于存储 Kubernetes 集群的所有配置数据。
  • Pod: Pod 是 Kubernetes 中最小的可部署单元,它可以包含一个或多个容器。同一个 Pod 中的容器共享网络和存储资源。
  • Deployment: Deployment 是一个控制器,用于管理 Pod 的副本集。它可以确保指定数量的 Pod 副本始终运行,并在 Pod 失败时自动替换它们。
  • Service: Service 提供了一种稳定的方式来访问一组 Pod。它定义了一个逻辑上的 Pod 集合和一个访问它们的策略(通常通过一个虚拟 IP 地址和 DNS 名称)。
  • Namespace: Namespace 提供了一种在集群中隔离资源的方式。它可以将集群划分为多个虚拟集群,用于不同的团队或项目。
  • ConfigMap 和 Secret: ConfigMap 用于存储非敏感的配置数据,而 Secret 用于存储敏感信息,如密码和令牌。
  • Volume: Volume 提供了一种持久化存储的方式,可以被 Pod 中的容器挂载和使用。
  • Ingress: Ingress 提供了一种将集群外部的流量路由到集群内部服务的方式。

3. Kubernetes 的工作原理

Kubernetes 的工作原理可以概括为以下几个步骤:

  1. 用户通过 kubectl 命令行工具或其他客户端与 API Server 交互。 用户可以创建、更新、删除或查询 Kubernetes 资源,如 Pod、Deployment 和 Service。
  2. API Server 验证请求并将其写入 etcd。 etcd 存储了集群的所有配置数据,并确保数据的一致性和可靠性。
  3. 调度器(Scheduler)监视 etcd 中的新 Pod。 当发现一个没有被分配到节点的 Pod 时,调度器会根据一系列策略(如资源需求、亲和性/反亲和性、污点和容忍度)选择一个合适的节点来运行该 Pod。
  4. 调度器将 Pod 的调度结果写入 etcd。
  5. Kubelet 监视 etcd 中的 Pod 调度结果。 当发现一个被调度到自己所在节点的 Pod 时,Kubelet 会指示容器运行时(如 Docker)创建和运行该 Pod 中的容器。
  6. 控制器管理器(Controller Manager)监视集群的状态。 它会持续检查集群的当前状态是否与期望状态一致。例如,Deployment 控制器会确保指定数量的 Pod 副本始终运行。
  7. Kube-proxy 负责实现 Kubernetes 服务抽象。 它会在每个节点上运行,并根据 Service 的配置将流量转发到正确的 Pod。

4. 安装和配置 Kubernetes

安装 Kubernetes 的方法有很多种,取决于您的环境和需求。以下是一些常见的安装方法:

  • Minikube: Minikube 是一个轻量级的 Kubernetes 发行版,可以在本地机器上运行单节点的 Kubernetes 集群,非常适合学习和开发。
  • kubeadm: kubeadm 是一个用于在现有机器上部署 Kubernetes 集群的工具。它提供了一种简单而标准的方式来安装和配置 Kubernetes。
  • 托管的 Kubernetes 服务: 许多云提供商都提供了托管的 Kubernetes 服务,如 Google Kubernetes Engine (GKE)、Amazon Elastic Kubernetes Service (EKS) 和 Azure Kubernetes Service (AKS)。这些服务可以简化 Kubernetes 集群的管理和维护。

使用 Minikube 安装 Kubernetes(示例):

  1. 安装 Minikube:
    ```bash
    # macOS
    brew install minikube

    Linux

    curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
    sudo install minikube-linux-amd64 /usr/local/bin/minikube

    Windows

    使用 Chocolatey 包管理器

    choco install minikube
    ```

  2. 启动 Minikube 集群:
    bash
    minikube start

  3. 验证安装:
    bash
    kubectl get nodes

    如果看到一个名为 "minikube" 的节点,并且状态为 "Ready",则表示安装成功。

使用 kubectl 与 Kubernetes 交互:

kubectl 是 Kubernetes 的命令行工具,用于与 Kubernetes 集群进行交互。以下是一些常用的 kubectl 命令:

  • kubectl get: 获取资源信息,如 kubectl get podskubectl get serviceskubectl get deployments
  • kubectl create: 创建资源,如 kubectl create deployment my-app --image=nginx
  • kubectl apply: 应用配置文件来创建或更新资源,如 kubectl apply -f my-app.yaml
  • kubectl delete: 删除资源,如 kubectl delete pod my-podkubectl delete deployment my-app
  • kubectl describe: 获取资源的详细信息,如 kubectl describe pod my-pod
  • kubectl logs: 获取 Pod 中容器的日志,如 kubectl logs my-pod
  • kubectl exec: 在 Pod 中的容器内执行命令,如 kubectl exec -it my-pod -- /bin/bash
  • kubectl port-forward: 将本地端口转发到 Pod 的端口,如 kubectl port-forward my-pod 8080:80

5. 部署一个简单的应用程序

让我们通过一个简单的示例来演示如何在 Kubernetes 上部署一个应用程序。我们将使用一个简单的 Nginx Web 服务器作为示例。

  1. 创建一个 Deployment:

    创建一个名为 nginx-deployment.yaml 的文件,内容如下:

    yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: nginx-deployment
    spec:
    replicas: 3 # 指定运行 3 个 Nginx Pod 副本
    selector:
    matchLabels:
    app: nginx
    template:
    metadata:
    labels:
    app: nginx
    spec:
    containers:
    - name: nginx
    image: nginx:latest # 使用最新版本的 Nginx 镜像
    ports:
    - containerPort: 80 # 暴露容器的 80 端口

  2. 应用 Deployment:

    bash
    kubectl apply -f nginx-deployment.yaml

  3. 查看 Deployment 和 Pod:

    bash
    kubectl get deployments
    kubectl get pods

  4. 创建一个 Service:

    创建一个名为 nginx-service.yaml 的文件,内容如下:

    yaml
    apiVersion: v1
    kind: Service
    metadata:
    name: nginx-service
    spec:
    selector:
    app: nginx # 选择标签为 app=nginx 的 Pod
    ports:
    - protocol: TCP
    port: 80 # Service 的端口
    targetPort: 80 # Pod 的端口
    type: NodePort # 使用 NodePort 类型,将 Service 暴露给集群外部

  5. 应用 Service:

    bash
    kubectl apply -f nginx-service.yaml

  6. 查看 Service:

    bash
    kubectl get services

    您将看到一个名为 nginx-service 的 Service,类型为 NodePort。记下 PORT(S) 列中的端口号(例如 80:32000/TCP)。

  7. 访问应用程序:

    • 如果使用 Minikube:

      bash
      minikube service nginx-service

      Minikube 将自动打开一个浏览器窗口,显示 Nginx 的欢迎页面。

    • 如果使用其他 Kubernetes 环境:

      您可以通过节点的 IP 地址和 NodePort 来访问应用程序。例如,如果节点的 IP 地址是 192.168.1.100,NodePort 是 32000,则可以在浏览器中输入 http://192.168.1.100:32000 来访问应用程序。

6. 进一步学习

这只是 Kubernetes 的入门介绍。要深入了解 Kubernetes,建议您学习以下主题:

  • 更高级的 Deployment 策略: 如滚动更新、金丝雀发布、蓝绿部署。
  • 持久化存储: 如何使用 Volume 和 PersistentVolumeClaim 来管理应用程序的数据。
  • 网络策略: 如何使用 NetworkPolicy 来控制 Pod 之间的网络流量。
  • Ingress 和 Ingress Controller: 如何使用 Ingress 来管理集群外部的流量。
  • Helm: Kubernetes 的包管理器,可以简化应用程序的部署和管理。
  • 监控和日志: 如何使用 Prometheus、Grafana 和 EFK (Elasticsearch, Fluentd, Kibana) 等工具来监控和记录 Kubernetes 集群和应用程序的指标和日志。
  • 安全: Kubernetes 的安全最佳实践,如 RBAC (Role-Based Access Control)、Pod 安全策略等。
  • 自定义资源定义 (CRD): 如何扩展 Kubernetes API 以支持自定义资源。
  • Operator: 如何使用 Operator 来自动化复杂应用程序的管理。

学习资源:

7. 总结

Kubernetes 是一个强大而复杂的容器编排平台,它可以帮助您自动化容器化应用程序的部署、扩展和管理。通过学习 Kubernetes 的核心概念和工作原理,您可以更好地利用 Kubernetes 的优势,构建和管理现代化的云原生应用程序。希望这篇文章能帮助您入门 Kubernetes,并为您进一步学习 Kubernetes 打下基础。

THE END