마스터 Kubernetes 노드를 수용하는 베어메탈 서버가 있습니다. 마스터 노드를 새로운 베어메탈 서버로 이동해야 합니다. 어떻게 이동하거나 마이그레이션할 수 있나요?
난 내 일을 다 했어연구하지만 대부분은 이전 노드에서 새 노드로 4개의 디렉터리를 이동하고 IP도 변경하는 GCP 클러스터와 관련이 있으며 해당 질문은 5년 전에 요청되었으므로 지금은 구식입니다.
/var/etcd
/srv/kubernetes
/srv/sshproxy
/srv/salt-overlay
최신 k8s 버전 1.17을 사용한다고 가정하고 이동하는 올바른 방법은 무엇입니까?
답변1
수행원깃허브 문제댓글에서 언급한 것과Kubernetes 마스터 노드의 IP 주소 변경:
1. etcd data directory
다음 사항을 조사하고 있는지 확인하세요 etcd pod in kube-system namespace
.
(kubeadm으로 생성된 k8s v1.17.0을 사용한 기본값),
volumeMounts:
- mountPath: /var/lib/etcd
name: etcd-data
2. 준비:
- 복사
/etc/kubernetes/pki
하다마스터1~로새로운 Master2:
#create backup directory in Master2,
mkdir ~/backup
#copy from Master1 all key,crt files into the Master2
sudo scp -r /etc/kubernetes/pki [email protected]:~/backup
- ~에마스터2이전 IP 주소가 있는 키가 포함된 인증서를 제거하세요.apiserver 및 etcd 인증서:
./etcd/peer.crt
./apiserver.crt
rm ~/backup/pki/{apiserver.*,etcd/peer.*}
- 이동하다
pki directory to /etc/kubernetes
cp -r ~/backup/pki /etc/kubernetes/
삼. ~에마스터1만들다etcd 스냅샷:
다음을 확인하세요 API version
.
kubectl exec -it etcd-Master1 -n kube-system -- etcdctl version
etcdctl version: 3.4.3
API version: 3.4
- 전류를 사용하여etcd 포드:
kubectl exec -it etcd-master1 -n kube-system -- etcdctl --endpoints https://127.0.0.1:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key snapshot save /var/lib/etcd/snapshot1.db
- 사용하거나 사용하는etcdctl 바이너리:
ETCDCTL_API=3 etcdctl --endpoints https://127.0.0.1:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key snapshot save /var/lib/etcd/snapshot1.db
4. 생성된 스냅샷 복사마스터1에게마스터2백업 디렉터리:
scp ./snapshot1.db [email protected]:~/backup
5. 준비하다반영하기 위해 Kubeadm 구성마스터1구성:
apiVersion: kubeadm.k8s.io/v1beta2
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: x.x.x.x
bindPort: 6443
nodeRegistration:
name: master2
taints: [] # Removing all taints from Master2 node.
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns:
type: CoreDNS
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: k8s.gcr.io
kind: ClusterConfiguration
kubernetesVersion: v1.17.0
networking:
dnsDomain: cluster.local
podSubnet: 10.0.0.0/16
serviceSubnet: 10.96.0.0/12
scheduler: {}
6.스냅샷 복원:
etcd:3.4.3-0
도커 이미지 사용 :
docker run --rm \
-v $(pwd):/backup \
-v /var/lib/etcd:/var/lib/etcd \
--env ETCDCTL_API=3 \
k8s.gcr.io/etcd:3.4.3-0 \
/bin/sh -c "etcdctl snapshot restore './snapshot1.db' ; mv /default.etcd/member/ /var/lib/etcd/"
- 또는
etcdctl
바이너리를 사용하여:
ETCDCTL_API=3 etcdctl --endpoints https://127.0.0.1:2379 snapshot restore './snapshot1.db' ; mv ./default.etcd/member/ /var/lib/etcd/
7.초기화마스터2:
sudo kubeadm init --ignore-preflight-errors=DirAvailable--var-lib-etcd --config kubeadm-config.yaml
# kubeadm-config.yaml prepared in 5 step.
- 알아채다:
[WARNING DirAvailable--var-lib-etcd]: /var/lib/etcd is not empty
[certs] Generating "apiserver" certificate and key
[certs] apiserver serving cert is signed for DNS names [master2 kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.96.0.1 master2_IP]
[certs] Generating "etcd/server" certificate and key
[certs] etcd/server serving cert is signed for DNS names [master2 localhost] and IPs [master2_ip 127.0.0.1 ::1]
[certs] Generating "etcd/peer" certificate and key
[certs] etcd/peer serving cert is signed for DNS names [master2 localhost] and IPs [master2_ip 127.0.0.1 ::1]
.
.
.
Your Kubernetes control-plane has initialized successfully!
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
- k8s 객체 확인 후(간단한 예):
kubectl get nodes
kubectl get pods -o wide
kubectl get pods -n kube-system -o wide
systemctl status kubelet
- 포드, 배포 등과 같은 배포된 모든 k8s 개체가 새 개체로 이동된 경우마스터2마디:
kubectl drain Master1
kubectl delete node Master1
메모:
추가적으로 고려해 보세요고가용성 클러스터 생성이 설정에서는 2개 이상의 마스터에 대한 가능성이 있어야 하며, 이 구성에서는 보다 안전한 방법으로 추가 제어 평면 노드를 생성/제거할 수 있습니다.