创建 StatefulSet

web-statefulset.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

创建 StatefulSet

打开两个终端窗口:

  • 在第一个终端中,使用 kubectl get 来监视 StatefulSet 的 Pod 的创建情况:

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

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

查看相关信息

获取 nginx Service:

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

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

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

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

$ 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在同一个命名空间内使用 web-0.nginx 和 web-1.nginx 即可访问这两个 Pod,跨命名空间可以使用 web-0.nginx.default 访问(跨命名空间访问资源的情况很少,应当尽量规避)。

最后更新于