我创建了一个内部 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
现在,当我使用 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 ”我甚至可以访问外部网址。这可能是一个问题吗?