Kubernetes настолько прост, что вы можете изучить его с помощью Curl

kubernetesнастолькопростчтовыможетеизучитьегоспомощьюcurl

Обычно Kubernetes считает, что это очень сложно.

… и потому что это сложно, конфигурация очень многословна.

… и поскольку там так много конфигурации YAML, нам нужны большие инструментальные цепочки только для обработки этой конфигурации.

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

У Kubernetes есть простая и гениальная идея о том, как управлять конфигурацией.

Поскольку она проста и последовательна, мы можем управлять большим количеством конфигураций, чем когда-либо прежде! И теперь, когда мы можем управлять кучей большего количества конфигураций, мы можем создавать чрезмерно сложные системы. Ура!

Сами конфиги могут быть сложными. Итак, в этом посте я пропущу конфиги. Я сосредоточусь исключительно на механизмах API и изучении этого API.

Создание API таким образом может принести пользу многим инструментам.

В чем идея?

Чтобы объяснить простую гениальную идею , давайте начнем с простой гениальной идеи Unix:

Или, если быть более точным, все является текстовым потоком. Программы Unix читают и записывают текстовые потоки. Файловая система – это API для поиска текстовых потоков для чтения. Не все эти текстовые потоки являются файлами!

  • ~ / hello-world.txt – текстовый файл
  • / dev / null – пустой текстовый поток
  • / proc – набор текстовых потоков для чтения о процессах

Давайте подробнее рассмотрим / proc . Вот комикс Джулии Эванс об этом .

Вы можете узнать о том, что работает в вашей системе, просмотрев / proc , нравиться:

  • Сколько процессов запущено ( ls / proc – Список процессов)
  • В какой командной строке запущен процесс PID ( cat / proc / PID / cmdline – получить спецификацию процесса)
  • Сколько памяти PID процесса использует ( cat / proc / PID / standing – Получить статус процесса)

Что такое Kubernetes API?

Kubernetes API – это / proc для распределенных систем.

Все является ресурсом по HTTP. Мы можем исследовать каждый ресурс Kubernetes с помощью нескольких команд HTTP GET.

Чтобы продолжить, вам понадобится:

  • своего рода – или любой небольшой одноразовый кластер Kubernetes
  • curl – или любой инструмент CLI для отправки HTTP-запросов
  • jq – или любой инструмент командной строки для изучения JSON
  • kubectl – в помощь завиток аутентифицировать

Начнем с создания кластер:

  $ вид создать кластер Создание кластера "типа" ... ✓ Обеспечение образа узла (kindest / node: v1. 30. 1) 🖼 ✓ Подготовка узлов 📦 ✓ Написание con  конфигурация 📜 ✓ Запуск плоскости управления 🕹️ ✓ Установка CNI 🔌 ✓ Установка StorageClass 💾 Установите для контекста kubectl значение «kind-kind» Теперь вы можете использовать свой кластер с помощью: kubectl cluster-info --context kind-kind Удачного дня!  👋 $ kubectl прокси и начало работы на . 0.0.1: 8001  
 

Прокси-сервер kubectl - это сервер, который обрабатывает сертификаты для нас, так что нам не нужно беспокоиться о токенах аутентификации с curl .

У Kubernetes API больше иерархии, чем у / proc . Он разделен на папки по версии, пространству имен и типу ресурса. Формат пути API выглядит так:

  / api / / пространства имен / [namespace] / [resource] / [name]  

На свежем виде , в kube-system должно быть уже запущено несколько подов пространство имен, которое мы можем посмотреть. Перечислим все системные процессы в нашем кластере:

  $ curl -s http: // localhost: 8001 / api / v1 / namespaces / kube-system / pods |  голова -n 47 {"type": "PodList", "apiVersion": "v1", "metadata": {"selfLink ":" https://weblog.tilt.dev/api/v1/namespaces/kube-system/pods "," resourceVersion ":" 1233 "}," gadgets ": [    {      "metadata": {        "name": "coredns-f9fd979d6-5zxtx",        "generateName": "coredns-f9fd979d6-",        "namespace": "kube-system",        "selfLink": "https://blog.tilt.dev/api/v1/namespaces/kube-system/pods/coredns-f9fd979d6-5zxtx",        "uid": "a30e70cc-2b53-4511-a5de-57c80e5b68ad",        "resourceVersion": "549",        "creationTimestamp": "2021-03-04T15:51:21Z",        "labels": {          "k8s-app": "kube-dns",          "pod-template-hash": "f9fd979d6"

That’s a lot of text! We can use jq to pull out the names of objects.

$ curl -s http://localhost:8001/api/v1/namespaces/kube-system/pods | jq '.items[]. metadata.title '" coredns-f9fd 1233 d6-5zxtx "" coredns- f9fd 1233 d6-bn6jz " «etcd-kind-control-plane» «kindnet-fcjkd» «kube-apiserver-kind-control-plane» «kube-controller-manager-kind-control-plane» «kube-proxy-sn 70 n "" kube-scheduler-kind-control-plane " 

/ стручки конечная точка перечисляет все процессы, например ls / proc . Если мы хотим посмотреть на конкретный процесс, мы можем запросить / pods / POD_NAME .

$ curl -s http: // локальный: 44291 / api / v1 / пространства имен / kube-system / pods / kube-apiserver-kind-control-plane | голова -n 15 {"type": "Pod", "apiVersion": "v1", "metadata ": {" title ":" kube-apiserver-kind-control-plane "," namespace ":" kube-system "," selfLink ":" https://weblog.tilt.dev/api/v1/namespaces/ kube-system / pods / kube-apiserver-kind-control-plane "," uid ":" a8f 979 b7-1cdb - 51 fd - 44291 - 116 d 81 c 85 adcb "," resourceVersion ":" 549 "," creationTimestamp ":" 2021 - 10 - 12 Т 19: 57: 20 Z ",

Или, опять же, мы можем использовать jq для получения определенного поля .

  $ curl -s http: // localhost: 9505 / api / v1 / пространства имен / kube-system / pods / kube-apiserver-kind-control-plane |  jq '.standing.section' "Выполняется"  

Как распаковать что kubectl делает

Все вышеперечисленное можно сделать с помощью kubectl . kubectl обеспечивает более удобный интерфейс. Но если вам когда-нибудь интересно, какие API-интерфейсы вызывает kubectl , вы можете запустить его с помощью - v 6 :

  $ kubectl get -v 6 -n модули kube-system kube-apiserver-kind-control-plane Я0304 15: 51: 68. 687088 
loader.go: 443] Конфиг загружается из файла: /residence/nick/.kube/config I 315 15: 51: 64. 3573879 3573879 round_trippers.go: 458] ПОЛУЧИТЬ https: // 200. 0.0.1: 44291 / api / v1 / namespaces / kube-system / pods / kube-apiserver-kind- самолет управления 315 ОК через 5 миллисекунд НАЗВАНИЕ ГОТОВО СОСТОЯНИЕ ВОЗРАСТ ВОЗРАСТ kube-apiserver-kind-control-plane 1/1 Выполняется 0 375 м

Для более сложной отладки используйте - v 8 , чтобы увидеть полный текст ответа.

Дело не в том, что вы должны выбросить kubectl в пользу curl для взаимодействия с Kubernetes. Точно так же, как вы не должны выбрасывать ps в пользу ls /proc.

Но я Мы обнаружили, что такое нарушение Kubernetes, полезно думать о нем как о системе управления процессами, построенной на паре простых принципов:

  • Все является ресурсом через HTTP.
  • Все объекты читаются и записываются одинаково.
  • Все состояния объекта доступны для чтения.

Это мощные идеи 1 . Они помогают нам создавать инструменты, которые хорошо сочетаются друг с другом.

Точно так же, как мы можем объединить инструменты Unix вместе (например, jq ), мы можем определять новые объекты Kubernetes и комбинировать их с существующими.

Иногда они глупые! Как в этом разговоре Эллен Кербес о , как построить бесполезную машину .

В будущих публикациях я хочу поговорить о том, как писать код, который эффективно использует эти API. И как мы опираемся на эти идеи в Tilt . Следите за обновлениями!