2

我已经通过 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>
4

2 回答 2

2

我会参考你的问题:

如何定义我自己的端点?

你必须:

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 对象的名称应该匹配。

于 2020-10-21T12:33:31.317 回答
1

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

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

正如Kubernetes文档所引用的:

对于应用程序的某些部分(例如前端),您可能希望将服务公开到外部 IP 地址上,该地址位于集群外部。

Kubernetes ServiceTypes 允许你指定你想要什么样的服务。默认值为 ClusterIP.

Type 价值观和他们的行为是:

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

这是文档中的一个示例


您还可以Services像这样定义带有 yaml 的清单:

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有 External-IP 挂起,您仍然可以访问每个节点上的所有这些端口作为NodePort.

希望这可以帮助。

于 2019-12-19T17:26:53.410 回答