Kubeadm: Mengubah alamat IP utama

Dibuat pada 6 Jul 2017  ·  29Komentar  ·  Sumber: kubernetes/kubeadm

Saya menggunakan penyedia yang secara dinamis memberikan alamat IP pribadi pada startup node, dan tampaknya merusak pengaturan berbasis kubeadm.

Saya telah menyiapkan server master baru dengan kubeadm, dan itu bekerja dengan baik, tetapi setelah mematikan dan menghidupkan kembali mesin, alamat IP pribadi telah berubah, dan sekarang ketika menggunakan kubectl saya mendapatkan kesalahan Unable to connect to the server: x509: certificate is valid for 10.96.0.1, 10.4.36.13, not 10.4.20.67
(Yang terakhir adalah alamat IP baru dari server master.)

Apakah ada cara untuk menjalankan kubeadm init dengan cara mengatur ulang konfigurasi? Misalnya saya ingin menyimpan pod cluster, RC, dll, tetapi saya ingin menginisialisasi ulang sertifikat untuk menggunakan nama host alih-alih alamat IP.

Ketika saya mencoba menjalankan init lagi dengan nama host alih-alih alamat IP default, itu tidak setuju dengan saya:

[06:20 root<strong i="12">@scumbag01</strong> ~] > kubeadm init --apiserver-advertise-address scumbag01 --skip-preflight-checks
[kubeadm] WARNING: kubeadm is in beta, please do not use it for production clusters.
[init] Using Kubernetes version: v1.7.0
[init] Using Authorization modes: [Node RBAC]
[preflight] Skipping pre-flight checks
[certificates] Using the existing CA certificate and key.
[certificates] Using the existing API Server certificate and key.
[certificates] Using the existing API Server kubelet client certificate and key.
[certificates] Using the existing service account token signing key.
[certificates] Using the existing front-proxy CA certificate and key.
[certificates] Using the existing front-proxy client certificate and key.
[certificates] Valid certificates and keys now exist in "/etc/kubernetes/pki"
a kubeconfig file "/etc/kubernetes/admin.conf" exists already but has got the wrong API Server URL

Ini mengambil sertifikat yang sekarang tidak dapat digunakan untuk 10.4.36.13, yang merupakan alamat IP di luar kendali saya alih-alih mengatur ulang.

Jika saya menghapus /etc/kubernetes/*.conf , dan menjalankan kembali init di atas masih menulis server: https://10.4.20.67:6443 alih-alih menggunakan nama host.

Haruskah kubeadm init menimpa pengaturan dan membuat sertifikat baru? Apakah ada rencana untuk menambahkan kubeadm reset atau fungsi serupa yang akan mereset cluster, atau menghancurkan semua artefak yang dibuat oleh kubeadm init sehingga saya dapat memulai lagi?

  • kubeadm versi : &version.Info{Mayor:"1", Minor:"7", GitVersion:"v1.7.0", GitCommit:"d3ada0119e776222f11ec7945e6d860061339aad", GitTreeState:"clean", BuildDate:"29-06-2017T22:55: 19Z", GoVersion:"go1.8.3", Kompilator:"gc", Platform:"linux/amd64"}
  • Versi Kubernetes : 1.7.0
  • Penyedia cloud atau konfigurasi perangkat keras : Scaleway, Intel ATOM x64
  • OS (mis. dari /etc/os-release): Debian Jessie
  • Kernel : 4.9.20
kinsupport

Komentar yang paling membantu

Saya tahu ini masalah lama tapi mungkin komentar saya akan berguna bagi seseorang.
Sayangnya solusi yang diusulkan oleh @patricklucas dan @weisjohn tidak bekerja untuk saya sehingga saya buat saya sendiri:

systemctl stop kubelet docker

cd /etc/

# backup old kubernetes data
mv kubernetes kubernetes-backup
mv /var/lib/kubelet /var/lib/kubelet-backup

# restore certificates
mkdir -p kubernetes
cp -r kubernetes-backup/pki kubernetes
rm kubernetes/pki/{apiserver.*,etcd/peer.*}

systemctl start docker

# reinit master with data in etcd
# add --kubernetes-version, --pod-network-cidr and --token options if needed
kubeadm init --ignore-preflight-errors=DirAvailable--var-lib-etcd

# update kubectl config
cp kubernetes/admin.conf ~/.kube/config

# wait for some time and delete old node
sleep 120
kubectl get nodes --sort-by=.metadata.creationTimestamp
kubectl delete node $(kubectl get nodes -o jsonpath='{.items[?(@.status.conditions[0].status=="Unknown")].metadata.name}')

# check running pods
kubectl get pods --all-namespaces

Semua 29 komentar

Ini bukan batasan oleh kubeadm, tetapi hanya praktik keamanan umum.
Sertifikat ditandatangani untuk {your-old-IP-here} dan komunikasi yang aman tidak dapat terjadi pada {your-new-ip-here}

Anda dapat menambahkan lebih banyak IP dalam sertifikat sebelumnya ...

Terima kasih atas tanggapan Anda.

Karena alamat IP ditetapkan oleh penyedia cloud, jadi membuat sertifikat sebelumnya hanya akan berfungsi jika saya dapat menyetelnya ke wildcard. (Maaf, saya tidak tahu apa-apa tentang sertifikat.)

Saya mengabaikan bahwa kubeadm reset benar-benar ada, karena tidak disebutkan dalam panduan referensi . Reset dan init bekerja cukup baik untuk saya, dan saya kira saya akan menghindari mematikan mesin master - saya menganggap masalah saya jarang dan jauh dari kasus penggunaan produksi. Tetap saja, saya bertanya-tanya apakah ada cara yang lebih baik. Saya kira saya bisa meniru langkah kubeadm reset , tetapi simpan folder data etcd untuk mempertahankan pengaturan cluster saya?

Either way, terima kasih untuk semua pekerjaan yang dilakukan di kubeadm! Sungguh ajaib melihat cluster muncul dalam hitungan menit - Saya telah menggunakan Kubernetes sejak 0.14, dalam produksi sejak 1.0.

@analytic saya memiliki masalah yang persis sama dengan Anda. Jaringan perusahaan saya memblokir gcr.io . Jadi saya menggunakan dongle untuk menginstal. Namun IP penyedia terus berubah secara dinamis dan tidak di bawah kendali saya. Jadi bahkan saya mencari solusi. Bahkan jika saya tetap memasang dongle saya, terkadang karena jaringan me-reset perubahan IP. Apakah Anda punya solusi untuk ini? Bagaimana Anda menangani ini?
@luxas bisakah Anda menyarankan bagaimana saya bisa melanjutkan. Saya seorang pemula di K8S. Benar-benar hilang dengan konfigurasi ini. Bisakah Anda memberi tahu saya bagaimana saya dapat memperbaiki masalah IP dinamis ini?

Bagaimana kalian menangani IP master yang berubah?

Apakah ada pembaruan tentang masalah ini?

Masalah yang sama disini. Adakah dokumentasi untuk melanjutkan modifikasi ip master tanpa mengatur ulang seluruh cluster?

Saya dapat mencapai ini dengan:

  • mengganti alamat IP di semua file konfigurasi di /etc/kubernetes
  • membuat cadangan /etc/kubernetes/pki
  • mengidentifikasi sertifikat di /etc/kubernetes/pki yang memiliki alamat IP lama sebagai nama alternatif[1]
  • menghapus sertifikat dan kunci untuk masing-masing (bagi saya itu hanya apiserver dan etcd/peer)
  • membuat ulang sertifikat menggunakan kubeadm alpha phase certs [2]
  • mengidentifikasi configmap di ruang nama kube-system yang mereferensikan IP lama[3]
  • mengedit peta konfigurasi tersebut secara manual
  • restart kubelet dan docker (untuk memaksa semua container dibuat ulang)

[1]

/etc/kubernetes/pki# for f in $(find -name "*.crt"); do openssl x509 -in $f -text -noout > $f.txt; done
/etc/kubernetes/pki# grep -Rl 12\\.34\\.56\\.78 .
./apiserver.crt.txt
./etcd/peer.crt.txt
/etc/kubernetes/pki# for f in $(find -name "*.crt"); do rm $f.txt; done

[2]

/etc/kubernetes/pki# rm apiserver.crt apiserver.key
/etc/kubernetes/pki# kubeadm alpha phase certs apiserver
...
/etc/kubernetes/pki# rm etcd/peer.crt etcd/peer.key
/etc/kubernetes/pki# kubeadm alpha phase certs etcd-peer
...

[3]

$ kubectl -n kube-system get cm -o yaml | less
...
$ kubectl -n kube-system edit cm ...

Wow, saya tidak menyadari perintah ini. Info bagus, itu berhasil. Terima kasih !

apakah ada cara untuk menemukan configmaps secara manual dan mengubahnya?

Saya harap kubeadm dapat membahas proses ini di rilis mendatang.

@patricklucas serius, terima kasih atas

Bagi mereka yang mencari kejelasan lebih lanjut, inilah pengalaman saya:

  1. ganti alamat IP di semua file konfigurasi di /etc/kubernetes
    bash oldip=192.168.1.91 newip=10.20.2.210 cd /etc/kubernetes # see before find . -type f | xargs grep $oldip # modify files in place find . -type f | xargs sed -i "s/$oldip/$newip/" # see after find . -type f | xargs grep $newip
  2. mencadangkan /etc/kubernetes/pki
    bash mkdir ~/k8s-old-pki cp -Rvf /etc/kubernetes/pki/* ~/k8s-old-pki
  3. mengidentifikasi sertifikat di /etc/kubernetes/pki yang memiliki alamat IP lama sebagai nama alternatif (ini bisa dibersihkan)
    bash cd /etc/kubernetes/pki for f in $(find -name "*.crt"); do openssl x509 -in $f -text -noout > $f.txt; done grep -Rl $oldip . for f in $(find -name "*.crt"); do rm $f.txt; done
  4. mengidentifikasi configmap di ruang nama kube-system yang mereferensikan IP lama, edit:

    # find all the config map names
    configmaps=$(kubectl -n kube-system get cm -o name | \
      awk '{print $1}' | \
      cut -d '/' -f 2)
    
    # fetch all for filename reference
    dir=$(mktemp -d)
    for cf in $configmaps; do
      kubectl -n kube-system get cm $cf -o yaml > $dir/$cf.yaml
    done
    
    # have grep help you find the files to edit, and where
    grep -Hn $dir/* -e $oldip
    
    # edit those files, in my case, grep only returned these two:
    kubectl -n kube-system edit cm kubeadm-config
    kubectl -n kube-system edit cm kube-proxy
    
  5. ubah alamat IP (melalui cli atau gui untuk distro Anda)
  6. hapus sertifikat dan kunci untuk masing-masing yang diidentifikasi oleh grep pada langkah sebelumnya, buat ulang sertifikat tersebut

    CATATAN: sebelum membuat ulang sertifikat melalui kubeadm admin phase certs ... , Anda harus menerapkan alamat IP baru

    rm apiserver.crt apiserver.key
    kubeadm alpha phase certs apiserver
    
    rm etcd/peer.crt etcd/peer.key
    kubeadm alpha phase certs etcd-peer
    
  7. mulai ulang kubelet dan buruh pelabuhan
    bash sudo systemctl restart kubelet sudo systemctl restart docker
  8. salin konfigurasi baru
    bash sudo cp /etc/kubernetes/admin.conf $HOME/.kube/config

@mariamTr ^

hal lain yang perlu diperhatikan, mengubah sertifikat dimungkinkan dalam mode offline dengan menentukan versi k8s dalam file konfigurasi: https://github.com/kubernetes/kubernetes/issues/54188#issuecomment -418880831

@weisjohn Bisakah Anda juga memperbarui komentar Anda dengan mencatat bahwa:

kubectl edit cm -nkube-public cluster-info

juga diperlukan untuk kubeadm?

Jika tidak, perintah join kubeadm saya terus gagal dengan menggunakan IP apiserver lama/salah di tengah proses.

Terima kasih!

Saya telah menerapkan semua langkah dari oleh @weisjohn (https://github.com/kubernetes/kubeadm/issues/338#issuecomment-418879755) dan @michaelfig (https://github.com/kubernetes/kubeadm/issues/ 338#issuecomment-428340099) untuk mengganti alamat di mana-mana.

Ini digunakan agar kubernetes menggunakan alamat VPC yang baru dibuat di eth1, bukan IP publik di eth0. Namun ketika saya menjalankan kubeadm upgrade diff v1.12.3 ia masih ingin mengembalikan perubahan ke --advertise-address di /etc/kubernetes/manifests/kube-apiserver.yaml .

Ada petunjuk?

Bahkan di kubectl get all --export=true --all-namespaces -o yaml IP lama tidak ada di mana pun

Pembaruan: ternyata kubeadm upgrade diff memang menyarankan perubahan, tetapi kubeadm upgrade apply sebenarnya tidak mengubah alamat sama sekali. (salah satu dari banyak bug kubernetes 1.13 seperti perbaikan)

@weisjohn Terima kasih untuk

@patricklucas serius, terima kasih atas

Bagi mereka yang mencari kejelasan lebih lanjut, inilah pengalaman saya:

  1. ganti alamat IP di semua file konfigurasi di /etc/kubernetes
    shell oldip=192.168.1.91 newip=10.20.2.210 cd /etc/kubernetes # see before find . -type f | xargs grep $oldip # modify files in place find . -type f | xargs sed -i "s/$oldip/$newip/" # see after find . -type f | xargs grep $newip
  2. mencadangkan /etc/kubernetes/pki
    shell mkdir ~/k8s-old-pki cp -Rvf /etc/kubernetes/pki/* ~/k8s-old-pki
  3. mengidentifikasi sertifikat di /etc/kubernetes/pki yang memiliki alamat IP lama sebagai nama alternatif (ini bisa dibersihkan)
    shell cd /etc/kubernetes/pki for f in $(find -name "*.crt"); do openssl x509 -in $f -text -noout > $f.txt; done grep -Rl $oldip . for f in $(find -name "*.crt"); do rm $f.txt; done
  4. mengidentifikasi configmap di ruang nama kube-system yang mereferensikan IP lama, edit:

    # find all the config map names
    configmaps=$(kubectl -n kube-system get cm -o name | \
     awk '{print $1}' | \
     cut -d '/' -f 2)
    
    # fetch all for filename reference
    dir=$(mktemp -d)
    for cf in $configmaps; do
     kubectl -n kube-system get cm $cf -o yaml > $dir/$cf.yaml
    done
    
    # have grep help you find the files to edit, and where
    grep -Hn $dir/* -e $oldip
    
    # edit those files, in my case, grep only returned these two:
    kubectl -n kube-system edit cm kubeadm-config
    kubectl -n kube-system edit cm kube-proxy
    
  5. ubah alamat IP (melalui cli atau gui untuk distro Anda)
  6. hapus sertifikat dan kunci untuk masing-masing yang diidentifikasi oleh grep pada langkah sebelumnya, buat ulang sertifikat tersebut

    CATATAN: sebelum membuat ulang sertifikat melalui kubeadm admin phase certs ... , Anda harus menerapkan alamat IP baru

    rm apiserver.crt apiserver.key
    kubeadm alpha phase certs apiserver
    
    rm etcd/peer.crt etcd/peer.key
    kubeadm alpha phase certs etcd-peer
    
  7. mulai ulang kubelet dan buruh pelabuhan
    shell sudo systemctl restart kubelet sudo systemctl restart docker
  8. salin konfigurasi baru
    shell sudo cp /etc/kubernetes/admin.conf $HOME/.kube/config

@mariamTr ^

Terima kasih untuk langkah-langkahnya.
Bisakah Anda memberikan lebih banyak seperti perubahan apa yang perlu kita lakukan pada master node dan setelah itu prosedur apa yang perlu kita terapkan untuk node pekerja lama untuk bergabung dengan node master yang dikonfigurasi ulang itu?

Terima kasih sebelumnya :)

Mungkin bagus untuk disebutkan, saat memindahkan IP master ke jaringan pribadi, akan berguna juga untuk memperbarui jaringan overlay. Calico tidak menggunakan antarmuka VPC sampai terikat ke antarmuka itu:

         env:
            - name: IP_AUTODETECTION_METHOD
              value: interface=eth1

sertifikat fase alfa kubeadm apiserver

@weisjohn kubeadm alpha phase certs apiserver tidak bekerja di v1.13.0, menunjukkan "Perintah ini tidak dimaksudkan untuk dijalankan sendiri. Lihat daftar sub-perintah yang tersedia." ada komentar terbaru yang tersedia?

di 1.13 perintahnya disebut kubeadm init phase certs apiserver :
https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-init-phase/#cmd -phase-certs

Langkah yang sangat berguna untuk obat - berkat @patricklucas dan @weisjohn!

Satu tip tambahan jika, seperti saya, Anda mulai dari keadaan bahwa alamat IP telah berubah, sehingga Anda tidak dapat menghubungi server api untuk mengubah configmaps pada langkah 4:
Sertifikat api-server ditandatangani untuk nama host kubernetes , jadi Anda dapat menambahkannya sebagai alias ke alamat IP baru di /etc/hosts lalu lakukan kubectl --server=https://kubernetes:6443 ... .

@bboreham @weisjohn @patricklucas Terima kasih banyak untuk pengalaman Anda. Bisakah Anda memberi saran, apa yang harus saya lakukan pada node pekerja setelah mengubah ip pada master node?
Hapus/tambahkan ke cluster? Atau cukup ubah _/etc/kubernetes/kubelet.conf_ dan _/etc/kubernetes/pki/ca.crt_ secara manual?

Saya tahu ini masalah lama tapi mungkin komentar saya akan berguna bagi seseorang.
Sayangnya solusi yang diusulkan oleh @patricklucas dan @weisjohn tidak bekerja untuk saya sehingga saya buat saya sendiri:

systemctl stop kubelet docker

cd /etc/

# backup old kubernetes data
mv kubernetes kubernetes-backup
mv /var/lib/kubelet /var/lib/kubelet-backup

# restore certificates
mkdir -p kubernetes
cp -r kubernetes-backup/pki kubernetes
rm kubernetes/pki/{apiserver.*,etcd/peer.*}

systemctl start docker

# reinit master with data in etcd
# add --kubernetes-version, --pod-network-cidr and --token options if needed
kubeadm init --ignore-preflight-errors=DirAvailable--var-lib-etcd

# update kubectl config
cp kubernetes/admin.conf ~/.kube/config

# wait for some time and delete old node
sleep 120
kubectl get nodes --sort-by=.metadata.creationTimestamp
kubectl delete node $(kubectl get nodes -o jsonpath='{.items[?(@.status.conditions[0].status=="Unknown")].metadata.name}')

# check running pods
kubectl get pods --all-namespaces

@valerius257 terima kasih

Terima kasih @valerius257 👍
Saya telah mencoba semua write-ups / instruksi dari @patricklucas dan @weisjohn. Mereka tidak bekerja untuk cluster saya. Bagian baiknya adalah bahwa instruksi tersebut menyoroti beberapa aspek kunci dari sertifikat dan kunci dan pada garis waktu apa yang perlu mereka tangani.

Instruksi yang disebutkan oleh @valerius257 bekerja dengan mulus, hingga saya menemukan masalah yang sangat spesifik untuk node master kubeadm saya. Saya mencoba memulihkan kubeadm Master Node yang IP-nya berubah.

Posting kelanjutan dari langkah-langkah yang disebutkan oleh @valerius257
Saya menggunakan plugin n/w flanel pada satu master node tunggal.
Masalah Flanel: kube-flannel-ds-xxxx back-off restart kontainer yang gagal
Status Pod: CrashLoopBackOff. Karena ini Pod lain seperti core-dns-xxx juga gagal muncul.

Resolusi: Karena saya telah memulai cluster dengan kubeadm init dengan cidr n/w (ketika IP lama atau saat menugaskan node master), langkah berikut telah menghapus pengaturan cidr dari "/etc/kubernetes/manifests/kube-controller-manager berkas .yaml".
kubeadm init --ignore-preflight-errors=DirAvailable--var-lib-etcd.

Oleh karena itu, jika Anda telah memulai node master kubeadm (dengan Alamat IP pertama kali) dengan perintah "kubeadm init --token {{ kubeadm_token }} --pod-network-cidr=10.244.0.0/16" ", lalu posting alokasi IP baru Anda harus menjalankan perintah berikut dengan --pod-network-cidr=10.244.0.0/16.
" kubeadm init --ignore-preflight-errors=DirAvailable--var-lib-etcd --token {{ kubeadm_token }} --pod-network-cidr=10.244.0.0/16"

Atau ubah file "/etc/kubernetes/manifests/kube-controller-manager.yaml dengan menyertakan parameter berikut , jika tidak ada di bawah Spec:containers :command:

  • --allocate-node-cidrs=true
  • --cluster-cidr=10.244.0.0/16

    • --node-cidr-mask-size=24

      Referensi: https://github.com/coreos/flannel/issues/728 , baca solusinya dari @wkjun

      Setelah perubahan di atas diterapkan,

      systemctl stop kubelet buruh pelabuhan

      tidur 20

      systemctl mulai buruh pelabuhan kubelet

      Periksa semua pod aktif dan berjalan termasuk flanel.

      kubect mendapatkan pod -n kube-system

Masalah 2:
Semua pod di namespace aplikasi atau di kube-system mulai menunjukkan kesalahan dalam menjelaskan perintah pod seperti:
"Peringatan FailedScheduling default-scheduler 0/1 node tersedia: 1 node memiliki taint yang tidak dapat ditoleransi oleh pod."
Jalankan perintah: kubectl taint nodes --all node-role.kubernetes.io/master-
menjelaskan semua pod yang berjalan di ruang kerja aplikasi atau di ruang nama sistem kube, kesalahan yang disebutkan tidak akan diamati. Di cluster muti-node Anda mungkin harus ekstra hati-hati.

@patricklucas serius, terima kasih atas

Bagi mereka yang mencari kejelasan lebih lanjut, inilah pengalaman saya:

  1. ganti alamat IP di semua file konfigurasi di /etc/kubernetes
    shell oldip=192.168.1.91 newip=10.20.2.210 cd /etc/kubernetes # see before find . -type f | xargs grep $oldip # modify files in place find . -type f | xargs sed -i "s/$oldip/$newip/" # see after find . -type f | xargs grep $newip
  2. mencadangkan /etc/kubernetes/pki
    shell mkdir ~/k8s-old-pki cp -Rvf /etc/kubernetes/pki/* ~/k8s-old-pki
  3. mengidentifikasi sertifikat di /etc/kubernetes/pki yang memiliki alamat IP lama sebagai nama alternatif (ini bisa dibersihkan)
    shell cd /etc/kubernetes/pki for f in $(find -name "*.crt"); do openssl x509 -in $f -text -noout > $f.txt; done grep -Rl $oldip . for f in $(find -name "*.crt"); do rm $f.txt; done
  4. mengidentifikasi configmap di ruang nama kube-system yang mereferensikan IP lama, edit:

    # find all the config map names
    configmaps=$(kubectl -n kube-system get cm -o name | \
     awk '{print $1}' | \
     cut -d '/' -f 2)
    
    # fetch all for filename reference
    dir=$(mktemp -d)
    for cf in $configmaps; do
     kubectl -n kube-system get cm $cf -o yaml > $dir/$cf.yaml
    done
    
    # have grep help you find the files to edit, and where
    grep -Hn $dir/* -e $oldip
    
    # edit those files, in my case, grep only returned these two:
    kubectl -n kube-system edit cm kubeadm-config
    kubectl -n kube-system edit cm kube-proxy
    
  5. ubah alamat IP (melalui cli atau gui untuk distro Anda)
  6. hapus sertifikat dan kunci untuk masing-masing yang diidentifikasi oleh grep pada langkah sebelumnya, buat ulang sertifikat tersebut

    CATATAN: sebelum membuat ulang sertifikat melalui kubeadm admin phase certs ... , Anda harus menerapkan alamat IP baru

    rm apiserver.crt apiserver.key
    kubeadm alpha phase certs apiserver
    
    rm etcd/peer.crt etcd/peer.key
    kubeadm alpha phase certs etcd-peer
    
  7. mulai ulang kubelet dan buruh pelabuhan
    shell sudo systemctl restart kubelet sudo systemctl restart docker
  8. salin konfigurasi baru
    shell sudo cp /etc/kubernetes/admin.conf $HOME/.kube/config

@mariamTr ^

di tempat newip ip mana yang harus kita berikan?
bisakah kita membuat ip kita sendiri?

@VipinKrizz konteks masalah ini adalah bahwa IP sudah berubah karena faktor dalam infrastruktur. Tidak ada yang bisa menjawab IP mana yang harus Anda gunakan kecuali seseorang yang akrab dengan pengaturan khusus Anda.

Mungkin Anda dapat menemukan seseorang untuk diajak mengobrol tentang hal ini di Slack? Masalah Kubeadm bukanlah tempat yang tepat.

@ valerius257 terima kasih banyak untuk skrip itu, sekarang saya melihat sejumlah kelemahan dalam pendekatan saya. Saya dapat mengonfirmasi bahwa solusi Anda berhasil, namun, ada banyak sisi kecil (seperti di semua k8). Saya harus menerapkan kembali tambalan apa pun ke layanan yang diaktifkan/bawaan, dns, kelas penyimpanan khusus, dll.

Tapi ya, skrip Anda menyelamatkan bacon saya hari ini.

@valerius257 Saya mengikuti langkah Anda tetapi mendapatkan masalah di bawah ini

root@ubuntu :/etc/kubernetes/pki# kubeadm init --ignore-preflight-errors=DirAvailable--var-lib-etcd
W0122 10:15:34.819150 102032 version.go:101] tidak dapat mengambil versi Kubernetes dari internet: tidak dapat memperoleh URL " https://dl.k8s.io/release/stable-1.txt ": Dapatkan https: //dl.k8s.io/release/stable-1.txt : tekan tcp: cari dl.k8s.io pada 127.0.0.53:53: server mengalami gangguan
W0122 10:15:34.819340 102032 version.go:102] kembali ke versi klien lokal: v1.16.3
[init] Menggunakan versi Kubernetes: v1.16.3
[preflight] Menjalankan pemeriksaan pra-penerbangan
[PERINGATAN IsDockerSystemdCheck]: mendeteksi "cgroupfs" sebagai driver cgroup Docker. Driver yang disarankan adalah "systemd". Silakan ikuti panduan di https://kubernetes.io/docs/setup/cri/
[PERINGATAN DirAvailable--var-lib-etcd]: /var/lib/etcd tidak kosong
[preflight] Diperlukan pengambilan gambar untuk menyiapkan cluster Kubernetes
[preflight] Ini mungkin memakan waktu satu atau dua menit, tergantung pada kecepatan koneksi internet Anda
[preflight] Anda juga dapat melakukan tindakan ini sebelumnya menggunakan 'kubeadm config images pull'
[kubelet-start] Menulis file lingkungan kubelet dengan flag ke file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Menulis konfigurasi kubelet ke file "/var/lib/kubelet/config.yaml"
[kubelet-start] Mengaktifkan layanan kubelet
[certs] Menggunakan folder certificateDir "/etc/kubernetes/pki"
[sertifikat] Menggunakan otoritas sertifikat ca yang ada
[certs] Membuat sertifikat dan kunci "apiserver"
[certs] apiserver serve cert ditandatangani untuk nama DNS [ubuntu kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] dan IP [10.96.0.1 192.168.120.137]
[sertifikat] Menggunakan sertifikat dan kunci apiserver-kubelet-client yang ada di disk
[sertifikat] Menggunakan otoritas sertifikat front-proxy-ca yang ada
[sertifikat] Menggunakan sertifikat klien-proksi-depan yang ada dan kunci pada disk
[sertifikat] Menggunakan otoritas sertifikat etcd/ca yang ada
[sertifikat] Menggunakan sertifikat etcd/server dan kunci pada disk
[certs] Membuat sertifikat dan kunci "etcd/peer"
[certs] etcd/peer serve cert ditandatangani untuk nama DNS [ubuntu localhost] dan IP [192.168.120.137 127.0.0.1 ::1]
[certs] Menggunakan sertifikat etcd/healthcheck-client dan kunci pada disk
[sertifikat] Menggunakan sertifikat dan kunci apiserver-etcd-client yang ada di disk
[sertifikat] Menggunakan kunci "sa" yang ada
[kubeconfig] Menggunakan folder kubeconfig "/etc/kubernetes"
[kubeconfig] Menulis file kubeconfig "admin.conf"
[kubeconfig] Menulis "kubelet.conf" file kubeconfig
[kubeconfig] Menulis file kubeconfig "controller-manager.conf"
[kubeconfig] Menulis file kubeconfig "scheduler.conf"
[control-plane] Menggunakan folder manifes "/etc/kubernetes/manifests"
[control-plane] Membuat manifes Pod statis untuk "kube-apiserver"
[control-plane] Membuat manifes Pod statis untuk "kube-controller-manager"
[control-plane] Membuat manifes Pod statis untuk "kube-scheduler"
[etcd] Membuat manifes Pod statis untuk etcd lokal di "/etc/kubernetes/manifests"
[wait-control-plane] Menunggu kubelet menjalankan control plane sebagai Pod statis dari direktori "/etc/kubernetes/manifests". Ini bisa memakan waktu hingga 4m0s
[kubelet-check] Batas waktu awal 40 detik telah berlalu.
[kubelet-check] Sepertinya kubelet tidak berjalan atau sehat.
[kubelet-check] Panggilan HTTP sama dengan 'curl -sSL http://localhost :10248/healthz' gagal dengan kesalahan: Get http://localhost :10248/healthz: dial tcp 127.0.0.1:10248: connect: connection menolak.
[kubelet-check] Sepertinya kubelet tidak berjalan atau sehat.
[kubelet-check] Panggilan HTTP sama dengan 'curl -sSL http://localhost :10248/healthz' gagal dengan kesalahan: Get http://localhost :10248/healthz: dial tcp 127.0.0.1:10248: connect: connection menolak.
[kubelet-check] Sepertinya kubelet tidak berjalan atau sehat.
[kubelet-check] Panggilan HTTP sama dengan 'curl -sSL http://localhost :10248/healthz' gagal dengan kesalahan: Get http://localhost :10248/healthz: dial tcp 127.0.0.1:10248: connect: connection menolak.
[kubelet-check] Sepertinya kubelet tidak berjalan atau sehat.
[kubelet-check] Panggilan HTTP sama dengan 'curl -sSL http://localhost :10248/healthz' gagal dengan kesalahan: Get http://localhost :10248/healthz: dial tcp 127.0.0.1:10248: connect: connection menolak.
[kubelet-check] Sepertinya kubelet tidak berjalan atau sehat.
[kubelet-check] Panggilan HTTP sama dengan 'curl -sSL http://localhost :10248/healthz' gagal dengan kesalahan: Get http://localhost :10248/healthz: dial tcp 127.0.0.1:10248: connect: connection menolak.

Sayangnya, telah terjadi kesalahan:
waktu habis menunggu kondisi

Kesalahan ini kemungkinan disebabkan oleh:
- Kubelet tidak berjalan
- Kubelet tidak sehat karena kesalahan konfigurasi node dalam beberapa cara (cgroup yang diperlukan dinonaktifkan)

Jika Anda menggunakan sistem yang didukung systemd, Anda dapat mencoba memecahkan masalah kesalahan dengan perintah berikut:
- 'systemctl status kubelet'
- 'journalctl -xeu kubelet'

Selain itu, komponen bidang kontrol mungkin mengalami crash atau keluar saat dimulai oleh runtime container.
Untuk memecahkan masalah, buat daftar semua kontainer menggunakan CLI runtime kontainer pilihan Anda, misalnya buruh pelabuhan.
Berikut adalah salah satu contoh bagaimana Anda dapat membuat daftar semua kontainer Kubernetes yang berjalan di buruh pelabuhan:
- ' buruh pelabuhan ps -a | grep kube | grep -v jeda'
Setelah Anda menemukan wadah yang gagal, Anda dapat memeriksa lognya dengan:
- 'log buruh pelabuhan CONTAINERID'
fase eksekusi error wait-control-plane: tidak dapat menginisialisasi cluster Kubernetes
Untuk melihat jejak tumpukan kesalahan ini, jalankan dengan --v=5 atau lebih tinggi

mohon bantuannya

Saya dapat mencapai ini dengan:

  • mengganti alamat IP di semua file konfigurasi di /etc/kubernetes
  • membuat cadangan /etc/kubernetes/pki
  • mengidentifikasi sertifikat di /etc/kubernetes/pki yang memiliki alamat IP lama sebagai nama alternatif[1]
  • menghapus sertifikat dan kunci untuk masing-masing (bagi saya itu hanya apiserver dan etcd/peer)
  • membuat ulang sertifikat menggunakan kubeadm alpha phase certs [2]
  • mengidentifikasi configmap di ruang nama kube-system yang mereferensikan IP lama[3]
  • mengedit peta konfigurasi tersebut secara manual
  • restart kubelet dan docker (untuk memaksa semua container dibuat ulang)

[1]

/etc/kubernetes/pki# for f in $(find -name "*.crt"); do openssl x509 -in $f -text -noout > $f.txt; done
/etc/kubernetes/pki# grep -Rl 12\\.34\\.56\\.78 .
./apiserver.crt.txt
./etcd/peer.crt.txt
/etc/kubernetes/pki# for f in $(find -name "*.crt"); do rm $f.txt; done

[2]

/etc/kubernetes/pki# rm apiserver.crt apiserver.key
/etc/kubernetes/pki# kubeadm alpha phase certs apiserver
...
/etc/kubernetes/pki# rm etcd/peer.crt etcd/peer.key
/etc/kubernetes/pki# kubeadm alpha phase certs etcd-peer
...

[3]

$ kubectl -n kube-system get cm -o yaml | less
...
$ kubectl -n kube-system edit cm ...

Bekerja untuk saya terima kasih

Satu-satunya hal yang perlu Anda gunakan

 kubeadm init phase ..

Untuk versi kubectl terbaru

@bboreham
Saya telah mengikuti langkah-langkah yang disebutkan oleh @patricklucas
seperti yang Anda sebutkan di langkah 4 perlu melakukan beberapa konfigurasi di /etc/hosts karena IP telah berubah dan tidak dapat terhubung ke api-server.

Hasilkan sertifikat menggunakan
kubeadm init --kubernetes-version=v1.16.3 sertifikat fase apiserver

saya telah mengubah /etc/hosts

dan mencoba kubectl --server=https://:6443 masih tidak berfungsi :(

ada konfigurasi khusus yang perlu dilakukan di /etc/hosts??

Apakah halaman ini membantu?
0 / 5 - 0 peringkat