如何在 Kubernetes 集群中创建多个 Mediawiki 实例

How to create multiple instances of Mediawiki in a Kubernetes Cluster

我即将在我的 Kubernetes 集群上部署多个 Mediawiki 实例。 在我的例子中,数据库的 YAML 部署文件(MySQL)按预期工作,Mediawiki 的部署文件部署了与预期一样多的 pods,但我无法从集群外部访问它们即使我为这种情况创建服务。

如果我尝试创建一个 Mediawiki pod 和一项服务以从集群外部访问它,它会正常工作。如果我尝试为 Mediawiki 创建一个与 MySQL 相同的部署文件,它会创建 pods 和所需的服务,但无法从分配给它的外部 IP 访问它。

我的 Mediawiki 部署文件:

apiVersion: v1
kind: Service
metadata:
 name: mediawiki-service
 labels:
  name: mediawiki-service
  app: mediawiki
spec:
 type: LoadBalancer
 ports:
 - port: 80
   targetPort: 80
 selector:
  name: mediawiki-pod
  app: mediawiki
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mediawiki
spec:
  replicas: 6
  selector:
    matchLabels:
      app: mediawiki
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: mediawiki
    spec:
      containers:
      - image: mediawiki
        name: mediawiki
        ports:
        - containerPort: 80
          name: mediawiki

这是 pod 定义文件:

apiVersion: v1
kind: Pod
metadata:
 name: mediawiki-pod
 labels:
  name: mediawiki-pod
  app: mediawiki
spec:
 containers:
 - name: mediawiki
   image: mediawiki
   ports:
   - containerPort: 80

这是服务定义文件:

apiVersion: v1
kind: Service
metadata:
 name: mediawiki-service
 labels:
  name: mediawiki-service
  app: mediawiki
spec:
 type: LoadBalancer
 ports:
 - port: 80
   targetPort: 80
 selector:
  name: mediawiki-pod

实际结果应该是我可以在我的集群上部署多个Mediawiki实例,并且可以使用externel-IP从外部访问它们。

如果您想在 Kubernetes 集群上部署某个软件的多个实例,最好检查一下是否有 helm 图表。 在你的情况下,答案是肯定的——有一个 stable helm chart for Mediawiki

创建多个实例就像创建多个版本一样简单,例如:

helm install --name wiki1 stable/mediawiki
helm install --name wiki2 stable/mediawiki
helm install --name wiki3 stable/mediawiki

要使用 Helm,您必须将其安装在本地计算机和 k8s 集群上 - 按照 quick start guide 就足够了。

如果您在这两种情况下查看 kubectl describe service mediawiki-service,我希望您会看到在 single-pod 情况下,有一个 Endpoints: 列表包含一个 IP 地址( pod 的,但这是一个实现细节)但在部署案例中,它表示 <none>.

您的服务仅匹配具有 nameapp 标签的 pods:

apiVersion: v1
kind: Service
spec:
 selector:
  name: mediawiki-pod
  app: mediawiki

但是你部署的pods只有app个标签:

apiVersion: apps/v1
kind: Deployment
spec:
  template:
    metadata:
      labels:
        app: mediawiki

所以在那个特定点(部署模板内的标签;在顶层添加它们也没有坏处,但这个嵌入点很重要)你需要添加第二个标签name: mediawiki-pod.