Networking 将外部IP分配给Kubernetes服务

Networking 将外部IP分配给Kubernetes服务,networking,kubernetes,kubeadm,Networking,Kubernetes,Kubeadm,编辑:我的设置的全部目的是(如果可能)实现以下目标: 我有多个k8s节点 当我联系一个IP地址(从我公司的网络),它应该被路由到我的一个容器/吊舱/服务/任何东西 我应该能够轻松设置该IP(如在我的service.yml定义中) 我正在运行一个小型Kubernetes集群(使用kubeadm构建),以评估是否可以将Docker(旧)Swarm设置移动到k8s。我绝对需要的功能是能够将IP分配给容器,就像我对MacVlan所做的那样 在我当前的docker设置中,我使用MacVlan将公司网络

编辑:我的设置的全部目的是(如果可能)实现以下目标:

  • 我有多个k8s节点
  • 当我联系一个IP地址(从我公司的网络),它应该被路由到我的一个容器/吊舱/服务/任何东西
  • 我应该能够轻松设置该IP(如在我的service.yml定义中)
我正在运行一个小型Kubernetes集群(使用kubeadm构建),以评估是否可以将Docker(旧)Swarm设置移动到k8s。我绝对需要的功能是能够将IP分配给容器,就像我对MacVlan所做的那样

在我当前的docker设置中,我使用MacVlan将公司网络中的IP地址分配给一些容器,这样我就可以直接访问(无需反向代理),就像访问任何物理服务器一样。我正在尝试用k8s实现类似的功能

我发现:

  • 我必须使用服务
  • 我不能使用LoadBalancer类型,因为它只适用于兼容的云提供商(如GCE或AWS)
  • 我应该用
  • 入口资源是某种反向代理吗
我的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(这是我公司的网络之一)。我的部署工作正常,因为我可以使用k8s集群的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获得svc
名称CLUSTER-IP EXTERNAL-IP端口年龄
kubernetes 10.96.0.1 443/TCP 6d
nginx服务10.102.64.83 A.B.C.D 80/TCP 23h

谢谢。

您可以尝试kube Keepalive vip配置来路由流量

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

如果这只是为了测试,那么试试看

kubectl port-forward service/nginx-service 80:80
那你可以

curl http://localhost:80

只需包括附加选项

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

我不知道这对您的特定情况是否有帮助,但我所做的(我在裸机集群上)是使用
LoadBalancer
并在您这样做时将
loadBalancerIP
以及
externalIPs
设置到我的服务器IP


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

一个可行的解决方案(不仅适用于测试,,尽管它也有缺点)是将Pod设置为映射主机网络,并将
主机网络
规范字段设置为
true

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

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

如果Pod仍然需要访问/解析内部Kubernetes主机名,则需要将
dnsPolicy
spec字段设置为
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

编辑:多亏了

你只需修补一个外部IP就可以了,我被放到这条轨道上

CMD:
$kubectl patch svc svc_name-p'{“spec”:{“externalIPs”:[“您的外部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
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
要将外部IP分配给前端服务,请运行此命令

 kubectl patch svc frontend -p '{"spec":{"externalIPs":["192.168.0.194"]}}'
现在获取命名空间服务以检查外部IPs分配:

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
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现在已分配。

您确定提到的外部IP路由到k8s群集节点吗?另外,当运行kubectl get service时,您会看到什么?您是否可以尝试不指定
type:ClusterIP
I added
kubectl get svc
output as EDIT。删除
type:ClusterIP
不会更改任何内容,因为它是默认值。如何检查流量是否到达我的群集?在
kube proxy
中,已为您的服务分配了外部IP。为什么不点击80端口的外部IP?我点击了,但它不工作。这就是重点。我的容器可以从集群内部访问,但不能从外部访问。这是我遇到的一个非常老的问题。但当时我无法使用LoadBalancer类型,因为它是一个裸机集群。另外,在本例中使用
--external ip=1.1.1.1
并不是最好的主意,因为此ip地址现在是Cloudflare的公共DNS。我使用
kubectl port forward--address 0.0.0.0 pod/6666:6666
将pod上的端口6666公开给外部世界
curl http://:6666
工作正常,但如果我尝试在浏览器中访问相同的链接,则会出现
无法访问此站点的错误。知道是什么导致了这个问题吗?@rakesh使用公共地址测试“端口转发”的最简单方法是,使用类似ngrok()的东西启动代理
kubectl-port-forward-po/myapp 8080:3000
Start-ngrok-proxy
ngrok-htp 8080
ngrok将提供两个公共URL(http/https)将请求路由到您机器的8080端口这是我需要的,您能用示例扩展答案吗?