Источник видео: Station B «Учебник Docker&k8s Tutorial Ceiling. Абсолютно лучший из всех, которым обучала Station B. Этот набор обучающих материалов k8s для получения всех основных знаний о Docker уже здесь»
Упорядочивайте содержание курса учителя и заметки к тестам во время учебы и делитесь ими со всеми. Любое нарушение будет удалено. Спасибо за вашу поддержку!
Прикрепите итоговую публикацию: Практический курс K8S+DevOps Architect | Резюме
Познакомьтесь с Хелмом
- Зачем здесь руль?
- Что такое Хелм?
Менеджер пакетов kubernetes: «Helm можно рассматривать как apt-get/yum в системе Linux».
- Издатели приложений могут использовать Helm для упаковки приложений, управления зависимостями приложений, управления версиями приложений и публикации приложений в хранилищах программного обеспечения.
- Пользователям после использования Helm не нужно понимать синтаксис Yaml Kubernetes и писать файлы развертывания приложений — они могут скачать и установить необходимые приложения в Kubernetes через Helm.
Кроме того, Helm также предоставляет мощные функции для развертывания программного обеспечения, удаления, обновления и отката приложений в kubernetes.
- Шлемовая версия
- шлем2
Архитектура C/S, helm взаимодействует с k8s через Tiller
- Учитывая безопасность и простоту использования, helm3 удалил сервер Tiller. Helm3 напрямую использует файл kubeconfig для аутентификации и доступа к серверу APIServer. Конфигурация) helm install very_important_app ./very_important_app Количество копий этого приложения равно 3. Теперь, если кто-то случайно выполнит kubectl edit или: kubectl scale -replicas=0 deployment/very_important_app Затем кто-то из команды обнаружит, что very_important_app не работает без причины, попробуйте выполнить команду: helm rollback very_important_app В Helm 2 эта операция будет Сравните старую конфигурацию с новой конфигурацией и создайте исправление для обновления. Потому что человек, который неправильно действовал, только модифицировал онлайн-статус приложения (старая конфигурация не обновлялась). Helm ничего не делает, когда откатывается. Потому что нет разницы между старой конфигурацией и новой конфигурацией (обе 3 копии). Тогда Helm не выполняет откат, а количество реплик продолжает оставаться равным 0. Хранилище локального репозитория helm-сервера должно указывать имя при создании приложения (или --generate-name генерируется случайным образом)
- Важная концепция Helm, диаграмма, представляет собой набор информации о приложении, включая шаблоны конфигурации для различных объектов, определения параметров, зависимости, описания документации и т. д. Репозиторий, хранилище диаграмм, где хранятся диаграммы, и файл списка диаграммы пакет Репозитория предоставляется для справок. Helm может одновременно управлять несколькими разными репозиториями. релиз, когда чарт установлен в кластере kubernetes, генерируется релиз, который является работающим экземпляром чарта и представляет работающее приложение
helm — это инструмент управления пакетами, а пакет — это диаграмма.
- Создать диаграмму с нуля
- Взаимодействуйте со складом, извлекайте, сохраняйте и обновляйте диаграммы
- Установка и удаление выпуска в кластере kubernetes
- Обновление, откат, тестовый релиз
Практика установки и быстрого старта
Загрузите последнюю стабильную версию: https://get.helm.sh/helm-v3.2.4-linux-amd64.tar.gz .
Дополнительные версии см. по адресу: https://github.com/helm/helm/releases.
# k8s-master节点
$ wget https://get.helm.sh/helm-v3.2.4-linux-amd64.tar.gz
$ tar -zxf helm-v3.2.4-linux-amd64.tar.gz
$ cp linux-amd64/helm /usr/local/bin/
# 验证安装
$ helm version
version.BuildInfo{Version:"v3.2.4", GitCommit:"0ad800ef43d3b826f31a5ad8dfbb4fe05d143688", GitTreeState:"clean", GoVersion:"go1.13.12"}
$ helm env
# 添加仓库
$ helm repo add stable https://mirror.azure.cn/kubernetes/charts/
# 同步最新charts信息到本地
$ helm repo update
Практика быстрого старта:
Пример 1: Установка приложения mysql с помощью helm
# helm 搜索chart包
$ helm search repo mysql
# 从仓库安装
$ helm install mysql stable/mysql
$ helm ls
$ kubectl get all
# 从chart仓库中把chart包下载到本地
$ helm pull stable/mysql
$ tree mysql
Пример 2: Создайте новую диаграмму nginx и установите ее
$ helm create nginx
# 从本地安装
$ helm install nginx ./nginx
# 安装到别的命名空间luffy
$ helm -n luffy install ./nginx
# 查看
$ helm ls
$ helm -n luffy ls
#
$ kubectl get all
$ kubectl -n luffy get all
Синтаксис и разработка шаблона диаграммы
анализ реализации диаграммы nginx
Формат:
$ tree nginx/
nginx/
├── charts # 存放子chart
├── Chart.yaml # 该chart的全局定义信息
├── templates # chart运行所需的资源清单模板,用于和values做渲染
│ ├── deployment.yaml
│ ├── _helpers.tpl # 定义全局的命名模板,方便在其他模板中引入使用
│ ├── hpa.yaml
│ ├── ingress.yaml
│ ├── NOTES.txt # helm安装完成后终端的提示信息
│ ├── serviceaccount.yaml
│ ├── service.yaml
│ └── tests
│ └── test-connection.yaml
└── values.yaml # 模板使用的默认值信息
Очевидно, что список ресурсов находится в шаблонах, а данные поступают из values.yaml Процесс установки заключается в объединении шаблона и данных в список ресурсов, распознаваемый k8s, а затем развертывание его в среде k8s.
Реализация файла шаблона анализа:
- Ссылка на именованный шаблон и передача области { { include "nginx.fullname" . }} включает ссылку на именованный шаблон из _helpers.tpl и передача области верхнего уровня.
- Встроенный объект .Values .Release.NameRelease: Этот объект описывает соответствующую информацию самого релиза, и внутри него есть несколько объектов: Release.Name: Название релиза Release.Namespace: Пространство имён, где релиз установлен Release.IsUpgrade: если текущая операция предназначена для обновления или отката, значение равно trueRelease.IsInstall: если текущая операция — установка, установите значение trueRelease.Revision: номер версии версии выпуска.При установке значение равно 1. Каждое обновление или откат будет добавлять Release.Service: службу, которая отображает текущий шаблон.В Helm значение на самом деле всегда HelmValues: значение Values, переданное в шаблон из файла values.yaml, и пользователь- предоставленный файл значений. Диаграмма: получить содержимое файла Chart.yaml. Можно получить доступ к любым данным в этом файле, например, { { .Chart.Name }}-{ { .Chart.Version }} можно отобразить как mychart -0.1.0
- определение шаблона { {- определить "nginx.fullname" -}} { { {- if .Values.fullnameOverride }} { {- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} { { - else }} { { - $name := default .Chart.Name .Values.nameOverride }} { { - если содержит $name .Release.Name }} { {- .Release.Name | trunc 63 | trimSuffix "-" }} { { - else } } { {- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} { { - end }} { { - end }} { {- end }}{ { - удалить пробелы и новые строки слева, -}} удалить пробелы и новые строки справа Пример apiVersion: v1 type: метаданные ConfigMap: name: { { .Release.Name }}-configmap data: myvalue: "Hello World" drink: { { .Ценности.любимый.напиток | по умолчанию "чай" | цитата }} еда: { { .Values.favorite.food | верхний | quote }} { { if eq .Values.favorite.drink "coffee" }} mug: true { { end }} 渲染完后是:apiVersion: v1 вид: метаданные ConfigMap: имя: mychart-1575971172-configmap data: myvalue: Напиток "Hello World": "кофе" еда: "ПИЦЦА" кружка: правда
- Конвейер и метод trunc означает перехват строки, 63 передается в качестве параметра методу trunc, trimSuffix означает удаление -суффикса { { - .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} nindent означает количество пробелов в передний селектор: matchLabels: { {- include "nginx.selectorLabels" . | nindent 6 }}lower означает перевод содержимого в нижний регистр, а quote означает заключение содержимого в двойные кавычки value: { { include "mytpl" . | lower | quote }}
- Каждый оператор условного суждения if соответствует end{ { - if .Values.fullnameOverride }} ... { { - else }} ... { {- end }} обычно используется для управления в соответствии с переключателем, определенным в values.yaml Отображать в шаблоне: { {- если нет .Values.autoscaling.enabled }} реплики: { { .Values.replicaCount }} { {- end }}
- Определить переменные, на которые можно ссылаться по именам переменных в шаблонах.
{
{- $name := default .Chart.Name .Values.nameOverride }}
- Обходим данные значений { {- with .Values.nodeSelector }} nodeSelector: { {- toYaml .| nindent 8 }} { {- end }}
toYaml обрабатывает экранирование и специальные символы в значении, " http://kubernetes.io/role "=master , name="value1,value2" подобные случаи
- по умолчанию установить значение по умолчанию
image: "{
{ .Values.image.repository }}:{
{ .Values.image.tag | default .Chart.AppVersion }}"
hpa.yaml
{
{- if .Values.autoscaling.enabled }}
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
name: {
{ include "nginx.fullname" . }}
labels:
{
{- include "nginx.labels" . | nindent 4 }}
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: {
{ include "nginx.fullname" . }}
minReplicas: {
{ .Values.autoscaling.minReplicas }}
maxReplicas: {
{ .Values.autoscaling.maxReplicas }}
metrics:
{
{- if .Values.autoscaling.targetCPUUtilizationPercentage }}
- type: Resource
resource:
name: cpu
targetAverageUtilization: {
{ .Values.autoscaling.targetCPUUtilizationPercentage }}
{
{- end }}
{
{- if .Values.autoscaling.targetMemoryUtilizationPercentage }}
- type: Resource
resource:
name: memory
targetAverageUtilization: {
{ .Values.autoscaling.targetMemoryUtilizationPercentage }}
{
{- end }}
{
{- end }}
Назначается при создании заявки
- установить метод
# 改变副本数和resource值
$ helm install nginx-2 ./nginx --set replicaCount=2 --set resources.limits.cpu=200m --set resources.limits.memory=256Mi
- Путь значения файла
$ cat nginx-values.yaml
resources:
limits:
cpu: 100m
memory: 128Mi
requests:
cpu: 100m
memory: 128Mi
autoscaling:
enabled: true
minReplicas: 1
maxReplicas: 3
targetCPUUtilizationPercentage: 80
ingress:
enabled: true
hosts:
- host: chart-example.luffy.com
paths:
- /
$ helm install -f nginx-values.yaml nginx-3 ./nginx
Дополнительная справка по синтаксису:
https://helm.sh/docs/topics/charts/
Проблема невозможности развернуть mysql
Настоящий бой: используйте Helm для развертывания хранилища изображений и карт Harbour.
Гавань наступает на развертывание ямы
Архитектура https://github.com/goharbor/harbor/wiki/Architecture-Overview-of-Harbor
- Core, основной компонент API Server, получает и обрабатывает запросы пользователей. Config Manager: настройка всех систем, таких как аутентификация, электронная почта, конфигурация сертификатов и т. д. Project Manager: управление проектами Quota Manager: управление квотами Chart Controller: управление диаграммами Replication Controller: контроллер зеркального копирования, может осуществлять зеркальную синхронизацию с различными типами хранилищ Распределение (реестр Docker) Docker Hub... Диспетчер сканирования: управление сканированием, внедрение сторонних компонентов и выполнение зеркального сканирования безопасности Драйвер реестра: драйвер зеркального хранилища, используемый в настоящее время реестр докеров
- Служба заданий, выполнение асинхронных задач, таких как синхронизация зеркальной информации.
- Log Collector, единый сборщик журналов, собирает журналы каждого модуля.
- Контроллер ГХ
- Картографический музей, картографический склад, третья сторона
- Docker Registry, сервис зеркальных складов
- kv-storage, служба кеша Redis, используемая службой заданий, хранит метаданные заданий
- локальное/удаленное хранилище, служба хранения, сравнение зеркального хранилища
- База данных SQL, postgresl, хранящая метаданные, такие как пользователи и проекты
Обычно используется в качестве службы зеркального склада на уровне предприятия, но на самом деле функция намного мощнее.
Компонентов много, поэтому используйте helm для деплоя
# 添加harbor chart仓库
$ helm repo add harbor https://helm.goharbor.io
# 搜索harbor的chart
$ helm search repo harbor
# 不知道如何部署,因此拉到本地
$ helm pull harbor/harbor --version 1.4.1
создать пвх
$ kubectl create namespace harbor
$ cat harbor-pvc.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: harbor-pvc
namespace: harbor
spec:
accessModes:
- ReadWriteOnce
storageClassName: dynamic-cephfs
resources:
requests:
storage: 20Gi
Измените конфигурацию гавани:
- Открытый входной доступ
- externalURL, запись веб-доступа, совпадает с доменным именем входящего
- Персистентность с использованием cephfs, состыкованных с PVC
- гаваньAdminPassword: «Harbor12345», учетная запись администратора по умолчанию admin/Harbor12345
- открытая картамузей
- Компоненты сканирования уязвимостей Clair and trivy, которые еще не включены
руль создать:
# 使用本地chart安装
$ helm install harbor ./harbor -n harbor
Шаг 1: Redis сохраняет права доступа к каталогу данных, что приводит к невозможности входа в систему.
Для каталога данных redis, /var/lib/redis, необходимо установить права пользователя и группы пользователей redis.
initContainers:
- name: "change-permission-of-directory"
image: {
{ .Values.database.internal.initContainerImage.repository }}:{
{ .Values.database.internal.initContainerImage.tag }}
imagePullPolicy: {
{ .Values.imagePullPolicy }}
command: ["/bin/sh"]
args: ["-c", "chown -R 999:999 /var/lib/redis"]
volumeMounts:
- name: data
mountPath: /var/lib/redis
subPath: {
{ $redis.subPath }}
Trample 2: Разрешение каталога хранения изображений компонента реестра приводит к сбою отправки образа
Каталог хранилища изображений реестра, вам необходимо установить пользователя и группу пользователей реестра, в противном случае отправка образа завершится ошибкой.
initContainers:
- name: "change-permission-of-directory"
image: {
{ .Values.database.internal.initContainerImage.repository }}:{
{ .Values.database.internal.initContainerImage.tag }}
imagePullPolicy: {
{ .Values.imagePullPolicy }}
command: ["/bin/sh"]
args: ["-c", "chown -R 10000:10000 {
{ .Values.persistence.imageChartStorage.filesystem.rootdirectory }}"]
volumeMounts:
- name: registry-data
mountPath: {
{ .Values.persistence.imageChartStorage.filesystem.rootdirectory }}
subPath: {
{ .Values.persistence.persistentVolumeClaim.registry.subPath }}
Trample 3: права доступа к каталогу хранения диаграммы, что приводит к сбою при отправке диаграммы
initContainers:
- name: "change-permission-of-directory"
image: {
{ .Values.database.internal.initContainerImage.repository }}:{
{ .Values.database.internal.initContainerImage.tag }}
imagePullPolicy: {
{ .Values.imagePullPolicy }}
command: ["/bin/sh"]
args: ["-c", "chown -R 10000:10000 /chart_storage"]
volumeMounts:
- name: chartmuseum-data
mountPath: /chart_storage
subPath: {
{ .Values.persistence.persistentVolumeClaim.chartmuseum.subPath }}
После обновления содержимого выполните выпуск обновления
$ helm upgrade harbor -n harbor ./
Отправьте образ в репозиторий Harbour.
Настройте хосты и незащищенное хранилище докеров:
$ cat /etc/hosts
...
172.21.51.67 k8s-master core.harbor.domain
...
$ cat /etc/docker/daemon.json
{
"insecure-registries": [
"172.21.51.67:5000",
"core.harbor.domain"
],
"registry-mirrors" : [
"https://8xpk5wnt.mirror.aliyuncs.com"
]
}
#
$ systemctl restart docker
# 使用账户密码登录admin/Harbor12345
$ docker login core.harbor.domain
$ docker tag nginx:alpine core.harbor.domain/library/nginx:alpine
$ docker push core.harbor.domain/library/nginx:alpine
Отправить диаграмму на склад Harbour
В helm3 по умолчанию не установлен плагин helm push, и его необходимо установить вручную. Адрес плагина https://github.com/chartmuseum/helm-push
Установите плагин:
$ helm plugin install https://github.com/chartmuseum/helm-push
Автономная установка:
$ helm plugin install ./helm-push
добавить репо
$ helm repo add myharbor https://harbor.luffy.com/chartrepo/luffy
# x509错误
# 添加证书信任,根证书为配置给ingress使用的证书
$ kubectl get secret harbor-ingress -n harbor -o jsonpath="{.data.ca\.crt}" | base64 -d >harbor.ca.crt
$ cp harbor.ca.crt /etc/pki/ca-trust/source/anchors
$ update-ca-trust enable; update-ca-trust extract
# 再次添加
$ helm repo add luffy https://harbor.luffy.com/chartrepo/luffy --ca-file=harbor.ca.crt --username admin --password Harbor12345
$ helm repo ls
Отправьте диаграмму на склад:
$ helm push harbor luffy --ca-file=harbor.ca.crt -u admin -p Harbor12345
Посмотреть схему портового склада