k8s реальный бой

Kubernetes
Цель
随着部署组件的增多和数据中心的增长, 配置以及管理并保持系统的正常运行变得复杂与困难. 
在想要获得足够高的资源利用率并降低硬件成本情况下, 把组件部署在什么地方变得越来越难以决策. 
自动化调度, 配置, 监管以及故障处理, 正式 k8s 解决的痛点
удобство
为应用程序提供一致的环境, 便于今早发现问题
提供更加便捷的持续交付能力
k8s架构
Введение компонента

Панель управления используется для управления работой кластера, а содержащиеся в ней компоненты могут быть развернуты на нескольких узлах для обеспечения высокой доступности

API-сервер кубернетес Мост для связи между компонентами в панели управления
schedule планировщик приложений
controller manager Выполнение функций на уровне кластера, например: репликация компонентов, отслеживание рабочих узлов, обработка отказавших узлов и т. д.
etcd Распределенное хранилище данных, конфигурация кластера постоянного хранения
Рабочие узлы — это машины, на которых выполняются контейнерные приложения.
среда выполнения контейнера докер и другие типы контейнеров
kubelet Общайтесь с сервером API и управляйте контейнерами узла, на котором он находится.
kube-proxy Отвечает за балансировку нагрузки сетевого трафика между компонентами.
Пример жизненного цикла контейнера
docker build -t kubia .
docker images | grep kubia
docker run --name kubia-container -p 8080:8080 -d kubia
curl localhost:8080
docker inspect kubia-container
docker exec -ti kubia-container bash
docker stop kubia-container
docker rm kubia-container
docker tag kubia mingch94/kubia
docker push mingch94/kubia
Подготовка окружающей среды
yum install bash-completion Установить bash-дополнение
source <(kubectl completion bash) Включить автодополнение для kubectl
alias k=kubectl Установить псевдоним для kubectl
source <(kubectl completion bash | sed s/kubectl/k/g) Настройте автодополнение для псевдонима k
alias kcd='k config set-context $(k config current-context) --namespace' Установить псевдоним пространства имен коммутатора
Кластерная операция
kubectl cluster-info Просмотр состояния кластера
kubectl get nodes Список узлов кластера
kubectl describe node docker-desktop Просмотр дополнительной информации об узлах кластера
k run kubia --image=mingch94/kubia --port=8080 Развернуть приложение
k get po список стручков
k describe po kubia Подробнее о модуле
k apply -f 8 мая — .IO/examples/co… создать rc
k get rc Посмотреть ресурсы удаленного управления
k expose po kubia --type=LoadBalancer --name kubia-http Создание сервисов и предоставление модулей
k get svc Просмотр сервисных объектов
curl localhost:8080 служба доступа
k шкала rc kubia --replicas=3 Масштабируйте модули по горизонтали до 3
get pods -o wide показать больше столбцов
k get po kubia -o yaml Проверьте описание yaml существующего модуля.
k explain po Анализировать определения модулей
k explain pod.spec Просмотр свойств спецификации
k create -f kubia-manual.yaml Создать pod из yml
kubectl logs kubia-manual -c kubia Просмотр логов контейнера kubia в поде
k port-forward kubia-manual 8888:8080 Перенаправить локальный трафик 8888 на порт 8080 пода
k get po --show-labels Просмотр модулей и всех ярлыков
k get po -L creation_method,env Ярлыки отображаются индивидуально в соответствующем столбце
k label po kubia-manual creation_method=manual Создать ярлыки
k label po kubia-manual-v2 env=debug --overwrite Отредактировать тэги
k get po -l creation_method=manual Запросите модуль, указав значение метки
k get po -l env Укажите имя метки для запроса модуля
k get po -l '!env' Укажите модуль запроса без имени тега env, поддержка !, in, notin
k label node docker-desktop gpu=true Добавить указанную метку к узлу
k annotate pod kubia-manual нет company.com/some press нет ТАТ… bar" Создание аннотаций
k get ns Просмотр всех пространств имен в кластере
k get po -n kube-system Просмотр модулей в указанном пространстве имен
k create ns custom-namespace Создать пространство имен
k config get-contexts Просмотр текущего контекста и соответствующего используемого пространства имен
k delete pod kubia-gpu Удалить поды по имени
k delete po -l creation_method=manual Удаление модулей на основе ярлыков
k delete ns custom-namespace удалить пространство имен и все поды под ним
k delete po --all удалить все стручки
k delete all --all удалить все ресурсы в текущем пространстве имен
k logs kubia-liveness --previous Получить предыдущий журнал контейнера
k edit rc kubia редактировать rc
k delete rc kubia --cascade=false Удалить только rc, оставить модули работать
k get rs посмотреть жк
k get ds вид дс
k get jobs Просмотр вакансий
k exec kubia-p5mz5 -- curl -s http://10.96.72.201 Выполнить команду в поде, - - представляет конец команды kubectl, если нет команды для выполнения - параметр можно удалить
k exec -it kubia-72v4k -- bash Интерактивный вход в модуль для выполнения команд
k get endpoints Просмотр ресурсов конечной точки
k get nodes -o json json способ отображения информации об узле
k get po --all-namespaces Показать все модули под ns
k get ingresses Просмотр входящих служб
k run dnsutils --image=tutum/dnsutils Используйте поды с DNS
k proxy Взаимодействуйте с сервером API через kube-proxy, перейдите по корневому пути, чтобы просмотреть поддерживаемый в настоящее время API.
k create -f kubia-deployment-v1.yaml --record Создать ресурс развертывания, --record означает номер версии записи
k patch deployment kubia -p '{"spec": {"minReadySeconds": 10}}' Сделайте модуль доступным в течение не менее 10 секунд после его создания.
k set image deployment kubia nodejs=luksa/kubia:v2 Измените изображение на luksa/kubia:v2, имя изображения — nodejs.
k rollout status deployment kubia Посмотреть процесс обновления
k rollout undo deployment kubia откат к предыдущей версии
k rollout undo deployment kubia --to-revision=1 откатиться на указанную версию
k rollout pause deployment kubia Приостановить чередующиеся обновления
k rollout resume deployment kubia Отменить непрерывное обновление и вернуться к предыдущей версии.
k apply -f kubia-deployment-v3-with-readinesscheck.yaml Измените объект с полным определением yml

Когда модуль содержит несколько контейнеров, эти контейнеры всегда будут работать на одном и том же узле, то есть модуль никогда не будет охватывать несколько рабочих узлов.

Поскольку несколько процессов не могут быть объединены в одном контейнере, для связывания контейнеров вместе требуется структура более высокого уровня, то есть модули, которые в реальном мире можно понимать как хост.

Контейнеры в одном модуле используют один и тот же IP-адрес и порт, поэтому могут взаимодействовать с другими контейнерами в одном модуле через локальный хост.

Основные части определения пода
Версия API и тип ресурса, описанные YAML apiVersion, kind
метаданные включают имя, пространство имен, теги и другую информацию о контейнере. name, namespace, labels
spec включает фактическое описание содержимого модуля (контейнеров, томов и других данных). containers, volumes
status содержит информацию о запущенном в данный момент поде (состояние, описание и статус контейнера, внутренний IP-адрес и т. д.) conditions, containerStatuses, phase, hostIP
# Kubernets API 版本为 v1
apiVersion: v1
# 资源类型为 pod
kind: Pod
metadata:
  # 资源名称为 kubia-maual
  name: kubia-manual
spec:
  containers:
  # 指定镜像
  - image: luksa/kubia
    # 容器名称
    name: kubia
    ports:
    # 容器监听的端口为 8080
    - containerPort: 8080
      protocol: TCP

Пространство имен не выполняет никакой изоляции запущенных объектов, и зависит ли сетевая изоляция между пространствами имен от сетевого решения, принятого k8s.

Если приложение, которое необходимо развернуть, автоматически поддерживается работоспособным без какого-либо ручного вмешательства, вы не можете создать модуль напрямую, а вместо этого создаете ресурс, такой как rc или deploy, для управления модулем.

Непосредственно созданный модуль будет перезапущен только при сбое мониторинга k8s (управляемом Kubelet на узле), но весь узел выйдет из строя и не может быть заменен новым узлом.

Механизм контейнера зонда
HTTP-зонд GET Выполните HTTP-запрос GET на IP-адрес контейнера. Если код состояния ответа равен 2xx или 3xx, обнаружение считается успешным.
Зонд сокета TCP Попытка установить TCP-соединение с указанным портом контейнера. Если соединение установлено успешно, обнаружение выполнено успешно. В противном случае контейнер перезапускается.
Исполнительный зонд Выполните любую команду в контейнере и проверьте код выхода команды car.Если код состояния равен 0, обнаружение выполнено успешно.
标签匹配过程
Три элемента ReplicationController
label selector Селектор меток, чтобы определить, какие модули находятся в области rc.
replica count Количество реплик, указывает количество модулей, которые должны быть запущены, влияет на существующие модули.
pod template шаблон пода для создания новых реплик пода
радиоуправляемая версия
apiVersion: v1
# rc 类型
kind: ReplicationController
metadata:
  # rc 名称
  name: kubia
spec:
  # 副本数量
  replicas: 3
  # 标签选择器
  selector:
    app: kubia
  # 创建新 pod 时候的模板
  template:
    metadata:
      labels:
        # 模板中的标签必须与标签选择器中的一致, 避免无休止的创建 pod
        app: kubia
    spec:
      containers:
      - name: kubia
        image: luksa/kubia
        ports:
        - containerPort: 8080
рс версия
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: kubia
spec:
  replicas: 3
  selector:
    matchExpressions:
      - key: app
        operator: In
        values:
         - kubia
  template:
    metadata:
      labels:
        app: kubia
    spec:
      containers:
      - name: kubia
        image: luksa/kubia
дс версия
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: ssd-monitor
spec:
  selector:
    matchLabels:
      app: ssd-monitor
  template:
    metadata:
      labels:
        app: ssd-monitor
    spec:
      nodeSelector:
        disk: ssd
      containers:
      - name: main
        image: luksa/ssd-monitor
версия пакетного задания
apiVersion: batch/v1
kind: Job
metadata:
  name: batch-job
spec:
  template:
    metadata:
      labels:
        app: batch-job
    spec:
      restartPolicy: OnFailure
      containers:
      - name: main
        image: luksa/batch-job
сервисная версия
apiVersion: v1
kind: Service
metadata:
  name: kubia
spec:
  # 会话亲和性, 同一个clientIP 的流量会被发送到同一个 pod
  sessionAffinity: ClientIP
  ports:
  # 服务可用端口
  - port: 80
    # 服务将连接转发到的容器端口
    targetPort: 8080
  selector:
    # 具有 app=kubia 标签的 pod 都属于该服务
    app: kubia
Служба внутреннего тестирования кластера
создать модуль Запрос отправляется на кластерный IP-адрес службы, а ответ регистрируется, что можно просмотреть в журнале модуля.
ssh к любому узлу Выполнить curl на удаленном узле
kubectl exec Выполните команду cul на существующем модуле
Предоставление услуг внешним клиентам
NodePort Узел кластера открывает порт на узле и перенаправляет трафик на этот порт в базовую службу.
LoadBalance Расширение типа NodePort, которое делает службы доступными через выделенный балансировщик нагрузки.
Ingress Предоставляет несколько сервисов через один IP-адрес, работающий в сети уровня 7.
service 示例 负载均衡器示例 ingress 示例
Несколько распространенных типов рулонов

Подробнее см.Какой особенный. IO/docs/con обзор…

emptyDir Простой пустой каталог для хранения временных данных
hostPath Смонтируйте каталог из файловой системы рабочего узла в модуль, указав на определенный файл или каталог в файловой системе узла.Постоянные тома, но модули могут быть проблематичными, если они запланированы для других узлов.
gitRepo Проверьте содержимое репозитория git, чтобы инициализировать ваучер.
nfs Общий том nfs, подключенный к поду
gcePersistentDIsk Дисковый том высокопроизводительного хранилища Google
awsElasticBlockStore Объем хранилища эластичных блоков сервиса AWS
azureDisk Том диска Microsoft Azure
configMap, secret, downwardAPI Специальный том, который предоставляет некоторые ресурсы k8s и информацию о кластере модулям.
persistentVolumeClaim Подготовленные или динамически настроенные типы постоянного хранилища
Использование тома emptyDir
apiVersion: v1
kind: Pod
metadata:
  name: fortune
spec:
  containers:
  - image: luksa/fortune
    name: html-generator
    volumeMounts:
    #  名为 html 的卷挂载在容器 /var/htdocs, 可读可写
    - name: html
      mountPath: /var/htdocs
  - image: nginx:alpine
    name: web-server
    volumeMounts:
    # 名为 html 的卷挂载在容器 /usr/share/nginx/html, 只读
    - name: html
      mountPath: /usr/share/nginx/html
      readOnly: true
    ports:
    - containerPort: 80
      protocol: TCP
  volumes:
  # 名为 html 的卷, 挂载在上面两个容器中
  - name: html
    emptyDir: {}
Использование тома gitRepo
apiVersion: v1
kind: Pod
metadata:
  name: gitrepo-volume-pod
spec:
  containers:
  - image: nginx:alpine
    name: web-server
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html
      readOnly: true
    ports:
    - containerPort: 80
      protocol: TCP
  volumes:
  - name: html
    gitRepo:
      repository: https://github.com/chaimcode/kubia-website-example.git
      revision: master
      directory: .
использование службы API
k proxy
curl http://localhost:8001

{
  "paths": [
    "/api",
    "/api/v1",
    "/apis",
    "/apis/",
    "/apis/admissionregistration.k8s.io",
    "/apis/admissionregistration.k8s.io/v1",
    "/apis/admissionregistration.k8s.io/v1beta1",
    "/apis/apiextensions.k8s.io",
    "/apis/apiextensions.k8s.io/v1",
    "/apis/apiextensions.k8s.io/v1beta1",
    "/apis/apiregistration.k8s.io",
    "/apis/apiregistration.k8s.io/v1",
    "/apis/apiregistration.k8s.io/v1beta1",
    "/apis/apps",
    "/apis/apps/v1",
    "/apis/authentication.k8s.io",
    "/apis/authentication.k8s.io/v1",
    "/apis/authentication.k8s.io/v1beta1",
    "/apis/authorization.k8s.io",
    "/apis/authorization.k8s.io/v1",
    "/apis/authorization.k8s.io/v1beta1",
    "/apis/autoscaling",
    "/apis/autoscaling/v1",
    "/apis/autoscaling/v2beta1",
    "/apis/autoscaling/v2beta2",
    "/apis/batch",
    "/apis/batch/v1",
    "/apis/batch/v1beta1",
    "/apis/certificates.k8s.io",
    "/apis/certificates.k8s.io/v1beta1",
    "/apis/compose.docker.com",
    "/apis/compose.docker.com/v1alpha3",
    "/apis/compose.docker.com/v1beta1",
    "/apis/compose.docker.com/v1beta2",
    "/apis/coordination.k8s.io",
    "/apis/coordination.k8s.io/v1",
    "/apis/coordination.k8s.io/v1beta1",
    "/apis/events.k8s.io",
    "/apis/events.k8s.io/v1beta1",
    "/apis/extensions",
    "/apis/extensions/v1beta1",
    "/apis/networking.k8s.io",
    "/apis/networking.k8s.io/v1",
    "/apis/networking.k8s.io/v1beta1",
    "/apis/node.k8s.io",
    "/apis/node.k8s.io/v1beta1",
    "/apis/policy",
    "/apis/policy/v1beta1",
    "/apis/rbac.authorization.k8s.io",
    "/apis/rbac.authorization.k8s.io/v1",
    "/apis/rbac.authorization.k8s.io/v1beta1",
    "/apis/scheduling.k8s.io",
    "/apis/scheduling.k8s.io/v1",
    "/apis/scheduling.k8s.io/v1beta1",
    "/apis/storage.k8s.io",
    "/apis/storage.k8s.io/v1",
    "/apis/storage.k8s.io/v1beta1",
    "/healthz",
    "/healthz/autoregister-completion",
    "/healthz/etcd",
    "/healthz/log",
    "/healthz/ping",
    "/healthz/poststarthook/apiservice-openapi-controller",
    "/healthz/poststarthook/apiservice-registration-controller",
    "/healthz/poststarthook/apiservice-status-available-controller",
    "/healthz/poststarthook/bootstrap-controller",
    "/healthz/poststarthook/ca-registration",
    "/healthz/poststarthook/crd-informer-synced",
    "/healthz/poststarthook/generic-apiserver-start-informers",
    "/healthz/poststarthook/kube-apiserver-autoregistration",
    "/healthz/poststarthook/rbac/bootstrap-roles",
    "/healthz/poststarthook/scheduling/bootstrap-system-priority-classes",
    "/healthz/poststarthook/start-apiextensions-controllers",
    "/healthz/poststarthook/start-apiextensions-informers",
    "/healthz/poststarthook/start-kube-aggregator-informers",
    "/healthz/poststarthook/start-kube-apiserver-admission-initializer",
    "/livez",
    "/livez/autoregister-completion",
    "/livez/etcd",
    "/livez/log",
    "/livez/ping",
    "/livez/poststarthook/apiservice-openapi-controller",
    "/livez/poststarthook/apiservice-registration-controller",
    "/livez/poststarthook/apiservice-status-available-controller",
    "/livez/poststarthook/bootstrap-controller",
    "/livez/poststarthook/ca-registration",
    "/livez/poststarthook/crd-informer-synced",
    "/livez/poststarthook/generic-apiserver-start-informers",
    "/livez/poststarthook/kube-apiserver-autoregistration",
    "/livez/poststarthook/rbac/bootstrap-roles",
    "/livez/poststarthook/scheduling/bootstrap-system-priority-classes",
    "/livez/poststarthook/start-apiextensions-controllers",
    "/livez/poststarthook/start-apiextensions-informers",
    "/livez/poststarthook/start-kube-aggregator-informers",
    "/livez/poststarthook/start-kube-apiserver-admission-initializer",
    "/logs",
    "/metrics",
    "/openapi/v2",
    "/readyz",
    "/readyz/autoregister-completion",
    "/readyz/etcd",
    "/readyz/log",
    "/readyz/ping",
    "/readyz/poststarthook/apiservice-openapi-controller",
    "/readyz/poststarthook/apiservice-registration-controller",
    "/readyz/poststarthook/apiservice-status-available-controller",
    "/readyz/poststarthook/bootstrap-controller",
    "/readyz/poststarthook/ca-registration",
    "/readyz/poststarthook/crd-informer-synced",
    "/readyz/poststarthook/generic-apiserver-start-informers",
    "/readyz/poststarthook/kube-apiserver-autoregistration",
    "/readyz/poststarthook/rbac/bootstrap-roles",
    "/readyz/poststarthook/scheduling/bootstrap-system-priority-classes",
    "/readyz/poststarthook/start-apiextensions-controllers",
    "/readyz/poststarthook/start-apiextensions-informers",
    "/readyz/poststarthook/start-kube-aggregator-informers",
    "/readyz/poststarthook/start-kube-apiserver-admission-initializer",
    "/readyz/shutdown",
    "/version"
  ]
}
версия развертывания
apiVersion: apps/v1
kind: Deployment
metadata:
  name: kubia
spec:
  replicas: 3
  selector:
    matchExpressions:
      - key: app
        operator: In
        values:
         - kubia
  template:
    metadata:
      name: kubia
      labels:
        app: kubia
    spec:
      containers:
      - image: luksa/kubia:v1
        name: nodejs
свойства развертывания, о которых следует знать
minReadySeconds Минимальное доступное время ожидания для модуля, даже если датчик готовности успешно возвращается, время ожидания необходимо изменить.
revisionHistoryLimit Ограничьте количество исторических версий
maxSurge Во время последовательного обновления ожидаемое количество реплик, по умолчанию — 25%, затем, если количество реплик равно 4, в течение периода непрерывного обновления будет не более 5 экземпляров pod.
maxUnavailable Максимальное количество модулей, которые могут быть недоступны во время непрерывного обновления.