Welcome to Firefly
中文
Firefly文档中心
最近更新: 2026-09-23 16:27:56

部署一个简单应用

本章以 Nginx 为例,在已完成在线部署的 K3s 集群上部署一个简单应用,涉及宿主机目录挂载(hostPath)、Service 与 Ingress 等常用资源。

  • 部署内容:通过一个 YAML 文件创建 Namespace、Deployment、Service 和 Ingress 四类资源,并用 hostPath 把宿主机的目录挂载给Pod使用。
  • 访问方式:通过 NodePort 和 Ingress 两种方式访问 Nginx 应用。
  • 前置条件:集群中至少有一个 Ready 节点,且该节点能够拉取 Nginx 镜像(离线环境需要提前导入)。

确认节点状态

部署应用前,先确认集群中至少有一个节点处于 Ready 状态:

sudo k3s kubectl get nodes

创建应用清单

将下面的内容保存为 demo-app.yaml:

apiVersion: v1
kind: Namespace
metadata:
  name: demo                             # 独立命名空间,便于统一管理和清理
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo-app
  namespace: demo
spec:
  replicas: 1                            # 运行 1 个 Pod
  selector:
    matchLabels:
      app: demo-app
  template:
    metadata:
      labels:
        app: demo-app                    # Service 通过该标签找到 Pod
    spec:
      nodeSelector:
        kubernetes.io/hostname: sub11    # hostPath 是节点本地目录,固定 Pod 所在节点
      containers:
        - name: nginx
          image: nginx:1.27-alpine       # 需与节点 CPU 架构匹配,本环境为 arm64
          ports:
            - containerPort: 80          # Nginx 在容器内监听 80 端口
          volumeMounts:
            - name: data
              mountPath: /usr/share/nginx/html   # 网页目录
            - name: config
              mountPath: /etc/nginx/conf.d       # Nginx 配置目录
          resources:
            requests:
              cpu: 100m                  # 调度 Pod 时预留的 CPU
              memory: 64Mi               # 调度 Pod 时预留的内存
            limits:
              cpu: 500m                  # Pod 最多使用 500m CPU
              memory: 256Mi              # Pod 最多使用 256Mi 内存
      volumes:
        - name: data
          hostPath:
            path: /userdata/container/nginx_data/data_0     # 网页文件目录
            type: DirectoryOrCreate   # 目录不存在时由 kubelet 自动创建
        - name: config
          hostPath:
            path: /userdata/container/nginx_data/config_0   # Nginx 配置目录
            type: DirectoryOrCreate
---
apiVersion: v1
kind: Service
metadata:
  name: demo-svc
  namespace: demo
spec:
  type: NodePort                         # 集群外通过“节点 IP + 端口”访问应用
  selector:
    app: demo-app                        # 转发到带有 app=demo-app 标签的 Pod
  ports:
    - name: http
      port: 80                           # Service 在集群内提供的端口
      targetPort: 80                     # 转发到 Pod 的 80 端口
      nodePort: 30080                    # 集群外通过 <节点 IP>:30080 访问
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: demo-ingress
  namespace: demo
spec:
  ingressClassName: traefik              # 使用 K3s 内置的 Traefik 处理 Ingress 请求
  rules:
    - host: demo.local                   # 请求 Host 为 demo.local 时匹配此规则
      http:
        paths:
          - path: /
            pathType: Prefix             # 匹配 / 下的所有请求
            backend:
              service:
                name: demo-svc           # 将请求转发到 demo-svc
                port:
                  number: 80             # 使用 Service 的 80 端口

部署应用

sudo k3s kubectl apply -f demo-app.yaml

查看创建的资源:

sudo k3s kubectl -n demo get all,ingress -o wide

确认 Pod 的 STATUS 为 Running、NODE 为 sub11。

写入页面与配置

在 sub11 节点写入配置与网页文件

sudo tee /userdata/container/nginx_data/config_0/default.conf >/dev/null <<'EOF'
server {
    listen 80;
    root /usr/share/nginx/html;
    index index.html;
}
EOF

echo hello-from-hostpath | sudo tee /userdata/container/nginx_data/data_0/index.html

在 bmc 节点重新加载 Nginx 配置

sudo k3s kubectl -n demo exec deploy/demo-app -- nginx -s reload

访问应用

部署完成后,可以通过以下方式访问应用:

Service 使用 30080 作为 NodePort,通过任一节点 IP 都可以访问:

curl http://172.16.100.177:30080/
hello-from-hostpath

NodePort 会在每台节点上监听,因此用 bmc 的地址访问也能到达 sub11 上的这个 Pod:

curl http://172.16.100.176:30080/
hello-from-hostpath

清单说明

资源关键配置作用
Namespacename: demo隔离本次应用的全部资源,删除命名空间即可清理
Deploymentimage、replicas、nodeSelector、resources运行 Nginx Pod,并用 nodeSelector 固定到 sub11
Deployment.volumeshostPath、type: DirectoryOrCreate把宿主机的 data_0、config_0 挂进容器,目录不存在时自动创建
Servicetype: NodePort、nodePort: 30080为 Pod 提供固定入口,并在每台节点上监听 30080
Ingresshost: demo.local、ingressClassName: traefik按域名把请求转发到 demo-svc,由 Traefik 处理

清理应用

删除命名空间会一并删除 Deployment、Service、Ingress 等集群资源,但 hostPath 目录属于宿主机,不会被删除,需要单独清理。

在 bmc 节点删除集群资源

sudo k3s kubectl delete namespace demo

在 sub11 节点删除宿主机数据

sudo ls -l /userdata/container/nginx_data/data_0/

# 备份
sudo tar czf /userdata/nginx_data-backup.tar.gz -C /userdata/container nginx_data

# 删除
sudo rm -rf /userdata/container/nginx_data

本页目录