Недавно я нашел интерес к Кубернаны И узнал об этом ночью, работая на что-то не связанное в день. Как часть моего обучения, я хотел быстро увидеть и испытать, как Кубернаны на самом деле работает в действии. Поэтому я решил написать несколько услуг, которые можно использовать для запуска и наблюдения за определенным поведением Kubernetes. Я начал с балансировки нагрузки, самостоятельного заживления услуг и масштабирования автомагистрали в зависимости от использования ЦП.
В этом сообщении в блоге я объясню, как работает каждый сервис, и как Kubernetes ведет себя на практике. Обратите внимание, что это был первый раз, когда я писал пойти, поэтому я не гарантирую, что код не дерьмовый или против условных конвенций и лучших практик, которые я еще не знаю.:-)
Этот блог пост обращается к всем, у кого уже есть кластер Kubernetes Up и работает. Вы должны знать, что такое POD, набор реплики или развертывание, а также может построить контейнеры Docker и использовали реестр Docker.
Если вы уже не запустите кластер Kubernetes, я могу порекомендовать книгу «Кубернаны: вверх и бега» и/или блог пост «Как построить кластер Kubernetes с ARM Raspberry Pi» Скоттом Хансельманом. Если вы не знаете, что такое Kubernetes или как это работает, вы можете прочитать отличную серию блога в блоге «Понимание основных концепций Кубератеса» Пудж Аббасси из Giantswarm.io Отказ
Перед запуском Kube-Alive на вашем кластере убедитесь, что у вас есть следующее:
- KUBECTL Установлен и сконфигурирован к запущенной кластере (убедитесь, что «kubectl Get Neams» дает вам список по меньшей мере одного узла в состоянии «Готов»))
- башмак
- Ваш кластер работает на Linux на CPU AMD64 или ARM CPU
Если у вас уже нет кластера и не работает, я рекомендую уже упомянутую статью Скоттом Хансельманом, чтобы начать кластер на малине Pis, или вы можете использовать Миникуба Чтобы запустить локальный кластер на вашем компьютере или Mac.
Если вы просто хотите развернуть Kube-Alive в свой кластер и увидите его в действии, вы можете сделать это с этой одной командой:
curl -sSL https://raw.githubusercontent.com/daniel-kun/kube-alive/master/deploy.sh | bash Using 192.168.178.79 as the exposed IP to access kube-alive. deployment "getip-deployment" created service "getip" created deployment "healthcheck-deployment" created service "healthcheck" created deployment "cpuhog-deployment" created service "cpuhog" created horizontalpodautoscaler "cpuhog-hpa" created deployment "frontend-deployment" created service "frontend" created FINISHED! You should now be able to access kube-alive at http://192.168.178.79/.
Наиболее основными возможностями Kubernetes является баланс нагрузки между несколькими услугами того же рода. Чтобы наблюдать, был ли запрос был подан из того же или из разных случаев, я решил позволить услуге вернуть его IP-адрес хоста. Для того, чтобы запускать услугу в Кубейнетах, вам нужно) написать услугу, б) Создать контейнер, хостинг сервис, в) Нажмите контейнер в реестр, d) создать объект в Kubernetes, который запускает ваш контейнер и наконец ) Сделайте услугу, доступную из-за пределов кластера.
Фаза A: Написание службы
Итак, давайте копаемся в код. Я написал сервер в ходе, который служит в порту 8080, анализирует вывод команды «IP A» и возвращает IP-адрес контейнера.
package main import "fmt" import "bufio" import "os/exec" import "log" import "strings" import "net/http" /** getip starts an HTTP server on 8080 that returns nothing but this container's IP address (the last one outputted by "ip a"). **/ func getIP() string { // Left out for brevity, see https://raw.githubusercontent.com/daniel-kun/kube-alive/master/src/getip/main.go } func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, getIP()) }) fmt.Printf("'getip' server starting, listening to 8080 on all interfaces.\n") http.ListenAndServe(":8080", nil) }
Фаза B: Создание контейнера
Поскольку все работает в Куберане, должен быть контейнером, я написал DockerFile для запуска этой услуги:
FROM golang COPY main.go /go/src/getip/main.go RUN go install getip ENTRYPOINT /go/bin/getip
Этот DockerFile прост: он использует базовый контейнер Golang, который готовят к компиляции и запущению кода Go. Затем он копирует над единственным файлом исходного кода, Main.go и компилирует и устанавливает его на/go/bin/использование «Go install».
Установленный двоичный/GO/BIN/GHETIP устанавливается в качестве въездной точки, так что, когда при доке Docker не будет дан аргументом, он выполняет наш сервис.
Вы можете построить контейнер, используя:
docker build .
Обратите внимание, что есть «». В конце команды означает, что вы должны иметь CD’ED в исходный каталог Getip перед выполнением сборки Docker.
После завершения формы Docker вы сможете увидеть новый контейнер с новым случайно сгенерированным идентификатором изображения через
docker images
Контейнер доступен только на месте на машине, которую она была построена. Поскольку Kubernetes запускает этот контейнер на любом узле, который он видит подходит, контейнер должен быть доступен на всех узлах. Вот где находится реестр Docker Registry в игру, что в основном является удаленный репозиторий для контейнеров Docker, который доступен из всех узлов.
Фаза C: толкая контейнер в реестр
Сначала я попытался настроить местный реестр, который можно сделать, но настройка не портативный через кластеры. Вот почему я решил просто использовать собственный реестр Docker, https://hub.docker.com. . Чтобы протолкнуть свой свежеобразный контейнер, сначала необходимо зарегистрировать на Docker Hub, затем поместите контейнер с репозиторием, желаемым именем контейнера и дополнительным тегом. Если тег не дан, предполагается «Последнее».
docker tag/getip # tag the docker image with your repository name and the service name, such as "getip" docker login # enter your username and password of http://hub.docker.com now. docker push /getip # and then push your container
Теперь он доступен для того, чтобы быть вытянутым (без разрешения) кем-либо — включая ваши узлы Kubernetes.
Фаза D: Определите набор реплики
Чтобы Kubernetes знают, что он должен запустить этот контейнер в качестве службы, а для запуска нескольких экземпляров этой услуги вы должны использовать набор реплик. Я завернул реплику, установленную в развертывание, чтобы легко обновить службу позже:
apiVersion: apps/v1beta2 kind: Deployment metadata: name: getip-deployment labels: app: getip spec: replicas: 4 selector: matchLabels: app: getip template: metadata: labels: app: getip spec: containers: - name: getip image:/getip ports: - containerPort: 8080
Я устанавливаю количество реплик до 4, что означает, что Kubernetes сделает все возможное, чтобы всегда было именно 4 экземпляра, работающих в любое время. Однако это не дает нам ни одного URL для подключения к этим экземплярам. Мы будем использовать услугу для загрузки баланса между этими экземплярами:
kind: Service apiVersion: v1 metadata: name: getip spec: selector: app: getip ports: - protocol: TCP port: 80 targetPort: 8080
Эта услуга предоставляет единое, сбалансированное нагрузку URL для доступа к индивидуальным экземплярам услуг. Он отменяет по умолчанию HTTP-порт 80 к собственному порту 8080 службы в процессе. Услуга будет доступна как http://getip.svc.default.cluster или даже короче, как http://getip на любые бегущие kubernetes pod.
Однако эта услуга доступна только изнутри Kubernetes, а не из «снаружи» кластера.
Фаза E: опубликовать службу
Я решил построить свой собственный контейнер Nginx, чтобы обслуживать статические файлы HTML и JavaScript, которые составляют Frestend и публикуют услуги по конкретному IP.
events { # empty } http { server { root /www/data; location / { # for the frontend SPA } # Forward traffic to/getip to the getip service. location /getip { proxy_pass http://getip/; } # I have left out the other services like "cpuhog" and "healthcheck" here for brevity. # See their code on https://github.com/daniel-kun/kube-alive/ # Allow WebSocket connections to the Kubernetes API: location /api { proxy_pass https://kubernetes.default/api; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; proxy_set_header Authorization "Bearer %%SERVICE_ACCOUNT_TOKEN%%"; } } }
Итак, мы видим, что Nginx ожидает, что SPA в/www/data/, который будет целью команд копирования в нашем DockerFile. Сервисный Getip достигается через Kubernetes DNS, которая автоматически разрешит имя сервиса к его кластеру IP-адреса, что, в свою очередь, запрашивает нагрузку на сервисные экземпляры. Третье место/API используется Frontend для получения информации о запущенных стручках. (В настоящее время полное API открыто с полными привилегиями администратора, так что это очень небезопасно — сделать это только в изолированных средах! Я исправлю это в ближайшее время.)
Вот Dockerfile для службы Frontend:
FROM nginx COPY nginx.conf /etc/nginx/ COPY index.html /www/data/ COPY output/main.js /www/data/output/main.js COPY run_nginx_with_service_account.sh /kube-alive/ CMD /kube-alive/run_nginx_with_service_account.sh
Сценарий оболочки run_nginx_with_service_account.sh
заменит переменные в nginx.conf
Чтобы использовать токен службы Kubernetes Service в заголовке авторизации, чтобы позволить Nginx обрабатывать авторизацию, чтобы интерфейс не должен.
Итак, теперь мы готовы поставить последнюю часть головоломки на место: реплика установлена для запуска Frontend и службы, которое внешне публикует Frestend. Обратите внимание, что я завернул реплику снова в развертывание:
apiVersion: apps/v1beta2 kind: Deployment metadata: name: frontend-deployment labels: app: frontend spec: replicas: 1 selector: matchLabels: app: frontend template: metadata: labels: app: frontend spec: containers: - name: frontend imagePullPolicy: Always image:/frontend_amd64 ports: - containerPort: 80 -------- kind: Service apiVersion: v1 metadata: name: frontend spec: selector: app: frontend externalIPs: - ports: - protocol: TCP port: 80 targetPort: 80
Вот и все! Вы можете Kubectl Применить
Это после того, как вы вставили действительный Externalip
И все должно быть вверх и запущено, чтобы выполнить свой первый эксперимент с балансировкой нагрузки Куберната.
Достижение к IP, что ваш «kubectl» настроен, должен дать вам этот интерфейс:
… сопровождается больше экспериментов. Все они следуют той же концепции, что и GHIP, вы можете взглянуть на их код и развертывание Yamls здесь:
Самовосстановление
Кодекс самовосстановления эксперимента здесь:
https://github.com/daniel-kun/kube-alive/tree/master/src/healthCheck https://github.com/daniel-kun/kube-alive/blob/master/deploy/healthcheck.yml
Количество обновлений
Кодекс эксперимента по обновлениям проката здесь:
https://github.com/daniel-kun/kube-alive/tree/master/src/incver . https://github.com/daniel-kun/kube-alive/blob/master/deploy/incver.yml
Автоматическое масштабирование (CPU)
Кодекс эксперимента на автоматическом масштабировании здесь:
https://github.com/daniel-kun/kube-alive/tree/master/src/cpuhog https://github.com/daniel-kun/kube-alive/blob/master/deploy/cpuhog.yml
Я назвал службу «CPUHOG», потому что он использует столько процессоров, так как он может на 2 секунды для каждого запроса.
Я планирую добавить больше экспериментов в будущем, например, эксперимент для прокатки обновлений с использованием развертываний.
Я надеюсь, что вы нашли этот пост блога и услугами Kube-Alive полезны и были бы благодарны, если бы вы могли оставить отзыв в комментариях. Может быть, однажды Kube-Alive будет отправной точкой, чтобы увидеть поведение Kubernetes Live в действии для многих стартеров и инженеров, которые оценивают Kubernetes для собственного использования.
Обновление 25.01.2018: Я удалил предупреждение о безопасности, потому что безопасность на последней версии Kube-Live была затянута. Выставлена только часть API (PODS в пространстве имен KUBE-Live), а интерфейс проходит с учетной записью службы, которая имеет доступ только к выделенному пространству имен KUBE-Live и только для чтения и списка PODS. Следовательно, на API не гораздо больше информации, чем в любом случае, чем видно в интерфейсе.
Обновление с 03.08.2018: Обновил GIFS на новые, улучшенные визуальные эффекты и добавленные эксперименты по обновлениям Rolling.
Оригинал: «https://dev.to/danielkun/kubernetes-its-alive-2ndc»