我有一张舵图,可以安装/创建我们应用程序的实例。我们的应用程序包含多个微服务,其中之一就是nginx。 Nginx服务的类型为loadbalancer。
因此,当用户首次尝试通过浏览器访问负载均衡器IP时,我想打开一个网页,该页面将要求他将某些域(egayourdomain.com和b.yourdomain.com)与负载均衡器IP绑定,这样做,他将单击“验证”按钮,那时我要在服务器端检查域是否正确指向负载均衡器IP。
现在的问题是我如何才能在nginx pod内获取负载均衡器的外部IP,以便我可以ping域并检查它们是否在负载均衡器IP上定位。
修改
注意:我想避免使用kubectl,因为我不想一次性安装此额外的实用程序。
答案 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。
让我知道它是否有帮助。