第一个应用 #

一、应用部署概述 #

在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