[英]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.