docker 容器(在 EC2 实例上)内的微服务 运行 未到达 AWS ALB
Microservice running inside docker container(on EC2 instance) is not reaching AWS ALB
我正在尝试在微服务前面添加 AWS 应用程序负载均衡器(运行 在 VPC 和 public 子网内的 EC2 节点上)。这些是 运行 在 docker 容器内。我注意到,如果微服务直接在 EC2 实例上 运行。它能够与 ALB 通信。在 docker 容器内启动微服务时。它不与 ALB 通信。
我可以用 curl 重现:
1) 直接在 EC2 实例上点击 curl - 工作
$ curl http://vpc-elb-url/alive
响应:
ok
2) 从 docker 容器内部点击 curl - 不工作
$ docker run --rm byrnedo/alpine-curl http://vpc-elb-url/alive
响应:
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 1120 100 1120 0 0 65882 0 --:--:-- --:--:-- --:--:-- 65882
<!DOCTYPE html>
<html lang="en">
<head>
<title>Not Found</title>
<style>
html, body, pre {
margin: 0;
padding: 0;
font-family: Monaco, 'Lucida Console', monospace;
background: #ECECEC;
}
h1 {
margin: 0;
background: #AD632A;
padding: 20px 45px;
color: #fff;
text-shadow: 1px 1px 1px rgba(0,0,0,.3);
border-bottom: 1px solid #9F5805;
font-size: 28px;
}
p#detail {
margin: 0;
padding: 15px 45px;
background: #F6A960;
border-top: 4px solid #D29052;
color: #733512;
text-shadow: 1px 1px 1px rgba(255,255,255,.3);
font-size: 14px;
border-bottom: 1px solid #BA7F5B;
}
</style>
</head>
<body>
<h1>Not Found</h1>
<p id="detail">
For request 'GET /alive'
</p>
</body>
</html>
如有任何帮助,我们将不胜感激。谢谢。
问题是容器没有与 EC2 实例共享同一个 AIM 角色
有一个名为 IAM-docker 的项目与容器共享主机 IAM 角色(您可以在 repo 中了解它的工作原理)
此外,它还允许您管理哪些容器将获得哪些访问权限
我认为这不是一个有效的问题。我正在回答这个问题,也许它会对其他人有所帮助。如果有人犯同样的错误:(
我们使用以下命令将所有流量从 80 路由到 9000:
$ sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 9000
因为这个 ALB 变得不可访问了。我们只是使用以下命令删除了此规则
sudo iptables -t nat -D PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 9000
一切正常!
我正在尝试在微服务前面添加 AWS 应用程序负载均衡器(运行 在 VPC 和 public 子网内的 EC2 节点上)。这些是 运行 在 docker 容器内。我注意到,如果微服务直接在 EC2 实例上 运行。它能够与 ALB 通信。在 docker 容器内启动微服务时。它不与 ALB 通信。
我可以用 curl 重现:
1) 直接在 EC2 实例上点击 curl - 工作
$ curl http://vpc-elb-url/alive
响应:
ok
2) 从 docker 容器内部点击 curl - 不工作
$ docker run --rm byrnedo/alpine-curl http://vpc-elb-url/alive
响应:
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 1120 100 1120 0 0 65882 0 --:--:-- --:--:-- --:--:-- 65882
<!DOCTYPE html>
<html lang="en">
<head>
<title>Not Found</title>
<style>
html, body, pre {
margin: 0;
padding: 0;
font-family: Monaco, 'Lucida Console', monospace;
background: #ECECEC;
}
h1 {
margin: 0;
background: #AD632A;
padding: 20px 45px;
color: #fff;
text-shadow: 1px 1px 1px rgba(0,0,0,.3);
border-bottom: 1px solid #9F5805;
font-size: 28px;
}
p#detail {
margin: 0;
padding: 15px 45px;
background: #F6A960;
border-top: 4px solid #D29052;
color: #733512;
text-shadow: 1px 1px 1px rgba(255,255,255,.3);
font-size: 14px;
border-bottom: 1px solid #BA7F5B;
}
</style>
</head>
<body>
<h1>Not Found</h1>
<p id="detail">
For request 'GET /alive'
</p>
</body>
</html>
如有任何帮助,我们将不胜感激。谢谢。
问题是容器没有与 EC2 实例共享同一个 AIM 角色
有一个名为 IAM-docker 的项目与容器共享主机 IAM 角色(您可以在 repo 中了解它的工作原理)
此外,它还允许您管理哪些容器将获得哪些访问权限
我认为这不是一个有效的问题。我正在回答这个问题,也许它会对其他人有所帮助。如果有人犯同样的错误:(
我们使用以下命令将所有流量从 80 路由到 9000:
$ sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 9000
因为这个 ALB 变得不可访问了。我们只是使用以下命令删除了此规则
sudo iptables -t nat -D PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 9000
一切正常!