
Instalei um cluster kubernetes (v1.20.0) com 3 mestres e 3 nós usando kubeadm init
e kubeadm join
, todos no Ubuntu 20.04. Agora preciso atualizar a configuração e
- Adicione
--cloud-provider=external
o sinalizador de inicialização do kubelet em todos os nós, pois irei usardriver vsphere-csi - Alterar
--service-cidr
devido aos requisitos da rede
No entanto, não tenho certeza de qual é a maneira correta de fazer essas alterações.
Kubelet
Olhando para /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
lá, há uma referência, /etc/default/kubelet
mas é considerado um último recurso e recomenda a atualização .NodeRegistration.KubeletExtraArgs
:
...
# This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably, the user should use
# the .NodeRegistration.KubeletExtraArgs object in the configuration files instead. KUBELET_EXTRA_ARGS should be sourced from this file.
EnvironmentFile=-/etc/default/kubelet
...
Onde fica isso .NodeRegistration.KubeletExtraArgs
e como posso alterá-lo para todos os nós do cluster?
plano de controle
Pelo que entendi, o apiserver e o controller-manager são executados como pods estáticos em cada master e leem suas configurações do /etc/kubernetes/manifests/kube-<type>.yaml
. Meu primeiro pensamento foi fazer as alterações necessárias nesses arquivos, no entanto, de acordo com os documentos do Kubernetes ematualizando um cluster kubeadm, kubeadm irá:
* Fetches the kubeadm ClusterConfiguration from the cluster.
* Optionally backups the kube-apiserver certificate.
* Upgrades the static Pod manifests for the control plane components.
Como alterei os manifestos manualmente, eles não são atualizados no ClusterConfiguration ( kubectl -n kube-system get cm kubeadm-config -o yaml
), minhas alterações sobreviveriam a uma atualização dessa forma? Suponho que também poderia editar o ClusterConfiguration manualmente, kubeadm edit cm ...
mas isso parece propenso a erros e é fácil esquecer de alterá-lo todas as vezes.
De acordo com os documentos, existe uma maneira depersonalizar a configuração do plano de controlemas isso parece ocorrer apenas na instalação do cluster pela primeira vez. Por exemplo, kubeadm config print init-defaults
como o nome sugere, forneça apenas os valores padrão, não o que está atualmente em execução no cluster. A tentativa de extrair o ClusterConfiguration kubectl -n kube-system get cm kubeadm-config -o yaml
e executá- kubeadm init --config <config>
lo falha de várias maneiras porque o cluster já está inicializado.
Kubeadm pode ser executadoplano de controle de fase inicialque atualiza os manifestos do pod estático, mas deixa o ClusterConfiguration intacto, então eu precisaria executar a upload-config
fase também.
Com base no exposto, o fluxo de trabalho parece ser
- Extraia o ClusterConfiguration
kubeadm -n kube-system get cm kubeadm-config
e salve-o em um arquivo yaml - Modifique o arquivo yaml com as alterações necessárias
- Aplicar alterações com
kubeadm init phase control-plane all --config <yaml>
- Carregar configuração modificada
kubeadm init phase upload-config all --config <yaml>
- Distribua o arquivo yaml modificado para todos os mestres
- Para cada master, inscreva-se com
kubeadm init phase control-plane all --config <yaml>
O que me preocupa aqui é a aparente desconexão entre os manifestos do pod estático e o ClusterConfiguration. As alterações não são feitas com muita frequência, por isso é muito fácil esquecer que alterar um local também exige alterações no outro - manualmente.
Não há como atualizar as configurações do kubelet e do plano de controle que garantam a consistência entre os componentes do kubernetes e o kubeadm? Ainda sou muito novo no Kubernetes e hábastantede documentação sobre isso, então me desculpe se perdi algo óbvio aqui.
Responder1
Tentarei responder a ambas as suas perguntas.
1. Adicione --cloud-provider=external sinalizador de inicialização do kubelet em todos os nós
Onde está este .NodeRegistration.KubeletExtraArgs e como posso alterá-lo para todos os nós do cluster?
KubeletExtraArgs
são quaisquer argumentos e parâmetros suportados pelo kubelet. Eles estão documentadosaqui. Você precisa usar o kubelet
comando com sinalizadores adequados para modificá-lo. Além disso, observe que o sinalizador que você está prestes a usar será removido no k8s v1.23:
--cloud-provider string
O provedor de serviços em nuvem. Defina como string vazia para execução sem provedor de nuvem. Se definido, o provedor de nuvem determina o nome do nó (consulte a documentação do provedor de nuvem para determinar se e como o nome do host é usado). (OBS.: será removido na versão 1.23, em favor da remoção do código do provedor de nuvem do Kubelet.)
EDITAR:
Para melhor responder à sua pergunta sobre:.NodeRegistration.KubeletExtraArgs
Estes também são elementos doarquivo de configuração de inicialização do kubeadm:
É possível configurar
kubeadm init
com um arquivo de configuração em vez de sinalizadores de linha de comando, e alguns recursos mais avançados podem estar disponíveis apenas como opções de arquivo de configuração. Este arquivo é passado usando o--config
flag e deve conter umaClusterConfiguration
estrutura e opcionalmente mais estruturas separadas por---\n
Mixar--config
com outros flags pode não ser permitido em alguns casos.
Você também pode encontrar mais detalhes sobre oNodeRegistrationOptionsbem como mais informações sobre os campos e uso da configuração.
Além disso, observe que:
KubeletExtraArgs
passa argumentos extras para o kubelet. Os argumentos aqui são passados para a linha de comando do kubelet por meio do arquivo de ambientekubeadm grava em tempo de execução para o kubelet ser fonte. Isso substitui a configuração genérica de nível base no kubelet-config-1.X
ConfigMap
Os sinalizadores têm prioridade mais alta durante a análise. Esses valores são locais e específicos do nó em que o kubeadm está sendo executado.
EDITAR2:
kubeadm init
deve ser usado apenas uma vez ao criar um cluster, sempre que você o usar com sinalizadores ou um arquivo de configuração. Você não pode alterar as configurações executando-as novamente com valores diferentes.Aquivocê encontrará informações sobre o kubeadm e seu uso. Depois que o cluster estiver configurado, o kubeadm deverá ser descartado e as alterações feitas diretamente nos manifestos do pod estático.
2. Altere --service-cidr devido aos requisitos de rede
Isso é mais complicado. Você poderia tentar fazer isso de forma semelhanteaquiouaquimas essa abordagem está sujeita a erros e não é recomendada.
A maneira mais viável e segura seria simplesmente recriar o cluster com kubeadm reset
e kubeadm init --service-cidr
. A opção de alterar automaticamente os CIDRs nem era esperada da perspectiva do Kubernetes. Então, em resumo, oredefinição do kubeadmé o caminho a seguir aqui.
Responder2
Em relação a
Entendo que KubletExtraArgs se refere aos argumentos da linha de comando do kubelet, o que não entendo é onde está esse atributo e como posso modificá-lo.
múltiplas fontes, comoEsteponto de adicionar
/etc/systemd/system/kubelet.service.d/10-kubeadm.conf
linhas como por exemplo
Environment="KUBELET_EXTRA_ARGS=--pod-manifest-path=/etc/kubelet.d/"
para definir o ambiente para um diretório personalizado para pods estáticos aqui, por exemplo, em vez de usar o cli com
kubelet --pod-manifest-path=/etc/kubelet.d
como sugere nos documentos.
Se você pesquisar no Google, $KUBELET_EXTRA_ARGS
encontrará muitos exemplos do 10-kubeadm.conf
arquivo mencionado acima.