---
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 容器部署,涵盖了存储、网络、配置等方面。如果有其他需求(如高可用、负载均衡、复杂路由等),还可以进一步扩展和配置。