我试图将带有kubernates的angular应用程序部署到具有nginx的容器中。
我创建了我的docker文件:
FROM node:10-alpine as builder
COPY package.json package-lock.json ./
RUN npm ci && mkdir /ng-app && mv ./node_modules ./ng-app
WORKDIR /ng-app
COPY . .
RUN npm run ng build -- --prod --output-path=dist
FROM nginx:1.14.1-alpine
COPY nginx/default.conf /etc/nginx/conf.d/
RUN rm -rf /usr/share/nginx/html/*
COPY --from=builder /ng-app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
我的nginx配置:
server {
listen 80;
sendfile on;
default_type application/octet-stream;
gzip on;
gzip_http_version 1.1;
gzip_disable "MSIE [1-6]\.";
gzip_min_length 1100;
gzip_vary on;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript;
gzip_comp_level 9;
root /usr/share/nginx/html;
location / {
try_files $uri $uri/ /index.html =404;
}
location /api {
proxy_pass https://my-api;
}
}
如果我在本地启动此映像,则效果很好,但是当我在kubernate集群中部署此容器时,站点加载正常,但所有api请求均显示错误ERR_CONNECTION_REFUSED
。
我试图在GCP中进行部署,我先构建映像,然后通过GCP仪表板发布映像。
对此ERR_CONNECTION_REFUSED
有什么想法?
答案 0 :(得分:5)
我找到了解决方案。问题出在我的请求上,我在URL上使用localhost
时使用了错误的Pod IP,现在我将请求更改为直接使用服务IP,这就是我的问题。
答案 1 :(得分:1)
Kubernetes Engine节点在Compute Engine中被设置为实例。因此,它们遵循与其他实例相同的状态防火墙机制。您是否配置了防火墙规则?
https://cloud.google.com/solutions/prep-kubernetes-engine-for-prod#firewalling
答案 2 :(得分:1)
很好,您已经找到了问题所在。但是,您是否尝试使用service_names而非Pod IP?建议使用方法(https://kubernetes.io/docs/tasks/administer-cluster/access-cluster-services/#manually-constructing-apiserver-proxy-urls)通过服务名称在Kubernetes集群内访问,并在集群外部使用NodeIP或LoadBalancerIP。