web-services - 无法通过 Web 浏览器通过外部 IP 连接到 Kubernetes 服务
问题描述
我将 minikube 用于 Kubernetes、Docker 和 VirtualBox 用于我的应用程序。
我为 MySQL 数据库和 phpmyadmin 创建了几个服务+部署。它们都是绿色的,表示没有问题:
但是,当我单击 phpmyadmin-service 的外部端点时,我的浏览器拒绝连接:
这是我的 metallb 配置和minikube ip
输出,以防万一:
我的服务和部署的 yaml 清单文件确实包含正确的端口:
apiVersion: v1
kind: Service
metadata:
name: phpmyadmin-service
labels:
app: phpmyadmin
annotations:
metallb.universe.tf/allow-shared-ip: shared
spec:
type: LoadBalancer
ports:
- port: 5000
targetPort: 5000
selector:
app: phpmyadmin
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: phpmyadmin-deployment
labels:
app: phpmyadmin
spec:
selector:
matchLabels:
app: phpmyadmin
replicas: 1
template:
metadata:
labels:
app: phpmyadmin
spec:
restartPolicy: Always
containers:
- name: phpmyadmin
image: phpmyadmin
imagePullPolicy: Never
ports:
- containerPort: 5000
知道有什么问题吗?
UPD:输出kubectl get svc
:
c1r10s2% kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2m54s
mysql-service ClusterIP 10.109.243.20 <none> 3306/TCP 73s
phpmyadmin-service LoadBalancer 10.103.233.51 192.168.99.100 5000:30348/TCP 73s
输出kubect describe svc
:
c1r10s2% kubectl describe svc
Name: kubernetes
Namespace: default
Labels: component=apiserver
provider=kubernetes
Annotations: <none>
Selector: <none>
Type: ClusterIP
IP Families: <none>
IP: 10.96.0.1
IPs: 10.96.0.1
Port: https 443/TCP
TargetPort: 8443/TCP
Endpoints: 192.168.99.100:8443
Session Affinity: None
Events: <none>
Name: mysql-service
Namespace: default
Labels: app=mysql
Annotations: <none>
Selector: app=mysql
Type: ClusterIP
IP Families: <none>
IP: 10.109.243.20
IPs: 10.109.243.20
Port: <unset> 3306/TCP
TargetPort: 3306/TCP
Endpoints: 172.17.0.8:3306
Session Affinity: None
Events: <none>
Name: phpmyadmin-service
Namespace: default
Labels: app=phpmyadmin
Annotations: metallb.universe.tf/allow-shared-ip: shared
Selector: app=phpmyadmin
Type: LoadBalancer
IP Families: <none>
IP: 10.103.233.51
IPs: 10.103.233.51
LoadBalancer Ingress: 192.168.99.100
Port: <unset> 5000/TCP
TargetPort: 5000/TCP
NodePort: <unset> 30348/TCP
Endpoints: 172.17.0.2:5000
Session Affinity: None
External Traffic Policy: Cluster
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal IPAllocated 2m1s metallb-controller Assigned IP "192.168.99.100"
Normal nodeAssigned 119s metallb-speaker announcing from node "minikube"
解决方案
我看到你正在使用 MetalLB。问题是,可能没有规则来管理与负载均衡器端点的连接。您可以检查的一些事项:
- 您的集群是否启用了内部路由?通过在 BGP 中使用 MetalLB,您将需要重新分配路由(一个 BGP 网关,以便可以学习 10.130.xx 网络和 192.168.xx 网络之间的路由)
- 如果您在第 2 层运行,则需要在您的 kubelet 服务中启用 StrictARP(如果您使用 Calico 进行集群网络,也希望在 BGP 模式下启用。原因很复杂,但您可以调查)
- 使用 IPVS 而不是 Iptables。MetalLB 需要 IPVS
- PhpMyadmin 还需要环境变量才能访问 mysql。因此,您需要在部署中传递 PMA_HOST 和 PMA_PORT 以及密码环境。类似于以下内容:
apiVersion: apps/v1
kind: Deployment
metadata:
name: phpmyadmin-deployment
labels:
app: phpmyadmin
spec:
selector:
matchLabels:
app: phpmyadmin
replicas: 1
template:
metadata:
labels:
app: phpmyadmin
spec:
restartPolicy: Always
containers:
- name: phpmyadmin
image: phpmyadmin
imagePullPolicy: Never
ports:
- containerPort: 5000
env:
- name: PMA_HOST
value: mysql-service # this is a reference to the mysql service
- name: PMA_PORT
value: "3306"
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret # This is your mysql secret from the file example below
key: mysql-root-password
您需要先前在您的 mysql 部署的机密文件中启用机密,您可以在其中提供加密凭据。
apiVersion: v1
kind: Secret
metadata:
name: mysql-secret
namespace: namespace
labels:
app: mysql-service # the label of your mysql deployment
type: Opaque
data:
mysql-root-password: # base64 encoded passwords here
mysql-password:
推荐阅读
- dart - 如何使用 Dart 将文档字段存储在列表中
- c++ - 如何在我的实际类中访问另一个类的对象的实例?
- macos - 适用于 MacOS 的 RefreshEnv
- java - 从 spring-boot 应用程序到 JBoss EAP6 HornetQ 主题的 JMS 连接失败
- r - purrr 在 map 中使用未嵌套的值来过滤数据
- angular - Angular 5 - 使用 ng build 和 uglify 和 minify 进行开发/QA 构建(如 ng build --prod)
- react-native - 更多图标没有被点击
- javascript - 将标签控件传递给 JavaScript 并设置其值
- python - 为 Python 的 Cmd 类输入流使用协程
- javascript - 无法弄清楚如何正确格式化异步函数,以便脚本暂停,等待返回调用