在多节点设置中如何从外部访问Kubernetes服务

67次阅读
没有评论

问题描述

在使用Kubernetes时,遇到了在多节点设置中如何从外部访问和暴露服务的问题。他之前只在单节点的microk8s上进行了一些实验(具有公共IP的单节点集群)。在单节点集群中,外部访问很简单,因为只有一个可以连接的IP地址。现在他正在尝试使用K3S来管理多个节点的集群。

他最初的猜测是,集群可以通过主节点访问,所以任何连接到主节点6443端口的请求都会根据ingress中定义的URL和路径前缀路由到工作节点。这样做起来很简单,只需要创建一个负载均衡器,将流量转发到主节点的6443端口即可。

然而,事实远非如此。主节点似乎只用于存储集群数据,并通过6443端口允许访问集群的kubectl接口。

在他的K3S集群中,有3个主节点和3个工作节点,运行在AWS的私有网络上(6个EC2实例)。如果他在集群上部署一个应用并使用ingress暴露它,除非为每个部署的服务手动创建一个AWS负载均衡器转发规则,否则无法从外部访问它。这对他来说似乎相当违反直觉,因为他已经在ingress中定义了路由规则。

他不想使用EKS。他想要设置的集群应该可以在本地和云提供的虚拟机中使用。当他有多个节点上运行应用的pod时,如何使用一个IP地址在网络上暴露服务?

以下是一个示例部署:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: httpbin
  labels:
    app: httpbin
spec:
  rules:
    - http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: httpbin
                port:
                  number: 8000
---
apiVersion: v1
kind: Service
metadata:
  name: httpbin
  labels:
    app: httpbin
spec:
  ports:
    - name: http
      port: 8000
      targetPort: 80
  selector:
    app: httpbin
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: httpbin
  labels:
    app: httpbin
spec:
  replicas: 3
  selector:
    matchLabels:
      app: httpbin
      version: v1
  template:
    metadata:
      labels:
        app: httpbin
        version: v1
    spec:
      containers:
        - image: docker.io/kennethreitz/httpbin
          imagePullPolicy: Always
          name: httpbin
          ports:
            - containerPort: 80

该应用程序在端口8000上暴露,但我推测连接到应用程序所需的IP地址是3个工作节点IP地址之一。我不想指定一个特定的节点来连接应用程序。这实际上与拥有多节点集群的整个目的相矛盾。

如何在多节点集群中使用单个IP作为入口点暴露和访问应用程序?

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

一种解决方法是将您的DNS配置为解析到工作节点的地址。您可以在集群中指定一些节点来托管基础设施组件/ingress控制器,并在这些节点前面添加一个负载均衡器层,并将您的DNS指向那里。如果您真的想要一个单一的IP地址来暴露所有内容,您还可以在这些负载均衡器上引入一些keepalived。

方案2

另一种方法是使用Ingress Controller来管理外部访问。Ingress Controller是一个负责将外部请求路由到集群内部服务的组件。您可以使用一些常见的Ingress Controller,如Nginx Ingress Controller或Traefik。这些Ingress Controller可以通过配置Ingress资源来定义路由规则,并将外部请求转发到相应的服务。

以下是使用Nginx Ingress Controller的示例步骤:
1. 安装Nginx Ingress Controller。您可以使用Helm来安装它:
bash
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm install my-nginx ingress-nginx/ingress-nginx

2. 创建一个Ingress资源来定义路由规则。在您的Kubernetes配置文件中添加以下内容:
yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
rules:
- host: your-domain.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: your-service
port:
number: 8000

在上面的示例中,我们定义了一个Ingress资源,将your-domain.com的所有请求路由到名为your-service的服务的端口8000上。
3. 应用Ingress资源:
bash
kubectl apply -f your-ingress.yaml

这将创建一个Ingress资源,并将其应用到集群中。

请注意,这只是一个示例,您可以根据您的需求和环境进行相应的配置。

方案3

如果您希望使用单个IP地址来访问多个服务,您可以考虑使用一个反向代理服务器,如Nginx或HAProxy。您可以在这个反向代理服务器上配置虚拟主机和路由规则,将外部请求转发到相应的服务。

以下是使用Nginx作为反向代理服务器的示例步骤:
1. 安装Nginx。您可以使用适合您的操作系统的包管理器来安装它。
2. 配置Nginx。在Nginx的配置文件中添加以下内容:
“`
server {
listen 80;
server_name your-domain.com;

   location / {
       proxy_pass http://your-service:8000;
   }

}
在上面的示例中,我们配置了一个虚拟主机,将`your-domain.com`的所有请求转发到名为`your-service`的服务的端口8000上。
3. 重新加载Nginx配置:
bash
nginx -s reload
“`
这将重新加载Nginx的配置文件。

请注意,这只是一个示例,您可以根据您的需求和环境进行相应的配置。

以上是几种在多节点集群中使用单个IP地址暴露和访问应用程序的解决方案。您可以根据您的需求选择适合您的解决方案。

正文完