我正在尝试为应用程序完成一项非常常见的任务:
分配证书并使用TLS / HTTPS保护它 .
我花了将近一天时间通过文档搜索并尝试了多种不同的策略来实现这一点,但没有任何对我有用 .
最初我使用Helm在EKS上设置nginx-ingress,遵循以下文档:https://github.com/nginxinc/kubernetes-ingress . 我尝试使用以下配置使示例应用程序工作(咖啡馆):
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: cafe-ingress
spec:
tls:
- hosts:
- cafe.example.com
secretName: cafe-secret
rules:
- host: cafe.example.com
http:
paths:
- path: /tea
backend:
serviceName: tea-svc
servicePort: 80
- path: /coffee
backend:
serviceName: coffee-svc
servicePort: 80
入口和所有支持的服务/部署工作正常,但缺少一个主要的事情:入口没有相关的地址/ ELB:
NAME HOSTS ADDRESS PORTS AGE
cafe-ingress cafe.example.com 80, 443 12h
Service LoadBalancers创建ELB资源,即:
testnodeapp LoadBalancer 172.20.4.161 a64b46f3588fe... 80:32107/TCP 13h
但是,Ingress没有创建地址 . 如何在EKS上外部公开Ingress控制器来处理TLS / HTTPS?
2 回答
要使Ingress resource工作,群集必须配置Ingress controller .
这与其他类型的控制器不同,后者通常作为kube-controller-manager二进制文件的一部分运行,并且通常作为集群创建的一部分自动启动 .
对于带有helm的EKS,您可以尝试:
接下来,配置Ingress资源:
应用配置:
接下来,使用TLS证书创建密钥:
并在Ingress定义中引用它们:
以下配置示例显示了如何配置Ingress控制器:
接下来,应用上面的配置,然后您可以检查外部IP公开的服务:
外部IP是由外部配置的路由机制配置的终止于其中一个Kubernetes节点的地址 . 在服务定义中配置时,一旦请求到达节点,流量将重定向到服务 endpoints .
Documentation of Kubernetes提供了更多示例 .
我已经复制了每个步骤,以便在安全入口的EKS上启动和运行 . 我希望这可以帮助其他想要快速安全地在EKS上获取应用程序的人 .
要在EKS上启动并运行:
使用CloudFormation模板部署EKS here:请记住,我已使用CidrIp限制访问:193.22.12.32/32 . 改变它以满足您的需求 .
安装客户端工具 . 按照指南here .
配置客户端 . 按照指南here .
启用工作节点 . 按照指南here .
您可以通过运行以下命令验证群集是否已启动并正在运行:
kubectl get svc
现在,您使用nginx入口启动测试应用程序 .
注意: Everything is placed under the ingress-nginx namespace. Ideally this would be templated to build under different namespaces, but for the purposes of this example it works.
部署nginx-ingress:
从here获取rbac.yml . 跑:
kubectl apply -f rbac.yml
准备好证书和密钥进行测试 . 像这样创建必要的秘密:
kubectl create secret tls cafe-secret --key mycert.key --cert mycert.crt -n ingress-nginx
从here复制coffee.yml . 从here复制coffee-ingress.yml . 更新您要在其下运行此域的域 . 像这样运行它们
更新您域名的CNAME以指向ADDRESS:
kubectl get ing -n ingress-nginx -o wide
刷新DNS缓存并测试域 . 您应该获得一个包含请求统计信息的安全页面 . 我已经多次复制了这个,所以如果它无法为您工作,请检查步骤,配置和证书 . 另外,检查nginx-ingress-controller * pod上的日志 .
kubectl logs pod/nginx-ingress-controller-*********** -n ingress-nginx
这应该可以告诉你什么是错的 .