天天看点

【K8S实践】StatefulSet 和 Service应用案例

需求:k8s中创建5个nginx 的pod,通过service调度到不同的nginx pod,每个nginx pod有自己独立的网页内容,目的是能清晰的知道service访问调度到那个具体的pod上。

实现方式:通过Kubernetes 的 StatefulSet 和 Service 来实现这个需求。

准备网页文件

首先需要准备 5 个不同的网页文件,每个文件对应一个 Nginx Pod。假设这 5 个文件分别为 index1.html, index2.html, index3.html, index4.html, index5.html。

创建 ConfigMap

使用 ConfigMap 将这 5 个文件打包为一个资源,并在 StatefulSet 中使用 volumeMounts 将资源挂载到相应的 Nginx Container 中。

以下是一个示例 ConfigMap YAML 文件:

apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-config
data:
  index1.html: |
    <html>
      <body>
        <h1>This is index1.html</h1>
      </body>
    </html>
  index2.html: |
    <html>
      <body>
        <h1>This is index2.html</h1>
      </body>
    </html>
  index3.html: |
    <html>
      <body>
        <h1>This is index3.html</h1>
      </body>
    </html>
  index4.html: |
    <html>
      <body>
        <h1>This is index4.html</h1>
      </body>
    </html>
  index5.html: |
    <html>
      <body>
        <h1>This is index5.html</h1>
      </body>
    </html>           

上述 YAML 文件将创建一个名为 nginx-config 的 ConfigMap,其中包含 5 个不同的网页内容。可以使用以下命令来创建该 ConfigMap:

kubectl apply -f nginx-config.yaml           

创建 StatefulSet

创建一个 StatefulSet 来创建 5 个 Nginx Pod,每个 Pod 挂载相应的网页内容。

以下是一个示例 StatefulSet YAML 文件:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: nginx-web
spec:
  serviceName: nginx-web-service
  replicas: 5
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        volumeMounts:
        - name: nginx-config
          mountPath: /usr/share/nginx/html
        env:
        - name: INDEX
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        ports:
        - containerPort: 80
  volumeClaimTemplates:
  - metadata:
      name: nginx-config
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "standard"
      resources:
        requests:
          storage: 1Gi           

上述 YAML 文件将创建一个名为 nginx-web 的 StatefulSet。在 StatefulSet 的容器定义中,定义了 volumeMounts 以及使用 env 变量动态获取 Pod 名称,从而实现将不同的网页内容挂载到不同的 Pod 中。可以使用以下命令将其应用到 Kubernetes 集群中:

kubectl apply -f nginx-web.yaml           

创建 Service

创建一个 Service 来将访问请求路由到这些 Nginx Pod。以下是一个示例 Service YAML 文件:

apiVersion: v1
kind: Service
metadata:
  name: nginx-web-service
spec:
  selector:
    app: nginx
  ports:
    - name: http
     port: 80
     targetPort: 80           

该 YAML 文件将创建一个名为 nginx-web-service 的 Service,并将其与 nginx-web StatefulSet 中的 Pod 关联起来。该 Service 上的端口为 80。

可以使用以下命令来创建该 Service:

kubectl apply -f nginx-web-service.yaml           

现在,您将拥有 5 个 Nginx Pod,每个 Pod 拥有自己独立的网页内容,并可以通过 Service 进行访问。

继续阅读