当前位置: 首页 > 知识库问答 >
问题:

如何通过云管理的kubernetes公开nginx,而不使用负载平衡器、helm等?

许茂才
2023-03-14

我正在尝试学习Kubernetes的基础知识,虽然我在本地玩过kubectl和minikube,但我想通过互联网在我可以访问的域上(例如,使用DigitalOcean管理的Kubernetes)展示基本的nginx docker映像。我的绊脚石似乎是所有与网络相关的(服务和入口控制器)。

然而,我也希望避免不得不增加大量的云资源,并且不需要使用太多的依赖项来从我这里抽象出问题,所以请不要使用负载平衡器或Helm。现在,我看到的关于此类问题的大多数答案要么通过调用这两个工具来解决问题。

这是我的nginx。部署。yaml文件:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  strategy:
    rollingUpdate:
      maxSurge: 1
  replicas: 1
  selector:
    matchLabels:
      app: nginx-deployment
  template:
    metadata:
      labels:
        app: nginx-deployment
    spec:
      containers:
        - name: nginx-app
          image: nginx
          ports:
            - containerPort: 80

我将此应用于我的集群kubectl apply-f k8s/nginx。部署。yaml。我的理解是,is在pod中创建了一个nginx容器,能够接受端口80上的连接(非常适合nginx)。我还使用NodePort服务公开我的pod:

kubectl expose deployment nginx-deployment --port=8080 --type=NodePort --name=nginx-service

从这里开始,我还创建了一个nginx入口控制器,并通过kubectl也应用它:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: testing-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  rules:
    - host: nginx.mydomain.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: nginx-service
                port:
                  number: 8080

我可以确认这个ran,但由于某种原因,地址字段是空的?我想应该不是这样吧?

~ % kubectl get ingress
NAME              CLASS    HOSTS                         ADDRESS   PORTS   AGE
testing-ingress   <none>   nginx.mydomain.com                      80      83m

给定,然后我添加了一个DNS记录来绑定nginx。mydomain。com访问群集中运行节点的DigitalOcean droplet,难道我不能访问nginx吗。mydomain。com,并查看nginx欢迎页面?现在,我只是被拒绝了连接:

curl http://nginx.mydomain.com
curl: (7) Failed to connect to http://nginx.mydomain.com port 80: Connection refused

我错过了什么?

共有2个答案

梁丘亦
2023-03-14

如果可以通过somenode访问控制平面节点。somecloudprovider。com,则需要执行以下操作:

  1. Install nginx-ingress-controller in the cluster. This is fairly simple, just follow the official documentation.
  2. On the control node (outside the cluster) install the nginx proxy service.
  3. Get the port the nginx-ingress-controller is listening on as a load-balancer. For example:
    > kubectl get svc --namespace=ingress-nginx
    > Output
      NAME                                 TYPE           CLUSTER-IP       EXTERNAL-IP       PORT(S)                      AGE
      ingress-nginx-controller             LoadBalancer   10.245.201.120   203.0.113.0   80:31818/TCP,443:31146/TCP   14m
      ingress-nginx-controller-admission   ClusterIP      10.245.239.119   <none>            443/TCP                      14m
    
    http {
      server {
        listen 80
        location / {
            proxy_pass http://localhost:31818;
        }
      }
    }
    

    现在,当您访问地址somenode.somecloudprovider.com时,外部nginx代理会将其路由到集群内的nginx-ingres-Control。从那里,ingres-Control将查看集群中定义的ingress资源并将其发送到匹配的服务。

    此外,如果您想启用HTTPS,只需更新外部代理以使用证书侦听443即可。

居飞扬
2023-03-14

我不确定您在DNS中添加了哪个IP地址来解析您的域地址。

ingress的想法流程如下:

internet traffic > ingress > ingress controller > service > deployment > Pod

需要相应的入口控制器才能运行

当您设置入口控制器时,它将创建具有LoadBalancer类型的服务并为您提供一个外部IP。

您可以将此外部IP作为记录添加到DNS中,然后可以为特定域创建入口。

例如,您在DNS中添加了一条记录:

*.beta.example.com A 30 TTL 192.168.1.52(whatever your loadbalancer IP)

DNS将把所有流量转移到入口控制器,入口控制器将检查入口对象配置,将流量重定向到特定的Kubernetes服务。

您将来可能还需要使用证书管理器来管理SSL/TLS证书。请参阅digital ocean的这篇文章,了解如何设置Nginx controller:https://www.digitalocean.com/community/tutorials/how-to-set-up-an-nginx-ingress-with-cert-manager-on-digitalocean-kubernetes

尽管如此,如果您希望不运行LoadBalancer和所有

可以在没有负载平衡器的情况下运行Nginx ingress controller,但我个人不建议这样做。

你可以按照这个:https://stackoverflow.com/a/43190775/5525824

注意:在任何情况下,您都需要安装并使用入口控制器。对于NodePort,问题是您必须使用节点(VM)的外部IP,现在在降级或升级过程中,如果节点崩溃,您的IP将无法工作,到集群的流量将停止。

 类似资料:
  • 堆栈:Azure Kubernetes服务 NGINX Ingress Controller-https://github.com/Kubernetes/ingress-nginx AKS LoadBalancer Docker容器 我的目标是创建一个K8s集群,它将允许我在一个IP下使用多个POD,创建一个微服务架构。在使用了大量的教程和文档之后,我的EndGoal没有任何运气。我已经到了能够使

  • kubernetes集群与api服务器(https://192.168.0.10:6443) 想法: 从我的笔记本电脑,我想运行kubectl,指向负载均衡器,在那里牧师代理将把我重定向到api服务器。 步骤: -我将kubeconfig(笔记本电脑上)文件中的服务器ip更改为LB的ip:https://192.168.0.10:6443是http://10.10.0.2:8080/ -我这样配置

  • 我正在尝试部署一个Docker容器,它公开了一个简单的Docker服务器,它是Google容器引擎(库伯内特斯)中httpbin.org服务的克隆。 这是我正在使用的服务定义: 入口定义为: 在服务/入口仪表板中,我可以看到两个IP,一个直接绑定到服务(临时),另一个静态IP绑定到入口。直接在80号端口给他们两个打电话很有魅力。 完成后,我为静态IP创建了一个A记录,并确保GKE仪表板中的负载平衡

  • 我正在尝试设置应用型负载均衡,以将流量转发到AWS中的Nginx入口控制器。要设置Nginx入口控制器,我使用的是从安装说明中获得的YML。 部署后,一切正常,流量正确转发到EKS pod。但是,上面的YML文件正在aws中创建“经典负载均衡器”,因为我想创建“应用型负载均衡器”。我将“service.beta.kubernetes.io/aws-load-balancer-type: elb”更

  • 我遵循了GKE教程,使用beta Inrit类型创建HTTP负载均衡器,并且在使用nginx映像时工作正常。我的问题是为什么Inrit是必要的。 我可以创建一个容器引擎集群,然后创建一个使用库伯内特斯创建的实例组作为服务后端的HTTP负载均衡器,并且一切似乎都运行良好。当仅在部分流程中使用库伯内特斯似乎运行良好时,为什么我要经历使用Inete的所有麻烦?

  • 我们利用入口创建HTTPS负载平衡器,直接转发到我们的(通常是nodejs)服务。然而,最近我们希望对NodeJ前面的流量进行更多的控制,而Google负载平衡器没有提供这种控制。 标准化的自定义错误页面 标准重写规则(例如将超文本传输协议重定向到https) 将pod readinessProbes与负载均衡器健康检查解耦(因此当没有健康的pod时,我们仍然可以提供自定义错误页面)。 我们在堆栈