Я точно воспроизвел ваш сценарий и постараюсь объяснить, как я могу это исправить
Воспроизведение того же сценария
- Создайте зашифрованный файл на
/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, дождитесь полного запуска и попробуйте перечислить снова узел.
Пожалуйста, дайте знать, если это помогло!