Kubernetes(简称K8s)是一个生产级别的开源容器编排平台,由Google基于其在容器集群方面的经验设计而成。它能够帮助你确保容器化应用在你想要的时间和地点运行,实现应用的自动化部署、弹性伸缩与高可用。本文将从零开始,带你完成从环境搭建到应用部署的全流程。
第一部分:Kubernetes 核心概念
在动手实践之前,理解Kubernetes的几个核心概念至关重要。
一、Pod ------ 最小部署单元
Pod是Kubernetes中最小的、可部署的计算单元。它可以包含一个或多个紧密关联的容器(如业务容器 + 日志收集容器),这些容器共享同一个网络命名空间(IP地址、端口)和存储卷,始终被调度到同一节点上运行。Pod是Kubernetes资源分配的最小单位。
二、Deployment ------ 应用生命周期管理器
Deployment负责创建和更新应用的实例。它通过ReplicaSet控制Pod的副本数量,支持滚动更新、版本回滚等策略。创建Deployment后,Kubernetes控制平面会将应用实例调度到集群中的各个节点上。如果托管实例的节点关闭或被删除,Deployment控制器会自动将其替换到另一个节点上,提供自我修复能力。
三、Service ------ 稳定的访问入口
Service是Kubernetes中用于暴露Pod网络访问的抽象组件。由于Pod的IP是临时的(Pod重建后IP会变更),Service为这组Pod提供一个稳定的虚拟IP和DNS名称。当多个Pod关联到同一个Service时,Service会自动进行负载均衡。
Service的三种主要类型:
- ClusterIP(默认) :仅在集群内部暴露服务
- NodePort :在每个节点上开放固定端口,外部可通过
节点IP:NodePort访问 - LoadBalancer:结合云厂商的负载均衡器对外暴露服务
四、Ingress ------ 七层路由网关
Ingress是Kubernetes的API对象,用于定义外部访问集群服务的七层(HTTP/HTTPS)路由规则。它不同于Service(仅提供四层负载均衡),而是通过Ingress控制器(如Nginx Ingress、Traefik)实现基于域名或路径的路由、SSL卸载等功能。
第二部分:环境搭建
一、前置准备
部署Kubernetes需要以下环境:
| 项目 | 要求 |
|---|---|
| 操作系统 | Linux(建议CentOS 7.6+ / Ubuntu 18.04+)或 macOS |
| 硬件配置 | 至少4核8G内存(建议) |
| 容器运行时 | Docker CE 19.03+ 或 containerd |
| K8s工具链 | kubeadm、kubectl、kubelet(版本1.24+) |
| 基础知识 | 熟悉容器化概念、YAML语法、基础Linux命令 |
二、开发环境:使用 Minikube 搭建本地集群
Minikube是学习Kubernetes最便捷的方式,可在本地快速启动单节点集群。
1. 安装 Minikube(以Linux为例):
bash
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
2. 启动集群:
bash
minikube start --driver=docker --cpus=4 --memory=8192
3. 安装 kubectl(Kubernetes命令行客户端):
bash
# 以Linux为例
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
4. 验证集群状态:
bash
kubectl get nodes -o wide
kubectl version # 查看客户端和服务器版本
三、生产环境:使用 kubeadm 搭建多节点集群
生产环境推荐使用kubeadm搭建多节点集群。
1. 集群初始化(在控制平面节点执行):
bash
sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --kubernetes-version=v1.24.0
# 配置kubectl
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
2. 添加工作节点(在每个工作节点执行):
bash
kubeadm join <控制平面IP>:<端口> --token <token> --discovery-token-ca-cert-hash sha256:<hash>
提示 :Token有效期为24小时,超时需通过
kubeadm token create重新生成。
3. 部署CNI网络插件(如Calico):
bash
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.24.5/manifests/calico.yaml
第三部分:部署第一个应用
一、通过命令行直接部署
最简单的入门方式,使用kubectl create deployment命令:
bash
# 创建一个nginx deployment,副本数为3
kubectl create deployment nginx --image=nginx:latest --replicas=3
二、通过 YAML 文件部署(推荐)
YAML文件是Kubernetes的标准配置方式,便于版本控制和重复使用。
1. 创建 Deployment 配置文件 nginx-deployment.yaml:
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-demo
labels:
app: web
spec:
replicas: 3 # 副本数量
selector:
matchLabels:
app: web # 必须与Pod模板中的标签匹配
template:
metadata:
labels:
app: web
spec:
containers:
- name: nginx
image: nginx:1.25
ports:
- containerPort: 80
resources: # 资源限制,防止资源争抢
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "500m"
memory: "512Mi"
2. 部署应用:
bash
kubectl apply -f nginx-deployment.yaml
3. 验证部署状态:
bash
kubectl get deployments # 查看Deployment状态
kubectl get pods -l app=web # 查看Pod状态(-l表示按标签筛选)
kubectl describe deployment nginx-demo # 查看详细信息
第四部分:暴露服务 ------ 让应用可访问
一、创建 Service
配置文件 nginx-service.yaml:
yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: web # 关联标签为 app:web 的Pod
ports:
- protocol: TCP
port: 80 # Service的端口
targetPort: 80 # 容器内部的端口
type: LoadBalancer # 服务类型
部署Service:
bash
kubectl apply -f nginx-service.yaml
查看Service信息:
bash
kubectl get svc
在Minikube环境中,可通过以下命令获取访问URL:
bash
minikube service nginx-service
二、使用 Ingress 实现七层路由(进阶)
对于生产环境,通常使用Ingress实现基于域名的路由。
1. 安装 Nginx Ingress 控制器:
bash
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.1/deploy/static/provider/cloud/deploy.yaml
2. 创建 Ingress 配置 ingress.yaml:
yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: http-ingress
spec:
rules:
- host: example.com
http:
paths:
- path: /api
pathType: Prefix
backend:
service:
name: api-service
port:
number: 80
- path: /web
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
tls: # HTTPS配置(可选)
- hosts:
- example.com
secretName: tls-secret
3. 部署 Ingress:
bash
kubectl apply -f ingress.yaml
第五部分:持久化存储
容器是无状态的,当Pod被重建时,容器内的数据会丢失。对于数据库等有状态应用,需要持久化存储。
Kubernetes通过 PersistentVolume(PV) 和 PersistentVolumeClaim(PVC) 实现存储管理:
- PV:集群中的存储资源,由管理员事先制备或通过StorageClass动态制备
- PVC:用户对存储的请求,指定大小和访问模式
创建 PVC 示例:
yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
accessModes:
- ReadWriteOnce # 访问模式:单节点读写
storageClassName: mysc # 存储类(用于动态制备)
resources:
requests:
storage: 100Gi # 请求的存储大小
创建PVC:
bash
kubectl apply -f pvc.yaml
kubectl get pvc # 查看PVC状态,Bound表示已绑定
在Pod中挂载PVC:
yaml
spec:
containers:
- name: app
image: myapp
volumeMounts:
- mountPath: /data
name: storage
volumes:
- name: storage
persistentVolumeClaim:
claimName: my-pvc
第六部分:配置管理 ------ ConfigMap 与 Secret
一、ConfigMap ------ 非敏感配置
yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
app.properties: |
database.url=jdbc:mysql://localhost:3306/mydb
log.level=INFO
二、Secret ------ 敏感信息(密码、证书等)
yaml
apiVersion: v1
kind: Secret
metadata:
name: db-secret
type: Opaque
data:
username: YWRtaW4= # base64编码后的值
password: cGFzc3dvcmQ=
第七部分:更新与回滚
一、滚动更新
Kubernetes支持滚动更新,实现零停机部署。
方式一:修改YAML文件后重新apply:
bash
# 修改nginx-deployment.yaml中的镜像版本为 nginx:1.26
kubectl apply -f nginx-deployment.yaml
方式二:直接使用命令:
bash
kubectl set image deployment/nginx-demo nginx=nginx:1.26
二、查看更新状态与回滚
bash
kubectl rollout status deployment/nginx-demo # 查看更新状态
kubectl rollout history deployment/nginx-demo # 查看历史版本
kubectl rollout undo deployment/nginx-demo # 回滚到上一版本
kubectl rollout undo deployment/nginx-demo --to-revision=2 # 回滚到指定版本
第八部分:扩缩容
一、手动扩缩容
bash
kubectl scale deployment/nginx-demo --replicas=5 # 扩容到5个副本
kubectl get pods -l app=web # 验证副本数
二、自动扩缩容(HPA)
HorizontalPodAutoscaler可根据CPU利用率自动调整副本数:
bash
kubectl autoscale deployment/nginx-demo --cpu-percent=50 --min=2 --max=10
第九部分:进阶工具 ------ Helm
Helm是Kubernetes的包管理工具,类似于Linux的yum/apt。它将应用及其依赖打包为Chart,实现了应用部署的标准化和自动化。
安装与使用:
bash
# 安装Helm
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
# 添加仓库
helm repo add stable https://charts.helm.sh/stable
helm repo update
# 安装应用
helm install my-nginx stable/nginx-ingress
# 升级应用
helm upgrade my-nginx stable/nginx-ingress --set controller.replicaCount=3
第十部分:CI/CD 自动化部署
将Kubernetes与CI/CD工具集成,可实现从代码提交到生产环境部署的全自动化。
常用CI/CD工具与Kubernetes的集成方式:
| 工具 | 集成方式 |
|---|---|
| GitHub Actions | 在workflow中执行kubectl apply或helm upgrade |
| GitLab CI/CD | 通过.gitlab-ci.yml配置,执行kubectl/helm命令 |
| Jenkins | 部署Jenkins到K8s集群,通过Pipeline执行部署 |
| Argo CD | GitOps方式,自动同步Git仓库中的配置到集群 |
典型CI/CD流水线示例(GitHub Actions):
yaml
name: Deploy to Kubernetes
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Build and push image
run: |
docker build -t myapp:${{ github.sha }} .
docker push myapp:${{ github.sha }}
- name: Deploy to K8s
run: |
kubectl set image deployment/myapp app=myapp:${{ github.sha }}
kubectl rollout status deployment/myapp
第十一部分:常用命令速查
| 命令 | 说明 |
|---|---|
kubectl get nodes |
查看集群节点 |
kubectl get pods |
查看所有Pod |
kubectl get pods -l app=web |
按标签筛选Pod |
kubectl get deployments |
查看所有Deployment |
kubectl get svc |
查看所有Service |
kubectl get ingress |
查看所有Ingress |
kubectl describe pod <名称> |
查看Pod详细信息 |
kubectl logs <Pod名称> |
查看Pod日志 |
kubectl exec -it <Pod名称> -- /bin/bash |
进入Pod容器 |
kubectl apply -f <文件> |
创建/更新资源 |
kubectl delete -f <文件> |
删除资源 |
kubectl scale deployment/<名称> --replicas=N |
扩缩容 |
kubectl rollout status deployment/<名称> |
查看滚动更新状态 |
第十二部分:常见问题与排查
1. Pod一直处于Pending状态
- 原因:集群资源不足或节点未就绪
- 排查 :
kubectl describe pod <名称>查看事件信息
2. Pod一直处于ImagePullBackOff
- 原因:镜像不存在、镜像仓库认证失败或网络问题
- 排查:检查镜像名称是否正确,配置ImagePullSecrets
3. Service无法访问
- 原因:标签选择器不匹配、端口配置错误
- 排查 :
kubectl describe svc <名称>查看Endpoints是否包含Pod IP
4. PVC处于Pending状态
- 原因:没有匹配的PV或StorageClass
- 排查 :
kubectl get pv查看可用PV,检查StorageClass配置
总结
Kubernetes作为容器编排的事实标准,为容器化应用提供了从部署、扩缩容到自愈的完整解决方案。本文从核心概念出发,逐步讲解了环境搭建、应用部署、服务暴露、存储管理、配置管理、更新回滚以及CI/CD集成等全流程操作。
在实际生产环境中,建议:
- 开发测试使用Minikube或Kind快速验证
- 生产环境使用云厂商托管K8s服务或kubeadm搭建高可用集群
- 复杂应用使用Helm进行标准化部署管理
- 自动化运维结合CI/CD工具实现GitOps流水线
掌握Kubernetes容器化部署,是迈向云原生架构的关键一步。