POD 无法使用 minikube 访问互联网

POD don't have access to internet with minikube

我有一个 python 应用程序使用 Slack API 通过 slackclient 库。我在 docker 图像上工作正常。但后来我创建了一个到 Kubernetes 的部署,并在 Minikube 上声明了该应用程序。它只是无法连接到互联网以获取 Slack 消息。

我没有使用任何 K8S 服务,因为我不需要从我的服务中公开任何内容,只需调用已经在互联网上公开的 Slack 服务。

我需要做什么才能启用该连接?

更新 1(出现异常):

10/03/2019 19:44:50 Starting new HTTPS connection (1): slack.com:443
10/03/2019 19:44:51 https://slack.com:443 "POST /api/rtm.start HTTP/1.1" 200 8581
Traceback (most recent call last):
  File "app.py", line 162, in <module>
    request, channel, ts, user = parse_slack_output(slack_client.rtm_read())
  File "/usr/local/lib/python3.6/site-packages/slackclient/client.py", line 128, in rtm_read
    json_data = self.server.websocket_safe_read()
  File "/usr/local/lib/python3.6/site-packages/slackclient/server.py", line 186, in websocket_safe_read
    data += "{0}\n".format(self.websocket.recv())
  File "/usr/local/lib/python3.6/site-packages/websocket/_core.py", line 313, in recv
    opcode, data = self.recv_data()
  File "/usr/local/lib/python3.6/site-packages/websocket/_core.py", line 330, in recv_data
    opcode, frame = self.recv_data_frame(control_frame)
  File "/usr/local/lib/python3.6/site-packages/websocket/_core.py", line 343, in recv_data_frame
    frame = self.recv_frame()
  File "/usr/local/lib/python3.6/site-packages/websocket/_core.py", line 377, in recv_frame
    return self.frame_buffer.recv_frame()
  File "/usr/local/lib/python3.6/site-packages/websocket/_abnf.py", line 361, in recv_frame
    self.recv_header()
  File "/usr/local/lib/python3.6/site-packages/websocket/_abnf.py", line 309, in recv_header
    header = self.recv_strict(2)
  File "/usr/local/lib/python3.6/site-packages/websocket/_abnf.py", line 396, in recv_strict
    bytes_ = self.recv(min(16384, shortage))
  File "/usr/local/lib/python3.6/site-packages/websocket/_core.py", line 452, in _recv
    return recv(self.sock, bufsize)
  File "/usr/local/lib/python3.6/site-packages/websocket/_socket.py", line 112, in recv
    "Connection is already closed.")
websocket._exceptions.WebSocketConnectionClosedException: Connection is already closed.

在app.py

中调用函数slack_client.rtm_read()时出现问题
SLACK_BOT_TOKEN = environ.get('SLACK_BOT_TOKEN')
slack_client = SlackClient(SLACK_BOT_TOKEN)

def parse_slack_output(event_list):
    """
        The Slack Real Time Messaging API is an events firehose.
        this parsing function returns None unless a message is
        directed at the Bot, based on its ID.
    """
    if len(event_list) > 0:
        for event in event_list:
            if is_for_me(event):
                return event['text'], \
                       event['channel'], \
                       event['ts'], \
                       event['user']
    return None, None, None, None
if __name__ == '__main__':
    READ_WEBSOCKET_DELAY = 1 # 1 second delay between reading from firehose
    if slack_client.rtm_connect():
        while True:
            request, channel, ts, user = parse_slack_output(slack_client.rtm_read())

您在请求 API 时遇到的错误或异常是什么? 是 DNS 解析问题吗?

如果是DNS解析问题。 然后检查您的 kubernetes 集群上的 KubeDNS 或 CoreDNS 是否为 运行。 如果上面指定的是 运行 然后尝试从您的 pod ping 主机。

编辑 1:

看起来套接字连接在从服务器读取时正在关闭。 尝试在调用 rtm_connect 函数时传递 auto_reconnect 参数。

slack_client.rtm_connect(auto_reconnect = True)

我使用 slackclient 创建了一个开源项目,其中对 Minikube 中工作的 Slack 机器人进行了所有调整: https://github.com/staticdev/k8s-python-slackbot