Перейти к основному содержимому

Kubernetes с видом

· 6 мин. чтения

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.