Можно ли получить доступ к API Kubernetes через вход https? - PullRequest
0 голосов
/ 19 октября 2018

Я безуспешно пытался получить доступ к Kubernetes API через HTTPS-вход, и теперь начал задаваться вопросом, возможно ли это вообще?

Любое рабочее подробное руководство по прямому удаленному доступу (без использования прокси-сервера ssh -> kubectl, чтобы избежать управления пользователями на узле Kubernetes) будет приветствоваться.:)

ОБНОВЛЕНИЕ:

Просто чтобы прояснить ситуацию.Это простое развертывание в помещении (без GCE, AWZ, Azure или любого другого), и есть вероятность, что некоторые среды будут полностью автономны (что добавит дополнительные проблемы при получении пакетов установки).

Намерениечтобы иметь возможность использовать kubectl на клиентском хосте с аутентификацией через Keycloak (что также не удается, если следуют пошаговые инструкции).Административный доступ с использованием SSH, а затем kubectl не подходит для доступа клиента.Похоже, мне придется обновить брандмауэр, чтобы открыть порт API и создать службу NodePort.

Установка:

[kubernetes - env] - [FW / SNAT] - [me]

FW / NAT разрешает доступ только через порты 22,80 и 443

Поэтому, когда я настраиваю вход в Kubernetes, я не могу создать правило брандмауэра для перенаправления с 443 на 6443. Кажетсяединственная опция - создание входа https для указания доступа к «api-kubernetes.node.lan» к сервисному порту 6443 kubernetes. Сам по себе Ingress работает нормально, я создал рабочий вход для приложения авторизации Keycloak.

Я скопировал .kube / config с главного узла на мою машину и поместил его в .kube / config (среда Cygwin)

Что было предпринято:

  • Проход SSL.Не удалось включить, поскольку контроллер kubernetes-ingress не смог запуститься из-за невозможности создать промежуточный сертификат.Даже если бы он был запущен, он, скорее всего, нанес бы ущерб другим входам HTTPS.
  • Создан самозаверяющий сертификат SSL.В результате через браузер я мог получить вывод API, указав на https://api -kubernetes.node.lan / api .Однако kubectl выдает ошибку из-за неподписанного сертификата, что очевидно.
  • Поместите apiserver.crt во входной файл: определение.Получил ошибку из-за сертификата не подходит для api-kubernetes.node.lan.Также очевидно.
  • Следуя инструкциям [1], создайте подписанный сертификат kube-ca.Теперь браузер вообще ничего не показывает.Использование curl для доступа к https://api -kubernetes.node.lan / api приводит к пустому выводу (я вижу HTTP OK при использовании -v).Kubectl теперь получает следующую ошибку:

    $ kubectl.exe version
    Client Version: version.Info{Major:"1", Minor:"11", GitVersion:"v1.11.0", GitCommit:"91e7b4fd31fcd3d5f436da26c980becec37ceefe", GitTreeState:"clean", BuildDate:"2018-06-27T20:17:28Z", GoVersion:"go1.10.2", Compiler:"gc", Platform:"windows/amd64"}
    Error from server: the server responded with the status code 0 but did not return more information
    

При попытке сравнить apiserver.pem и мой сгенерированный сертификат я вижу единственную разницу:

apiserver.pem
X509v3 Key Usage:
                 Digital Signature, Non Repudiation, Key Encipherment
generated.crt
X509v3 Extended Key Usage:
                 TLS Web Server Authentication

Входная конфигурация:

---
kind: Ingress
apiVersion: extensions/v1beta1
metadata:
  name: kubernetes-api
  namespace: default  
  labels:
    app: kubernetes
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  tls:
    - secretName: kubernetes-api-cert
      hosts:    
        - api-kubernetes.node.lan

  rules:
  - host: api-kubernetes.node.lan
    http:
      paths:
      - path: "/"
        backend:
          serviceName: kubernetes
          servicePort: 6443

Ссылки: [1] https://db -blog.web.cern.ch / blog / lukas-gedvilas / 2018-02-creation-tls-сертификаты-using-kubernetes-апи

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Частично отвечая на мой собственный вопрос.

На данный момент я удовлетворен аутентификацией на основе токенов: это позволяет иметь отдельные уровни доступа и не допускать пользователей оболочки.Аутентификация панели инструментов на основе Keycloak работала, но после входа в систему не удалось выйти из системы.Нет выхода из системы.: D

И чтобы получить доступ к самой панели через Ingress, я нашел где-то работающее правило перезаписи: nginx.ingress.kubernetes.io/configuration-snippet: "rewrite ^(/ui)$ $1/ui/ permanent;"

Одно замечание, что пользовательский интерфейс должен быть доступен через косую черту "/": https://server_address/ui/

0 голосов
/ 19 октября 2018

Вы сможете делать это, пока вы выставляете модуль kube-apiserver в пространстве имен kube-system.Я попробовал это так:

$ kubectl -n kube-system expose pod kube-apiserver-xxxx --name=apiserver --port 6443
service/apiserver exposed
$ kubectl -n kube-system get svc
NAME                      TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                       AGE
apiserver                 ClusterIP   10.x.x.x         <none>        6443/TCP                      1m
...

Затем перейдите на компьютер кластера и укажите мой ~/.kube/config контекстный IP 10.x.x.x:6443

clusters:
- cluster:
    certificate-authority-data: [REDACTED]
    server: https://10.x.x.x:6443
  name: kubernetes
...

Затем:

$ kubectl version --insecure-skip-tls-verify
Client Version: version.Info{Major:"1", Minor:"11", GitVersion:"v1.11.2", GitCommit:"bb9ffb1654d4a729bb4cec18ff088eacc153c239", GitTreeState:"clean", BuildDate:"2018-08-07T23:17:28Z", GoVersion:"go1.10.3", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"11", GitVersion:"v1.11.2", GitCommit:"bb9ffb1654d4a729bb4cec18ff088eacc153c239", GitTreeState:"clean", BuildDate:"2018-08-07T23:08:19Z", GoVersion:"go1.10.3", Compiler:"gc", Platform:"linux/amd64"}

Я использовал --insecure-skip-tls-verify, потому что 10.x.x.x должен быть действителен в сертификате сервера.На самом деле вы можете исправить это следующим образом: Настроить AWS publicIP для Мастера в Кубернетесе

Так что, возможно, пара вещей в вашем случае:

  1. Поскольку выПервоначально обслуживая SSL на Ingress, вы должны использовать те же сертификаты сервера kubeapi под /etc/kubernetes/pki/ на своем главном сервере
  2. . Вам необходимо добавить внешний IP-адрес или имя к сертификату, где предоставляется Ingress.Выполните что-то вроде этого: Настройте AWS publicIP для мастера в Kubernetes
...