如何在裸机安装上从外部访问kubernetes服务

时间:2017-11-01 14:27:19

标签: kubernetes kubeadm cloud-bare-metal

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

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

由于

3 个答案:

答案 0 :(得分:1)

使用NodePort进行服务

创建类型为NodePort的服务,Service可以在每个节点上侦听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 Ingress Controller,其中侦听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

答案 1 :(得分:0)

如果要在家庭网络上执行此操作,请按以下步骤操作:
在我的路由器上配置2个端口转发规则,以将流量重定向到充当L4负载平衡器的Nginx Box。

因此,如果我的路由器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/
并部署通用云入口控制器中的大部分功能(这将在集群中创建入口控制器容器,L7 Nginx LB部署和服务,并将其公开在节点端口上,以便您拥有NodePort 32080和32443(请注意,它们将实际上是随机的,但这更容易理解))
(由于您使用的是裸机,我不相信它能够为您自动生成并配置L4负载均衡器。)


然后我将手动配置L4负载均衡器以负载均衡来自
端口80的流量---> NodePort 32080
端口443 ---> NodePort 32443
如此一眼就能知道该怎么做,下面的链接应该很好。
https://kubernetes.github.io/ingress-nginx/deploy/baremetal/

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

注意:我计划在几个月内在家里的壁橱中安装一个裸机集群,让我知道它的运行情况!

答案 2 :(得分:0)

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

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