# 实现K8S状态控制器(StatefulSet)

## 1. 什么是K8S状态控制器(StatefulSet)

在Kubernetes中,StatefulSet是一种控制器,用于管理有状态应用程序的部署。有状态应用程序通常需要稳定的网络标识符(例如Pod名称),持久存储(例如PV/PVC)以及有序部署和扩展。

## 2. K8S状态控制器实现步骤

| 步骤 | 描述 |
| ---- | ---- |
| 1 | 创建PV(持久卷)和PVC(持久卷声明) |
| 2 | 创建Headless Service |
| 3 | 创建StatefulSet |

### 步骤 1:创建PV和PVC

```yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: my-pv
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
hostPath:
path: /data

---

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
```

在上面的代码中,我们创建了一个1GB的PV,以及一个1GB的PVC,用于动态绑定PV到StatefulSet。

### 步骤 2:创建Headless Service

```yaml
apiVersion: v1
kind: Service
metadata:
name: my-headless-service
spec:
clusterIP: None
selector:
app: my-app
ports:
- port: 80
targetPort: 80
```

上面的代码中,我们创建了一个Headless Service,`clusterIP`设置为`None`,使得服务没有集群内的虚拟IP地址,每个Pod都有自己的DNS记录。

### 步骤 3:创建StatefulSet

```yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: my-statefulset
spec:
serviceName: my-headless-service
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-container
image: nginx
ports:
- containerPort: 80
volumeClaimTemplates:
- metadata:
name: my-volume
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 1Gi
```

在上面的代码中,我们创建了一个包含3个Pod的StatefulSet,Pod的DNS名称会以`-`的形式命名。

通过上面的步骤,我们成功地创建了一个Kubernetes状态控制器(StatefulSet),用于部署有状态应用程序,并确保每个Pod有稳定的标识符和持久存储。希望这篇文章对你有所帮助!