第一个应用 #
一、应用部署概述 #
在Kubernetes中部署应用,我们需要理解几个核心概念:
| 概念 | 说明 |
|---|---|
| Pod | 最小部署单元,包含一个或多个容器 |
| Deployment | 管理Pod的副本和更新策略 |
| Service | 提供稳定的访问入口和负载均衡 |
1.1 部署流程 #
text
部署流程
│
├── 1. 编写YAML配置
│
├── 2. 创建Deployment
│
├── 3. 创建Service
│
├── 4. 验证部署
│
└── 5. 访问应用
二、命令行快速部署 #
2.1 创建Deployment #
bash
# 使用kubectl create命令快速创建
kubectl create deployment nginx-app --image=nginx:1.25
# 查看Deployment
kubectl get deployments
# 输出示例
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-app 1/1 1 1 30s
2.2 扩容副本 #
bash
# 扩展到3个副本
kubectl scale deployment nginx-app --replicas=3
# 查看Pod
kubectl get pods
# 输出示例
NAME READY STATUS RESTARTS AGE
nginx-app-6b7f675859-2x4km 1/1 Running 0 1m
nginx-app-6b7f675859-7p9qj 1/1 Running 0 1m
nginx-app-6b7f675859-k8m2n 1/1 Running 0 1m
2.3 暴露服务 #
bash
# 创建Service
kubectl expose deployment nginx-app --port=80 --target-port=80 --type=NodePort
# 查看Service
kubectl get svc
# 输出示例
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-app NodePort 10.96.145.23 <none> 80:31234/TCP 10s
2.4 访问应用 #
bash
# Minikube环境
minikube service nginx-app
# 获取NodePort端口
kubectl get svc nginx-app -o jsonpath='{.spec.ports[0].nodePort}'
# 输出: 31234
# 获取节点IP
kubectl get nodes -o wide
# 或使用Minikube
minikube ip
# 访问: http://<node-ip>:<node-port>
三、YAML文件部署 #
3.1 创建Deployment YAML #
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.25
ports:
- containerPort: 80
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 200m
memory: 256Mi
3.2 创建Service YAML #
yaml
# nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- port: 80
targetPort: 80
nodePort: 30080
type: NodePort
3.3 应用配置 #
bash
# 应用Deployment
kubectl apply -f nginx-deployment.yaml
# 应用Service
kubectl apply -f nginx-service.yaml
# 或者一次性应用
kubectl apply -f nginx-deployment.yaml -f nginx-service.yaml
四、完整应用示例 #
4.1 组合配置文件 #
yaml
# nginx-app.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
labels:
app: web
spec:
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: nginx
image: nginx:1.25
ports:
- containerPort: 80
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 200m
memory: 256Mi
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 10
periodSeconds: 10
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 5
periodSeconds: 5
---
apiVersion: v1
kind: Service
metadata:
name: web-service
spec:
selector:
app: web
ports:
- port: 80
targetPort: 80
type: ClusterIP
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx
rules:
- host: web.local
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
4.2 部署应用 #
bash
# 应用配置
kubectl apply -f nginx-app.yaml
# 查看部署状态
kubectl get all
# 输出示例
NAME READY STATUS RESTARTS AGE
pod/web-app-6b7f675859-abc12 1/1 Running 0 1m
pod/web-app-6b7f675859-def34 1/1 Running 0 1m
pod/web-app-6b7f675859-ghi56 1/1 Running 0 1m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/web-service ClusterIP 10.96.145.23 <none> 80/TCP 1m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/web-app 3/3 3 3 1m
NAME DESIRED CURRENT READY AGE
replicaset.apps/web-app-6b7f675859 3 3 3 1m
五、查看应用状态 #
5.1 查看Deployment #
bash
# 查看Deployment详情
kubectl describe deployment web-app
# 查看Deployment状态
kubectl get deployment web-app -o wide
# 查看Deployment YAML
kubectl get deployment web-app -o yaml
5.2 查看Pod #
bash
# 查看Pod列表
kubectl get pods -l app=web
# 查看Pod详情
kubectl describe pod <pod-name>
# 查看Pod日志
kubectl logs <pod-name>
# 实时查看日志
kubectl logs -f <pod-name>
# 多容器Pod查看日志
kubectl logs <pod-name> -c <container-name>
5.3 进入Pod容器 #
bash
# 进入容器执行命令
kubectl exec -it <pod-name> -- /bin/bash
# 执行单个命令
kubectl exec <pod-name> -- ls /app
# 多容器Pod指定容器
kubectl exec -it <pod-name> -c <container-name> -- /bin/bash
5.4 端口转发 #
bash
# 本地端口转发到Pod
kubectl port-forward <pod-name> 8080:80
# 本地端口转发到Service
kubectl port-forward svc/web-service 8080:80
# 后台运行
kubectl port-forward svc/web-service 8080:80 &
六、更新应用 #
6.1 更新镜像 #
bash
# 更新镜像版本
kubectl set image deployment/web-app nginx=nginx:1.26
# 查看滚动更新状态
kubectl rollout status deployment/web-app
# 查看更新历史
kubectl rollout history deployment/web-app
6.2 编辑配置 #
bash
# 编辑Deployment
kubectl edit deployment web-app
# 编辑Service
kubectl edit svc web-service
6.3 回滚应用 #
bash
# 查看历史版本
kubectl rollout history deployment/web-app
# 回滚到上一版本
kubectl rollout undo deployment/web-app
# 回滚到指定版本
kubectl rollout undo deployment/web-app --to-revision=2
七、扩缩容应用 #
7.1 手动扩缩容 #
bash
# 扩容到5个副本
kubectl scale deployment/web-app --replicas=5
# 缩容到2个副本
kubectl scale deployment/web-app --replicas=2
# 基于条件扩容
kubectl scale deployment/web-app --current-replicas=3 --replicas=5
7.2 自动扩缩容 #
bash
# 创建HPA(需要安装metrics-server)
kubectl autoscale deployment web-app --min=2 --max=10 --cpu-percent=80
# 查看HPA状态
kubectl get hpa
八、删除应用 #
8.1 删除资源 #
bash
# 删除Deployment
kubectl delete deployment web-app
# 删除Service
kubectl delete service web-service
# 删除Ingress
kubectl delete ingress web-ingress
# 使用文件删除
kubectl delete -f nginx-app.yaml
8.2 删除所有资源 #
bash
# 删除指定标签的所有资源
kubectl delete all -l app=web
# 删除命名空间下所有资源(谨慎使用)
kubectl delete all --all
九、应用调试 #
9.1 查看事件 #
bash
# 查看集群事件
kubectl get events
# 查看特定资源事件
kubectl describe pod <pod-name> | grep -A 10 Events
# 持续监控事件
kubectl get events -w
9.2 调试Pod #
bash
# 查看Pod状态
kubectl get pod <pod-name> -o wide
# 查看Pod详情
kubectl describe pod <pod-name>
# 查看容器日志
kubectl logs <pod-name> --previous
# 进入容器调试
kubectl exec -it <pod-name> -- /bin/sh
9.3 临时调试Pod #
yaml
# debug-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: debug-pod
spec:
containers:
- name: debug
image: busybox
command: ['sleep', '3600']
restartPolicy: Never
bash
# 创建调试Pod
kubectl apply -f debug-pod.yaml
# 进入调试
kubectl exec -it debug-pod -- /bin/sh
# 测试服务连接
wget -qO- http://web-service:80
十、实战:部署Web应用 #
10.1 创建完整应用 #
yaml
# my-web-app.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-web
spec:
replicas: 3
selector:
matchLabels:
app: my-web
template:
metadata:
labels:
app: my-web
spec:
containers:
- name: web
image: nginx:1.25
ports:
- containerPort: 80
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 200m
memory: 256Mi
volumes:
- name: html
configMap:
name: web-content
---
apiVersion: v1
kind: ConfigMap
metadata:
name: web-content
data:
index.html: |
<!DOCTYPE html>
<html>
<head>
<title>My First K8s App</title>
</head>
<body>
<h1>Hello Kubernetes!</h1>
<p>This is my first application deployed on Kubernetes.</p>
</body>
</html>
---
apiVersion: v1
kind: Service
metadata:
name: my-web-service
spec:
selector:
app: my-web
ports:
- port: 80
targetPort: 80
type: NodePort
10.2 部署并验证 #
bash
# 部署应用
kubectl apply -f my-web-app.yaml
# 查看状态
kubectl get all -l app=my-web
# 访问应用
minikube service my-web-service
十一、总结 #
11.1 核心命令速查 #
| 操作 | 命令 |
|---|---|
| 创建Deployment | kubectl create deployment <name> --image=<image> |
| 扩缩容 | kubectl scale deployment <name> --replicas=<n> |
| 暴露服务 | kubectl expose deployment <name> --port=<port> |
| 应用配置 | kubectl apply -f <file.yaml> |
| 查看资源 | kubectl get <resource> |
| 查看详情 | kubectl describe <resource> <name> |
| 查看日志 | kubectl logs <pod> |
| 进入容器 | kubectl exec -it <pod> -- /bin/bash |
| 删除资源 | kubectl delete -f <file.yaml> |
11.2 下一步 #
恭喜你完成了第一个Kubernetes应用的部署!接下来让我们深入学习 kubectl命令行工具,掌握更多集群管理技能。
最后更新:2026-03-28