简介
如果您在 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 分钟)。