将外部IP分配给Kubernetes服务

时间:2017-06-13 11:15:52

标签: networking kubernetes kubeadm

编辑:我的设置的重点是实现(如果可能)以下内容:

  • 我有多个k8s节点
  • 当我联系IP地址(来自我公司的网络)时,应该将其路由到我的容器/ pod / service /中的任何一个。
  • 我应该可以轻松设置该IP(就像在我的服务中.yml定义)

我正在运行一个小型Kubernetes集群(使用kubeadm构建),以评估我是否可以将Docker(旧)Swarm设置移动到k8s。我绝对需要的功能是能够为容器分配IP,就像我使用MacVlan一样。

在我目前的泊坞设置中,我使用MacVlan将我公司网络的IP地址分配给某些容器,这样我就可以直接联系(无需反向代理),就好像它是物理服务器。我试图用k8s来实现类似的东西。

我发现了:

  • 我必须使用服务
  • 我无法使用 LoadBalancer 类型,因为它仅适用于兼容的云提供商(如GCE或AWS)。
  • 我应该使用ExternalIPs
  • Ingress资源是某种反向代理吗?

我的yaml文件是:

apiVersion: apps/v1beta1
kind: Deployment
metadata:
      name: nginx-deployment
spec:
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
      nodeSelector:
        kubernetes.io/hostname: k8s-slave-3
---
kind: Service
apiVersion: v1
metadata:
  name: nginx-service
spec:
  type: ClusterIP
  selector:
    app: nginx
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 80
  externalIPs: 
    - A.B.C.D

我正在跳跃,我的服务将获得IP A.B.C.D(这是我公司的网络之一)。我的部署工作正常,因为我可以使用它的 ClusterIP 从k8s集群内部访问我的nginx容器。

我错过了什么?或者至少,我在哪里可以找到有关网络流量的信息,以查看数据包是否即将到来?

编辑

$ kubectl get svc
NAME            CLUSTER-IP     EXTERNAL-IP       PORT(S)   AGE
kubernetes      10.96.0.1      <none>            443/TCP   6d
nginx-service   10.102.64.83   A.B.C.D           80/TCP    23h

感谢。

8 个答案:

答案 0 :(得分:5)

如果这只是为了测试,请尝试

kubectl port-forward service/nginx-service 80:80

那么你可以

curl http://localhost:80

答案 1 :(得分:2)

首先运行以下命令:

kubectl get -n namespace services

以上命令将返回如下输出:

 NAME            TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)         AGE
backend   NodePort   10.100.44.154         <none>          9400:3003/TCP   13h   
frontend        NodePort   10.107.53.39     <none>        3000:30017/TCP   13h

从上面的输出中很明显,尚未将外部IP分配给服务。要将外部IP分配给后端服务,请运行以下命令。

 kubectl patch svc backend -p '{"spec":{"externalIPs":["192.168.0.194"]}}'

并为 frontend 服务分配外部IP,请运行此命令。

 kubectl patch svc frontend -p '{"spec":{"externalIPs":["192.168.0.194"]}}'

现在获得名称空间服务以检查任一外部IP分配:

kubectl get -n namespace services

我们得到这样的输出:

NAME     TYPE     CLUSTER-IP     EXTERNAL-IP    PORT(S)             AGE
backend  NodePort 10.100.44.154  192.168.0.194  9400:3003/TCP       13h
frontend NodePort 10.107.53.39   192.168.0.194  3000:30017/TCP      13h

干杯!!!现在已分配Kubernetes外部IP。

答案 2 :(得分:1)

您可以尝试使用kube-keepalived-vip配置来路由流量。 https://github.com/kubernetes/contrib/tree/master/keepalived-vip

答案 3 :(得分:0)

您可以尝试添加&#34;输入:NodePort&#34;在您的服务的yaml文件中,然后您将有一个端口通过Web浏览器或从外部访问它。对我而言,它有所帮助。

答案 4 :(得分:0)

我不知道这在您的特定情况下是否有帮助,但是我所做的(并且我在Bare Metal集群中)是使用LoadBalancer并设置loadBalancerIP以及将externalIPs设置为我的服务器IP。

之后,为负载均衡器显示了正确的外部IP。

答案 5 :(得分:0)

一种可行的解决方案(不仅适用于测试,尽管有其缺点),但您可以将hostNetwork规范字段设置为{ {1}}。

这意味着您不需要公开Pod的服务,因为它始终可以通过单个端口(清单中指定的true)在主机上进行访问。在这种情况下,无需保留DNS映射记录。

这也意味着您只能在给定节点上运行此Pod的单个实例(谈论缺点...)。因此,它非常适合DaemonSet对象。

如果您的Pod仍然需要访问/解析内部Kubernetes主机名,则需要将containerPort规范字段设置为dnsPolicy。此设置将使您的Pod可以访问K8S DNS服务。

示例:

ClusterFirstWithNoHostNet

编辑:感谢ingress-nginx documentation

答案 6 :(得分:0)

您只需修补外部IP

CMD:const products_schema = { _id: { auto: true }, product_name: { auto: false, type: "string", min: 5, max: 10, special_characters: ['_', ' '], numbers: true, alphabet: true, required: true, correct: "" }, product_image: { auto: false, type: "array:string", min: 0, max: 50, required: true }, product_specification: { auto: false, type: "array:specification_schema", min: 0, max: 50, required: true } }; for (const key in products_schema){ console.log(key); for (const inner in products_schema[key]){ console.log(`${inner}:${products_schema[key][inner]}`); } }

例如:-$ kubectl patch svc svc_name -p '{"spec":{"externalIPs":["your_external_ip"]}}'

答案 7 :(得分:-1)

只需包含其他选项即可。

kubectl expose deployment hello-world --type=LoadBalancer --name=my-service --external-ip=1.1.1.1