5.1.5.2. Алиасы
Данный блок будет полезен с точки зрения оптимизации запросов на подключение. Рассмотрим несколько вариантов подключения к ETCD кластеру.
- (alias=cidsearch) Поиск ID контейнера
- (alias=cpidsearch) Поиск PID контейнера
- (alias=etcdctl) Прямое подключение
- (alias=ectl) Подключение через crictl
- (alias=nectl) Подключение через nsenter
- (alias=kectl) Подключение через kubelet
Просьба обратить внимание, что все команды кроме пункта 5.1.5.2.5 (Подключение через kubectl) выполняются на узлах, где размещается ETCD инстанс.
5.1.5.2.1. Поиск ID контейнера
Данный алиас поможет быстро найти ID контейнера по меткам
io.kubernetes.pod.name
иio.kubernetes.pod.namespace
cidsearch() {
crictl ps \
--label io.kubernetes.pod.name="$1" \
--label io.kubernetes.pod.namespace="$2" \
-o json | jq -r '.containers[].id'
}
5.1.5.2.2. Поиск PID контейнера
Данный алиас поможет быстро найти PID контейнера по меткам
io.kubernetes.container.name
иio.kubernetes.pod.namespace
cpidsearch() {
crictl inspect \
$(cidsearch "$1" "$2") | jq .info.pid
}
5.1.5.2.3. Прямое подключение
Прямое подключение подходит в ситуациях, когда мы знаем на каком узле находится ETCD инстанс, и сертификаты лежат в хостовой файловой системе.
Подключение
alias etcdctl='etcdctl \
--cert=/etc/kubernetes/pki/etcd/peer.crt \
--key=/etc/kubernetes/pki/etcd/peer.key \
--cacert=/etc/kubernetes/pki/etcd/ca.crt'
Список участников кластера
etcdctlMembers() {
etcdctl member list \
--write-out=json | jq \
-r '[.members[].clientURLs[]] | join(",")'
}
Актуальная ревизия
etcdctlRevision() {
etcdctl \
--endpoints=$(etcdctlMembers) \
endpoint status \
-w json | jq \
-r .[].Status.header.revision
}
Подключение
alias etcdctl='etcdctl \
--cert=/etc/kubernetes/pki/etcd/peer.crt \
--key=/etc/kubernetes/pki/etcd/peer.key \
--cacert=/etc/kubernetes/pki/etcd/ca.crt'
Уплотение
alias etcdctlCompaction='etcdctl \
--endpoints=$(etcdctlMembers) \
compaction $(etcdctlRevision)'
Дефрагментация
alias etcdctlDefrag='etcdctl \
--endpoints=$(etcdctlMembers) \
defrag'
5.1.5.2.4. Подключение через crictl
Подключение через контейнер нам подходит в ситуациях, когда приложение запущено в виде контейнера, и все данные примонти рованы внутрь контейнерной файловой системы.
Чтобы обеспечить правильную отправку запросов в нужный контейнер, укажите Namespace
и PodName
, с которыми хотите взаимодействовать.
export SEARCH_NAMESPACE=undefined
export SEARCH_POD_NAME=undefined
Просьба обратить на зависимость от alias=(cidsearch
, ectlflagsearch
) указанных ниже
Поиск ID контейнера
cidsearch() {
crictl ps \
--label io.kubernetes.pod.name="$1" \
--label io.kubernetes.pod.namespace="$2" \
-o json | jq -r '.containers[].id'
}
Флаги для подключения к etcdctl
alias функции, которая подставляет флаги с указанием PEER-сертификата, PEER-ключа , CA-сертификата ETCD кластера и ENDPOINT-а.
ectlflagsearch() {
ETCD_ARGS=$( \
crictl inspect $(cidsearch "$1" "$2") | jq -r \
'.info.runtimeSpec.process.args[]' ) ; \
echo -n \
'--cert='$(grep --\
'--peer-cert-file=' <<< $ETCD_ARGS | sed 's/[^=]*=//') \
'--key='$(grep --\
'--peer-key-file=' <<< $ETCD_ARGS | sed 's/[^=]*=//') \
'--cacert='$(grep --\
'--trusted-ca-file=' <<< $ETCD_ARGS | sed 's/[^=]*=//') \
'--endpoints='$(grep --\
'--advertise-client-urls=' <<< $ETCD_ARGS | sed 's/[^=]*=//')
}
Подключение
alias ectl='crictl exec \
-ti $(cidsearch ${SEARCH_POD_NAME} ${SEARCH_NAMESPACE}) \
etcdctl \
$(ectlflagsearch ${SEARCH_POD_NAME} ${SEARCH_NAMESPACE})'
Список участников кластера
ectlMembers() {
ectl member list \
--write-out=json | jq \
-r '[.members[].clientURLs[]] | join(",")'
}
Актуальная ревизия
ectlRevision() {
ectl \
endpoint status \
--cluster \
-w json | jq -r \
'[.[].Status.header.revision] | join(" ")'
}
Уплотение
alias ectlCompaction='ectl \
compaction $(ectlRevision) \
--cluster'
Дефрагментация
alias ectlDefrag='ectl \
defrag \
--cluster'
5.1.5.2.5. Подключение через nsenter
Для использования etcdctl, который находится внутри пространства имен процесса запущенного контейнера, необходимо сначала получить CONTAINER_ID. На основе этого идентификатора можно определит ь PID процесса. Далее создадим псевдоним nectl (чтобы избежать конфликтов с другими псевдонимами). При каждом вызове этого псевдонима будем обновлять данные о текущем контейнере и процессе. Также важно указать путь к сертификатам.
Просьба обратить на зависимость от alias=(cpidsearch
)
Чтобы обеспечить правильную отправку запросов в нужный контейнер, укажите Namespace
и PodName
, с которыми хотите взаимодействовать.
export SEARCH_NAMESPACE=undefined
export SEARCH_POD_NAME=undefined