Как предоставить api сервера метрики кубернетов для завивки изнутри модуля?

Я использую сервер метрик, чтобы использовать свой кластер Kubernetes. Но для того, чтобы использовать его извне хоста, мне нужно использовать «kubectl proxy». Но я не хочу этого делать, поскольку он не предназначен для работы в фоновом режиме. Я хочу, чтобы он постоянно работал как сервис

Как я могу достичь этих

ожидаемый результат curl clusterip: 8001 / apis / metrics.k8s.io / v1beta1 / nodes

{
  "kind": "NodeMetricsList",
  "apiVersion": "metrics.k8s.io/v1beta1",
  "metadata": {
    "selfLink": "/apis/metrics.k8s.io/v1beta1/nodes"
  },
  "items": [
    {
      "metadata": {
        "name": "manhattan-master",
        "selfLink": "/apis/metrics.k8s.io/v1beta1/nodes/manhattan-master",
        "creationTimestamp": "2019-11-15T04:26:47Z"
      },
      "timestamp": "2019-11-15T04:26:33Z",
      "window": "30s",
      "usage": {
        "cpu": "222998424n",
        "memory": "3580660Ki"
      }
    }
  ]

Я пробовал использовать службу LoadBalancig metrics-server-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: metrics-server
  namespace: kube-system
  labels:
    kubernetes.io/name: "Metrics-server"
    kubernetes.io/cluster-service: "true"
spec:
  selector:
    k8s-app: metrics-server
  ports:
  - port: 443
    protocol: TCP
    targetPort: main-port
  externalTrafficPolicy: Local
  type: LoadBalancer

kubectl describe service metrics-master -n kube-system

[root@manhattan-master 1.8+]# kubectl describe service metrics-server -n kube-system
Name:                     metrics-server
Namespace:                kube-system
Labels:                   kubernetes.io/cluster-service=true
                          kubernetes.io/name=Metrics-server
Annotations:              kubectl.kubernetes.io/last-applied-configuration:
                            {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"kubernetes.io/cluster-service":"true","kubernetes.io/name":"Me...
Selector:                 k8s-app=metrics-server
Type:                     LoadBalancer
IP:                       10.110.223.216
Port:                     <unset>  443/TCP
TargetPort:               main-port/TCP
NodePort:                 <unset>  31043/TCP
Endpoints:                10.32.0.7:4443
Session Affinity:         None
External Traffic Policy:  Local
HealthCheck NodePort:     32208
Events:                   <none>

person UDIT JOSHI    schedule 18.11.2019    source источник
comment
Я использовал имя службы loadbalancer вместо clusterIp в файле service.yaml. Это даст вам конечную точку loadbalancer, и вы сможете ее использовать.   -  person Shree Prakash    schedule 18.11.2019
comment
Я пробовал, но в этом случае не получил ExternalIp, и моя главная команда тоже не сработала.   -  person UDIT JOSHI    schedule 18.11.2019
comment
Привет, вы можете использовать свой apiserver fqdn, curl -kv $API_SERVER_FQDN/apis/metrics.k8s.io/v1beta1/nodes, именно так kubectl получает информацию об использовании   -  person Suresh Vishnoi    schedule 18.11.2019
comment
@UDITJOSHI он должен быть там, просто сделайте kubectl get svc -n kube-system или в каком пространстве имен вы развернули метрический сервер   -  person Shree Prakash    schedule 18.11.2019
comment
@ShreePrakash Я добавил описание своей службы метрики-сервера. Подскажите, пожалуйста, что я делаю не так?   -  person UDIT JOSHI    schedule 19.11.2019
comment
@UDITJOSHI это 10.110.223.216:443 - конечная точка LoadBalancer. Правильно ??   -  person Shree Prakash    schedule 19.11.2019
comment
да. Но у меня не было внешнего ip. Я также пробовал с сервисом NodePod, но curl ip: port дает null   -  person UDIT JOSHI    schedule 19.11.2019


Ответы (1)


Это возможно путем создания новой службы для предоставления доступа к серверу метрик. Ваша служба сервера метрик должна выглядеть так:

apiVersion: v1
kind: Service
metadata:
  labels:
    kubernetes.io/name: Metrics-server-ext
  name: metrics-server-ext
  namespace: kube-system
  selfLink: /api/v1/namespaces/kube-system/services/metrics-server
spec:
  ports:
  - port: 443
    protocol: TCP
    targetPort: https
  selector:
    k8s-app: metrics-server
  sessionAffinity: None
  type: LoadBalancer

Если вы попытаетесь получить доступ к этой услуге, вы столкнетесь с некоторыми проблемами с авторизацией, и вам нужно будет сделать некоторые вещи, чтобы предоставить все необходимые авторизации.

После создания службы вам нужно будет создать привязку роли кластера, чтобы наша служба могла иметь доступ к данным:

$ kubectl create clusterrolebinding node-admin-default-svc --clusterrole=cluster-admin --serviceaccount=default:default

Перед запуском команды curl нам нужно получить токен, чтобы мы могли передать его в нашу команду curl:

$ TOKEN=$(kubectl get secrets -o jsonpath="{.items[?(@.metadata.annotations['kubernetes\.io/service-account\.name']=='default')].data.token}"|base64 --decode)

Получите внешний IP-адрес вашей службы:

kubectl get svc/metrics-server-ext -n kube-system -o jsonpath='{..ip}'

Ваша curl команда должна передать ключ Token для получения авторизации:

curl -k https://34.89.228.98/apis/metrics.k8s.io/v1beta1/nodes --header "Authorization: Bearer $TOKEN" --insecure

Пример вывода:

{
 "kind": "NodeMetricsList",
 "apiVersion": "metrics.k8s.io/v1beta1",
 "metadata": {
   "selfLink": "/apis/metrics.k8s.io/v1beta1/nodes"
 },
 "items": [
   {
     "metadata": {
       "name": "gke-lab-default-pool-993de7d7-ntmc",
       "selfLink": "/apis/metrics.k8s.io/v1beta1/nodes/gke-lab-default-pool-993de7d7-ntmc",
       "creationTimestamp": "2019-11-19T10:26:52Z"
     },
     "timestamp": "2019-11-19T10:26:17Z",
     "window": "30s",
     "usage": {
       "cpu": "52046272n",
       "memory": "686768Ki"
     }
   },
   {
     "metadata": {
       "name": "gke-lab-default-pool-993de7d7-tkj9",
       "selfLink": "/apis/metrics.k8s.io/v1beta1/nodes/gke-lab-default-pool-993de7d7-tkj9",
       "creationTimestamp": "2019-11-19T10:26:52Z"
     },
     "timestamp": "2019-11-19T10:26:21Z",
     "window": "30s",
     "usage": {
       "cpu": "52320505n",
       "memory": "687252Ki"
     }
   },
   {
     "metadata": {
       "name": "gke-lab-default-pool-993de7d7-v7m3",
       "selfLink": "/apis/metrics.k8s.io/v1beta1/nodes/gke-lab-default-pool-993de7d7-v7m3",
       "creationTimestamp": "2019-11-19T10:26:52Z"
     },
     "timestamp": "2019-11-19T10:26:17Z",
     "window": "30s",
     "usage": {
       "cpu": "45602403n",
       "memory": "609968Ki"
     }
   }
 ]
}

РЕДАКТИРОВАТЬ:

Вы также можете при желании получить к нему доступ из своих модулей, поскольку вы создали привязку роли кластера в своей учетной записи службы по умолчанию с ролью администратора кластера.

Например, создайте модуль из изображения, которое включает команду curl:

$ kubectl run bb-$RANDOM --rm -i --image=ellerbrock/alpine-bash-curl-ssl --restart=Never --tty -- /bin/bash

Затем вам нужно выполнить exec в своем модуле и запустить:

$ curl -k -X GET https://kubernetes.default/apis/metrics.k8s.io/v1beta1/nodes --header "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" --insecure

Здесь мы передаем тот же ТОКЕН, упомянутый ранее, совершенно другим способом.

person Mark Watney    schedule 19.11.2019
comment
Но моя проблема в том, что я не получил внешний IP - person UDIT JOSHI; 19.11.2019
comment
Какой тип сервиса вы используете LoadBalancing? - person UDIT JOSHI; 19.11.2019
comment
Я обновил свой ответ, включая type: LoadBalancer. Какого облачного провайдера вы используете? - person Mark Watney; 19.11.2019
comment
Я использую локально. Но я могу запустить api с сервисом NodePode - person UDIT JOSHI; 19.11.2019
comment
Можно ли небезопасно запустить api сервера метрики, чтобы я мог получить доступ и изнутри модуля с помощью команды curl, потому что внутри модуля я не могу сгенерировать токен. Потому что команда kubectl там не работает - person UDIT JOSHI; 19.11.2019
comment
Я обновил свой ответ инструкцией о том, как получить к нему доступ из модуля. - person Mark Watney; 19.11.2019
comment
Если мой ответ помог вам достичь того, что вам нужно, пожалуйста, не забудьте принять мой ответ и / или проголосовать за него. Спасибо. - person Mark Watney; 20.11.2019
comment
Ваша ошибка связана с кодом. Проверьте, это подключено. - person Mark Watney; 25.11.2019
comment
У меня есть еще одна проблема, когда я перезагружаю систему. Мой метрический сервер будет работать, но когда я выполню api из модуля. он говорит: curl: (6) Не удалось разрешить хост 'kubernetes.default' - person UDIT JOSHI; 02.12.2019
comment
Мои поды core-dns также в рабочем состоянии - person UDIT JOSHI; 02.12.2019
comment
Какого облачного провайдера вы используете? Если вы используете GKE, взгляните на это. - person Mark Watney; 02.12.2019