Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将docker compose转换为nginx&;的Kubernetes;php fpm容器_Php_Docker_Symfony_Nginx_Kubernetes - Fatal编程技术网

将docker compose转换为nginx&;的Kubernetes;php fpm容器

将docker compose转换为nginx&;的Kubernetes;php fpm容器,php,docker,symfony,nginx,kubernetes,Php,Docker,Symfony,Nginx,Kubernetes,我有一个停靠的symfony项目,我正试图在Kubernetes集群的GPC中对其进行delpoy。 在开发中,我使用docker compose,我有两个用于php fpm和nginx的单独容器 当我运行docker compose up--build时,一切正常,但当我尝试创建kubernetes群集时,在运行kubectl apply-f nginx.deployment.yaml后,我遇到了以下错误: nginx:[emerg]在/etc/nginx/conf.d/default.con

我有一个停靠的symfony项目,我正试图在Kubernetes集群的GPC中对其进行delpoy。 在开发中,我使用docker compose,我有两个用于php fpm和nginx的单独容器

当我运行docker compose up--build时,一切正常,但当我尝试创建kubernetes群集时,在运行kubectl apply-f nginx.deployment.yaml后,我遇到了以下错误:

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

这是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容器

nginx的Dockerfile:

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和phpfpm放在同一个部署上,但仍然得到相同的错误


我遗漏了什么?

这里有两个问题:

  • 主机名
    php fpm
    未通过k8s中的DNS解析为服务的IP

  • 如果无法解析代理过程中使用的主机名,nginx/openresty将拒绝启动

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

解决方案

  • 使用在kubernetes内部正确解析的主机名

    GKE中核心DNS使用的DNS方案是
    .svc.cluster.local

  • 首先在变量中存储php fpm服务的正确主机名

    然后将此变量用作(fastcgi-)代理传递的目标

    这将使nginx启动,无论是否能够解析目标主机名

示例:

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

fastcgi_pass $upstream; 

由于
nginx
拒绝启动任何
proxy\u pass
服务,因此需要首先启动
php fpm
服务。您尚未共享
php fpm
的部署yaml。随着
php-fpm
的kubernetes部署,您需要在与
nginx
相同的名称空间中为
php-fpm
创建一个名为
php-fpm
的对象


您还可以使用Nicolai建议的变量hack,这样就可以启动nginx,而不依赖于
php fpm
。但无论哪种情况,您都需要为
php fpm
创建kubernetes部署和服务对象,以便应用程序能够实际工作。

您是否为这两种部署提供了匹配的服务?您需要一个名为
phpfpm
的服务来解析该名称。