Minikube позволяет запускать одно-нодовый Kubernetes кластер внутри виртуальной машины на локальном компьютере
Проверка поддержки процессором виртуализации
1 |
# egrep --color 'vmx|svm' /proc/cpuinfo |
Установка minikube
https://kubernetes.io/docs/tasks/tools/install-minikube/
Загрузка бинарника minikube,установка бита исполнения на него и копирование в /usr/local/bin для того,чтобы minikube был доступен в переменной PATH
1 |
# curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 && chmod +x minikube |
1 |
# cp minikube /usr/local/bin && rm minikube |
Для использования minikube предварительно необходимо установить kubectl и kvm2-драйвер
Установка и настройка kubectl
Установка kubectl
https://kubernetes.io/docs/tasks/tools/install-kubectl/
1 |
# sudo apt-get update && sudo apt-get install -y apt-transport-https |
1 |
# curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - |
1 |
# echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list |
1 |
# sudo apt-get update && sudo apt-get install -y kubectl |
Настройка автодополнения команды kubectl
Проверить/установить пакет bash-completion
1 |
# sudo dpkg -l | grep bash-completion |
1 |
ii bash-completion 1:2.8-1ubuntu1 all programmable completion for the bash shell |
Включить автодополнение для текущей сессии/ооблочки
1 |
# source <(kubectl completion bash) |
Включение автодополнения команды kubectl при автозагрузки
1 |
# echo "source <(kubectl completion bash)" >> ~/.bashrc |
Установка KVM2 драйвера для minikube
https://github.com/kubernetes/minikube/blob/master/docs/drivers.md
Minikube уже имеет встроенные драйверы VirtualBox и VMware Fusion, поэтому никаких дополнительных действий по их использованию не требуется. Тем не менее, другие драйверы требуют наличия дополнительного бинарного файла в PATH хоста.
В данном случае мы запускаем minikube с провайдером виртуализации KVM
Поэтому установим KVM2-драйвер
Для начала установим зависимости KVM2-драйвера
1 |
# sudo apt install libvirt-clients libvirt-daemon-system qemu-kvm |
Добавление пользователя, под которым мы работаем, в группу libvirt
1 |
# sudo usermod -a -G libvirt $(whoami) |
Для присоединения к группе libvirt в текущей сессии выполним команду
1 |
# newgrp libvirt |
проверим, что пользователь уже состоит в группе libvirt
1 |
# id |
1 |
uid=1000(eugene) gid=135(libvirt) группы=135(libvirt),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),108(lpadmin),124(sambashare),1000(eugene) |
Непосредственная установка KVM-драйвера
1 |
# curl -LO https://storage.googleapis.com/minikube/releases/latest/docker-machine-driver-kvm2 && sudo install docker-machine-driver-kvm2 /usr/local/bin/ |
Создание Kubernetes-кластера средствами minikube
https://kubernetes.io/docs/setup/minikube/
По умолчанию minikube запускается в виртуальной машине с такими параметрами
1 2 3 4 5 |
DefaultMemory = 2048 DefaultCPUS = 2 DefaultDiskSize = "20g" MinimumDiskSizeMB = 2000 DefaultVMDriver = "virtualbox" |
Для того,чтобы использовать KVM2-драйвер в качестве дефолтного драйвера необходимо запускать minikube с помощью команды
1 |
# minikube start --vm-driver kvm2 |
Альтернативным вариантом является установка дефолтного драйвера командой
1 |
# minikube config set vm-driver kvm2 |
Также при необходимости можно увеличить размер ОЗУ, с которой будет запускаться вирт.машина с помощью параметра —memory=4096
Например, запустим вирт.машину c minikube с ОЗУ 4Gb
1 |
# minikube start --memory=4096 |
Альтернативным вариантом является установка необходимого размера ОЗУ для вирт.машины командой
1 |
# minikube config set memory 4096 |
После чего запуск minikube выполняется командой
1 |
# minikube start |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
😄 minikube v0.34.1 on linux (amd64) 🔥 Creating kvm2 VM (CPUs=2, Memory=4096MB, Disk=20000MB) ... 💿 Downloading Minikube ISO ... 184.30 MB / 184.30 MB [============================================] 100.00% 0s 📶 "minikube" IP address is 192.168.39.113 🐳 Configuring Docker as the container runtime ... ✨ Preparing Kubernetes environment ... 💾 Downloading kubeadm v1.13.3 💾 Downloading kubelet v1.13.3 🚜 Pulling images required by Kubernetes v1.13.3 … 🚀 Launching Kubernetes v1.13.3 using kubeadm ... 🔑 Configuring cluster permissions ... 🤔 Verifying component health ..... 💗 kubectl is now configured to use "minikube" 🏄 Done! Thank you for using minikube! |
Отключить отправку оповещений об ошибках разработчикам
1 |
# minikube config set WantReportErrorPrompt false |
Дефолтная/текущая конфигурация minikube размещается в файле
1 |
~/.minikube/profiles/minikube/config.json |
1 |
# cat ~/.minikube/profiles/minikube/config.json |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
{ "MachineConfig": { "MinikubeISO": "https://storage.googleapis.com/minikube/iso/minikube-v0.34.0.iso", "Memory": 4096, "CPUs": 2, "DiskSize": 20000, "VMDriver": "kvm2", "ContainerRuntime": "docker", "HyperkitVpnKitSock": "", "HyperkitVSockPorts": [], "XhyveDiskDriver": "ahci-hd", "DockerEnv": null, "InsecureRegistry": null, "RegistryMirror": null, "HostOnlyCIDR": "192.168.99.1/24", "HypervVirtualSwitch": "", "KvmNetwork": "default", "DockerOpt": null, "DisableDriverMounts": false, "NFSShare": [], "NFSSharesRoot": "/nfsshares", "UUID": "", "GPU": false }, "KubernetesConfig": { "KubernetesVersion": "v1.13.3", "NodeIP": "192.168.39.113", "NodePort": 8443, "NodeName": "minikube", "APIServerName": "minikubeCA", "APIServerNames": null, "APIServerIPs": null, "DNSDomain": "cluster.local", "ContainerRuntime": "docker", "CRISocket": "", "NetworkPlugin": "", "FeatureGates": "", "ServiceCIDR": "10.96.0.0/12", "ExtraOptions": null, "ShouldLoadCachedImages": false, "EnableDefaultCNI": false } } |
Параметры переопределнные вручную в файле ~/.minikube/config/config.json
1 |
# cat ~/.minikube/config/config.json |
1 2 3 4 5 |
{ "WantReportErrorPrompt": false, "vm-driver": "kvm2", "memory": 4096, } |
Просмотр значение текущих установок выполненных с помощью команды set
1 |
# minikube config view |
1 2 3 |
- WantReportErrorPrompt: false - memory: 4096 - vm-driver: kvm2 |
Просмотр параметров, которые могут быть переопределены/изменены
1 |
# minikube config --help |
Проверка IP-адреса вирт.машины с minikube
1 |
# minikube ip |
1 |
192.168.39.113 |
Minikube хранит все свои данные в каталоге
~/.minikube/
Логи minikube доступны в файле
1 |
# cat /var/log/libvirt/qemu/minikube.log |
Либо с помощью команды minikube
1 |
# minikube logs |
Настройка kubectl
После установки кластера(через kube-up.sh или через minikube) автоматически создается конфигурационный файл kubeconfig кластера.По умолчанию этот файл создается по пути ~/.kube/config
1 |
# cat ~/.kube/config |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
apiVersion: v1 clusters: - cluster: certificate-authority: /home/eugene/.minikube/ca.crt server: https://192.168.39.113:8443 name: minikube contexts: - context: cluster: minikube user: minikube name: minikube current-context: minikube kind: Config preferences: {} users: - name: minikube user: client-certificate: /home/eugene/.minikube/client.crt client-key: /home/eugene/.minikube/client.key |
Также текщая конфигурация kubectl доступна по команде
1 |
# kubectl config view |
Проверка того, что kubectl настроен корректно и может получить доступ к Kubernetes-кластеру
1 |
# kubectl cluster-info |
1 2 |
Kubernetes master is running at https://192.168.39.113:8443 KubeDNS is running at https://192.168.39.113:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy |
Более полную информацию о кластере можно получить
1 |
# kubectl cluster-info dump |
Kubectl может поддерживает несколько конфигураций(но активная может быть только одна конфигурация в текущий момент)
Текщая конфигурация kubectl доступна по команде
1 |
# kubectl config view |
Просмотр всех контекстов(context), которые используются
1 |
# kubectl config get-contexts |
1 2 3 4 |
CURRENT NAME CLUSTER AUTHINFO NAMESPACE * gke_mydemoproject-123456_europe-west1-b_persistent-disk-tutorial gke_mydemoproject-123456_europe-west1-b_persistent-disk-tutorial gke_mydemoproject-123456_europe-west1-b_persistent-disk-tutorial minikube minikube minikube |
Текущая/активная конфигурация определена символом *
Также просмотр текущего контекста доступна по команде
1 |
# kubectl config current-context |
1 |
gke_mydemoproject-123456_europe-west1-b_persistent-disk-tutorial |
Установить желаемый контекст
1 |
# kubectl config use-context |
Например, установим текущий контекст kubectl на использование контекста с именем minikube
1 |
# kubectl config use-context minikube |
1 |
# kubectl config current-context |
1 |
minikube |
Проверка всех существующих ресурсов в дефолтном namespace
1 |
# kubectl get all |
1 2 |
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.96.0.1 443/TCP 16m |
Проверка всех существующих ресурсов в namespace kube-system
1 |
# kubectl get all -n kube-system |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
NAME READY STATUS RESTARTS AGE pod/coredns-86c58d9df4-gt625 1/1 Running 0 16m pod/coredns-86c58d9df4-rt4jc 1/1 Running 0 16m pod/etcd-minikube 1/1 Running 1 15m pod/kube-addon-manager-minikube 1/1 Running 0 15m pod/kube-apiserver-minikube 1/1 Running 0 15m pod/kube-controller-manager-minikube 1/1 Running 2 15m pod/kube-proxy-b8wkf 1/1 Running 0 16m pod/kube-scheduler-minikube 1/1 Running 2 15m pod/storage-provisioner 1/1 Running 0 15m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kube-dns ClusterIP 10.96.0.10 53/UDP,53/TCP 16m NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE daemonset.apps/kube-proxy 1 1 1 1 1 16m NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/coredns 2/2 2 2 16m NAME DESIRED CURRENT READY AGE replicaset.apps/coredns-86c58d9df4 2 2 2 16m |
Проверка всех существующих ресурсов в namespace kube-public
1 |
# kubectl get all -n kube-public |
1 |
No resources found. |
Запуск тестового приложения в Kubernetes
Создание deployment для запуска пода с контейнером из образа
1 |
# kubectl run hello-minikube --image=k8s.gcr.io/echoserver:1.10 --port=8080 |
Создание Service с типом NodePort для доступа к запущенному приложению
1 |
# kubectl expose deployment hello-minikube --type=NodePort |
Просмотр URL, на котором доступен service(такой URL состоит из IP-адреса вирт.машины с minikube и рандомного порта, открытого с помощью предыдущей команды)
1 |
# minikube service hello-minikube --url |
1 |
http://192.168.39.113:32178 |
Проверка доступности приложения по указанному URL
1 |
# curl $(minikube service hello-minikube --url) |
либо
1 |
# curl http://192.168.39.113:32178 |
В выводе обеих команд получаем
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
Hostname: hello-minikube-6fd785d459-kpq27 Pod Information: -no pod information available- Server values: server_version=nginx: 1.13.3 - lua: 10008 Request Information: client_address=172.17.0.1 method=GET real path=/ query= request_version=1.1 request_scheme=http request_uri=http://192.168.39.113:8080/ Request Headers: accept=*/* host=192.168.39.113:32178 user-agent=curl/7.58.0 Request Body: -no body in request- |
Просмотр созданных ресурсов — deployment и service
1 |
# kubectl get pod, svc -n default |
1 2 3 4 5 6 |
NAME READY STATUS RESTARTS AGE pod/hello-minikube-6fd785d459-kpq27 1/1 Running 0 9m6s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/hello-minikube NodePort 10.108.19.11 8080:32178/TCP 8m44s service/kubernetes ClusterIP 10.96.0.1 443/TCP 27m |
Выполнение bash-команды в поде
1 |
# kubectl exec -it hello-minikube-6fd785d459-kpq27 -- bash -c "cat /etc/issue" |
1 |
Ubuntu 16.04.2 LTS \n \l |
Аналогично,но с заходом в под
1 |
# kubectl exec -it hello-minikube-6fd785d459-kpq27 bash |
1 |
root@hello-minikube-6fd785d459-kpq27:/# cat /etc/issue |
1 |
Ubuntu 16.04.2 LTS \n \l |
Удаление deployment и service
1 |
# kubectl delete services hello-minikube |
1 |
# kubectl delete deployment hello-minikube |