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

  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;
        }
    }
    
  2. 然后你可以将这个镜像部署到k8s集群,并为它创建一个服务。

选项 2

  1. 创建 2 docker 个图像:1 个用于 nginx,1 个用于您的 node.js。
  2. 将它们都部署到k8s,并为它们各自创建一个服务。使用 ClusterIP 作为 node.js 镜像的服务类型,LoadBalancer 作为 nginx 镜像的服务类型。
  3. 配置nginx作为反向代理,将请求转发到node.js图片服务对应的集群ip。

要在 minikube 上测试它,选项 1 更容易。对于生产 k8s 集群,建议使用选项 2。

我会添加第三个选项:使用 Ingress Controller https://github.com/nginxinc/kubernetes-ingress

它将创建您正在寻找并内置在 K8s 上的所有这些功能。