在我的 VPC 中启用私有访问时无法访问 EKS 端点
Cannot access EKS endpoint when private acess is enabled within my VPC
我设置了一个由 public 子网和多个私有子网组成的 VPC,public 子网托管一个 OpenVpn 访问服务器,我可以通过它访问我的实例 运行ning在私有子网中,我的所有 NAT 和互联网网关 运行ning 都正常,我可以通过 VPN 从私有子网中的实例 运行ning 访问互联网。
一切 运行 都很好,直到我决定 运行 我的私有子网中的一个 EKS 实例禁用 "Public Access" 功能,我无法访问我的 EKS 端点(K8 API 服务端点 API) 通过 VPN 或从任何实例 运行 进入我的 public/private 子网(即使用跳转框)。
我在谷歌上搜索了很多,发现我必须为我的 VPC 启用 enableDnsHostnames
和 enableDnsSupport
,但启用这些没有帮助。我还检查了我的主节点安全组,它允许来自任何地方的入站流量,即 0.0.0.0/0
通过端口 443,因此安全组不是问题。
然而,如果我打开 "Public Access" 标志到 Enabled
,那么一切 运行 都很好,但这无法达到在私有子网中创建 K8 集群的目的。
谁能指出我错在哪里,在此先感谢。
简介
如果您要在 AWS 上设置 EKS Kubernetes 集群,那么您可能需要一个外界无法访问的集群,然后您将通过 VPN 私下访问它。考虑到所有公开的内容 vulnerabilities,此设置看起来是一种更安全的设计,它允许您在 VPC 中隔离 Kubernetes 控制平面和工作节点,提供额外的保护层来加强集群以防止恶意攻击和意外暴露。
您可以通过在创建集群时关闭 Public Access 来做到这一点,但是这样做的问题是 automated DNS Resolution for EKS with private endpoint 仍然不受支持,因为它例如,使用 RDS 专用端点。
创建 EKS 集群时:
- AWS 不允许您更改端点的 DNS 名称。
- AWS 为端点 DNS(不可编辑)创建一个托管私有托管区域。
解决方案一
一个建议的解决方案是创建 Route53 入站和出站端点,如 official AWS blog post 中所述。
但是,这样做的问题是,每次创建集群时,您都需要将 IP 添加到我们的本地解析器,如果您的本地基础设施由其他人维护,则可能需要几天时间才能完成。
解决方案二
您可以通过编写一个小脚本来解决该问题,该脚本使用 IP 和 dns 名称更新 /etc/hosts
EKS 专用端点。这是一种 hack,但效果很好。
eks-dns.sh
脚本如下所示:
#!/bin/bash
#
# eg: bash ~/.aws/eks-dns.sh bb-dev-eks-BedMAWiB bb-dev-devops
#
clusterName=
awsProfile=
#
# Get EKS ip addrs
#
ips=`aws ec2 describe-network-interfaces --profile $awsProfile \
--filters Name=description,Values="Amazon EKS $clusterName" \
| grep "PrivateIpAddress\"" | cut -d ":" -f 2 | sed 's/[*",]//g' | sed 's/^\s*//'| uniq`
echo "#-----------------------------------------------------------------------#"
echo "# EKS Private IP Addresses: "
echo $ips
echo "#-----------------------------------------------------------------------#"
echo ""
#
# Get EKS API endpoint
#
endpoint=`aws eks describe-cluster --profile $awsProfile --name $clusterName \
| grep endpoint\" | cut -d ":" -f 3 | sed 's/[\/,"]//g'`
echo "#-----------------------------------------------------------------------#"
echo "# EKS Private Endpoint "
echo $endpoint
echo "#-----------------------------------------------------------------------#"
echo ""
IFS=$'\n'
#
# Create backup of /etc/hosts
#
sudo cp /etc/hosts /etc/hosts.backup.$(date +%Y-%m-%d)
#
# Clean old EKS endpoint entries from /etc/hots
#
if grep -q $endpoint /etc/hosts; then
echo "Removing old EKS private endpoints from /etc/hosts"
sudo sed -i "/$endpoint/d" /etc/hosts
fi
#
# Update /etc/hosts with EKS entry
#
for item in $ips
do
echo "Adding EKS Private Endpoint IP Addresses"
echo "$item $endpoint" | sudo tee -a /etc/hosts
done
执行示例
╭─delivery at delivery-I7567 in ~ using ‹› 19-11-21 - 20:26:27
╰─○ bash ~/.aws/eks-dns.sh bb-dev-eks-BedMAWiB bb-dev-devops
结果/etc/hosts
╭─delivery at delivery-I7567 in ~ using ‹› 19-11-21 - 20:26:27
╰─○ cat /etc/hosts
127.0.0.1 localhost
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.18.3.111 D4EB2912FDB14E8DAB358D471DD0DC5B.yl4.us-east-1.eks.amazonaws.com
172.18.1.207 D4EB2912FDB14E8DAB358D471DD0DC5B.yl4.us-east-1.eks.amazonaws.com
- 参考文章: studytrails。com/devops/kubernetes/local-dns-resolution-for-eks-with-private-endpoint/
重要考虑
另外如相关问题所述:,您的 VPC 必须将 enableDnsHostnames
和 enableDnsSupport
设置为 true。
I had to enable enableDnsHostnames and enableDnsSupport for my VPC.
When enabling the private access of a cluster, EKS creates a private
hosted zone and associates with the same VPC. It is managed by AWS
itself and you can't view it in your aws account. So, this private
hosted zone to work properly, your VPC must have enableDnsHostnames
and enableDnsSupport set to true.
Note: Wait for a while for changes to be reflected(about 5 minutes).
我设置了一个由 public 子网和多个私有子网组成的 VPC,public 子网托管一个 OpenVpn 访问服务器,我可以通过它访问我的实例 运行ning在私有子网中,我的所有 NAT 和互联网网关 运行ning 都正常,我可以通过 VPN 从私有子网中的实例 运行ning 访问互联网。
一切 运行 都很好,直到我决定 运行 我的私有子网中的一个 EKS 实例禁用 "Public Access" 功能,我无法访问我的 EKS 端点(K8 API 服务端点 API) 通过 VPN 或从任何实例 运行 进入我的 public/private 子网(即使用跳转框)。
我在谷歌上搜索了很多,发现我必须为我的 VPC 启用 enableDnsHostnames
和 enableDnsSupport
,但启用这些没有帮助。我还检查了我的主节点安全组,它允许来自任何地方的入站流量,即 0.0.0.0/0
通过端口 443,因此安全组不是问题。
然而,如果我打开 "Public Access" 标志到 Enabled
,那么一切 运行 都很好,但这无法达到在私有子网中创建 K8 集群的目的。
谁能指出我错在哪里,在此先感谢。
简介
如果您要在 AWS 上设置 EKS Kubernetes 集群,那么您可能需要一个外界无法访问的集群,然后您将通过 VPN 私下访问它。考虑到所有公开的内容 vulnerabilities,此设置看起来是一种更安全的设计,它允许您在 VPC 中隔离 Kubernetes 控制平面和工作节点,提供额外的保护层来加强集群以防止恶意攻击和意外暴露。
您可以通过在创建集群时关闭 Public Access 来做到这一点,但是这样做的问题是 automated DNS Resolution for EKS with private endpoint 仍然不受支持,因为它例如,使用 RDS 专用端点。
创建 EKS 集群时:
- AWS 不允许您更改端点的 DNS 名称。
- AWS 为端点 DNS(不可编辑)创建一个托管私有托管区域。
解决方案一
一个建议的解决方案是创建 Route53 入站和出站端点,如 official AWS blog post 中所述。
但是,这样做的问题是,每次创建集群时,您都需要将 IP 添加到我们的本地解析器,如果您的本地基础设施由其他人维护,则可能需要几天时间才能完成。
解决方案二
您可以通过编写一个小脚本来解决该问题,该脚本使用 IP 和 dns 名称更新 /etc/hosts
EKS 专用端点。这是一种 hack,但效果很好。
eks-dns.sh
脚本如下所示:
#!/bin/bash
#
# eg: bash ~/.aws/eks-dns.sh bb-dev-eks-BedMAWiB bb-dev-devops
#
clusterName=
awsProfile=
#
# Get EKS ip addrs
#
ips=`aws ec2 describe-network-interfaces --profile $awsProfile \
--filters Name=description,Values="Amazon EKS $clusterName" \
| grep "PrivateIpAddress\"" | cut -d ":" -f 2 | sed 's/[*",]//g' | sed 's/^\s*//'| uniq`
echo "#-----------------------------------------------------------------------#"
echo "# EKS Private IP Addresses: "
echo $ips
echo "#-----------------------------------------------------------------------#"
echo ""
#
# Get EKS API endpoint
#
endpoint=`aws eks describe-cluster --profile $awsProfile --name $clusterName \
| grep endpoint\" | cut -d ":" -f 3 | sed 's/[\/,"]//g'`
echo "#-----------------------------------------------------------------------#"
echo "# EKS Private Endpoint "
echo $endpoint
echo "#-----------------------------------------------------------------------#"
echo ""
IFS=$'\n'
#
# Create backup of /etc/hosts
#
sudo cp /etc/hosts /etc/hosts.backup.$(date +%Y-%m-%d)
#
# Clean old EKS endpoint entries from /etc/hots
#
if grep -q $endpoint /etc/hosts; then
echo "Removing old EKS private endpoints from /etc/hosts"
sudo sed -i "/$endpoint/d" /etc/hosts
fi
#
# Update /etc/hosts with EKS entry
#
for item in $ips
do
echo "Adding EKS Private Endpoint IP Addresses"
echo "$item $endpoint" | sudo tee -a /etc/hosts
done
执行示例
╭─delivery at delivery-I7567 in ~ using ‹› 19-11-21 - 20:26:27
╰─○ bash ~/.aws/eks-dns.sh bb-dev-eks-BedMAWiB bb-dev-devops
结果/etc/hosts
╭─delivery at delivery-I7567 in ~ using ‹› 19-11-21 - 20:26:27
╰─○ cat /etc/hosts
127.0.0.1 localhost
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.18.3.111 D4EB2912FDB14E8DAB358D471DD0DC5B.yl4.us-east-1.eks.amazonaws.com
172.18.1.207 D4EB2912FDB14E8DAB358D471DD0DC5B.yl4.us-east-1.eks.amazonaws.com
- 参考文章: studytrails。com/devops/kubernetes/local-dns-resolution-for-eks-with-private-endpoint/
重要考虑
另外如相关问题所述:enableDnsHostnames
和 enableDnsSupport
设置为 true。
I had to enable enableDnsHostnames and enableDnsSupport for my VPC.
When enabling the private access of a cluster, EKS creates a private hosted zone and associates with the same VPC. It is managed by AWS itself and you can't view it in your aws account. So, this private hosted zone to work properly, your VPC must have enableDnsHostnames and enableDnsSupport set to true.
Note: Wait for a while for changes to be reflected(about 5 minutes).