Kubernetes 容器集群管理系统

学习目标

本专题将帮助您全面掌握 Kubernetes 容器编排平台,从基础概念到高级特性,从集群搭建到日常运维。

Kubernetes 概述

Kubernetes 源于希腊语,意为舵手,因为首尾字母中间正好有8个字母,简称为 K8S。Kubernetes 是当今最流行的开源容器管理平台,是 Google 发起并维护的基于 Docker 的开源容器集群管理系统。它是大名鼎鼎的 Google Borg 的开源版本。

K8s 构建在 Docker 技术之上,为容器化的应用提供资源调度、部署运行、服务发现、扩容缩容、负载均衡等一套功能,因为容器本身就是可移植的,所以 Kubernetes 容器集群也能跑在私有云、公有云或者混合云上面。

Kubernetes 的关键特性

  • 自动化装箱:在不牺牲可用性的条件下,基于容器对资源的要求和约束自动部署容器。
  • 自愈能力:当容器失败时,会对容器进行重启;当所部署的 Node 节点有问题时,会对容器进行重新部署和重新调度。
  • 水平扩容:通过简单的命令、用户界面或基于 CPU 的使用情况,能够对应用进行扩容和缩容。
  • 服务发现和负载均衡:开发者不需要使用额外的服务发现机制,就能够基于 Kubernetes 进行服务发现和负载均衡。
  • 自动发布和回滚:Kubernetes 能够程序化的发布应用和相关的配置。如果发布有问题,Kubernetes 将能够回归发生的变更。
  • 保密和配置管理:在不需要重新构建镜像的情况下,可以部署和更新保密和应用配置。
  • 存储编排:自动挂接存储系统,这些存储系统可以来自于本地、公共云提供商或网络存储。

Kubernetes 架构设计

Kubernetes 属于主从分布式架构,主要由 Master NodeWorker Node 组成,包括客户端命令行工具 kubectl 和其它附加项。

Master Node(控制节点)

作为控制节点,对集群进行统一的调度和管理。Master Node 由以下组件组成:

  • API Server:Kubernetes 所有服务的入口,提供认证、授权、访问控制、API 注册和发现等机制。
  • Cluster State Store:默认使用 etcd 作为集群整体存储,存储集群的所有状态。
  • Scheduler:调度服务,按照预定的调度策略将 Pod 调度到相应的节点上。
  • Controller Manager:负责维护集群的状态,比如故障检测、自动扩展、滚动更新等。

Worker Node(工作节点)

作为真正的工作节点,运行业务应用的容器。Worker Node 包含以下组件:

  • kubelet:在每个节点上运行的代理,负责维护和管理节点上 Pod 的运行状态。
  • kube proxy:负责为 Pod 创建代理服务,实现 Service 到 Pod 的路由和转发,以及应用的负载均衡。
  • Container Runtime:负责运行容器的软件,如 Docker、containerd 等。
  • Pod:Kubernetes 的最小工作单元,每个 Pod 包含一个或多个容器。

K8S 集群部署

Kubernetes 提供了多种部署方式,常用的包括:

kubeadm 方式部署

Kubeadm 是一个工具,它提供了 kubeadm init 以及 kubeadm join 这两个命令作为快速创建 Kubernetes 集群的最佳实践。

# 初始化 Master 节点
kubeadm init --pod-network-cidr=10.244.0.0/16

# 将 Node 节点加入集群
kubeadm join <MASTER_NODE_IP>:6443 --token <TOKEN> \
    --discovery-token-ca-cert-hash sha256:<HASH>

环境准备

在部署 Kubernetes 集群前,需要确保所有节点满足以下条件:

  • 关闭 swap 分区
  • 关闭防火墙
  • 关闭 SELinux
  • 配置正确的 hosts 文件
  • 安装 Docker 和 kubeadm、kubelet、kubectl

Pod 管理

Pod 是 Kubernetes 中最小的部署单元,每个 Pod 包含一个或多个紧密相关的容器。

创建 Pod

可以使用 YAML 文件定义 Pod:

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: nginx
spec:
  containers:
  - name: nginx-container
    image: nginx:1.15.2
    ports:
    - containerPort: 80

使用 kubectl 创建 Pod:

kubectl apply -f nginx-pod.yaml

Pod 生命周期

  • Pending:Pod 已被 Kubernetes 系统接受,但有一个或多个容器尚未创建
  • Running:Pod 已经绑定到了节点,所有容器都已创建,并且至少有一个容器在运行
  • Succeeded:Pod 中的所有容器都已成功终止,并且不会再重启
  • Failed:Pod 中的所有容器都已终止,并且至少有一个容器是因为失败终止
  • Unknown:因为某些原因无法取得 Pod 的状态

Service 与网络

Service 是 Kubernetes 中抽象化访问 Pod 的策略,为 Pod 提供稳定的网络端点。

Service 类型

  • ClusterIP:在集群内部使用,也是默认值
  • NodePort:在所有节点上打开一个端口,此端口可以代理至后端 Pod
  • LoadBalancer:使用云提供商的负载均衡器公开服务
  • ExternalName:通过返回定义的 CNAME 别名

创建 Service

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
  - port: 80
    targetPort: 80
  type: NodePort

存储系统

Kubernetes 提供了多种存储解决方案,包括:

Volume

Volume 是磁盘上的文件夹并且没有生命周期的管理,支持多种类型:

  • emptyDir:Pod 被分配到 Node 上之后创建,Pod 运行期间一直存在
  • hostPath:将 Node 节点的文件系统挂载到 Pod 中
  • nfs:挂载 NFS 共享到 Pod
  • configMap:用于将配置数据注入到 Pod 中
  • secret:用于将敏感信息注入到 Pod 中

PersistentVolume (PV) 和 PersistentVolumeClaim (PVC)

PV 是集群中的存储资源,PVC 是用户对存储的请求:

# 创建 PV
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-volume
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/data"

# 创建 PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pv-claim
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

后续更新计划

本网站将持续更新以下内容:

  • Kubernetes 高级特性(HPA、RBAC、NetworkPolicy 等)
  • 监控与日志(Prometheus、Grafana、EFK 等)
  • CI/CD 流水线(Jenkins、GitLab CI、ArgoCD 等)
  • 服务网格(Istio、Linkerd)
  • 云原生技术栈

学习建议

建议按照以下顺序学习 Kubernetes:

  1. 理解容器和 Docker 基础
  2. 学习 Kubernetes 核心概念
  3. 搭建测试集群并实践基本操作
  4. 深入学习高级特性和最佳实践
  5. 在生产环境中部署和管理集群