【问题标题】:Cannot access EKS endpoint when private acess is enabled within my VPC在我的 VPC 中启用私有访问时无法访问 EKS 终端节点
【发布时间】:2019-11-28 00:59:29
【问题描述】:

我设置了一个由公共子网和多个私有子网组成的 VPC,公共子网托管一个 OpenVpn 访问服务器,我可以通过它访问在私有子网中运行的实例,我的所有 NAT 和 Internet 网关都运行良好我可以通过 VPN 从私有子网中运行的实例访问互联网。

一切都运行良好,直到我决定在我的一个私有子网中运行一个 EKS 实例并禁用“公共访问”功能,我无法通过 VPN 或任何正在运行的实例访问我的 EKS 端点(K8 API 服务端点 API)进入我的公共/私有子网(即使用跳转框)。

我搜索了很多,发现我必须在我的 VPC 中启用 enableDnsHostnames 和 enableDnsSupport,但启用这些并没有帮助。我还检查了我的主节点安全组,它允许来自任何地方的入站流量,即 0.0.0.0/0 通过端口 443,所以安全组不是问题。

但是,如果我将“公共访问”标志打开到 Enabled,一切都会运行良好,但这无法达到在私有子网中创建 K8 集群的目的。

谁能指出我错在哪里,提前谢谢。

【问题讨论】:

标签: kubernetes amazon-vpc amazon-eks


【解决方案1】:

简介

如果您在 AWS 上设置 EKS Kubernetes 集群,那么您可能需要一个全世界都无法访问的集群,然后您将通过 VPN 私下访问它。考虑到所有公开的vulnerabilities,此设置看起来是一种更安全的设计,它允许您隔离 VPC 中的 Kubernetes 控制平面和工作节点,提供额外的保护层来强化集群以防止恶意攻击和意外暴露。

您可以通过在创建集群时关闭 Public Access 来做到这一点,但问题是 automated DNS Resolution for EKS with private endpoint 仍然不受支持,例如 RDS 私有端点。 p>

创建 EKS 集群时:

  • AWS 不允许您更改终端节点的 DNS 名称。
  • AWS 为端点 DNS 创建一个托管私有托管区域(不可编辑)。

解决方案 N°1

一个建议的解决方案是创建 Route53 入站和出站端点,如 official AWS blog post 中所述。

但是,这样做的问题是,每次创建集群时,您都需要将 IP 添加到我们的本地解析器,如果您的本地基础架构由其他人维护,则可能需要几天时间才能完成。

解决方案 N°2

您可以通过编写一个小脚本来解决该问题,该脚本使用 EKS 专用端点的 IP 和 dns 名称更新 /etc/hosts。这是一种 hack,但效果很好。

eks-dns.sh 脚本的外观如下:

#!/bin/bash

#
# eg: bash ~/.aws/eks-dns.sh bb-dev-eks-BedMAWiB bb-dev-devops
#
clusterName=$1
awsProfile=$2

#
# 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/

重要考虑

同样如相关问题中所述:Can't access EKS api server endpoint within VPC when private access is enabled,您的 VPC 必须将 enableDnsHostnames 和 enableDnsSupport 设置为 true。

我必须为我的 VPC 启用 enableDnsHostnames 和 enableDnsSupport。

启用集群的私有访问时,EKS 会创建一个私有 托管区域并与同一个 VPC 关联。它由 AWS 管理 本身,您无法在您的 aws 帐户中查看它。所以,这个私人 托管区域要正常工作,您的 VPC 必须具有 enableDnsHostnames 并将 enableDnsSupport 设置为 true。

注意:等待一段时间让更改生效(大约 5 分钟)。

【讨论】:

  • 非常感谢您提供解决方案,我试过了,但无法通过 VPN 访问我的 k8 api。
猜你喜欢
  • 2019-08-25
  • 1970-01-01
  • 2019-12-21
  • 1970-01-01
  • 2019-08-12
  • 2020-02-07
  • 2019-08-12
  • 2021-12-22
  • 2015-12-10
相关资源
最近更新 更多