Расширяем и дополняем Kubernetes

93aef1d166a8a3536538eff713f80307?s=47 flant
April 08, 2019

Расширяем и дополняем Kubernetes

Доклад solution-инженера компании «Флант» (https://flant.ru/) Андрея Половова на конференции Saint Highload++ 2019 в Санкт-Петербурге.

* Текстовый обзор доклада: https://habr.com/company/flant/blog/449096/
* Видео с выступления: https://youtu.be/6VHk1R1TNgk

93aef1d166a8a3536538eff713f80307?s=128

flant

April 08, 2019
Tweet

Transcript

  1. Андрей Половов Иван Михейкин Андрей Климентьев Расширяем и дополняем Kubernetes

    v1.1
  2. Организовал АТС в Андрей Половов andrey.polovov@flant.com 10 лет работы во

    «Фланте» Отвечал за онлайн-трансляции в Затащил в кубы Один из первых CKA в компании Привет! Solution-инженер
  3. Buongiorno! Иван Михейкин Ведущий разработчик ivan.mikheykin@flant.com Проприетарный софт есть? А

    если найду? Андрей Климентьев R&D-таран andrey.klimentyev@flant.com
  4. Андрей Половов Иван Михейкин Андрей Климентьев Расширяем и дополняем Kubernetes

  5. None
  6. None
  7. Замечательные абстракции

  8. Замечательные абстракции Независимость от площадки

  9. Замечательные абстракции Независимость от площадки Лучшие практики

  10. Но!

  11. None
  12. Петя

  13. Петя Маша

  14. Петя Маша Артём

  15. Петя Маша Артём

  16. Петя Маша Артём

  17. Петя Маша Артём

  18. Петя Маша Артём

  19. Петя Маша Артём

  20. Петя Маша Артём

  21. Петя Маша Артём

  22. None
  23. и да и нет * запятая не нужна! © gramota.ru

  24. Петя Маша Артём

  25. Петя Маша Артём ? ? ? ? ? ? ?

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
  26. Петя Маша Артём ? ? ? ? ? ? ?

    ? ? ? ? ? ? ? ? ? ? ? ? ? ?
  27. Петя Маша Артём ? ? ? ? ? ? ?

    ? ? ? ? ? ? ? ? ? ? ? ? ? ?
  28. Петя Маша Артём ? ? ? ? ? ? ?

    ? ? ? ? ? ? ? ? ? ? ?
  29. Петя Маша Артём ? ? ? ? ? ? ?

    ? ? ? ? ? ? ? ? ? ? ? ? ? ?
  30. None
  31. N Deployment StatefulSet N

  32. N Deployment StatefulSet Service Ingress N

  33. N Deployment StatefulSet Service Ingress Job CronJob N NetworkPolicy PodDisruptionBudget

    HorizontalPodAutoscaler Pod LoadBalancer Namespace Daemonset ReplicaSet И многое другое:
  34. Наш опыт с Kubernetes в небольших проектах Дмитрий Столяров РИТ++

    2017 goo.gl/y4fXUF N Deployment StatefulSet Service Ingress Job CronJob N NetworkPolicy PodDisruptionBudget HorizontalPodAutoscaler Pod LoadBalancer Namespace Daemonset ReplicaSet И многое другое:
  35. Петя Маша Артём ? ? ? ? ? ? ?

    ? ? ? ? ? ? ? ? ? ? ? ? ? ?
  36. Петя Маша Артём ? ? ? ? ? ? ?

    ? ? ? ? ? ? ? ? ? ? ?
  37. ? ? ? ? ? ? ? ? ? ?

    ? ? ? ? ? ? ? ? Петя Маша Артём
  38. Примеры дополнений ? ? ? ? ? ? ? ?

    ? ? ? ? ? ? ? ? ? ?
  39. Примеры дополнений #1 Network- и Storage-плагины ? ? ? ?

    ? ? ? ? ? ? ? ? ? ? ? ? ? ?
  40. None
  41. None
  42. None
  43. None
  44. None
  45. None
  46. CNI = Container Networking Interface

  47. Network Plugins: kopeio-vxlan Contiv netplugin SR-IOV CNI-Genie CNI = Container

    Networking Interface
  48. None
  49. None
  50. None
  51. Локальный диск Сетевое блочное устройство Распределённая файловая система ...

  52. Локальный диск Сетевое блочное устройство Распределённая файловая система ...

  53. Локальный диск Сетевое блочное устройство Распределённая файловая система ...

  54. CSI = Container Storage Interface Локальный диск Сетевое блочное устройство

    Распределённая файловая система ...
  55. Примеры дополнений #1 Network- и Storage-плагины #2 Ingress-контроллеры ? ?

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
  56. ?

  57. Ingress controller

  58. Ingress controller

  59. Ingress controller F5 BIG-IP ingress-gce

  60. Примеры дополнений #1 Network- и Storage-плагины #2 Ingress-контроллеры #3 Cert-manager

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
  61. None
  62. http://foo.bar.com https://foo.bar.com

  63. Cert-manager

  64. Cert-manager Certificate CRD

  65. Certificate Cert-manager Cert-manager контроллер

  66. Cert-manager контроллер

  67. ns: foo Cert-manager контроллер

  68. ns: foo Ingress: foo.bar.com Cert-manager контроллер

  69. ns: foo Ingress: foo.bar.com Certificate: foo.bar.com Cert-manager контроллер

  70. ns: foo Ingress: foo.bar.com Certificate: foo.bar.com Cert-manager контроллер

  71. ns: foo Ingress: foo.bar.com Certificate: foo.bar.com Cert-manager контроллер

  72. ns: foo Ingress: foo.bar.com Certificate: foo.bar.com Cert-manager контроллер

  73. ns: foo Ingress: foo.bar.com Certificate: foo.bar.com Cert-manager контроллер

  74. ns: foo Ingress: foo.bar.com Certificate: foo.bar.com Cert-manager контроллер

  75. ns: foo Ingress: foo.bar.com Certificate: foo.bar.com Cert-manager контроллер

  76. ns: foo Ingress: foo.bar.com Certificate: foo.bar.com Cert-manager контроллер

  77. ns: foo Ingress: foo.bar.com Certificate: foo.bar.com Cert-manager контроллер

  78. ns: foo Ingress: foo.bar.com Certificate: foo.bar.com https Cert-manager контроллер

  79. Примеры дополнений #1 Network- и Storage-плагины #2 Ingress-контроллеры #3 Cert-manager

    #4 Операторы ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
  80. Operator

  81. Operator Примитив

  82. Operator Примитив Примитив Примитив Примитив

  83. Operator Примитив Примитив Примитив Примитив Контроллер

  84. Контроллер Контроллер Контроллер Примитив Примитив Примитив Примитив Operator Контроллер

  85. ns: foo MyDB-controller

  86. ns: foo MyDBCluster MyDB-controller

  87. ns: foo MyDBCluster MyDB-controller

  88. ns: foo MyDBCluster mydb-0 mydb-1 mydb-2 MyDB-controller

  89. HPA Operator Operator Cluster Autoscaler Kanister Airflow MXNet Spark (GCP)

    Tensorflow PyTorch DynamoDB Keel Flux CouchDB MongoDB (Official) RethinkDB Couchbase (official) ArangoDB svcat AWS (Giant Swarm) CloudFormation KubeVirt OpenStack VPC Peering KVM WildFly ...
  90. HPA Operator Operator Cluster Autoscaler Kanister Airflow MXNet Spark (GCP)

    Tensorflow PyTorch DynamoDB Keel Flux CouchDB MongoDB (Official) RethinkDB Couchbase (official) ArangoDB svcat AWS (Giant Swarm) CloudFormation KubeVirt OpenStack VPC Peering KVM WildFly ... * по состоянию на апрель 2019
  91. HPA Operator Operator Cluster Autoscaler Kanister Airflow MXNet Spark (GCP)

    Tensorflow PyTorch DynamoDB Keel Flux CouchDB MongoDB (Official) RethinkDB Couchbase (official) ArangoDB svcat AWS (Giant Swarm) CloudFormation KubeVirt OpenStack VPC Peering KVM WildFly ... * по состоянию на апрель 2019
  92. Примеры дополнений #1 Network- и Storage-плагины #2 Ingress-контроллеры #3 Cert-manager

    #4 Операторы #5 Metrics API ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
  93. Deployment: foo.bar.com

  94. Deployment: foo.bar.com 3

  95. Deployment: foo.bar.com 3

  96. Deployment: foo.bar.com 3

  97. Deployment: foo.bar.com 3

  98. Deployment: foo.bar.com 3

  99. None
  100. Deployment: foo.bar.com 3

  101. Deployment: foo.bar.com HPA cpu_utilization <= 50% 3

  102. Deployment: foo.bar.com HPA cpu_utilization <= 50% 3

  103. Deployment: foo.bar.com HPA cpu_utilization <= 50% 3

  104. Deployment: foo.bar.com HPA cpu_utilization <= 50% 4

  105. Deployment: foo.bar.com HPA cpu_utilization <= 50% 4

  106. Deployment: foo.bar.com HPA cpu_utilization <= 50% 4

  107. Deployment: foo.bar.com 4 HPA cpu_utilization <= 50%

  108. Deployment: foo.bar.com 4 HPA cpu_utilization <= 50%

  109. Deployment: foo.bar.com 4 HPA cpu_utilization <= 50% ?

  110. Deployment: foo.bar.com 4 HPA cpu_utilization <= 50% источник

  111. Deployment: foo.bar.com 4 HPA cpu_utilization <= 50%

  112. Deployment: foo.bar.com 4 HPA cpu_utilization <= 50%

  113. Deployment: foo.bar.com 4 HPA cpu_utilization <= 50%

  114. Deployment: foo.bar.com 4 HPA cpu_utilization <= 50%

  115. Deployment: foo.bar.com 4 HPA cpu_utilization <= 50%

  116. None
  117. None
  118. Deployment: foo.bar.com 4 HPA cpu_utilization <= 50%

  119. Deployment: foo.bar.com 4 HPA cpu_utilization <= 50% Metrics API

  120. Deployment: foo.bar.com 4 HPA cpu_utilization <= 50% Metrics API Metrics

    adapter
  121. 4 HPA cpu_utilization <= 50% Metrics API Metrics adapter

  122. 4 HPA cpu_utilization <= 50% Metrics API Metrics adapter Metrics

    server Prometheus adapter Azure adapter Datadog cluster agent Google stackdriver
  123. Примеры дополнений #1 Network- и Storage-плагины #2 Ingress-контроллеры #3 Cert-manager

    #4 Операторы #5 Metrics API #6 Мониторинг и статистика ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
  124. None
  125. Prometheus и Grafana

  126. Ещё поставить: Prometheus и Grafana

  127. kube-state-metrics Ещё поставить: Prometheus и Grafana

  128. kube-state-metrics node-exporter Ещё поставить: Prometheus и Grafana

  129. kube-state-metrics node-exporter Trickster Ещё поставить: Prometheus и Grafana

  130. kube-state-metrics node-exporter Trickster Prometheus для long-term Ещё поставить: Prometheus и

    Grafana
  131. kube-state-metrics node-exporter Trickster Prometheus для long-term Ещё поставить: Ещё настроить:

    Prometheus и Grafana
  132. kube-state-metrics node-exporter Trickster Prometheus для long-term Ещё поставить: права (RBAC)

    Ещё настроить: Prometheus и Grafana
  133. kube-state-metrics node-exporter Trickster Prometheus для long-term Ещё поставить: права (RBAC)

    аутентификация Прометея Ещё настроить: Prometheus и Grafana
  134. Prometheus и Grafana kube-state-metrics node-exporter Trickster Prometheus для long-term Ещё

    поставить: права (RBAC) аутентификация Прометея нюансы в конфиге Прометея Ещё настроить:
  135. Примеры дополнений #1 Network- и Storage-плагины #2 Ingress-контроллеры #3 Cert-manager

    #4 Операторы #5 Metrics API #6 Мониторинг и статистика ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
  136. 29 дополнений

  137. 29 дополнений 248 объектов

  138. Примеры дополнений #1 Network и Storage плагины #2 Ingress контроллеры

    #3 Cert-manager #4 Операторы #5 Metrics API #6 Мониторинг и статистика ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? без дополнений жизни нет
  139. Автоматизация

  140. Пример из жизни #1

  141. ns2 ns1

  142. ns2 ns1

  143. ns2 ns1

  144. ns2 ns1

  145. ns2 ns1

  146. ... ns200 ns2 ns1

  147. None
  148. None
  149. None
  150. Operator

  151. Контроллер Operator

  152. Контроллер Operator ns-foo

  153. Контроллер Operator ns-foo

  154. Контроллер Operator ns-foo

  155. Пример из жизни #2

  156. ns2 ns1

  157. ns2 ns1 WAN

  158. ns2 ns1 WAN

  159. ns2 ns1 WAN

  160. ns2 ns1 WAN allow: wan

  161. ns2 ns1 WAN allow: wan

  162. Operator

  163. Контроллер Operator

  164. ns1 WAN Контроллер Operator

  165. ns1 Контроллер Operator WAN allow: wan

  166. ns1 Контроллер Operator WAN allow: wan

  167. ns1 Контроллер Operator WAN allow: wan NetworkPolicy

  168. Пример из жизни #3

  169. None
  170. dedicated: db

  171. dedicated: db dedicated: db

  172. Раскладывание секретов Настройка NetworkPolicy Простановка тейнтов ...

  173. Раскладывание секретов Настройка NetworkPolicy Простановка тейнтов ... без операторов жизни

    нет
  174. None
  175. Хотите Kubernetes с комфортом?

  176. Хотите Kubernetes с комфортом? Потребуется:

  177. Хотите Kubernetes с комфортом? устанавливать Дополнения Потребуется:

  178. Хотите Kubernetes с комфортом? устанавливать Дополнения разрабатывать Операторы Потребуется:

  179. Хотите Kubernetes с комфортом? устанавливать Дополнения разрабатывать Операторы Потребуется: Андрей

    Половов Иван Михейкин Расширяем и дополняем Kubernetes
  180. Operator

  181. как написать оператор?

  182. API API

  183. API Go API

  184. Go API

  185. Go API

  186. Контроллер Go API

  187. Контроллер Go API

  188. Контроллер API Go

  189. Контроллер API Go

  190. Go API Контроллер

  191. Контроллер Go API

  192. Контроллер Go API

  193. MySQL operator

  194. MySQL operator Go API

  195. MySQL operator Go API

  196. А если задача попроще?

  197. А если задача попроще? Раскладывание секретов Настройка NetworkPolicy Простановка тейнтов

  198. А если задача попроще? Раскладывание секретов Настройка NetworkPolicy Простановка тейнтов

    API Go
  199. Так, что тут у наc? Operator SDK... Лучше изоленту заюзаю!

    Да ну его нафиг
  200. Так, что тут у наc? Operator SDK... Лучше изоленту заюзаю!

    Да ну его нафиг
  201. Так, что тут у наc? Operator SDK... Лучше изоленту заюзаю!

    Да ну его нафиг
  202. Так, что тут у наc? Operator SDK... Лучше изоленту заюзаю!

    Да ну его нафиг!
  203. Так, что тут у наc? Operator SDK... Проще крон-скриптик! Да

    ну его нафиг!
  204. None
  205. vs

  206. vs как написать оператор?

  207. vs как написать оператор?

  208. vs как написать оператор? как написать оператор просто?

  209. shell-operator представляем github.com/flant/shell-operator hub.docker.com/r/flant/shell-operator

  210. None
  211. Kubernetes API

  212. Kubernetes API

  213. Kubernetes API #!

  214. Kubernetes API #! #! #! #!

  215. Kubernetes API #! #! #! #!

  216. Kubernetes API #! #! #! #!

  217. Kubernetes API #! #! #! #!

  218. Kubernetes API #! #! #! #!

  219. Kubernetes API #! #! #! #!

  220. Kubernetes API #! #! #! #!

  221. Kubernetes API #! #! #! #!

  222. Kubernetes API #! #! #! #!

  223. Kubernetes API #! #! #! #!

  224. #! #! #! Kubernetes API #!

  225. Kubernetes API #! #! #! #!

  226. Настройка хуков $ my-hook.sh

  227. Настройка хуков $ my-hook.sh --config

  228. $ my-hook.sh --config { "onKubernetesEvent": [ { "kind": "pod", "event":

    ["add", "update", "delete"] } ] } Настройка хуков
  229. $ my-hook.sh --config { "onKubernetesEvent": [ { "kind": "pod", "event":

    ["add", "update", "delete"] } ] } Настройка хуков
  230. $ my-hook.sh --config { "onKubernetesEvent": [ { "kind": "pod", "event":

    ["add", "update", "delete"] } ] } Настройка хуков
  231. Kubernetes API #! #! #! #!

  232. Внедряем shell-оператор

  233. ... ns200 ns2 ns1 Внедряем shell-оператор

  234. ... ns200 ns2 ns1 Внедряем shell-оператор

  235. Внедряем shell-оператор

  236. пишем хук Внедряем shell-оператор

  237. if [[ $1 == "--config" ]] ; then пишем хук

    Внедряем shell-оператор
  238. if [[ $1 == "--config" ]] ; then cat <<

    EOF { "onKubernetesEvent": [ { "kind": "namespace", "event": ["add"] } ] } EOF пишем хук Внедряем shell-оператор
  239. if [[ $1 == "--config" ]] ; then cat <<

    EOF { "onKubernetesEvent": [ { "kind": "namespace", "event": ["add"] } ] } EOF пишем хук Внедряем shell-оператор
  240. if [[ $1 == "--config" ]] ; then cat <<

    EOF { "onKubernetesEvent": [ { "kind": "namespace", "event": ["add"] } ] } EOF пишем хук Внедряем shell-оператор
  241. if [[ $1 == "--config" ]] ; then cat <<

    EOF { "onKubernetesEvent": [ { "kind": "namespace", "event": ["add"] } ] } EOF пишем хук Внедряем shell-оператор
  242. if [[ $1 == "--config" ]] ; then cat <<

    EOF { "onKubernetesEvent": [ { "kind": "namespace", "event": ["add"] } ] } EOF else createdNamespace=$(jq -r '.[0].resourceName' $BINDING_CONTEXT_PATH) kubectl create -n ${createdNamespace} -f - << EOF Kind: Secret ... EOF fi пишем хук Внедряем shell-оператор
  243. if [[ $1 == "--config" ]] ; then cat <<

    EOF { "onKubernetesEvent": [ { "kind": "namespace", "event": ["add"] } ] } EOF else createdNamespace=$(jq -r '.[0].resourceName' $BINDING_CONTEXT_PATH) kubectl create -n ${createdNamespace} -f - << EOF Kind: Secret ... EOF fi пишем хук Внедряем shell-оператор
  244. if [[ $1 == "--config" ]] ; then cat <<

    EOF { "onKubernetesEvent": [ { "kind": "namespace", "event": ["add"] } ] } EOF else createdNamespace=$(jq -r '.[0].resourceName' $BINDING_CONTEXT_PATH) kubectl create -n ${createdNamespace} -f - << EOF Kind: Secret ... EOF fi пишем хук Внедряем shell-оператор
  245. if [[ $1 == "--config" ]] ; then cat <<

    EOF { "onKubernetesEvent": [ { "kind": "namespace", "event": ["add"] } ] } EOF else createdNamespace=$(jq -r '.[0].resourceName' $BINDING_CONTEXT_PATH) kubectl create -n ${createdNamespace} -f - << EOF Kind: Secret ... EOF fi пишем хук Внедряем shell-оператор
  246. пишем хук Внедряем shell-оператор

  247. пишем хук > билдим образ Внедряем shell-оператор

  248. FROM flant/shell-operator:v1.0.0-beta.1 пишем хук > билдим образ Внедряем shell-оператор

  249. FROM flant/shell-operator:v1.0.0-beta.1 ADD my-handler.sh /hooks пишем хук > билдим образ

    Внедряем shell-оператор
  250. FROM flant/shell-operator:v1.0.0-beta.1 ADD my-handler.sh /hooks пишем хук > билдим образ

    Внедряем shell-оператор
  251. FROM flant/shell-operator:v1.0.0-beta.1 ADD my-handler.sh /hooks $ docker build -t registry.example.com/my-operator:v1

    . пишем хук > билдим образ Внедряем shell-оператор
  252. FROM flant/shell-operator:v1.0.0-beta.1 ADD my-handler.sh /hooks $ docker build -t registry.example.com/my-operator:v1

    . $ docker push registry.example.com/my-operator:v1 пишем хук > билдим образ Внедряем shell-оператор
  253. пишем хук > билдим образ Внедряем shell-оператор

  254. пишем хук > билдим образ > деплоим в кластер Внедряем

    shell-оператор
  255. пишем хук > билдим образ > деплоим в кластер Внедряем

    shell-оператор deployment.yaml
  256. apiVersion: extensions/v1beta1 kind: Deployment metadata: name: my-operator spec: template: spec:

    containers: - name: my-operator image: registry.example.com/my-operator:v1 serviceAccountName: my-operator пишем хук > билдим образ > деплоим в кластер Внедряем shell-оператор deployment.yaml
  257. apiVersion: extensions/v1beta1 kind: Deployment metadata: name: my-operator spec: template: spec:

    containers: - name: my-operator image: registry.example.com/my-operator:v1 serviceAccountName: my-operator пишем хук > билдим образ > деплоим в кластер Внедряем shell-оператор deployment.yaml
  258. apiVersion: extensions/v1beta1 kind: Deployment metadata: name: my-operator spec: template: spec:

    containers: - name: my-operator image: registry.example.com/my-operator:v1 serviceAccountName: my-operator пишем хук > билдим образ > деплоим в кластер Внедряем shell-оператор deployment.yaml
  259. пишем хук > билдим образ > деплоим в кластер Внедряем

    shell-оператор deployment.yaml
  260. пишем хук > билдим образ > деплоим в кластер Внедряем

    shell-оператор deployment.yaml rbac.yaml
  261. Создать ServiceAccount “my-operator”. пишем хук > билдим образ > деплоим

    в кластер Внедряем shell-оператор deployment.yaml rbac.yaml
  262. Создать ServiceAccount “my-operator”. Создать ClusterRole. пишем хук > билдим образ

    > деплоим в кластер Внедряем shell-оператор deployment.yaml rbac.yaml
  263. пишем хук > билдим образ > деплоим в кластер Внедряем

    shell-оператор deployment.yaml rbac.yaml Создать ServiceAccount “my-operator”. Создать ClusterRole. Привязать ServiceAccount к ClusterRole (ClusterRoleBinding).
  264. пишем хук > билдим образ > деплоим в кластер Внедряем

    shell-оператор deployment.yaml rbac.yaml Создать ServiceAccount “my-operator”. Создать ClusterRole. Привязать ServiceAccount к ClusterRole (ClusterRoleBinding). Всё как обычно!
  265. Раскладывание секретов #!

  266. Что ещё?

  267. Что ещё? #1 Объекты можно фильтровать!

  268. Что ещё? #1 Объекты можно фильтровать! ns1

  269. Что ещё? #1 Объекты можно фильтровать! ns1 allow: wan

  270. Что ещё? #1 Объекты можно фильтровать!

  271. Что ещё? "onKubernetesEvent": [ { "selector": { #1 Объекты можно

    фильтровать!
  272. Что ещё? "onKubernetesEvent": [ { "selector": { "matchLabels": { "foo":

    "bar", } #1 Объекты можно фильтровать!
  273. Что ещё? "onKubernetesEvent": [ { "selector": { "matchLabels": { "foo":

    "bar", }, "matchExpressions": [ { "key": "allow", "operation": "In", "values": ["wan", "warehouse"], }, ], } ... } ] #1 Объекты можно фильтровать!
  274. Что ещё?

  275. Что ещё? #2 Механизм дедупликации (jq-фильтр)

  276. Что ещё? #2 Механизм дедупликации (jq-фильтр) Deployment: foo 3

  277. Что ещё? #2 Механизм дедупликации (jq-фильтр) { "apiVersion": "extensions/v1beta1", "kind":

    "Deployment", "metadata": { "annotations": { "deployment.kubernetes.io/revision": "170" }, "creationTimestamp": "2017-12-25T18:21:00Z", "generation": 272, "labels": { "heritage": "antiopa", "service": "antiopa" }, "name": "antiopa", "namespace": "antiopa", "resourceVersion": "129971044", "selfLink": "/apis/extensions/v1beta1/namespaces/antiopa/deployments/antiopa", "uid": "5bee440f-e9a0-11e7-be2a-52540080d234" }, "spec": { "progressDeadlineSeconds": 600, "replicas": 1, "revisionHistoryLimit": 2, "selector": { "matchLabels": { "service": "antiopa" } }, "strategy": { "rollingUpdate": { "maxSurge": 1, "maxUnavailable": 1 }, "type": "RollingUpdate" }, "template": { "metadata": { "creationTimestamp": null, "labels": { "antiopaImageId": "sha256_43bd595c4026bfad74b52f71b4579b12f68b65b95ede25f426cd4dfd", "service": "antiopa" } }, "spec": { "containers": [ { "command": [ "/antiopa/antiopa" ], "env": [ { "name": "KUBERNETES_DEPLOYED", "value": "2018-01-10 15:22:44+03:00" }, { "name": "RLOG_LOG_LEVEL", "value": "INFO" }, ...
  278. Что ещё? #2 Механизм дедупликации (jq-фильтр) { "apiVersion": "extensions/v1beta1", "kind":

    "Deployment", "metadata": { "annotations": { "deployment.kubernetes.io/revision": "170" }, "creationTimestamp": "2017-12-25T18:21:00Z", "generation": 273, "labels": { "heritage": "antiopa", "service": "antiopa" }, "name": "antiopa", "namespace": "antiopa", "resourceVersion": "129971044", "selfLink": "/apis/extensions/v1beta1/namespaces/antiopa/deployments/antiopa", "uid": "5bee440f-e9a0-11e7-be2a-52540080d234" }, "spec": { "progressDeadlineSeconds": 600, "replicas": 1, "revisionHistoryLimit": 2, "selector": { "matchLabels": { "service": "antiopa" } }, "strategy": { "rollingUpdate": { "maxSurge": 1, "maxUnavailable": 1 }, "type": "RollingUpdate" }, "template": { "metadata": { "creationTimestamp": null, "labels": { "antiopaImageId": "sha256_43bd595c4026bfad74b52f71b4579b12f68b65b95ede25f426cd4dfd", "service": "antiopa" } }, "spec": { "containers": [ { "command": [ "/antiopa/antiopa" ], "env": [ { "name": "KUBERNETES_DEPLOYED", "value": "2018-01-10 15:22:44+03:00" }, { "name": "RLOG_LOG_LEVEL", "value": "INFO" }, ...
  279. Что ещё? #2 Механизм дедупликации (jq-фильтр) { "apiVersion": "extensions/v1beta1", "kind":

    "Deployment", "metadata": { "annotations": { "deployment.kubernetes.io/revision": "170" }, "creationTimestamp": "2017-12-25T18:21:00Z", "generation": 272, "labels": { "heritage": "antiopa", "service": "antiopa" }, "name": "antiopa", "namespace": "antiopa", "resourceVersion": "129971044", "selfLink": "/apis/extensions/v1beta1/namespaces/antiopa/deployments/antiopa", "uid": "5bee440f-e9a0-11e7-be2a-52540080d234" }, "spec": { "progressDeadlineSeconds": 600, "replicas": 1, "revisionHistoryLimit": 2, "selector": { "matchLabels": { "service": "antiopa" } }, "strategy": { "rollingUpdate": { "maxSurge": 1, "maxUnavailable": 1 }, "type": "RollingUpdate" }, "template": { "metadata": { "creationTimestamp": null, "labels": { "antiopaImageId": "sha256_43bd595c4026bfad74b52f71b4579b12f68b65b95ede25f426cd4dfd", "service": "antiopa" } }, "spec": { "containers": [ { "command": [ "/antiopa/antiopa" ], "env": [ { "name": "KUBERNETES_DEPLOYED", "value": "2018-01-10 15:22:44+03:00" }, { "name": "RLOG_LOG_LEVEL", "value": "INFO" }, ...
  280. { "apiVersion": "extensions/v1beta1", "kind": "Deployment", "metadata": { "annotations": { "deployment.kubernetes.io/revision":

    "170" }, "creationTimestamp": "2017-12-25T18:21:00Z", "generation": 272, "labels": { "heritage": "antiopa", "service": "antiopa" }, "name": "antiopa", "namespace": "antiopa", "resourceVersion": "129971044", "selfLink": "/apis/extensions/v1beta1/namespaces/antiopa/deployments/antiopa", "uid": "5bee440f-e9a0-11e7-be2a-52540080d234" }, "spec": { "progressDeadlineSeconds": 600, "replicas": 1, "revisionHistoryLimit": 2, "selector": { "matchLabels": { "service": "antiopa" } }, "strategy": { "rollingUpdate": { "maxSurge": 1, "maxUnavailable": 1 }, "type": "RollingUpdate" }, "template": { "metadata": { "creationTimestamp": null, "labels": { "antiopaImageId": "sha256_43bd595c4026bfad74b52f71b4579b12f68b65b95ede25f426cd4dfd", "service": "antiopa" } }, "spec": { "containers": [ { "command": [ "/antiopa/antiopa" ], "env": [ { "name": "KUBERNETES_DEPLOYED", "value": "2018-01-10 16:22:44+03:00" }, { "name": "RLOG_LOG_LEVEL", "value": "INFO" }, ... Что ещё? #2 Механизм дедупликации (jq-фильтр)
  281. Что ещё? #2 Механизм дедупликации (jq-фильтр) { "apiVersion": "extensions/v1beta1", "kind":

    "Deployment", "metadata": { "annotations": { "deployment.kubernetes.io/revision": "170" }, "creationTimestamp": "2017-12-25T18:21:00Z", "generation": 272, "labels": { "heritage": "antiopa", "service": "antiopa" }, "name": "antiopa", "namespace": "antiopa", "resourceVersion": "129971044", "selfLink": "/apis/extensions/v1beta1/namespaces/antiopa/deployments/antiopa", "uid": "5bee440f-e9a0-11e7-be2a-52540080d234" }, "spec": { "progressDeadlineSeconds": 600, "replicas": 1, "revisionHistoryLimit": 2, "selector": { "matchLabels": { "service": "antiopa" } }, "strategy": { "rollingUpdate": { "maxSurge": 1, "maxUnavailable": 1 }, "type": "RollingUpdate" }, "template": { "metadata": { "creationTimestamp": null, "labels": { "antiopaImageId": "sha256_43bd595c4026bfad74b52f71b4579b12f68b65b95ede25f426cd4dfd", "service": "antiopa" } }, "spec": { "containers": [ { "command": [ "/antiopa/antiopa" ], "env": [ { "name": "KUBERNETES_DEPLOYED", "value": "2018-01-10 15:22:44+03:00" }, { "name": "RLOG_LOG_LEVEL", "value": "INFO" }, ...
  282. Что ещё? #2 Механизм дедупликации (jq-фильтр) { "apiVersion": "extensions/v1beta1", "kind":

    "Deployment", "metadata": { "annotations": { "deployment.kubernetes.io/revision": "170" }, "creationTimestamp": "2017-12-25T18:21:00Z", "generation": 272, "labels": { "heritage": "antiopa", "service": "antiopa" }, "name": "antiopa", "namespace": "antiopa", "resourceVersion": "129971044", "selfLink": "/apis/extensions/v1beta1/namespaces/antiopa/deployments/antiopa", "uid": "5bee440f-e9a0-11e7-be2a-52540080d234" }, "spec": { "progressDeadlineSeconds": 600, "replicas": 1, "revisionHistoryLimit": 2, "selector": { "matchLabels": { "service": "antiopa" } }, "strategy": { "rollingUpdate": { "maxSurge": 1, "maxUnavailable": 1 }, "type": "RollingUpdate" }, "template": { "metadata": { "creationTimestamp": null, "labels": { "antiopaImageId": "sha256_43bd595c4026bfad74b52f71b4579b12f68b65b95ede25f426cd4dfd", "service": "antiopa" } }, "spec": { "containers": [ { "command": [ "/antiopa/antiopa" ], "env": [ { "name": "KUBERNETES_DEPLOYED", "value": "2018-01-10 15:22:44+03:00" }, { "name": "RLOG_LOG_LEVEL", "value": "INFO" }, ...
  283. { "apiVersion": "extensions/v1beta1", "kind": "Deployment", "metadata": { "annotations": { "deployment.kubernetes.io/revision":

    "170" }, "creationTimestamp": "2017-12-25T18:21:00Z", "generation": 272, "labels": { "heritage": "antiopa", "service": "antiopa" }, "name": "antiopa", "namespace": "antiopa", "resourceVersion": "129971044", "selfLink": "/apis/extensions/v1beta1/namespaces/antiopa/deployments/antiopa", "uid": "5bee440f-e9a0-11e7-be2a-52540080d234" }, "spec": { "progressDeadlineSeconds": 600, "replicas": 1, "revisionHistoryLimit": 2, "selector": { "matchLabels": { "service": "antiopa" } }, "strategy": { "rollingUpdate": { "maxSurge": 1, "maxUnavailable": 1 }, "type": "RollingUpdate" }, "template": { "metadata": { "creationTimestamp": null, "labels": { "antiopaImageId": "sha256_43bd595c4026bfad74b52f71b4579b12f68b65b95ede25f426cd4dfd", "service": "antiopa" } }, "spec": { "containers": [ { "command": [ "/antiopa/antiopa" ], "env": [ { "name": "KUBERNETES_DEPLOYED", "value": "2018-01-10 15:22:44+03:00" }, { "name": "RLOG_LOG_LEVEL", "value": "INFO" }, ... Что ещё? #2 Механизм дедупликации (jq-фильтр)
  284. { "apiVersion": "extensions/v1beta1", "kind": "Deployment", "metadata": { "annotations": { "deployment.kubernetes.io/revision":

    "170" }, "creationTimestamp": "2017-12-25T18:21:00Z", "generation": 272, "labels": { "heritage": "antiopa", "service": "antiopa" }, "name": "antiopa", "namespace": "antiopa", "resourceVersion": "129971044", "selfLink": "/apis/extensions/v1beta1/namespaces/antiopa/deployments/antiopa", "uid": "5bee440f-e9a0-11e7-be2a-52540080d234" }, "spec": { "progressDeadlineSeconds": 600, "replicas": 1, "revisionHistoryLimit": 2, "selector": { "matchLabels": { "service": "antiopa" } }, "strategy": { "rollingUpdate": { "maxSurge": 1, "maxUnavailable": 1 }, "type": "RollingUpdate" }, "template": { "metadata": { "creationTimestamp": null, "labels": { "antiopaImageId": "sha256_43bd595c4026bfad74b52f71b4579b12f68b65b95ede25f426cd4dfd", "service": "antiopa" } }, "spec": { "containers": [ { "command": [ "/antiopa/antiopa" ], "env": [ { "name": "KUBERNETES_DEPLOYED", "value": "2018-01-10 15:22:44+03:00" }, { "name": "RLOG_LOG_LEVEL", "value": "INFO" }, ... Что ещё? #2 Механизм дедупликации (jq-фильтр) jq .spec.replicas
  285. Что ещё? #2 Механизм дедупликации (jq-фильтр) { "replicas": 1 }

    { "apiVersion": "extensions/v1beta1", "kind": "Deployment", "metadata": { "annotations": { "deployment.kubernetes.io/revision": "170" }, "creationTimestamp": "2017-12-25T18:21:00Z", "generation": 272, "labels": { "heritage": "antiopa", "service": "antiopa" }, "name": "antiopa", "namespace": "antiopa", "resourceVersion": "129971044", "selfLink": "/apis/extensions/v1beta1/namespaces/antiopa/deployments/antiopa", "uid": "5bee440f-e9a0-11e7-be2a-52540080d234" }, "spec": { "progressDeadlineSeconds": 600, "replicas": 1, "revisionHistoryLimit": 2, "selector": { "matchLabels": { "service": "antiopa" } }, "strategy": { "rollingUpdate": { "maxSurge": 1, "maxUnavailable": 1 }, "type": "RollingUpdate" }, "template": { "metadata": { "creationTimestamp": null, "labels": { "antiopaImageId": "sha256_43bd595c4026bfad74b52f71b4579b12f68b65b95ede25f426cd4dfd", "service": "antiopa" } }, "spec": { "containers": [ { "command": [ "/antiopa/antiopa" ], "env": [ { "name": "KUBERNETES_DEPLOYED", "value": "2018-01-10 15:22:44+03:00" }, { "name": "RLOG_LOG_LEVEL", "value": "INFO" }, ... jq .spec.replicas
  286. Что ещё? #2 Механизм дедупликации (jq-фильтр) { "replicas": 1 }

    { "apiVersion": "extensions/v1beta1", "kind": "Deployment", "metadata": { "annotations": { "deployment.kubernetes.io/revision": "170" }, "creationTimestamp": "2017-12-25T18:21:00Z", "generation": 272, "labels": { "heritage": "antiopa", "service": "antiopa" }, "name": "antiopa", "namespace": "antiopa", "resourceVersion": "129971044", "selfLink": "/apis/extensions/v1beta1/namespaces/antiopa/deployments/antiopa", "uid": "5bee440f-e9a0-11e7-be2a-52540080d234" }, "spec": { "progressDeadlineSeconds": 600, "replicas": 1, "revisionHistoryLimit": 2, "selector": { "matchLabels": { "service": "antiopa" } }, "strategy": { "rollingUpdate": { "maxSurge": 1, "maxUnavailable": 1 }, "type": "RollingUpdate" }, "template": { "metadata": { "creationTimestamp": null, "labels": { "antiopaImageId": "sha256_43bd595c4026bfad74b52f71b4579b12f68b65b95ede25f426cd4dfd", "service": "antiopa" } }, "spec": { "containers": [ { "command": [ "/antiopa/antiopa" ], "env": [ { "name": "KUBERNETES_DEPLOYED", "value": "2018-01-10 15:22:44+03:00" }, { "name": "RLOG_LOG_LEVEL", "value": "INFO" }, ... jq .spec.replicas
  287. Что ещё? #2 Механизм дедупликации (jq-фильтр) { "replicas": 1 }

    { "apiVersion": "extensions/v1beta1", "kind": "Deployment", "metadata": { "annotations": { "deployment.kubernetes.io/revision": "170" }, "creationTimestamp": "2017-12-25T18:21:00Z", "generation": 272, "labels": { "heritage": "antiopa", "service": "antiopa" }, "name": "antiopa", "namespace": "antiopa", "resourceVersion": "129971044", "selfLink": "/apis/extensions/v1beta1/namespaces/antiopa/deployments/antiopa", "uid": "5bee440f-e9a0-11e7-be2a-52540080d234" }, "spec": { "progressDeadlineSeconds": 600, "replicas": 1, "revisionHistoryLimit": 2, "selector": { "matchLabels": { "service": "antiopa" } }, "strategy": { "rollingUpdate": { "maxSurge": 1, "maxUnavailable": 1 }, "type": "RollingUpdate" }, "template": { "metadata": { "creationTimestamp": null, "labels": { "antiopaImageId": "sha256_43bd595c4026bfad74b52f71b4579b12f68b65b95ede25f426cd4dfd", "service": "antiopa" } }, "spec": { "containers": [ { "command": [ "/antiopa/antiopa" ], "env": [ { "name": "KUBERNETES_DEPLOYED", "value": "2018-01-10 15:22:44+03:00" }, { "name": "RLOG_LOG_LEVEL", "value": "INFO" }, ... jq .spec.replicas
  288. { "apiVersion": "extensions/v1beta1", "kind": "Deployment", "metadata": { "annotations": { "deployment.kubernetes.io/revision":

    "170" }, "creationTimestamp": "2017-12-25T18:21:00Z", "generation": 272, "labels": { "heritage": "antiopa", "service": "antiopa" }, "name": "antiopa", "namespace": "antiopa", "resourceVersion": "129971044", "selfLink": "/apis/extensions/v1beta1/namespaces/antiopa/deployments/antiopa", "uid": "5bee440f-e9a0-11e7-be2a-52540080d234" }, "spec": { "progressDeadlineSeconds": 600, "replicas": 1, "revisionHistoryLimit": 2, "selector": { "matchLabels": { "service": "antiopa" } }, "strategy": { "rollingUpdate": { "maxSurge": 1, "maxUnavailable": 1 }, "type": "RollingUpdate" }, "template": { "metadata": { "creationTimestamp": null, "labels": { "antiopaImageId": "sha256_43bd595c4026bfad74b52f71b4579b12f68b65b95ede25f426cd4dfd", "service": "antiopa" } }, "spec": { "containers": [ { "command": [ "/antiopa/antiopa" ], "env": [ { "name": "KUBERNETES_DEPLOYED", "value": "2018-01-10 15:22:44+03:00" }, { "name": "RLOG_LOG_LEVEL", "value": "INFO" }, ... Что ещё? #2 Механизм дедупликации (jq-фильтр) { "replicas": 1 } jq .spec.replicas
  289. Что ещё? #2 Механизм дедупликации (jq-фильтр) { "replicas": 2 }

    { "apiVersion": "extensions/v1beta1", "kind": "Deployment", "metadata": { "annotations": { "deployment.kubernetes.io/revision": "170" }, "creationTimestamp": "2017-12-25T18:21:00Z", "generation": 272, "labels": { "heritage": "antiopa", "service": "antiopa" }, "name": "antiopa", "namespace": "antiopa", "resourceVersion": "129971044", "selfLink": "/apis/extensions/v1beta1/namespaces/antiopa/deployments/antiopa", "uid": "5bee440f-e9a0-11e7-be2a-52540080d234" }, "spec": { "progressDeadlineSeconds": 600, "replicas": 1, "revisionHistoryLimit": 2, "selector": { "matchLabels": { "service": "antiopa" } }, "strategy": { "rollingUpdate": { "maxSurge": 1, "maxUnavailable": 1 }, "type": "RollingUpdate" }, "template": { "metadata": { "creationTimestamp": null, "labels": { "antiopaImageId": "sha256_43bd595c4026bfad74b52f71b4579b12f68b65b95ede25f426cd4dfd", "service": "antiopa" } }, "spec": { "containers": [ { "command": [ "/antiopa/antiopa" ], "env": [ { "name": "KUBERNETES_DEPLOYED", "value": "2018-01-10 15:22:44+03:00" }, { "name": "RLOG_LOG_LEVEL", "value": "INFO" }, ... jq .spec.replicas
  290. Что ещё? #2 Механизм дедупликации (jq-фильтр) { "replicas": 2 }

    { "apiVersion": "extensions/v1beta1", "kind": "Deployment", "metadata": { "annotations": { "deployment.kubernetes.io/revision": "170" }, "creationTimestamp": "2017-12-25T18:21:00Z", "generation": 272, "labels": { "heritage": "antiopa", "service": "antiopa" }, "name": "antiopa", "namespace": "antiopa", "resourceVersion": "129971044", "selfLink": "/apis/extensions/v1beta1/namespaces/antiopa/deployments/antiopa", "uid": "5bee440f-e9a0-11e7-be2a-52540080d234" }, "spec": { "progressDeadlineSeconds": 600, "replicas": 1, "revisionHistoryLimit": 2, "selector": { "matchLabels": { "service": "antiopa" } }, "strategy": { "rollingUpdate": { "maxSurge": 1, "maxUnavailable": 1 }, "type": "RollingUpdate" }, "template": { "metadata": { "creationTimestamp": null, "labels": { "antiopaImageId": "sha256_43bd595c4026bfad74b52f71b4579b12f68b65b95ede25f426cd4dfd", "service": "antiopa" } }, "spec": { "containers": [ { "command": [ "/antiopa/antiopa" ], "env": [ { "name": "KUBERNETES_DEPLOYED", "value": "2018-01-10 15:22:44+03:00" }, { "name": "RLOG_LOG_LEVEL", "value": "INFO" }, ... jq .spec.replicas
  291. Что ещё?

  292. Что ещё? #3 Получение данных от шелл-оператора про объект

  293. [ { "binding": "onCreatePod", "resourceEvent": "add", "resourceKind": "pod", "resourceName": "foo",

    "resourceNamespace": "bar" } ] Что ещё? #3 Получение данных от шелл-оператора про объект
  294. Что ещё?

  295. Что ещё? #4 События бывают разные!

  296. Что ещё? Kubernetes-эвенты #4 События бывают разные! { "onKubernetesEvent": [

    { "kind": "pod", "event": ["add", "delete"], } ] }
  297. Что ещё? Kubernetes-эвенты #4 События бывают разные! { "onKubernetesEvent": [

    { "kind": "pod", "event": ["add", "delete"], }, { "kind": "deployment", "event": ["update"], } ] }
  298. Что ещё? Kubernetes-эвенты schedule (кронтаб) #4 События бывают разные! {

    "schedule": [ { "crontab": "*/10 * * * * *" } ] }
  299. Что ещё? Kubernetes-эвенты schedule (кронтаб) #4 События бывают разные! {

    "schedule": [ { "crontab": "*/10 * * * * *" }, { "crontab": "0 0 0 * * *" } ] }
  300. Что ещё? Kubernetes-эвенты schedule (кронтаб) onStartup #4 События бывают разные!

    { "onStartup": 10, }
  301. Что ещё? Kubernetes-эвенты schedule (кронтаб) onStartup #4 События бывают разные!

    { "onStartup": 10, "onKubernetesEvent": [ { "kind": "pod", "event": ["add", "delete"], } ], "schedule": [ { "crontab": "*/10 * * * * *" } ] }
  302. Что ещё?

  303. Что ещё? #5 Асинхронность и гарантии

  304. Что ещё? #5 Асинхронность и гарантии Kubernetes API scheduler #!

    executor #!
  305. Что ещё? #5 Асинхронность и гарантии Kubernetes API scheduler #!

    executor #!
  306. Что ещё? #5 Асинхронность и гарантии Kubernetes API scheduler #!

    executor #!
  307. Что ещё? #5 Асинхронность и гарантии Kubernetes API scheduler #!

    executor #!
  308. Что ещё?

  309. Что ещё? #6 Экспорт метрик для Prometheus (/metrics)

  310. Что ещё? Можно отслеживать: #6 Экспорт метрик для Prometheus (/metrics)

  311. Что ещё? количество ошибок по каждому хуку Можно отслеживать: #6

    Экспорт метрик для Prometheus (/metrics)
  312. Что ещё? количество ошибок по каждому хуку размер очереди Можно

    отслеживать: #6 Экспорт метрик для Prometheus (/metrics)
  313. Что ещё?

  314. Что ещё? #1 Объекты можно фильтровать! #2 Механизм дедупликации (jq-фильтр).

    #3 Получение данных от шелл-оператора про объект. #4 События бывают разные! #6 Экспорт метрик для Prometheus (/metrics). #5 Асинхронность и гарантии.
  315. Раскладывание секретов Настройка NetworkPolicy Простановка тейнтов #!

  316. Go

  317. Go

  318. github.com/flant/shell-operator hub.docker.com/r/flant/shell-operator shell-operator #!

  319. Иван Михейкин Ведущий разработчик ivan.mikheykin@flant.com github.com/flant/shell-operator hub.docker.com/r/flant/shell-operator shell-operator #!

  320. 42 Иван Михейкин Ведущий разработчик ivan.mikheykin@flant.com github.com/flant/shell-operator hub.docker.com/r/flant/shell-operator shell-operator #!

    Поставьте звёздочку!
  321. Хотите Kubernetes с комфортом? устанавливать Дополнения разрабатывать Операторы Потребуется:

  322. Хотите Kubernetes с комфортом? устанавливать Дополнения разрабатывать Операторы Потребуется:

  323. Хотите Kubernetes с комфортом? устанавливать Дополнения разрабатывать Операторы Потребуется: Решения:

  324. Хотите Kubernetes с комфортом? устанавливать Дополнения разрабатывать Операторы Потребуется: Решения:

    ничего не автоматизировать
  325. Хотите Kubernetes с комфортом? устанавливать Дополнения разрабатывать Операторы Потребуется: Решения:

    крон-скрипты ничего не автоматизировать
  326. Хотите Kubernetes с комфортом? устанавливать Дополнения разрабатывать Операторы Потребуется: Решения:

    крон-скрипты шелл-операторы #! ничего не автоматизировать
  327. Хотите Kubernetes с комфортом? устанавливать Дополнения разрабатывать Операторы Потребуется: Решения:

    ничего не автоматизировать крон-скрипты шелл-операторы классические операторы #!
  328. Хотите Kubernetes с комфортом? устанавливать Дополнения разрабатывать Операторы Потребуется:

  329. Хотите Kubernetes с комфортом? устанавливать Дополнения разрабатывать Операторы Потребуется:

  330. Путь к комфорту

  331. На обслуживании: 3 кластера

  332. Ingress controller На обслуживании: 3 кластера

  333. На обслуживании: 3 кластера kube-nginx-ingress-aws.yaml kube-nginx-ingress-baremetal.yaml

  334. На обслуживании: 6 кластеров kube-nginx-ingress-aws.yaml kube-nginx-ingress-baremetal.yaml

  335. На обслуживании: 6 кластеров kube-nginx-ingress-aws.yaml kube-nginx-ingress-baremetal.yaml kube-nginx-ingress-azure.yaml kube-nginx-ingress-gce.yaml

  336. На обслуживании: 6 кластеров kube-nginx-ingress-aws.yaml kube-nginx-ingress-baremetal.yaml kube-nginx-ingress-azure.yaml kube-nginx-ingress-gce.yaml

  337. Ingress controller v0.9.0 kube-nginx-ingress-aws.yaml kube-nginx-ingress-baremetal.yaml kube-nginx-ingress-azure.yaml kube-nginx-ingress-gce.yaml На обслуживании: 6

    кластеров Ingress controller v0.9.5 Ingress controller v0.10.1-flant
  338. Ingress controller v0.9.0 kube-nginx-ingress-aws.yaml kube-nginx-ingress-baremetal.yaml kube-nginx-ingress-azure.yaml kube-nginx-ingress-gce.yaml На обслуживании: 6

    кластеров Ingress controller v0.9.5 Ingress controller v0.10.1-flant
  339. На обслуживании: 6 кластеров

  340. На обслуживании: 6 кластеров kube-nginx-ingress-aws.yaml kube-nginx-ingress-baremetal.yaml kube-nginx-ingress-azure.yaml kube-nginx-ingress-gce.yaml install-ingress.sh

  341. На обслуживании: 6 кластеров install-ingress.sh

  342. На обслуживании: 6 кластеров install-ingress.sh # install-ingress.sh

  343. На обслуживании: 6 кластеров install-ingress.sh # install-ingress.sh aws

  344. На обслуживании: 6 кластеров install-ingress.sh # install-ingress.sh aws Installing ingress

    for aws… done
  345. На обслуживании: 6 кластеров install-ingress.sh

  346. На обслуживании: 6 кластеров Копилка опыта: install-ingress.sh

  347. На обслуживании: 6 кластеров Копилка опыта: install-ingress.sh #1 шаблонизатор

  348. На обслуживании: 6 кластеров sed Копилка опыта: install-ingress.sh #1 шаблонизатор

  349. На обслуживании: 6 кластеров Копилка опыта: install-ingress.sh #1 шаблонизатор

  350. На обслуживании: 8 кластеров Копилка опыта: install-ingress.sh #1 шаблонизатор

  351. На обслуживании: 8 кластеров Ingress controller Ingress controller Ingress controller

    Ingress controller Ingress controller Ingress controller Ingress controller Ingress controller Копилка опыта: install-ingress.sh #1 шаблонизатор
  352. На обслуживании: 8 кластеров Ingress controller Ingress controller Ingress controller

    Ingress controller Ingress controller Ingress controller Ingress controller Ingress controller Копилка опыта: install-ingress.sh #1 шаблонизатор #2 автообновление
  353. На обслуживании: 8 кластеров Ingress controller Ingress controller Ingress controller

    Ingress controller Ingress controller Ingress controller Ingress controller Ingress controller git pull install-ingress.sh Копилка опыта: install-ingress.sh #1 шаблонизатор #2 автообновление
  354. На обслуживании: 8 кластеров Ingress controller Ingress controller Ingress controller

    Ingress controller Ingress controller Ingress controller Ingress controller Ingress controller Копилка опыта: install-ingress.sh #1 шаблонизатор #2 автообновление
  355. На обслуживании: 8 кластеров Копилка опыта: install-ingress.sh #1 шаблонизатор #2

    автообновление
  356. На обслуживании: 11 кластеров Копилка опыта: install-ingress.sh #1 шаблонизатор #2

    автообновление
  357. На обслуживании: 11 кластеров Копилка опыта: install-ingress.sh #1 шаблонизатор #2

    автообновление install-prometheus.sh
  358. install-prometheus.sh На обслуживании: 11 кластеров Копилка опыта: install-ingress.sh # install-prometheus.sh

    #1 шаблонизатор #2 автообновление
  359. install-prometheus.sh На обслуживании: 11 кластеров Копилка опыта: install-ingress.sh # install-prometheus.sh

    adminPassword? passw0rd volumeSize? 140Gi requestsCpu? 2 requestsMemory? 4Gi limitsCpu? 2 limitsMemory? 4Gi userPassword? laresistance #1 шаблонизатор #2 автообновление
  360. install-prometheus.sh На обслуживании: 11 кластеров Копилка опыта: install-ingress.sh # install-prometheus.sh

    adminPassword? passw0rd volumeSize? 140Gi requestsCpu? 2 requestsMemory? 4Gi limitsCpu? 2 limitsMemory? 4Gi userPassword? laresistance Installing prometheus... done #1 шаблонизатор #2 автообновление
  361. install-prometheus.sh На обслуживании: 11 кластеров Копилка опыта: install-ingress.sh # install-prometheus.sh

    adminPassword? passw0rd volumeSize? 140Gi requestsCpu? 2 requestsMemory? 4Gi limitsCpu? 2 limitsMemory? 4Gi userPassword? laresistance Installing prometheus... done #1 шаблонизатор #2 автообновление #3 хранение настроек в кластере
  362. install-prometheus.sh На обслуживании: 11 кластеров Копилка опыта: install-ingress.sh #1 шаблонизатор

    #2 автообновление #3 хранение настроек в кластере #4 генерация паролей # install-prometheus.sh adminPassword? passw0rd volumeSize? 140Gi requestsCpu? 2 requestsMemory? 4Gi limitsCpu? 2 limitsMemory? 4Gi userPassword? laresistance Installing prometheus... done
  363. На обслуживании: 11 кластеров Копилка опыта: install-ingress.sh #1 шаблонизатор #2

    автообновление #3 хранение настроек в кластере #4 генерация паролей install-prometheus.sh
  364. На обслуживании: 17 кластеров Копилка опыта: install-ingress.sh #1 шаблонизатор #2

    автообновление #3 хранение настроек в кластере #4 генерация паролей install-prometheus.sh
  365. git pull install-ingress.sh На обслуживании: 17 кластеров Копилка опыта: install-ingress.sh

    #1 шаблонизатор #2 автообновление #3 хранение настроек в кластере #4 генерация паролей install-prometheus.sh
  366. git pull install-ingress.sh На обслуживании: 17 кластеров Копилка опыта: install-ingress.sh

    #1 шаблонизатор #2 автообновление #3 хранение настроек в кластере #4 генерация паролей #5 стейджирование install-prometheus.sh
  367. На обслуживании: 17 кластеров Копилка опыта: install-ingress.sh #1 шаблонизатор #2

    автообновление #3 хранение настроек в кластере #4 генерация паролей #5 стейджирование install-prometheus.sh git checkout stable git pull install-ingress.sh
  368. На обслуживании: 17 кластеров Копилка опыта: install-ingress.sh #1 шаблонизатор #2

    автообновление #3 хранение настроек в кластере #4 генерация паролей #5 стейджирование install-prometheus.sh
  369. На обслуживании: 21 кластер Копилка опыта: install-ingress.sh #1 шаблонизатор #2

    автообновление #3 хранение настроек в кластере #4 генерация паролей #5 стейджирование install-prometheus.sh
  370. На обслуживании: 21 кластер Копилка опыта: install-ingress.sh #1 шаблонизатор #2

    автообновление #3 хранение настроек в кластере #4 генерация паролей #5 стейджирование install-prometheus.sh kubectl apply -f addon.yaml
  371. На обслуживании: 21 кластер Копилка опыта: install-ingress.sh #1 шаблонизатор #2

    автообновление #3 хранение настроек в кластере #4 генерация паролей #5 стейджирование #6 декларативность install-prometheus.sh kubectl apply -f addon.yaml
  372. На обслуживании: 21 кластер Копилка опыта: install-ingress.sh #1 шаблонизатор #2

    автообновление #3 хранение настроек в кластере #4 генерация паролей #5 стейджирование #6 декларативность install-prometheus.sh
  373. На обслуживании: 21 кластер Копилка опыта: #1 шаблонизатор #2 автообновление

    #3 хранение настроек в кластере #4 генерация паролей #5 стейджирование #6 декларативность install-ingress.sh install-prometheus.sh
  374. На обслуживании: 21 кластер install-ingress.sh install-prometheus.sh Копилка опыта: #1 шаблонизатор

    #2 автообновление #3 хранение настроек в кластере #4 генерация паролей #5 стейджирование #6 декларативность
  375. На обслуживании: 21 кластер install-ingress.sh install-prometheus.sh Копилка опыта: #1 шаблонизатор

    #2 автообновление #3 хранение настроек в кластере #4 генерация паролей #5 стейджирование #6 декларативность
  376. На обслуживании: 21 кластер install-ingress.sh install-prometheus.sh Копилка опыта: #1 шаблонизатор

    #2 автообновление #3 хранение настроек в кластере #4 генерация паролей #5 стейджирование #6 декларативность #7 контроль результата
  377. На обслуживании: 21 кластер install-ingress.sh install-prometheus.sh Копилка опыта: #1 шаблонизатор

    #2 автообновление #3 хранение настроек в кластере #4 генерация паролей #5 стейджирование #6 декларативность #7 контроль результата #8 discovery
  378. На обслуживании: 21 кластер install-ingress.sh install-prometheus.sh Копилка опыта: #1 шаблонизатор

    #2 автообновление #3 хранение настроек в кластере #4 генерация паролей #5 стейджирование #6 декларативность #7 контроль результата #8 discovery install-ingress.sh # install-ingress.sh aws Installing ingress for aws… done install-prometheus.sh # install-prometheus.sh adminPassword? passw0rd volumeSize? 140Gi requestsCpu? 2 requestsMemory? 4Gi limitsCpu? 2 limitsMemory? 4Gi userPassword? laresistance Installing prometheus... done
  379. На обслуживании: 21 кластер install-ingress.sh install-prometheus.sh Копилка опыта: #1 шаблонизатор

    #2 автообновление #3 хранение настроек в кластере #4 генерация паролей #5 стейджирование #6 декларативность #7 контроль результата #8 discovery install-ingress.sh # install-ingress.sh aws Installing ingress for aws… done install-prometheus.sh # install-prometheus.sh adminPassword? passw0rd volumeSize? 140Gi requestsCpu? 2 requestsMemory? 4Gi limitsCpu? 2 limitsMemory? 4Gi userPassword? laresistance Installing prometheus... done
  380. На обслуживании: 21 кластер install-ingress.sh install-prometheus.sh Копилка опыта: #1 шаблонизатор

    #2 автообновление #3 хранение настроек в кластере #4 генерация паролей #5 стейджирование #6 декларативность #7 контроль результата #8 discovery install-ingress.sh # install-ingress.sh aws Installing ingress for aws… done install-prometheus.sh # install-prometheus.sh adminPassword? passw0rd volumeSize? 140Gi requestsCpu? 2 requestsMemory? 4Gi limitsCpu? 2 limitsMemory? 4Gi userPassword? laresistance Installing prometheus... done
  381. На обслуживании: 21 кластер install-ingress.sh install-prometheus.sh Копилка опыта: #1 шаблонизатор

    #2 автообновление #3 хранение настроек в кластере #4 генерация паролей #5 стейджирование #6 декларативность #7 контроль результата #8 discovery
  382. На обслуживании: 21 кластер install-ingress.sh install-prometheus.sh Копилка опыта: #1 шаблонизатор

    #2 автообновление #3 хранение настроек в кластере #4 генерация паролей #5 стейджирование #6 декларативность #7 контроль результата #8 discovery #9 continuous discovery
  383. На обслуживании: 21 кластер install-ingress.sh install-prometheus.sh Копилка опыта: #1 шаблонизатор

    #2 автообновление #3 хранение настроек в кластере #4 генерация паролей #5 стейджирование #6 декларативность #7 контроль результата #8 discovery #9 continuous discovery
  384. На обслуживании: 21 кластер install-ingress.sh install-prometheus.sh Копилка опыта: #1 шаблонизатор

    #2 автообновление #3 хранение настроек в кластере #4 генерация паролей #5 стейджирование #6 декларативность #7 контроль результата #8 discovery #9 continuous discovery Ingress controller Ingress controller Ingress controller
  385. На обслуживании: 21 кластер install-ingress.sh install-prometheus.sh Копилка опыта: #1 шаблонизатор

    #2 автообновление #3 хранение настроек в кластере #4 генерация паролей #5 стейджирование #6 декларативность #7 контроль результата #8 discovery #9 continuous discovery Ingress controller Ingress controller Ingress controller dedicated: ingress
  386. На обслуживании: 21 кластер install-ingress.sh install-prometheus.sh Копилка опыта: #1 шаблонизатор

    #2 автообновление #3 хранение настроек в кластере #4 генерация паролей #5 стейджирование #6 декларативность #7 контроль результата #8 discovery #9 continuous discovery Ingress controller Ingress controller Ingress controller dedicated: ingress
  387. На обслуживании: 21 кластер install-ingress.sh install-prometheus.sh Копилка опыта: #1 шаблонизатор

    #2 автообновление #3 хранение настроек в кластере #4 генерация паролей #5 стейджирование #6 декларативность #7 контроль результата #8 discovery #9 continuous discovery Ingress controller dedicated: ingress
  388. #!

  389. #! #! #! #! хуки

  390. #! #! #! #! хуки

  391. #! #! #! #! хуки

  392. #! #! #! #! хуки хранилище values

  393. #! #! #! #! хуки хранилище values

  394. #! #! #! #! хуки чарт хранилище values

  395. #! #! #! #! хуки чарт хранилище values

  396. #! #! #! #! хуки чарт хранилище values

  397. #! #! #! #! хуки чарт хранилище values

  398. #! #! #! #! хуки чарт хранилище values

  399. #! #! #! #! хуки чарт хранилище values

  400. #! #! #! #! хуки чарт хранилище values

  401. #! #! #! #! хуки чарт хранилище values

  402. #! #! #! #! хуки чарт хранилище values

  403. #! #! #! #! хуки чарт хранилище values

  404. #! #! #! #! хуки чарт хранилище values

  405. #! #! #! #! хуки чарт хранилище values

  406. #! #! #! #! хуки чарт хранилище values

  407. #! #! #! #! хуки чарт хранилище values

  408. #! #! #! #! хуки чарт хранилище values

  409. #! #! #! #! хуки чарт хранилище values

  410. #! #! #! #! хуки чарт модуль хранилище values

  411. #! #! #! #! #! #! #! #! #! #!

    #! #!
  412. #! #! #! #! #! #! #! #! #! #!

    #! #! #! #! #! глобальные хуки
  413. #! #! #! #! #! #! #! #! #! #!

    #! #! #! глобальное хранилище values #! #! глобальные хуки
  414. #! #! #! #! #! #! #! #! #! #!

    #! #! #! глобальное хранилище values #! #! глобальные хуки
  415. #! #! #! #! #! #! #! #! #! #!

    #! #! #! глобальное хранилище values #! #! глобальные хуки
  416. #! #! #! #! #! #! #! #! #! #!

    #! #! #! глобальное хранилище values #! #! глобальные хуки
  417. #! #! #! #! #! #! #! #! #! #!

    #! #! #! глобальное хранилище values #! #! глобальные хуки
  418. #! #! #! #! #! #! #! #! #! #!

    #! #! #! глобальное хранилище values #! #! глобальные хуки
  419. #! #! #! #! #! #! #! #! #! #!

    #! #! #! глобальное хранилище values #! #! глобальные хуки
  420. #! #! #! #! #! #! #! #! #! #!

    #! #! #! глобальное хранилище values #! #! глобальные хуки
  421. #! #! #! #! #! #! #! #! #! #!

    #! #! #! глобальное хранилище values #! #! глобальные хуки
  422. Копилка опыта: #1 шаблонизатор #2 автообновление #3 хранение настроек в

    кластере #4 генерация паролей #5 стейджирование #6 декларативность #7 контроль результата #8 discovery #9 continuous discovery #! #! #! #! #! #!
  423. Копилка опыта: #1 шаблонизатор #2 автообновление #3 хранение настроек в

    кластере #4 генерация паролей #5 стейджирование #6 декларативность #7 контроль результата #8 discovery #9 continuous discovery #! #! #! #! #! #!
  424. Копилка опыта: #1 шаблонизатор #2 автообновление #3 хранение настроек в

    кластере #4 генерация паролей #5 стейджирование #6 декларативность #7 контроль результата #8 discovery #9 continuous discovery #! #! #! #! #! #!
  425. Копилка опыта: #1 шаблонизатор #2 автообновление #3 хранение настроек в

    кластере #4 генерация паролей #5 стейджирование #6 декларативность #7 контроль результата #8 discovery #9 continuous discovery #! #! #! #! #! #!
  426. Копилка опыта: #1 шаблонизатор #2 автообновление #3 хранение настроек в

    кластере #4 генерация паролей #5 стейджирование #6 декларативность #7 контроль результата #8 discovery #9 continuous discovery #! #! #! #! #! #!
  427. Копилка опыта: #1 шаблонизатор #2 автообновление #3 хранение настроек в

    кластере #4 генерация паролей #5 стейджирование #6 декларативность #7 контроль результата #8 discovery #9 continuous discovery #! #! #! #! #! #! #!
  428. Копилка опыта: #1 шаблонизатор #2 автообновление #3 хранение настроек в

    кластере #4 генерация паролей #5 стейджирование #6 декларативность #7 контроль результата #8 discovery #9 continuous discovery #! #! #! #! #! #! #!
  429. Копилка опыта: #1 шаблонизатор #2 автообновление #3 хранение настроек в

    кластере #4 генерация паролей #5 стейджирование #6 декларативность #7 контроль результата #8 discovery #9 continuous discovery #! #! #! #! #! #!
  430. Копилка опыта: #1 шаблонизатор #2 автообновление #3 хранение настроек в

    кластере #4 генерация паролей #5 стейджирование #6 декларативность #7 контроль результата #8 discovery #9 continuous discovery #! #! #! #! #! #!
  431. Копилка опыта: #1 шаблонизатор #2 автообновление #3 хранение настроек в

    кластере #4 генерация паролей #5 стейджирование #6 декларативность #7 контроль результата #8 discovery #9 continuous discovery #! #! #! #! #! #! Configmap
  432. Копилка опыта: #1 шаблонизатор #2 автообновление #3 хранение настроек в

    кластере #4 генерация паролей #5 стейджирование #6 декларативность #7 контроль результата #8 discovery #9 continuous discovery #! #! #! #! #! #! Configmap
  433. Копилка опыта: #1 шаблонизатор #2 автообновление #3 хранение настроек в

    кластере #4 генерация паролей #5 стейджирование #6 декларативность #7 контроль результата #8 discovery #9 continuous discovery #! #! #! #! #! #! Configmap
  434. Копилка опыта: #1 шаблонизатор #2 автообновление #3 хранение настроек в

    кластере #4 генерация паролей #5 стейджирование #6 декларативность #7 контроль результата #8 discovery #9 continuous discovery #! #! #! #! #! #!
  435. Копилка опыта: #1 шаблонизатор #2 автообновление #3 хранение настроек в

    кластере #4 генерация паролей #5 стейджирование #6 декларативность #7 контроль результата #8 discovery #9 continuous discovery #! #! #! #! #! #!
  436. Копилка опыта: #1 шаблонизатор #2 автообновление #3 хранение настроек в

    кластере #4 генерация паролей #5 стейджирование #6 декларативность #7 контроль результата #8 discovery #9 continuous discovery #! #! #! #! #! #!
  437. Копилка опыта: #1 шаблонизатор #2 автообновление #3 хранение настроек в

    кластере #4 генерация паролей #5 стейджирование #6 декларативность #7 контроль результата #8 discovery #9 continuous discovery #! #! #! #! #! #!
  438. Копилка опыта: #1 шаблонизатор #2 автообновление #3 хранение настроек в

    кластере #4 генерация паролей #5 стейджирование #6 декларативность #7 контроль результата #8 discovery #9 continuous discovery #! #! #! #! #! #!
  439. Копилка опыта: #1 шаблонизатор #2 автообновление #3 хранение настроек в

    кластере #4 генерация паролей #5 стейджирование #6 декларативность #7 контроль результата #8 discovery #9 continuous discovery #! #! #! #! #! #!
  440. Копилка опыта: #1 шаблонизатор #2 автообновление #3 хранение настроек в

    кластере #4 генерация паролей #5 стейджирование #6 декларативность #7 контроль результата #8 discovery #9 continuous discovery #! #! #! #! #! #!
  441. Копилка опыта: #1 шаблонизатор #2 автообновление #3 хранение настроек в

    кластере #4 генерация паролей #5 стейджирование #6 декларативность #7 контроль результата #8 discovery #9 continuous discovery #! #! #! #! #! #! stable ea my-feature
  442. Копилка опыта: #1 шаблонизатор #2 автообновление #3 хранение настроек в

    кластере #4 генерация паролей #5 стейджирование #6 декларативность #7 контроль результата #8 discovery #9 continuous discovery #! #! #! #! #! #!
  443. Копилка опыта: #1 шаблонизатор #2 автообновление #3 хранение настроек в

    кластере #4 генерация паролей #5 стейджирование #6 декларативность #7 контроль результата #8 discovery #9 continuous discovery #! #! #! #! #! #!
  444. Копилка опыта: #1 шаблонизатор #2 автообновление #3 хранение настроек в

    кластере #4 генерация паролей #5 стейджирование #6 декларативность #7 контроль результата #8 discovery #9 continuous discovery #! #! #! #! #! #! /metrics
  445. Копилка опыта: #1 шаблонизатор #2 автообновление #3 хранение настроек в

    кластере #4 генерация паролей #5 стейджирование #6 декларативность #7 контроль результата #8 discovery #9 continuous discovery #! #! #! #! #! #!
  446. #! #! #! #! #! #! #! #! #! #!

    #! #! #! глобальное хранилище values #! #! глобальные хуки
  447. #! #! #! #! #! #! #! #! #! #!

    #! глобальные хуки #! #! #! #! глобальное хранилище values
  448. #! #! #! #! #! #! #! #! #! #!

    #! глобальные хуки #! #! #! #! глобальное хранилище values addon-operator +
  449. #! #! #! #! #! #! #! #! #! #!

    #! глобальные хуки #! #! #! #! глобальное хранилище values
  450. #! #! #! #! #! #! #! #! #! #!

    #! глобальные хуки #! #! #! #! глобальное хранилище values
  451. + #! #! глобальные хуки #! #! #! #! #!

    #! #! #! #!
  452. + #! #! глобальные хуки #! #! #! #! #!

    #! #! #! #!
  453. github.com/flant/addon-operator addon-operator

  454. github.com/flant/addon-operator addon-operator 15-го апреля будет доступна бета

  455. Хотите Kubernetes с комфортом? устанавливать Дополнения разрабатывать Операторы Потребуется:

  456. Хотите Kubernetes с комфортом? устанавливать Дополнения разрабатывать Операторы Потребуется: А

    сами модули где?
  457. Спасибо! Наш блог на Хабре habr.com/company/flant Наш YouTube-канал youtube.com/c/flant shell-operator

    github.com/flant/shell-operator addon-operator github.com/flant/addon-operator werf github.com/flant/werf grafana-statusmap github.com/flant/grafana-statusmap kubedog github.com/flant/kubedog Андрей Половов andrey.polovov@flant.com Solution-инженер Иван Михейкин Ведущий разработчик ivan.mikheykin@flant.com Андрей Климентьев R&D-таран andrey.klimentyev@flant.com
  458. None