Цель
随着部署组件的增多和数据中心的增长, 配置以及管理并保持系统的正常运行变得复杂与困难.
在想要获得足够高的资源利用率并降低硬件成本情况下, 把组件部署在什么地方变得越来越难以决策.
自动化调度, 配置, 监管以及故障处理, 正式 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. |
Несколько распространенных типов рулонов
Подробнее см.Какой особенный. 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 |
Максимальное количество модулей, которые могут быть недоступны во время непрерывного обновления. |