Заметки по Kubernetes (11) — Контейнеризация информации о конфигурации

задняя часть Kubernetes
Заметки по Kubernetes (11) — Контейнеризация информации о конфигурации

Это 14-й день моего участия в Gengwen Challenge.Подробности о мероприятии:Обновить вызов

Одиннадцатый информационный контейнер конфигурации

k8s предоставляет два специальных типа томов хранения: configMap и secret.В большинстве случаев он не предоставляет место для хранения POD, но предоставляет пользователям возможность вводить информацию о конфигурации извне кластера внутрь POD.

  • Какие существуют способы контейнеризации информации о конфигурации
  1. Настройте параметры командной строки, такие как: команда, аргументы, передача различных параметров в соответствии с аргументами для запуска контейнера как различных функций.
  2. Информация о конфигурации заносится непосредственно в образ, но этот метод очень негибкий: этот образ можно применить только к одному сценарию использования, и он чрезмерно связан.
  3. Переменные среды, Cloud Native поддерживает загрузку конфигурации через переменные среды или использование сценария ENTRYPOINT для предварительной обработки переменных среды в информацию о конфигурации.
  4. Объем хранилища, в контейнере при запуске монтирования тома хранилища, тома хранилища или определенной конфигурации, приложения для монтирования каталога файла конфигурации
  • Секрет VS Configmap
相同点:
-   key / value 的形式 
-   属于某个特定的 namespace 
-   可以导出到环境变量 
-   可以通过目录/文件形式挂载(支持挂载所有key和部分key)

不同点:
-   Secret 可以被 ServerAccount 关联(使用) 
-   Secret 可以存储 register 的鉴权信息,用在 ImagePullSecret 参数中,用于拉取私有仓库的镜像 
-   Secret 支持 Base64 加密 
-   Secret 分为 kubernetes.io/Service Account,kubernetes.io/dockerconfigjson,Opaque三种类型, Configmap 不区分类型 
-   Secret 文件存储在tmpfs文件系统中,Pod 删除后 Secret文件也会对应的删除。

11.1 POD получает переменные окружения

  • env, см.: kubectl, объяснить pods.spec.containers.env
name              <string>  # 变量名称
value	          <string>  # 变量的值
valueFrom         <Object>  # 引用值,如:configMap 的某个键、POD 定义中的字段名,如:metadata.labels
resourceFieldRef  <Object>  # 引用资源限制中的值
secretKeyRef      <Object>  # 引用 secretKey

11.2 configMap

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

  1. Ресурс configMap может быть связан с текущим POD. POD считывает данные из configMap и передает их в переменную во внутреннем контейнере POD. После внедрения переменной контейнер можно перезапустить.
  2. Ресурс configMap может быть подключен к текущему POD как путь к файловой системе. Этот каталог является именно тем путем, по которому приложение может прочитать файл конфигурации, а контейнер может прочитать информацию о конфигурации. Когда configMap будет изменен, он уведомит POD , POD может быть перегружен.

Вся информация о конфигурации в каждой конфигурации хранится как конфигурация ключа.

  • Список формат, см.: Kubectl объяснить configmap
apiVersion	<string>              # 版本号
binaryData	<map[string]string>   # 二进制的数据
data	    <map[string]string>   # 键值对的数据
kind	    <string>              # 对象类型
metadata	<Object>              # 对象元数据
  • Создать из командной строки
# 创建名为 my-config 的 configMap,它的数据来自目录中的文件,键为文件名,值为文件内容
kubectl create configmap my-config --from-file=path/to/dir

# 创建名为 my-config 的 configMap,它的数据来自文件中的键值对
kubectl create configmap my-config --from-file=path/to/file

# 创建名为 my-config 的 configMap,也可以手动指定键的名称
kubectl create configmap my-config --from-file=key1=/path/to/bar/file1.txt --from-file=key2=/path/to/bar/file2.txt

# 从字面量中创建
kubectl create configmap my-config --from-literal=key1=config1 --from-literal=key2=config2

# 从env文件中命名 my-config
kubectl create configmap my-config --from-env-file=path/to/bar.env

11.2.1 Инжектировать POD ENV

  • Создайте ConfigMap и используйте в POD ENV
apiVersion: v1
kind: ConfigMap                                        # 创建 ConfigMap 对象
metadata:
  name: nginx-config
  namespace: default
data:
  server_name: myapp.kaliarch.com                       # 键值对数据
  nginx_port: |                                        # 键值对数据,此处为 nginx 配置文件,需要注意换行的写法
    server {
        server_name  myapp.kaliarch.com;
        listen  80;
        root  /data/web/html;
    }

---
apiVersion: v1
kind: Pod
metadata:
  name: pod-configmap-demo
  namespace: default
  labels:
    app: myapp
    tier: frontend
  annotations:
    kaliarch.com/created-by: "cluster amdin"
spec:
  containers:
    - name: myapp
      image: ikubernetes/myapp:v1
      ports:
        - name: http
          containerPort: 80
      env:
        - name: NGINX_SERVER_PORT          # 定义容器内变量的名字,容器需要在启动的时候使用 ENTRYPOINT 脚本将环境变量转换为应用的配置文件
          valueFrom:                       # 值来自于 configMap 对象中
            configMapKeyRef:               # 引用 configMap 对象
              name: nginx-config           # configMap 对象的名字
              key: nginx_port              # 引用 configMap 中的哪个 key
              optional: true               # 相对 POD 启动是否为可选,如果 configMap 中不存在这个值,true 则不阻塞 POD 启动
        - name: NGINX_SERVER_NAME          # 定义容器内变量的名字,使用 exec 进入容器会发现变量已经在启动容器前注入容器内部了。
          valueFrom:
            configMapKeyRef:
              name: nginx-config
              key: server_name

11.2.2 Установка в качестве тома POD

  • Данные в configMap можно монтировать как файлы в контейнере, и при изменении данных в configMap соответственно изменятся и файлы в контейнере, но процесс в контейнере не будет перегружен.
apiVersion: v1
kind: ConfigMap                                     # 创建 ConfigMap
metadata:
  name: nginx-config-volumes
  namespace: default
data:                                               # ConfigMap 中保存了两个数据,
  index: |                                          # 数据1,它可以在 container 中使用 ENV 注入环境变量,也可以在 container 中使用 volumeMounts 挂载成为文件
    <h1>this is a test page<h1>
  vhost: |                                          # 数据2,它可以在 container 中使用 ENV 注入环境变量,也可以在 container 中使用 volumeMounts 挂载成为文件
    server {                                                                                                                                  
        listen       80;                                                                                                                      
        server_name  localhost;                                                                                                               
                                                                                                                                              
        location / {                                                                                                                          
            root   /usr/share/nginx/html;                                                                                                     
            index  index.html index.htm;                                                                                                      
        }                                                                                                                                     
                                                                                                                                              
        error_page   500 502 503 504  /50x.html;                                                                                              
        location = /50x.html {                                                                                                                
            root   /usr/share/nginx/html;                                                                                                     
        }                                                                                                                                     
                                                                                                                                              
        location = /hostname.html {                                                                                                           
            alias /etc/hostname;                                                                                                              
        }                                                                                                                                     
    } 
    server {
        server_name  myapp.kaliarch.com;
        listen  80;
        root  /data/web/html;
    }

---
apiVersion: v1
kind: Pod
metadata:
  name: pod-configmap-volumes-demo
  namespace: default
  labels:
    app: myapp
    tier: frontend
  annotations:
    kaliarch.com/created-by: "cluster amdin"
spec:
  containers:
    - name: myapp
      image: ikubernetes/myapp:v1
      ports:
        - name: http
          containerPort: 80
      volumeMounts:
        - name: nginx-conf
          mountPath: /etc/nginx/conf.d
          readOnly: true
        - name: nginx-page
          mountPath: /data/web/html/
          readOnly: true
  volumes:                                               # 定义卷
    - name: nginx-conf                                   # 定义卷的名字
      configMap:                                         # 该卷的类型为 configMap
        name: nginx-config-volumes                       # 从命名空间中读取哪个名字的 configMap
        items:                                           # 定义 configMap 数据到文件的映射,如果不定义则使用 configMap 中的键为文件名称,值为文件内容
          - key: vhost                                   # 使用 configMap 哪个键
            path: www.conf                               # 将 configMap 中的数据,映射为容器内哪个文件名称
            mode: 644                                    # 指明文件的权限
    - name: nginx-page
      configMap:
        name: nginx-config-volumes
        items:
          - key: index
            path: index.html
            mode: 644
  • После запуска войдите в контейнер, чтобы проверить, нормально ли смонтирован файл.
kubectl exec -it pod-configmap-volumes-demo -c myapp -- /bin/sh
  • Используйте команду curl, чтобы убедиться, что ее можно использовать в обычном режиме.
$ curl 10.244.2.104
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

$ curl -H "Host:myapp.kaliarch.com" 10.244.2.104
<h1>this is a test page<h1>

11.3 secret

configMap хранит данные в открытом тексте. Если вам нужно хранить конфиденциальные данные, вам нужно использовать секрет. Функции секрета и configMap в основном одинаковы, а данные в секрете хранятся не в открытом тексте, а в кодировке base64.

  • секретный тип
docker-registry    # 创建一个 Docker registry 使用的 secret
generic            # 从本地文件,目录或字面值创建一个 secret
tls                # 创建一个 TLS  secret
  • Формат манифеста см. в разделе: kubectl объясните секрет
apiVersion	<string>               # API 版本
data	    <map[string]string>    # 以键值对列出数据,值需要经过 base64 加密
kind	    <string>               # 对象类型
metadata	<Object>               # 元数据
stringData	<map[string]string>    # 明文的数据
type	    <string>               # 数据类型

11.3.1 Аутентификация частного репозитория 1

  • Сначала создайте секрет из командной строки
kubectl create secret docker-registry regsecret --docker-server=registry-vpc.cn-hangzhou.aliyuncs.com --docker-username=admin --docker-password=123456 --docker-email=420123641@qq.com

  • Если вы хотите сохранить как файл, вы можете
kubectl get secret regsecret -o yaml

  • Когда создается POD, имя пользователя и пароль, используемые для извлечения образа из концентратора докеров, kubectl объясняет поле imagePullSecrets в pods.spec.
apiVersion: v1
kind: Pod
metadata:
  name: secret-file-pod
spec:
  containers:
  - name: mypod
    image: redis
  imagePullSecrets:                         # 获取镜像需要的用户名密码
   - name: regsecret                        # secret 对象

11.3.2 Аутентификация частного репозитория 2

  • Сначала создайте секрет из командной строки
kubectl create secret docker-registry regsecret --docker-server=registry-vpc.cn-hangzhou.aliyuncs.com --docker-username=admin --docker-password=123456 --docker-email=420123641@qq.com

  • Создайте пользовательский объект serviceaccount, определите секреты извлечения изображения для объекта serviceaccount.
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin
  namespace: default
imagePullSecrets:
- name: regsecret                       # 指定 secret

  • Создайте POD, используя указанный объект serviceaccount
apiVersion: v1
kind: Pod
metadata:
  name: pod-serviceaccount-demo
  namespace: default
  labels:
    app: myapp
    tier: frontend
spec:
  containers:
    - name: nginx
      image: ikubernetes/myapp:v1
      ports:
        - name: http
          containerPort: 80
  serviceAccountName: admin                          # 使用 serviceaccount 进行拉取镜像的认证,这样更加安全

11.3.3 Создание сертификата TLS

  • Сначала создайте его из командной строки
kubectl create secret tls nginx-secret --cert=tls.crt --key=tls.key

  • Данные в секрете можно смонтировать как файл внутри контейнера, а затем файл сертификата можно использовать внутри контейнера nginx.
apiVersion: v1
kind: Pod
metadata:
  name: pod-configmap-volumes-demo
  namespace: default
  labels:
    app: myapp
    tier: frontend
  annotations:
    kaliarch.com/created-by: "cluster amdin"
spec:
  containers:
    - name: myapp
      image: ikubernetes/myapp:v1
      ports:
        - name: http
          containerPort: 80
      volumeMounts:
        - name: nginx-conf
          mountPath: /etc/nginx/secret
          readOnly: true
  volumes:                                               # 定义卷
    - name: nginx-conf                                   # 定义卷的名字
      configMap:                                         # 该卷的类型为 secret
        name: nginx-secret                               # 从命名空间中读取哪个名字的 secret
        items:                                           # 定义 secret 数据到文件的映射,如果不定义则使用 secret 中的键为文件名称,值为文件内容
          - key: tls.key                                 # 使用 secret 哪个键
            path: www.conf                               # 将 secret 中的数据,映射为容器内哪个文件名称
            mode: 644                                    # 指明文件的权限
          - key: tls.crt
            path: index.html
            mode: 644

разное

Публикуйте свои заметки по адресу:GitHub.com/RedHat Series/Арвин…Добро пожаловать в один клик