ingress mariadb 总是返回 This site can't bereached

问题描述 投票:0回答:2

我刚刚学习使用 ingress 和 MariaDB 的 Kubernetes。我不知道哪一个导致我的代码错误并返回“无法访问此网站”。需求包括Services、ConfigMap和Secret。确保它被 Ingress 公开(在 /etc/hosts 中创建一个简单的本地 DNS)并且可以被 Postman / Web 浏览器访问(不要端口转发)。所有 CRUD 功能(文章)必须包含在视频演示中。

apiVersion: v1
kind: PersistentVolume
metadata:
  name: toto-mariadb-volume
spec:
  accessModes:
    - ReadWriteOnce
  capacity:
    storage: 5Gi
  hostPath:
    path: /data

---

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: toto-mariadb-volume-claim
spec:
  accessModes:
    - ReadWriteOnce
  volumeMode: Filesystem
  resources:
    requests:
      storage: 1Gi

---

apiVersion: v1
kind: Secret
metadata:
  name: toto-mariadb-secret
stringData:
  MYSQL_DATABASE: toto
  MYSQL_PASSWORD: password
  MYSQL_ROOT_PASSWORD: P@ssw0rd
  MYSQL_USER: toto_user
data:
  toto_VERY_SECRET: "a3ViZXJuZXRlcwo="

---
apiVersion: v1
kind: ConfigMap
metadata:
  name: toto-mariadb-config
data:
  APP_NAME: "toto-mariadb"
  APP_PORT: "3306"

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: toto-mariadb
  labels:
    app: toto-mariadb
spec:
  replicas: 1
  selector:
    matchLabels:
      app: toto-mariadb
  template:
    metadata:
      name: toto-mariadb
      labels:
        app: toto-mariadb
    spec:
      containers:
        - name: toto-mariadb
          image: mariadb
          resources:
            limits:
              memory: "1Gi"
              cpu: "500m"
          ports:
            - containerPort: 3306
              protocol: TCP
          envFrom:
            - secretRef:
                name: toto-mariadb-secret
            - configMapRef:
                name: toto-mariadb-config

---
apiVersion: v1
kind: Service
metadata:
  name: toto-mariadb-service
spec:
  selector:
    name: toto-mariadb
  ports:
    - port: 3306
      targetPort: 3306
      protocol: TCP

---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: toto-mariadb-ingress
  labels:
    app: toto-mariadb-ingress
spec:
  rules:
  - host: toto-mariadb.lovanto.local
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: toto-mariadb-service
            port: 
              number: 3306

使用端口转发时代码可以正常工作,但是使用主机时仍然无法工作

kubernetes kubernetes-ingress
2个回答
0
投票

MariaDB 不使用 HTTP 协议,而

postman
browser
使用的是 HTTP 协议。 Ingress 只关心 http/https。因此,对于您的用例您很可能不需要入口

有几种简单的方法可以解决这个问题。

kubectl 端口转发 ...


如果您只是为了好玩/学习而使用它,一个快速的方法是使用

kubectl
使用端口转发,例如:

kubectl port-forward service/toto-mariadb-service 3306:3306

然后您可以使用像 MariaDB Client 这样的应用程序/客户端通过端口

localhost
处的
3306
访问数据库。您还可以使用
/etc/hosts
 创建 
127.0.0.1 <your-desired-hostname>

条目

了解更多相关信息:https://kubernetes.io/docs/tasks/access-application-cluster/port-forward-access-application-cluster/#forward-a-local-port-to-a-port-在吊舱上

服务类型:LoadBalancer


如果您希望有一个易于长期连接的端口,这是一个更好的方法。您需要将

type: LoadBalancer
添加到您的服务规范中(例如见下文)。

默认情况下,如果从服务的规范字段中省略

type:
,它将默认为
type: ClusterIP
,它将仅分配
serviceCidr
范围内的 IP,该范围无法从集群外部访问。

此方法的潜在问题是,如果您的集群未配置为在您

external ip
时为您提供
kubectl get svc ...
,则外部 ip 列将停留在待处理状态。如果您遇到这种情况,您需要了解哪些方法适合您的 K8s 风格。常见的方法是使用 metalb

apiVersion: v1
kind: Service
metadata:
  name: toto-mariadb-service
spec:
  selector:
    name: toto-mariadb
  ports:
    - port: 3306
      targetPort: 3306
      protocol: TCP
  type: LoadBalancer

然后您将使用您的应用程序/客户端与该服务的

external ip
进行对话。使用
kubectl get svc ...

从您的服务获取此 IP

了解更多相关信息:https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer


0
投票

Ingress 仅限 HTTP。大多数(如果不是全部)数据库,包括 MariaDB,都不使用 http 作为协议。

来自文档

Ingress 不会公开任意端口或协议。将 HTTP 和 HTTPS 之外的服务公开到互联网通常使用 Service.Type=NodePort 或 Service.Type=LoadBalancer 类型的服务。

如果您的入口控制器支持,您可以将其公开为 TCP 服务。例如,请参阅:https://kubernetes.github.io/ingress-nginx/user-guide/exusing-tcp-udp-services/

© www.soinside.com 2019 - 2024. All rights reserved.