Skip to content

Kubernetes

andyceo edited this page Jan 25, 2017 · 5 revisions

Примерный путь, чтобы пощупать Kubernetes

Все дальнейшие инструкции происходят в консоли на каком-либо компьютере с Ubuntu 16.04

Установка minikube

Выбираем последний релиз: 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

Установка minikube на Windows

Выбираем последний релиз: 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 из инсталлера.

Установка kubectl

Сначала нужно узнать актуальную версию, это можно сделать так:

    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

Установка kubectl на 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

Установка кластера под Windows

Посмотрим доступные версии Kubernetes:

minikube get-k8s-versions

Установим, явно задав версию:

minikube.exe start --kubernetes-version="v1.5.1" --vm-driver="virtualbox" --show-libmachine-logs --alsologtostderr

Удаление кластера в Windows

Сначала остановим кластер:

minikube stop

Затем удалим:

minikube delete

Затем можно либо удалить утилиту minikube через удаление в списке программ, либо скачать инсталлер новой версии и переустановить новую версию. Если принято решение удалить, не забудьте удалить kubectl. Если переставить, то после новой установки minikube может понадобиться удалить

Ссылки

Sidebar is under construction

Clone this wiki locally