Kubeadm: Dari mana kubeadm mengambil pengaturan proxy?

Dibuat pada 28 Jun 2017  ·  13Komentar  ·  Sumber: kubernetes/kubeadm

Ini bukan / etc / environment, ini bukan sesi bash saat ini yang dijalankan kubeadm, ini bukan lingkungan docker atau kubelet. Saya memverifikasi ini dengan menyetel no_proxy ke nilai yang berbeda dalam semua contoh ini. Dan untuk beberapa alasan setelah kubeadm init itu masih terus menetapkan nilai lain untuk no_proxy . Mulai ulang, muat ulang daemon, mulai ulang semua layanan tidak mengubah fakta itu.

Jujur saja sangat menjengkelkan karena hanya mencetak baris "alamat ip fo.oo.ba.rr memiliki proxy yang disetel ke blubb" alih-alih mengatakan dari mana ia mengambil nilainya. Dan mengapa tidak hanya membaca nilai dari / etc / environment, yang merupakan satu-satunya sumber kebenaran yang sebenarnya ketika datang ke pengaturan proxy, atau sesi bash saat ini di mana saya memanggil kubeadm yang paling mudah tempat untuk melakukan perubahan?

Yang saya harapkan akan menjadi seperti ini:

  1. kubeadm memeriksa variabel env saat ini http_proxy . (atau https_proxy jika komunikasi aman dikonfigurasi)
  2. kubeadm memeriksa variabel env saat ini HTTP_PROXY dan memperingatkan jika berbeda.
  3. kubeadm memeriksa http_proxy di / etc / environment. Ini memperingatkan jika berbeda.
  4. serupa untuk huruf besar.
  5. jika tidak ada variabel di kedua konteks, ia menganggap tidak ada proxy dan menginformasikan tentang itu.
  6. kubeadm menulis file manifes (saya berasumsi ini dilakukan sebelum membuat kontainer buruh pelabuhan) dengan proxy yang diberikan, memberikan preferensi ke pengaturan lingkungan proses dalam huruf kecil, lalu huruf besar, lalu huruf kecil / etc / environment, lalu huruf besar / etc /lingkungan Hidup.
  7. kubeadm memulai pod.
  8. kubeadm memeriksa apakah controller-manager dapat berbicara dengan server api. Jika mendapat "dilarang" atau "batas waktu" itu mengasumsikan pengaturan proxy salah dan erros , memanggil kubeadm reset internal.
  9. tidak ada peristiwa di mana ia hanya menunggu selamanya tanpa keluaran apa pun. Setidaknya dapat diketahui dengan baik apakah ada kesalahan terus menerus dalam log api-server dan controller-manager, serta apakah ada log baru selama> = 10 menit. Dan kemudian itu bisa error dengan pesan kesalahan yang sesuai.
  10. kubeadm internal pra pends beriklan alamat untuk semua no_proxy pengaturan (tambahkan akhirnya mungkin mendapatkan potongan). <- Juga akan jauh lebih baik menggunakan nama host jika memungkinkan, karena no_proxy sebenarnya dimaksudkan untuk nama, bukan IP.

Saya benar-benar tidak dapat mengungkapkan berapa jam kerja yang akan menyelamatkan orang-orang di jaringan perusahaan.

help wanted prioritbacklog

Komentar yang paling membantu

Saya "memperbaiki" masalah ini dengan memasukkan semua IP node cluster saya di NO_PROXY dan menggunakan NO_PROXY yang sama pada semua antek saat bergabung dengan cluster.

$ ekspor NO_PROXY = 'ip, ip, ip, ip, .example.com'
[master] $ kubeadm init
[antek] $ kubeadm bergabung --token = {token} abcd: 6443

Sejujurnya, saya tidak yakin apakah itu semua alamat IP yang disebutkan atau .example.com yang memperbaiki masalah.

Semua 13 komentar

@erikbgithub Terima kasih banyak untuk masalah ini!
Di depan saya harus mengatakan bahwa saya bukan ahli proxy karena saya belum banyak bereksperimen di lingkungan seperti itu.

Jadi saya benar-benar tidak dapat mengomentari pernyataan persis di atas, tetapi saya akan sangat senang jika Anda ingin berkontribusi pada kubeadm untuk membuat perilaku di balik proxy menjadi lebih baik.

Untuk menjawab pertanyaan Anda, berikut ini kode go yang relevan:
https://github.com/kubernetes/kubernetes/blob/master/cmd/kubeadm/app/phases/controlplane/manifests.go#L432

func getProxyEnvVars() []v1.EnvVar {
    envs := []v1.EnvVar{}
    for _, env := range os.Environ() {
        pos := strings.Index(env, "=")
        if pos == -1 {
            // malformed environment variable, skip it.
            continue
        }
        name := env[:pos]
        value := env[pos+1:]
        if strings.HasSuffix(strings.ToLower(name), "_proxy") && value != "" {
            envVar := v1.EnvVar{Name: name, Value: value}
            envs = append(envs, envVar)
        }
    }
    return envs
}

https://github.com/kubernetes/kubernetes/blob/master/cmd/kubeadm/app/preflight/checks.go#L291

// HTTPProxyCheck checks if https connection to specific host is going
// to be done directly or over proxy. If proxy detected, it will return warning.
type HTTPProxyCheck struct {
    Proto string
    Host  string
    Port  int
}

func (hst HTTPProxyCheck) Check() (warnings, errors []error) {

    url := fmt.Sprintf("%s://%s:%d", hst.Proto, hst.Host, hst.Port)

    req, err := http.NewRequest("GET", url, nil)
    if err != nil {
        return nil, []error{err}
    }

    proxy, err := http.DefaultTransport.(*http.Transport).Proxy(req)
    if err != nil {
        return nil, []error{err}
    }
    if proxy != nil {
        return []error{fmt.Errorf("Connection to %q uses proxy %q. If that is not intended, adjust your proxy settings", url, proxy)}, nil
    }
    return nil, nil
}

Saya benar-benar tidak dapat mengungkapkan berapa jam kerja yang akan menyelamatkan orang-orang di jaringan perusahaan.

Sangat setuju

cc @kad @timothysc

@luxas Terima kasih saya akan bekerja melalui itu ketika saya mendapatkan tuit bulat. Sebelum saya dapat menyediakan tambalan, saya perlu mempelajari beberapa cara, jadi saya akan sangat menghargai jika orang lain dapat masuk untuk saat ini. ;-)

Sub-pertanyaan pertama yang akan saya bahas adalah apa yang sebenarnya didapat melalui os.Environ() .

@erikbgithub Beri tahu saya jika Anda memerlukan bantuan dalam membuat tambalan dan saya akan membantu

@erikbgithub sebagai penulis asli cek tersebut, saya akan dengan senang hati menjawab pertanyaan apa pun.
Beberapa jawaban pertama:

  • kubeadm mendapatkan dan memeriksa lingkungan dari sesi Anda yang sedang berjalan. Anda dapat melihat apa yang Anda miliki jika Anda mengeksekusi $ env | grep -i _proxy= | sort . Misalnya di dalam firewall perusahaan kami, saya memiliki sesuatu seperti ini:
    !shell $ env | grep -i _proxy= | sort ALL_PROXY=http://proxy-ir.example.com:911 FTP_PROXY=http://proxy-ir.example.com:911 HTTPS_PROXY=http://proxy-ir.example.com:911 HTTP_PROXY=http://proxy-ir.example.com:911 NO_PROXY=.example.com all_proxy=http://proxy-ir.example.com:911 ftp_proxy=http://proxy-ir.example.com:911 http_proxy=http://proxy-ir.example.com:911 https_proxy=http://proxy-ir.example.com:911 no_proxy=.example.com $
  • Masalah biasa yang diinjak orang tanpa menyadarinya, bahwa variabel no_proxy TIDAK mendukung rentang jaringan. jadi menempatkan sesuatu seperti NO_PROXY=10.0.0.0/8, 192.168.0.0/16 tidak akan berpengaruh apa pun dan masih akan menghasilkan peringatan dalam pemeriksaan pra-penerbangan.
  • Perbedaan konten antara variabel kapital / kecil * _proxy tidak masalah. Kode Go yang menangani variabel lingkungan proxy memiliki logika internalnya yang mengurutkan prosesnya (seingat saya, huruf besar pertama, lalu huruf kecil, tetapi itu tidak masalah, Anda tidak dapat menjamin dalam urutan mana setiap aplikasi memprosesnya)
  • file seperti / etc / environment adalah distro-spesifik dan tidak dibaca oleh masing-masing biner. mereka dibaca dan dimasukkan ke dalam variabel lingkungan proses dengan skrip login, modul PAM, dll. Variabel lingkungan juga dapat berasal dari misalnya sesi SSH atau dari alat manajemen eksternal (seperti yang mungkin) saat memanggil biner lain, seperti kubeadm. Jadi, bergantung pada lingkungan / etc / tertentu atau serupa tidak mungkin atau logis.
  • Untuk 8 poin, pemeriksaan preflight secara khusus tentang itu. Ini memberi peringatan jika kubeadm mendeteksi bahwa itu melewati proxy ke server API. Meskipun pada awalnya diskusi tentang pemeriksaan pra-penerbangan ini, disepakati bahwa kasus-kasus tersebut mungkin sah, sehingga hanya memperingatkan , tidak menghasilkan kesalahan.
  • untuk 10: itu juga keberatan tentang memanipulasi variabel-variabel itu dari banyak orang. (Ide awal saya adalah menghapus semua * _proxy pengaturan untuk memaksa koneksi langsung, tetapi ditolak, karena mungkin alasan yang sah untuk terhubung melalui proxy).

Saya "memperbaiki" masalah ini dengan memasukkan semua IP node cluster saya di NO_PROXY dan menggunakan NO_PROXY yang sama pada semua antek saat bergabung dengan cluster.

$ ekspor NO_PROXY = 'ip, ip, ip, ip, .example.com'
[master] $ kubeadm init
[antek] $ kubeadm bergabung --token = {token} abcd: 6443

Sejujurnya, saya tidak yakin apakah itu semua alamat IP yang disebutkan atau .example.com yang memperbaiki masalah.

jika PR kubernetes / kubernetes # 52788 akan digabungkan, dimungkinkan untuk menentukan dalam rentang IP NO_PROXY untuk node Anda. itu akan menyederhanakan banyak hal.

Sedikit lelah. jika saya melihat kode "checks.go".
Itu selalu mengembalikan pesan kesalahan jika ada nilai di proxy.

jika proxy! = nil {
return [] error {fmt.Errorf ("Sambungan ke% q menggunakan proxy% q. Jika itu tidak diinginkan, sesuaikan pengaturan proxy Anda", url, proxy)}, nihil
}
kembali nihil, nihil

Di perusahaan ... pasti ada tiga opsi proxy. (http_proxy, https_proxy, no_proxy)
http_ * adalah opsi wajib untuk menarik gambar untuk koneksi ke internet.
jika ada opsi no_proxy disetel ... maka itu harus mengembalikan pesan kesalahan.

"pl, setel opsi (no_proxy) agar tidak diarahkan ke proxy untuk koneksi internal"

Saya ingin bertanya apakah kubeadm join mendukung http_proxy?

Saya berhasil membuat kubeadm init bekerja dengan http_proxy dan no_proxy tetapi tampaknya kubeadm bergabung menghasilkan kesalahan seperti

kubelet.go:2105] Container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized

remote_runtime.go:92] RunPodSandbox from runtime service failed: rpc error: code = Unknown desc = failed pulling image "gcr.io/google_containers/pause-amd64:3.0": Get https://gcr.io/v1/_ping: read tcp <my-ip>:58742->74.125.68.82:443: read: connection reset by peer

dan juga
/ etc / environment kosong alih-alih diisi dengan konfigurasi seperti di master.

yang membuat saya percaya mungkin http_proxy dan no_proxy belum didukung untuk bergabung dengan kubeadm.

Mengalami masalah ini sekali lagi. Itu masih menggunakan proxy secara tidak benar dan saya tampaknya tidak dapat mengubah pengaturan proxy dan no_proxy.

Dari pengalaman saya, kubeadm menggunakan proxy yang didefinisikan di / etc / environment

Dari pengalaman saya, kubeadm menggunakan proxy yang didefinisikan di / etc / environment

Yup - dalam kasus saya ini juga / etc / environment

Apakah halaman ini membantu?
0 / 5 - 0 peringkat