需求: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 进行访问。