我也试图在本地kubernetes安装上公开一个mysql服务器实例(1个主服务器和一个节点,都在oracle linux上),但是我无法访问该pod。
pod配置如下:
apiVersion: v1
kind: Pod
metadata:
name: mysql
labels:
name: mysql
spec:
containers:
- resources:
limits :
cpu: 1
image: docker.io/mariadb
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
value: 123456
ports:
- containerPort: 3306
name: mysql
服务文件:
apiVersion: v1
kind: Service
metadata:
labels:
name: mysql
name: mysql
spec:
type: NodePort
ports:
- port: 3306
targetPort: 3306
nodePort: 30306
selector:
name: mysql
我可以看到pod正在运行:
# kubectl get pod mysql
NAME READY STATUS RESTARTS AGE
mysql 1/1 Running 0 3d
服务连接到端点:
# kubectl describe service mysql
Name: mysql
Namespace: default
Labels: name=mysql
Selector: name=mysql
Type: NodePort
IP: 10.254.200.20
Port: <unset> 3306/TCP
NodePort: <unset> 30306/TCP
Endpoints: 11.0.14.2:3306
Session Affinity: None
No events.
我可以在netstat上看到kube-proxy正在端口30306上侦听所有传入连接。
tcp6 6 0 :::30306 :::* LISTEN 53039/kube-proxy
但不知怎的,即使在localhost上我也没有得到mysql的响应。
# telnet localhost 30306
Trying ::1...
Connected to localhost.
Escape character is '^]'.
正常的mysql安装响应以下内容:
$ telnet [REDACTED] 3306
Trying [REDACTED]...
Connected to [REDACTED].
Escape character is '^]'.
N
[REDACTED]-log�gw&TS(gS�X]G/Q,(#uIJwmysql_native_password^]
注意最后一行中的mysql部分。
最后一点是这个kubectl输出:
$ kubectl get service
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes 10.254.0.1 <none> 443/TCP 9d
mysql 10.254.200.20 nodes 3306/TCP 1h
但我不明白EXTERNAL-IP列中的“节点”是什么意思。
所以我想要发生的是通过主IP(最好)打开对mysql服务的访问。我该怎么做,我做错了什么?
答案 0 :(得分:1)
NodePort通过kube-proxy服务在集群中的每个节点上公开。要进行连接,请使用该主机的IP(Node01)连接到:
telnet [IpOfNode] 30306
答案 1 :(得分:1)
我还不确定如何让客户端连接到一个透明地将所有连接路由到minions的服务器。
- &GT;要做到这一点,你需要一个负载均衡器,遗憾的是它不是默认的Kubernetes构建集团。
您需要设置一个反向代理,将流量发送给minion,如nginx pod和使用hostPort: <port>
的服务,它将端口绑定到主机。这意味着pod需要保留在该节点上,为此,您可能希望使用使用节点名称作为选择器的DaemonSet
。
显然,这不是容错的,因此您可以设置多个反向代理并使用DNS循环解析将流量转发到其中一个代理窗格。
某个地方,在某些时候,你需要一个固定的IP来通过互联网与你的服务交谈,所以你需要确保在某个地方有一个静态的pod来处理它。