我已经设置了一个由公共子网和多个私有子网组成的VPC,该公共子网托管一个OpenVpn访问服务器,通过它我可以访问在私有子网中运行的实例,我所有的NAT和Internet网关都运行良好而且我可以通过VPN在专用子网中运行的实例访问Internet。
一切正常,直到我决定在禁用“公共访问”功能的专用子网之一中运行EKS实例之前,我无法通过VPN或任何正在运行的实例到达我的EKS端点(K8 API服务端点API)进入我的公共/私有子网(即使用跳转框)。
我在Google上进行了很多搜索,发现我必须在自己的VPC中启用enableDnsHostnames
和enableDnsSupport
,但是启用它们并没有帮助。我还检查了我的主节点安全组,该安全组允许通过端口443从任何地方(即0.0.0.0/0
入站流量),因此不必担心安全组。
但是,如果我打开Enabled
的“公共访问”标志,一切都将正常运行,但这无法在专用子网中创建K8集群。
有人可以先指出我误会的地方吗?
答案 0 :(得分:0)
如果要在AWS上设置EKS Kubernetes集群,则可能需要一个世界无法访问的集群,然后将通过VPN私下访问它。考虑到所有公开的vulnerabilities,此设置看起来是一种更安全的设计,它使您能够隔离VPC内的Kubernetes控制平面和工作节点,从而提供了额外的保护层,以增强群集的抵抗恶意攻击和意外暴露的能力。
您可以通过在创建集群时切换 Public Access 来实现此目的,但是仍然不支持automated DNS Resolution for EKS with private endpoint这样的问题,例如RDS专用终结点。
在创建EKS集群时:
一个建议的解决方案是按照official AWS blog post中的描述创建Route53入站和出站端点。
但是,这样做的问题是,每次创建集群时,您都需要将IP添加到我们的本地解析器中,如果您的本地基础结构是由其他人维护的,则可能需要几天的时间才能完成。
您可以编写一个小的脚本来解决该问题,该脚本使用EKS专用终结点的 IP 和 dns 名称更新/etc/hosts
。这是一种破解,但效果很好。
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
也如相关问题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分钟)。