Портативное управление Kubernetes с помощью kubectl в контейнере Docker

Stepan Mikulov

Administrator
Команда форума
Сказать, что Kubernetes становится мейнстримом, было бы преуменьшением. Фактически, это повлияло на то, как проектируются и эксплуатируются современные распределенные системы. Абстрагируя инфраструктуру, мы можем использовать Kubernetes как «платформу для создания платформ» или «облачную операционную систему» с множеством очевидных преимуществ, но также с проблемами разработки и эксплуатации.
Целая экосистема вокруг Kubernetes процветает, и в настоящее время существует множество замечательных инструментов и проектов от сообщества с открытым исходным кодом, некоторые из которых находятся под эгидой CNCF, а некоторые разработаны энтузиастами или компаниями различного размера и влияния. Достаточно сказать, что происходит много всего, и уследить за постоянно меняющейся ситуацией сложнее.
Сегодня мы сосредоточимся на конкретной и очень практичной области, а именно на управлении Kubernetes с помощью kubectl. Kubectl - это инструмент командной строки (CLI), используемый для управления кластерами Kubernetes. Хорошо известная дискуссия в сообществе Kubernetes: «как вообще произносится kubectl?». Существует множество мнений, и на этой странице представлены примеры наиболее распространенных, так что не стесняйтесь выбирать или даже создавать свои собственные.
Когда мы не заняты выяснением мирового голода или произношения kubectl, мы часто тратим много времени на ручную разработку наших сред, в которых работает kubectl, мы создаем псевдонимы, добавляем автозаполнение, устанавливаем плагины и другие инструменты диагностики и управления кластером. . Что, если бы мы могли носить с собой эту среду диагностики / управления и использовать одни и те же инструменты, сценарии, псевдонимы и ярлыки с каждым кластером?
Для меня мотивацией к созданию образа с помощью kubectl было то, что мне пришлось работать с новым кластером Kubernetes из виртуальной машины Windows Server, работающей в Azure без WSL2 (подсистема Windows для Lunix), и я не хотел использовать cygwin или git- баш. Я привык к своей среде, работающей на Ubuntu, и воссоздание образа в нем было быстрым решением этой проблемы.
Во второй части этого блога я объясняю, как использовать настраиваемый и персонализированный kubectl из контейнера Docker. Вы можете использовать мой существующий образ kubectl или клонировать мой репозиторий GitHub и изменить его по своему вкусу. В конце концов, Kubernetes предназначен для управления контейнерами, поэтому справедливо управлять Kubernetes из контейнера!

Создавайте и используйте свое собственное изображение с помощью kubectl
Эта и следующая главы не предназначены для использования в качестве учебных пособий по Docker, а скорее являются практическими инструкциями. Если вам интересно, есть много отличных ресурсов о Docker. Хорошая отправная точка - https://www.docker.com/.
Если вы хотите попробовать создать свой собственный настраиваемый контейнер kubectl, выполните следующие действия. Вы также можете клонировать / форкнуть мой репозиторий GitHub https://github.com/Piotr1215/kubectl-container.
Вы также можете напрямую использовать мой образ из Docker Hub, если хотите проверить, как он работает: https://hub.docker.com/repository/docker/piotrzan/kubectl-comp.
Создать Dockerfile
Создайте новый репозиторий git и добавьте в него Dockerfile. Вот пример файла на основе моего репозитория.

FROM ubuntu:18.10
WORKDIR /root
COPY bootstrap.sh ./
RUN apt-get update && apt-get -y install --no-install-recommends \
gnupg \
curl \
wget \
git \
apt-transport-https \
ca-certificates \
zsh \
&& rm -rf /var/lib/apt/lists/*
ENV SHELL /usr/bin/zsh
# Install kubectl
RUN curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - && \
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | tee -a /etc/apt/sources.list.d/kubernetes.list && \
apt-get update && apt-get -y install --no-install-recommends kubectl
# Bootstrap kubectl
RUN chmod +x bootstrap.sh && ./bootstrap.sh
COPY .zshrc ./
RUN exec zsh
ENTRYPOINT ["/bin/zsh"]
view rawDockerfile hosted with ❤ by GitHub


Вы можете добавить все в один Dockerfile, я решил разделить часть подготовки в bootstrap.sh. Сценарий подготовки копируется в каталог образов и запускается как один из шагов RUN. Другой распространенной практикой является использование сценариев инициализации как Dockerfile ENTRYPOINT.

#!/bin/bash
echo 'Bootstrap steps start here:'
echo '[STEP 1] Creating directory for kubectl config'
mkdir /root/.kube
echo '[STEP 2] Installing k9s awesomeness'
(
set -x &&
wget -c https://github.com/derailed/k9s/releases/download/v0.13.4/k9s_0.13.4_Linux_x86_64.tar.gz -O - | tar -xz &&
chmod +x k9s &&
mv k9s /usr/local/bin/
)
echo '[STEP 3] Installing Oh-My-Zsh'
sh -c "$(wget -O- https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattended
echo '[STEP 4] Installing zsh-autosuggestions plugin'
git clone https://github.com/zsh-users/zsh-autosuggestions /root/.oh-my-zsh/custom/plugins/zsh-autosuggestions
echo '[STEP 5] Setting zsh as default shell'
chsh -s $(which zsh)

Создать и опубликовать изображение
Когда все программы и конфигурация будут готовы, создайте образ и пометьте его своим именем пользователя докера, чтобы его можно было опубликовать.

docker build --rm -f “Dockerfile” -t dockeruser/image-name “.”


Опубликуйте образ в репозитории докеров.

docker publish dockeruser/image-name

Вытяните и запустите свое изображение в любой среде
Когда вам нужно работать с новым кластером, просто запустите свой образ. Обратите внимание, что мы назвали контейнер, чтобы упростить управление им, и установили для сети значение «host», что позволит kubectl получить доступ к сети хоста и кластерам через него.

docker run --network=host --name=kubectl-host --rm -it piotrzan/kubectl-comp

Погружение глубже
Продолжайте читать, если вы хотите узнать больше и понять, что входит в мое изображение, а также какие варианты дизайна я сделал.
Что входит в изображение
kubectl v 1.17.2 с завершением bash / zsh
zsh-autosuggestions для zsh shell
k9s отличный инструмент для наблюдения и управления кластером на основе терминала
популярные инструменты: curl, wget, git
полезные псевдонимы .bashrc / .zshrc

# Instead of typing kubectl all the time, abbreviate it to just “k”
alias k=kubectl# Check what is running on the cluster
alias kdump=’kubectl get all — all-namespaces’# Display helpful info for creating k8s resources imperatively
alias krun=’k run -h | grep “# “ -A2'# Quickly spin up busybox pod for diagnostic purposes
alias kdiag=’kubectl run -it — rm debug — image=busybox — restart=Never — sh’

Как это использовать
Мой репозиторий содержит все сценарии и команды, описанные ниже, поэтому вы можете просто использовать его, а не копировать отсюда.
Самый простой способ использовать изображение - запустить его с помощью следующей команды. Вы можете запустить любую оболочку bash

docker run --network=host --name=kubectl-host --rm -it piotrzan/kubectl-comp

или если вам нравится оболочка zsh, есть другое изображение

docker run --network=host --name=kubectl-host --rm -it piotrzan/kubectl-comp:zsh

Это запустит новый контейнер с именем kubectl-host и позволит вам использовать kubectl, но он не будет содержать информацию о ваших кластерах. Для этого вам необходимо убедиться, что файл .kube / config доступен в контейнере. Самый простой способ сделать это - запустить контейнер в автономном режиме, скопировать файл и снова присоединиться к контейнеру, например:

# Run container with pass-through to local networkdocker run -d — network=host — name=kubectl-host — rm -it piotrzan/kubectl-comp# Generate raw config from kubectl on localhost and copy the config to the containerkubectl config view — raw > configdocker cp config kubectl-host:./root/.kubedocker attach kubectl-host

В качестве альтернативы вы можете использовать docker-compose, чтобы развернуть контейнер и прикрепить том

version: '2'
services:
kubectl-host:
image: piotrzan/kubectl-comp
container_name: kubectl-host
tty: true
network_mode: "host"
volumes:
- ~/.kube/:/root/.kube/

Расширение образа
Допустим, вы хотите добавить свои собственные псевдонимы или установить дополнительное программное обеспечение и т. Д. Docker позволяет легко расширять образ с помощью команды docker commit.
Запустить контейнер
Настроить и настроить
Откройте другой сеанс оболочки и запустите:

docker commit CONTAINER_ID new-contianer-tag


После этого, когда вы запустите образы докеров, вы увидите свой новый образ в списке с внесенными вами изменениями. Вы можете опубликовать его в Docker Hub или просто использовать с собственными изменениями.

Заключение
Kubernetes и контейнерные рабочие нагрузки предлагают большую гибкость и открывают новые возможности, которые раньше было очень сложно реализовать. Я надеюсь, что на примере создания специального, полностью переносимого и настраиваемого образа kubectl я вдохновил вас на то, чтобы попробовать создать образ Docker с помощью вашего любимого инструмента командной строки.
Мы закончили тем, что создали настраиваемый и персонализированный полностью переносимый интерфейс командной строки kubectl. В любом случае мой имидж единственный, есть масса отличных идей. Одно из изображений, о котором стоит упомянуть, - это изображение, созданное Bitnami для kubectl, вы можете найти его здесь: https://hub.docker.com/r/bitnami/kubectl
Как всегда, можно сказать гораздо больше, мы не говорили о создании автоматизированного конвейера CI / CD, уменьшении размера образа, внедрении передовых методов в области безопасности и многом другом. Некоторые из этих тем достаточно сложны, чтобы иметь собственные блоги.
Спасибо за чтение и до встречи в следующем блоге!
 
Сверху