# 创建 StatefulSet

<details>

<summary><mark style="color:purple;">web-statefulset.yaml</mark></summary>

```yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  serviceName: "nginx"
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.25.3
        ports:
        - containerPort: 80
          name: web
```

* **kind: Service** 定义了一个名字为 nginx 的 Headless Service，创建的 Service 格式为 nginx-0.nginx.default.svc.cluster.local
* **kind: StatefulSet** 定义了一个名字为 web 的 StatefulSet，replicas 表示部署 Pod 的副本数，本实例为 2

</details>

## 创建 StatefulSet

**打开两个终端窗口：**

*   在第一个终端中，使用 **kubectl get** 来监视 StatefulSet 的 Pod 的创建情况：

    ```properties
    $ kubectl get pod -w -l app=nginx
    ```
*   在另一个终端中，使用 **kubectl apply** 来创建定义在 **web-statefulset.yaml** 中的 Headless Service 和 StatefulSet：

    ```properties
    $ kubectl apply -f web-statefulset.yaml
    service/nginx created
    statefulset.apps/web created
    ```

## 查看相关信息

获取 nginx Service：

```properties
$ kubectl get service nginx
NAME    TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
nginx   ClusterIP   None         <none>        80/TCP    111s
```

然后获取 web StatefulSet，以验证两者均已成功创建：

```properties
$ kubectl get sts web
NAME   READY   AGE
web    2/2     2m44s
```

**第一个终端**中的输出内容如下：

```properties
$ kubectl get pod -w -l app=nginx
web-0   0/1     Pending       0          0s
web-0   0/1     Pending       0          0s
web-0   0/1     ContainerCreating   0          0s
web-0   0/1     ContainerCreating   0          0s
web-0   1/1     Running             0          1s
web-1   0/1     Pending             0          0s
web-1   0/1     Pending             0          0s
web-1   0/1     ContainerCreating   0          0s
web-1   0/1     ContainerCreating   0          1s
web-1   1/1     Running             0          2s

```

此时使用 StatefulSet 部署了**两个 Pod，分别为 web-0、web-1**，同时也创建了**一个 CLUSTER-IP 为 None的 Headless Service**，<mark style="color:blue;">**在同一个命名空间内使用 web-0.nginx 和 web-1.nginx 即可访问这两个 Pod**</mark>，跨命名空间可以使用 web-0.nginx.default 访问（跨命名空间访问资源的情况很少，应当尽量规避）。
