【问题标题】:How to explicitely define an Endpoint of an Kubernetes Service如何显式定义 Kubernetes 服务的端点
【发布时间】:2020-10-21 20:33:31
【问题描述】:

我已经通过 kubespray 在我自己的几个虚拟机上配置了一个 kubernetes 集群。 Kubespray 使用 project-calico 作为默认网络插件,非常适合我在集群网络中代理服务到外部世界的需求。

Kubespray 将 apiserver 本身部署为 ClusterIP 服务。为了使它可以从外部访问,它使用主节点主机 IP 地址定义了此服务的端点,据我所知,Calico 将其路由到内部 ClusterIP。

我的问题是:如何定义我自己的端点(用于另一个服务),因为这些已经通过配置 service.yaml 隐式定义并且不能被覆盖。我想采用类似的方法让我的 Rook/Ceph Dashboard 从集群外部可见。

编辑:请注意 kubectl get ingresses.networking.k8s.io --all-namespaces 返回 No resources found.kubectl describe service kubernete 返回

Name:              kubernetes
Namespace:         default
Labels:            component=apiserver
                   provider=kubernetes
Annotations:       <none>
Selector:          <none>
Type:              ClusterIP
IP:                10.233.0.1
Port:              https  443/TCP
TargetPort:        6443/TCP
Endpoints:         192.168.103.254:6443
Session Affinity:  None
Events:            <none>

【问题讨论】:

  • 这更多的是与入口控制器和入口有关。为了使您的服务与自定义端点一起使用以使外部服务访问在 kubernetes 集群中运行的服务,您需要将入口附加到您的服务。有关详细信息,请参阅此文档Ingress
  • @BinaryBullet 是的,我已经阅读了很多关于入口的信息,这是负载平衡等的正确方法......我只是想知道在一个新的 kubesprayed 集群中实际上没有定义入口...它仅适用于通过 calico 路由到 ClusterIP 服务的主主机 IP 上的端点,我想知道如何定义类似的设置
  • 如果你不想使用 ingress 并且想通过 master 主机 ip 接,你可以直接使用代理服务器或服务(haproxy、nginx 等)将流量从外部 url 路由到直接的特定主机IP。我完全不确定这是否是你要找的。如果我对此有误,请随时纠正我。正如您已经阅读了有关入口的内容,它在进行所有流量路由和管理方面具有优势。希望这会有所帮助。
  • @BinaryBullet 这也不是我要问的,因为即使有 HAProxy,这也不能解决将节点外部 IP 路由到集群内部网络 IP 的部分。 Ingress 解决了这个问题,似乎 kubespray 使用了另一种方法,通过在主机 IP 上显式定义端点将 apiserver 路由到外部。我想知道这个定义是怎么做的。

标签: kubernetes kubernetes-service project-calico kubespray


【解决方案1】:

我会参考你的问题:

如何定义我自己的端点?

你必须:

1 ) 创建一个没有 Pod 选择器的服务:

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 9376

(此时,K8S 不会创建自动生成的 Endpoints,因为它无法决定这些 Endpoints 应该引用哪些 Pod)。

2 ) 创建一个Endpoints 对象并将其映射到运行外部资源的所需网络地址和端口:

apiVersion: v1
kind: Endpoints
metadata:
  name: my-service
subsets:
  - addresses:
      - ip: 192.0.2.45
    ports:
      - port: 9376

(*) 请注意,服务名称和 Endpoints 对象的名称应该匹配。

【讨论】:

【解决方案2】:

我不完全确定您的意思,但我认为您正在寻找的是能够在外部公开服务的能力。

您可以使用“发布服务”(将内部服务公开到外部的服务类型)公开您的服务,例如 Rook/Ceph Dashboard。

引用自 kubernetes 文档:

对于应用程序的某些部分(例如前端),您可以 想要将服务公开到外部 IP 地址上,即在外部 您的集群。

KubernetesServiceTypes允许你指定什么样的Service 你要。默认为ClusterIP

Type 值及其行为是:

  • ClusterIP:在集群内部 IP 上公开服务。选择此值使服务只能从 簇。这是默认的ServiceType
  • NodePort: 在每个节点的 IP 上的静态端口( NodePort)。 ClusterIP 服务,NodePort 服务路线,是自动创建的。您将可以联系 NodePort 服务,来自集群外部,通过请求 &lt;NodeIP&gt;:&lt;NodePort&gt;
  • LoadBalancer: 使用云提供商的负载均衡器在外部公开服务。 NodePortClusterIP 服务,外部负载 平衡器路由是自动创建的。
  • ExternalName: 将服务映射到 externalName 字段的内容(例如 foo.bar.example.com),通过返回带有其值的 CNAME 记录。未设置任何类型的代理。

这是来自文档的example


您还可以使用 yaml 清单定义 Services,如下所示:

apiVersion: v1
kind: Service
metadata:
  name: examplelb
spec:
  type: LoadBalancer
  selector:
    app: asd
  ports:
    -
      name: koala
      port: 22223
      targetPort: 22225
      nodePort: 31913
    -
      name: grisly
      port: 22224
      targetPort: 22226
      nodePort: 31914
    -
      name: polar
      port: 22225
      targetPort: 22227
      nodePort: 31915

这使得带有标签的 pod:app: asd 具有以下端口以模式暴露 内部端口22223 暴露在31913

$ kubectl get svc examplelb
NAME        TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)                                           AGE
examplelb   LoadBalancer   10.111.8.204   <pending>     22223:31913/TCP,22224:31914/TCP,22225:31915/TCP   7d2h

如果LoadBalancer 类型的服务有外部IP 待处理,您仍然可以使用NodePort 访问每个节点上的所有这些端口。

希望这会有所帮助。

【讨论】:

  • 是的,我知道....在问题中查看我的编辑...我特别查询,因为 kubernetes API 部署为“ClusterIP”服务...根据文档,这些应该仅在集群内可见。尽管如此,我还是可以从局外人那里访问我的 apiserver,因为有某种“印花布黑客”可以让男性这样做。我对这个 hack 的工作原理很感兴趣。
猜你喜欢
  • 1970-01-01
  • 2021-11-24
  • 1970-01-01
  • 1970-01-01
  • 2019-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多