Kubernetes(K8s)作为一个开源的容器编排平台,广泛应用于现代的云原生应用架构中。以下是一些常见的 **Kubernetes 实战案例**,包括从基础部署到高级应用场景的使用。通过这些案例,可以更好地理解 K8s 的运作原理和最佳实践。
1. **部署一个简单的 Web 应用(Nginx)**
这是一个常见的入门级案例,适合刚接触 Kubernetes 的开发者。
步骤:
- **创建一个 Deployment**
```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
```
- **创建一个 Service 来暴露应用**
```yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer
```
- **部署应用到 Kubernetes 集群**
```bash
kubectl apply -f nginx-deployment.yaml
kubectl apply -f nginx-service.yaml
```
- **验证部署**
```bash
kubectl get deployments
kubectl get pods
kubectl get services
```
通过这个案例,你可以学习如何部署一个简单的 Web 应用,如何利用 `Deployment` 和 `Service` 来实现容器管理和应用的暴露。
2. **自动扩容应用(Horizontal Pod Autoscaler)**
在生产环境中,应用的流量和负载是动态变化的,K8s 提供了 Horizontal Pod Autoscaler(HPA)来根据负载自动扩容和缩容 Pod。
步骤:
- **创建一个 Deployment(例如一个基于 CPU 使用率扩容的 Nginx 部署)**
```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
resources:
requests:
cpu: 100m
memory: 100Mi
limits:
cpu: 500m
memory: 500Mi
ports:
- containerPort: 80
```
- **创建 HPA 对象**
```yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: nginx-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx-deployment
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
```
- **部署 HPA**
```bash
kubectl apply -f nginx-hpa.yaml
```
- **监控 HPA 状态**
```bash
kubectl get hpa
```
通过这个案例,你可以学习如何使用 HPA 来动态扩容和缩容 Pod,确保应用在不同负载下的高可用性。
3. **基于 Helm 安装和管理应用**
Helm 是 Kubernetes 的包管理工具,可以方便地管理复杂应用的部署和版本控制。
步骤:
- **安装 Helm**
```bash
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
```
- **添加 Helm 仓库**
```bash
helm repo add stable https://charts.helm.sh/stable
helm repo update
```
- **使用 Helm 安装应用(例如安装 MySQL)**
```bash
helm install my-mysql stable/mysql
```
- **查看安装的应用**
```bash
helm list
```
- **删除 Helm 安装的应用**
```bash
helm uninstall my-mysql
```
通过这个案例,你可以学习如何使用 Helm 来简化应用的安装、更新和管理,尤其是在多环境部署时非常有用。
4. **使用 Persistent Volumes 和 Persistent Volume Claims**
Kubernetes 提供了持久化存储(Persistent Volumes, PV)和持久化存储声明(Persistent Volume Claims, PVC),用来管理应用的持久化数据存储。
步骤:
- **创建一个 Persistent Volume(PV)**
```yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: my-pv
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
hostPath:
path: /mnt/data
- **创建 Persistent Volume Claim(PVC)**
```yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
resources:
requests:
storage: 1Gi
accessModes:
- ReadWriteOnce
```
- **在 Pod 中使用 PVC**
```yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- mountPath: /usr/share/nginx/html
name: nginx-storage
volumes:
- name: nginx-storage
persistentVolumeClaim:
claimName: my-pvc
```
- **部署应用**
```bash
kubectl apply -f pv.yaml
kubectl apply -f pvc.yaml
kubectl apply -f nginx-pod.yaml
```
通过这个案例,你可以了解如何配置 Kubernetes 中的持久化存储,使应用能够在容器重启或迁移时保持数据。
5. **使用 Ingress 实现 HTTP 路由和负载均衡**
Ingress 允许你配置 HTTP 路由和负载均衡,能够将外部流量路由到 Kubernetes 集群内的不同服务。
步骤:
- **创建一个 Ingress Controller(例如使用 Nginx)**
```bash
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml
```
- **创建一个 Deployment 和 Service(例如部署两个不同版本的 Web 应用)**
```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: webapp-v1
spec:
replicas: 1
selector:
matchLabels:
app: webapp-v1
template:
metadata:
labels:
app: webapp-v1
spec:
containers:
- name: webapp
image: webapp:v1
ports:
- containerPort: 80
```
- **创建 Ingress 规则**
```yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: webapp-ingress
spec:
rules:
- host: webapp.example.com
http:
paths:
- path: /v1
pathType: Prefix
backend:
service:
name: webapp-service-v1
port:
number: 80
```
- **应用配置**
```bash
kubectl apply -f webapp-deployment.yaml
kubectl apply -f ingress.yaml
```
通过这个案例,你可以学习如何使用 Ingress 配置 HTTP 路由、负载均衡和 SSL/TLS 终端节点。
---
总结
以上是一些常见的 Kubernetes 实战案例,涵盖了应用的部署、扩容、管理、持久化存储和流量路由等方面。学习这些案例有助于你熟练掌握 Kubernetes 的基本操作,并能够在实际的生产环境中高效地管理容器化应用。