暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

基于AWS EKS的K8S实践 - 打通外网对集群内服务的调用

程序员修炼笔记 2023-06-28
933



Hi~朋友,关注置顶防止错过消息


集群内服务的暴露方式?

  1. service

  2. ingress

service 通常用作集群内服务之前的通信,ingress 通常用于暴露给集群外的服务使用。

由于我们这里的需求是将集群内的服务暴露给集群外的服务使用,所以我们这里选择 ingress 。

ingress controller 如何选择?

单纯的 ingress 是没有任何实际作用的,ingress 需要搭配 ingress controller 才会有意义,我们这里的需求是将集群内的服务暴露给我们的客户进行调用,相当于从外网访问我们集群内的服务,我们这里选择的是 ingress nginx controller,nginx的暴露点我们选择的是AWS NLB。

ingree nginx controller我们需要准备哪些东西?

  1. 一个public的子网

  2. 一个弹性EIP,用来分配给NLB

  3. 一个节点组(节点组),里面准备至少一台机器,用来部署ingress-controller

为什么我要给NLB分配一个EIP

由于ingress controller是我们外部流量的统一入口,我们可能会有N多个域名指向到我们的NLB,假设有天我们NLB需要删除重建,这时候没有这个EIP,你就需要把所有的DNS都改一个变,是不是想想就崩溃,而有了这个EIP,我们则不需要担心,即使重建NLB,DNS也不用修改。

ingress controller部署的节点有什么要求?

我们部署ingress controller的节点必须是public子网的机器,这样我们的服务才可以正常访问。

部署步骤

  1. 准备一个public子网,关于什么是public子网,请阅读 基于AWS EKS的K8S实践 - 集群搭建

   2. 准备一个节点组,节点组的机器数量按需定义,子网必须选择public的子网,并且在节点组打上 subnet-type.kubernetes.io=public:NoSchedule的污点以及network/subnet-type=public的标签,如下图:

通过为整个节点组打标签和污点,整个节点组下面的机器都会带上该污点和标签,之所以这样做是为了保证我们ingress-controller的Pod一定被调度到public的节点上,不会调度到私网的节点上,当然实现这个还需要修改ingrss controller的资源清单文件中的Deployment(主要修改标签亲和性和污点容忍)。

  3. 获取ingress-controller资源清单文件

  1. wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.0/deploy/static/provider/aws/nlb-with-tls-termination/deploy.yaml

下载下来的ingress controller资源文件我们需要对ingress-nginx-controller service进行修改,主要对其annotation进行修改:

  1. apiVersion: v1

  2. kind: Service

  3. metadata:

  4. annotations:

  5. service.beta.kubernetes.io/aws-load-balancer-backend-protocol: tcp

  6. service.beta.kubernetes.io/aws-load-balancer-cross-zone-load-balancing-enabled: 'true'

  7. service.beta.kubernetes.io/aws-load-balancer-eip-allocations: eipalloc-xxxx

  8. service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: ip

  9. service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing

  10. service.beta.kubernetes.io/aws-load-balancer-subnets: subnet-xxxx

  11. service.beta.kubernetes.io/aws-load-balancer-target-group-attributes: preserve_client_ip.enabled=true

  12. service.beta.kubernetes.io/aws-load-balancer-type: nlb

  13. labels:

  14. app.kubernetes.io/component: controller

  15. app.kubernetes.io/instance: ingress-nginx

  16. app.kubernetes.io/name: ingress-nginx

  17. app.kubernetes.io/part-of: ingress-nginx

  18. app.kubernetes.io/version: 1.8.0

  19. name: ingress-nginx-controller

  20. namespace: ingress-nginx

  1. aws-load-balancer-backend-protocol:NLB的协议这里选择TCP,不要选择TLS,https的验证我们可以放到ingress controller中,没必要放在AWS的NLB组件上,而且NLB默认只支持25个证书

  2. aws-load-balancer-eip-allocations:为NLB绑定我们的EIP

  3. aws-load-balancer-nlb-target-type: 指定nlb后面绑定的目标组的类型,这里的目标组里的机器就是ingress-nginx中的Pod容器,你可以理解为就是nginx

  4. aws-load-balancer-scheme:这里指定为internet-facing,表示我们的服务是暴露到互联网上的

  5. aws-load-balancer-subnets:这里指定NLB的子网,这里一定要选择public的子网

  6. aws-load-balancer-target-group-attributes:preserveclientip.enabled=true该参数是为了ingress-contrller能够取到客户端的真实IP,不设置的话默认是NLB所在机器的内网IP

  7. aws-load-balancer-type:指定我们ingress-contrller的负载均衡器是NLB

Service修改以后,我们还需要修改ingress-nginx-controller的Deployment,修改标签选择性和污点容忍,让其一定调度到我们位于public子网的工作节点上去,如下图:

上述配置修改好以后,就可以应用我们的资源清单文件了,如果没问题的话,会在AWS控制台上看到我们创建的NLB,也可以看到我们ingress-controller的Pod也创建成功,如下图:

如何解决证书问题

可以通过cert-manager解决,安装cert-manager可以通过以下命令:

  1. kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.12.0/cert-manager.yaml

上述资源都会安装cert-manager namspace下,关于证书的日志可以查看cert-manager deployment中pod的日志。

安装完cert-manager以后还需要安装Issuer,这个需要在你对应的namesapce下面安装,我这里会在test namespace创建,Issuer的文件如下:

  1. apiVersion: cert-manager.io/v1

  2. kind: Issuer

  3. metadata:

  4. name: letsencrypt-prod

  5. spec:

  6. acme:

  7. # The ACME server URL,这里我们用的是Let's Encrypt 签发的免费证书

  8. server: https://acme-v02.api.letsencrypt.org/directory

  9. # Email address used for ACME registration

  10. email: user@example.com

  11. # Name of a secret used to store the ACME account private key

  12. privateKeySecretRef:

  13. name: letsencrypt-prod

  14. # Enable the HTTP-01 challenge provider

  15. solvers:

  16. - http01:

  17. ingress:

  18. ingressClassName: nginx

https的ingress配置

  1. kind: Ingress

  2. apiVersion: networking.k8s.io/v1

  3. metadata:

  4. name: test.xxxx.example.com

  5. namespace: test

  6. annotations:

  7. cert-manager.io/issuer: letsencrypt-prod

  8. kubesphere.io/creator: admin

  9. spec:

  10. ingressClassName: nginx

  11. tls:

  12. - hosts:

  13. - test.xxxx.example.com

  14. secretName: test.xxxx.example.com-tls

  15. rules:

  16. - host: test.xxxx.example.com

  17. http:

  18. paths:

  19. - path:

  20. pathType: Prefix

  21. backend:

  22. service:

  23. name: xxx

  24. port:

  25. number: 80

  • cert-manager.io/issuer:指定我们创建好的issuer

  • ingressClassName:这里一定要指定成nginx,这样才可以使用到我们的ingress nginx controller

  • tls.host:需要签发证书的域

  • tls.secretName:签发好的证书保存到的Secret名称,如下图:

如何解决请求体过大的问题?

ingress nginx controller在特定情况下,会因为请求体过大导致触发限制,无法正常响应请求,因此我们需要修改这个最大值,修改最大值有两种方式,一种是每个ingress单独配置,通过在ingress的annotation指定nginx.ingress.kubernetes.io/proxy-body-size: Xm来修改,另一种是全局修改,这样会对所有的nginx-ingress生效,修改方式就是修改ingress-nginx namspace下的 ingress-nginx-controller ConfigMap配置,如下图:

如何解决跨域问题?

对于来自浏览器的访问请求,会存在跨域限制,当然跨域也可以配置全局对所有的nginx ingress生效,但是这里我们选择针对每个ingress进行配置,如下:

  1. kind: Ingress

  2. apiVersion: networking.k8s.io/v1

  3. metadata:

  4. name: test.xxx.eample.com

  5. namespace: test

  6. annotations:

  7. nginx.ingress.kubernetes.io/cors-allow-headers: >-

  8. Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization

  9. nginx.ingress.kubernetes.io/cors-allow-methods: 'PUT, GET, POST, OPTIONS'

  10. nginx.ingress.kubernetes.io/cors-allow-origin: '*'

  11. nginx.ingress.kubernetes.io/enable-cors: 'true'

  12. spec:

  13. ingressClassName: nginx

  14. rules:

  15. - host: test.xxx.eample.com

  16. http:

  17. paths:

  18. - path:

  19. pathType: Prefix

  20. backend:

  21. service:

  22. name: xxxx

  23. port:

  24. number: 80

  1. nginx.ingress.kubernetes.io/cors-allow-header:指定允许跨域的Request Header

  2. nginx.ingress.kubernetes.io/cors-allow-methods:指定允许跨域的请求方式

  3. nginx.ingress.kubernetes.io/cors-allow-origin:指定允许的源域

  4. nginx.ingress.kubernetes.io/enable-cors:开启跨域支持

如何解决白名单IP问题?

对于一些后台系统我们通常都会有白名单IP的限制,一般只允许公司的出口IP和办公VPN访问,或者一些三方在调用自己的服务时也会增加白名单限制,防止一些不合法的IP进行登录调用,ingress nginx的白名单限制需要通过以下注解来解决:

  1. kind: Ingress

  2. apiVersion: networking.k8s.io/v1

  3. metadata:

  4. name: test.xxx.eample.com

  5. namespace: test

  6. annotations:

  7. nginx.ingress.kubernetes.io/whitelist-source-range: >-

  8. 112.112.112.115/32,77.89.22.32/32

  9. spec:

  10. ingressClassName: nginx

  11. rules:

  12. - host: test.xxx.eample.com

  13. http:

  14. paths:

  15. - path:

  16. pathType: Prefix

  17. backend:

  18. service:

  19. name: xxxx

  20. port:

  21. number: 80

nginx.ingress.kubernetes.io/whitelist-source-range:用来指定白名单中的IP或网段,上述示例表明只允许112.112.112.115和,77.89.22.32这两个IP请求我们的test.xxx.eample.com。

【知识星球】


  知识星球正在初期搭建中,在星球中可以互相提问,分享经验,我也会在星球中分享基础技术架构的全流程搭建,包括但不仅限于DevOps,监控、Flink开发,Java开发(JVM、多线程、MySQL数据库)等相关技术类文章,期待大家的加入




虚拟侵入 集群技术 kubernetes aws k8s
文章转载自 程序员修炼笔记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

玻璃钢生产厂家庆阳人物玻璃钢雕塑制作郑州欧式玻璃钢雕塑多少钱河北装饰商场美陈市场价济南特色玻璃钢雕塑摆件南通户外玻璃钢花盆上饶佛像玻璃钢雕塑多少钱玻璃钢雕塑设计感连衣裙北京大型仿铜玻璃钢雕塑宣城玻璃钢浮雕人物山水雕塑菏泽不锈钢人物玻璃钢仿铜雕塑杭州商场美陈怎么样石家庄玻璃钢雕塑定做厂家河北玻璃钢雕塑之家仿铜玻璃钢雕塑制作过程生产玻璃钢动物雕塑代理商楼盘玻璃钢雕塑代理商湘潭玻璃钢马雕塑江苏大型商场创意商业美陈服务辽宁商场美陈公司安阳玻璃钢雕塑定制西宁彩色玻璃钢雕塑制作贵阳玻璃钢浮雕雕塑玻璃钢卡通雕塑制作哪家好南京玻璃钢雕塑一般多少钱滨州玻璃钢马雕塑亳州水果玻璃钢雕塑价位信阳铸铜玻璃钢景观雕塑升美玻璃钢雕塑玻璃钢雕塑的行业须知锦州玻璃钢花盆花器香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化