簡體   English   中英

將 docker-compose 轉換為 Kubernetes 用於 nginx 和 php-fpm 容器

[英]Convert docker-compose to Kubernetes for nginx & php-fpm containers

我有一個 dockerized symfony 項目,我正在嘗試在 Kubernetes 集群上的 GPC 中將其刪除。 在開發中,我使用 docker-compose,我有兩個單獨的容器用於 php-fpm 和 nginx。

When I run docker-compose up --build, it all works fine, but when I try to create a kubernetes cluster I get this error after I run kubectl apply -f nginx.deployment.yaml:

nginx:在 /etc/nginx/conf.d/default.conf:11 的上游“php-fpm”中找不到 [emerg] 主機

這是 nginx default.conf 文件:

server {
listen 80;
server_name localhost;
root /app/public;

location / {
    try_files $uri /index.php$is_args$args;
}

location ~ ^/index\.php(/|$) {
    fastcgi_pass php-fpm:9000;
    fastcgi_split_path_info ^(.+\.php)(/.*)$;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param DOCUMENT_ROOT $document_root;
    internal;
}

location ~ \.php$ {
    return 404;
}
}

請注意

fastcgi_pass php-fpm:9000;

它引用了 php-fpm 容器。

Dockerfile 用於 nginx:

ARG VERSION

# Dev image
FROM nginx:${VERSION}-alpine as dev

# Copy nginx config
COPY ./docker/nginx/default.conf /etc/nginx/conf.d/default.conf

# Prod image
FROM dev as prod

# Copy assets
COPY ./assets /app/public

這是 nginx.deployment.yaml 文件:

apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    kompose.cmd: kompose convert -f ../docker-compose.yml
    kompose.version: 1.22.0 (955b78124)
  creationTimestamp: null
  labels:
    io.kompose.service: nginx
  name: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      io.kompose.service: nginx
  strategy:
    type: Recreate
  template:
    metadata:
      annotations:
        kompose.cmd: kompose convert -f ../docker-compose.yml
        kompose.version: 1.22.0 (955b78124)
      creationTimestamp: null
      labels:
        io.kompose.service: nginx
    spec:
      containers:
        - image: myDockerHubRegistry/symfony-nginx:0.2
          name: nginx
          ports:
            - containerPort: 80
          resources: {}
          volumeMounts:
            - mountPath: /app/public
              name: nginx-claim
      restartPolicy: Always
      volumes:
        - name: nginx-claim
          persistentVolumeClaim:
            claimName: nginx-claim
status: {}

我還嘗試將 nginx 和 php-fpm 放在同一個部署中,但我仍然得到同樣的錯誤。

我錯過了什么?

這里有2個問題

  • 主機名php-fpm無法通過 k8s 中的 DNS 解析為服務的 IP

  • 如果無法解析代理通行證中使用的主機名,則 nginx/openresty 拒絕啟動

    nginx:在上游“主機名”中找不到 [emerg] 主機

解決方案

  • 使用在 kubernetes 內正確解析的主機名。

    GKE中Core DNS使用的DNS方案是<service>.<namespace>.svc.cluster.local

  • 首先將 php-fpm 服務的正確主機名存儲在變量中。

    然后使用這個變量作為 (fastcgi-)proxy pass 的目標。

    這將使 nginx 啟動,無論是否能夠解析目標主機名。

例子:

set $upstream php-fpm.your-namespace.svc.cluster.local:9000;

fastcgi_pass $upstream; 

由於nginx在任何proxy_pass服務不可用時拒絕啟動,因此您需要先啟動php-fpm服務。 您尚未共享php-fpm的部署 yaml 。 Along with the kubernetes deployment for php-fpm , you need to create a kubernetes service object for php-fpm with the name php-fpm within the same namespace as nginx .

您還可以使用 Nicolai 建議的變量 hack,這樣您就可以啟動 nginx 而不依賴於php-fpm 但無論哪種情況,您都需要為php-fpm創建 kubernetes 部署和服務對象,以便您的應用程序實際工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM