繁体   English   中英

将外部IP分配给Kubernetes服务

[英]Assign External IP to a Kubernetes Service

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

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

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

在我目前的docker设置中,我正在使用MacVlan将我公司网络中的IP地址分配给某些容器,这样我就可以直接到达(没有反向代理),就像它是任何物理服务器一样。 我正在努力实现与k8s类似的东西。

我发现:

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

我的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 ABCD(这是我公司的网络之一)。 我的部署工作正常,因为我可以使用它的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

谢谢。

如果这仅用于测试,那么试试吧

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

那么你也能

curl http://localhost:80

可以工作的解决方案(不仅用于测试, 虽然它有其缺点 )是将Pod设置为映射主机网络,并将hostNetwork规范字段设置为true

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

这也意味着您只能在给定节点上运行此Pod的单个实例(谈论缺点......)。 因此,它使它成为DaemonSet对象的良好候选者。

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

例:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: nginx
spec:
  template:
    metadata:
      labels:
        app: nginx-reverse-proxy
    spec:
      hostNetwork: true
      dnsPolicy: ClusterFirstWithHostNet
      tolerations:  # allow a Pod instance to run on Master - optional
      - key: node-role.kubernetes.io/master
        effect: NoSchedule
      containers:
      - image: nginx
        name: nginx
        ports:
        - name: http
          containerPort: 80
        - name: https
          containerPort: 443

编辑:感谢ingress-nginx文档,我被放在这条轨道上

您可以只修补外部IP

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

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

首先运行此命令:

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"]}}'

并将外部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。

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

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

只需添加其他选项。

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

我不知道在你的特定情况下是否有帮助,但我所做的(我在裸机群集上)是使用LoadBalancer并将loadBalancerIP以及externalIPs为我的服务器IP。

之后,正确的外部IP出现在负载均衡器上。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM