我正在学习使用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/https有关。所以对于您的用例,您很可能不需要入口.
有几个简单的方法来处理这个问题。
kubectl port-forward…
如果你只是使用这个乐趣/学习一个快速的方法是使用端口转发使用kubectl
例如:
kubectl port-forward service/toto-mariadb-service 3306:3306
然后你会使用一个应用程序/客户端,如MariaDB客户端访问数据库使用localhost
端口3306
。您还可以使用127.0.0.1 <your-desired-hostname>
/etc/hosts
条目详细阅读:https://kubernetes.io/docs/tasks/access-application-cluster/port-forward-access-application-cluster/#forward-a-local-port-to-a-port-on-the-pod
服务类型:LoadBalancer
这是一个更好的方法,如果你想有一个端口容易获得长期连接。您需要将type: LoadBalancer
添加到您的服务规范中(参见下面的示例)。
默认情况下,如果type:
从服务的spec字段中省略,它将默认为type: ClusterIP
,这将只分配serviceCidr
范围内的ip,这是不能从集群外访问的。
这种方法的潜在问题是,如果集群没有配置为在kubectl get svc ...
时为您提供external ip
,则外部ip列将停留在pending状态。如果这种情况发生在你身上,你需要看看哪些方法适合你的k8口味。常用的方法是使用metallb
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
入口仅为HTTP。大多数数据库,包括MariaDB,都不使用http作为协议。
From the docs:
Ingress不公开任意端口或协议。向internet公开HTTP和HTTPS以外的服务通常使用service类型的服务。Type=NodePort or Service.Type=LoadBalancer.
如果您的入口控制器支持它,您可以将其公开为TCP服务。例如:https://kubernetes.github.io/ingress-nginx/user-guide/exposing-tcp-udp-services/