您的位置:

K8s部署Nginx

一、K8s部署Nginx集群

在Kubernetes上部署Nginx可以实现高可用性的负载均衡和伸缩性。Kubernetes可以把Nginx服务的Pod自动部署在不同的节点上,以实现容器的高可用性。

首先,我们需要创建一个Nginx Docker镜像并将其上传到Docker Registry:


# 创建Dockerfile文件
FROM nginx:latest
COPY ./nginx.conf /etc/nginx/nginx.conf

接下来,构建并上传镜像:


docker build -t my-nginx:v1 .
docker tag my-nginx:v1 dockerhub_username/my-nginx:v1
docker push dockerhub_username/my-nginx:v1

创建一个K8s Deployment并暴露Service:


apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: dockerhub_username/nginx:v1
        ports:
        - containerPort: 80
          protocol: TCP
      nodeSelector:
        kubernetes.io/hostname: "node1"
        # 注意:需要根据实际情况设置节点
---
apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  selector:
    app: nginx
  ports:
  - name: http
    port: 80
    targetPort: 80
  type: ClusterIP

这里的Deployment定义将创建3个Pod来托管Nginx应用程序,而Service将把这些Pod公开为Kubernetes中的一个服务。这里使用ClusterIP类型的Service,将根据与该服务关联的Pod的选择器(这里是"app: nginx")创建一个虚拟IP地址,并将所有匹配该选择器的流量转发到这些Pod。

二、K8s部署Nginx端口无法访问

如果在Kubernetes上部署Nginx服务后无法通过端口访问,可能需要通过检查以下内容来解决问题:

  1. 确保Deployment和Service都处于正常状态
  2. 检查防火墙规则是否允许访问
  3. 检查Nginx的配置文件是否正确配置了监听端口
  4. 通过K8s Dashboard或kubectl logs命令查看容器的日志输出,以确定是Nginx配置问题还是其他问题导致的端口无法访问

三、K8s部署Nginx无法访问

如果在Kubernetes上部署Nginx服务后无法从集群外部访问,需要将Service类型改为LoadBalancer类型。LoadBalancer服务将在云环境中创建一个负载均衡器,并为Service分配一个可公开访问的IP地址。


apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  selector:
    app: nginx
  ports:
  - name: http
    port: 80
    targetPort: 80
  type: LoadBalancer

执行kubectl get services命令即可获取到该Service分配的IP地址。

四、K8s部署Nginx反向代理

在Kubernetes上部署Nginx反向代理可以将HTTP请求从负载均衡器路由到不同的后端服务中。

首先,我们需要在Nginx配置文件中指定反向代理的服务:


http {
    upstream myapp1 {
        server myapp1:80;
    }
    upstream myapp2 {
        server myapp2:80;
    }
    server {
        location / {
            proxy_pass http://myapp1/;
        }
        location /api/ {
            proxy_pass http://myapp2/;
        }
    }
}

接下来,将该配置文件挂载到容器内的文件系统中:


apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: dockerhub_username/nginx:v1
        ports:
        - containerPort: 80
          protocol: TCP
        volumeMounts:
        - name: config-volume
          mountPath: /etc/nginx/nginx.conf
          subPath: nginx.conf
      volumes:
      - name: config-volume
        configMap:
          name: nginx-config

上面的Deployment定义将使用Kubernetes ConfigMap挂载Nginx配置文件。

五、K8s部署Nginx多个端口

如果需要在同一个K8s Deployment中同时部署多个Nginx实例,可以为每个实例指定不同的容器端口。


apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx1
        image: dockerhub_username/nginx:v1
        ports:
        - containerPort: 80
          protocol: TCP
      - name: nginx2
        image: dockerhub_username/nginx:v1
        ports:
        - containerPort: 81
          protocol: TCP

上面的Deployment定义将创建两个Nginx容器,一个监听80端口,一个监听81端口。

六、K8s部署Nginx挂载配置文件

如果需要在部署Nginx时使用自定义的配置文件,可以使用Kubernetes ConfigMap将配置文件挂载到容器中。

首先,我们需要创建一个ConfigMap:


kubectl create configmap nginx-config --from-file=nginx.conf=./nginx.conf

然后,我们可以使用该ConfigMap来部署Nginx:


apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: dockerhub_username/nginx:v1
        ports:
        - containerPort: 80
          protocol: TCP
        volumeMounts:
        - name: config-volume
          mountPath: /etc/nginx/nginx.conf
          subPath: nginx.conf
      volumes:
      - name: config-volume
        configMap:
          name: nginx-config

上面的Deployment定义将使用Kubernetes ConfigMap挂载名为"nginx-config"的ConfigMap中的"nginx.conf"文件。

七、K8s部署Nginx配置文件

在Kubernetes上部署Nginx时,可以使用ConfigMap定义Nginx的配置文件:


apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-config
data:
  nginx.conf: |
    http {
        server {
            listen 80;
            server_name localhost;
            location / {
                root /usr/share/nginx/html;
                index index.html;
            }
        }
    }

然后,我们可以使用该ConfigMap在Nginx Deployment中定义Nginx的配置文件:


apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: dockerhub_username/nginx:v1
        ports:
        - containerPort: 80
          protocol: TCP
        volumeMounts:
        - name: config-volume
          mountPath: /etc/nginx/nginx.conf
          subPath: nginx.conf
      volumes:
      - name: config-volume
        configMap:
          name: nginx-config

八、K8s部署Nginx需要暴露Service吗?

在Kubernetes中部署Nginx时,是否需要暴露Service取决于负载均衡器的位置。

如果负载均衡器位于Kubernetes集群内部,则需要暴露Service;如果负载均衡器位于云环境中,则可以通过云服务提供商的负载均衡器服务来公开Nginx服务。

九、K8s部署Nacos集群

Nacos是一个开源的服务发现、配置管理和动态DNS系统。在Kubernetes上部署Nginx可以使用Nacos作为Service Discovery和配置中心。

首先,我们需要使用Nacos创建一个配置文件。示例配置文件如下:


spring:
  application:
    name: nginx
  cloud:
    nacos:
      discovery:
        server-addr: nacos-service:8848
      config:
        server-addr: nacos-config:8848
        file-extension: yaml
        group: DEFAULT_GROUP

然后,我们可以使用该配置文件来创建一个Kubernetes ConfigMap:


kubectl create configmap nginx-config --from-file=application.yml=./application.yml

接下来,我们可以使用该ConfigMap来部署Nginx Deployment:


apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: dockerhub_username/nginx:v1
        ports:
        - containerPort: 80
          protocol: TCP
        volumeMounts:
        - name: config-volume
          mountPath: /usr/share/nginx/html
      volumes:
      - name: config-volume
        configMap:
          name: nginx-config

最后,我们可以在Nginx配置文件中指定Nacos作为Service Discovery和配置中心:


http {
    resolver nacos-service:8848;
    # 这里指定了Nacos的服务地址
    server {
        # 使用Nacos动态DNS获取服务地址
        location /myapp1 {
            proxy_pass http://myapp1/;
        }
        location /myapp2 {
            proxy_pass http://myapp2/;
        }
    }
}

配置完成后,Nginx将从Nacos中获取服务地址并将HTTP请求路由到指定的后端服务中。