Docker与Kubernetes完全掌握第6篇:Kubernetes基础 - 概念与架构
Docker & Kubernetes Complete Guide Part 6: Kubernetes Basics - Concepts and Architecture
前言:容器编排的标准
到目前为止,我们已经学习了如何通过Docker创建和管理容器。但在实际生产环境中,需要在多台服务器上运行数十甚至数百个容器。此时手动管理每个容器实际上是不可能的。
在本第6篇中,我们将了解已成为容器编排事实标准的Kubernetes(简称K8s)的基础概念和架构。理解什么是Kubernetes、为什么需要它以及它是如何构成的,将帮助您在云原生环境中对应用程序运营有一个全面的认识。
1. 什么是Kubernetes?
1.1 Kubernetes的定义
Kubernetes是一个用于自动化部署、扩展和管理容器化应用程序的开源平台。它在希腊语中意为"舵手"或"飞行员",扮演着适当运输和管理容器这一"货物"的角色。
"K8s"这个缩写来源于K和s之间有8个字母(ubernete)。
1.2 Kubernetes的历史
- 2014年:Google基于其内部使用的Borg系统的经验,将Kubernetes开源发布
- 2015年:发布1.0版本,捐赠给云原生计算基金会(CNCF)
- 2018年:成为CNCF的第一个"毕业"项目
- 现在:已成为容器编排的事实标准
1.3 Kubernetes提供的功能
- 服务发现和负载均衡:通过DNS名称或IP地址暴露容器,并分发流量
- 存储编排:自动挂载本地存储、云存储等
- 自动化滚动更新和回滚:逐步部署应用程序更改,出现问题时回滚到先前版本
- 自动装箱(Bin Packing):根据资源需求将容器最优放置在节点上
- 自我修复(Self-healing):重启失败的容器,替换无响应的容器
- 密钥和配置管理:安全存储和管理敏感信息
2. 为什么需要Kubernetes?
2.1 仅使用Docker不足的原因
在单个服务器上运行几个容器时,仅使用Docker就足够了。但在实际生产环境中,有以下需求:
- 在多台服务器上分布部署数百个容器
- 流量增加时自动扩展容器数量
- 容器故障时自动恢复
- 无停机部署(滚动更新、蓝绿部署、金丝雀部署)
- 容器间网络和存储管理
- 资源监控和日志记录
2.2 容器编排的必要性
容器编排是指自动化容器的部署、管理、扩展和网络连接。就像交响乐团的指挥协调各种乐器一样,容器编排器协调众多容器。
| 手动管理的问题 | 编排的解决方案 |
|---|---|
| 服务器故障时需要手动恢复 | 自动故障检测和恢复 |
| 流量增加时需要手动扩展 | 自动扩缩容(HPA、VPA) |
| 部署时发生停机 | 无停机滚动更新 |
| 容器放置优化困难 | 自动调度和装箱 |
| 服务间通信复杂 | 服务发现和负载均衡 |
2.3 Kubernetes vs 其他编排工具
- Docker Swarm:Docker原生编排,简单但功能有限
- Apache Mesos:通用集群管理工具,学习曲线陡峭
- Nomad:HashiCorp的编排工具,轻量级
- Kubernetes:功能最多,生态系统最大,事实标准
3. Kubernetes架构
Kubernetes集群主要由Control Plane(控制平面)和Worker Node(工作节点)组成。
3.1 Control Plane(主节点)
Control Plane充当集群的"大脑"。它管理集群的状态,并调度在工作节点上运行的工作负载。
3.1.1 API Server(kube-apiserver)
Kubernetes所有通信的中心。kubectl命令、其他组件和外部客户端都通过API Server与集群交互。
- 提供RESTful API
- 处理认证(Authentication)、授权(Authorization)
- 请求验证
- 与etcd的唯一通信渠道
3.1.2 etcd
存储集群所有状态数据的分布式键值存储。
- 存储集群配置、状态、元数据
- 通常配置为3个或5个实例以实现高可用性
- 使用Raft共识算法
- 集群备份 = etcd备份
3.1.3 Scheduler(kube-scheduler)
决定新创建的Pod应该放置在哪个节点上。
- 考虑资源需求(CPU、内存)
- 检查节点的可用资源
- 应用亲和性/反亲和性规则
- 处理污点(Taint)和容忍(Toleration)
3.1.4 Controller Manager(kube-controller-manager)
运行各种控制器以将集群状态维持在期望状态。
- Node Controller:监控节点状态
- Replication Controller:维护Pod数量
- Endpoints Controller:连接Service和Pod
- Service Account Controller:创建账户和令牌
3.1.5 Cloud Controller Manager(可选)
与云提供商的API集成,管理云特定功能。
- 负载均衡器配置
- 存储卷管理
- 节点管理(云实例)
3.2 Worker Node
Worker Node是实际运行应用程序容器的服务器。
3.2.1 kubelet
在每个节点上运行的代理,管理Pod的生命周期。
- 从API Server接收Pod规范(PodSpec)
- 向容器运行时请求创建/删除容器
- 监控容器状态并报告
- 向API Server报告节点状态信息
3.2.2 kube-proxy
在每个节点上执行网络代理角色。
- 将Service的虚拟IP映射到实际Pod IP
- 管理iptables或IPVS规则
- 路由集群内部和外部流量
- 负载均衡(轮询)
3.2.3 Container Runtime
实际运行容器的软件。
- containerd:从Docker分离出来的行业标准运行时
- CRI-O:Kubernetes专用轻量级运行时
- Docker Engine:从Kubernetes 1.24开始停止直接支持(移除dockershim)
3.3 架构图
┌─────────────────────────────────────────────────────────────────┐
│ CONTROL PLANE │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ API Server │ │ Scheduler │ │ Controller │ │
│ │ │ │ │ │ Manager │ │
│ └──────┬──────┘ └─────────────┘ └─────────────┘ │
│ │ │
│ ┌──────┴──────┐ │
│ │ etcd │ │
│ │ (Key-Value) │ │
│ └─────────────┘ │
└─────────────────────────────────────────────────────────────────┘
│
│ (API 通信)
│
┌─────────────────────────────────────────────────────────────────┐
│ WORKER NODE 1 │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ kubelet │ │ kube-proxy │ │ Container │ │
│ │ │ │ │ │ Runtime │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ Pod 1 │ │ Pod 2 │ │ Pod 3 │ │
│ └─────────┘ └─────────┘ └─────────┘ │
└─────────────────────────────────────────────────────────────────┘
4. Kubernetes核心对象
4.1 Pod
Pod是Kubernetes中可以创建和管理的最小部署单元。
Pod的特点:
- 包含一个或多个容器
- 同一Pod中的容器共享网络和存储
- 同一Pod中的容器通过localhost通信
- 通常是一个主容器 + 辅助容器(Sidecar)
- Pod是临时的(ephemeral)- 可能随时被删除和重新创建
# pod-example.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.24
ports:
- containerPort: 80
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
4.2 Service
Service为Pod集合提供稳定的网络端点。Pod的IP可能会改变,但Service的IP(ClusterIP)是固定的。
Service类型:
- ClusterIP(默认):只能在集群内部访问
- NodePort:通过每个节点的特定端口允许外部访问
- LoadBalancer:通过云负载均衡器进行外部访问
- ExternalName:将外部DNS名称映射到集群内部
# service-example.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx # 将流量转发到具有此标签的Pod
ports:
- protocol: TCP
port: 80 # Service端口
targetPort: 80 # Pod的容器端口
type: ClusterIP
4.3 Deployment
Deployment提供Pod的声明式更新。定义期望的状态后,Deployment Controller会使实际状态达到期望状态。
Deployment的功能:
- 管理Pod数量(replicas)
- 滚动更新和回滚
- 扩缩容(手动/自动)
- Pod模板管理
# deployment-example.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3 # 维护3个Pod
selector:
matchLabels:
app: nginx
template: # Pod模板
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.24
ports:
- containerPort: 80
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1 # 滚动更新时可额外创建的Pod数
maxUnavailable: 0 # 滚动更新时不可用的Pod数
4.4 Namespace
Namespace是逻辑上分离集群的虚拟集群。
默认Namespace:
- default:未指定时创建资源的默认命名空间
- kube-system:用于Kubernetes系统组件
- kube-public:所有用户都可以读取的公共资源
- kube-node-lease:存储节点心跳信息
# namespace-example.yaml
apiVersion: v1
kind: Namespace
metadata:
name: development
labels:
environment: dev
---
apiVersion: v1
kind: Namespace
metadata:
name: production
labels:
environment: prod
Namespace的用途:
- 环境隔离(dev、staging、production)
- 按团队隔离资源
- 应用资源配额(ResourceQuota)
- 应用网络策略(NetworkPolicy)
5. kubectl基础
kubectl是与Kubernetes集群交互的命令行工具。
5.1 kubectl安装
# macOS (Homebrew)
brew install kubectl
# Windows (Chocolatey)
choco install kubernetes-cli
# Linux (curl)
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x kubectl
sudo mv kubectl /usr/local/bin/
5.2 基本命令结构
kubectl [command] [TYPE] [NAME] [flags]
# 示例
kubectl get pods # 查看所有Pod
kubectl get pod nginx-pod # 查看特定Pod
kubectl get pods -n kube-system # 查看kube-system命名空间的Pod
kubectl get pods -o wide # 包含详细信息的查看
kubectl get pods -o yaml # 以YAML格式输出
5.3 常用命令
资源查询(get)
# 查看Pod列表
kubectl get pods
kubectl get pods -A # 所有命名空间
# 查看Service列表
kubectl get services
kubectl get svc # 使用缩写
# 查看Deployment列表
kubectl get deployments
kubectl get deploy # 使用缩写
# 同时查看多种资源
kubectl get pods,services,deployments
# 按标签过滤
kubectl get pods -l app=nginx
# 查看所有资源
kubectl get all
资源详细信息(describe)
# Pod详细信息
kubectl describe pod nginx-pod
# Node详细信息
kubectl describe node node-1
# Service详细信息
kubectl describe service nginx-service
创建资源(create、apply)
# 使用YAML文件创建资源
kubectl apply -f deployment.yaml
# 应用目录中的所有YAML文件
kubectl apply -f ./manifests/
# 命令式创建资源
kubectl create deployment nginx --image=nginx:1.24
kubectl create namespace my-namespace
# Dry-run(不实际创建进行测试)
kubectl apply -f deployment.yaml --dry-run=client
修改资源(edit、patch、scale)
# 直接编辑资源(打开编辑器)
kubectl edit deployment nginx-deployment
# 使用patch进行部分修改
kubectl patch deployment nginx-deployment -p '{"spec":{"replicas":5}}'
# 调整规模
kubectl scale deployment nginx-deployment --replicas=5
删除资源(delete)
# 删除特定资源
kubectl delete pod nginx-pod
kubectl delete deployment nginx-deployment
# 删除YAML文件中定义的资源
kubectl delete -f deployment.yaml
# 按标签删除
kubectl delete pods -l app=nginx
# 删除命名空间及其中的所有资源
kubectl delete namespace development
日志和调试
# 查看Pod日志
kubectl logs nginx-pod
kubectl logs nginx-pod -f # 实时日志流
kubectl logs nginx-pod --previous # 上一个容器的日志
# 多容器Pod中查看特定容器日志
kubectl logs nginx-pod -c sidecar
# 在Pod内部执行命令
kubectl exec nginx-pod -- ls /usr/share/nginx/html
kubectl exec -it nginx-pod -- /bin/bash # 交互式shell
# 端口转发(在本地访问Pod)
kubectl port-forward pod/nginx-pod 8080:80
kubectl port-forward service/nginx-service 8080:80
5.4 上下文和命名空间管理
# 查看当前上下文
kubectl config current-context
# 查看可用上下文列表
kubectl config get-contexts
# 切换上下文
kubectl config use-context my-cluster
# 更改默认命名空间
kubectl config set-context --current --namespace=development
5.5 有用的kubectl插件和工具
# kubectx - 快速切换上下文
brew install kubectx
kubectx # 上下文列表和切换
kubens # 命名空间列表和切换
# k9s - 终端UI
brew install k9s
k9s
# kubectl自动补全(bash)
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc
# kubectl别名设置
alias k='kubectl'
alias kgp='kubectl get pods'
alias kgs='kubectl get services'
6. 实践:部署第一个应用程序
6.1 本地Kubernetes环境设置
# 在Docker Desktop中启用Kubernetes
# Settings > Kubernetes > Enable Kubernetes
# 或使用Minikube
brew install minikube
minikube start
# 检查集群状态
kubectl cluster-info
kubectl get nodes
6.2 部署Nginx
# 1. 创建Deployment
kubectl create deployment nginx-demo --image=nginx:1.24
# 2. 确认Deployment
kubectl get deployments
kubectl get pods
# 3. 创建Service(NodePort类型)
kubectl expose deployment nginx-demo --type=NodePort --port=80
# 4. 确认Service
kubectl get services
# 5. 访问测试(Minikube)
minikube service nginx-demo
# 6. 或使用端口转发
kubectl port-forward service/nginx-demo 8080:80
# 在浏览器中访问 http://localhost:8080
6.3 扩缩容测试
# 扩展Pod数量
kubectl scale deployment nginx-demo --replicas=5
# 确认Pod
kubectl get pods -o wide
# 缩减Pod数量
kubectl scale deployment nginx-demo --replicas=2
6.4 滚动更新
# 更新镜像
kubectl set image deployment/nginx-demo nginx=nginx:1.25
# 检查滚动更新状态
kubectl rollout status deployment/nginx-demo
# 滚动更新历史
kubectl rollout history deployment/nginx-demo
# 回滚
kubectl rollout undo deployment/nginx-demo
6.5 清理
# 删除资源
kubectl delete deployment nginx-demo
kubectl delete service nginx-demo
# 或一次性删除
kubectl delete deployment,service nginx-demo
7. Kubernetes学习资源
7.1 官方文档
- Kubernetes官方文档:https://kubernetes.io/docs/
- Kubernetes教程:https://kubernetes.io/docs/tutorials/
- kubectl速查表:https://kubernetes.io/docs/reference/kubectl/cheatsheet/
7.2 本地学习环境
- Minikube:本地Kubernetes集群
- Kind(Kubernetes in Docker):使用Docker容器运行集群
- Docker Desktop:内置Kubernetes支持
- k3s:轻量级Kubernetes发行版
7.3 在线实践环境
- Katacoda:基于浏览器的Kubernetes实践
- Play with Kubernetes:免费在线Kubernetes环境
结论
在本第6篇中,我们了解了Kubernetes的基础概念和架构。核心内容总结如下:
- Kubernetes是什么:容器编排的事实标准平台
- 架构:由Control Plane(API Server、etcd、Scheduler、Controller Manager)和Worker Node(kubelet、kube-proxy、Container Runtime)组成
- 核心对象:Pod(最小部署单元)、Service(网络端点)、Deployment(声明式Pod管理)、Namespace(逻辑隔离)
- kubectl:与Kubernetes集群交互的CLI工具
Kubernetes乍看起来可能很复杂,但一旦理解其设计理念——"声明式配置"和"期望状态(Desired State)",就会发现它是一个非常强大和灵活的工具。
下一篇我们将介绍Kubernetes实战。我们将探讨ConfigMap和Secret的配置管理、通过Ingress的外部流量路由、通过PersistentVolume的数据持久化等实际运营所需的高级主题。