Обзор кубектла
Предложите картинку и перепечатайте ееОбзор команд kubernetes-handbook/kubectl, вы можете получить общее представление о семействе команд.
Подготовка окружающей среды
Чтобы разрешить главному узлу развертывать модули, используйте следующую команду:
kubectl taint nodes --all node-role.kubernetes.io/master-
После установки kubectl отсутствуют такие функции, как автодополнение по умолчанию, что неудобно часто использовать. В настоящее время существуют различные небольшие кубектлы.инструментЭто может повысить эффективность, и для kubectl есть специальная оболочка. Лично я считаю более полезным следующее:
- автодополнение
Команда kubectl не имеет автодополнения по умолчанию в bash, вам нужно установить bash_completion и добавить скрипт автодополнения. Возьмем CentOS в качестве примера.Для других конфигураций операционной системы см.Install and Set Up kubectl
# 安装bash-completion
yum install -y epel-release.noarch
yum install -y bash_completion
# 添加补全脚本
kubectl completion bash >/etc/bash_completion.d/kubectl
Повторно войдя в оболочку, вы можете обнаружить, что подкоманды kubectl, включая имя ресурса, могут автоматически завершаться клавишей Tab:
- Быстро переключайтесь между кластерами и пространствами имен
Рабочая среда, как правило, состоит из нескольких кластеров или, по крайней мере, из нескольких NS, и неизбежно частое переключение между разными кластерами и разными NS. Модифицировать переменные окружения для переключения кластеров не очень удобно, а для переключения NS следовать команде -n namespace. С kubectx и kubens два гаджета могут обеспечить быстрое переключение. Эти два находятся в одном проекте:ahmetb/kubectx
# 安装
sudo git clone https://github.com/ahmetb/kubectx /opt/kubectx
sudo ln -s /opt/kubectx/kubectx /usr/local/bin/kubectx
sudo ln -s /opt/kubectx/kubens /usr/local/bin/kubens
# 使用kubectx
# kubectx : 列出所有上下文
# kubectx <NAME> : 切换到某个上下文
$ kubectx minikube
Switched to context "minikube".
# kubectx - : 切换回上一个上下文
$ kubectx -
Switched to context "oregon".
# kubectx <NEW_NAME>=<NAME> : 重命名一个集群上下文
$ kubectx dublin=gke_ahmetb_europe-west1-b_dublin
Context "dublin" set.
Aliased "gke_ahmetb_europe-west1-b_dublin" as "dublin".
# kubectx <NEW_NAME>=. : 重命名当前上下文
# kubectx -d <NAME> : 删除上下文
# 使用kubens
# kubens : 列出所有的NS
# kubens <NS-NAME> : 切换当前NS
$ kubens kube-system
Context "test" set.
Active namespace is "kube-system".
# kubens - : 切换回上一个NS
$ kubens -
Context "test" set.
Active namespace is "default".
Концепцию конфигурации и контекст многокластерной коммутации см.официальная документация, на китайском языке.
- kubectl shell
kubectl уже имеет относительно зрелую специализированную оболочку, которая оптимизирует такие функции, как автозаполнение и нечеткое сопоставление:
Но в процессе фактического использования иногда возникают различные небольшие проблемы. Рекомендуются два популярных, вы можете попробовать их, если они вам нужны:
kube-promptПодробное объяснение общих команд
Приведенная выше обзорная диаграмма очень обширна.Для удобства общие подкоманды Kubectl условно разделены на следующие категории:
грамматика
$ kubectl [command] [TYPE] [NAME] [flags]
команда: подкоманда
ТИП: тип ресурса
ИМЯ: имя ресурса
флаги: параметры команды
команда помощь
Справка по команде kubectl очень подробная,
ресурсный объект
После большинства подкоманд kubectl вы можете указать объект ресурса, которым нужно управлять.
глобальные параметры
--cluster='': 指定命令操作对象的集群
--context='': 指定命令操作对象的上下文
-n, --namespace='': 指定命令操作对象的Namespace
поле ресурса
# Usage:
kubectl explain RESOURCE [options]
# Examples:
$ kubectl explain deployment.spec.selector
KIND: Deployment
VERSION: extensions/v1beta1
RESOURCE: selector <Object>
DESCRIPTION:
Label selector for pods. Existing ReplicaSets whose pods are selected by
this will be the ones affected by this deployment.
A label selector is a label query over a set of resources. The result of
matchLabels and matchExpressions are ANDed. An empty label selector matches
all objects. A null label selector matches no objects.
FIELDS:
matchExpressions <[]Object>
matchExpressions is a list of label selector requirements. The requirements
are ANDed.
matchLabels <map[string]string>
matchLabels is a map of {key,value} pairs. A single {key,value} in the
matchLabels map is equivalent to an element of matchExpressions, whose key
field is "key", the operator is "In", and the values array contains only
"value". The requirements are ANDed.
Декларативное управление объектами ресурсов
Декларативное управление ресурсами кластера — одна из важнейших функций Kubernetes, и команда kubectl apply лучше всего отражает эту функцию. У команды применения есть два основных параметра:
# Usage:
kubectl apply (-f FILENAME | -k DIRECTORY) [options]
параметр -f, за которым следует yaml илиjsonФайл конфигурации ресурса в формате, за параметром -k следует расположение файла конфигурации kustomization.yaml.
Почему вы говорите, что применение — это декларативное управление, потому что все добавления и изменения в кластере можно выполнить с помощью команды применения, и все зависит от файла конфигурации:
- Если ресурс в файле конфигурации не существует в кластере, создайте этот ресурс.
- Если ресурс в файле конфигурации уже существует в кластере, поле ресурса обновляется в соответствии с конфигурацией.
Например:
# 部署一个goweb应用,配置pod数为4个:
[root@master-1 ~]# grep replicas deployment-goweb.yaml
replicas: 4
# 使用 apply 创建资源
[root@master-1 ~]# kubectl apply -f deployment-goweb.yaml
deployment.apps/goweb created
[root@master-1 ~]# kubectl get po
NAME READY STATUS RESTARTS AGE
goweb-6b5d559869-4x5mb 1/1 Running 0 14s
goweb-6b5d559869-77lbz 1/1 Running 0 14s
goweb-6b5d559869-9ztkh 1/1 Running 0 14s
goweb-6b5d559869-ccjtp 1/1 Running 0 14s
# 修改pod数量为2个:
[root@master-1 ~]# sed -ri 's/4$/2/g' deployment-goweb.yaml
[root@master-1 ~]# grep replicas deployment-goweb.yaml
replicas: 2
# 使用apply更新资源
[root@master-1 ~]# kubectl apply -f deployment-goweb.yaml
deployment.apps/goweb configured
[root@master-1 ~]# kubectl get po
NAME READY STATUS RESTARTS AGE
goweb-6b5d559869-4x5mb 1/1 Running 0 8m21s
goweb-6b5d559869-77lbz 1/1 Running 0 8m21s
# pod数已更新为2个
Как видите, тот же
Проще говоря, функция команды применения состоит в том, чтобы заставить фактическое состояние кластера измениться на желаемое состояние, объявленное пользователем, и пользователю не нужно заботиться о конкретных операциях добавления, удаления и модификации для достижения этого желаемого состояния. , то есть декларативными ресурсами Kubernetes.
Императивное управление объектами ресурсов
Класс императивного управления заключается в выполнении операций добавления, удаления и изменения непосредственно с помощью команд.В дополнение к удалению ресурсов следующие команды можно заменить на команду apply.Кубернетес также рекомендует как можно чаще использовать команду применения.
Создать ресурс
kubectl create deployment my-dep --image=busybox # 创建一个deplpyme
kubectl expose rc nginx --port=80 --target-port=8000 # 创建一个svc,暴露 nginx 这个rc
Обновление ресурсов
kubectl scale --replicas=3 -f foo.yaml # 将foo.yaml中描述的对象扩展为3个
kubectl annotate pods foo description='my frontend' # 增加description='my frontend'备注,已有保留不覆盖
kubectl label --overwrite pods foo status=unhealthy # 增加status=unhealthy 标签,已有则覆盖
удалить ресурс
kubectl delete -f xxx.yaml # 删除一个配置文件对应的资源对象
kubectl delete pod,service baz foo # 删除名字为baz或foo的pod和service
kubectl delete pods,services -l name=myLabel # -l 参数可以删除包含指定label的资源对象
kubectl delete pod foo --grace-period=0 --force # 强制删除一个pod,在各种原因pod一直terminate不掉的时候很有用
Просмотр статуса ресурса
get
Наиболее часто используемая команда просмотра, которая отображает подробную информацию об одном или нескольких ресурсах.
# Usage:
kubectl get
[(-o|--output=)](TYPE[.VERSION][.GROUP] [NAME | -l label] | TYPE[.VERSION][.GROUP]/NAME ...) [flags]
[options]
# Examples:
kubectl get services # 列出当前NS中所有service资源
kubectl get pods --all-namespaces # 列出集群所有NS中所有的Pod
kubectl get pods -o wide # -o wide也比较常用,可以显示更多资源信息,比如pod的IP等
kubectl get deployment my-dep # 可以直接指定资源名查看
kubectl get deployment my-dep --watch # --watch 参数可以监控资源的状态,在状态变换时输出。在跟踪服务部署情况时很有用
kubectl get pod my-pod -o yaml # 查看yaml格式的资源配置,这里包括资实际的status,可以用--export排除
kubectl get pod my-pod -l app=nginx # 查看所有带有标签app: nginx的pod
kubectl может использовать JSONPATH для фильтрации полей, синтаксис JSON Path может относиться кздесь
kubectl get pods --selector=app=cassandra rc -o jsonpath='{.items[*].metadata.labels.version}' # 获取所有具有 app=cassandra 的 pod 中的 version 标签
describe
Команда description также используется для просмотра информации о ресурсах, но по сравнению с get, которая выводит только информацию о самом ресурсе, описывает агрегаты и выводит информацию о связанных ресурсах. Например, при описании информации об узле также выводится использование ресурсов модулями под узлом. Таким образом, команда описать очень полезна для отладки и отладки.
# Usage:
kubectl describe (-f FILENAME | TYPE [NAME_PREFIX | -l label] | TYPE/NAME) [options]
# Examples:
kubectl describe nodes my-node # 查看节点my-node的详细信息
kubectl describe pods my-pod # 查看pod my-pod的详细信息
управление контейнерами
Хотя логически самой маленькой единицей управления Kubernetes является Pod, но на самом деле неизбежно непосредственное взаимодействие с контейнером, особенно для Pod с несколькими контейнерами, если у какого-либо контейнера возникнут проблемы, Pod станет недоступен.
просмотр журнала
# Usage:
kubectl logs [-f] [-p] (POD | TYPE/NAME) [-c CONTAINER] [options]
# Examples:
kubectl logs my-pod
# 输出一个单容器pod my-pod的日志到标准输出
kubectl logs nginx-78f5d695bd-czm8z -c nginx
# 输出多容器pod中的某个nginx容器的日志
kubectl logs -l app=nginx
# 输出所有包含app-nginx标签的pod日志
kubectl logs -f my-pod
# 加上-f参数跟踪日志,类似tail -f
kubectl logs my-pod -p
# 输出该pod的上一个退出的容器实例日志。在pod容器异常退出时很有用
kubectl logs my-pod --since-time=2018-11-01T15:00:00Z
# 指定时间戳输出日志
kubectl logs my-pod --since=1h
# 指定时间段输出日志,单位s/m/h
Выполнение заказа
Командные функции и параметры в основном такие же, как у docker exec.
# Usage:
kubectl exec POD [-c CONTAINER] -- COMMAND [args...] [options]
# Examples:
kubectl exec my-pod ls # 对my-pod执行ls命令
kubectl exec -t -i nginx-78f5d695bd-czm8z bash # 进入pod的shell,并打开伪终端和标准输入
передача файлов
При отладке и тестировании сервисов необходимо время от времени взаимодействовать с контейнером, например передавать дамп памяти контейнера на хост или временно копировать новый файл конфигурации с хоста для отладки. можно использовать команду *kubectl cp. Следует отметить, что команда cp требует, чтобы в контейнере была установлена программа tar.
# Usage:
kubectl cp <file-spec-src> <file-spec-dest> [options]
# Examples:
kubectl cp /tmp/foo_dir <some-pod>:/tmp/bar_dir # 拷贝宿主机本地文件夹到pod
kubectl cp <some-namespace>/<some-pod>:/tmp/foo /tmp/bar # 指定namespace的拷贝pod文件到宿主机本地目录
kubectl cp /tmp/foo <some-pod>:/tmp/bar -c <specific-container> # 对于多容器pod,用-c指定容器名
Управление кластером
Помимо работы с конкретными ресурсами, при обслуживании кластера часто необходимо просматривать информацию о кластере и управлять узлами.Существуют следующие общие команды для управления кластером:
Просмотр информации о кластере
kubectl cluster-info # 查看master和集群服务的地址
kubectl cluster-info dump # 查看集群详细日志
kubectl version # 查看Kubernetes集群和客户端版本
Управление узлом
Когда возникает проблема с узлом кластера, вы можете удалить узел из расписания для модулей или удалить текущие модули узла.
kubectl cordon my-node
# 标记 my-node 为 unschedulable,禁止pod被调度过来。注意这时现有的pod还会继续运行,不会被驱逐。
kubectl uncordon my-node
# 与cordon相反,标记 my-node 为 允许调度。
kubectl drain my-node
# drain字面意思为排水,实际就是把my-node的pod平滑切换到其他node,同时标记pod为unschedulable,也就是包含了cordon命令。
# 但是直接使用命令一般不会成功,建议在要维护节点时,加上以下参数:
kubectl drain my-node --ignore-daemonsets --force --delete-local-data
# --ignore-daemonsets 忽略daemonset部署的pod
# --force 直接删除不由workload对象(Deployment、Job等)管理的pod
# --delete-local-data 直接删除挂载有本地目录(empty-dir方式)的pod
Способ перезапуска пода в k8s
Иметь последний файл yaml
kubectl replace --force -f xxxx.yaml
Файла yaml нет, но используется объект Deployment.
kubectl scale deployment esb-admin --replicas=0 -n {namespace}
kubectl scale deployment esb-admin --replicas=1 -n {namespace}
Поскольку объект Deployment — это не объект Pod, с которым непосредственно манипулируют, а объект ReplicaSet, с которым манипулируют, а объект ReplicaSet состоит из определения количества реплик и шаблона Pod. Таким образом, эта команда масштабирует количество наборов реплик до 0, а затем до 1, и модуль перезапускается.