在本地安装时启用对kubernetes pod的远程访问

时间:2016-06-16 14:29:39

标签: kubernetes

我也试图在本地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服务的访问。我该怎么做,我做错了什么?

2 个答案:

答案 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来处理它。