在我的VPC中启用专用访问权限后,无法访问EKS端点

时间:2019-07-19 04:31:21

标签: kubernetes amazon-vpc amazon-eks aws-eks

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

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

我在Google上进行了很多搜索,发现我必须在自己的VPC中启用enableDnsHostnamesenableDnsSupport,但是启用它们并没有帮助。我还检查了我的主节点安全组,该安全组允许通过端口443从任何地方(即0.0.0.0/0入站流量),因此不必担心安全组。

但是,如果我打开Enabled的“公共访问”标志,一切都将正常运行,但这无法在专用子网中创建K8集群。

有人可以先指出我误会的地方吗?

1 个答案:

答案 0 :(得分:0)

简介

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

您可以通过在创建集群时切换 Public Access 来实现此目的,但是仍然不支持automated DNS Resolution for EKS with private endpoint这样的问题,例如RDS专用终结点。

在创建EKS集群时:

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

解决方案N°1

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

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

解决方案N°2

您可以编写一个小的脚本来解决该问题,该脚本使用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

Exec示例

╭─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必须将enableDnsHostnamesenableDnsSupport设置为true。

  

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

     

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

     

注意:请稍等片刻,以反映更改(大约5分钟)。