Назад | Перейти на главную страницу

Как я могу списать главный узел Kubernetes, оставив его обычным узлом для присоединения к новому кластеру?

У меня есть машина, работающая как мастер Kubernetes. Это также узел в своем кластере. Я хочу остановить все мастерские вещи и оставить его как узел, к которому я могу присоединиться в другом месте. У меня также есть следующие ограничения:

  1. Нет доступа в Интернет (поэтому я не могу загружать на него программное обеспечение из репозиториев).
  2. "Мастер" в настоящее время настроен для подсеть, в которой нет поэтому я не могу разговаривать с ним (как есть) с kubectl.

Я надеюсь, что смогу просто systemctl stop некоторые услуги (например, etcd, kube-{apiserver,controller-manager,scheduler} и / или какие-то докер-контейнеры и все. (Плюс тогда kubeadm reset и, конечно же, запустить новый скрипт соединения.) Но на данном этапе я даже не знаю, systemctl stop в службах не позволяет запускать контейнеры докеров, или наоборот.

(Конечно, если требуется больше, чтобы полностью `` сбросить '' это, чтобы он был простым узлом, чем просто kubeadm reset - например, удаление файлов конфигурации - объясните, пожалуйста, и это.)

[Kubernetes v1.11.10, Ubuntu 16.04]

(Если, чтобы ответить на вопрос, вам нужно знать, как я застрял таким образом, я могу отредактировать этот ответ, чтобы добавить это, но в настоящее время мне кажется, что нет необходимости отвечать, и это утомительно.)

(Также, пожалуйста, не предлагайте начинать заново, включая восстановление подключения к Интернету - например, для загрузки программного обеспечения - потому что этого не может быть.)

Я тестировал этот сценарий на Kubernetes v1.15.3.

$ kubectl version
Client Version: version.Info{Major:"1", Minor:"15", GitVersion:"v1.15.3", GitCommit:"2d3c76f9091b6bec110a5e63777c332469e0cba2", GitTreeState:"clean", BuildDate:"2019-08-19T11:13:54Z", GoVersion:"go1.12.9", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"15", GitVersion:"v1.15.3", GitCommit:"2d3c76f9091b6bec110a5e63777c332469e0cba2", GitTreeState:"clean", BuildDate:"2019-08-19T11:05:50Z", GoVersion:"go1.12.9", Compiler:"gc", Platform:"linux/amd64"}

я сделал kubeadm reset на главном узле.

$ kubeadm reset
[reset] Reading configuration from the cluster...
[reset] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -oyaml'
[reset] WARNING: Changes made to this host by 'kubeadm init' or 'kubeadm join' will be reverted.
[reset] Are you sure you want to proceed? [y/N]: y
[preflight] Running pre-flight checks
[reset] Removing info for node "instance-1" from the ConfigMap "kubeadm-config" in the "kube-system" Namespace
W0821 11:34:26.923767   22594 removeetcdmember.go:61] [reset] failed to remove etcd member: error syncing endpoints with etc: etcdclient: no available endpoints
.Please manually remove this etcd member using etcdctl
[reset] Stopping the kubelet service
[reset] Unmounting mounted directories in "/var/lib/kubelet"
[reset] Deleting contents of config directories: [/etc/kubernetes/manifests /etc/kubernetes/pki]
[reset] Deleting files: [/etc/kubernetes/admin.conf /etc/kubernetes/kubelet.conf /etc/kubernetes/bootstrap-kubelet.conf /etc/kubernetes/controller-manager.conf /etc/kubernetes/scheduler.conf]
[reset] Deleting contents of stateful directories: [/var/lib/etcd /var/lib/kubelet /etc/cni/net.d /var/lib/dockershim /var/run/kubernetes]

The reset process does not reset or clean up iptables rules or IPVS tables.
If you wish to reset iptables, you must do so manually.
For example:
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X

If your cluster was setup to utilize IPVS, run ipvsadm --clear (or similar)
to reset your system's IPVS tables.

The reset process does not clean your kubeconfig files and you must remove them manually.
Please, check the contents of the $HOME/.kube/config file.

Как рекомендовано, я сбросил iptables и удалил $HOME/.kube/ каталог.

После этого я присоединил сервер к другому кластеру в качестве рабочего узла, используя kubeadm join:

$ kubeadm join 10.128.15.232:6443 --token <CUT> --discovery-token-ca-cert-hash sha256:<CUT>
[preflight] Running pre-flight checks
        [WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/
        [WARNING SystemVerification]: this Docker version is not on the list of validated versions: 19.03.1. Latest validated version: 18.09
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -oyaml'
[kubelet-start] Downloading configuration for the kubelet from the "kubelet-config-1.15" ConfigMap in the kube-system namespace
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Activating the kubelet service
[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...

This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.

Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

Кажется, это работает нормально, и, как описано в документации kubeadm сбросить.

Запустите это, чтобы отменить любые изменения, сделанные на этом хосте с помощью «kubeadm init» или «kubeadm join».

Команда «сброс» выполняет следующие фазы:

preflight              Run reset pre-flight checks
update-cluster-status  Remove this node from the ClusterStatus object.
remove-etcd-member     Remove a local etcd member.
cleanup-node           Run cleanup node.
$ kubectl get nodes
NAME         STATUS   ROLES    AGE     VERSION
instance-1   Ready    <none>   5m36s   v1.15.3
node2        Ready    master   18m     v1.15.3

Если вы обновили свой k8s до v1.15.0, вы можете использовать kubeadm reset phase.

command с целью сделать kubeadm более модульным. Эта модульность позволяет запускать элементарные подэтапы процесса сброса. Следовательно, вы можете позволить kubeadm сделать некоторые части и заполнить себя там, где вам нужны настройки.

kubeadm reset phase согласуется с рабочий процесс сброса kubeadm, и за сценой оба используют один и тот же код.