是否可以使用端口443/80内部部署Kubernetes服务?
我知道在Kubernetes中公开服务的一些方法: 1. NodePort - 默认端口范围是30000 - 32767,因此我们无法使用443/80访问该服务。由于端口冲突,更改端口范围是有风险的,因此这不是一个好主意。 2.主机网络 - 强制pod使用主机的网络而不是专用的网络命名空间。不是一个好主意,因为我们失去了kube-dns等。 3. Ingress - AFAIK它使用NodePort(我们再次遇到第一个问题)或云提供商LoadBalancer。由于我们在内部使用Kubernetes,因此我们无法使用此选项。 MetalLB允许您在不在云提供程序上运行的集群中创建类型为LoadBalancer的Kubernetes服务,但还不够稳定。
您是否知道使用端口443/80内部部署在Kubernetes中公开服务的任何其他方式?我正在寻找一个“Kubernetes解决方案”;不使用外部群集反向代理。
谢谢。
使用入口控制器作为kubernetes集群中服务的入口点。在端口80或443上运行入口控制器。您需要为要从外部访问的每个后端服务定义入口规则。入口控制器应该能够允许客户端根据入口规则中定义的路径访问服务。
如果您需要允许通过https访问,那么您需要获取dns证书,将它们加载到机密中并在入口规则中绑定它们
最受欢迎的是nginx入口控制器。 Traefik和ha代理入口控制器也是其他替代解决方案
主机网络代理的想法实际上并不错,例如,Openshift路由器使用它。您可以定义两个或三个节点来运行代理,并在它们前面使用DNS负载平衡。
你仍然可以使用kube-dns和hostNetwork,请参阅https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/#pod-s-dns-policy
恕我直言的入口是最好的方式来做这件事。
我们将nginx-ingress-controller作为守护进程运行,每个控制器绑定到主机网络上的端口80和443。我们集群中几乎100%的流量都来自80或443,并通过入口规则路由到正确的服务。
每个应用程序,您只需要一个DNS记录映射您的主机名到您的群集的节点,以及相应的ingress
。
以下是守护进程清单的示例:
kind: DaemonSet
apiVersion: apps/v1
metadata:
name: nginx-ingress-controller
spec:
selector:
matchLabels:
component: ingress-controller
template:
metadata:
labels:
component: ingress-controller
spec:
restartPolicy: Always
hostNetwork: true
containers:
- name: nginx-ingress-lb
image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.21.0
ports:
- name: http
hostPort: 80
containerPort: 80
protocol: TCP
- name: https
hostPort: 443
containerPort: 443
protocol: TCP
env:
- name: POD_NAMESPACE
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
args:
- /nginx-ingress-controller
- '--default-backend-service=$(POD_NAMESPACE)/default-http-backend'