4

试图制作一个裸机 k8s 集群来提供一些服务,并且需要能够在 tcp 端口 80 和 udp 端口​​ 69 上提供它们(可从 k8s 集群外部访问。)我已经使用 kubeadm 设置了集群并且它正在运行 ubuntu 16.04。如何从外部访问服务?我一直在尝试使用负载均衡器和入口,但没有运气,因为我没有使用外部负载均衡器(本地而不是 AWS 等)

我正在尝试做的一个例子可以在这里找到,但它使用的是 GCE。

谢谢

4

3 回答 3

2

使用 NodePort 服务

创建一个类型为 的服务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
于 2017-11-01T22:48:41.980 回答
0

如果您只有一个节点,请将入口控制器部署为主机端口 80 的守护程序集。不要为其部署服务

如果您有多个节点;对于云提供商,负载均衡器是集群外部的一种结构,它基本上是一个 HA 代理,用于在某些端口上运行您的服务的 Pod 的每个节点。您可以手动执行此类操作,对于您想要将设置类型公开给 NodePort 且某些端口在允许范围内(在 30k 中的某个位置)的任何服务,并使用 TCP 平衡器(例如 nginx)启动另一个 VM 到您的所有节点在那个港口。您将被限制为运行与该服务的节点一样多的 pod

于 2018-09-15T01:14:50.277 回答
0

如果我要在我的家庭网络上执行此操作,我会这样做:
在我的路由器上配置 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/

(顺便说一句,这将让您继续使用入口控制器配置入口)

注意:我计划在几个月后在我家的壁橱中安装一个裸机集群,所以请告诉我进展如何!

于 2018-09-15T00:47:45.100 回答