我刚刚学习使用 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
使用端口转发时代码可以正常工作,但是使用主机时仍然无法工作
MariaDB 不使用 HTTP 协议,而
postman
和 browser
使用的是 HTTP 协议。 Ingress 只关心 http/https。因此,对于您的用例您很可能不需要入口。
有几种简单的方法可以解决这个问题。
如果您只是为了好玩/学习而使用它,一个快速的方法是使用
kubectl
使用端口转发,例如:
kubectl port-forward service/toto-mariadb-service 3306:3306
然后您可以使用像 MariaDB Client 这样的应用程序/客户端通过端口
localhost
处的 3306
访问数据库。您还可以使用 /etc/hosts
创建
127.0.0.1 <your-desired-hostname>
条目
如果您希望有一个易于长期连接的端口,这是一个更好的方法。您需要将
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
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/