如何在不使用负载均衡器、helm等的情况下通过云管理的kubernetes公开nginx



我正在努力学习Kubernetes的基础知识,尽管我在本地玩过kubectlminikube,但我想通过互联网,在我可以访问的域(例如nginx.mydomain.com(上,使用DigitalOcean管理的Kubernete,公开基本的nginx docker映像。我的绊脚石似乎都是与网络相关的(服务和入口控制器(。

然而,我也希望避免大量的云资源,并且不使用太多的依赖关系来抽象问题——所以请不要使用LoadBalancers或Helm。现在,我看到的关于这类问题的大多数答案要么通过调用这两个工具来解决问题。

这是我的nginx.deployment.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.deployment.yaml。我的理解是,is在pod中创建了一个nginx容器,能够接受端口80上的连接(非常适合nginx(。我还使用NodePort服务公开了我的吊舱:

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

在这里,我还创建了一个nginx Ingress控制器,并通过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

我可以确认这已经运行,但由于某种原因,address字段为空?我想这不应该是事实吗?

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

假设我已经添加了一个DNS记录来将nginx.mydomain.com绑定到运行集群中节点的DigitalOcean液滴,我难道不能访问端口80上的nginx.mydomain.com并查看nginx欢迎页面吗?现在,我只是被拒绝连接:

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

我在这里错过了什么?

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

入口的想法流程类似于:

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控制器的精彩博客文章:https://www.digitalocean.com/community/tutorials/how-to-set-up-an-nginx-ingress-with-cert-manager-on-digitalocean-kubernetes

尽管如此,如果你期待着不运行LoadBalancer和所有

在没有LoadBalancer的情况下运行Nginx入口控制器是可能的,但我个人不建议这样做。

您可以按照以下步骤操作:https://stackoverflow.com/a/43190775/5525824

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

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

  1. 在群集中安装nginx-ingress-controller。这相当简单,只需遵循官方文档即可
  2. 在控制节点上(集群外(安装nginx代理服务
  3. 获取nginx-ingress-controller作为负载平衡器正在侦听的端口。例如:
    > 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
    
    这里31818是端口
  4. 配置外部nginx代理监听端口80并转发给localhost:31818
    http {
    server {
    listen 80
    location / {
    proxy_pass http://localhost:31818;
    }
    }
    }
    

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

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

最新更新