我的k8s集群部署了go服务,master节点在192.168.205.141,而go所引用的mysql服务在集群外部,地址是192.168.205.143: 5000 , 但现在的问题是集群内部署的goo应用pod无法访问外部的mysql服务,怎么解决?我的go应用部署yaml如下:
apiVersion: v1
kind: ConfigMap
metadata:
name: rbac-combined-config # ConfigMap 的名称,在 Deployment 中会引用这个名称
data:
app.yaml: |
server:
isRelease: false
port: 80
host: 0.0.0.0
domain: ""
mysql:
user: root
password: 1234
# ip: 192.168.205.143
ip: external-mysql-pod.default.svc.cluster.local
port: 5000
database: test
# model.conf:Casbin权限模型的配置文件
model.conf: |
[request_definition]
r = sub, obj, act # 请求定义:主体(subject)、资源(object)、操作(action)
[policy_definition]
p = sub, obj, act # 策略定义
[role_definition]
g = _, _ # 角色定义:用户角色关联
[policy_effect]
e = some(where (p.eft == allow)) # 策略效果:只要有一个策略允许就允许
[matchers]
m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act
# 匹配器:用户具有角色,且资源匹配,且操作匹配
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: rbac-app # Deployment 名称
spec:
replicas: 1 # Pod 副本数量,1表示只运行1个实例
selector:
matchLabels:
app: rbac-app # 选择器:选择带有 app=rbac-app 标签的 Pod
template:
metadata:
labels:
app: rbac-app # Pod 的标签,与上面的选择器匹配
spec:
containers:
- name: rbac-app # 容器名称
image: core.harbor.domain/library/rbac-admin:latest # 容器镜像地址
securityContext: # 安全上下文:设置容器权限
privileged: true # 容器具有特权,可以访问宿主机资源
ports:
- containerPort: 8080 # 容器内部监听的端口
env:
- name: GIN_MODE # Go Gin框架的运行模式
value: "release" # release=生产模式
volumeMounts: # 卷挂载:将外部存储挂载到容器内部/
- mountPath: /app/internal/config/files # 配置文件挂载路径
name: config-volume # 引用的卷名称
- mountPath: /app/logs # 日志目录挂载路径
name: logs-volume
- mountPath: /app/static/upload # 文件上传目录挂载路径
name: upload-volume
- mountPath: /etc/resolv.conf # DNS配置文件挂载路径d
name: resolv-conf
volumes: # 定义的卷列表
- name: config-volume # 配置卷
configMap:
name: rbac-combined-config # 使用上面定义的ConfigMap
- name: logs-volume # 日志卷
persistentVolumeClaim:
claimName: logs-pvc # 使用持久化存储声明
- name: upload-volume # 上传文件卷
persistentVolumeClaim:
claimName: upload-pvc
- name: resolv-conf # DNS配置卷
hostPath:
path: /etc/resolv.conf
---
# PersistentVolumeClaim (PVC):申请持久化存储
# PVC 向 Kubernetes 申请存储空间,由 StorageClass 动态提供
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: logs-pvc # PVC 名称
spec:
accessModes:
- ReadWriteMany # 访问模式:多节点读写
storageClassName: local-nfs-storage # 存储类名称(使用NFS存储)
resources:
requests:
storage: 1Gi # 申请1GB存储空间
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: upload-pvc # 上传文件存储声明
spec:
accessModes:
- ReadWriteMany
storageClassName: local-nfs-storage
resources:
requests:
storage: 1Gi
---
# Service:为应用程序提供网络访问
# Service 提供稳定的网络端点,即使Pod重启IP变化,Service地址不变
apiVersion: v1
kind: Service
metadata:
name: rbac-app # Service 名称
spec:
type: NodePort # Service 类型:NodePort 会在每个节点上开放端口
selector:
app: rbac-app # 选择器:将流量转发到带有 app=rbac-app 标签的Pod
ports:
- port: 80 # Service 端口(集群内部访问端口
targetPort: 8080 # 目标端口(Pod内部的实际端口)
nodePort: 30080 # NodePort(集群外部访问端口)
我根据网上的教材使用了Endpoints方法:如下:
---
apiVersion: v1
kind: Service
metadata:
name: external-mysql-pod
spec:
ports:
- port: 5000
clusterIP: None # 创建Headless Service
---
apiVersion: v1
kind: Endpoints
metadata:
name: external-mysql-pod
subsets:
- addresses:
- ip: 192.168.205.143
ports:
- port: 5000
但仍然报错:
[root@k8s-master01 go-app]# kubectl logs rbac-app-77684b58fc-zb298
🔧 配置文件: internal/config/files/app.yaml
panic: mysql 解析配置失败: dial tcp: lookup external-mysql-pod.default.svc.cluster.local: i/o timeout
goroutine 1 [running]:
rbac_admin/internal/dao/mdb.InitGorm()
/app/internal/dao/mdb/mysqlConnection.go:45 +0x2de
rbac_admin/internal/bootstrap.Initialize()
/app/internal/bootstrap/bootstrap.go:25 +0x1e
main.main()
/app/cmd/server/main.go:44 +0x34
我通过运行了一个busybox,测试网络连通性,如下:
[root@k8s-master01 go-app]# kubectl run -it --rm --image=core.harbor.domain/library/busybox test-dns -- sh
If you don't see a command prompt, try pressing enter.
/ # nslookup external-mysql-pod.default.svc.cluster.local
Server: 10.96.0.10
Address: 10.96.0.10:53
Name: external-mysql-pod.default.svc.cluster.local
Address: 192.168.205.143
/ # ping 192.168.205.143
PING 192.168.205.143 (192.168.205.143): 56 data bytes
^C
--- 192.168.205.143 ping statistics ---
6 packets transmitted, 0 packets received, 100% packet loss
/ # telnet 192.168.205.143 5000
我甚至在 Cilium 中“开放所有网络规则”,如下:
[root@k8s-master01 ~]# cat cilium.yaml
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: allow-all
spec:
description: "Allow all traffic, disabling network isolation."
endpointSelector: {} # 空的选择器匹配所有Pod
ingress:
- {} # 空的ingress规则允许所有入站流量
egress:
- {} # 空的egress规则允许所有出站流量
# 注意:enableDefaultDeny 字段在此策略下通常无需显式设置,因为策略本身已允许所有流量。
但也是仍然报错:panic: mysql 解析配置失败: dial tcp: lookup external-mysql-pod.default.svc.cluster.local: i/o timeout。所以帮我看看到底如何解决?是哪里出了问题?