写在前面
在容器化技术日益普及的今天,Docker解决了应用的打包和运行问题,但当容器数量增多、需要跨多台服务器部署时,如何高效管理这些容器就成了新的挑战。Kubernetes(简称K8s)正是为解决这个问题而生的容器编排平台,它能够自动化部署、扩展和管理容器化应用。
本篇文章将重点讲解Kubernetes是什么、核心架构、环境搭建方法以及kubectl基础命令。
一、Kubernetes简介
1.1 什么是Kubernetes
Kubernetes是Google开源的容器编排平台,源于Google内部使用了15年的Borg系统。Kubernetes这个名字来自希腊语,意为"舵手"或"飞行员",它的logo是一个舵轮,象征着它作为容器集群"掌舵者"的角色。
Kubernetes的核心功能是自动化容器化应用的部署、扩展和管理。它提供了:
- 服务发现与负载均衡:自动暴露容器服务,分发网络流量
- 存储编排:自动挂载存储系统,支持多种存储后端
- 自动部署和回滚:声明式更新应用,支持自动回滚
- 自动装箱:根据资源需求和约束自动调度容器
- 自我修复:重启失败容器、替换和重新调度异常节点上的容器
- 密钥和配置管理:管理敏感信息和应用配置
1.2 为什么需要Kubernetes
当应用从单体架构转向微服务架构后,容器数量急剧增加。以一个典型的电商系统为例,可能包含用户服务、订单服务、支付服务、库存服务、网关服务等数十个微服务,每个服务可能需要多个实例。手动管理这些容器变得极其困难:
- 如何保证服务始终运行?
- 如何在服务器故障时自动迁移服务?
- 如何实现服务的自动扩缩容?
- 如何管理服务间的网络通信?
Kubernetes正是为解决这些问题而设计的。它像一个智能的运维团队,7x24小时监控和管理你的容器化应用。
1.3 Kubernetes vs Docker Swarm
|-------|---------------------|--------------|
| 对比项 | Kubernetes | Docker Swarm |
| 复杂度 | 较高,学习曲线陡峭 | 较低,上手简单 |
| 功能丰富度 | 非常丰富,企业级特性 | 基础功能,适合简单场景 |
| 生态系统 | 庞大,社区活跃 | 相对较小 |
| 自动扩缩容 | 支持HPA、VPA、CA | 不支持原生自动扩缩容 |
| 服务发现 | CoreDNS,功能强大 | 内置,功能基础 |
| 存储 | PV/PVC/StorageClass | Volume插件 |
| 适用场景 | 大规模生产环境 | 小型集群、开发测试 |
Docker Swarm适合快速入门和小规模部署,而Kubernetes则更适合企业级生产环境和复杂的微服务架构。
二、Kubernetes架构详解
Kubernetes集群采用Master-Worker架构,分为控制平面(Control Plane)和工作节点(Worker Node)两部分。
2.1 整体架构
┌─────────────────────────────────────────────────────────────────────────┐
│ Kubernetes集群架构 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ Master节点(控制平面) │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ API Server │ │Scheduler │ │Controller │ │ │
│ │ │ API服务器 │ │ 调度器 │ │Manager │ │ │
│ │ │ │ │ │ │ 控制器管理器 │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ ┌─────────────────────────────────────────────────────────┐ │ │
│ │ │ etcd │ │ │
│ │ │ 分布式键值存储 │ │ │
│ │ └─────────────────────────────────────────────────────────┘ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ Worker节点(工作节点) │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ Kubelet │ │ Kube-proxy │ │ Container │ │ │
│ │ │ 节点代理 │ │ 网络代理 │ │ Runtime │ │ │
│ │ │ │ │ │ │ 容器运行时 │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ ┌─────────────────────────────────────────────────────────┐ │ │
│ │ │ Pods │ │ │
│ │ │ ┌───────┐ ┌───────┐ ┌───────┐ ┌───────┐ │ │ │
│ │ │ │ Pod 1 │ │ Pod 2 │ │ Pod 3 │ │ Pod 4 │ │ │ │
│ │ │ └───────┘ └───────┘ └───────┘ └───────┘ │ │ │
│ │ └─────────────────────────────────────────────────────────┘ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
2.2 Master节点组件
Master节点负责集群的管理和调度,是集群的"大脑"。
API Server
API Server是Kubernetes的入口,所有组件和用户都通过它进行通信。它提供了RESTful API,用于查询和修改集群状态。API Server是唯一直接与etcd通信的组件,其他组件都需要通过API Server来获取或更新数据。
# 查看API Server状态
kubectl get componentstatuses
# 查看API Server版本
kubectl version
Scheduler(调度器)
Scheduler负责将Pod调度到合适的Worker节点上。它根据多种因素进行调度决策:
-
资源需求(CPU、内存)
-
硬件/软件/策略约束
-
亲和性和反亲和性规则
-
数据局部性要求
-
服务间的干扰
查看调度器日志
kubectl logs -n kube-system kube-scheduler-master
查看节点资源使用情况
kubectl describe nodes
Controller Manager(控制器管理器)
Controller Manager运行着各种控制器,每个控制器负责一种资源的管理:
-
Node Controller:监控节点健康状态
-
Replication Controller:维护Pod副本数量
-
Deployment Controller:管理Deployment的滚动更新
-
Service Controller:管理Service和负载均衡器
-
Endpoint Controller:填充Service的Endpoints
查看控制器管理器日志
kubectl logs -n kube-system kube-controller-manager-master
etcd
etcd是一个高可用的键值存储系统,用于存储Kubernetes集群的所有数据。它是集群的"数据库",存储了:
-
节点信息
-
Pod配置
-
Service定义
-
Secret和ConfigMap
-
集群状态
备份etcd数据
ETCDCTL_API=3 etcdctl snapshot save snapshot.db
--cacert=/etc/kubernetes/pki/etcd/ca.crt
--cert=/etc/kubernetes/pki/etcd/server.crt
--key=/etc/kubernetes/pki/etcd/server.key查看etcd成员
ETCDCTL_API=3 etcdctl member list
--cacert=/etc/kubernetes/pki/etcd/ca.crt
--cert=/etc/kubernetes/pki/etcd/server.crt
--key=/etc/kubernetes/pki/etcd/server.key
2.3 Worker节点组件
Worker节点负责运行容器化应用,是集群的"劳动力"。
Kubelet
Kubelet是运行在每个节点上的代理,负责:
-
监听API Server,获取分配给本节点的Pod
-
挂载Pod所需的存储卷
-
下载Pod所需的Secret
-
通过容器运行时运行容器
-
周期性向API Server汇报节点状态
查看kubelet状态
systemctl status kubelet
查看kubelet日志
journalctl -u kubelet -f
Kube-proxy
Kube-proxy维护节点上的网络规则,实现Service的负载均衡:
-
为Service创建iptables或IPVS规则
-
将Service的ClusterIP流量转发到后端Pod
-
支持SessionAffinity
查看kube-proxy日志
kubectl logs -n kube-system kube-proxy-xxxxx
查看iptables规则
iptables -t nat -L KUBE-SERVICES
Container Runtime
容器运行时负责运行容器,Kubernetes支持多种容器运行时:
-
Docker:最流行的容器运行时(已弃用,使用containerd)
-
containerd:Docker的核心容器运行时
-
CRI-O:专为Kubernetes设计的轻量级运行时
-
Podman:无守护进程的容器运行时
查看容器运行时
kubectl describe node | grep -i "Container Runtime"
查看运行的容器
crictl ps
2.4 核心概念关系图
┌─────────────────────────────────────────────────────────────────────────┐
│ Kubernetes核心概念关系 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ Namespace(命名空间) │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ Deployment(部署) │ │
│ │ ┌─────────────────────────────────────────────────────────┐ │ │
│ │ │ │ │ │
│ │ │ ReplicaSet(副本集) │ │ │
│ │ │ ┌─────────────────────────────────────────────────┐ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ Pod(最小调度单元) │ │ │ │
│ │ │ │ ┌─────────────────────────────────────────┐ │ │ │ │
│ │ │ │ │ Container(容器) │ │ │ │ │
│ │ │ │ │ ┌─────────┐ ┌─────────┐ │ │ │ │ │
│ │ │ │ │ │ 容器1 │ │ 容器2 │ │ │ │ │ │
│ │ │ │ │ └─────────┘ └─────────┘ │ │ │ │ │
│ │ │ │ └─────────────────────────────────────────┘ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ └─────────────────────────────────────────────────┘ │ │ │
│ │ │ │ │ │
│ │ └─────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ Service(服务) │ │
│ │ ┌─────────────────────────────────────────────────────────┐ │ │
│ │ │ ClusterIP / NodePort / LoadBalancer │ │ │
│ │ │ ────────────────────────────────────────────── │ │ │
│ │ │ 选择器(Selector)→ Pod标签匹配 │ │ │
│ │ └─────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
三、本地开发环境搭建
学习Kubernetes需要一个实验环境,以下是几种常用的本地开发环境搭建方式。
3.1 Minikube
Minikube是最流行的本地Kubernetes环境,适合学习和开发测试。
安装Minikube(Windows):
# 使用Chocolatey安装
choco install minikube
# 或者手动下载
# 访问 https://minikube.sigs.k8s.io/docs/start/ 下载安装包
安装Minikube(macOS):
# 使用Homebrew安装
brew install minikube
安装Minikube(Linux):
# 下载并安装
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
启动Minikube:
# 使用Docker驱动启动(推荐)
minikube start --driver=docker
# 指定Kubernetes版本
minikube start --kubernetes-version=v1.28.0
# 分配更多资源
minikube start --memory=4096 --cpus=4
# 查看状态
minikube status
# 停止集群
minikube stop
# 删除集群
minikube delete
常用Minikube命令:
# 打开Kubernetes Dashboard
minikube dashboard
# SSH进入节点
minikube ssh
# 查看节点IP
minikube ip
# 挂载本地目录到节点
minikube mount /host/path:/vm/path
# 查看插件列表
minikube addons list
# 启用插件
minikube addons enable ingress
minikube addons enable metrics-server
3.2 Kind
Kind(Kubernetes in Docker)是在Docker容器中运行Kubernetes的工具,启动速度快,适合CI/CD场景。
安装Kind(macOS/Linux):
# macOS
brew install kind
# Linux
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.20.0/kind-linux-amd64
chmod +x ./kind
sudo mv ./kind /usr/local/bin/kind
安装Kind(Windows):
# 使用Chocolatey
choco install kind
创建集群:
# 创建默认集群
kind create cluster
# 指定集群名称
kind create cluster --name my-cluster
# 使用配置文件创建多节点集群
cat <<EOF > kind-config.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker
EOF
kind create cluster --config kind-config.yaml
# 查看集群列表
kind get clusters
# 删除集群
kind delete cluster --name my-cluster
3.3 k3s
k3s是Rancher出品的轻量级Kubernetes,二进制文件不到100MB,适合边缘计算和IoT场景。
安装k3s(Linux):
# 安装k3s
curl -sfL https://get.k3s.io | sh -
# 查看节点状态
sudo k3s kubectl get nodes
# 获取kubeconfig
sudo cat /etc/rancher/k3s/k3s.yaml
# 停止k3s
sudo systemctl stop k3s
# 卸载k3s
sudo /usr/local/bin/k3s-uninstall.sh
3.4 环境对比
|-------|----------|---------|---------|
| 特性 | Minikube | Kind | k3s |
| 启动速度 | 较慢 | 快 | 最快 |
| 资源占用 | 中等 | 低 | 最低 |
| 多节点支持 | 支持(需配置) | 支持 | 支持 |
| 适用场景 | 学习开发 | CI/CD测试 | 边缘计算、生产 |
| 易用性 | 最好 | 好 | 好 |
四、kubectl命令基础
kubectl是Kubernetes的命令行工具,用于与Kubernetes集群交互。
4.1 安装kubectl
安装kubectl(macOS):
# 使用Homebrew
brew install kubectl
# 或者使用curl下载
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/darwin/amd64/kubectl"
chmod +x kubectl
sudo mv kubectl /usr/local/bin/
安装kubectl(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/
安装kubectl(Windows):
# 使用Chocolatey
choco install kubernetes-cli
# 或者使用curl下载
curl -LO "https://dl.k8s.io/release/v1.28.0/bin/windows/amd64/kubectl.exe"
# 将kubectl.exe添加到PATH
4.2 配置kubeconfig
kubeconfig文件用于配置kubectl访问集群的凭证。
# 查看当前配置
kubectl config view
# 查看当前上下文
kubectl config current-context
# 切换上下文
kubectl config use-context minikube
# 查看所有上下文
kubectl config get-contexts
# 设置默认命名空间
kubectl config set-context --current --namespace=default
kubeconfig文件结构:
apiVersion: v1
kind: Config
clusters:
- cluster:
certificate-authority: /path/to/ca.crt
server: https://kubernetes-api-server:6443
name: my-cluster
contexts:
- context:
cluster: my-cluster
namespace: default
user: my-user
name: my-context
current-context: my-context
users:
- name: my-user
user:
client-certificate: /path/to/client.crt
client-key: /path/to/client.key
4.3 常用命令详解
4.3.1 查看资源
# 查看节点
kubectl get nodes
kubectl get nodes -o wide
# 查看Pod
kubectl get pods
kubectl get pods -n kube-system
kubectl get pods -o wide
kubectl get pods --show-labels
# 查看所有命名空间的Pod
kubectl get pods -A
# 查看Deployment
kubectl get deployments
kubectl get deploy
# 查看Service
kubectl get services
kubectl get svc
# 查看所有资源
kubectl get all
kubectl get all -A
4.3.2 创建资源
# 使用命令行创建Deployment
kubectl create deployment nginx --image=nginx
# 使用YAML文件创建资源
kubectl apply -f deployment.yaml
# 创建命名空间
kubectl create namespace my-namespace
# 创建ConfigMap
kubectl create configmap my-config --from-literal=key1=value1
# 创建Secret
kubectl create secret generic my-secret --from-literal=password=mypassword
4.3.3 描述资源
# 查看节点详情
kubectl describe node node-name
# 查看Pod详情
kubectl describe pod pod-name
# 查看Deployment详情
kubectl describe deployment deployment-name
# 查看Service详情
kubectl describe service service-name
4.3.4 日志和调试
# 查看Pod日志
kubectl logs pod-name
# 实时查看日志
kubectl logs -f pod-name
# 查看指定容器的日志
kubectl logs pod-name -c container-name
# 查看之前容器的日志(容器重启后)
kubectl logs pod-name --previous
# 进入容器
kubectl exec -it pod-name -- /bin/bash
# 进入指定容器
kubectl exec -it pod-name -c container-name -- /bin/bash
# 端口转发
kubectl port-forward pod-name 8080:80
# 端口转发Service
kubectl port-forward svc/service-name 8080:80
4.3.5 删除资源
# 删除Pod
kubectl delete pod pod-name
# 删除Deployment
kubectl delete deployment deployment-name
# 使用YAML文件删除资源
kubectl delete -f deployment.yaml
# 删除命名空间(会删除命名空间下所有资源)
kubectl delete namespace my-namespace
# 强制删除Pod
kubectl delete pod pod-name --force --grace-period=0
4.3.6 编辑资源
# 编辑Deployment
kubectl edit deployment deployment-name
# 编辑Service
kubectl edit service service-name
# 编辑ConfigMap
kubectl edit configmap configmap-name
4.4 命令速查表
|------------------------|--------|
| 命令 | 说明 |
| kubectl get | 列出资源 |
| kubectl describe | 显示资源详情 |
| kubectl create | 创建资源 |
| kubectl apply | 应用配置文件 |
| kubectl delete | 删除资源 |
| kubectl edit | 编辑资源 |
| kubectl logs | 查看日志 |
| kubectl exec | 执行命令 |
| kubectl port-forward | 端口转发 |
| kubectl cp | 复制文件 |
| kubectl scale | 扩缩容 |
| kubectl rollout | 管理滚动更新 |
| kubectl label | 管理标签 |
| kubectl annotate | 管理注解 |
| kubectl top | 查看资源使用 |
五、第一个Kubernetes应用
让我们通过一个完整的示例,体验Kubernetes的部署流程。
5.1 创建Deployment
# 创建nginx deployment
kubectl create deployment nginx --image=nginx:1.21
# 查看deployment状态
kubectl get deployments
# 查看pod状态
kubectl get pods
# 查看pod详情
kubectl describe pod nginx-xxxxx
5.2 扩容应用
# 扩容到3个副本
kubectl scale deployment nginx --replicas=3
# 查看扩容结果
kubectl get pods
# 查看扩容状态
kubectl get deployment nginx
5.3 暴露服务
# 创建Service
kubectl expose deployment nginx --port=80 --target-port=80 --type=NodePort
# 查看Service
kubectl get services
# 获取访问地址
minikube service nginx --url
# 或者使用端口转发
kubectl port-forward svc/nginx 8080:80
5.4 更新应用
# 更新镜像版本
kubectl set image deployment/nginx nginx=nginx:1.22
# 查看滚动更新状态
kubectl rollout status deployment/nginx
# 查看更新历史
kubectl rollout history deployment/nginx
# 回滚到上一版本
kubectl rollout undo deployment/nginx
# 回滚到指定版本
kubectl rollout undo deployment/nginx --to-revision=1
5.5 清理资源
# 删除Service
kubectl delete service nginx
# 删除Deployment
kubectl delete deployment nginx
5.6 使用YAML文件部署
创建nginx-deployment.yaml文件:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.21
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- port: 80
targetPort: 80
type: NodePort
使用YAML文件部署:
# 应用配置
kubectl apply -f nginx-deployment.yaml
# 查看部署结果
kubectl get all
# 删除资源
kubectl delete -f nginx-deployment.yaml
总结
这篇文章介绍了Kubernetes的基础知识,主要内容包括:
- Kubernetes简介:了解了Kubernetes的定义、核心功能和与Docker Swarm的对比
- 架构详解:深入理解了Master节点和Worker节点的组件及其职责
- 环境搭建:掌握了Minikube、Kind、k3s三种本地开发环境的搭建方法
- kubectl命令:学会了kubectl的安装配置和常用命令
- 第一个应用:通过部署nginx应用体验了Kubernetes的完整工作流程
Kubernetes的学习曲线虽然陡峭,但掌握基础知识后,后续的学习会变得顺畅。下一篇文章将深入讲解Kubernetes的核心对象------Pod和Label,这是理解Kubernetes工作原理的关键。