0

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

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

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

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

然后有一个 Listeners 选项卡,在该选项卡下我看到 Listener ID with HTTPS: 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-部署.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

它显示 External-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/#

提前致谢

更新于 29/1

我按照本文中提到的答案步骤操作kube-controller-manager don't start when using "cloud-provider=aws" with kubeadm

1)我通过在[服务]下添加以下命令来修改文件“/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

现在,当我使用 pod 进行部署kubectl apply -f k8s/manual-deployment.yaml时,当我检查时没有创建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(在以下部分:正确的节点名称)

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

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

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

更新于 30/1

如本博客所述,我执行了以下附加步骤 - 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

cloud-config.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)然后我能够成功地将工作节点加入集群并部署法兰绒CNI。

在此之后,获取节点显示就绪状态。

需要注意的重要一点是 /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 标签的键值映射中,我将键作为 KubernetesCluster,将值作为 k8s,但在配置文件中,我使用键映射而不是值。

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

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

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

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

最近更新

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

` 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 从我的主节点实例代理转发 -- 地址 0.0.0.0 --accept-hosts '.*' 然后如果我直接访问我的主节点 IP,如下所示,我可以浏览 - 10.118.6.35: 8001/api/v1/命名空间/默认/服务

是否可以使用直接 AWS Loadbalancer DNS 名称访问部署为 NodePort 或 Loadbalancer 类型的 kubernetes 服务?我什至使用 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 ”我甚至可以访问外部网址。这可能是一个问题吗?

4

1 回答 1

0

您在这里将两个不同的问题混为一谈。

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

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

但是,话虽如此:修复它将创建一个的LoadBalancer,并且不会使用您现有的ALB。这是双重事实,因为type: LoadBalancer将创建一个经典的 ELB,除非另有注释

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

最重要的是,一般来说,您应该在轮换中忽略 master,因为每一个NodePort都暴露在集群中的每个 worker 上,而且您几乎永远不会想要更多负载和更多流量流经集群中的 master。另外,除非您另有配置,否则为 Service 提供字节的实际 Pod 将不会存在于 master 上,因此无论如何都必须重新路由网络流量。

除此之外,您想要的是将您的 Service 更改为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

于 2019-01-29T07:46:52.903 回答