重點在於解決單一Image在不同階段甚至不同應用仍可以重複使用,而不用重建Image。
Хорошая практика заключается в том, чтобы сделать образы контейнеров как можно более многоразовыми. Один и тот же образ можно использовать для разработки, постановки и производства. Еще лучше, если один и тот же образ является достаточно универсальным, чтобы его можно было использовать в разных приложениях и сервисах.
ConfigMap
在Pod啟動前會和ConfigMap資訊合併。也就是說透過修改ConfigMap,讓應用城市和服務重複使用image和Pod definition。
Ключевым моментом является то, что ConfigMap объединяется с Pod непосредственно перед его запуском. Это означает, что образ контейнера и само определение Pod можно повторно использовать во многих приложениях, просто изменив используемую ConfigMap.
Создание ConfigMap
只是建立 пара ключ-значение
Использование ConfigMap
- Filesystem當作目錄掛載至Pod,Key作為檔案名稱,檔案內容為value。
- Переменная среды動態設定環境變數
- Аргумент командной строки動態作為命令列參數
Секрет
ПРИМЕЧАНИЕ
K8s預設用明文把敏感資訊存在etcd storage。任何有k8s admin權限的人就可以存取全部的secret。新版K8s開始支援雲端加密儲存(cloud key store),可以提高敏感資料安全性。
По умолчанию секреты Kubernetes хранятся в виде обычного текста в хранилище etcd для кластера. В зависимости от ваших требований, это может оказаться недостаточной мерой безопасности. В частности, любой, кто имеет права администрирования кластера, сможет прочитать все секреты в кластере. В последних версиях Kubernetes была добавлена поддержка шифрования секретов с помощью предоставленного пользователем ключа, обычно интегрированного в облачное хранилище ключей. Кроме того, большинство облачных хранилищ ключей имеют интеграцию с гибкими томами Kubernetes, что позволяет полностью отказаться от секретов Kubernetes и полагаться исключительно на хранилище ключей облачного провайдера. Все эти варианты должны предоставить вам достаточно инструментов для создания профиля безопасности, который соответствует вашим потребностям.
Создание секретов
$ kubectl create secret generic kuard-tls
--from-file=kuard.crt
--from-file=kuard.key
$ kubectl describe secrets kuard-tls
Name: kuard-tls
Namespace: default
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
kuard.crt: 1050 bytes
kuard.key: 1679 bytes
Потребление секретов
Объемы секретов
secrets volumes透過kubelet管理,並在Pod建立時產生。secrets是儲存在tmpfs volumes,所以不會直接寫到node disk。
Секретные данные могут быть открыты для Pods с помощью типа тома secrets. Тома секретов управляются кубелетом и создаются во время создания Pod. Секреты хранятся на томах tmpfs (они же RAM-диски), и как таковые не записываются на диск на узлах.
Частные реестры Docker
K8s提供額外方式處理docker pull 的憑證問題。
$ k create secret --help
Create a secret using specified subcommand.
Available Commands:
docker-registry Create a secret for use with a Docker registry
generic Create a secret from a local file, directory or literal value
tls Create a TLS secret
Usage:
kubectl create secret [flags] [options]
kubectl create secret docker-registry my-image-pull-secret
--docker-username=<username>
--docker-password=<password>
--docker-email=<email-address>
Ограничения именования
ConfigMap以UTF-8儲存,K8s1.6之後ConfigMap無法儲存binary。
Secret以base64加密儲存,所以可以儲存binary。
ConfigMap和Secret最大不得超過1MB。
Значения данных ConfigMap — это простой текст UTF-8, указанный непосредственно в манифесте. Начиная с версии Kubernetes 1.6, ConfigMap не могут хранить двоичные данные. Секретные значения данных содержат произвольные данные, закодированные с помощью base64. Использование кодировки base64 делает возможным хранение двоичных данных. Однако это усложняет управление секретами, хранящимися в файлах YAML, поскольку значение в кодировке base64 должно быть помещено в YAML. Обратите внимание, что максимальный размер ConfigMap или секрета составляет 1 МБ.
Управление картами конфигурации и секретами
更新過後會直接自動推送到正在使用該ConfigMap/Secret的磁碟區。但是目前K8s並沒有內建發送信號通知應用程式的功能。一切取決於應用程式實做方式來決定何時該套用新的>設定檔。
Как только ConfigMap или секрет обновляются с помощью API, они автоматически распространяются на все тома, использующие этот ConfigMap или секрет. Это может занять несколько секунд, но листинг файлов и их содержимое, видимое kuard, будут обновлены с учетом новых значений. Используя эту функцию обновления в реальном времени, вы можете обновлять конфигурацию приложений, не перезапуская их.
В настоящее время не существует встроенного способа сигнализировать приложению о развертывании новой версии ConfigMap. Приложение (или какой-либо вспомогательный скрипт) должно само искать изменения в конфигурационных файлах и перезагружать их.