1. Обзор
При работе с Kubernetes нам не хватает инструмента, помогающего в локальной разработке — инструмента, который может запускать локальные кластеры Kubernetes, используя контейнеры Docker в качестве узлов.
В этом руководстве мы изучим Kubernetes с видом. В первую очередь инструмент тестирования для Kubernetes, kind
также удобен для локальной разработки и CI.
2. Настройка
В качестве предварительного условия мы должны убедиться, что Docker установлен в нашей системе. Самый простой способ установить Docker — использовать Docker Desktop , подходящий для нашей операционной системы (и процессора в случае macOS).
2.1. Установите командную строку Kubernetes
Во-первых, давайте установим командную строку Kubernetes, kubectl
. В macOS мы можем установить ее с помощью Homebrew:
$ brew install kubectl
Мы можем проверить успешную установку с помощью команды:
$ kubectl version --client
Client Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.3",
GitCommit:"ca643a4d1f7bfe34773c74f79527be4afd95bf39", GitTreeState:"clean",
BuildDate:"2021-07-15T21:04:39Z", GoVersion:"go1.16.6", Compiler:"gc", Platform:"darwin/amd64"}
Точно так же мы можем использовать curl
для загрузки в Windows:
curl -LO https://dl.k8s.io/v1.21.0/bin/windows/amd64/kubectl.exe.sha256
Затем мы должны добавить двоичное расположение команды kubectl
в нашу переменную PATH
.
2.2. Тип
установки ``
Далее мы установим kind
с помощью Homebrew на macOS:
$ brew install kind
Чтобы убедиться в успешной установке, мы можем попробовать команду:
$ kind version
kind v0.11.1 go1.15.6 darwin/amd64
Однако, если команда kind version
не работает, добавьте ее местоположение в переменную PATH
.
Аналогично, для операционной системы Windows мы можем загрузить kind
с помощью curl
:
curl -Lo kind-windows-amd64.exe https://kind.sigs.k8s.io/dl/v0.11.1/kind-windows-amd64
Move-Item .\kind-windows-amd64.exe c:\kind\kind.exe
3. Кластер Кубернетес
Теперь мы готовы использовать kind для подготовки локальной среды разработки для Kubernetes.
3.1. Создать кластер
Во-первых, давайте создадим локальный кластер Kubernetes с конфигурацией по умолчанию:
$ kind create cluster
По умолчанию будет создан кластер с именем kind
. Однако мы можем указать имя кластера, используя параметр –name
:
$ kind create cluster --name foreach-kind
Creating cluster "foreach-kind" ...
✓ Ensuring node image (kindest/node:v1.21.1) 🖼
✓ Preparing nodes 📦
✓ Writing configuration 📜
✓ Starting control-plane 🕹️
✓ Installing CNI 🔌
✓ Installing StorageClass 💾
Set kubectl context to "kind-foreach-kind"
You can now use your cluster with:
kubectl cluster-info --context kind-foreach-kind
Thanks for using kind! 😊
Кроме того, мы можем использовать файл конфигурации YAML для настройки кластера. Например, давайте напишем упрощенную конфигурацию в файле foreachConfig.yaml
:
kind: Cluster
apiVersion: kind.x-k8s.io/v1
name: foreach-kind
Затем создадим кластер с помощью конфигурационного файла:
$ kind create cluster --config foreachConfig.yaml
Кроме того, мы также можем предоставить конкретную версию образа Kubernetes при создании кластера:
$ kind create cluster --image kindest/node:v1.20.7
3.2. Получить кластер
Проверим созданный кластер с помощью команды get
:
$ kind get clusters
foreach-kind
Также мы можем подтвердить соответствующий док-контейнер:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
612a98989e99 kindest/node:v1.21.1 "/usr/local/bin/entr…" 1 min ago Up 2 minutes 127.0.0.1:59489->6443/tcp foreach-kind-control-plane
Или мы можем подтвердить узлы через kubectl
:
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
foreach-kind-control-plane Ready control-plane,master 41s v1.21.1
3.3. Сведения о кластере
Как только кластер будет готов, мы можем проверить детали с помощью команды cluster-info
на kubectl
:
$ kubectl cluster-info --context kind-foreach-kind
Kubernetes master is running at https://127.0.0.1:59489
CoreDNS is running at https://127.0.0.1:59489/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
Кроме того, мы можем использовать параметр дампа
вместе с командой cluster-info
для извлечения подробной информации о кластере:
$ kubectl cluster-info dump --context kind-foreach-kind
3.4. Удалить кластер
Подобно команде get
, мы можем использовать команду удаления
для удаления определенного кластера:
$ kind delete cluster --name foreach-kind
4. Входной контроллер
4.1. Настроить
Нам потребуется входной
контроллер для установления соединения между нашей локальной средой и кластером Kubernetes.
Поэтому мы можем использовать параметры конфигурации kind, такие как extraPortMappings
и
node -labels
:
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
name: foreach-kind
nodes:
- role: control-plane
kubeadmConfigPatches:
- |
kind: InitConfiguration
nodeRegistration:
kubeletExtraArgs:
node-labels: "ingress-ready=true"
extraPortMappings:
- containerPort: 80
hostPort: 80
protocol: TCP
- containerPort: 443
hostPort: 443
protocol: TCP
Здесь мы обновили наш файл foreachConfig.yaml
, чтобы установить конфигурации для входного контроллера, сопоставив порт контейнера с портом хоста. Кроме того, мы включили узел для входа, определив ingress-ready=true
.
Затем мы должны воссоздать наш кластер с измененной конфигурацией:
kind create cluster --config foreachConfig.yaml
4.2. Развертывать
Затем мы развернем входной контроллер NGINX , поддерживаемый Kubernetes, для работы в качестве обратного прокси-сервера и балансировщика нагрузки:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml
Кроме того, мы также можем использовать контроллеры балансировки нагрузки AWS и GCE.
5. Локальное развертывание службы
Наконец, мы готовы развернуть наш сервис. Для этого руководства мы можем использовать простой веб-сервер http-echo
, доступный в виде образа докера .
5.1. Настроить
Итак, давайте создадим файл конфигурации, определяющий службу, и используем ingress для ее локального размещения:
kind: Pod
apiVersion: v1
metadata:
name: foreach-app
labels:
app: foreach-app
spec:
containers:
- name: foreach-app
image: hashicorp/http-echo:0.2.3
args:
- "-text=Hello World! This is a ForEach Kubernetes with kind App"
---
kind: Service
apiVersion: v1
metadata:
name: foreach-service
spec:
selector:
app: foreach-app
ports:
# Default port used by the image
- port: 5678
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: foreach-ingress
spec:
rules:
- http:
paths:
- pathType: Prefix
path: "/foreach"
backend:
service:
name: foreach-service
port:
number: 5678
---
Здесь мы создали модуль с именем foreach-app
с текстовым
аргументом и службу с именем foreach-service.
Затем мы настроили входящую сеть для службы foreach
на порту 5678 и через URI /foreach
.
5.2. Развертывать
Теперь, когда мы готовы со всей конфигурацией и наш кластер интегрируется с входным контроллером NGINX, давайте развернем наш сервис:
$ kubectl apply -f foreach-service.yaml
Мы можем проверить статус сервисов на kubectl
:
$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
foreach-service ClusterIP 10.96.172.116 <none> 5678/TCP 5m38s
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 7m5s
Вот и все! Наш сервис развернут и должен быть доступен по адресу localhost/foreach
:
$ curl localhost/foreach
Hello World! This is a ForEach Kubernetes with kind App
Примечание: если мы столкнемся с какой-либо ошибкой, связанной с веб-хуком validate.nginx.ingress.kubernetes.io
, мы должны удалить ValidationWebhookConfiguration
:
$ kubectl delete -A ValidatingWebhookConfiguration ingress-nginx-admission
validatingwebhookconfiguration.admissionregistration.k8s.io "ingress-nginx-admission" deleted
Затем снова разверните службу.
6. Заключение
В этой статье мы изучили Kubernetes с помощью kind
.
Во-первых, мы выполнили настройку, включающую установку командной строки Kubernetes kubectl
и kind
. Затем мы рассмотрели несколько функций для создания/обновления локального кластера Kubernetes .
Наконец, мы интегрировали контроллер входящего трафика и развернули службу с частным доступом в кластере Kubernetes.