部署一个简单应用
本章以 Nginx 为例,在已完成在线部署的 K3s 集群上部署一个简单应用,涉及宿主机目录挂载(hostPath)、Service 与 Ingress 等常用资源。
- 部署内容:通过一个 YAML 文件创建
Namespace、Deployment、Service和Ingress四类资源,并用hostPath把宿主机的目录挂载给Pod使用。 - 访问方式:通过 NodePort 和 Ingress 两种方式访问 Nginx 应用。
- 前置条件:集群中至少有一个
Ready节点,且该节点能够拉取 Nginx 镜像(离线环境需要提前导入)。
创建应用清单
将下面的内容保存为 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-hostpathNodePort 会在每台节点上监听,因此用 bmc 的地址访问也能到达 sub11 上的这个 Pod:
curl http://172.16.100.176:30080/hello-from-hostpath清单说明
| 资源 | 关键配置 | 作用 |
|---|---|---|
Namespace | name: demo | 隔离本次应用的全部资源,删除命名空间即可清理 |
Deployment | image、replicas、nodeSelector、resources | 运行 Nginx Pod,并用 nodeSelector 固定到 sub11 |
Deployment.volumes | hostPath、type: DirectoryOrCreate | 把宿主机的 data_0、config_0 挂进容器,目录不存在时自动创建 |
Service | type: NodePort、nodePort: 30080 | 为 Pod 提供固定入口,并在每台节点上监听 30080 |
Ingress | host: 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
