I. Обзор
1.1 Предыстория
В последнее время проект платформы миграции, разработанный совместно с моими коллегами, хочет пройти преобразование контейнеризации и следует общей тенденции к контейнеризации.Фронтальная платформа проекта разработана с Django, серверная часть Restful API дополнена высокопроизводительным интерфейсом. высокопроизводительная веб-инфраструктура Tornado, а агентская часть разработана с помощью Flask, каждая из которых использует преимущества нескольких крупных фреймворков Python.
Раньше тестовая среда CI/CD использовала Gitlab CI. После того, как мастер отправлял запрос на слияние, он автоматически собирался и развертывался. Официальная среда вручную вытягивала развертывание выпуска через конвейер Jenkins. Контейнерная трансформация размещала Jenkins в Kubernetes. Мастер принял запросы на работу и динамически генерировать ведомое устройство для выполнения задачи работы.
В этой статье описаны некоторые опыты, с которыми я столкнулся при преобразовании контейнеризации. Возможно, моих собственных исследований недостаточно. Ниже приводится мое личное понимание. Если вам это не нравится, не распыляйтесь. В процессе использования Kubernetes для контейнеризации проекта я решил использовать проект python.Это немного излишне, но благодаря этому преобразованию я понял множество функций контейнеризации, постоянно улучшал свои ИТ-технологии и обогатил свой стек навыков.
1.2 Преимущества преобразования контейнеризации
- Более экономично: высокая эффективность использования ресурсов, максимальное извлечение и совместное использование физических ресурсов, несколько проектов могут лучше отразить многочисленные преимущества контейнеризации и сократить расходы на развертывание ИТ.
- Быстрее: запуск за считанные секунды, что позволяет ускорить итерацию разработки, доставку и развертывание бизнес-систем.
- Эластичность. Масштабирование эластичного контейнера и эластичное расширение могут выполняться в соответствии с бизнес-нагрузкой.
- Удобство: Контейнерное бизнес-развертывание поддерживает сине-зеленые/серые/канареечные выпуски, откат и является более гибким и удобным.
- Гибкость: отслеживайте состояние работоспособности узлов базовых узлов и гибко планируйте оптимальное развертывание узлов.
- Строгая согласованность: контейнер упаковывает среду и код в образ, обеспечивая надежную согласованность между тестовой и рабочей средами.
1.3 Требования к трансформации контейнеризации
- Разработчики знакомы с технологией виртуализации Docker и умеют писать Dockerfile.
- Знаком с контейнерной системой оркестровки kubernetes и знаком с составлением списка ресурсов каждого компонента.
- Разработчикам необходимо организовать структуру и написать код с учетом потребностей последующей оркестровки и развертывания контейнеров.
- Разработчики должны знать значение каждого параметра в списке ресурсов kubernetes и контролировать всю архитектуру сверху донизу.
- Рассмотрим высокую доступность архитектуры и стратегии безопасности RBAC, внедрение внешнего потока и телескопии после расширения.
II. Инструменты
2.1 Облачная экосистема
Как только вы входите в облако, оно похоже на море. На рисунке ниже показано, как лучше понять экологию облака.
2.2 Применение инструмента
Некоторые инструменты и приложения, использованные при преобразовании этого проекта, будут доступны вам (позже будет время написать и поделиться каждым приложением инструмента отдельно)
- хостинг кода
Сервер Gitlab для размещения кода и gitlab ci/cd, который позже можно будет разместить в кластере kubernetes.
- Частный хостинг изображений
Используйте Harbour для хранения образов, управления аудитом и проверки образов, которые позже можно будет разместить в kubernetes.
- Управление кластером
kubernetes-dashboard, веб-интерфейс удобен для просмотра и управления каждым компонентом, простое управление контейнерным терминалом, совместное использование и просмотр журналов.
Rancher, импортируйте приватизированную платформу kubernetes, чтобы упростить управление кластером, а также установку и развертывание приложений.
- Управление хранилищем
Управление веб-интерфейсом распределенного кластера Ceph to mgr
Хранилище объектов minio/chartmuseum удобно для управления хранилищем диаграмм.
- Интегрированная публикация
Jenkins выполняет непрерывную интеграцию, непрерывный выпуск и может быть размещен в кластере kubernetes позже.
- мониторинг журнала
efk используется для мониторинга и управления журналами контейнеров кластера kubernetes, а f — инструмент для контейнерного мониторинга Flutend.
- управление складом
kubeapps добавляет диаграмму и реестр для облегчения установки и развертывания helm.
- Мониторинг приложений в контейнере
Prometheus + grafana, экспорт из каждого приложения и мониторинг из одного приложения в матрицу.
- На следующем рисунке показана страница навигации, которая интуитивно отображает эти инструменты.
3. Требования к ремонту
3.1 Требования программы
3.1.1 Структура проекта
- Создайте папку config для файла конфигурации отдельно, что удобно для kubernetes, чтобы позже создать configmap для сопоставления ресурсов.
- Если на более позднем этапе оно развертывается как приложение без сохранения состояния развертывания, для общего хранилища данных следует создать отдельный каталог, чтобы его можно было подключить к тому позже.
- Создайте отдельный каталог развертывания в каталоге результатов проекта для хранения
Например, подпроект разбит на Секрет создания configmap/deployment/service, который уже вытащил код из приватного репозитория.
- В рамках проекта entrypoint.sh применим к записи контейнера и, наконец, добавить
exec "$@"
, что удобно для последующего добавления расширений конфигурации
3.1.2 Требования к коду
- Конфигурационный файл максимально написан на языке yaml, что удобно для последующей загрузки в configmap для легкой модификации и чтения.
- Из-за удобства мониторинга контейнеров на более позднем этапе Fluentd используется для совместной работы с EL для мониторинга кластера и приложений. в стандартный вывод, поэтому, если необходимо отслеживать журнал, его можно направить в стандартный вывод/стандартный вывод ошибок уже находится в файле журнала.
3.2 Требования к архитектуре
3.2.1 Основные ресурсы
- рассчитать
Используйте облачные серверы для создания и развертывания кластеров kubernetes для предоставления вычислительных ресурсов и ресурсов памяти.
- место хранения
Распределенная система хранения Ceph должна быть развернута с использованием дисков облачного сервера, чтобы предоставить базовые ресурсы хранения для kubernetes.
- Интернет
Для передней секции требуется LB, который используется для проксирования приложения на NodePort, а сеть flannel используется внутри кластера kubernetes.
Перед тем, как узел к узлу обменивается данными через частную сеть vpc
-
- Межконтейнерная связь: связь между несколькими контейнерами в одном POD с использованием сетевой карты lo.
- Связь между POD: POD IP связывается напрямую с POD IP
- POD и сервис: IP-адрес POD напрямую и IP-адрес кластера
- Сервисная связь с внешними клиентами кластера, ingress, NodePort, Loadbacer
3.2.2 Введение в трафик
- Его необходимо развернуть в общедоступном/частном режиме или на «голом железе», и это необходимо спланировать заранее.Облачный LB может использовать свой сертификат развертывания и загружать сертификат на семи уровнях.
- Если нет облачного продукта, нужно рассмотреть вопрос о введении входящего трафика в кластер для загрузки сертификата.
4. Примеры частей проекта
4.1 Класс хранения
Используйте кластеры ceph для создания классов хранения и используйте CephFS для решения приложений, смонтированных между узлами.
- Класс хранения ceph-storageclass.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: ceph-rdb
provisioner: ceph.com/rbd
reclaimPolicy: Retain
parameters:
monitors: 10.xx.xx.xx:6789
pool: kube
adminId: admin
adminSecretName: ceph-admin-secret
adminSecretNamespace: kube-system
userId: kube
userSecretName: ceph-client-secret
userSecretNamespace: kube-system
fsType: xfs
imageFormat: "2"
imageFeatures: "layering"
- аутентификация ceph ceph-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: ceph-admin-secret
namespace: kube-system
type: "kubernetes.io/rbd"
data:
# ceph auth get-key client.admin |base64
key: QVFCRitmUmM1c1FxxxxxxxxxxxxxxxxxxxxxxxxHFoQVh6NlRvQ2c9PQ==
- для общих каталогов
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: go2cloud-api-pvc
namespace: default
spec:
storageClassName: "ceph-rdb"
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 8Gi
- Файлы конфигурации монтируются через configmap
apiVersion: v1
data:
config.yaml: |
---
DB_ENGINE: mysql
DB_HOST: mariadb-cluster-mariadb-master.default.svc.cluster.local
DB_PORT: 3306
DB_USER: go2clouduser
DB_PASSWORD: go2xxxxxxxxx
DB_NAME: go2cxxxxxxxx
# Use Redis as cache
# Redis配置,连接replication的master节点
REDIS_HOST: redis-cluster-redis-ha-announce-0.default.svc.cluster.local
REDIS_PORT: 6379
REDIS_PASSWORD: go2cloxxxxxxxx
# go2cloud-platform 监听端口
HTTP_LISTEN_PORT: 8088
# callback url
API_MIGRATE_SERVER_URL: http://go2cloud-api-service.default.svc.cluster.local:8004
PLATFORM_CALLBACK_URL: http://go2cloud-platform-service.default.svc.cluster.local:8088
kind: ConfigMap
metadata:
name: go2cloud-platform-cm
4.2 Ресурсы, связанные с приложением
-
- go2cloud-platform-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: go2cloud-platform
namespace: default
spec:
selector:
matchLabels:
# 匹配下面选择的template 中的label.app名称
app: go2cloud-platform
replicas: 2
template:
metadata:
labels:
app: go2cloud-platform
release: latest
spec:
imagePullSecrets:
- name: registry-secret
containers:
- name: go2cloud-platform
image: 10.234.xxx.xxx/go2cloud/go2cloud-plaxxxxx:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8088
protocol: TCP
volumeMounts:
# 必须匹配volumes的名称
- name: go2cloud-platform-config
mountPath: /data/config
readOnly: true
resources:
requests:
cpu: 250m
memory: 520Mi
limits:
cpu: 500m
memory: 1024Mi
livenessProbe:
tcpSocket:
port: 8088
initialDelaySeconds: 20
volumes:
# 定义逻辑卷的名称
- name: go2cloud-platform-config
configMap:
# 使用configmap资源的名称
name: go2cloud-platform-cm
items:
# 使用configmap中到那个key
- key: config.yaml
# 使用configmap中到key映射到容器中到文件名称
path: config.yaml
mode: 0644
-
- go2cloud-platform-service.yaml
apiVersion: v1
kind: Service
metadata:
name: go2cloud-platform-service
namespace: default
spec:
selector:
app: go2cloud-platform
type: NodePort
ports:
- name: http
nodePort: 30020
port: 8088
targetPort: 8088
protocol: TCP
-
- registry-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: registry-secret
type: kubernetes.io/dockerconfigjson
data:
.dockerconfigjson: ewoJImF1dGhzIjogewoJCSIxMC4yMzQuMi4yMTgiOiB7CgkJCSJhdXRoIjogIllXNWphRzVsZERwWWVIcDRRRGM0T1E9PSIKCQl9Cgl9LAoJIkh0dHBIZWFkZXJzIjogewoJCSJVc2Vyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-
- Dockerfile
FROM python:latest
LABEL maintainer="kaliarch"
ENV BASE_ROOT="/data"
ADD . ${BASE_ROOT}
RUN pip install --default-timeout=100 -r ${BASE_ROOT}/requirements/requirements.txt \
&& ln -s ${BASE_ROOT}/entrypoint.sh /bin/entrypoint.sh
EXPOSE 8088/tcp
ENTRYPOINT ["/bin/sh","/bin/entrypoint.sh"]
CMD ["python","/data/runserver","start","all"]
-
- entrypoint.sh
#!/bin/sh
# config go2cloud-api configfile
exec "$@"
5. Отражение
- Лично я решил, что облачные технологии станут основным трендом на более позднем этапе, и заранее освоить технологию контейнерной оркестрации, чтобы стек технологий не устарел.
- Гораздо быстрее будет в полной мере использовать облачные экологические приложения, чтобы адаптироваться к характеристикам собственных проектов для проведения трансформации контейнеризации.
- Я чувствую, что облачные технологии — это главная тенденция в будущем, поэтому начните как можно скорее и используйте облачные технологии.