试图制作一个裸机 k8s 集群来提供一些服务,并且需要能够在 tcp 端口 80 和 udp 端口 69 上提供它们(可从 k8s 集群外部访问。)我已经使用 kubeadm 设置了集群并且它正在运行 ubuntu 16.04。如何从外部访问服务?我一直在尝试使用负载均衡器和入口,但没有运气,因为我没有使用外部负载均衡器(本地而不是 AWS 等)
我正在尝试做的一个例子可以在这里找到,但它使用的是 GCE。
谢谢
试图制作一个裸机 k8s 集群来提供一些服务,并且需要能够在 tcp 端口 80 和 udp 端口 69 上提供它们(可从 k8s 集群外部访问。)我已经使用 kubeadm 设置了集群并且它正在运行 ubuntu 16.04。如何从外部访问服务?我一直在尝试使用负载均衡器和入口,但没有运气,因为我没有使用外部负载均衡器(本地而不是 AWS 等)
我正在尝试做的一个例子可以在这里找到,但它使用的是 GCE。
谢谢
创建一个类型为 的服务NodePort
,服务可以在每个节点上监听 TCP/UDP 端口 30000-32767。默认情况下,您不能简单地选择在节点上的端口 80 上公开服务。
kind: Service
apiVersion: v1
metadata:
name: my-service
spec:
selector:
app: MyApp
ports:
- protocol: TCP
port: {SERVICE_PORT}
targetPort: {POD_PORT}
nodePort: 31000
- portocol: UDP
port: {SERVICE_PORT}
targetPort: {POD_PORT}
nodePort: 32000
type: NodePort
容器镜像gcr.io/google_containers/proxy-to-service:v2
是一个非常小的容器,它会为你做端口转发。您可以使用它将 pod 端口或主机端口转发到服务。Pod 可以选择任何端口或主机端口,并且不受服务的限制。
apiVersion: v1
kind: Pod
metadata:
name: dns-proxy
spec:
containers:
- name: proxy-udp
image: gcr.io/google_containers/proxy-to-service:v2
args: [ "udp", "53", "kube-dns.default", "1" ]
ports:
- name: udp
protocol: UDP
containerPort: 53
hostPort: 53
- name: proxy-tcp
image: gcr.io/google_containers/proxy-to-service:v2
args: [ "tcp", "53", "kube-dns.default" ]
ports:
- name: tcp
protocol: TCP
containerPort: 53
hostPort: 53
如果有多个服务共享相同的 TCP 端口和不同的主机/路径,部署NGINX 入口控制器,它监听 HTTP 80 和 HTTPS 443。
创建一个入口,将流量转发到指定的服务。
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: test-ingress
annotations:
ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- http:
paths:
- path: /testpath
backend:
serviceName: test
servicePort: 80
如果您只有一个节点,请将入口控制器部署为主机端口 80 的守护程序集。不要为其部署服务
如果您有多个节点;对于云提供商,负载均衡器是集群外部的一种结构,它基本上是一个 HA 代理,用于在某些端口上运行您的服务的 Pod 的每个节点。您可以手动执行此类操作,对于您想要将设置类型公开给 NodePort 且某些端口在允许范围内(在 30k 中的某个位置)的任何服务,并使用 TCP 平衡器(例如 nginx)启动另一个 VM 到您的所有节点在那个港口。您将被限制为运行与该服务的节点一样多的 pod
如果我要在我的家庭网络上执行此操作,我会这样做:
在我的路由器上配置 2 个端口转发规则,以将流量重定向到充当 L4 负载均衡器的 nginx 盒子。
因此,如果我的路由器 IP 是 1.2.3.4 并且我的自定义 L4 nginx LB 是 192.168.1.200
那么我会告诉我的路由器进行端口转发:
1.2.3.4:80 --> 192.168.1.200:80
1.2.3.4:443 -- > 192.168.1.200:443
我会遵循这个https://kubernetes.github.io/ingress-nginx/deploy/
并部署通用云入口控制器中的大部分内容(这应该创建一个入口控制器 pod、一个 L7 Nginx LB 部署和服务集群,并在节点端口上公开它,这样你就有一个 NodePort 32080 和 32443(注意它们实际上是随机的,但这更容易理解))
(因为你在裸机上工作,我不相信它会能够为您自动生成和配置 L4 负载均衡器。)
然后,我将手动配置 L4 负载均衡器以负载平衡从
端口 80 进入的流量 ---> NodePort 32080
端口 443 ---> NodePort 32443
所以在做什么的大图和下面的链接之间你应该很好.
https://kubernetes.github.io/ingress-nginx/deploy/baremetal/
(顺便说一句,这将让您继续使用入口控制器配置入口)
注意:我计划在几个月后在我家的壁橱中安装一个裸机集群,所以请告诉我进展如何!