使用 AWS Elastic LoadBalancer 公开 kubernetes 应用程序

2024-02-26

我创建了一个内部 AWS 弹性应用程序负载均衡器,并在 AWS 控制台中将其状态显示为活动。 请注意,我使用 jenkins 作业创建了此 ALB,并且在该作业中我指定了我的 AWS EC2 实例服务器,该服务器配置为我的 kubernetes master。

工作成功完成后,我可以看到以下详细信息。

在 AWS 控制台的描述下,我可以看到以下详细信息 -

DNS  internal-myservices-987070943.us-east-1.elb.amazonaws.com
Scheme  internal
Type  application
IP address type  ipv4

然后有一个 Listeners 选项卡,在该选项卡下我可以看到 HTTPS 的 Listener ID:443

还显示了具有以下 2 条规则的规则 -

IF Path is /*  THEN Forward to myservices-LB
IF Requests otherwise not routed  THEN Forward to myservices-LB

此外,我还看到其他选项卡,例如“监控”、“集成服务”和“标签”。

现在,我有一个 kubernetes 集群,其中包含使用类型创建的以下服务:LoadBalancer - (来源参考:https://github.com/kenzanlabs/kubernetes-ci-cd/blob/master/applications/hello-kenzan/k8s/manual-deployment.yaml https://github.com/kenzanlabs/kubernetes-ci-cd/blob/master/applications/hello-kenzan/k8s/manual-deployment.yaml)

apiVersion: v1
Kind: Service
metadata:
 name: hello-kenzan
 labels:
 app: hello-kenzan
spec:
 ports:
  - port: 80
    targetPort: 80
 selector:
   app: hello-kenzan
   tier: hello-kenzan
 type: LoadBalancer

---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: hello-kenzan
  labels:
    app: hello-kenzan
spec:
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: hello-kenzan
        tier: hello-kenzan
    spec:
      containers:
      - image: gopikrish81/hello-kenzan:latest
        name: hello-kenzan
        ports:
        - containerPort: 80
          name: hello-kenzan

在我使用 - 创建服务后

kubectl apply -f k8s/manual-deployment.yaml
kubectl get svc

它显示外部 IP 为<pending>但是既然我创建了负载均衡器类型,为什么它不创建IP?

仅供参考,我可以使用以下方式访问该应用程序curl <master node>:<nodeport>或者甚至我可以通过代理转发访问它。

因此,如果没有创建 IP,我的应用程序就不可能使用 DNS 暴露,对吧?请建议我可以做什么,以便我可以使用 DNS 名称internal-myservices-987070943.us-east-1.elb.amazonaws.com 公开我的服务

我需要使用 DNS 名称来公开该应用程序,例如http://internal-myservices-987070943.us-east-1.elb.amazonaws.com/# http://internal-myservices-987070943.us-east-1.elb.amazonaws.com/#

提前致谢

更新于 29/1

我按照这篇文章中提到的答案步骤进行操作将“cloud-provider=aws”与 kubeadm 一起使用时,kube-controller-manager 不会启动 https://stackoverflow.com/questions/50668070/kube-controller-manager-dont-start-when-using-cloud-provider-aws-with-kubeadm

1)我通过在[Service]下添加以下命令来修改文件“/etc/systemd/system/kubelet.service.d/10-kubeadm.conf”

Environment="KUBELET_EXTRA_ARGS=--cloud-provider=aws --cloud-config=/etc/kubernetes/cloud-config.conf

我创建了这个 cloud-config.conf 如下 -

[Global]
KubernetesClusterTag=kubernetes
KubernetesClusterID=kubernetes

我不确定这个标签和 ID 指的是什么,但是当我运行以下命令时,我可以看到输出将 clusterName 提到为“kubernetes”

kubeadm config view

然后我就被处决了,

systemctl daemon-reload
system restart kubelet

2)然后正如其中提到的,我添加了--cloud-provider=aws在 kube-controller-manager.yaml 和 kube-apiserver.yaml 中

3)我还在我的应用程序的manual-deployment.yaml中添加了以下注释

annotations:
  service.beta.kubernetes.io/aws-load-balancer-internal: 0.0.0.0/0

https://github.com/kenzanlabs/kubernetes-ci-cd/blob/master/applications/hello-kenzan/k8s/manual-deployment.yaml https://github.com/kenzanlabs/kubernetes-ci-cd/blob/master/applications/hello-kenzan/k8s/manual-deployment.yaml

现在,当我使用部署时kubectl apply -f k8s/manual-deployment.yaml当我检查时,pod 本身没有被创建kubectl get po --all-namespaces

所以我尝试删除上面的步骤 2 并再次进行部署,现在 pod 已成功创建。但仍然显示<pending>当我这样做时,对于 EXTERNAL-IPkubectl get svc

我什至将我的主节点和工作节点重命名为与 EC2 实例私有 DNS 相同:ip-10-118-6-35.ec2.internal 和 ip-10-118-11-225.ec2.internal,如下面的帖子和重新配置了集群,但仍然没有成功。https://medium.com/jane-ai-engineering-blog/kubernetes-on-aws-6281e3a830fe https://medium.com/jane-ai-engineering-blog/kubernetes-on-aws-6281e3a830fe(在“正确的节点名称”部分下)

此外,在我的 EC2 实例中,我可以看到附加的 IAM 角色,当我看到该角色的详细信息时,我可以看到有 8 个策略应用于该角色。在其中一项政策中,我可以在下面看到这一点,还有许多其他行动,我没有在这里发布 -

{
   "Action": "elasticloadbalancing:*",
   "Resource": "*",
   "Effect": "Allow"
}

如果我缺少其他一些设置,我一无所知。请建议!

更新于 30/1

我执行了本博客中提到的以下附加步骤 -https://blog.scottlowe.org/2018/09/28/setting-up-the-kubernetes-aws-cloud-provider/ https://blog.scottlowe.org/2018/09/28/setting-up-the-kubernetes-aws-cloud-provider/

1) 将 AWS 标签添加到我的所有 EC2 实例(主节点和工作节点)作为“kubernetes.io/cluster/kubernetes”以及我的安全组

2)我没有在配置文件中手动添加 apiServerExtraArgs、controllerManagerExtraArgs 和 nodeRegistration。但我所做的是完全使用重置集群"sudo kubeadm reset -f"然后我将其添加到主节点和工作节点的 kubeadm conf 文件中 -

Environment="KUBELET_EXTRA_ARGS=--cloud-provider=aws --cloud-config=/etc/kubernetes/cloud-config.conf

云配置.conf -

[Global]
KubernetesClusterTag=kubernetes.io/cluster/kubernetes
KubernetesClusterID=kubernetes

然后在主节点和工作节点中执行 -

systemctl daemon-reload
system restart kubelet

3)现在我在主节点中使用以下命令创建了集群

sudo kubeadm init --pod-network-cidr=192.168.1.0/16 --apiserver-advertise-address=10.118.6.35

4)然后我就能够成功地将工作节点加入集群并部署 flannel CNI。

此后,获取节点显示Ready状态。

需要注意的一点是 /etc/kubernetes/manifests 路径中有 kube-apiserver.yaml 和 kube-controller-manager.yaml 文件。

当我添加--cloud-provider=aws在这两个 yaml 文件中,我的部署没有发生,并且根本没有创建 pod。所以当我删除标签时--cloud-provider=aws从 kube-apiserver.yaml 来看,部署和 Pod 均成功。

按照 Matthew 的要求,当我修改 kube-apiserver 和 kube-controller-manager 的 yaml 时,两个 pod 都再次成功创建。但由于 pod 没有被创建,我单独从 kube-apiserver.yaml 中删除了该标签。

另外,我检查了日志kubectl logs kube-controller-manager-ip-10-118-6-35.ec2.internal -n kube-system

但我没有看到任何异常或异常。我可以在最后一部分看到这一点 -

IO130 19:14:17.444485    1 event.go:221] Event(v1.ObjectReference{Kind:"Deployment", Namespace:"default", Name:"hello-kenzan", UID:"c........", APIVersion:"apps/v1", ResourceVersion:"16212", FieldPath:""}): type: 'Normal' reason: 'SuccessfulCreate' Created pod: hello-kenzan-56686879-ghrhj

甚至尝试将下面的注释添加到manual-deployment.yaml中,但仍然显示相同的内容<Pending>

service.beta.kubernetes.io/aws-load-balancer-internal: 0.0.0.0/0

更新至1/31

终于有了一些进步!! 问题看起来像标签映射。在 aws 标签的键值映射中,我将键设置为 Kubernetes Cluster,将值设置为 k8s,但在配置文件中,我映射了键而不是值。

但现在我可以在 kube-controller-manager pod 中看到以下日志 -

` 1 aws.go:1041] 构建 AWS 云提供商

1 aws.go:1007] 配置文件中未指定区域;查询AWS元数据服务

1 控制器 manager.go:208] 构建控制器上下文时出错:云提供商无法初始化:无法初始化云提供商“aws”:查找实例时出错 i-02dbgfghjf3e7:“列出 AWS 实例时出错:\”RequestError:发送请求失败\原因: 帖子https://ec2.us-east-1.amazonaws.com/ https://ec2.us-east-1.amazonaws.com/: 拨打 tcp 54.239.28.176:443: i/o 超时\"" `

最新更新

我没有使用 *.amazonaws.com 代理,现在似乎可以连接。我说“似乎连接”是通过检查我只在下面看到的日志而没有在添加此无代理之前发生的超时错误。我还确保控制器盒通过编辑和保存重新启动。之后我看到下面的日志 -

` 1 aws.go:1041] 构建 AWS 云提供商

1 aws.go:1007] 配置文件中未指定区域;查询AWS元数据服务 `

所以我假设我的控制器能够连接到 aws 云,对吗?但不幸的是仍然得到<pending>当我再次创建服务时:(

更新至 01/02

好吧,为了简单起见,我创建了 aws 应用程序负载均衡器 myservices,并在 aws 控制台中列出了以下 DNS 名称 -internal-myservices-987070943.us-east-1.elb.amazonaws.com

我还创建了目标组并在说明下显示 - 名称为 myservices-LB,协议为 HTTPS ,端口为 443,目标类型为实例,负载均衡器为 myservices 在“目标”选项卡下,我可以看到已注册的目标显示我的实例 ID 为 i-02dbf9b3a7d9163e7,端口为 443 以及其他详细信息。此实例 ID 是我的 ec2 实例,我已将其配置为 kubernetes 集群的主节点。

现在,当我尝试使用 URL 直接访问 LB DNS 名称时:internal-myservices-987070943.us-east-1.elb.amazonaws.com/api/v1/namespace s/default/services 我收到“无法访问此网站”的消息

而如果我使用 kubectl proxy --address 0.0.0.0 --accept-hosts '.*' 从主节点实例进行代理转发 然后,如果我直接访问我的主节点 IP,如下所示,我可以浏览 - 10.118.6.35:8001/api/v1/命名空间/默认/服务

是否可以访问部署为 NodePort 或 Loadbalancer 类型的 kubernetes 服务,以便可以使用直接 AWS Loadbalancer DNS 名称进行访问? 我什至使用tracert internal-myservices-987070943.us-east-1.elb.amazonaws.com 测试了连接 我可以在 18 跳内成功到达目的地 10.118.12.196

但从我的 ec2 主节点实例来看,它没有跟踪。通常我使用此命令设置代理 - “export {http,https,ftp}_proxy=http://proxy.ebiz.myorg.com:80 http://proxy.ebiz.myorg.com:80” 我什至可以访问外部网址。 这会是一个问题吗?


您在这里混淆了两个不同的问题。

它显示外部IP为但既然我已经创建了一个负载均衡器类型,为什么它不创建一个IP?

假设已经显示<pending>足够长的时间让你可以提出一个关于它的问题意味着你的controller-managerpod 没有命令行标志--cloud-provider=aws以及随附的--cloud-config=/the/path/here和/或不具有使这些 Pod 能够代表您创建负载均衡器的 IAM 实例角色。

然而,话虽如此:解决这个问题将产生一个newLoadBalancer,它不会使用你的existing白蛋白。这是双重正确的,因为type: LoadBalancer将创建一个经典的 ELB,除非注释为否则 https://kubernetes.io/docs/concepts/cluster-administration/cloud-providers/#load-balancers

我创建了一个内部 AWS 弹性应用程序负载均衡器,并在 AWS 控制台中将其状态显示为活动。请注意,我使用 jenkins 作业创建了此 ALB,并且在该作业中我指定了我的 AWS EC2 实例服务器,该服务器配置为我的 kubernetes master。

最重要的是,一般来说你应该从轮换中忽略大师,因为每个NodePort暴露在集群中的每个工作线程上,并且您几乎永远不会希望更多的负载和更多的流量流经集群中的主节点。另外,除非您进行了其他配置,否则为服务提供字节服务的实际 Pod 将不会存在于主节点上,因此网络流量无论如何都必须重新路由。

除此之外,您想要的是将您的服务更改为type: NodePort,并将 ALB 目标组指向那个港口:

spec:
 ports:
  - port: 80
    targetPort: 80
 selector:
   app: hello-kenzan
   tier: hello-kenzan
 type: NodePort

您可以自由地实际包含一个nodePort:其中的节ports:如果您愿意,也可以将其留空,kubernetes 会为其分配一个,很可能从顶部开始NodePort端口分配范围和工作向下。您可以通过以下方式了解它选择了哪一个kubectl get -o yaml svc hello-kenzan

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 AWS Elastic LoadBalancer 公开 kubernetes 应用程序 的相关文章

随机推荐