使用 Minikube 部署网站集群的完整指南
Minikube 是一个本地 Kubernetes 开发环境,非常适合在本地开发和测试网站集群。下面我将详细介绍如何使用 Minikube 部署一个完整的网站集群。
1. 准备工作
安装 Minikube 和 kubectl
# 安装 kubectl
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
# 安装 Minikube
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
启动 Minikube
minikube start --driver=docker --cpus=4 --memory=8g --disk-size=20g
2. 部署网站集群架构
一个典型的网站集群包含以下组件:
- 前端 Web 服务
- 后端 API 服务
- 数据库服务
- 缓存服务
- 入口控制器
3. 部署示例网站集群
3.1 创建命名空间
kubectl create namespace website-cluster
3.2 部署数据库 (MySQL)
# mysql-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
namespace: website-cluster
spec:
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:5.7
env:
- name: MYSQL_ROOT_PASSWORD
value: "password"
ports:
- containerPort: 3306
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-pv-claim
---
# mysql-service.yaml
apiVersion: v1
kind: Service
metadata:
name: mysql
namespace: website-cluster
spec:
ports:
- port: 3306
selector:
app: mysql
---
# mysql-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pv-claim
namespace: website-cluster
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
应用配置:
kubectl apply -f mysql-deployment.yaml -f mysql-service.yaml -f mysql-pvc.yaml
3.3 部署缓存 (Redis)
# redis-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis
namespace: website-cluster
spec:
replicas: 1
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
containers:
- name: redis
image: redis:alpine
ports:
- containerPort: 6379
resources:
requests:
memory: "100Mi"
cpu: "100m"
limits:
memory: "200Mi"
cpu: "200m"
---
# redis-service.yaml
apiVersion: v1
kind: Service
metadata:
name: redis
namespace: website-cluster
spec:
ports:
- port: 6379
selector:
app: redis
应用配置:
kubectl apply -f redis-deployment.yaml -f redis-service.yaml
3.4 部署后端 API 服务
# backend-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: backend
namespace: website-cluster
spec:
replicas: 3
selector:
matchLabels:
app: backend
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
type: RollingUpdate
template:
metadata:
labels:
app: backend
spec:
containers:
- name: backend
image: your-backend-image:latest
ports:
- containerPort: 8080
env:
- name: DB_HOST
value: "mysql"
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret
key: password
- name: REDIS_HOST
value: "redis"
resources:
requests:
memory: "256Mi"
cpu: "250m"
limits:
memory: "512Mi"
cpu: "500m"
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
---
# backend-service.yaml
apiVersion: v1
kind: Service
metadata:
name: backend
namespace: website-cluster
spec:
ports:
- port: 80
targetPort: 8080
selector:
app: backend
应用配置:
kubectl apply -f backend-deployment.yaml -f backend-service.yaml
3.5 部署前端 Web 服务
# frontend-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: frontend
namespace: website-cluster
spec:
replicas: 3
selector:
matchLabels:
app: frontend
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
type: RollingUpdate
template:
metadata:
labels:
app: frontend
spec:
containers:
- name: frontend
image: your-frontend-image:latest
ports:
- containerPort: 80
env:
- name: API_URL
value: "http://backend"
resources:
requests:
memory: "128Mi"
cpu: "100m"
limits:
memory: "256Mi"
cpu: "200m"
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 30
periodSeconds: 10
---
# frontend-service.yaml
apiVersion: v1
kind: Service
metadata:
name: frontend
namespace: website-cluster
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
nodePort: 30080
selector:
app: frontend
应用配置:
kubectl apply -f frontend-deployment.yaml -f frontend-service.yaml
3.6 部署 Ingress 控制器
# 启用 ingress 插件
minikube addons enable ingress
# 创建 ingress 资源
# frontend-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: frontend-ingress
namespace: website-cluster
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: yourwebsite.local
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: frontend
port:
number: 80
应用配置:
kubectl apply -f frontend-ingress.yaml
4. 访问网站集群
修改本地 hosts 文件
echo "$(minikube ip) yourwebsite.local" | sudo tee -a /etc/hosts
访问网站
打开浏览器访问: http://yourwebsite.local
5. 集群监控和管理
启用 Dashboard
minikube dashboard
监控集群状态
# 查看所有资源状态
kubectl get all -n website-cluster
# 查看 Pod 详情
kubectl describe pods -n website-cluster
# 查看日志
kubectl logs -f <pod-name> -n website-cluster
6. 扩展集群
水平扩展后端服务
kubectl scale deployment backend --replicas=5 -n website-cluster
自动扩缩容 (HPA)
# 安装 metrics-server
minikube addons enable metrics-server
# 创建 HPA
kubectl autoscale deployment backend -n website-cluster --cpu-percent=50 --min=2 --max=10
7. CI/CD 集成 (可选)
可以使用 Tekton 或 ArgoCD 在 Minikube 中设置 CI/CD 流水线:
# 安装 Tekton
kubectl apply --filename https://storage.googleapis.com/tekton-releases/pipeline/latest/release.yaml
# 安装 ArgoCD
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
总结
通过以上步骤,你已经在 Minikube 中成功部署了一个完整的网站集群,包括:
- 前端 Web 服务
- 后端 API 服务
- MySQL 数据库
- Redis 缓存
- Ingress 控制器
- 监控和扩展能力
这个集群架构可以满足大多数中小型网站的需求,并且可以在本地进行开发和测试。当需要迁移到生产环境时,可以轻松地将相同的配置应用到云 Kubernetes 服务上。
No Comments