minikube start --driver=virtualbox --profile k8s-cluster-1 --no-vtx-check --cpus=2 --memory=4gb --disk-size=25gb
- Запуск мастер ноды
minikube start/stop/delete/ssh
- Основные операции с minikube
minikube dashboard
- Запуск дашборда
minikube service "DEPLOYMENT"
- Открыть сервис деплоймента (страничку на рандомном порте)
minikube addons list
- Информация о аддонах в кластере
minikube addons enable "ADDON"
- Включить аддон
minikube profile list
- Информация о профилях minikube
minikube ssh
- Войти по ssh в minikube
minikube ip
- Вывести ip minikube
Нода- элемент кластера. Под- элемент ноды, по сути контейнер внутри Ноды.
Подсказки
kubectl get deployments
- Текущие деплойменты
kubectl get nodes
- Информация о нодах
kubectl get pods
- Информация о подах
kubectl get events
- Информация о событиях
kubectl get services
- Информация о запущенных сервисах
kubectl get namespaces
- Информация о областях наименований
kubectl get nodes/pods/events/deployments/services/namespaces/replicationcontroller/replicaset/endpoints -o wide/yaml --all-namespaces
- Вывести подробную информацию
kubectl create namespace "NAME"
- Создать пространство имен
kubectl delete deployment/node/service/pods/namespaces "NAME"
- Удаление элементов
kubectl describe "POD"
- Полная информация о поде
kubectl describe node k8s-profile-1
- Полная информация о ноде
kubectl config
- Выбор кластера/контекста/работа с конфигом kubectl
kubectl config set-context --current --namespace=kube-system
- Выбор области наименований в текущем контексте
kubectl apply -f file.yaml
- Применить указанный файл в кластер
kubectl scale deploy NAME --replicas=3
- Установить кол-во подов в деплое на 3
kubectl cluster-info
- Информация о кластере
kubectl version
- Информация о версии ноды и клиента
kubectl config view
- Информация о конфиге kubectl
kubectl logs "POD"
- Логи пода
kubectl logs "POD" --container "NAME"
- Логи конкретного контейнера внутри пода
kubectl port-forward "POD" 8081:80
- Открыть порт пода внутреннего 80 на внешний 8081
kubectl edit service "NAME"
- Редактирование сервиса
kubectl exec -it "POD" -- /bin/bash
- Открыть терминал контейнера пода (аналогия синтаксиса с docker)
kubectl annotate pod "POD" example="simpletext"
- Аннотация пода. Довольно важный инструмент. С помощью аннотации мы можем задать (к примеру) параметр причины истории обновления (CHANGE-CAUSE).
kubectl annotate deployment DEPLOYNAME kubernetes.io/change-cause="UPDATE TO 1.10"
- Обновляем причину (аннотацию) на свою. ОБЯЗАТЕЛЬНО делать после обновления версии контейнера в деплое.
kubectl rollout history deployment DEPLOYNAME
- Отобразить историю изменений деплоймента.
kubectl rollout undo deployment DEPLOYNAME
- Откатить деплоймент к предыдущей версии.
kubectl rollout undo deployment app-deploy --to-revision=1
- Откатиться к определенной ревизии деплоя.
Лейблы- важный инструмент работы с инстансами. Благодаря лейблам мы можем (к примеру) выкатывать наш под на ноду со спецефическим значением лейбла. Читать пример деплоя №2
kubectl get pods --show-labels
- Вывести лейблы подов
kubectl get pods -L "NAME"
- Вывести под с имеющимся лейблом "NAME"
kubectl label pod "NAME" label=key
- Выдать поду лейбл c значением "key"
kubectl config set-cluster —server=https://k8stest.com:1234 —certificate-authirity=path_to_cert
- Добавить внешний кластер
kubectl expose deployment hello-node --type=LoadBalancer --port=8080
- Открыть порт 8080 деплойменту (После можно запустить minikube service чтобы получить доступ)
kubectl run app-kuber-1 --image=paulbouwer/hello-kubernetes:1.10 --port=8080
- запустить под
kubectl create deployment kuber-app-1 --image=paulbouwer/hello-kubernetes:1.10 --port=8080 --replicas=3
- Создать деплоймент образа (репликасет)
kubectl set image deployment kuber-app-1 hello-kubernetes=paulbouwer/hello-kubernetes:0.9
- Поменять версию контейнера в деплойменте на другую. имя "hello-kubernetes" можно получить из template->spec->name при -o yaml
apiVersion: v1
kind: Pod
metadata:
name: hello-pod
labels:
name: hello-pod
env: test
spec:
containers:
- name: hello
image: paulbouwer/hello-kubernetes:1.10
resources:
limits:
memory: "128Mi"
cpu: "500m"
ports:
- containerPort: 80
Нода имеет лейбл: kubectl label node k8s-profile-1 gpu=true
При деплое пода мы используем элемент "nodeSelector", благодаря ему под будет развернут на любой из нод, где присутствует лейбл gpu с значением "true"
apiVersion: v1
kind: Pod
metadata:
name: hello-pod
labels:
name: hello-pod
env: test
spec:
nodeSelector:
gpu: "true"
containers:
- name: hello
image: paulbouwer/hello-kubernetes:1.10
resources:
limits:
memory: "128Mi"
cpu: "500m"
ports:
- containerPort: 80
Новая версия ReplicationController, используется в данный момент как более новая версия (с большим кол-вом функций)
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: replica-1
labels:
app: hello
spec:
replicas: 4
selector:
matchLabels:
key: val
template:
metadata:
labels:
key: val
spec:
containers:
- name: hello-container
image: paulbouwer/hello-kubernetes:1.10
Тут сложнее. У нас имеется блок matchExpressions, и он позволит создать только те темплейты, у которых имеются лейблы kuber
с параметром accept
/http-server
и где имеется лейбл dev
(с любым значением).
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: replica-2
spec:
replicas: 2
selector:
matchExpressions:
- key: kuber
operator: In/NotIn
values:
- accept
- http-server
- key: env
operator: Exists/DoesNotExist
template:
metadata:
labels:
kuber: accept
env: dev
spec:
containers:
- name: hello-container
image: paulbouwer/hello-kubernetes:1.10
Еще сложнее. Деплоймент управляет репликасет, и как следствие и подами. Отличается от всех остальных модулем spec (добавились стратегии обновления). Остальное так же как и в прошлых примерах.
RollingUpdate
- Медленный перевод с проверкой readiness пода.
Recreate
- Пересоздает сразу все поды на новый образ.
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
labels:
app: kuber
spec:
replicas: 5
minReadySeconds: 10
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
type: RollingUpdate/Recreate
selector:
matchLabels:
app: http-server
template:
metadata:
labels:
app: http-server
spec:
containers:
- name: kuber-app
image: paulbouwer/hello-kubernetes:1.10
resources:
limits:
memory: "100Mi"
cpu: "100m"
ports:
- containerPort: 8080
Сервис позволяет прокидывать внутренние порты кластера на внешний (к примеру порт контейнера приложения с селектором app: http-server. Деплой в примере выше), После деплоя сервиса будет открыт доступа с ip ноды minikube (порт указан в kubectl get services)
Ниже определения параметров:
ClusterIP
(по умолчанию) — открывает доступ к сервису по внутреннему IP-адресу в кластере. Этот тип делает сервис доступным только внутри кластера;
NodePort
— открывает сервис на том же порту каждого выбранного узла в кластере с помощью NAT. Делает сервис доступным вне кластера через NodeIP:NodePort. Является надмножеством ClusterIP.
LoadBalancer
— создает внешний балансировщик нагрузки в текущем облаке (если это поддерживается) и назначает фиксированный внешний IP-адрес для сервиса. Является надмножеством NodePort.
ExternalName
— открывает доступ к сервису по содержимому поля externalName (например, foo.bar.example.com), возвращая запись CNAME с его значением. При этом прокси не используется. Для этого типа требуется версия kube-dns 1.7+ или CoreDNS 0.0.8+.
apiVersion: v1
kind: Service
metadata:
name: app-service
labels:
app: kuber
spec:
selector:
app: http-server
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: ClusterIP/NodePort/LoadBalancer/ExternalName
apiVersion: v1
kind: Service
metadata:
name: external-svc
spec:
type: ExternalName
externalName: example.com
Endpoint представляет из себя (как понятно из условного перевода) конечную точку. Суть в том что с помощью созданного эндпоинта мы можем обращаться к подам из разных деплоев (к примеру).
К примеру:
kubectl get endpoints
NAME ENDPOINTS AGE
kubernetes 192.168.59.104:8443 14d
service-deploy 10.244.0.49:8080,10.244.0.50:8080,10.244.0.53:8080 5h16m
service-pod 10.244.0.52:8080,10.244.0.52:8080 5h3m
apiVersion: v1
kind: Service
metadata:
name: endpoint
spec:
ports:
- port: 80
---
apiVersion: v1
kind: Endpoints
metadata:
name: enpoint
subsets:
- addresses:
- ip: 10.244.0.49
- ip: 10.244.0.52
ports:
- port: 8080