Kubernetes(K8s)作为一个开源的容器编排平台,广泛应用于现代的云原生应用架构中。以下是一些常见的 **Kubernetes 实战案例**,包括从基础部署到高级应用场景的使用。通过这些案例,可以更好地理解 K8s 的运作原理和最佳实践。
---
### 1. **部署一个简单的 Web 应用(Nginx)**
这是一个常见的入门级案例,适合刚接触 Kubernetes 的开发者。
#### 步骤:
1. **创建一个 Deployment**
```yaml
apiVersion: apps/v1kind: Deploymentmetadata:name: nginx-deploymentspec:replicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:latestports:- containerPort: 80
```
2. **创建一个 Service 来暴露应用**
```yaml
apiVersion: v1kind: Servicemetadata:name: nginx-servicespec:selector:app: nginxports:- protocol: TCPport: 80targetPort: 80type: LoadBalancer
```
3. **部署应用到 Kubernetes 集群**
```bash
kubectl apply -f nginx-deployment.yamlkubectl apply -f nginx-service.yaml
```
4. **验证部署**
```bash
kubectl get deploymentskubectl get podskubectl get services
```
通过这个案例,你可以学习如何部署一个简单的 Web 应用,如何利用 `Deployment` 和 `Service` 来实现容器管理和应用的暴露。
---
### 2. **自动扩容应用(Horizontal Pod Autoscaler)**
在生产环境中,应用的流量和负载是动态变化的,K8s 提供了 Horizontal Pod Autoscaler(HPA)来根据负载自动扩容和缩容 Pod。
#### 步骤:
1. **创建一个 Deployment(例如一个基于 CPU 使用率扩容的 Nginx 部署)**
```yaml
apiVersion: apps/v1kind: Deploymentmetadata:name: nginx-deploymentspec:replicas: 2selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:latestresources:requests:cpu: 100mmemory: 100Milimits:cpu: 500mmemory: 500Miports:- containerPort: 80
```
2. **创建 HPA 对象**
```yaml
apiVersion: autoscaling/v2kind: HorizontalPodAutoscalermetadata:name: nginx-hpaspec:scaleTargetRef:apiVersion: apps/v1kind: Deploymentname: nginx-deploymentminReplicas: 2maxReplicas: 10metrics:- type: Resourceresource:name: cputarget:type: UtilizationaverageUtilization: 50
```
3. **部署 HPA**
```bash
kubectl apply -f nginx-hpa.yaml
```
4. **监控 HPA 状态**
```bash
kubectl get hpa
```
通过这个案例,你可以学习如何使用 HPA 来动态扩容和缩容 Pod,确保应用在不同负载下的高可用性。
---
### 3. **基于 Helm 安装和管理应用**
Helm 是 Kubernetes 的包管理工具,可以方便地管理复杂应用的部署和版本控制。
#### 步骤:
1. **安装 Helm**
```bash
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
```
2. **添加 Helm 仓库**
```bash
helm repo add stable https://charts.helm.sh/stablehelm repo update
```
3. **使用 Helm 安装应用(例如安装 MySQL)**
```bash
helm install my-mysql stable/mysql
```
4. **查看安装的应用**
```bash
helm list
```
5. **删除 Helm 安装的应用**
```bash
helm uninstall my-mysql
```
通过这个案例,你可以学习如何使用 Helm 来简化应用的安装、更新和管理,尤其是在多环境部署时非常有用。
---
### 4. **使用 Persistent Volumes 和 Persistent Volume Claims**
Kubernetes 提供了持久化存储(Persistent Volumes, PV)和持久化存储声明(Persistent Volume Claims, PVC),用来管理应用的持久化数据存储。
#### 步骤:
1. **创建一个 Persistent Volume(PV)**
```yaml
apiVersion: v1kind: PersistentVolumemetadata:name: my-pvspec:capacity:storage: 1GiaccessModes:- ReadWriteOncehostPath:path: /mnt/data
2. **创建 Persistent Volume Claim(PVC)**
```yaml
apiVersion: v1kind: PersistentVolumeClaimmetadata:name: my-pvcspec:resources:requests:storage: 1GiaccessModes:- ReadWriteOnce
```
3. **在 Pod 中使用 PVC**
```yaml
apiVersion: v1kind: Podmetadata:name: nginx-podspec:containers:- name: nginximage: nginxvolumeMounts:- mountPath: /usr/share/nginx/htmlname: nginx-storagevolumes:- name: nginx-storagepersistentVolumeClaim:claimName: my-pvc
```
4. **部署应用**
```bash
kubectl apply -f pv.yamlkubectl apply -f pvc.yamlkubectl apply -f nginx-pod.yaml
```
通过这个案例,你可以了解如何配置 Kubernetes 中的持久化存储,使应用能够在容器重启或迁移时保持数据。
---
### 5. **使用 Ingress 实现 HTTP 路由和负载均衡**
Ingress 允许你配置 HTTP 路由和负载均衡,能够将外部流量路由到 Kubernetes 集群内的不同服务。
#### 步骤:
1. **创建一个 Ingress Controller(例如使用 Nginx)**
```bash
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml
```
2. **创建一个 Deployment 和 Service(例如部署两个不同版本的 Web 应用)**
```yaml
apiVersion: apps/v1kind: Deploymentmetadata:name: webapp-v1spec:replicas: 1selector:matchLabels:app: webapp-v1template:metadata:labels:app: webapp-v1spec:containers:- name: webappimage: webapp:v1ports:- containerPort: 80
```
3. **创建 Ingress 规则**
```yaml
apiVersion: networking.k8s.io/v1kind: Ingressmetadata:name: webapp-ingressspec:rules:- host: webapp.example.comhttp:paths:- path: /v1pathType: Prefixbackend:service:name: webapp-service-v1port:number: 80
```
4. **应用配置**
```bash
kubectl apply -f webapp-deployment.yamlkubectl apply -f ingress.yaml
```
通过这个案例,你可以学习如何使用 Ingress 配置 HTTP 路由、负载均衡和 SSL/TLS 终端节点。
---
### 总结
以上是一些常见的 Kubernetes 实战案例,涵盖了应用的部署、扩容、管理、持久化存储和流量路由等方面。学习这些案例有助于你熟练掌握 Kubernetes 的基本操作,并能够在实际的生产环境中高效地管理容器化应用。