Kubeadm: Dokumentasikan cara dan sediakan skrip untuk menjalankan kubeadm dalam sebuah wadah

Dibuat pada 22 Nov 2016  ·  55Komentar  ·  Sumber: kubernetes/kubeadm

_Dari @andersla pada 27 Oktober 2016 18:8_

Saat mencoba menginstal Kubeadm di dalam wadah buruh pelabuhan Ubuntu 16.04 gagal.

LAPORAN BUG

Versi Kubernetes (gunakan kubectl version ):
terbaru

Lingkungan :
Wadah Docker Ubuntu 16.04

Apa yang terjadi :
Saat mencoba menginstal Kubeadm di dalam wadah buruh pelabuhan Ubuntu 16.04 gagal.
Ide saya adalah menggunakan satu wadah buruh pelabuhan sebagai "simpul" master dan wadah kedua sebagai "simpul" pekerja (kubernetes di buruh pelabuhan)
Apakah ini masalah systemd? (sesuatu yang saya temukan ketika "googling" untuk mendapatkan jawaban)

Di dalam gambar buruh pelabuhan Ubuntu 16.04 saya instal dengan: apt-get install -y kubeadm

catatan pengaturan:

...
...
...
all: Setting up socat (1.7.3.1-1) ...
    all: Setting up kubelet (1.4.3-00) ...
    all: /var/lib/dpkg/info/kubelet.postinst: 38: /var/lib/dpkg/info/kubelet.postinst: [[: not found
    all: Setting up kubectl (1.4.3-00) ...
    all: Setting up kubeadm (1.5.0-alpha.0-1534-gcf7301f-00) ...
    all: Failed to connect to bus: No such file or directory
    **all: dpkg: error processing package kubeadm (--configure):**
    all: subprocess installed post-installation script returned error exit status 1
    all: Setting up netcat-traditional (1.10-41) ...
    all: update-alternatives: using /bin/nc.traditional to provide /bin/nc (nc) in auto mode
    all: Setting up netcat (1.10-41) ...
    all: Setting up patch (2.7.5-1) ...
    all: Setting up rename (0.20-4) ...
    all: update-alternatives: using /usr/bin/file-rename to provide /usr/bin/rename (rename) in auto mode
    all: Setting up tcpd (7.6.q-25) ...
    all: Setting up ubuntu-fan (0.9.1) ...
    all: invoke-rc.d: could not determine current runlevel
    all: invoke-rc.d: policy-rc.d denied execution of start.
    all: Setting up xz-utils (5.1.1alpha+20120614-2ubuntu2) ...
    all: update-alternatives: using /usr/bin/xz to provide /usr/bin/lzma (lzma) in auto mode
    all: Setting up python3 (3.5.1-3) ...
    all: running python rtupdate hooks for python3.5...
    all: running python post-rtupdate hooks for python3.5...
    all: Setting up apparmor (2.10.95-0ubuntu2.2) ...
    all: update-rc.d: warning: start and stop actions are no longer supported; falling back to defaults
    all: Setting up dh-python (2.20151103ubuntu1.1) ...
    all: Processing triggers for libc-bin (2.23-0ubuntu4) ...
    all: Processing triggers for systemd (229-4ubuntu11) ...
    all: Processing triggers for initramfs-tools (0.122ubuntu8.5) ...
    all: Processing triggers for dbus (1.10.6-1ubuntu3) ...
    all: Errors were encountered while processing:
    all: kubeadm
    all: E: Sub-process /usr/bin/dpkg returned an error code (1)
==> all: Killing the container: 93babb5045461c343a803109ba683a2acf68f1f453447a336b09171a1b190f38
Build 'all' errored: Script exited with non-zero exit status: 100

==> Some builds didn't complete successfully and had errors:
--> all: Script exited with non-zero exit status: 100

_Disalin dari edisi asli: kubernetes/kubernetes#35712_

aretesting documentatiocontent-gap kinsupport prioritbacklog

Komentar yang paling membantu

Jadi jika Anda menggunakan Flanel, maka semuanya berfungsi, berikut adalah pengaturan lengkapnya:

File Docker:

FROM ubuntu:xenial-20161213

ARG DEBIAN_FRONTEND=noninteractive

RUN apt-get update -qq

RUN apt-get install -y \
    apt-transport-https \
    apt-utils \
    ca-certificates \
    curl \
    dialog \
    python \
    daemon \
    vim \
    jq

# remove unwanted systemd services
RUN for i in /lib/systemd/system/sysinit.target.wants/*; do [ "${i##*/}" = "systemd-tmpfiles-setup.service" ] || rm -f "$i"; done; \
  rm -f /lib/systemd/system/multi-user.target.wants/*;\
  rm -f /etc/systemd/system/*.wants/*;\
  rm -f /lib/systemd/system/local-fs.target.wants/*; \
  rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
  rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
  rm -f /lib/systemd/system/basic.target.wants/*;\
  rm -f /lib/systemd/system/anaconda.target.wants/*;

# install docker (after removing unwanted systemd)
RUN apt-get install -y \
    docker.io

RUN echo "Add Kubernetes repo..."
RUN sh -c 'curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -'
RUN sh -c 'echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" > /etc/apt/sources.list.d/kubernetes.list'

RUN echo "Installing Kubernetes requirements..."
RUN apt-get update -y && apt-get install -y \
  kubelet \
  kubernetes-cni \
  kubectl

RUN echo "Installing Kubeadm - this will fail at post-install but that doesn't matter"
RUN apt-get install -y \
  kubeadm; exit 0

# Create volume for docker
VOLUME /var/lib/docker

Bangun dengan:
docker build -t kubeadm_docker .

Dan kemudian jalankan:
docker run -it --privileged=true --name=master -h master -d --security-opt seccomp:unconfined --cap-add=SYS_ADMIN -v /sys/fs/cgroup:/sys/fs/cgroup:ro kubeadm_docker /sbin/init

Tunggu beberapa (10-15) detik hingga systemd dan docker aktif dan berjalan

Lalu saya memulai kubeadm di dalam wadah yang sedang berjalan:
docker exec -it master kubeadm init --skip-preflight-checks --token=acbec6.2852dff7cb569aa0

Ketika dimulai, saya memulai simpul "pekerja" kedua:
docker run -it --privileged=true --name=node -h node -d --security-opt seccomp:unconfined --cap-add=SYS_ADMIN -v /sys/fs/cgroup:/sys/fs/cgroup:ro kubeadm_docker /sbin/init

Dan setelah beberapa detik (sampai systemd dan docker aktif) bergabunglah dengan master:
docker exec -it node kubeadm join --skip-preflight-checks --token=acbec6.2852dff7cb569aa0 172.17.0.2

Ketika mereka telah bergabung, - masukkan master dan terapkan solusi untuk crash kube-proxy:
docker exec -it master bash

kubectl -n kube-system get ds -l 'component=kube-proxy' -o json | jq '.items[0].spec.template.spec.containers[0].command |= .+ ["--conntrack-max-per-core=0"]' | kubectl apply -f - && kubectl -n kube-system delete pods -l 'component=kube-proxy'

Terakhir terapkan jaringan overlay flanel:
curl -sSL "https://github.com/coreos/flannel/blob/master/Documentation/kube-flannel.yml?raw=true" | kubectl create -f -

Saya tidak punya masalah menginstal Helm, Traefic atau GlusterFS di Kubernetes dalam pengaturan ini :)

Semua 55 komentar

_Dari @luxas pada 27 Oktober 2016 18:14_

cc @errordeveloper dan @marun karena mereka menjalankan systemd di dalam wadah

@andersla Berhati-hatilah bahwa menjalankan systemd dengan cara ini di dalam wadah tidak didukung ootb, tetapi jangan ragu untuk mencobanya / retas kami karena akan sangat bagus untuk menguji kubeadm seperti itu

_Dari @zreigz pada 28 Oktober 2016 7:36_

Jika Anda tidak keberatan, saya ingin melihat lebih dekat dan mencoba memperbaikinya.

_Dari @andersla pada 28 Oktober 2016 8:48_

@zreigz Tolong lakukan!
Ini adalah bagaimana saya mencoba menginstalnya:

docker run -it --privileged ubuntu /bin/bash

Lalu:

echo "Updating Ubuntu..."
apt-get update -y
apt-get upgrade -y

echo "Install os requirements"
apt-get install -y \
  curl \
  apt-transport-https \
  dialog \
  python \
  daemon

echo "Add Kubernetes repo..."
sh -c 'curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -'
sh -c 'echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" > /etc/apt/sources.list.d/kubernetes.list'
apt-get update -y

echo "Installing Kubernetes requirements..."
apt-get install -y \
  docker.io \
  kubelet \
  kubernetes-cni \
  kubectl \
  kubeadm

Dan ini adalah kesalahan yang saya dapatkan ketika kubeadm sedang diinstal:

root<strong i="16">@82f5321d45cb</strong>:/# apt-get install kubeadm
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following NEW packages will be installed:
  kubeadm
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 7981 kB of archives.
After this operation, 59.2 MB of additional disk space will be used.
Get:1 https://packages.cloud.google.com/apt kubernetes-xenial/main amd64 kubeadm amd64 1.5.0-alpha.0-1534-gcf7301f-00 [7981 kB]
Fetched 7981 kB in 0s (8532 kB/s)
Selecting previously unselected package kubeadm.
(Reading database ... 14222 files and directories currently installed.)
Preparing to unpack .../kubeadm_1.5.0-alpha.0-1534-gcf7301f-00_amd64.deb ...
Unpacking kubeadm (1.5.0-alpha.0-1534-gcf7301f-00) ...
Setting up kubeadm (1.5.0-alpha.0-1534-gcf7301f-00) ...
Failed to connect to bus: No such file or directory
dpkg: error processing package kubeadm (--configure):
 subprocess installed post-installation script returned error exit status 1
Errors were encountered while processing:
 kubeadm
E: Sub-process /usr/bin/dpkg returned an error code (1)

_Dari @zreigz pada 28 Oktober 2016 9:10_

Saya mereproduksinya dan saya telah mengerjakan ini

_Dari @zreigz pada 31 Oktober 2016 7:24_

Ada dua masalah.

Yang pertama: ll: /var/lib/dpkg/info/kubelet.postinst: 38: /var/lib/dpkg/info/kubelet.postinst: [[: not found
Pada sistem Ubuntu, /bin/sh adalah tanda hubung, bukan bash, dan tanda hubung tidak mendukung kata kunci braket ganda. Untung masalahnya sudah diperbaiki di cabang master dan akan segera tersedia: https://github.com/kubernetes/release/blob/master/debian/xenial/kubelet/debian/postinst#L40

Yang kedua tidak begitu sepele. Menjalankan systemctl dalam wadah gagal dengan Failed to get D-Bus connection . Sepertinya systemd tidak berfungsi dengan baik dalam wadah. Sekarang saya sedang mengerjakan ini

_Dari @andersla pada 31 Oktober 2016 7:42_

Besar!
Saya hanya tidak mengerti mengapa instalasi kubeadm membutuhkan systemd/systemctl sama sekali?

_Dari @zreigz pada 31 Oktober 2016 7:47_

Karena dua baris itu: https://github.com/kubernetes/release/blob/master/debian/xenial/kubeadm/debian/postinst#L25

systemctl daemon-reload
systemctl restart kubelet

Gagal di baris pertama

_Dari @zreigz pada 31 Oktober 2016 7:48_

ini penjelasannya :

# because kubeadm package adds kubelet drop-ins, we must daemon-reload
# and restart kubelet now. restarting kubelet is ok because kubelet
# postinst configure step auto-starts it.

_Dari @zreigz pada 31 Oktober 2016 7:52_

Ada beberapa langkah konfigurasi untuk membuatnya bekerja tetapi saya harus mencobanya terlebih dahulu. Jika saya menemukan sesuatu, saya akan memberi tahu Anda.

_Dari @zreigz pada 2 November 2016 7:19_

Kabar baik. Saya telah berhasil menyelesaikan semua masalah. Perlu tes terakhir dan saya akan memposting solusi cara menjalankan kubeadm di wadah Docker

_Dari @andersla pada 2 November 2016 7:23_

Super! Saya akan membantu pengujian segera setelah siap! - meskipun saya pada hari libur sisa minggu ini :)

_Dari @zreigz pada 2 November 2016 10:13_

Ada dua masalah utama terkait dengan pemasangan kubeadm di wadah Docker. Pertama adalah systemd berjalan dalam wadah. Kedua adalah instalasi buruh pelabuhan di dalam wadah. Berhasil masalah telah diperbaiki. Ini Dockerfile yang harus digunakan untuk menyiapkan image Ubuntu

FROM ubuntu
ENV container docker
RUN apt-get -y update

RUN apt-get update -qq && apt-get install -qqy \
    apt-transport-https \
    ca-certificates \
    curl \
    lxc \
    vim \
    iptables

RUN curl -sSL https://get.docker.com/ | sh

RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f /lib/systemd/system/multi-user.target.wants/*;\
rm -f /etc/systemd/system/*.wants/*;\
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*;

VOLUME /sys/fs/cgroup
VOLUME /var/run/docker.sock
CMD /sbin/init

Saya menggunakan perintah ini untuk membangun gambar di direktori yang berisi Dockerfile

docker build -t kubeadm_docker .

Sekarang Anda dapat menjalankan gambar yang sudah disiapkan dan menyelesaikan instalasi kubeadm.
Gunakan perintah berikut untuk menjalankan gambar kubeadm_docker :

docker run -it -e "container=docker" --privileged=true -d --security-opt seccomp:unconfined --cap-add=SYS_ADMIN -v /sys/fs/cgroup:/sys/fs/cgroup:ro -v /var/run/docker.sock:/var/run/docker.sock  kubeadm_docker /sbin/init

Temukan ID penampung yang sedang berjalan

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
7dd73057620d        kubeadm_docker      "/sbin/init"        About an hour ago   Up About an hour                        furious_fermi

Sekarang Anda dapat membuka konsol kontainer:

docker exec -it 7dd73057620d /bin/bash

Ini adalah skrip Anda (dengan sedikit modifikasi) untuk menginstal kubeadm

echo "Updating Ubuntu..."
apt-get update -y
apt-get upgrade -y

systemctl start docker

echo "Install os requirements"
apt-get install -y \
  curl \
  apt-transport-https \
  dialog \
  python \
  daemon

echo "Add Kubernetes repo..."
sh -c 'curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -'
sh -c 'echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" > /etc/apt/sources.list.d/kubernetes.list'
apt-get update -y

echo "Installing Kubernetes requirements..."
apt-get install -y \
  kubelet

# This is temporary fix until new version will be released
sed -i 38,40d /var/lib/dpkg/info/kubelet.postinst

apt-get install -y \
  kubernetes-cni \
  kubectl \
  kubeadm

Dan akhirnya Anda bisa mengeksekusi

# kubeadm init

Semuanya bekerja sama seperti pada mesin lokal.
Semoga beruntung :)

_Dari @SuperStevenZ pada 17 November 2016 7:21_

@zreigz Itu memecahkan masalah saya yang sama, terima kasih!

_Dari @zreigz pada 17 November 2016 7:30_

Tidak masalah :)

Kita harus menyiapkan CI dengan barang-barang buruh pelabuhan.

@errordeveloper @zreigz Bisakah Anda menerima ini?
Setidaknya kita harus mendokumentasikan di suatu tempat bagaimana menjalankan kubeadm di dalam sebuah wadah...

Terdengar baik untukku. Yang pasti kita perlu meletakkan semua ini di gambar buruh pelabuhan ditambah beberapa skrip config/start untuk membedakan antara master dan node.js. Awal yang baik adalah membuat proyek untuknya seperti kubernetes/kubeadm-docker. Itu juga akan menjadi tempat yang tepat untuk Dockerfile, skrip, dan dokumentasi

Buat itu sebagai proyek pribadi terlebih dahulu di bawah zreigz/ dan akhirnya kami mungkin akan menggabungkan kode itu ke dalam repo ini.

Tapi pertama-tama, prototipe di ruang Anda sendiri dan kita akan lihat bagaimana kelanjutannya.

Penerima tugas sebenarnya adalah @zreigz

Ya poin bagus. Saya akan lakukan. Minggu depan (Senin, Selasa) saya di konferensi jadi saya akan mulai pada hari Rabu.

@luxas Saya bertanya-tanya bagaimana saya harus menyediakan paket kubeadm dan kubernetes-cni. Jika saya harus membuatnya dari sumber saat ini (untuk dapat menguji implementasi terbaru) atau hanya mengunduh versi terbaru dari repositori? Untuk tujuan CI, saya kira kita harus memiliki status kode saat ini untuk dapat mengujinya, atau hanya kita memerlukannya untuk menguji versi rilis?

Hai terima kasih atas perbaikannya tetapi masih mendapatkan masalah setelah kubeadm init saya mendapatkan 0/3 pada DNS, DNS sepertinya tidak berjalan sama sekali

Setiap 2.0s: kubectl get pod --all-namespaces Jum 16 Des 17:00:50 2016

NAMESPACE NAMA SIAP STATUS RESTART USIA
kube-system dummy-2088944543-17sey 1/1 Lari 0 11m
kube-system etcd-8dd8c92c6c38 1/1 Berjalan 2 12m
kube-system kube-apiserver-8dd8c92c6c38 1/1 Menjalankan 4 12m
kube-system kube-controller-manager-8dd8c92c6c38 1/1 Berjalan 2 11m
kube-system kube-discovery-1150918428-m506w 1/1 Berjalan 0 11m
kube-system kube-dns-654381707-vuijm 0/3 Pembuatan Kontainer 0 11m
kube-system kube-proxy-tuw6u 0/1 CrashLoopBackOff 6 11m
kube-system kube-scheduler-8dd8c92c6c38 1/1 Berjalan 2 10m

mencoba menginstal kebijakan jaringan
root@8dd8c92c6c38 :/# kubectl apply -f calico.yaml
jalur "calico.yaml" tidak ada
root@8dd8c92c6c38 :/# kubectl create -f calico.yaml
jalur "calico.yaml" tidak ada
root@8dd8c92c6c38 :/# kubectl apply -f kube-flannel.yml
jalur "kube-flanel.yml" tidak ada

root@8dd8c92c6c38 :/# kubectl apply -f https://git.io/weave-kube
daemonset "weave-net" dibuat
root@8dd8c92c6c38 :/# kubectl get pod --all-namespaces
NAMESPACE NAMA SIAP STATUS RESTART USIA
kube-system dummy-2088944543-17sey 1/1 Lari 0 46m
kube-system etcd-8dd8c92c6c38 1/1 Berjalan 2 46m
kube-system kube-apiserver-8dd8c92c6c38 1/1 Menjalankan 4 46m
kube-system kube-controller-manager-8dd8c92c6c38 1/1 Berjalan 2 45m
kube-system kube-discovery-1150918428-9m6rr 0/1 Tertunda 0 3m
kube-system kube-dns-654381707-vuijm 0/3 Pembuatan Kontainer 0 45m
kube-system kube-proxy-tuw6u 0/1 CrashLoopBackOff 13 45m
kube-system kube-scheduler-8dd8c92c6c38 1/1 Berjalan 2 44m
kube-system weave-net-iv0bc 0/2 ContainerCreating 0 49s
info: 1 objek yang telah selesai tidak ditampilkan dalam daftar pod. Lewati --show-all untuk melihat semua objek.

Hai lagi @zreigz
Sekarang saya akhirnya punya waktu untuk melangkah lebih jauh dengan ini dan mengujinya - saya hampir bisa membuatnya, tetapi ada kesalahan bahwa buruh pelabuhan memilih driver penyimpanan vfs (mungkin karena tidak dapat menggunakan auf di atas auf? Tetapi seperti yang Anda jelaskan solusinya di atas saya memasang .sock buruh pelabuhan luar di buruh pelabuhan dalam sehingga mungkin untuk menulis dengan aufs? Jika saya melakukannya
docker info pada mesin Host saya dikatakan bahwa ia menjalankan driver penyimpanan aufs. - Sedangkan jika saya melakukan docker info di dalam wadah buruh pelabuhan dengan kubernetes dikatakan menggunakan driver penyimpanan vfs.
Adakah ide mengapa saya mendapatkan masalah berikut saat menjalankan
kubeadm init

root<strong i="13">@f50f087baa83</strong>:/# kubeadm init
[kubeadm] WARNING: kubeadm is in alpha, please do not use it for production clusters.
[preflight] Running pre-flight checks
[preflight] The system verification failed. Printing the output from the verification:
OS: Linux
KERNEL_VERSION: 4.4.0-43-generic
CONFIG_NAMESPACES: enabled
CONFIG_NET_NS: enabled
CONFIG_PID_NS: enabled
CONFIG_IPC_NS: enabled
CONFIG_UTS_NS: enabled
CONFIG_CGROUPS: enabled
CONFIG_CGROUP_CPUACCT: enabled
CONFIG_CGROUP_DEVICE: enabled
CONFIG_CGROUP_FREEZER: enabled
CONFIG_CGROUP_SCHED: enabled
CONFIG_CPUSETS: enabled
CONFIG_MEMCG: enabled
CONFIG_INET: enabled
CONFIG_EXT4_FS: enabled
CONFIG_PROC_FS: enabled
CONFIG_NETFILTER_XT_TARGET_REDIRECT: enabled (as module)
CONFIG_NETFILTER_XT_MATCH_COMMENT: enabled (as module)
CONFIG_OVERLAY_FS: enabled (as module)
CONFIG_AUFS_FS: enabled (as module)
CONFIG_BLK_DEV_DM: enabled
CGROUPS_CPU: enabled
CGROUPS_CPUACCT: enabled
CGROUPS_CPUSET: enabled
CGROUPS_DEVICES: enabled
CGROUPS_FREEZER: enabled
CGROUPS_MEMORY: enabled
DOCKER_VERSION: 1.12.1
DOCKER_GRAPH_DRIVER: vfs
[preflight] Some fatal errors occurred:
    unsupported graph driver: vfs
[preflight] If you know what you are doing, you can skip pre-flight checks with `--skip-preflight-checks`
root<strong i="14">@f50f087baa83</strong>:/# 

Beberapa info lebih lanjut setelah mencoba sedikit lagi.
Saya mengubah driver penyimpanan buruh pelabuhan menjadi "hamparan" pada Host. Kemudian buruh pelabuhan di dalam buruh pelabuhan memilih aufs sebagai pengemudi dan saya lulus "pemeriksaan pra-penerbangan", tetapi sekarang saya terjebak
[apiclient] Created API client, waiting for the control plane to become ready

Pada beberapa pengujian lain saya menyadari bahwa buruh pelabuhan tidak memilih driver penyimpanan yang sama ketika dimulai sebagai layanan melalui /sbin/init
Jika saya menjalankan gambar buruh pelabuhan dengan cara ini, driver itu tidak memulai driver yang sama dengan Host (seperti yang disebutkan di atas):
sudo docker run -it --privileged=true -d --security-opt seccomp:unconfined --cap-add=SYS_ADMIN -v /sys/fs/cgroup:/sys/fs/cgroup:ro -v /var/run/docker.sock:/var/run/docker.sock kubeadm_docker /sbin/init

Jika saya memulainya tanpa /sbin/init dan bukan sebagai daemon seperti ini:
sudo docker run -it --privileged=true --security-opt seccomp:unconfined --cap-add=SYS_ADMIN -v /sys/fs/cgroup:/sys/fs/cgroup:ro -v /var/run/docker.sock:/var/run/docker.sock kubeadm_docker /bin/bash kemudian buruh pelabuhan memilih driver penyimpanan yang sama dengan Host (tetapi sekarang systemctrl tidak berfungsi)

Beberapa pembaruan lainnya:

Saya sekarang dapat membangun kubeadm-in-docker-container yang berfungsi dengan Dockerfile ini:

FROM ubuntu:xenial-20161213

ARG DEBIAN_FRONTEND=noninteractive

RUN apt-get update -qq

RUN apt-get install -y \
    apt-transport-https \
    apt-utils \
    ca-certificates \
    curl \
    dialog \
    python \
    daemon \
    vim \
    jq \
    linux-image-$(uname -r)

# remove unwanted systemd services
RUN for i in /lib/systemd/system/sysinit.target.wants/*; do [ "${i##*/}" = "systemd-tmpfiles-setup.service" ] || rm -f "$i"; done; \
  rm -f /lib/systemd/system/multi-user.target.wants/*;\
  rm -f /etc/systemd/system/*.wants/*;\
  rm -f /lib/systemd/system/local-fs.target.wants/*; \
  rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
  rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
  rm -f /lib/systemd/system/basic.target.wants/*;\
  rm -f /lib/systemd/system/anaconda.target.wants/*;

# install docker (after removing unwanted systemd)
RUN apt-get install -y \
    docker.io

RUN echo "Add Kubernetes repo..."
RUN sh -c 'curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -'
RUN sh -c 'echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" > /etc/apt/sources.list.d/kubernetes.list'

RUN echo "Installing Kubernetes requirements..."
RUN apt-get update -y && apt-get install -y \
  kubelet \
  kubernetes-cni \
  kubectl

RUN echo "Installing Kubeadm - this will fail at post-install but that doesn't matter"
RUN apt-get install -y \
  kubeadm; exit 0

# Create volume for docker
VOLUME /var/lib/docker

Saya membangun dengan: docker build -t kubeadm_docker .

Dan kemudian jalankan:

docker run -it --privileged=true --name=master -d --security-opt seccomp:unconfined --cap-add=SYS_ADMIN -v /sys/fs/cgroup:/sys/fs/cgroup:ro kubeadm_docker /sbin/init

Tunggu beberapa (10-15) detik hingga systemd dan docker aktif dan berjalan

Lalu saya memulai kubeadm di dalam wadah yang sedang berjalan:
docker exec -it master kubeadm init --token=acbec6.2852dff7cb569aa0

Ketika dimulai, saya memulai simpul "pekerja" kedua:

docker run -it --privileged=true --name=node -d --security-opt seccomp:unconfined --cap-add=SYS_ADMIN -v /sys/fs/cgroup:/sys/fs/cgroup:ro kubeadm_docker /sbin/init
Dan setelah beberapa detik bergabunglah dengan master:

docker exec -it edge kubeadm join --token=acbec6.2852dff7cb569aa0 172.17.0.2

Saat ini ada beberapa masalah dengan jaringan buruh pelabuhan karena kube-proxy gagal dan memasuki CrashLoopBackOff.

Jika saya menetapkan --net=host saat menjalankan docker di atas, maka kube-proxy dan semua pod akan muncul OK - tetapi itu bukan opsi karena saya harus menjalankan container di jaringan docker dengan ip mereka: S

Saya juga sebelumnya mencoba menjalankan buruh pelabuhan dengan proses yang sama seperti pada Host: -v /var/run/docker.sock:/var/run/docker.sock tetapi saya tidak pernah berhasil karena ketika buruh pelabuhan di dalam wadah dimulai dengan systemd itu tidak mengambil kaus kaki (atau sesuatu seperti itu).

Terima kasih @andersla!
Bisakah Anda menempelkan kube-proxy yang gagal?

Terima kasih @luxas atas minat Anda!

Sayangnya tidak ada detail di journalctl -xeu kubelet

Ini semua yang saya temukan tentang kube-proxy (berulang kali) Saya juga melampirkan log lengkap.

Jan 09 14:40:02 1355b98bf8c7 kubelet[244]: I0109 14:40:02.690862     244 docker_manager.go:2524] checking backoff for container "kube-proxy" in pod "kube-proxy-7886l"
Jan 09 14:40:03 1355b98bf8c7 kubelet[244]: I0109 14:40:03.984818     244 docker_manager.go:2538] Back-off 20s restarting failed container=kube-proxy pod=kube-proxy-7886l_kube-system(71a1e950-d679-11e6-a9f7-02429d4c0f01)
Jan 09 14:40:03 1355b98bf8c7 kubelet[244]: E0109 14:40:03.984833     244 pod_workers.go:184] Error syncing pod 71a1e950-d679-11e6-a9f7-02429d4c0f01, skipping: failed to "StartContainer" for "kube-proxy" with CrashLoopBackOff: "Back-off 20s restarting failed container=kube-proxy pod=kube-proxy-7886l_kube-system(71a1e950-d679-11e6-a9f7-02429d4c0f01)"

Log lengkap juga mengeluh tentang kube-dns - tetapi itu karena saya belum mulai menenun.

Ini log dari kubectl describe pod -n kube-system kube-proxy-w0ng5

Name:       kube-proxy-w0ng5
Namespace:  kube-system
Node:       3551807cba77/172.17.0.2
Start Time: Tue, 10 Jan 2017 18:03:06 +0000
Labels:     component=kube-proxy
        k8s-app=kube-proxy
        kubernetes.io/cluster-service=true
        name=kube-proxy
        tier=node
Status:     Running
IP:     172.17.0.2
Controllers:    DaemonSet/kube-proxy
Containers:
  kube-proxy:
    Container ID:   docker://dcc2bc0b50a2477b72d451b776f35e327f1faf09e3cddb25d5609569c6f2a242
    Image:      gcr.io/google_containers/kube-proxy-amd64:v1.5.1
    Image ID:       docker-pullable://gcr.io/google_containers/kube-proxy-amd64<strong i="7">@sha256</strong>:3b82b2e0862b3c0ece915de29a5a53634c9b0a73140340f232533c645decbd4b
    Port:       
    Command:
      kube-proxy
      --kubeconfig=/run/kubeconfig
    State:      Waiting
      Reason:       CrashLoopBackOff
    Last State:     Terminated
      Reason:       Error
      Exit Code:    1
      Started:      Tue, 10 Jan 2017 18:08:48 +0000
      Finished:     Tue, 10 Jan 2017 18:08:48 +0000
    Ready:      False
    Restart Count:  6
    Volume Mounts:
      /run/kubeconfig from kubeconfig (rw)
      /var/run/dbus from dbus (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-g0ft5 (ro)
    Environment Variables:  <none>
Conditions:
  Type      Status
  Initialized   True 
  Ready     False 
  PodScheduled  True 
Volumes:
  kubeconfig:
    Type:   HostPath (bare host directory volume)
    Path:   /etc/kubernetes/kubelet.conf
  dbus:
    Type:   HostPath (bare host directory volume)
    Path:   /var/run/dbus
  default-token-g0ft5:
    Type:   Secret (a volume populated by a Secret)
    SecretName: default-token-g0ft5
QoS Class:  BestEffort
Tolerations:    dedicated=master:NoSchedule
Events:
  FirstSeen LastSeen    Count   From            SubObjectPath           Type        Reason  Message
  --------- --------    -----   ----            -------------           --------    ------  -------
  9m        9m      1   {kubelet 3551807cba77}  spec.containers{kube-proxy} Normal      Pullingpulling image "gcr.io/google_containers/kube-proxy-amd64:v1.5.1"
  9m        9m      1   {kubelet 3551807cba77}  spec.containers{kube-proxy} Normal      CreatedCreated container with docker id ecf446de342a; Security:[seccomp=unconfined]
  9m        9m      1   {kubelet 3551807cba77}  spec.containers{kube-proxy} Normal      StartedStarted container with docker id ecf446de342a
  9m        9m      1   {kubelet 3551807cba77}  spec.containers{kube-proxy} Normal      Pulled  Successfully pulled image "gcr.io/google_containers/kube-proxy-amd64:v1.5.1"
  9m        9m      1   {kubelet 3551807cba77}  spec.containers{kube-proxy} Normal      CreatedCreated container with docker id f562fb667a64; Security:[seccomp=unconfined]
  9m        9m      1   {kubelet 3551807cba77}  spec.containers{kube-proxy} Normal      StartedStarted container with docker id f562fb667a64
  9m        9m      2   {kubelet 3551807cba77}                  Warning     FailedSync  Error syncing pod, skipping: failed to "StartContainer" for "kube-proxy" with CrashLoopBackOff: "Back-off 10s restarting failed container=kube-proxy pod=kube-proxy-w0ng5_kube-system(09c4f65d-d75f-11e6-814c-0242255c9a68)"

  9m    9m  1   {kubelet 3551807cba77}  spec.containers{kube-proxy} Normal  Started     Started container with docker id 1a7d7d4f682b
  9m    9m  1   {kubelet 3551807cba77}  spec.containers{kube-proxy} Normal  Created     Created container with docker id 1a7d7d4f682b; Security:[seccomp=unconfined]
  9m    9m  2   {kubelet 3551807cba77}                  Warning FailedSync  Error syncing pod, skipping: failed to "StartContainer" for "kube-proxy" with CrashLoopBackOff: "Back-off 20s restarting failed container=kube-proxy pod=kube-proxy-w0ng5_kube-system(09c4f65d-d75f-11e6-814c-0242255c9a68)"

  8m    8m  1   {kubelet 3551807cba77}  spec.containers{kube-proxy} Normal  Started     Started container with docker id 89bdf4ba7e0b
  8m    8m  1   {kubelet 3551807cba77}  spec.containers{kube-proxy} Normal  Created     Created container with docker id 89bdf4ba7e0b; Security:[seccomp=unconfined]
  8m    8m  3   {kubelet 3551807cba77}                  Warning FailedSync  Error syncing pod, skipping: failed to "StartContainer" for "kube-proxy" with CrashLoopBackOff: "Back-off 40s restarting failed container=kube-proxy pod=kube-proxy-w0ng5_kube-system(09c4f65d-d75f-11e6-814c-0242255c9a68)"

  8m    8m  1   {kubelet 3551807cba77}  spec.containers{kube-proxy} Normal  Created     Created container with docker id f2b7a2b5078d; Security:[seccomp=unconfined]
  8m    8m  1   {kubelet 3551807cba77}  spec.containers{kube-proxy} Normal  Started     Started container with docker id f2b7a2b5078d
  8m    7m  6   {kubelet 3551807cba77}                  Warning FailedSync  Error syncing pod, skipping: failed to "StartContainer" for "kube-proxy" with CrashLoopBackOff: "Back-off 1m20s restarting failed container=kube-proxy pod=kube-proxy-w0ng5_kube-system(09c4f65d-d75f-11e6-814c-0242255c9a68)"

  6m    6m  1   {kubelet 3551807cba77}  spec.containers{kube-proxy} Normal  Created     Created container with docker id 28deaf41d920; Security:[seccomp=unconfined]
  6m    6m  1   {kubelet 3551807cba77}  spec.containers{kube-proxy} Normal  Started     Started container with docker id 28deaf41d920
  6m    4m  12  {kubelet 3551807cba77}                  Warning FailedSync  Error syncing pod, skipping: failed to "StartContainer" for "kube-proxy" with CrashLoopBackOff: "Back-off 2m40s restarting failed container=kube-proxy pod=kube-proxy-w0ng5_kube-system(09c4f65d-d75f-11e6-814c-0242255c9a68)"

  9m    4m  6   {kubelet 3551807cba77}  spec.containers{kube-proxy} Normal  Pulled      Container image "gcr.io/google_containers/kube-proxy-amd64:v1.5.1" already present on machine
  4m    4m  1   {kubelet 3551807cba77}  spec.containers{kube-proxy} Normal  Created     Created container with docker id dcc2bc0b50a2; Security:[seccomp=unconfined]
  4m    4m  1   {kubelet 3551807cba77}  spec.containers{kube-proxy} Normal  Started     Started container with docker id dcc2bc0b50a2
  9m    10s 43  {kubelet 3551807cba77}  spec.containers{kube-proxy} Warning BackOff     Back-off restarting failed docker container
  4m    10s 18  {kubelet 3551807cba77}                  Warning FailedSync  Error syncing pod, skipping: failed to "StartContainer" for "kube-proxy" with CrashLoopBackOff: "Back-off 5m0s restarting failed container=kube-proxy pod=kube-proxy-w0ng5_kube-system(09c4f65d-d75f-11e6-814c-0242255c9a68)"

Ya, saya melihat _that_ itu crashlooping, tetapi dapatkah Anda memberikan misalnya kubectl -n kube-system logs kube-proxy-w0ng5 ?
Jadi kami benar-benar melihat alasannya _why_ :smile:

Hei itu brilian :)
root@3551807cba77 :/# kubectl -n kube-system log kube-proxy-w0ng5

I0110 18:29:01.705993       1 server.go:215] Using iptables Proxier.
W0110 18:29:01.706933       1 proxier.go:254] clusterCIDR not specified, unable to distinguish between internal and external traffic
I0110 18:29:01.706947       1 server.go:227] Tearing down userspace rules.
I0110 18:29:01.712693       1 conntrack.go:81] Set sysctl 'net/netfilter/nf_conntrack_max' to 262144
I0110 18:29:01.712927       1 conntrack.go:66] Setting conntrack hashsize to 65536
write /sys/module/nf_conntrack/parameters/hashsize: operation not supported

Saya dapat memperbaikinya dengan solusi: mengatur --conntrack-max-per-core=0 dan kemudian memulai ulang proxy. Sebuah 0-val melompati konfigurasi ulang nf_conntrack_max dan meninggalkan apa adanya (65536). Saya menyuntikkan parameter mulai seperti ini:

Pertama masukkan wadah buruh pelabuhan:
docker exec -it master bash

kemudian terapkan perbaikan:

kubectl -n kube-system get ds -l 'component=kube-proxy' -o json | jq '.items[0].spec.template.spec.containers[0].command |= .+ ["--conntrack-max-per-core=0"]' | kubectl apply -f - && kubectl -n kube-system delete pods -l 'component=kube-proxy'

Sekarang saya mendapatkan CrashLoop di Weave sebagai gantinya ketika saya nanti melakukan kubectl apply -f weave.yaml , berikut ini adalah output log dari pod weave:
/proc/sys/net/bridge/bridge-nf-call-iptables not found
Saya juga mencoba memulai dengan parameter kube-proxy --proxy-mode=userspace tetapi hasilnya sama.

Saya pikir ini akan menyelesaikan masalah menenun: https://github.com/weaveworks/weave/pull/2659

@andersla Ya, itu sepertinya memperbaiki masalah. Bisakah Anda mencoba membangun dari HEAD?
Misalnya, Anda dapat menggunakan gambar luxas/weave-(kube|npc):v1.9.0-alpha.5 yang berasal dari HEAD~ish.
Beri tahu saya jika berhasil, dan beri komentar di sini apa yang Anda lakukan sekarang (perintah shell, Dockerfile, skrip lain, dll.) sehingga orang lain dapat memanfaatkannya.

Saya menggunakan gambar terbaru dari weaveworks/weave-kube

Saya juga menggunakan template yaml terbaru https://github.com/weaveworks/weave/blob/master/prog/weave-kube/weave-daemonset.yaml

Sayangnya kube-dns tidak berfungsi (ada di ContainerCreating. Pesan error dari kubelet setelah memulai weave adalah:

an 15 16:14:30 7c12205804da kubelet[540]: I0115 16:14:30.443327     540 operation_executor.go:917] MountVolume.SetUp succeeded for volume "kubernetes.io/secret/c23fb73d-db39-11e6-b84d-0242b1ac1840-default-token-142vd" (spec.Name: "default-token-142vd") pod "c23fb73d-db39-11e6-b84d-0242b1ac1840" (UID: "c23fb73d-db39-11e6-b84d-0242b1ac1840").
Jan 15 16:14:31 7c12205804da kubelet[540]: E0115 16:14:31.381741     540 docker_manager.go:373] NetworkPlugin cni failed on the status hook for pod 'kube-dns-2924299975-9gjcg' - Unexpected command output Device "eth0" does not exist.
Jan 15 16:14:31 7c12205804da kubelet[540]:  with error: exit status 1

Jika saya hanya memulai master node dan tidak bergabung dengan node lain maka kubedns muncul OK ketika saya menerapkan weave.yaml

Saya juga menguji weave.yaml dengan weave-kube terbaru pada instalasi Vagrant dan bukan dalam eksperimen buruh pelabuhan saya dan semuanya berhasil.

Ini adalah weave.yaml yang saya gunakan untuk kubectl apply -f weave.yaml

apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  name: weave-net
  namespace: kube-system
spec:
  template:
    metadata:
      labels:
        name: weave-net
      annotations:
        scheduler.alpha.kubernetes.io/tolerations: |
          [
            {
              "key": "dedicated",
              "operator": "Equal",
              "value": "master",
              "effect": "NoSchedule"
            }
          ]
    spec:
      hostNetwork: true
      hostPID: true
      containers:
        - name: weave
          image: weaveworks/weave-kube:latest
          imagePullPolicy: Always
          command:
            - /home/weave/launch.sh
          livenessProbe:
            initialDelaySeconds: 30
            httpGet:
              host: 127.0.0.1
              path: /status
              port: 6784
          securityContext:
            privileged: true
          volumeMounts:
            - name: weavedb
              mountPath: /weavedb
            - name: cni-bin
              mountPath: /host/opt
            - name: cni-bin2
              mountPath: /host/home
            - name: cni-conf
              mountPath: /host/etc
            - name: dbus
              mountPath: /host/var/lib/dbus
          resources:
            requests:
              cpu: 10m
        - name: weave-npc
          image: weaveworks/weave-npc:latest
          imagePullPolicy: Always
          resources:
            requests:
              cpu: 10m
          securityContext:
            privileged: true
      restartPolicy: Always
      volumes:
        - name: weavedb
          emptyDir: {}
        - name: cni-bin
          hostPath:
            path: /opt
        - name: cni-bin2
          hostPath:
            path: /home
        - name: cni-conf
          hostPath:
            path: /etc
        - name: dbus
          hostPath:
            path: /var/lib/dbus

hey guys, saya berlari ke utas ini dan itu sangat menakutkan! barang bagus.

saya benar-benar ingin menggunakan pendekatan ini untuk CI terhadap repo kami (yang cukup rumit, jujur). kami memiliki persyaratan Helm/Tiller untuk meluncurkan beberapa grafik untuk CI. apakah ada di antara Anda yang mengalami ini, atau punya saran untuk memulai ini? Tiller tampaknya muntah dalam situasi ini:

root<strong i="7">@JINKITNIX05</strong>:~/openstack-helm# kubectl logs tiller-deploy-3299276078-6kdzw -n kube-system
Error from server (BadRequest): the server rejected our request for an unknown reason (get pods tiller-deploy-3299276078-6kdzw)
root<strong i="8">@JINKITNIX05</strong>:~/openstack-helm# 

saya dapat mencoba dengan SDN lain. kami telah menggunakan Calico sejauh ini karena L3 sedikit lebih mudah untuk memecahkan masalah dalam situasi hacky, tetapi jika Weave lebih baik (karena itu L2)...Saya akan mencoba apa pun yang membuat kami melewati masalah Tiller. saya pikir Tiller tidak senang karena pada akhirnya tampaknya diasosiasikan dengan 127.0.0.1...dan saya telah melihat hal itu menyebabkan masalah di masa lalu menguji hal-hal lain. masukan apa pun akan luar biasa. sekali lagi, alat peraga yang benar-benar luar biasa untuk orang-orang yang meretas segalanya! Terima kasih!!

Hai! Bagus bahwa kita lebih banyak orang yang ingin ini bekerja. Saya tidak punya pengalaman dengan calico. Di cloud kami menjalankan Weave jadi itulah yang saya inginkan untuk mengerjakan proyek ini. Namun saya buntu dan belum sempat menggali lebih jauh mengapa kube-dns tidak muncul saat saya menerapkan Weave seperti yang dijelaskan di atas.

Sekarang tenunan stabil terbaru bekerja lebih baik dari sebelumnya....

kubectl apply -f https://git.io/weave-kube

..tapi sayangnya masih masalah yang sama dengan kube-dns tidak muncul, terjebak di ContainerCreating:

root<strong i="9">@18a7d1ec5124</strong>:/# kubectl get pods --all-namespaces
NAMESPACE     NAME                                   READY     STATUS              RESTARTS   AGE
kube-system   dummy-2088944543-pvvdx                 1/1       Running             0          5m
kube-system   etcd-18a7d1ec5124                      1/1       Running             0          4m
kube-system   kube-apiserver-18a7d1ec5124            1/1       Running             2          5m
kube-system   kube-controller-manager-18a7d1ec5124   1/1       Running             0          4m
kube-system   kube-discovery-1769846148-6tv4l        1/1       Running             0          5m
kube-system   kube-dns-2924299975-4608d              0/4       ContainerCreating   0          5m
kube-system   kube-proxy-k0stq                       1/1       Running             0          4m
kube-system   kube-proxy-tnm8h                       1/1       Running             0          4m
kube-system   kube-scheduler-18a7d1ec5124            1/1       Running             0          4m
kube-system   weave-net-mff6t                        2/2       Running             0          3m
kube-system   weave-net-t7zcl                        2/2       Running             0          3m

dan setelah menerapkan weave, pesan kesalahan ini berhenti:
Feb 04 18:06:57 18a7d1ec5124 kubelet[252]: E0204 18:06:57.125434 252 pod_workers.go:184] Error syncing pod 7dc68091-eb04-11e6-a321-02425e578ba1, skipping: failed to "SetupNetwork" for "kube-dns-2924299975-4608d_kube-system" with SetupNetworkError: "Failed to setup network for pod \"kube-dns-2924299975-4608d_kube-system(7dc68091-eb04-11e6-a321-02425e578ba1)\" using network plugins \"cni\": cni config unintialized; Skipping pod"

dan sebagai gantinya begitu saya melihat:

Feb 04 18:06:59 18a7d1ec5124 kubelet[252]: E0204 18:06:59.615375 252 docker_manager.go:373] NetworkPlugin cni failed on the status hook for pod 'kube-dns-2924299975-4608d' - Unexpected command output Device "eth0" does not exist. Feb 04 18:06:59 18a7d1ec5124 kubelet[252]: with error: exit status 1

Jika saya menggunakan Flanel sebagai plugin jaringan, itu berfungsi.

docker exec -it master bash

curl -sSL "https://github.com/coreos/flannel/blob/master/Documentation/kube-flannel.yml?raw=true" | kubectl create -f -

Jadi jika Anda menggunakan Flanel, maka semuanya berfungsi, berikut adalah pengaturan lengkapnya:

File Docker:

FROM ubuntu:xenial-20161213

ARG DEBIAN_FRONTEND=noninteractive

RUN apt-get update -qq

RUN apt-get install -y \
    apt-transport-https \
    apt-utils \
    ca-certificates \
    curl \
    dialog \
    python \
    daemon \
    vim \
    jq

# remove unwanted systemd services
RUN for i in /lib/systemd/system/sysinit.target.wants/*; do [ "${i##*/}" = "systemd-tmpfiles-setup.service" ] || rm -f "$i"; done; \
  rm -f /lib/systemd/system/multi-user.target.wants/*;\
  rm -f /etc/systemd/system/*.wants/*;\
  rm -f /lib/systemd/system/local-fs.target.wants/*; \
  rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
  rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
  rm -f /lib/systemd/system/basic.target.wants/*;\
  rm -f /lib/systemd/system/anaconda.target.wants/*;

# install docker (after removing unwanted systemd)
RUN apt-get install -y \
    docker.io

RUN echo "Add Kubernetes repo..."
RUN sh -c 'curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -'
RUN sh -c 'echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" > /etc/apt/sources.list.d/kubernetes.list'

RUN echo "Installing Kubernetes requirements..."
RUN apt-get update -y && apt-get install -y \
  kubelet \
  kubernetes-cni \
  kubectl

RUN echo "Installing Kubeadm - this will fail at post-install but that doesn't matter"
RUN apt-get install -y \
  kubeadm; exit 0

# Create volume for docker
VOLUME /var/lib/docker

Bangun dengan:
docker build -t kubeadm_docker .

Dan kemudian jalankan:
docker run -it --privileged=true --name=master -h master -d --security-opt seccomp:unconfined --cap-add=SYS_ADMIN -v /sys/fs/cgroup:/sys/fs/cgroup:ro kubeadm_docker /sbin/init

Tunggu beberapa (10-15) detik hingga systemd dan docker aktif dan berjalan

Lalu saya memulai kubeadm di dalam wadah yang sedang berjalan:
docker exec -it master kubeadm init --skip-preflight-checks --token=acbec6.2852dff7cb569aa0

Ketika dimulai, saya memulai simpul "pekerja" kedua:
docker run -it --privileged=true --name=node -h node -d --security-opt seccomp:unconfined --cap-add=SYS_ADMIN -v /sys/fs/cgroup:/sys/fs/cgroup:ro kubeadm_docker /sbin/init

Dan setelah beberapa detik (sampai systemd dan docker aktif) bergabunglah dengan master:
docker exec -it node kubeadm join --skip-preflight-checks --token=acbec6.2852dff7cb569aa0 172.17.0.2

Ketika mereka telah bergabung, - masukkan master dan terapkan solusi untuk crash kube-proxy:
docker exec -it master bash

kubectl -n kube-system get ds -l 'component=kube-proxy' -o json | jq '.items[0].spec.template.spec.containers[0].command |= .+ ["--conntrack-max-per-core=0"]' | kubectl apply -f - && kubectl -n kube-system delete pods -l 'component=kube-proxy'

Terakhir terapkan jaringan overlay flanel:
curl -sSL "https://github.com/coreos/flannel/blob/master/Documentation/kube-flannel.yml?raw=true" | kubectl create -f -

Saya tidak punya masalah menginstal Helm, Traefic atau GlusterFS di Kubernetes dalam pengaturan ini :)

kubeadm-dind-cluster pada dasarnya melakukan apa yang digariskan komentar terakhir, menyediakan otomatisasi sehingga Anda tidak perlu mengetikkan perintah secara manual (walaupun sampai sekarang menggunakan plugin jembatan CNI dengan beberapa peretasan alih-alih flanel, tetapi ini akan saya perbaiki cukup segera).
Ini juga memudahkan untuk membangun komponen k8s dan kubeadm dari sumber lokal dan menggunakan binari di cluster yang Anda mulai. Selain itu, ada beberapa masalah yang tidak terlihat yang saya temui saat mengerjakannya, misalnya agetty memakan CPU 100% dan menyebabkan docker crash kecuali Anda berhati-hati untuk menonaktifkannya.

Beberapa perubahan akan segera hadir di kubeadm-dind-cluster:

  • perbaiki untuk master k8s, kube-proxy rusak di sana
  • dukungan untuk gambar prebuilt (saya juga akan menerbitkan beberapa gambar seperti itu) jadi hanya satu skrip sudah cukup untuk memulai cluster. Ini mungkin berguna untuk CI di berbagai proyek yang menggunakan k8s
  • caching direktori data Docker untuk restart cluster yang lebih cepat
  • dukungan untuk implementasi CNI selain jembatan

kubeadm-dind-cluster juga menyediakan otomatisasi untuk pengujian e2e. Sifat menarik lainnya adalah Anda dapat menggunakan mesin buruh pelabuhan jarak jauh yang sama untuk membangun k8 dan menjalankan kubeadm-dind-cluster tanpa menyalin kembali binari (ini menariknya langsung dari wadah data build), yang mungkin penting jika Anda bekerja dengan buruh pelabuhan jarak jauh melalui koneksi yang lambat.

... lupa menyebutkan bahwa ia mengonfigurasi kubectl lokal untuk Anda sehingga Anda tidak perlu melakukan docker exec pada wadah master Anda untuk mengakses cluster Anda.

Seperti yang telah saya sebutkan, sementara DIND mungkin tampak mudah di permukaan, Anda dapat memiliki beberapa masalah tak terduga dengannya. Beberapa masalah sudah diperbaiki di kubeadm-dind-cluster dan gambar dasar yang digunakannya. Misalnya Anda perlu melakukan beberapa mount , Anda juga perlu menggunakan STOPSIGNAL SIGRTMIN+3 dan menahan godaan untuk menggunakan /sbin/init sebagai ENTRYPOINT , dan driver vfs terkadang bisa sangat lambat. Jadi ... inilah naga;)

@ivan4th Terima kasih untuk semua pekerjaan yang telah Anda lakukan dengan kubeadm dan dind :)
Bisakah Anda membuka edisi baru yang merujuk pada masalah ini di mana kita dapat mendiskusikan MVP yang diperlukan untuk menggabungkan kubeadm-dind-cluster ke dalam repo ini?

Setelah melihat dengan cepat, saya menemukan beberapa poin yang mungkin ingin kami lakukan sebelum kemungkinan MVP:

  • Idealnya harus ditulis dalam Go - Saya biasanya berpikir kami mencoba untuk menjauh dari Bash, jadi Go adalah cara untuk Go untuk proyek baru saya pikir :)
  • Basis debian harus didasarkan pada gcr.io/google-containers/debian-base-$(ARCH):0.1

    • Gambar dasar untuk dind idealnya harus dipublikasikan ke gcr.io

  • Ini harus bekerja pada banyak lengkungan seperti kubeadm
  • Anda harus dapat menyediakan binari Anda sendiri, tetapi paling sering itu harus diunduh dari CI yang menerbitkan binari untuk semua lengkungan setiap jam
  • Itu harus menggunakan CNI -- dengan penyedia jaringan yang dapat ditukar
  • Itu harus mengekspos opsi konfigurasinya melalui file konfigurasi seperti kubeadm dapat mengambil file konfigurasi sebagai input untuk opsi
  • Seharusnya hanya mendukung kubeadm v1.6+

Bagaimana menurutmu? Terima kasih untuk awal yang luar biasa, saya tidak sabar untuk benar-benar mengintegrasikan ini menjadi sesuatu yang resmi kubeadm :+1:

cc @jbeda @lukemarsden @errordeveloper @mikedanese @timothysc @sttts

Terima kasih untuk awal yang luar biasa, saya tidak sabar untuk benar-benar mengintegrasikan ini menjadi sesuatu yang resmi kubeadm

jika kita dapat mengembangkan-membangun, kubeadm-local-up-cluster itu akan luar biasa.

@ivan4th @luxas Apa status ini?

Saya tidak tahu benar-benar ... @ivan4th

@jamiehannaford

  • sampai sekarang, saya tertunda dengan penulisan ulang Go karena saya juga perlu mengerjakan proyek lain
  • kdc memiliki dukungan untuk impls CNI yang berbeda (Weave, Calico, Flanel dan jembatan CNI biasa yang merupakan default)
  • mendukung banyak arsitektur belum ada di sini tetapi cukup bisa dilakukan
  • binari yang digunakan dalam gambar secara default diambil dari rilis k8s tetapi Anda dapat membuatnya sendiri atau, dengan sedikit usaha, membuat gambar berdasarkan binari yang Anda buat sendiri secara terpisah
  • itu mendukung file konfigurasi tetapi sampai sekarang sebenarnya satu set env vars
  • gambar dasarnya masih ubuntu tetapi kami akan beralih ke debian
  • kami mendukung 1.6 dan saya akan menambahkan dukungan untuk 1.7 awal minggu depan

Secara keseluruhan kdc cukup dapat digunakan dalam bentuk IMO saat ini. Ini juga memiliki CI publiknya sendiri berdasarkan Travis (BTW saya juga berhasil menjalankan DIND di CircleCI jika itu menarik)

@luxas Mungkin kita bisa menggunakan solusi @andersla alih-alih cluster DIND penuh? Jika demikian, apakah kita perlu meng-host image Docker di mana saja, atau hanya mendokumentasikan seperti apa tampilan Dockerfile?

Akan sangat bagus jika kita bisa memperbaiki masalah ini untuk 1.9

Saya tidak memiliki siklus untuk mengerjakan ini. Jika orang lain, bisa tolong lakukan!

Masalah @jamiehannaford adalah, sebagian besar cluster DIND "penuh" didedikasikan untuk menangani banyak masalah yang muncul dari penggunaan DIND "sederhana". Ini mungkin kadang-kadang sangat tidak jelas, lihat misalnya https://github.com/Mirantis/kubeadm-dind-cluster/commit/405c8bead4fb443582328fd3c7b8f01452872438 (saya pikir saya harus mengirimkan perbaikan untuk k8 untuk ini). Pada kubeadm-dind-cluster , itu masih cukup dapat digunakan dan saya mencoba untuk tetap up-to-date( @danehans dan @pmichali menggunakannya untuk k8s IPv6 e2e testing dan Virtlet menggunakannya untuk menjalankan tes e2e di CircleCI), meskipun saya menghabiskan banyak waktu di proyek lain jadi saya belum berhasil menulis ulang di Go.

Kami membicarakan hal ini dalam pertemuan SIG kemarin, dan kami akan menutup masalah ini.
Mengembangkan dan memelihara solusi DIND yang lengkap tidak termasuk dalam lingkup tim kubeadm inti untuk masa mendatang, jika pernah. Kami sangat senang bahwa komunitas memberikan solusi ini, seperti kerja keras @ivan4th pada proyek Mirantis. Jika kami menemukan tempat yang baik untuk mendokumentasikan kemungkinan untuk menggunakan proyek itu, saya pribadi baik-baik saja dengan referensi itu. Terima kasih!

Apakah halaman ini membantu?
0 / 5 - 0 peringkat