Kubernetes - andyceo/documentation GitHub Wiki
Все дальнейшие инструкции происходят в консоли на каком-либо компьютере с Ubuntu 16.04
Выбираем последний релиз: https://github.com/kubernetes/minikube/releases
wget https://github.com/kubernetes/minikube/releases/download/v0.13.0/minikube_0.13-0.deb
sudo dpkg -i minikube_0.13-0.deb
Выведем помощь:
minikube
Посмотрим версию:
minikube version
Или нужно установить так:
curl -Lo minikube https://storage.googleapis.com/minikube/releases/v0.13.1/minikube-linux-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/
Подробные инструкции по установке можно найти тут: https://github.com/kubernetes/minikube/releases
Выбираем последний релиз: https://github.com/kubernetes/minikube/releases
Скачаем Windows-инсталлер minikube-installer.exe
запустим и установим minikube
. Далее, следуя нижеприведенным инструкциям в разделе становка kubectl, установим утилиту kubectl
в папку, куда установлен minikube
: C:\Program Files (x86)\Kubernetes\Minikube\kubectl.exe
.
Если скачать файл minikube-linux-amd64.exe
, переименовать в minikube.exe
и положить в папку C:\Windows
. Но если установить minikube таким способом, то мы получим ошибку при попытке запустить кластер minikube start
:
Error starting host: Error creating new host: Driver "virtualbox" not found. Do you have the plugin binary accessible in your PATH?.
Это было верно для версии minikube 0.14. Поэтому ставим minikube из инсталлера.
Сначала нужно узнать актуальную версию, это можно сделать так:
curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt
Поставим утилиту kubectl:
curl -Lo kubectl https://storage.googleapis.com/kubernetes-release/release/{VERSION}/bin/linux/amd64/kubectl && chmod +x kubectl && sudo mv kubectl /usr/local/bin/
Так предлагают установить kubectl
с официального сайта
curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl
Посмотрим версию minikube:
kubectl version
-
Сначала нужно узнать актуальную версию, это можно сделать так:
curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt
-
Потом скачаем актуальную версию файла: http://storage.googleapis.com/kubernetes-release/release/{VERSION}/bin/windows/amd64/kubectl.exe
-
Файл
kubectl.exe
нужно положить в папкуC:\Windows
Посмотрим, какие релизы кубернетеса есть:
minikube get-k8s-versions
Начнем установку кластера:
minikube start
Если нужно запустить это из-под Windows, то сначала нужно задать соответствующие переменные окружения:
minikube start --docker-env HTTP_PROXY=http://$YOURPROXY:PORT --docker-env HTTPS_PROXY=https://$YOURPROXY:PORT
Если вы перед этим прокинуди SOCKS-прокси через ssh, то делаем так:
minikube start --docker-env HTTP_PROXY=http://127.0.0.1:4444 --docker-env HTTPS_PROXY=https://127.0.0.1:4444
Или можно подменить URL c ISO-образом:
minikube start --iso-url http://example.com/minikube-0.7.iso
Эта команда поставит VirtualBox, скачает образ minikube и запустит виртуальную машину с ней. Убедимся в этом:
VBoxManage list vms
VBoxManage list runningvms
Если кластер успешно запустился, то можно открыть в браузере панель управления (дэшбоард) Kubernetes:
minikube dashboard
Посмотрим версию kubectl:
kubectl version
Команда выведет версию как клиента (самой утилиты kubectl), так и сервера (видимо, утилиты kubelet, которая крутится внутри виртуальной машины)
Выведет информацию о кластере:
kubectl cluster-info
Получим:
Kubernetes master is running at https://192.168.99.100:8443
KubeDNS is running at https://192.168.99.100:8443/api/v1/proxy/namespaces/kube-system/services/kube-dns
kubernetes-dashboard is running at https://192.168.99.100:8443/api/v1/proxy/namespaces/kube-system/services/kubernetes-dashboard
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
Здесь видим адрес панели управления кластером Kubernetes и DNS.
Посмотрим на существующие ноды:
kubectl get nodes
Получим:
NAME STATUS AGE
minikube Ready 19h
Запустим первое приложение kubernetes-bootcamp (создадим Deployment)
kubectl run kubernetes-bootcamp --image=docker.io/jocatalin/kubernetes-bootcamp:v1 --port=8080
Получим:
deployment "kubernetes-bootcamp" created
Посмотрим список всех Deployments:
kubectl get deployments
Получим:
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
kubernetes-bootcamp 1 1 1 1 6m
Посмотрим, на каком Pod выполняется приложение:
export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')
echo Name of the Pod: $POD_NAME
Получим:
Name of the Pod: kubernetes-bootcamp-390780338-g0p9g
По умолчанию приложения видны только внутри Kubernetes кластера. Поэтому прокинем прокси, чтобы мы могли "видеть" приложение:
kubectl proxy
Получим:
Starting to serve on 127.0.0.1:8001
Для того, чтобы продолжить работу, придется запустить другой терминал. В этом терминале снова положим в переменную $POD_NAME имя пода, в котором выполняется наше приложение:
export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')
echo Name of the Pod: $POD_NAME
И запросим наше приложение через curl:
curl http://localhost:8001/api/v1/proxy/namespaces/default/pods/$POD_NAME/
Получим:
% Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed
100 83 100 83 0 0 279 0 --:--:-- --:--:-- --:--:-- 295Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-390780338-g0p9g | v=1
Список всех подов:
kubectl get pods
Получим:
NAME READY STATUS RESTARTS AGE
kubernetes-bootcamp-390780338-g0p9g 1/1 Running 0 11m
Подробная информация о подах (показывает, какие контейнеры крутятся внутри пода, и с какими параметрами они запущены):
kubectl describe pods
Получим:
Name: kubernetes-bootcamp-390780338-g0p9g
Namespace: default
Node: minikube/192.168.99.101
Start Time: Mon, 09 Jan 2017 19:05:09 +0300
Labels: pod-template-hash=390780338
run=kubernetes-bootcamp
Status: Running
IP: 172.17.0.4
Controllers: ReplicaSet/kubernetes-bootcamp-390780338
Containers:
kubernetes-bootcamp:
Container ID: docker://d263e19752b05d537224c8d5c244ea2230919e83bd6b3b4f97b5b4009f0eae3e
Image: docker.io/jocatalin/kubernetes-bootcamp:v1
Image ID: docker://sha256:8fafd8af70e9aa7c3ab40222ca4fd58050cf3e49cb14a4e7c0f460cd4f78e9fe
Port: 8080/TCP
State: Running
Started: Mon, 09 Jan 2017 19:05:36 +0300
Ready: True
Restart Count: 0
Volume Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-6s8wm (ro)
Environment Variables: <none>
Conditions:
Type Status
Initialized True
Ready True
PodScheduled True
Volumes:
default-token-6s8wm:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-6s8wm
QoS Class: BestEffort
Tolerations: <none>
Events:
FirstSeen LastSeen Count From SubObjectPath Type Reason Message
--------- -------- ----- ---- ------------- -------- ------ -------
15m 15m 1 {default-scheduler } Normal Scheduled Successfully assigned kubernetes-bootcamp-390780338-g0p9g to minikube
15m 15m 1 {kubelet minikube} spec.containers{kubernetes-bootcamp}Normal Pulling pulling image "docker.io/jocatalin/kubernetes-bootcamp:v1"
15m 15m 1 {kubelet minikube} spec.containers{kubernetes-bootcamp}Normal Pulled Successfully pulled image "docker.io/jocatalin/kubernetes-bootcamp:v1"
15m 15m 1 {kubelet minikube} spec.containers{kubernetes-bootcamp}Normal Created Created container with docker id d263e19752b0; Security:[seccomp=unconfined]
15m 15m 1 {kubelet minikube} spec.containers{kubernetes-bootcamp}Normal Started Started container with docker id d263e19752b0
Посмотреть логи контейнеров внутри пода:
kubectl logs $POD_NAME
где $POD_NAME - это имя пода, можно найти из примеров выше.
Получим:
Kubernetes Bootcamp App Started At: 2017-01-09T16:05:36.562Z | Running On: kubernetes-bootcamp-390780338-g0p9g
Running On: kubernetes-bootcamp-390780338-g0p9g | Total Requests: 1 | App Uptime: 622.136 seconds | Log Time: 2017-01-09T16:15:58.699Z
Выполним команду env
внутри контейнера (он один в поде, поэтому не надо уточнять имя контейнера)
kubectl exec $POD_NAME env
Получим:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=kubernetes-bootcamp-390780338-g0p9g
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT=tcp://10.0.0.1:443
KUBERNETES_PORT_443_TCP=tcp://10.0.0.1:443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_ADDR=10.0.0.1
KUBERNETES_SERVICE_HOST=10.0.0.1
KUBERNETES_SERVICE_PORT=443
NPM_CONFIG_LOGLEVEL=info
NODE_VERSION=6.3.1
HOME=/root
Запустим терминальный сеанс в контейнере с нашим приложением:
kubectl exec -ti $POD_NAME bash
И находясь внутри контейнера с приложением, можно распечатать его код:
cat server.js
Получим список всех сервисов:
kubectl get services
Получим:
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes 10.0.0.1 <none> 443/TCP 2h
Теперь сделаем сервис с нашим контейнером (подом)
kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080
Получим:
service "kubernetes-bootcamp" exposed
Здесь используется тип сервиса NodePort (прокидывание порта на всех нодах).
kubectl get services
Теперь покажет новый сервис:
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes 10.0.0.1 <none> 443/TCP 2h
kubernetes-bootcamp 10.0.0.68 <nodes> 8080:30523/TCP 4s
Посмотрим подробную информацию о сервисе:
kubectl describe services/kubernetes-bootcamp
Получим:
Name: kubernetes-bootcamp
Namespace: default
Labels: run=kubernetes-bootcamp
Selector: run=kubernetes-bootcamp
Type: NodePort
IP: 10.0.0.68
Port: <unset> 8080/TCP
NodePort: <unset> 30523/TCP
Endpoints: 172.17.0.4:8080
Session Affinity: None
No events.
Сохраним порт ноды в переменной:
export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')
echo NODE_PORT=$NODE_PORT
Получим:
NODE_PORT=30523
Если мы посмотрим все деплойментс:
kubectl describe deployment
Получим:
Name: kubernetes-bootcamp
Namespace: default
CreationTimestamp: Mon, 09 Jan 2017 19:05:09 +0300
Labels: run=kubernetes-bootcamp
Selector: run=kubernetes-bootcamp
Replicas: 1 updated | 1 total | 1 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 1 max unavailable, 1 max surge
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
OldReplicaSets: <none>
NewReplicaSet: kubernetes-bootcamp-390780338 (1/1 replicas created)
Events:
FirstSeen LastSeen Count From SubObjectPath Type Reason Message
--------- -------- ----- ---- ------------- -------- ------ -------
38m 38m 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set kubernetes-bootcamp-390780338 to 1
То увидим что для нашего Deployment уже создана метка run=kubernetes-bootcamp
. Мы можем выбрать по этой метке все поды?
kubectl get pods -l run=kubernetes-bootcamp
Получим:
NAME READY STATUS RESTARTS AGE
kubernetes-bootcamp-390780338-g0p9g 1/1 Running 0 39m
И мы можем сделать то же самое и для сервисов:
kubectl get services -l run=kubernetes-bootcamp
Получим:
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes-bootcamp 10.0.0.68 <nodes> 8080:30523/TCP 10m
Получим имя пода и сохраним в переменной:
export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')
echo Name of the Pod: $POD_NAME
Получим:
Name of the Pod: kubernetes-bootcamp-390780338-g0p9g
Пометим под новой меткой:
kubectl label pod $POD_NAME app=v1
Получим:
pod "kubernetes-bootcamp-390780338-g0p9g" labeled
Убедимся, что метка появилась:
kubectl describe pods $POD_NAME
Получим:
Name: kubernetes-bootcamp-390780338-g0p9g
Namespace: default
Node: minikube/192.168.99.101
Start Time: Mon, 09 Jan 2017 19:05:09 +0300
Labels: app=v1
pod-template-hash=390780338
run=kubernetes-bootcamp
Status: Running
IP: 172.17.0.4
Controllers: ReplicaSet/kubernetes-bootcamp-390780338
Containers:
kubernetes-bootcamp:
Container ID: docker://d263e19752b05d537224c8d5c244ea2230919e83bd6b3b4f97b5b4009f0eae3e
Image: docker.io/jocatalin/kubernetes-bootcamp:v1
Image ID: docker://sha256:8fafd8af70e9aa7c3ab40222ca4fd58050cf3e49cb14a4e7c0f460cd4f78e9fe
Port: 8080/TCP
State: Running
Started: Mon, 09 Jan 2017 19:05:36 +0300
Ready: True
Restart Count: 0
Volume Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-6s8wm (ro)
Environment Variables: <none>
Conditions:
Type Status
Initialized True
Ready True
PodScheduled True
Volumes:
default-token-6s8wm:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-6s8wm
QoS Class: BestEffort
Tolerations: <none>
Events:
FirstSeen LastSeen Count From SubObjectPath Type ReasonMessage
--------- -------- ----- ---- ------------- -------- -------------
42m 42m 1 {default-scheduler } Normal Scheduled Successfully assigned kubernetes-bootcamp-390780338-g0p9g to minikube
42m 42m 1 {kubelet minikube} spec.containers{kubernetes-bootcamp} Normal Pullingpulling image "docker.io/jocatalin/kubernetes-bootcamp:v1"
41m 41m 1 {kubelet minikube} spec.containers{kubernetes-bootcamp} Normal PulledSuccessfully pulled image "docker.io/jocatalin/kubernetes-bootcamp:v1"
41m 41m 1 {kubelet minikube} spec.containers{kubernetes-bootcamp} Normal CreatedCreated container with docker id d263e19752b0; Security:[seccomp=unconfined]
41m 41m 1 {kubelet minikube} spec.containers{kubernetes-bootcamp} Normal StartedStarted container with docker id d263e19752b0
Выберем поды, помеченные новой меткой:
kubectl get pods -l app=v1
Получим:
NAME READY STATUS RESTARTS AGE
kubernetes-bootcamp-390780338-g0p9g 1/1 Running 0 43m
Улалим сервис:
kubectl delete service -l run=kubernetes-bootcamp
Получим:
service "kubernetes-bootcamp" deleted
Команда
kubectl get services
покажет, что сервиса больше нет:
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes 10.0.0.1 <none> 443/TCP 3h
Посмотрим доступные версии Kubernetes:
minikube get-k8s-versions
Установим, явно задав версию:
minikube.exe start --kubernetes-version="v1.5.1" --vm-driver="virtualbox" --show-libmachine-logs --alsologtostderr
Сначала остановим кластер:
minikube stop
Затем удалим:
minikube delete
Затем можно либо удалить утилиту minikube
через удаление в списке программ, либо скачать инсталлер новой версии и переустановить новую версию. Если принято решение удалить, не забудьте удалить kubectl
. Если переставить, то после новой установки minikube может понадобиться удалить