如何显式定义 Kubernetes 服务的端点

Jür*_*nig 5 calico kubernetes kubernetes-service kubespray

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

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

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

编辑:请注意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>
Run Code Online (Sandbox Code Playgroud)

Rtm*_*tmY 11

我参考一下你的问题:

如何定义我自己的端点?

你必须:

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

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 9376
Run Code Online (Sandbox Code Playgroud)

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

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

apiVersion: v1
kind: Endpoints
metadata:
  name: my-service
subsets:
  - addresses:
      - ip: 192.0.2.45
    ports:
      - port: 9376
Run Code Online (Sandbox Code Playgroud)

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


Pio*_*lec 1

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

\n\n

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

\n\n

正如kubernetes文档中引用的:

\n\n
\n

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

\n\n

Kubernetes ServiceTypes 允许您指定您想要的服务类型。默认为 ClusterIP.

\n\n

Type 价值观及其行为是:

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

这是文档中的示例

\n\n
\n\n

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

\n\n
apiVersion: v1\nkind: Service\nmetadata:\n  name: examplelb\nspec:\n  type: LoadBalancer\n  selector:\n    app: asd\n  ports:\n    -\n      name: koala\n      port: 22223\n      targetPort: 22225\n      nodePort: 31913\n    -\n      name: grisly\n      port: 22224\n      targetPort: 22226\n      nodePort: 31914\n    -\n      name: polar\n      port: 22225\n      targetPort: 22227\n      nodePort: 31915\n
Run Code Online (Sandbox Code Playgroud)\n\n

这使得带有标签的 Pod:app: asd具有以下暴露的端口,并22223在 上暴露了模式\n内部端口31913

\n\n
$ kubectl get svc examplelb\nNAME        TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)                                           AGE\nexamplelb   LoadBalancer   10.111.8.204   <pending>     22223:31913/TCP,22224:31914/TCP,22225:31915/TCP   7d2h\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果类型的服务LoadBalancer有外部 IP 挂起,您仍然可以作为 访问每个节点上的所有这些端口NodePort

\n\n

希望这可以帮助。

\n