0

我正在为一个学校项目构建一个 K8 集群。它是裸机并使用 metallb 作为负载平衡器。每个服务都在一个单独的 pod 中工作:

  • Nginx
  • WordPress
  • phpmyadmin
  • mysql (mariadb)

在 phpmyadmin 文件中,我需要将我的 mysql 服务器与以下内容链接:

$cfg['Servers'][$i]['host'] = "mysql-server-name";

我尝试使用节点的 IP:

kubectl get node -o=custom-columns='DATA:status.addresses[0].address' | sed -n 2p

添加端口:3306,但我意识到使用此方法无法通过浏览器访问我的任何服务。例如,节点的 Ip:5050 应该将我重定向到我的 wordpress,但它没有。有什么方法可以让我使用一个 IP 来让我的 pod 在它们之间进行通信?我必须补充一点,当我使用 svc IP 而不是节点时,每个服务都可以正常工作。

这是我用于 metallb 的配置图:

kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - 192.168.99.100-192.168.99.200
4

1 回答 1

1

节点 IP 不会将您的应用程序暴露给其他应用程序的原因是 kubernetes 集群中的 pod 默认情况下不会监听到节点的请求。也就是说,pod 上的端口并没有连接到节点上的端口。
service资源是您建立这种联系所需要的。
服务有不同的类型。类型的服务cluster IP会将集群内部的 IP 分配给应用程序。如果您不想直接从 Internet 访问您的 mysql 数据库,这就是您想要的。
这是您项目的集群 IP 类型的示例服务。

apiVersion: v1
kind: Service
metadata:
  name: mysql-service
  namespace: metallb-system
spec:
  selector:
    app: Mysql
  ports:
    - protocol: TCP
      port: 80
      targetPort: 3306

Selector选择带有标签的 pod app=mysql
Port是服务将侦听的端口。
TargetPort是mysql正在监听的端口。
创建服务时,您可以通过运行此命令找到它的 IP

kubectl get services -n metallb-system

在 CLUSTER-IP 列下,记下您创建的服务的 IP。
因此,在这种情况下,如果 mysql 正在侦听 3306,您可以通过端口 80 上的服务 IP 上的此服务访问它。
如果您想将您的 wordpress 应用程序公开到互联网,请使用NodePortorLoadBalancer服务类型。是服务类型的参考。

于 2021-02-12T22:07:18.350 回答