我创建了一个内部 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”
我什至可以访问外部网址。
这会是一个问题吗?