#docker #kubernetes #http-proxy #corporate-policy
#docker #kubernetes #http-прокси #корпоративная политика
Вопрос:
У нас есть кластер из 5 узлов, который был перемещен за наш корпоративный брандмауэр / прокси-сервер.
Согласно приведенным здесь инструкциям: настройка-автономного-кластера kubernetes-за-корпоративным-прокси
Я установил переменные среды прокси-сервера, используя:
export http_proxy=http://proxy-host:proxy-port/
export HTTP_PROXY=$http_proxy
export https_proxy=$http_proxy
export HTTPS_PROXY=$http_proxy
printf -v lan '%s,' localip_of_machine
printf -v pool '%s,' 192.168.0.{1..253}
printf -v service '%s,' 10.96.0.{1..253}
export no_proxy="${lan%,},${service%,},${pool%,},127.0.0.1";
export NO_PROXY=$no_proxy
Теперь все в нашем кластере работает внутри. Однако, когда я пытаюсь создать модуль, который извлекает изображение извне, модуль зависает ContainerCreating
, например,
[gms@thalia0 ~]$ kubectl apply -f https://k8s.io/examples/admin/dns/busybox.yaml
pod/busybox created
застрял здесь:
[gms@thalia0 ~]$ kubectl get pods
NAME READY STATUS RESTARTS AGE
busybox 0/1 ContainerCreating 0 17m
Я предполагаю, что это связано с тем, что хост / домен, с которого извлекается изображение, не входит в наши корпоративные правила прокси. У нас есть правила для
k8s.io
kubernetes.io
docker.io
docker.com
итак, я не уверен, какие еще хосты / домены нужно добавить.
Я написал описание модулей для busybox и см. Ссылку на node.kubernetes.io
(я ввожу исключение для всего домена, для *.kubernetes.io
которого, надеюсь, будет достаточно).
Это то, что я получаю от kubectl describe pods busybox
:
Volumes:
default-token-2kfbw:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-2kfbw
Optional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 73s default-scheduler Successfully assigned default/busybox to thalia3.ahc.umn.edu
Warning FailedCreatePodSandBox 10s kubelet, thalia3.ahc.umn.edu Failed create pod sandbox: rpc error: code = Unknown desc = [failed to set up sandbox container "6af48c5dadf6937f9747943603a3951bfaf25fe1e714cb0b0cbd4ff2d59aa918" network for pod "busybox": NetworkPlugin cni failed to set up pod "busybox_default" network: error getting ClusterInformation: Get https://[10.96.0.1]:443/apis/crd.projectcalico.org/v1/clusterinformations/default: dial tcp 10.96.0.1:443: i/o timeout, failed to clean up sandbox container "6af48c5dadf6937f9747943603a3951bfaf25fe1e714cb0b0cbd4ff2d59aa918" network for pod "busybox": NetworkPlugin cni failed to teardown pod "busybox_default" network: error getting ClusterInformation: Get https://[10.96.0.1]:443/apis/crd.projectcalico.org/v1/clusterinformations/default: dial tcp 10.96.0.1:443: i/o timeout]
Normal SandboxChanged 10s kubelet, thalia3.ahc.umn.edu Pod sandbox changed, it will be killed and re-created.
Я бы предположил, что ошибка calico вызвана этим:
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute for 300s
У calico
и coredns
модулей, похоже, возникают похожие ошибки node.kubernetes.io
, поэтому я бы предположил, что это связано с тем, что наш сервер не может удалить новые образы при перезапуске.
Ответ №1:
Похоже, вы неправильно понимаете несколько концепций Kubernetes, которые я хотел бы прояснить здесь. Ссылки на node.kubernetes.io
не являются попыткой выполнить какие-либо сетевые вызовы к этому домену. Это просто соглашение, которое Kubernetes использует для указания строковых ключей. Поэтому, если вам когда-нибудь придется применять метки, аннотации или допуски, вы бы определили свои собственные ключи следующим образом subdomain.domain.tld/some-key
.
Что касается проблемы Calico, с которой вы столкнулись, она выглядит как ошибка:
network: error getting ClusterInformation: Get https://[10.96.0.1]:443/apis/crd.projectcalico.org/v1/clusterinformations/default: dial tcp 10.96.0.1:443: i/o timeout]
наш виновник здесь. 10.96.0.1
— это IP-адрес, используемый для ссылки на сервер API Kubernetes в pods. Похоже, что calico/node
модуль, запущенный на вашем узле, не может связаться с сервером API. Не могли бы вы подробнее рассказать о том, как вы настраиваете Calico? Знаете ли вы, какую версию Calico вы используете?
Тот факт, что ваш calico/node
экземпляр пытается получить доступ к crd.projectcalico.org/v1/clusterinformations
ресурсу, говорит мне о том, что он использует хранилище данных Kubernetes для своего серверной части. Вы уверены, что не пытаетесь запустить Calico в режиме Etcd?
Комментарии:
1. Спасибо за обзор. Да, я выяснил, что
node.kubernetes.io
это была внутренняя ссылка и что ошибка была связана с невозможностью установить связь с сервером api. Все работает в режиме по умолчанию. И виновником на самом деле было то, что docker не смог извлечь новые образы, а k8s не смог перестроить контейнеры для развертывания новых модулей.2. рад, что вы это поняли!
Ответ №2:
Похоже, у вас нет проблем с извлечением изображения, поскольку вы должны увидеть ImagePullBackOff
статус. (Хотя это может появиться позже после сообщения об ошибке, которое вы видите)
Ошибка, которую вы видите в своих модулях, связана с тем, что они не могут подключиться к серверу kube-apis внутренне. Похоже на тайм-аут, поэтому, скорее всего, что-то с kubernetes
сервисом в вашем пространстве имен по умолчанию. Вы можете проверить это, например, так:
$ kubectl -n default get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2d20h
Может быть, это отсутствует (?) Вы всегда можете создать его заново:
$ cat <<'EOF' | kubectl apply -f -
apiVersion: v1
kind: Service
metadata:
labels:
component: apiserver
provider: kubernetes
name: kubernetes
namespace: default
spec:
clusterIP: 10.96.0.1
type: ClusterIP
ports:
- name: https
port: 443
protocol: TCP
targetPort: 443
EOF
Допуск в основном означает, что модуль может быть запланирован на узле, который имеет node.kubernetes.io/not-ready:NoExecute
и node.kubernetes.io/unreachable:NoExecute
недостатки, но ваша ошибка, похоже, не связана с этим.
Комментарии:
1. Я думаю, это могло быть из-за того, что не были настроены правила прокси на не-главных узлах, а затем перезапущены docker и kubelet, но я был разочарован и просто разобрал и перестроил кластер, и теперь все полностью функционально. Когда я впервые отключил его и перестроил узлы, я не смог извлечь изображения, но после добавления правил прокси и перезапуска всего все было в порядке. Интересная гипотеза, которую вы выдвинули. Не собираюсь тестировать это, поскольку все работает.
Ответ №3:
Проблема обычно означает, что демон docker не может ответить.
Эта проблема может возникнуть, если какая-либо другая служба потребляет больше ресурсов процессора или ввода-вывода.
Комментарии:
1. Да, смотрите мой комментарий выше. Я разобрался с проблемой. Прокси не был настроен для рабочих узлов и, следовательно, они не могли извлекать изображения.