--- title: Kubernetes部署 date: 2024-12-28T11:09:57+08:00 lastmod: 2025-12-17T10:55:01+08:00 --- # Kubernetes部署 > 1. [创建 Namespace(可选)](#20241228112610-dvqm8s3) > 2. [总结:一般步骤](#20241228112610-1ltyl2b) > 3. [创建顺序建议:](#20241228112610-76sevf1)   ‍   初始化K8s ```yaml kubeadm init ```   ‍   Kubernetes 中的资源管理是分层次的,通常你会按照以下的顺序来规划和配置你的 Kubernetes 环境: ### **创建 Namespace(可选)**   如果你希望将不同环境或应用隔离开来,通常会创建一个 **Namespace**(命名空间)。命名空间有助于在同一集群中隔离资源,避免冲突。 - **命名空间** 可以理解为一个逻辑分区,每个命名空间内的资源是隔离的,可以更容易地管理不同环境(如开发、测试、生产等)。   **示例:创建** **​`nginx-namespace.yaml`​** ```yaml apiVersion: v1 kind: Namespace metadata: name: nginx-namespace ```   创建命名空间: ```bash kubectl apply -f nginx-namespace.yaml ```   使用命名空间时,记得在其他资源的 YAML 文件中指定 `namespace`。 2. **创建 Persistent Volume (PV) 和 Persistent Volume Claim (PVC)** 如果你需要持久化存储(例如数据库、日志等),你需要先创建 **PersistentVolume (PV)** 来定义存储资源,然后通过 **PersistentVolumeClaim (PVC)** 请求存储资源。 - **PersistentVolume (PV)** 是由集群管理员配置的,代表一个实际的存储资源。 - **PersistentVolumeClaim (PVC)** 是用户请求存储的方式,Pod 通过 PVC 来绑定 PV。 **示例:创建 PV 和 PVC** **nginx-pv.yaml**(PersistentVolume) ```yaml apiVersion: v1 kind: PersistentVolume metadata: name: nginx-pv spec: capacity: storage: 1Gi accessModes: - ReadWriteOnce hostPath: path: /mnt/data # 本地存储路径(可以替换为 NFS 或云存储) ``` **nginx-pvc.yaml**(PersistentVolumeClaim) ```yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: nginx-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi ``` 创建 PV 和 PVC: ```bash kubectl apply -f nginx-pv.yaml kubectl apply -f nginx-pvc.yaml ``` 3. **创建 ConfigMap 和 Secret** 如果你有配置文件或敏感信息(如数据库密码、API 密钥),可以使用 **ConfigMap** 和 **Secret** 存储这些信息。 - **ConfigMap** 存储非敏感配置信息。 - **Secret** 存储敏感信息。 **示例:创建 ConfigMap** **nginx-configmap.yaml**: ```yaml apiVersion: v1 kind: ConfigMap metadata: name: nginx-config data: nginx.conf: | server { listen 80; server_name localhost; location / { root /usr/share/nginx/html; index index.html index.htm; } } ``` 创建 ConfigMap: ```bash kubectl apply -f nginx-configmap.yaml ``` 4. **创建 Service** 如果你希望让外部能够访问容器,或者在集群内部的服务之间进行通信,你需要创建一个 **Service**。Service 用于暴露容器的端口并进行负载均衡。 **示例:创建 Service** **nginx-service.yaml** ```yaml apiVersion: v1 kind: Service metadata: name: nginx-service spec: selector: app: nginx # 匹配容器标签 ports: - protocol: TCP port: 80 targetPort: 80 type: LoadBalancer # 如果是内部访问,可以使用 ClusterIP ``` 创建 Service: ```bash kubectl apply -f nginx-service.yaml ``` 5. **创建 Deployment** 使用 **Deployment** 来管理容器。Deployment 确保容器的高可用性和扩缩容能力。你可以在 Deployment 中指定镜像、环境变量、存储、网络等。 - Deployment 会管理副本数,自动进行滚动更新等操作。 **示例:创建 Deployment** **nginx-deployment.yaml** ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment namespace: nginx-namespace # 指定命名空间 spec: replicas: 3 # 部署 3 个副本 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80 volumeMounts: - name: nginx-storage mountPath: /usr/share/nginx/html # 挂载存储路径 volumes: - name: nginx-storage persistentVolumeClaim: claimName: nginx-pvc # 使用 PVC ``` 创建 Deployment: ```bash kubectl apply -f nginx-deployment.yaml ``` 6. **验证和访问** - 查看所有资源的状态: ```bash kubectl get all -n nginx-namespace ``` - 如果使用 **LoadBalancer** 类型的 Service,并且在云平台上,Kubernetes 会为你分配一个外部 IP 地址,你可以通过该 IP 访问你的应用。 - 如果使用 **NodePort** 类型或 **kubectl port-forward**,可以在本地访问服务。 例如,使用 `kubectl port-forward`: ```bash kubectl port-forward svc/nginx-service 8080:80 -n nginx-namespace ``` 这样你可以通过浏览器访问 `http://localhost:8080` 来查看 Nginx 服务。 ### 总结:一般步骤 1. **命名空间**(可选):通过 `Namespace` 隔离资源。 2. **持久化存储**:通过 `PersistentVolume`​ 和 `PersistentVolumeClaim` 为容器提供持久化存储。 3. **配置文件**:使用 `ConfigMap`​(非敏感配置)和 `Secret`(敏感数据)来配置容器。 4. **网络访问**:通过 `Service`​ 来暴露容器,选择适合的暴露方式(如 `LoadBalancer`​、`NodePort`)。 5. **容器管理**:使用 `Deployment` 来创建和管理容器,配置副本数、更新策略、存储挂载等。 ### 创建顺序建议: - **第一步**:创建 **命名空间**(如果需要)。 - **第二步**:创建 **PersistentVolume** 和 **PersistentVolumeClaim**(如果需要持久化存储)。 - **第三步**:创建 **ConfigMap** 和 **Secret**(如果需要配置或敏感信息)。 - **第四步**:创建 **Service**(暴露容器)。 - **第五步**:创建 **Deployment**(容器部署)。   这样就完成了一个基本的 Kubernetes 容器部署,涵盖了存储、网络、配置等方面。如果有其他需求(如高可用、负载均衡、复杂路由等),还可以进一步扩展和配置。