Репозиторий для работы над домашними заданиями в рамках курса "DevOps практики и инструменты"
- ДЗ#12 - Технология контейнеризации. Введение в Docker
- ДЗ#13 - Docker-образы. Микросервисы
- ДЗ#14 - Docker: сети, docker-compose
- ДЗ#15 - Устройство Gitlab CI. Построение процесса непрерывной поставки
- ДЗ#16 - Введение в мониторинг. Системы мониторинга
- ДЗ#17 - Мониторинг приложения и инфраструктуры
- ДЗ#18 - Логирование и распределенная трассировка
- ДЗ#19 - Введение в Kubernetes
- ДЗ#20 - Kubernetes. Запуск кластера и приложения Модель безопасности.
- ДЗ#21 - Kubernetes. Networks, Storages
- ДЗ#22 - CI/CD в Kubernetes
- ДЗ#23 - Kubernetes и логирование
- PID - изоляция процессов. Нумерация с 1. При уничтожении умерает весь namespace
- mnt - точки монтирования
- net - изоляция сети
- utc - hostname, domain name
- IPC - коммуникация между процессами
- user - изоляция UID и GID
Команды:
docker info
- информация о приложенииdocker ps
- список запущенных контейнеровdocker ps -a
- список всех контейнеровdocker ps -q
- ID только запущенных контейнеровdocker images
- список сохраненных контейнеровdocker run <image>
- запуск контейнера из образа (docker crate
+docker start
+docker attach
)docker run -d --network=<name> <image_name>
- запуск контейнера с определенной сетьюdocker start <container_id>
- запуск созданного контейнераdocker attach <container_id>
- подключение терминала к контейнеруdocker create
- создание контейнера без запускаdocker inspect <object_id>
- вывод конфигурации объекта docker'adocker kill
- посылает SIGKILL (безусловное завершение процесса)docker stop
- посылает SIGTERM (сигнал остановки приложения), через 10 сек SIGKILLdocker system df
- отображение занятого пространства объектами docker'adocker rm
- удаляет указанные контейнеры,-f
если контйнер запущенdocker rmi
- удаляет образ, если от него не зависят запущенные контейнерыdocker exec
- выполнение команд внутри контейнераdocker logs
- просмотр логовdocker diff
- различия между контейнером и образомdocker volume create <name>
- создание раздела для docker. В последствии, может быть одновременно использован несколькими контейнармиdocker volume ls
- список всех разделовdocker run -v <name>:/target/path
- использование разделаdocker build --tag <name> .
- сброка образа на основе Dockerfiledocker network create <name>
- создание сети для контейнеровdocker network create <name> --driver <driver_type>
- с определенным драйвером, по умолчанию - bridgedocker network connect <network_name> <container_name>
- подключение дополнительной сети к контейнеру
Примеры docker run
docker run --rm -it ubuntu:16.04 bash
docker run -dt nginx:latest
docker run --rm --pid host -ti tehbilly/htop
# -i - запуск контейнера в foreground (docker attach)
# -d - запуск контейнера в background
# -t - создает TTY
# --rm - удаляет контейнер при выходе из него
# --pid host - запуск контейнера в определенном PID namespace
docker-image
- инструмент для создания хостов и установки на них docker-engine
Создание:
docker-machine create <name>
# Создания инстанса в GCE
docker-machine create --driver google \
--google-machine-image https://www.googleapis.com/compute/v1/projects/ubuntu-os-cloud/global/images/family/ubuntu-1604-lts \
--google-machine-type n1-standard-1 \
--google-zone europe-west1-b \
docker-host
При создании инстанса в GCE с помощью docker-machine
используется переменная окружения GOOGLE_PROJECT
для указания управляемого проекта.
Для подключения к инстансу выполнить следующие команды:
docker-machine env <instance_name>
eval "$(docker-machine env <instance_name>)"
При сборке image
из одинакового базового образа первая команда build
кеширует его, а последующие уже будут собираться не с первого шага.
Для запуска контейнеров с определенной переменной окружения применяется ключ --env
. Для указания нескольких переменных, указывается либо файл со значениями, либо несколько таких ключей.
Пример:
docker run -d --network=reddit2 -p 9292:9292 --env POST_SERVICE_HOST=post2 --env COMMENT_SERVICE_HOST=comment2 razin92/ui:1.0
Уменьшение размера образа контейнера.
# Dockerfile.3
# Использование образа Alpine с Ruby
FROM ruby:2.2-alpine
RUN apk update && apk add --virtual build-base
...
# Итоговый размер: 307MB
# Dockerfile.4
# Удаление инструментов для сброки после самой сборки приложения
FROM ruby:2.2-alpine
...
RUN apk update && \
apk add --virtual build-base && \
bundle install &&\
apk del build-base
...
# Итоговый размер: 159MB
Оптимизация как и в UI
Итоговый размер: 157MB
Типы сетей в Docker:
- none - только loobback, сеть изолирована
- host - использует сеть хоста
- bridge - отдельные namespaces сети ("виртуальная" сеть)
- MacVlan - на основе сабинтерфейсов Linux, поддерка 802.1Q
- Overlay - несколько Docker хостов в одну сеть, работает поверх VXLAN
При запуске контейнера можно указать только одну сеть параметром --network=<name>
. Для подключения дополнительных сетей к контейнерам применить команду: docker network connect
. Также несколько сетей могут быть подключены к контейнеру при запуске, если используется docker-compose
.
Docker-compose позволяет запускать сразу несколько контейнеров по заданному сценарию.
Пример:
# docker-compose.yml
version: '3.3'
services:
post_db:
image: mongo:${MONGO_VERSION}
volumes:
- post_db:/data/db
networks:
- reddit
ui:
build: ./ui
image: ${USERNAME}/ui:${UI_VERSION}
ports:
- ${UI_PORT}:${REDDIT_PORT}/tcp
networks:
- ui
post:
build: ./post-py
image: ${USERNAME}/post:${POST_VERSION}
networks:
- reddit
- ui
comment:
build: ./comment
image: ${USERNAME}/comment:${COMMENT_VERSION}
networks:
- reddit
- ui
volumes:
post_db:
networks:
reddit:
ui:
Значения переменных подставляется или из переменных окружения или из файла .env
. Имя проекта docker-compose
присваивается от имени директории, в котором он располагается. Для переопределения этого имени используется параметр -p
или переменная COMPOSE_PROJECT_NAME
.
# .env
COMPOSE_PROJECT_NAME=my_project
MONGO_VERSION=3.2
USERNAME=some_user
UI_VERSION=1.0
POST_VERSION=1.0
COMMENT_VERSION=1.0
UI_PORT=9292
REDDIT_PORT=9292
docker-compose.ovveride.yml
позволяет перезаписывать параметры docker-compose.yml
. Для использования модифицированного кода приложений без пересборки образа можно использовать volumes
. Для перезаписи команды запуска контейнера используется параметр entrypoint
.
# docker-compose.ovveride.yml
version: '3.3'
services:
ui:
volumes:
- ui:/app
entrypoint:
- puma
- --debug
- -w 2
post:
volumes:
- post-py:/app
comment:
volumes:
- comment:/app
entrypoint:
- puma
- --debug
- -w 2
volumes:
ui:
post-py:
comment:
- Создание инстанса при помощи docker-machine
- Запуск контейнера с docker-compose
web:
image: 'gitlab/gitlab-ce:latest'
restart: always
hostname: 'gitlab.example.com'
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://<YOUR-VM-IP>'
ports:
- '80:80'
- '443:443'
- '2222:22'
volumes:
- '/srv/gitlab/config:/etc/gitlab'
- '/srv/gitlab/logs:/var/log/gitlab'
- '/srv/gitlab/data:/var/opt/gitlab'
# образ контейнера по умолчанию
image: ruby:2.4.2
# Стадии конвеера. На каждую стадию может быть несколько джобов
stages:
- build
- test
- review
- stage
- production
# Переменные окружения
variables:
DATABASE_URL: 'mongodb://mongo/user_posts'
# Глобальная задача для джобов, перед их исполнением
before_script:
- cd reddit
- bundle install
# джоб
build_job:
# Переопределение глобальной задачи перед скриптом
before_script:
- cd docker-monolith
# Указание стадии
stage: build
# По тегу могут быть запущены определенные раннеры
tags:
- shell
# "тело" джоба
script:
- echo "Building Reddit Container"
- docker build -t $DOCKER_USER/gitlab_hw:$CI_PIPELINE_ID .
- docker login -u $DOCKER_USER -p $DOCKER_USER_PASSWORD
- docker push $DOCKER_USER/gitlab_hw:$CI_PIPELINE_ID
test_unit_job:
stage: test
services:
- mongo:latest
script:
- ruby simpletest.rb
test_integration_job:
before_script:
- echo 'Gcloud testing'
stage: test
script:
- echo 'Testing 2'
deploy_dev_job:
stage: review
before_script:
- echo $GCLOUD_SERVICE_ACCOUNT_KEY > ./$CI_PIPELINE_ID.json
tags:
- gcp
script:
- echo 'Deploy'
- gcloud auth activate-service-account --key-file=./$CI_PIPELINE_ID.json
- gcloud compute ssh gitlab-ci --force-key-file-overwrite --zone $GCP_ZONE --command "sudo docker run --rm -d --name reddit -p 9292:9292 $DOCKER_USER/gitlab_hw:$CI_PIPELINE_ID"
environment:
name: dev
url: http://$CI_SERVER_HOST:9292
branch review:
stage: review
script: echo "Deploy to $CI_ENVIRONMENT_SLUG"
environment:
name: branch/$CI_COMMIT_REF_NAME
url: http://$CI_ENVIRONMENT_SLUG.example.com
only:
- branches
except:
- master
staging:
stage: stage
# Условия, при котором запускается джоб
when: manual # вручную
only:
- /^\d+\.\d+\.\d+/ # только если коммит создержит этот тег
script:
- echo 'Deploy'
environment:
name: stage
url: https://beta.example.com
production:
stage: production
when: manual
only:
- /^\d+\.\d+\.\d+/
script:
- echo 'Deploy'
environment:
name: production
url: https://example.com
Раннеры - среда исполнения джобов. Исполнители могут быть следующие:
- SSH
- Shell
- Parallels
- VirtualBox
- Docker
- Docker Machine (auto-scaling)
- Kubernetes
- Custom
#! /bin/sh
# Установка GitlabRunner
docker run -d --name gitlab-runner --restart always \
-v /srv/gitlab-runner/config:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/bin/docker:/usr/bin/docker \
gitlab/gitlab-runner:latest
Раннеры регистрируются на проект при помощи токена.
Пример:
#! /bin/sh
# Регистрация нового GitlabRunner Docker Ruby
docker exec -it gitlab-runner gitlab-runner register \
--non-interactive \
--run-untagged \ # если стоит этот флаг, то раннер будет запускаться для джобов без тега
--locked=false \
--url=http://$(docker-machine ip gitlab-ci)/ \
--executor=docker \
--docker-image=ruby:2.4.2 \
--tag-list="linux,xenial,ubuntu,docker" \
--description="docker-runner" \
--registration-token $REGISTRATION_TOKEN
Встроенные переменные используются для вызова в джобах CI/CD. Также могут быть настроены кастомные переменные для проекта.
Для создания и регистрации большого количество раннеров можно использовать скрипты вида, указанного выше. Флаг --non-interactive
отключает вопросы при регистрации раннера. Также требуется указать токен $REGISTRATION_TOKEN
для привязки к проекту.
Для автоматической сборки, публикации и деплоя контейнера с приложением reddit-app
я использовал разные раннеры. Для сборки контейнера и его публикации использовался раннер с экзекутором SHELL. Для корректной работы необходимы данные авторизации на DockerHub DOCKER_USER
и DOCKER_USER_PASSWORD
. Для деплоя приложения использовал контейнер google/cloud-sdk:alpine
. Для корректной работы деплоя из Gitlab-CI в GCP требуются следующие данные и настройки:
- Должен быть включен API
- сервис-аккаунт должен обладать необходимыми правами для исполнения комманд на инстансе
GCLOUD_SERVICE_ACCOUNT_KEY
ключ сервис-аккаунтаGCP_ZONE
зона, в которой находится инстанс
Для интеграции со слаком необходимо в мессанджере настроить кастомную интеграции. Сгенерированный вебхук использовать в настройках GitlabCi в разделе интеграции.
Полезные ссылки:
В качестве системы мониторинга будет рассморен Prometheus
. Просмотр собранных данных возможен через встроенный web-интерфейс. Фильтр и построение отчетов при помощи PromQL
. Настройка параметров мониторинга задается в файле .yml
. Метрики могут быть собраны сторонними решениями - экспортерами.
# Пример конфигурации
global:
scrape_interval: '5s' # Частота сбора метрик
scrape_configs: # параметры сбора метрик
- job_name: 'prometheus'
static_configs:
- targets: # цель сбора метрик
- 'localhost:9090' # endpoint
- job_name: 'percona_mongodb'
static_configs:
- targets:
- 'mongodb-exporter:9216' # сторонний сборщик метрик
В качестве экспортера для мониторинга MongoDB был использован Percona-exporter. Для подключения к MongoDB необходимо указать расположение сервиса в переменной окружения MONGODB_URI
.
Blackbox Exporter
используется для проверок сервисов "снаружи". В данной работе был использован модуль HTTP для проверки доступности сервисов.
# config file
modules: # используемые модули
http_2xx: # название
prober: http # тип опроса
timeout: 5s # интервал
http:
valid_http_versions: ["HTTP/1.1", "HTTP/2"]
valid_status_codes: [] # Defaults to 2xx
method: GET
preferred_ip_protocol: "ip4"
ip_protocol_fallback: false
# интеграция в Prometheus
- job_name: 'blackbox'
metrics_path: /probe # путь до метрик
params:
module:
- http_2xx
static_configs:
- targets: # цли для опроса
- 'http://ui:9292/metrics'
- 'http://comment:9292/metrics'
- 'http://post-py:5000/metrics'
relabel_configs: # настройки отображения
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: blackbox-exporter:9115
# пример получаемых метрик
# TYPE probe_http_duration_seconds gauge
probe_http_duration_seconds{phase="connect"} 0.000162122
probe_http_duration_seconds{phase="processing"} 0.001374135
probe_http_duration_seconds{phase="resolve"} 0.000715442
probe_http_duration_seconds{phase="tls"} 0
probe_http_duration_seconds{phase="transfer"} 0.000160417
# TYPE probe_http_version gauge
probe_http_version 1.1
# TYPE probe_http_status_code gauge
probe_http_status_code 200
# TYPE probe_success gauge
probe_success 1
Для удобства управления и сборки контейнеров исползован Makefile
. Использование: make {имя_операции}
.
# пример
build_ui: # имя операции
cd src/ui && bash ./docker_build.sh # операция
build_post:
cd src/post-py && bash ./docker_build.sh
build_comment:
cd src/comment && bash ./docker_build.sh
build_reddit_app: build_ui build_post build_comment
Для мониторинга контейнеров и используемых ресурсов используется cAdvisor, данные с которого можно забирать в формате Prometheus
. Для визуализации метрик можно использовать Grafana. Grafana
позволяет визуализировать данные с различных источников. Для шаблонных метрик представлены дашборды. Здесь можно посмотреть пример использования метрик из Prometheus с визуализацией в Grafana. Для мониторнига также важны информационные сообщения (алертинг). Для Prometheus
может быть использован alertmanager.
- Makefile был рассмотрен в предыдущем ДЗ. В этом были добавлены новые сборки и настройки.
- Для организации выдачи метрик встроенным функционалом
Docker
в форматеPrometheus
необходимо включить данную возможность в конфигурационном файле/etc/docker/daemon.json
.
# daemon.json
{
"metrics-addr" : "0.0.0.0:9323",
"experimental" : true
}
И добавить в Prometheus
# config file prometheus
...
- job_name: 'docker-host'
static_configs:
- targets:
- 'dockerhost:9323'
...
- Также для мониторига
Docker
можно использоватьTelegraf
. Его конфигурацию можно разделить на разделы и использовать плагины. Используемые в этом ДЗ:input plugins
- плагины, используемые для мониторнига целевой системы иoutput plugins
- плагины, отдающие метрики мониторнига.
# Установка
#!/bin/bash
wget -qO- https://repos.influxdata.com/influxdb.key | sudo apt-key add -
source /etc/lsb-release
echo "deb https://repos.influxdata.com/${DISTRIB_ID,,} ${DISTRIB_CODENAME} stable" | sudo tee /etc/apt/sources.list.d/influxdb.list
sudo apt-get update && sudo apt-get install telegraf
# Часть из настроек Telegraf
[[inputs.docker]]
## Docker Endpoint
## To use TCP, set endpoint = "tcp://[ip]:[port]"
## To use environment variables (ie, docker-machine), set endpoint = "ENV"
endpoint = "unix:///var/run/docker.sock"
[[outputs.prometheus_client]]
## Address to listen on
listen = ":9273"
- Персонализированные алерты для
Prometheus
создаются на основеPromQL
# Пример алерта на 95 процентиль времени ответа UI
...
- alert: UIHighRequestLatency
expr: histogram_quantile(0.95, sum(rate(ui_request_latency_seconds_bucket[5m])) BY (le)) >= 0.030
for: 1m
annotations:
summary: "High UI request latency on {{ $labels.instance }}"
description: "{{ $labels.instance }} has a 95 percentile UI request latency higher than 0.030 s"
...
# Настройка уведомления по e-mail
global:
...
smtp_smarthost: 'smtp.server:465'
smtp_from: '[email protected]'
smtp_auth_username: '[email protected]'
smtp_auth_password: 'secret'
...
route:
receiver: 'slack-notifications'
routes:
...
- match:
severity: page
receiver: 'email-notifications'
...
receivers:
...
- name: 'email-notifications'
email_configs:
- to: '[email protected]'
...
Одним из примеров централизованного хранения логов является ELK
стэк:
1.ElasticSearch - TSDB и поисковый движок для хранения данных 2.Logstash - агрегация и трансформация данных 3.Kibana - визуализация
В данной работе вместо Logstash
использован Fluentd, используясь вместе с другими вышеуказанными инструментами, получил название EFK
.
# Пример конфигурации
<source>
@type forward
port 24224
bind 0.0.0.0
</source>
<match *.**>
@type copy
<store>
@type elasticsearch
host elasticsearch
port 9200
logstash_format true
logstash_prefix fluentd
logstash_dateformat %Y%m%d
include_tag_key true
type_name access_log
tag_key @log_name
flush_interval 1s
</store>
<store>
@type stdout
</store>
</match>
Для удобного поиска среди полученных логов, используются фильтры в Fluentd
, которые затем можно применять в Kibana
.
# Пример фильтров
<filter service.post>
@type parser
format json
key_name log
</filter>
<filter service.ui>
@type parser
key_name log
format grok
grok_pattern %{RUBY_LOGGER}
</filter>
Для парсинга неструктурированных логов могут быть использованы или регулярные выражения:
<filter service.ui>
@type parser
format /\[(?<time>[^\]]*)\] (?<level>\S+) (?<user>\S+)[\W]*service=(?<service>\S+)[\W]*event=(?<event>\S+)[\W]*(?:path=(?<path>\S+)[\W]*)?request_id=(?<request_id>\S+)[\W]*(?:remote_addr=(?<remote_addr>\S+)[\W]*)?(?:method= (?<method>\S+)[\W]*)?(?:response_status=(?<response_status>\S+)[\W]*)?(?:message='(?<message>[^\']*)[\W]*)?/
key_name log
</filter>
или готовые решения (например, Grok):
<filter service.ui>
@type parser
format grok
grok_pattern service=%{WORD:service} \| event=%{WORD:event} \| request_id=%{GREEDYDATA:request_id} \| message='%{GREEDYDATA:message}'
key_name message
reserve_data true
</filter>
Для выявление проблем среди взаимодействия между сервисами могут быть использованы различные инструменты. Например, Zipkin.
Для выявления проблем Zipkin-tracer
должен быть встроен в код приложения.
- Для разбора неструктурированных логов сервиса
UI
необходимо добавить еще один шаблон дляGrok
<filter service.ui>
@type parser
format grok
grok_failure_key grokfailure
<grok>
pattern service=%{WORD:service} \| event=%{WORD:event} \| request_id=%{GREEDYDATA:request_id} \| message='%{GREEDYDATA:message}'
</grok>
<grok>
pattern service=%{WORD:service} \| event=%{WORD:event} \| path=%{GREEDYDATA:path} \| request_id=%{GREEDYDATA:request_id} \| remote_addr=%{IP:remote_addr} \| method= %{WORD:method} \| response_status=%{NUMBER:response_status}
</grok>
key_name message
reserve_data true
</filter>
- Выявление проблемы при помощи
Zipkin
. Трассировка показала неработоспособность сервиса comment
{
"traceId":"1f88a8d727bbed44",
"parentId":"1f88a8d727bbed44",
"id":"6d05596e4a95965d",
"kind":"CLIENT",
"name":"get",
"timestamp":1596887155678739,
"duration":30177302,
"localEndpoint":{
"serviceName":"ui_app",
"ipv4":"172.21.0.5",
"port":9292
},
"remoteEndpoint":{
"serviceName":"comment",
"ipv4":"172.21.0.3",
"port":9292},
"tags":{
"error":"500", ## ВОТ ТУТ
"http.path":"/5f2e6d1ffc4054000eef613f/comments",
"http.status":"500"
}
}
Так как сервис comment должен получать комментарии из базы данных дальнейшее изучение показало, что не были указаны сервер баз данных и название базы данных в переменных окружения.
Туториал тут
- Проверка Google Cloud SDK >= 301.0.0
- Установка необходимых инструментов.
cfssl
иcfssljson
>= 1.4.1,kubectl
>= 1.18.6 - Базовые объекты в GCP
- 3.1. Создание сети для работы кластера. Настройка firewall для разрешения хождения трафика между инстансами и возможность подключения извне. Регистрация внешнего IP-адреса для балансировщика.
- 3.2. Создание 3 инстанса для контроллеров и 3 инстанса для воркеров.
- Создание сертификатов для управления и сервисов
- 4.1 Генерация CA для последующего создания необходимых сертификатов
- 4.2 Генерация сертификатов для следующих целей
- Администрирование (клиент)
- Kubelet (клиент)
- Менеджер контроллеров (клиент)
- Kube Proxy (клиент)
- Планировщик (клиент)
- Kubernetes API (сервер)
- Сервис аккаунт
- Генерация конфигурационных файлов для управления. Включают в себя указание кластера, учетных данных (сертификата), контекста.
- Kubelet Kubernetes
- Менеджер контроллера
- Планировщик
- Администрирование
- Генерация конфигурации шифрования секретов Kubernetes
- Установка
etcd
на контроллеры - Установка исполняемых файлов для управления Kubernetes (
kube-apiserver kube-controller-manager kube-scheduler kubectl
) на контроллеры. Настройка хэесчека. Настройка разрешений Kubernetes API для доступа к Kubelet API. Настройка балансировщика GCP для фронтенда - Настройка воркеров.
- Установка зависимостей ОС (
socat conntrack ipset
) - Установка kubelet и kube-proxy
- Конфигурация Kubelet
- Конфигурация Kubernetes Proxy
- Установка зависимостей ОС (
- Подключение к консоли управления
- Настройка маршрутов для воркеров
- Установка DNS-кластера (
kube-dns
)
Пример пода для запуска в Kubernetes
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: comment-deployment
spec:
replicas: 1
selector:
matchLabels:
app: comment
template:
metadata:
name: comment
labels:
app: comment
spec:
containers:
- image: razin92/comment
name: comment
Запуск подов reddit
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
comment-deployment-67cbd87bfc-pvvck 1/1 Running 0 8m18s
mongo-deployment-7c589bf754-hrq5c 1/1 Running 0 8m35s
post-deployment-66d6859bc5-87jxn 1/1 Running 0 8m24s
ui-deployment-64db5899c5-ss87g 1/1 Running 0 8m13s
Установка и настройка Minikube+VMware Workstation под Windows
Для управления клатером используется контекст - комбинация параметров:
- cluster - API-сервер
- user - пользователь для подключения к кластеру
- namespace - область видимости
Информация о контекствах располагается в ~/.kube/config
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: <cert_data>
server: https://<ip>:6443
name: my_cluster
contexts:
- context:
cluster: my_cluster
user: admin
name: my_cluster
current-context: my_cluster
kind: Config
preferences: {}
users:
- name: admin
user:
client-certificate: path-to-pem/admin.pem
client-key: path-to-key-pem/admin-key.pem
Команды:
kubectl config current-context
- текущий контекстkubectl config get-contexts
- список всех контекстовkubectl apply -f <file>.yml
- запуск компонента (поды, сервисы...). Применимо к директорииkubectl get pods
- список всех подов в текущем namespacekubectl get pods --selector component=<name>
- выбор списка подов по общему значениюkubectl port-forward <pod-name> 8080:9292
- проброс порта из пода на локальную машину, где выполняется команда.kubectl describe [service|port|etc]
- детальное описаниеkubectl exec -ti <pod-name> <command>
- выполнить команду на подеkubectl logs <pod-name>
- посмотреть логи подаkubectl delete
- удаление компонента
Services
- конечные узлы доступа
- селекторные (выбор автоматически)
- безселекторные (вручную описаны endpoint'ы)
Способы коммуникации:
- ClusterIP - доступ к сервису только изнутри кластера
- nodePort - снаружи кластера на опубликованный порт на определенную ноду
- LoadBalancer - облачный балансировщик (aws elb, Google gclb)
- ExternalName - внешний ресурс по отношению к кластеру
Для преобразования имен в IP-адреса кластера Kubernetes используется Kube-DNS
.
-
Ingress
- набор правил для "маршрутизации" запросов к сервисам кластера. -
Ingress Controller
- плагин. Описывается в отдельном .yml -
Network Policy
- список ограничений доступа между ресурсами.
Volume emptyDir
- docker volume. При остановке POD'a - содержимое удаляетсяPersistentVolume
- внешний диск, примонтированный к POD'у
Helm
- пакетный менеджер для Kubernetes
. Используется для создания цельных проектов с необходимыми зависимостями. Позволяет управлять сразу всем сетом POD'ов, необходимых для работы приложения. POD описывается в chart.yaml
. Необходимые манифесты расположены в директории templates
. Для использования переменных может быть использован values.yaml
, расположенный рядом в Chart.yaml
.
Для создания набора используется манифест с указанием всех компонентов, зависимости от которых описаны в файле requirements.yaml
.
helm install <name> <path>
- запускhelm dep udpate <path>
- обновление зависимостейhelm delete <name>
- остановкаhelm reset
- удаление helm из kubernetes
Для мониторинга кластера Kubernetes можно использовать Helm-релиз prometheus
:
helm fetch —-untar stable/prometheus
helm upgrade prom . -f custom_values.yml --install
Для конфигурации мониторинга указать файл с переменными
# custom_values.yml
...
# Reddit-app monitoring
- job_name: 'post-endpoints' <-- Имя джоба
kubernetes_sd_configs: <-- ServiceDiscovery настройка
- role: endpoints <-- Что мониторить
relabel_configs: <-- как ставить лейблы и группировать
- source_labels: [__meta_kubernetes_service_label_component]
action: keep
regex: post
- action: labelmap
regex: __meta_kubernetes_service_label_(.+)
- source_labels: [__meta_kubernetes_namespace]
target_label: kubernetes_namespace
- source_labels: [__meta_kubernetes_service_name]
target_label: kubernetes_name
...