Kubeadm: D'où kubeadm prend-il les paramètres de proxy?

Créé le 28 juin 2017  ·  13Commentaires  ·  Source: kubernetes/kubeadm

Ce n'est pas / etc / environment, ce n'est pas la session bash actuelle dans laquelle s'exécute kubeadm, ce n'est pas l'environnement docker ou kubelet. J'ai vérifié cela en définissant no_proxy sur une valeur différente dans toutes ces instances. Et pour une raison quelconque, après un kubeadm init il continue à définir une autre valeur pour no_proxy . Redémarrer, recharger le démon, redémarrer les services ne change rien à cela.

Honnêtement, c'est vraiment ennuyeux qu'il n'affiche que la ligne "l'adresse IP fo.oo.ba.rr a un proxy défini sur blubb" au lieu de dire d'où il prend la valeur. Et pourquoi ne lit-il pas simplement la valeur de / etc / environment, qui est la seule vraie source de vérité en ce qui concerne la configuration du proxy, ou la session bash actuelle dans laquelle j'appelle kubeadm qui est la plus simple endroit pour apporter des modifications?

Ce à quoi j'attends serait quelque chose comme ceci:

  1. kubeadm vérifie la variable d'environnement actuelle http_proxy . (ou https_proxy si la communication sécurisée est configurée)
  2. kubeadm vérifie la variable d'environnement actuelle HTTP_PROXY et avertit si elle est différente.
  3. kubeadm vérifie http_proxy dans / etc / environment. Il avertit si c'est différent.
  4. similaire pour les majuscules.
  5. s'il n'y a aucune variable dans aucun des deux contextes, il suppose qu'il n'y a pas de proxy et en informe .
  6. kubeadm écrit les fichiers manifestes (je suppose que cela est fait avant de créer les conteneurs docker) avec le proxy donné, en donnant la préférence au paramètre d'environnement de processus en minuscules, puis en majuscules, puis en minuscules / etc / environment, puis en majuscules / etc /environnement.
  7. kubeadm démarre les pods.
  8. kubeadm vérifie si le contrôleur-gestionnaire peut parler au serveur api. S'il obtient un "interdit" ou un "timeout", il suppose que les paramètres du proxy sont incorrects et des erreurs , appelant un kubeadm reset interne.
  9. il n'y a pas d'événement où il attend indéfiniment sans aucune sortie. Il peut au moins raisonnablement bien déterminer s'il y a des erreurs continues dans les journaux du serveur api et du gestionnaire de contrôleur, ainsi que s'il y a de nouveaux journaux pendant> = 10 minutes. Et puis il peut l'erreur avec un message d'erreur correspondant.
  10. kubeadm interne pré Pends la publicité adresse à tous les no_proxy paramètres (ajoutez la fin , il peut se couper de). <- De plus, il serait tellement préférable d'utiliser un nom d'hôte si possible, puisque no_proxy est en fait destiné aux noms, pas aux adresses IP.

Je ne peux sérieusement pas exprimer combien d'heures de travail cela permettrait aux gens dans les réseaux d'entreprise.

help wanted prioritbacklog

Commentaire le plus utile

J'ai "résolu" ce problème en incluant toutes les adresses IP de mes nœuds de cluster dans NO_PROXY et en utilisant le même NO_PROXY sur tous les sbires lors de la jonction du cluster.

$ export NO_PROXY = 'ip, ip, ip, ip, .example.com'
[maître] $ kubeadm init
[minion] $ kubeadm join --token = {token} abcd: 6443

Pour être honnête, je ne sais pas si ce sont toutes les adresses IP énumérées ou le .example.com qui a résolu le problème.

Tous les 13 commentaires

@erikbgithub Merci beaucoup pour ce numéro!
D'emblée, je dois dire que je ne suis pas un expert en proxy car je n'ai pas beaucoup expérimenté dans de tels environnements.

Je ne peux donc pas vraiment commenter les déclarations exactes ci-dessus, mais je serais très heureux si vous vouliez contribuer à kubeadm pour améliorer le comportement derrière un proxy.

Pour répondre à votre question, voici le code go correspondant:
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
}

Je ne peux sérieusement pas exprimer combien d'heures de travail cela permettrait aux gens dans les réseaux d'entreprise.

Je ne pourrais pas être plus d'accord

cc @kad @timothysc

@luxas Merci, je travaillerai là-

La première sous-question que je vais examiner est ce que go obtient réellement via os.Environ() .

@erikbgithub Faites-moi savoir si vous avez besoin d'aide pour créer des correctifs et je vous aiderai

@erikbgithub en tant qu'auteur original de ce chèque, je serai ravi de répondre à toutes vos questions.
Premières réponses:

  • kubeadm obtient et vérifie l'environnement de votre session en cours d'exécution. Vous pouvez voir ce que vous avez si vous exécutez $ env | grep -i _proxy= | sort . Par exemple, à l'intérieur du pare-feu de notre entreprise, j'ai quelque chose comme ceci:
    !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 $
  • Problème habituel sur lequel les gens marchent sans s'en rendre compte, que la variable no_proxy ne prend PAS en charge les plages réseau. donc mettre quelque chose comme NO_PROXY=10.0.0.0/8, 192.168.0.0/16 n'aura aucun effet et produira toujours un avertissement lors de la vérification avant vol.
  • La différence de contenu entre les variables majuscules / minuscules * _proxy n'a pas d'importance. Le code Go qui gère les variables d'environnement proxy a sa logique interne dans quel ordre il le traite (comme je me souviens, d'abord en majuscules, puis en minuscules, mais cela ne devrait pas avoir d'importance, vous ne pouvez pas garantir dans quel ordre chaque application les traite)
  • les fichiers comme / etc / environment sont spécifiques à la distribution et ne sont pas lus par chaque binaire individuel. ils sont lus et injectés dans les variables d'environnement de processus par des scripts de connexion, des modules PAM, etc. Les variables d'environnement peuvent également provenir, par exemple, de sessions SSH ou d'outils de gestion externes (comme ansible) tout en appelant d'autres binaires, comme kubeadm. Donc, être dépendant d'un / etc / environnement particulier ou similaire n'est ni faisable ni logique.
  • Pour 8 points, la vérification avant le vol concerne spécifiquement cela. Il donne un avertissement si kubeadm détecte qu'il passe par proxy vers le serveur API. Alors qu'il s'agissait au départ de discussions sur ce contrôle avant le vol, il a été convenu que ces cas pourraient être légitimes, donc cela ne fait qu'alerter et ne pas produire d'erreur.
  • pour 10: c'était aussi des objections sur la manipulation de ces variables à partir de plusieurs personnes. (mon idée initiale était de supprimer tous les paramètres * _proxy pour forcer les connexions directes, mais cela a été refusé, car cela pourrait être des raisons légitimes de se connecter via des proxys).

J'ai "résolu" ce problème en incluant toutes les adresses IP de mes nœuds de cluster dans NO_PROXY et en utilisant le même NO_PROXY sur tous les sbires lors de la jonction du cluster.

$ export NO_PROXY = 'ip, ip, ip, ip, .example.com'
[maître] $ kubeadm init
[minion] $ kubeadm join --token = {token} abcd: 6443

Pour être honnête, je ne sais pas si ce sont toutes les adresses IP énumérées ou le .example.com qui a résolu le problème.

si PR kubernetes / kubernetes # 52788 sera fusionné, il sera possible de spécifier dans NO_PROXY les plages IP de vos nœuds. cela simplifiera beaucoup les choses.

Un peu bizarre. si je regarde dans le code "checks.go".
il renvoie toujours un message d'erreur s'il y a une valeur dans le proxy.

si proxy! = nil {
return [] error {fmt.Errorf ("La connexion à% q utilise le proxy% q. Si ce n'est pas prévu, ajustez vos paramètres de proxy", url, proxy)}, nil
}
retour nul, nul

En entreprise ... il y a forcément trois options de proxy. (http_proxy, https_proxy, no_proxy)
http_ * est une option obligatoire pour extraire des images pour la connexion à Internet.
si l'option no_proxy est définie ... alors elle devrait renvoyer un message d'erreur.

"pl, définissez l'option (no_proxy) pour ne pas être acheminée vers le proxy pour la connexion interne"

Je veux demander si kubeadm join prend en charge http_proxy?

Je parviens à faire fonctionner kubeadm init avec http_proxy et no_proxy mais il semble que kubeadm join produise des erreurs telles que

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

et aussi
/ etc / environment est vide au lieu d'être rempli de configuration comme dans le master.

ce qui me laisse croire que peut-être http_proxy et no_proxy ne sont pas encore pris en charge pour la jointure kubeadm.

Rencontrer ce problème une fois de plus. Il utilise toujours le proxy de manière incorrecte et il semble que je ne puisse pas modifier les paramètres de proxy et de no_proxy.

D'après mon expérience, kubeadm utilise le proxy défini dans / etc / environment

D'après mon expérience, kubeadm utilise le proxy défini dans / etc / environment

Ouais - dans mon cas, c'est aussi / etc / environment

Cette page vous a été utile?
0 / 5 - 0 notes