Kubernetes 在我的VPC中启用私有访问时,无法访问EKS端点

Kubernetes 在我的VPC中启用私有访问时,无法访问EKS端点,kubernetes,amazon-vpc,amazon-eks,Kubernetes,Amazon Vpc,Amazon Eks,我已经建立了一个VPC,它由一个公共子网和多个私有子网组成,公共子网承载一个OpenVpn访问服务器,通过它我可以访问运行在私有子网中的实例,我的所有NAT和Internet网关都运行良好,我可以通过VPN从运行在私有子网中的实例访问Internet 一切都正常运行,直到我决定在禁用“公共访问”功能的情况下在我的一个私有子网中运行EKS实例,我无法通过VPN或从运行到我的公共/私有子网(即使用跳转框)的任何实例访问我的EKS端点(K8 API服务端点API) 我在谷歌上搜索了很多,发现我必须用我

我已经建立了一个VPC,它由一个公共子网和多个私有子网组成,公共子网承载一个OpenVpn访问服务器,通过它我可以访问运行在私有子网中的实例,我的所有NAT和Internet网关都运行良好,我可以通过VPN从运行在私有子网中的实例访问Internet

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

我在谷歌上搜索了很多,发现我必须用我的VPC启用
enableDnsHostnames
enablednsupport
,但启用这些都没有帮助。我还检查了主节点安全组,该组允许通过端口443从任何地方(即
0.0.0/0
)进行入站通信,因此安全组不受关注

然而,若我将“Public Access”标志打开到
Enabled
,一切都会正常运行,但这并没有达到在私有子网中创建K8集群的目的

有人能指出我哪里弄错了吗,提前谢谢。

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

您可以通过在创建集群时关闭公共访问来实现这一点,但是问题是,仍然不支持现有的公共访问,例如RDS专用端点

创建EKS群集时:

  • AWS不允许您更改端点的DNS名称
  • AWS为端点DNS创建托管私有托管区域(不可编辑)
1号溶液 一个建议的解决方案是创建Route53入站和出站端点,如本文所述

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

2号溶液 您可以通过编写一个小脚本来解决这个问题,该脚本使用EKS私有端点的IPdns名称更新
/etc/hosts
。这是一种黑客行为,但效果很好

以下是
eks dns.sh
脚本的外观:

#/bin/bash
#
#例如:bash~/.aws/eks-dns.sh bb dev eks BedMAWiB bb devops
#
clusterName=$1
awsProfile=$2
#
#获取EKS ip地址
#
ips=`aws ec2描述网络接口--profile$awsProfile\
--过滤器名称=描述,值=“亚马逊EKS$clusterName”\
|grep“PrivateIpAddress\”cut-d:“-f2 | sed's/[*”,]//g'| sed's/^\s*/'| uniq`
回声“#----------------------------------------------------------------#”
echo“#EKS专用IP地址:”
echo$ips
回声“#----------------------------------------------------------------#”
回声“”
#
#获取EKS API端点
#
endpoint=`aws eks descripe集群--profile$awsProfile--name$clusterName\
|grep端点\“| cut-d”:“-f3|sed's/[\/,“]//g”`
回声“#----------------------------------------------------------------#”
echo“#EKS私有端点”
echo$endpoint
回声“#----------------------------------------------------------------#”
回声“”
IFS=$'\n'
#
#创建/etc/hosts的备份
#
sudo cp/etc/hosts/etc/hosts.backup.$(日期+%Y-%m-%d)
#
#从/etc/hots清除旧EKS端点条目
#
如果grep-q$endpoint/etc/hosts;然后
echo“从/etc/hosts中删除旧EKS专用终结点”
sudo sed-i“/$endpoint/d”/etc/hosts
fi
#
#使用EKS条目更新/etc/hosts
#
对于$ips中的项目
做
echo“添加EKS专用端点IP地址”
echo“$item$endpoint”| sudo tee-a/etc/hosts
完成
执行示例 结果
/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

我必须为我的VPC启用EnabledNShostName和enableDnsSupport

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

注意:等待一段时间以反映更改(大约5分钟)


想知道,你已经看过了吗?文档中缺少了什么?@MichaelHausenblas我已经关注了您提到的文档,但对于提供解决方案没有太多幸运的因素,我尝试过,但无法通过VPN访问我的k8 api。
╭─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