diff --git a/readme.md b/readme.md index d94d3eb..7ea5249 100644 --- a/readme.md +++ b/readme.md @@ -68,4 +68,5 @@ * [13.4. инструменты для упрощения написания конфигурационных файлов. Helm и Jsonnet](/src/homework/13-kubernetes-config/13.4) * [13.5. поддержка нескольких окружений на примере Qbec](/src/homework/13-kubernetes-config/13.5) * [14.1. Создание и использование секретов](/src/homework/14-kubernetes-security/14.1) -* [14.2 Синхронизация секретов с внешними сервисами. Vault](/src/homework/14-kubernetes-security/14.2) +* [14.2. Синхронизация секретов с внешними сервисами. Vault](/src/homework/14-kubernetes-security/14.2) +* [14.3. Карты конфигураций](/src/homework/14-kubernetes-security/14.3) diff --git a/src/homework/14-kubernetes-security/14.2/readme.md b/src/homework/14-kubernetes-security/14.2/readme.md index c2bcbd4..adee719 100644 --- a/src/homework/14-kubernetes-security/14.2/readme.md +++ b/src/homework/14-kubernetes-security/14.2/readme.md @@ -1,5 +1,5 @@ Выполнение [домашнего задания](https://github.com/netology-code/clokub-homeworks/blob/clokub-5/14.2.md) -по теме "14.2 Синхронизация секретов с внешними сервисами. Vault" +по теме "14.2. Синхронизация секретов с внешними сервисами. Vault" ## Q/A diff --git a/src/homework/14-kubernetes-security/14.3/config/configmaps.json b/src/homework/14-kubernetes-security/14.3/config/configmaps.json new file mode 100644 index 0000000..ff18dc3 --- /dev/null +++ b/src/homework/14-kubernetes-security/14.3/config/configmaps.json @@ -0,0 +1,54 @@ +{ + "apiVersion": "v1", + "items": [ + { + "apiVersion": "v1", + "data": { + "name": "netology.ru" + }, + "kind": "ConfigMap", + "metadata": { + "creationTimestamp": "2022-12-29T03:11:33Z", + "name": "domain", + "namespace": "default", + "resourceVersion": "712", + "uid": "2e6bb329-e5f9-42c5-80d1-b8624b7f9a67" + } + }, + { + "apiVersion": "v1", + "data": { + "ca.crt": "-----BEGIN CERTIFICATE-----\nMIIDBjCCAe6gAwIBAgIBATANBgkqhkiG9w0BAQsFADAVMRMwEQYDVQQDEwptaW5p\na3ViZUNBMB4XDTIyMTIyODAzMDI0MVoXDTMyMTIyNjAzMDI0MVowFTETMBEGA1UE\nAxMKbWluaWt1YmVDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM34\nAUZIANcvNE1YiyMmxh+E3428vGfAIcNdXSYxLY19GFvplQSHz5/fnsUd1fmFBYg9\ntJeJHxjwTGLQtAFkcX0stgNO2AC1IpVHo2DFSeQqXIdQ0ibpXBZPV3/FwdrUxz1x\nFEKaP6SO+OMcoEtyuHiTT+gnnGGYp4SD745FKaXUoIfhd0RoP/9MO57vv3/5WdBg\n3ioY0+3N4j5LFrIM3HVH1s4GU47MO6l8MnItQkZKJwg8DvPNBHorS66wVooE9jRk\nCOd3M09TjspM+iufGexl3TlTybvAjbUX26gcS6pgROD1mKyVpubHc4ji7lPduTSr\nK9FFj3fcnwgWNoenhwsCAwEAAaNhMF8wDgYDVR0PAQH/BAQDAgKkMB0GA1UdJQQW\nMBQGCCsGAQUFBwMCBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW\nBBTGW/hzQPfiVnIuh0XZez6fcRE5mzANBgkqhkiG9w0BAQsFAAOCAQEAZcCYq9LY\nQjfWp6UTzeqf97Egg6Mmx8rvRkd2+cKSbeMrRZLwpBHgMDQqYolwyMzDZP3/jEaE\ngQ9sEw/trce8aDalHe0g2wUnl4g0qJqGHDu7D3PE+GsymLr6rA2XAdaiKG8z0wxx\nImQB1fFecuMgZb1RCbLnGD/vUzcG0uLHphEbWv9sgU8TUsiRrRO7uSIyaIKTgoyU\nfv6rb38anA0ikKYQDdhEU4sEJNDE0VWgbpJek9AwnNWZiogMst/+fU3//sb14mh/\n8S1MeJLOHHgEF3sxGHv1nFHLajV5WMtcR9uJV6fkRIEl2EfnJbUSb4RfaJchEXbO\n4/v9V5XNnoEjDg\u003d\u003d\n-----END CERTIFICATE-----\n" + }, + "kind": "ConfigMap", + "metadata": { + "annotations": { + "kubernetes.io/description": "Contains a CA bundle that can be used to verify the kube-apiserver when using internal endpoints such as the internal service IP or kubernetes.default.svc. No other usage is guaranteed across distributions of Kubernetes clusters." + }, + "creationTimestamp": "2022-12-29T03:03:23Z", + "name": "kube-root-ca.crt", + "namespace": "default", + "resourceVersion": "332", + "uid": "24b389ea-2f88-4777-a755-53858d758e50" + } + }, + { + "apiVersion": "v1", + "data": { + "nginx.conf": "server {\n listen 80;\n server_name netology.ru www.netology.ru;\n access_log /var/log/nginx/domains/netology.ru-access.log main;\n error_log /var/log/nginx/domains/netology.ru-error.log info;\n location / {\n include proxy_params;\n proxy_pass http://10.10.10.10:8080/;\n }\n}\n" + }, + "kind": "ConfigMap", + "metadata": { + "creationTimestamp": "2022-12-29T03:11:21Z", + "name": "nginx-config", + "namespace": "default", + "resourceVersion": "703", + "uid": "8dfa9f4c-6d89-4fbf-b3f6-1cd87b16710b" + } + } + ], + "kind": "List", + "metadata": { + "resourceVersion": "" + } +} diff --git a/src/homework/14-kubernetes-security/14.3/config/nginx-config.yml b/src/homework/14-kubernetes-security/14.3/config/nginx-config.yml new file mode 100644 index 0000000..42ccfc6 --- /dev/null +++ b/src/homework/14-kubernetes-security/14.3/config/nginx-config.yml @@ -0,0 +1,20 @@ +apiVersion: v1 +data: + nginx.conf: | + server { + listen 80; + server_name netology.ru www.netology.ru; + access_log /var/log/nginx/domains/netology.ru-access.log main; + error_log /var/log/nginx/domains/netology.ru-error.log info; + location / { + include proxy_params; + proxy_pass http://10.10.10.10:8080/; + } + } +kind: ConfigMap +metadata: + creationTimestamp: "2022-12-29T03:11:21Z" + name: nginx-config + namespace: default + resourceVersion: "703" + uid: 8dfa9f4c-6d89-4fbf-b3f6-1cd87b16710b diff --git a/src/homework/14-kubernetes-security/14.3/config/nginx.conf b/src/homework/14-kubernetes-security/14.3/config/nginx.conf new file mode 100644 index 0000000..dd464a7 --- /dev/null +++ b/src/homework/14-kubernetes-security/14.3/config/nginx.conf @@ -0,0 +1,10 @@ +server { + listen 80; + server_name netology.ru www.netology.ru; + access_log /var/log/nginx/domains/netology.ru-access.log main; + error_log /var/log/nginx/domains/netology.ru-error.log info; + location / { + include proxy_params; + proxy_pass http://10.10.10.10:8080/; + } +} diff --git a/src/homework/14-kubernetes-security/14.3/config/test_pod.yml b/src/homework/14-kubernetes-security/14.3/config/test_pod.yml new file mode 100644 index 0000000..8c52b04 --- /dev/null +++ b/src/homework/14-kubernetes-security/14.3/config/test_pod.yml @@ -0,0 +1,50 @@ +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: test-env-config + labels: + app: test +data: + SOME_USER: user + SOME_PASSWORD: passwd +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: test-file-config + labels: + app: test +data: + foo.json: | + {"foo": "bar", "baz": 123} +--- +apiVersion: v1 +kind: Pod +metadata: + labels: + app: test + name: test-pod + namespace: default +spec: + containers: + - image: praqma/network-multitool:alpine-extra + imagePullPolicy: IfNotPresent + name: test-container + env: + - name: SOME_NGINX_USER + valueFrom: + configMapKeyRef: + name: test-env-config + key: SOME_USER + envFrom: + - configMapRef: + name: test-env-config + volumeMounts: + - mountPath: "/opt/config" + name: "config" + readOnly: true + volumes: + - name: "config" + configMap: + name: test-file-config diff --git a/src/homework/14-kubernetes-security/14.3/readme.md b/src/homework/14-kubernetes-security/14.3/readme.md new file mode 100644 index 0000000..e2279c6 --- /dev/null +++ b/src/homework/14-kubernetes-security/14.3/readme.md @@ -0,0 +1,203 @@ +Выполнение [домашнего задания](https://github.com/netology-code/clokub-homeworks/blob/clokub-5/14.3.md) +по теме "14.3. Карты конфигураций" + +## Q/A + +### Задача 1 + +> Выполните приведённые команды в консоли. Получите вывод команд. Сохраните +> задачу 1 как справочный материал. + +> #### Как создать карту конфигураций? +> +> ``` +> kubectl create configmap nginx-config --from-file=config/nginx.conf +> kubectl create configmap domain --from-literal=name=netology.ru +> ``` + +```text +configmap/nginx-config created +configmap/domain created +``` + +> #### Как просмотреть список карт конфигураций? +> +> ``` +> kubectl get configmap +> ``` + +```text +NAME DATA AGE +domain 1 15s +kube-root-ca.crt 1 8m25s +nginx-config 1 27s +``` + +> #### Как просмотреть карту конфигурации? +> +> ``` +> kubectl get configmap nginx-config +> kubectl describe configmap domain +> ``` + +```text +NAME DATA AGE +nginx-config 1 39s +``` + +```text +Name: domain +Namespace: default +Labels: +Annotations: + +Data +==== +name: +---- +netology.ru + +BinaryData +==== + +Events: +``` + +> #### Как получить информацию в формате YAML и/или JSON? +> +> ``` +> kubectl get configmap nginx-config -o yaml +> kubectl get configmap domain -o json +> ``` + +```yaml +apiVersion: v1 +data: + nginx.conf: | + server { + listen 80; + server_name netology.ru www.netology.ru; + access_log /var/log/nginx/domains/netology.ru-access.log main; + error_log /var/log/nginx/domains/netology.ru-error.log info; + location / { + include proxy_params; + proxy_pass http://10.10.10.10:8080/; + } + } +kind: ConfigMap +metadata: + creationTimestamp: "2022-12-29T03:11:21Z" + name: nginx-config + namespace: default + resourceVersion: "703" + uid: 8dfa9f4c-6d89-4fbf-b3f6-1cd87b16710b +``` + +```json +{ + "apiVersion": "v1", + "data": { + "name": "netology.ru" + }, + "kind": "ConfigMap", + "metadata": { + "creationTimestamp": "2022-12-29T03:11:33Z", + "name": "domain", + "namespace": "default", + "resourceVersion": "712", + "uid": "2e6bb329-e5f9-42c5-80d1-b8624b7f9a67" + } +} +``` + +> #### Как выгрузить карту конфигурации и сохранить его в файл? +> +> ``` +> kubectl get configmaps -o json > config/configmaps.json +> kubectl get configmap nginx-config -o yaml > config/nginx-config.yml +> ``` + +Файлы: +* [configmaps.json](./config/configmaps.json) +* [nginx-config.yml](./config/nginx-config.yml) + +> #### Как удалить карту конфигурации? +> +> ``` +> kubectl delete configmap nginx-config +> ``` + +```text +configmap "nginx-config" deleted +``` + +> ### Как загрузить карту конфигурации из файла? +> +> ``` +> kubectl apply -f config/nginx-config.yml +> ``` + +```text +configmap/nginx-config created +``` + +### Задача 2 + +> Выбрать любимый образ контейнера, подключить карты конфигураций и проверить +> их доступность как в виде переменных окружения, так и в виде примонтированного +> тома. + +За основу будет взят образ `praqma/network-multitool`. В рамках конфигурации [test_pod.yml](./config/test_pod.yml) +описаны два `ConfigMap`: один для значений переменных окружения, второй - для файла. Затем они используются в рамках +конфигурации пода. + +Применение конфигурации: + +```shell +kubectl apply -f config/test_pod.yml +kubectl get pods +``` + +```text +configmap/test-env-config created +configmap/test-file-config created +pod/test-pod created + +NAME READY STATUS RESTARTS AGE +test-pod 1/1 Running 0 21s +``` + +Проверка, что переменные окружения присутствуют в контейнере: + +```shell +kubectl exec -it pod/test-pod -- printenv | grep SOME +``` + +```shell +SOME_PASSWORD=passwd +SOME_USER=user +SOME_NGINX_USER=user +``` + +Проверка, что успешно создан файл по `ConfigMap` внутри контейнера: + +```shell +kubectl exec -it pod/test-pod -- ls -la /opt/config +``` + +```text +total 12 +drwxrwxrwx 3 root root 4096 Dec 29 03:23 . +drwxr-xr-x 1 root root 4096 Dec 29 03:23 .. +drwxr-xr-x 2 root root 4096 Dec 29 03:23 ..2022_12_29_03_23_06.2057404337 +lrwxrwxrwx 1 root root 32 Dec 29 03:23 ..data -> ..2022_12_29_03_23_06.2057404337 +lrwxrwxrwx 1 root root 15 Dec 29 03:23 foo.json -> ..data/foo.json +``` + +```shell +kubectl exec -it pod/test-pod -- cat /opt/config/foo.json +``` + +```text +{"foo": "bar", "baz": 123} +```