36

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

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

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

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

我发现:

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

我的 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

谢谢。

4

8 回答 8

33

首先运行这个命令:

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。

于 2019-08-08T06:01:07.227 回答
23

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

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

那么你也能

curl http://localhost:80
于 2019-01-10T06:04:28.223 回答
6

您可以只修补外部 IP

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

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

于 2019-06-04T06:46:36.203 回答
6

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

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

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

如果您的 Pod 仍需要访问/解析内部 Kubernetes 主机名,您需要将dnsPolicyspec 字段设置为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 文档,我被放到了这条轨道上

于 2019-04-17T21:22:56.967 回答
1

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

于 2017-06-13T15:44:53.610 回答
0

我不知道这对您的特定情况是否有帮助,但我所做的(而且我在裸机集群上)是像您一样使用并LoadBalancer设置我的服务器 IP。loadBalancerIPexternalIPs

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

于 2019-03-13T13:08:25.373 回答
0

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

于 2017-06-15T19:04:45.340 回答
-1

只需包括附加选项。

kubectl expose deployment hello-world --type=LoadBalancer --name=my-service --external-ip=1.1.1.1
于 2019-02-21T15:47:40.050 回答