如何知道外部端点或Pod内部的Loadbalancer Service的IP

时间:2019-12-26 08:02:45

标签: docker kubernetes google-cloud-platform

我有一张舵图,可以安装/创建我们应用程序的实例。我们的应用程序包含多个微服务,其中之一就是nginx。 Nginx服务的类型为loadbalancer。

因此,当用户首次尝试通过浏览器访问负载均衡器IP时,我想打开一个网页,该页面将要求他将某些域(egayourdomain.com和b.yourdomain.com)与负载均衡器IP绑定,这样做,他将单击“验证”按钮,那时我要在服务器端检查域是否正确指向负载均衡器IP。

现在的问题是我如何才能在nginx pod内获取负载均衡器的外部IP,以便我可以ping域并检查它们是否在负载均衡器IP上定位。

修改

注意:我想避免使用kubectl,因为我不想一次性安装此额外的实用程序。

3 个答案:

答案 0 :(得分:0)

外部IP的值将处于服务对象的状态。

kubectl get svc $SVC_NAME -n $NS_NAME -o jsonpath="{.status.loadBalancer.ingress[*].ip}”将获得外部IP。

答案 1 :(得分:0)

我找到了解决方案,诀窍是使用由k8s播种的默认令牌调用k8s api服务器。这两个简单的命令可以解决问题:

KUBE_TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)

curl -sSk -H "Authorization: Bearer $KUBE_TOKEN" \ 
https://$KUBERNETES_SERVICE_HOST:$KUBERNETES_PORT_443_TCP_PORT/api/v1/namespaces/<your_namespace>/services/nginx \ 
| jq -r '.status.loadBalancer.ingress[0].ip'

答案 2 :(得分:0)

我找到了一种解决方案,已经过测试,并且可以正常工作。

要查找与类型为LoadBalancer的nginx服务关联的ExternalIP,您要创建服务帐户:

kubectl create serviceaccount hello

并按照以下步骤创建Role和RoleBindind:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: read-services
rules:
- apiGroups: [""]
  resources: ["services"]
  verbs: ["get", "watch", "list"]

---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: read-services
  namespace: default
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: read-services
subjects:
- kind: ServiceAccount
  name: hello
  namespace: default

然后您使用serviceAccount: hello

创建广告连播

现在您可以向api服务器like shown in k8s documentation发出curl请求:

APISERVER=https://kubernetes.default.svc
SERVICEACCOUNT=/var/run/secrets/kubernetes.io/serviceaccount
NAMESPACE=$(cat ${SERVICEACCOUNT}/namespace)
TOKEN=$(cat ${SERVICEACCOUNT}/token)
CACERT=${SERVICEACCOUNT}/ca.crt

curl --cacert ${CACERT} --header "Authorization: Bearer ${TOKEN}" -X GET ${APISERVER}/api/v1/namespaces/$NAMESPACE/services/nginx/
.status.loadBalancer.ingress[0].ip下的

应该是您要查找的IP。

让我知道它是否有帮助。