【问题标题】:How to configure an AWS Elastic IP to point to an OpenShift Origin running pod?如何配置 AWS 弹性 IP 以指向运行 OpenShift Origin 的 pod?
【发布时间】:2018-02-22 19:32:16
【问题描述】:

我们已经使用 this handy guide 在 AWS 上设置了 OpenShift Origin。我们的最终 希望有一些 pod 运行 REST 或我们可以访问的类似服务 用于开发目的。因此,我们此时不需要 DNS 或类似的东西 点,只是一个具有开放端口的公共 IP,它指向我们正在运行的 pod 之一。 我们的第一个概念证明是尝试获得一个 jenkins(甚至只是 httpd!)pod 它在 OpenShift 内部运行,通过分配的弹性 IP 公开。

无论如何我都不是网络工程师,但我能够成功获得 一个弹性 IP 连接到我的 OpenShift“工作”实例之一,我 通过 ssh 到分配给弹性 IP 的公共 IP 进行测试。在此刻 我们正在努力弄清楚如何使分配了弹性 IP 的 pod 可见, 不过。我们尝试了一个 kubernetes LoadBalancer 服务,一个 kubernetes Ingress, 并配置 AWS 网络负载均衡器,但都无法 成功连接到18.2XX.YYY.ZZZ:8080(我的公网IP)。

最有希望的成功是使用oc port-forward 似乎至少取得了部分进展 通过,但令人沮丧地挂起而没有返回:

$ oc port-forward --loglevel=7 jenkins-2-c1hq2 8080 -n my-project
I0222 19:20:47.708145   73184 loader.go:354] Config loaded from file /home/username/.kube/config
I0222 19:20:47.708979   73184 round_trippers.go:383] GET https://ec2-18-2AA-BBB-CCC.us-east-2.compute.amazonaws.com:8443/api/v1/namespaces/my-project/pods/jenkins-2-c1hq2
....
I0222 19:20:47.758306   73184 round_trippers.go:390] Request Headers:
I0222 19:20:47.758311   73184 round_trippers.go:393]     X-Stream-Protocol-Version: portforward.k8s.io
I0222 19:20:47.758316   73184 round_trippers.go:393]     User-Agent: oc/v1.6.1+5115d708d7 (linux/amd64) kubernetes/fff65cf
I0222 19:20:47.758321   73184 round_trippers.go:393]     Authorization: Bearer Pqg7xP_sawaeqB2ub17MyuWyFnwdFZC5Ny1f122iKh8
I0222 19:20:47.800941   73184 round_trippers.go:408] Response Status: 101 Switching Protocols in 42 milliseconds
I0222 19:20:47.800963   73184 round_trippers.go:408] Response Status: 101 Switching Protocols in 42 milliseconds
Forwarding from 127.0.0.1:8080 -> 8080
Forwarding from [::1]:8080 -> 8080

( oc port-forward hangs at this point and never returns)

我们找到了很多关于如何在 GKE 下运行的信息,但是 没有什么对让 OpenShift Origin 正常工作真正有帮助的 AWS。有什么想法吗?

更新:

因此我们意识到 sysdig.com 关于在 AWS 上部署 OpenShift Origin 的博文缺少一些关键的 AWS 设置信息,因此基于OpenShift Origin's Configuring AWS page,我们设置了以下 env 变量并重新运行了 ansible playbook:

$ export AWS_ACCESS_KEY_ID='AKIASTUFF'
$ export AWS_SECRET_ACCESS_KEY='STUFF'
$ export ec2_vpc_subnet='my_vpc_subnet'
$ ansible-playbook -c paramiko -i hosts openshift-ansible/playbooks/byo/config.yml --key-file ~/.ssh/my-aws-stack

我认为这让我们更接近了,但现在创建负载平衡器服务会为我们提供一个始终未决的 IP:

$ oc get services
NAME         CLUSTER-IP    EXTERNAL-IP   PORT(S)             AGE
jenkins-lb   172.30.XX.YYY <pending>     8080:31338/TCP      12h

AWS Applying Configuration Changes 上的部分似乎暗示我需要使用 AWS 实例 ID 而不是主机名来识别我的节点,但我尝试了这个,如果我使用该方法,OpenShift Origin 将无法启动。还是一头雾水。

【问题讨论】:

  • oc port-forward 命令不会返回,它会一直运行直到你中断它。您可能误解了 oc port-forward 的用途。它用于创建从 pod 到本地计算机的临时连接。运行它后,您将连接到 127.0.0.1:8080 以向该 pod 中的应用程序发出请求。您可以在learn.openshift.com 的练习中查看使用端口转发的示例。
  • @GrahamDumpleton 好的,那么 oc port-forward 实际上并没有在本地主机“环回”之外公开这个?所以那次特别的尝试也许是在找错树。
  • @OgrePsalm33 您应该重新考虑将弹性 IP 分配给 pod。 EIP 可以绑定到 EC2 实例,而不是 Pod。理想情况下,您会将 EIP 绑定到托管 Openshift 路由器的 EC2 实例,并通过路由器公开您的 Kubernetes 服务。这样,您就可以通过 Openshift 路由中指定的主机名访问该服务。
  • @VineetReynolds 所有关于 OpenShift 路由和路由器的文档都让我相信它们只有在我有一个面向外部的域名时才有用,而我们目前还没有。除非我们可以路由到超长 AWS 生成的主机名? (即:ec2-18-2AA-BBB-CCC.us-east-2.compute.amazonaws.com
  • @OgrePsalm33 值得一试。使用假主机名可能会更好。在这种情况下,很可能只有您的浏览器需要帮助来定位主机 - 通过客户端上的 etc/hosts 条目轻松解决。

标签: amazon-web-services kubernetes openshift openshift-origin


【解决方案1】:

它可能不满足“弹性 IP”部分,但是如何使用 AWS cloud provider ELB 将 IP/端口通过服务公开给 pod,并带有 LoadBalancer 选项?

  1. 确保为集群配置 AWS 云提供商(参考)
  2. 使用 LoadBalancer 类型为 pod 创建一个 svc。

例如通过 AWS ELB 公开仪表板。

kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kube-system
spec:
  type: LoadBalancer <-----
  ports:
    - port: 443
      targetPort: 8443
  selector:
    k8s-app: kubernetes-dashboard

然后 svc 将作为 ELB 公开,并且可以通过 ELB 公共 DNS 名称 a53e5811bf08011e7bae306bb783bb15-953748093.us-west-1.elb.amazonaws.com 访问 pod。

$ kubectl (oc) get svc kubernetes-dashboard -n kube-system -o wide
NAME                   TYPE           CLUSTER-IP      EXTERNAL-IP                                                              PORT(S)         AGE       SELECTOR
kubernetes-dashboard   LoadBalancer   10.100.96.203   a53e5811bf08011e7bae306bb783bb15-953748093.us-west-1.elb.amazonaws.com   443:31636/TCP   16m       k8s-app=kubernetes-dashboard

参考文献

  1. K8S AWS Cloud Provider Notes
  2. Reference Architecture OpenShift Container Platform on Amazon Web Services
  3. DEPLOYING OPENSHIFT CONTAINER PLATFORM 3.5 ON AMAZON WEB SERVICES
  4. Configuring for AWS

【讨论】:

  • 使用 LoadBalancer 服务是我们尝试的第一件事,但由于某种我们无法弄清楚的原因,它总是被分配一个非公共 IP 作为 EXTERNAL-IP:jenkins-lb 172.30.AAA.BBB 172.29.XXX.YYY,172.29.XXX.YYY 8080:30989/TCP
  • 如果有kubelet log,请提供。
  • 以下是 journalctl 报告的相关错误:for service my-proj/jenkins-lb: InvalidSubnet: Not enough IP space available in subnet-a7ab8fff. ELB requires at least 8 free IP addresses in each subnet.
  • 请确保 AWS 云提供商的先决条件(IAM 角色并将其分配给 EC2 实例),如 K8S AWS 云提供商说明,以及子网 a7ab8fff 的定义和 CNI(使用印花布还是法兰绒?)
【解决方案2】:

查看本指南:https://github.com/dwmkerr/terraform-aws-openshift

与您在帖子中提到的相比,它有一些显着的优势。此外,它有一个明确的 terraform 规范,您可以修改并重置为使用弹性 IP(我自己没有尝试过,但应该可以)。

另一种“锁定”您对安装的访问权限的方法是重新编码将公共 URL 分配给 terraform 脚本中的主实例,例如,分配给您拥有的域(默认脚本将其设置为添加了“xip.io”的基于外部 IP 的值 - 非常适合测试),然后设置一个基本 ALB,将 https 443 和 8443 转发到安装创建的主实例(您可以在安装完成后手动执行此操作,还需要第二个虚拟子网;也虚拟化运行状况检查)并通过 Route53 将 ALB 链接到您的域。您甚至可以通过这种方法使用免费的 Route53 通配符证书。

【讨论】:

  • 我去看看。正如我在我的问题中提到的,我们现在只是想路由到一个公共 IP,没有 DNS(我们公司涉及一些繁文缛节来设置一个新域,所以还没有 Route53)。 “xip.io”方法很有希望,但不确定我们的 IT 安全是否会喜欢使用它超过几个小时或几天,只是因为他们想更好地理解它;-)。
  • 所以在经历了这个例子之后,我最终得到了类似的最终结果。最后, oc get services 显示与正在运行的 pod 关联的任何新创建的服务的 EXTERNAL-IP&lt;none&gt;
  • 外部IP通过路由自动映射。这是我从 openshift 示例部署示例博客应用程序后看到的内容 NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD routes/blog blog-test01.my-oc.mydomain.com blog 8080 edge/Redirect None NAME CLUSTER-IP EXTERNAL- IP PORT(S) AGE svc/blog 172.30.248.171 8080/TCP 1d`
  • 请在此处查看示例github.com/openshift-katacoda/blog-django-py/blob/master/… "kind": "Route",
  • 在此设置中,路由将服务公开为集群“公共 URL”处的前缀域,这是在创建集群时分配的属性。然后,您只需要 DNS 解析即可访问您所在的域表单
猜你喜欢
  • 2015-10-31
  • 2019-08-30
  • 1970-01-01
  • 1970-01-01
  • 2019-05-02
  • 1970-01-01
  • 1970-01-01
  • 2016-02-11
  • 2017-10-30
相关资源
最近更新 更多