Как добавить параметр encryption-provider-config в kube-apiserver? - PullRequest
0 голосов
/ 20 января 2020

Я использую версию kubernetes 1.15.7.

Я пытаюсь перейти по ссылке https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/#understanding -the-encryption-at-rest-configuration , чтобы включить 'encryption-provider -config 'опция для' kube-apiserver '.

Я отредактировал файл' /etc/kubernetes/manifests/kube-apiserver.yaml 'и предоставил ниже опцию

- --encryption-provider-config=/home/rtonukun/secrets.yaml

Но после этого Я получаю сообщение об ошибке ниже.

The connection to the server 171.69.225.87:6443 was refused - did you specify the right host or port?

со всеми командами kubectl, такими как 'kubectl get no'.

В основном, как мне выполнить эти два шага ниже?

3. Set the --encryption-provider-config flag on the kube-apiserver to point to the location of the config file.

4. Restart your API server.

1 Ответ

3 голосов
/ 22 января 2020

Я точно воспроизвел ваш сценарий и постараюсь объяснить, как я могу это исправить

Воспроизведение того же сценария

  1. Создайте зашифрованный файл на /home/rabello/secrets.yaml :
apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
  - resources:
    - secrets
    providers:
    - aescbc:
        keys:
        - name: key1
          secret: r48bixfj02BvhhnVktmJJiuxmQZp6c0R60ZQBFE7558=
    - identity: {}

Отредактируйте файл /etc/kubernetes/manifests/kube-apiserver.yaml и установите флаг --encryption-provider-config:

   - --encryption-provider-config=/home/rabello/encryption.yaml

Сохраните файл и выйдите.

Когда я проверил статус pods получил ту же ошибку:

$ kubectl get pods -A
The connection to the server 10.128.0.62:6443 was refused - did you specify the right host or port?

Устранение неполадок

Поскольку kubectl больше не работает, я попытался просмотреть работающие контейнеры напрямую, используя команду docker, затем я вижу kube Контейнер -apiserver был недавно воссоздан:

$ docker ps 
CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS              PORTS               NAMES
54203ea95e39        k8s.gcr.io/pause:3.1   "/pause"                 1 minutes ago       Up 1 minutes                            k8s_POD_kube-apiserver-lab-1_kube-system_015d9709c9881516d6ecf861945f6a10_0
...

Kubernetes хранит журналы созданных модулей в каталоге /var/log/pods, я проверил файл журнала kube-apiserver и нашел ценную информацию:

{"log": «Ошибка: ошибка при открытии файла конфигурации поставщика шифрования \» / home / rabello / encryption.yaml \ »: открыть / home / rabello / encryption.yaml: такого файла или каталога нет \ n "," stream ":" stderr "," time ":" 2020-01-22T13: 28: 46.772768108Z "}

* 1 033 *

Объяснение

Взглянув на файл манифеста kube-apiserver.yaml можно увидеть команду kube-apiserver, она запускается в контейнер, поэтому им нужно, чтобы файл encryption.yaml был смонтирован в контейнер.

Если вы проверите volumeMounts в этом файле, вы увидите, что в контейнере по умолчанию монтируются только следующие пути:

  • / etc / ssl / certs
  • / etc / ca-сертификаты
  • / etc / kubernetes / pki
  • / usr / local / share / ca-сертификаты
  • / usr / share / ca-Certificates

    ...
        volumeMounts:
        - mountPath: /etc/ssl/certs
          name: ca-certs
          readOnly: true
        - mountPath: /etc/ca-certificates
          name: etc-ca-certificates
          readOnly: true
        - mountPath: /etc/kubernetes/pki
          name: k8s-certs
          readOnly: true
        - mountPath: /usr/local/share/ca-certificates
          name: usr-local-share-ca-certificates
          readOnly: true
        - mountPath: /usr/share/ca-certificates
          name: usr-share-ca-certificates
          readOnly: true
    ...

Исходя из вышеизложенных фактов, мы можем предположить, что apiserver не запустился, поскольку /home/rabello/encryption.yaml фактически не смонтирован в контейнере.

Как решить

Я вижу 2 способа решения этой проблемы:

1-й - Скопируйте файл шифрования в /etc/kubernetes/pki (или любой из указанных выше путей) и измените путь в /etc/kubernetes/kube-apiserver.yaml:

   - --encryption-provider-config=/etc/kubernetes/encryption.yaml

Сохраните файл и дождитесь перезапуска apiserver.

2nd - Создайте новый volumeMounts в кубе- apiser ver.yaml манифест для монтирования пользовательского каталога из узла в контейнер.

Давайте создадим новый каталог в /etc/kubernetes/secret (домашняя папка не подходит для хранения файлов конфигурации =)).

Редактировать /etc/kubernetes/manifests/kube-apiserver.yaml:

...
    - --encryption-provider-config=/etc/kubernetes/secret/encryption.yaml
...
  volumeMounts:
    - mountPath: /etc/kubernetes/secret
      name: secret
      readOnly: true
...
  volumes:
    - hostPath:
      path: /etc/kubernetes/secret
      type: DirectoryOrCreate
    name: secret
...

После сохранения файла kubernetes смонтирует путь к узлу /etc/kubernetes/secret в тот же путь в контейнер apiserver, дождитесь полного запуска и попробуйте перечислить снова узел.

Пожалуйста, дайте знать, если это помогло!

...