Kubernetes:添加 NGINX 网络服务器
Kubernetes: add NGINX webserver
我设法使用以下配置创建并部署了一个带有 minikube 的 k8s 集群,运行 一个简单的 hello-world node.js 应用程序的 4 个副本。
应用程序的 Dockerfile:
FROM ubuntu:latest
RUN apt-get update
RUN apt-get -qq update
RUN apt-get install -y nodejs npm
# TODO could uninstall some build dependencies
# debian installs `node` as `nodejs`
RUN update-alternatives --install /usr/bin/node node /usr/bin/nodejs 10
COPY package.json package.json
RUN npm install
COPY . .
CMD ["node", "app.js"]
k8s 部署 yml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: node-deployment
labels:
app: node-app
spec:
replicas: 4
selector:
matchLabels:
app: node-app
template:
metadata:
labels:
app: node-app
spec:
containers:
- name: node-app
image: my-repo/ubuntu-node:sectry
ports:
- containerPort: 3000
---
apiVersion: v1
kind: Service
metadata:
name: node-service
labels:
app: node-app
spec:
type: NodePort
ports:
- port: 3000
protocol: TCP
selector:
app: node-app
我的问题是如何为它添加一个nginx容器?我知道 k8s 集群已经负载均衡了,但我真的很想使用 NGINX 特性。
我猜您想使用 nginx 作为 Node.js 应用程序的反向代理。如果是这样,您可以使用以下方法之一来实现它。
选项 1
将 nginx 和您的 node.js 应用构建到一个 Docker 映像中。在此图中,将 nginx 配置为反向代理并将请求转发到您的 node.js 应用程序。比如下面的nginx configure将请求转发到同一个容器中的3000端口。
server {
listen 80;
server_name localhost;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:3000;
}
}
然后你可以将这个镜像部署到k8s集群,并为它创建一个服务。
选项 2
- 创建 2 docker 个图像:1 个用于 nginx,1 个用于您的 node.js。
- 将它们都部署到k8s,并为它们各自创建一个服务。使用
ClusterIP
作为 node.js 镜像的服务类型,LoadBalancer
作为 nginx 镜像的服务类型。
- 配置nginx作为反向代理,将请求转发到node.js图片服务对应的集群ip。
要在 minikube 上测试它,选项 1 更容易。对于生产 k8s 集群,建议使用选项 2。
我会添加第三个选项:使用 Ingress Controller https://github.com/nginxinc/kubernetes-ingress。
它将创建您正在寻找并内置在 K8s 上的所有这些功能。
我设法使用以下配置创建并部署了一个带有 minikube 的 k8s 集群,运行 一个简单的 hello-world node.js 应用程序的 4 个副本。
应用程序的 Dockerfile:
FROM ubuntu:latest
RUN apt-get update
RUN apt-get -qq update
RUN apt-get install -y nodejs npm
# TODO could uninstall some build dependencies
# debian installs `node` as `nodejs`
RUN update-alternatives --install /usr/bin/node node /usr/bin/nodejs 10
COPY package.json package.json
RUN npm install
COPY . .
CMD ["node", "app.js"]
k8s 部署 yml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: node-deployment
labels:
app: node-app
spec:
replicas: 4
selector:
matchLabels:
app: node-app
template:
metadata:
labels:
app: node-app
spec:
containers:
- name: node-app
image: my-repo/ubuntu-node:sectry
ports:
- containerPort: 3000
---
apiVersion: v1
kind: Service
metadata:
name: node-service
labels:
app: node-app
spec:
type: NodePort
ports:
- port: 3000
protocol: TCP
selector:
app: node-app
我的问题是如何为它添加一个nginx容器?我知道 k8s 集群已经负载均衡了,但我真的很想使用 NGINX 特性。
我猜您想使用 nginx 作为 Node.js 应用程序的反向代理。如果是这样,您可以使用以下方法之一来实现它。
选项 1
将 nginx 和您的 node.js 应用构建到一个 Docker 映像中。在此图中,将 nginx 配置为反向代理并将请求转发到您的 node.js 应用程序。比如下面的nginx configure将请求转发到同一个容器中的3000端口。
server { listen 80; server_name localhost; location / { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://127.0.0.1:3000; } }
然后你可以将这个镜像部署到k8s集群,并为它创建一个服务。
选项 2
- 创建 2 docker 个图像:1 个用于 nginx,1 个用于您的 node.js。
- 将它们都部署到k8s,并为它们各自创建一个服务。使用
ClusterIP
作为 node.js 镜像的服务类型,LoadBalancer
作为 nginx 镜像的服务类型。 - 配置nginx作为反向代理,将请求转发到node.js图片服务对应的集群ip。
要在 minikube 上测试它,选项 1 更容易。对于生产 k8s 集群,建议使用选项 2。
我会添加第三个选项:使用 Ingress Controller https://github.com/nginxinc/kubernetes-ingress。
它将创建您正在寻找并内置在 K8s 上的所有这些功能。