Создание контейнера в Kubernetes застревает при создании контейнера (ContainerCreating) с фланелью - PullRequest
0 голосов
/ 04 февраля 2020

Контекст

Я установил Docker, следуя этой инструкции на моем Ubuntu 18.04 LTS (Server), а затем Kubernetes с последующим kubeadm. После инициализации (kubeadm init --pod-network-cidr=10.10.10.10/24) и присоединения ко второму узлу (для начала я получил кластер из двух узлов) я не могу получить coredns , а также примененный позднее Web UI (Dashboard) на самом деле go в статус Работает .

В качестве под-сети я пробовал оба, Фланель (kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/2140ac876ef134e0ed5af15c65e414cf26827915/Documentation/kube-flannel.yml) и Плетение Net - ничего не изменилось. Он по-прежнему показывает статус Создание контейнера , даже после нескольких часов ожидания:

enter image description here

Вопрос

Почему создание контейнера не работает должным образом и что может быть причиной root? И самое главное: как мне решить эту проблему?

Редактировать

Подводя итог моему ответу ниже, вот причины:

  • Docker используется cgroups вместо systemd
  • Я не настроил iptables правильно
  • Я использовал неправильный kubeadm init, поскольку фланели standard-yaml требуется --pod-network-cidr чтобы быть 10.244.0.0/16

1 Ответ

1 голос
/ 04 февраля 2020

Так как ответы на эти вопросы заняли у меня много времени, я хотел поделиться тем, что вытащило меня из этого. Там может быть немного больше кода, чем необходимо, но я также хочу, чтобы это было в одном месте, если я или кто-то еще должен повторить все шаги.



Сначала все началось с Docker ...

Я выяснил, что, вероятно, все началось с того, как я установил Docker. Следуя связанным онлайн-инструкциям, я использовал sudo apt-get install docker.io, чтобы установить Docker, и использовал его с cgroups, выполнив sudo usermod -aG docker $USER.

Что ж, взглянем на официальные инструкции от Kubernetes это была ошибка: systemd - рекомендуемый путь к go!

Так что я полностью очистил все, что когда-либо делал с docker, выполнив эти замечательные инструкции от Mayur Bhandare:

sudo apt-get purge -y docker-engine docker docker.io docker-ce  
sudo apt-get autoremove -y --purge docker-engine docker docker.io docker-ce  
sudo rm -rf /var/lib/docker /etc/docker
sudo rm /etc/apparmor.d/docker
sudo groupdel docker
sudo rm -rf /var/run/docker.sock

# Reboot to be sure

После этого я установил переустановленный официальным способом (имейте в виду, что это может измениться в будущем):

# Install Docker CE
## Set up the repository:
### Install packages to allow apt to use a repository over HTTPS
apt-get update && apt-get install -y \
  apt-transport-https ca-certificates curl software-properties-common gnupg2

### Add Docker’s official GPG key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -

### Add Docker apt repository.
add-apt-repository \
  "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) \
  stable"

## Install Docker CE.
apt-get update && apt-get install -y \
  containerd.io=1.2.10-3 \
  docker-ce=5:19.03.4~3-0~ubuntu-$(lsb_release -cs) \
  docker-ce-cli=5:19.03.4~3-0~ubuntu-$(lsb_release -cs)

# Setup daemon.
cat > /etc/docker/daemon.json <<EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF

mkdir -p /etc/systemd/system/docker.service.d

# Restart docker.
systemctl daemon-reload
systemctl restart docker

Обратите внимание, что здесь явно используется systemd!



... и затем это продолжалось с фланелем ...

Выше я писал, что sudo kubeadm init было сделано с --pod-network-cidr=10.10.10.10/24, так как последний был IP моего хозяина. Что ж, как указано здесь без использования рекомендованного официального рекомендованного --pod-network-cidr=10.244.0.0/16 приводит к ошибке , например, при использовании kubectl proxy или создании контейнера при использовании при условии kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/2140ac876ef134e0ed5af15c65e414cf26827915/Documentation/kube-flannel.yml. Это связано с тем, что 10.244.0.0/16 жестко связан в .yaml и, следовательно, обязателен - или вы просто меняете его в .yaml.

, чтобы избавиться от ложного Конфигурацию я сделал полный сброс. Это может быть достигнуто с помощью sudo kubeadm reset и удалением конфигурации с помощью sudo rm -r ~/.kube/config. Как бы то ни было, поскольку я так сильно его прикрутил, я сделал полный сброс, удалив и переустановив kubeadm и убедившись, что на этот раз он использовал iptables (что я тоже забыл сделать раньше ...).

Здесь - это хорошая ссылка, как полностью удалить все kubeadm-части.

kubeadm reset
sudo apt-get purge kubeadm kubectl kubelet kubernetes-cni kube*   
sudo apt-get autoremove  
sudo rm -rf ~/.kube

Для полноты картины также переустановите:

# ensure legacy binaries are installed
sudo apt-get install -y iptables arptables ebtables

# switch to legacy versions
sudo update-alternatives --set iptables /usr/sbin/iptables-legacy
sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
sudo update-alternatives --set arptables /usr/sbin/arptables-legacy
sudo update-alternatives --set ebtables /usr/sbin/ebtables-legacy

# Install Kubernetes with kubeadm
sudo apt-get update && sudo apt-get install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

#reboot



... и наконец все заработало!

После чистой переустановки я сделал следующее:

# Initialize with correct cidr
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/2140ac876ef134e0ed5af15c65e414cf26827915/Documentation/kube-flannel.yml

И затем удивляйтесь результату:

kubectl get pods --all-namespaces

enter image description here

На сайте Примечание: это также решило /run/flannel/subnet.env: no such file or directory - ошибка, с которой я столкнулся до этих шагов при описании несотворенной сердцевины.

...