Kubernetes从Pod获取入口tls.hosts

时间:2019-10-25 21:42:27

标签: kubernetes kubernetes-ingress kubernetes-service

使用Kubernetes是否可以从其他Pod中获得ingress.spec.tls.hosts值,而无需使用kubectl (DNS,ENVVAR,OTHER)

我知道我可以做到:

# in other pod
dig +short my-app.default.svc.cluster.local
172.20.203.19

echo $MY_APP_SERVICE_HOST
172.20.203.19

echo $MY_APP_SERVICE_PORT
3000

或者:

# in other pod
dig +short SRV my-app.default.svc.cluster.local
0 100 3000 my-app.default.svc.cluster.local.

但是我实际上想连接到my-app的外部负载均衡器,其入口定义为:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: my-app-ingress
  annotations:
    kubernetes.io/ingress.class: "traefik"
    kubernetes.io/tls-acme: "true"
spec:
  tls:
  - hosts:
    - myapp.mydomain.com
  rules:
  - host: myapp.mydomain.com
    http:
      paths:
      - path: /
        backend:
          serviceName: my-app
          servicePort: http

因此,我想动态地从广告连播中获取myapp.mydomain.com

2 个答案:

答案 0 :(得分:1)

使用kubernetes api获取入口资源。创建一个角色,将其与服务帐户相关联,然后使用例如curl列出您的入口。下面是默认名称空间和服务帐户的示例:

---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: ingress-clusterrole
  namespace: default
rules:
- apiGroups: ["*"] # "" indicates the core API group
  resources: ["ingresses"]
  verbs: ["*"]

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: ingress-clusterrolebinding
  namespace: default
roleRef:
  name: ingress-clusterrole
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
subjects:
  - name: default
    namespace: default
    kind: ServiceAccount
curl --cacert /var/run/secrets/kubernetes.io/serviceaccount/ca.crt -H "Authorization: Bearer $(cat /var/run/secrets/kubernet
es.io/serviceaccount/token)" -H "Accept: application/json" -H "Content-Type: application/json" https://kubernetes.default.svc/ap
is/extensions/v1beta1/namespaces/default/ingresses | jq '.items'

答案 1 :(得分:0)

您可能会考虑使用特定的Service Account从单独的Pod访问Kubernetes API,通过在Pod内部进行特定的令牌传播来利用Bearer token身份验证策略,根据{标识目标ServiceAccount的凭据和权限{3}}规定授权执行;感谢@Rodrigo Loza的努力,他分享了一个很好的例子指出这一点。

但是,如果您在同一命名空间中的不同服务帐户之间区分RBAC权限,则可能会知道并为目标Pod内的相关服务帐户提供了对应的RBAC

spec:
  serviceAccountName: somename

根据官方的K8s文档:

  

创建Pod时,如果未指定服务帐户,则为   自动在同一帐户中分配了默认服务帐户   命名空间。如果获取已创建的Pod的原始json或yaml   (例如, kubectl get pods / -o yaml ),您可以看到    spec.serviceAccountName 字段已自动设置。

我也鼓励您在K8s文档credentials中了解有关身份验证策略的更多信息。