내 작업자 노드에 SSH를 설정할 수 없는 이유는 무엇입니까?
가상 사설 클라우드 전통적인 인프라
SSH 연결을 사용하여 작업자 노드에 액세스할 수 없습니다.
비밀번호에 의한 SSH를 작업자 노드에서 사용할 수 없습니다.
모든 워커 노드에서 작업을 실행하려면 Kubernetes 를 사용하거나 DaemonSet를 사용하거나, 일회성 작업의 경우 'jobs'를 사용하십시오.
디버깅 및 문제 해결을 위해 작업자 노드에 대한 호스트 액세스 권한을 얻으려면 다음 옵션을 검토하십시오.
oc debug를 사용하여 디버깅
oc debug node 명령을 사용하여 문제를 해결하려는 작업자 노드에 대한 권한이 있는 securityContext를 포함하는 팟(Pod)을 배치하십시오.
디버그 팟(Pod)은 팟(Pod)이 작성된 후 즉시 작업자 노드에 액세스할 수 있도록 대화식 쉘과 함께 배치됩니다. oc debug node 명령이 작동하는 방식에 대한 자세한 정보는 이 Red Hat 블로그 게시물을
참조하십시오.
-
액세스하려는 작업자 노드의 이름을 가져오십시오. CoreOS 작업자 노드의 경우 이름은 작업자의 호스트 이름입니다. 다른 모든 작업자 노드의 경우 작업자 노드 이름은 사설 IP 주소입니다.
oc get nodes -o wide -
호스트 액세스 권한이 있는 디버그 팟(Pod)을 작성하십시오. 팟(Pod)이 작성될 때 팟(Pod)의 대화식 쉘이 자동으로 열립니다.
oc debug node명령이 실패하는 경우 옵션 2로 진행하십시오.oc debug node/<NODE_NAME>oc debug node/<NODE_NAME>명령이 실패하면 기본 컨테이너 이미지를 가져오지 못하게 하는 보안 그룹, ACL 또는 방화벽 규칙이 있을 수 있습니다.--image=us.icr.io/armada-master/network-alpine:latest옵션을 지정하여 명령을 다시 실행해 보세요. 이 옵션은 사설 네트워크를 통해 액세스할 수 있는 IBM Cloud Container Registry 의 이미지를 사용합니다. -
정보를 수집하고 문제를 해결하는 데 도움을 받으려면 디버그 명령을 실행하십시오.
tcpdump,curl,ip,ifconfig,nc,ping및ps와 같이 디버그에 사용할 수 있는 명령은 이미 쉘에서 사용 가능합니다. 또한yum install <tool>명령을 실행하여mtr및conntrack와 같은 다른 도구들도 설치할 수 있습니다.
kubectl exec를 사용하여 디버깅
oc debug node 명령을 사용할 수 없는 경우 권한 있는 securityContext를 포함하는 Alpine 팟(Pod)을 작성하고 kubectl exec 명령을 사용하여 팟(Pod)의 대화식 쉘에서 디버그 명령을 실행할 수 있습니다.
-
액세스하려는 작업자 노드의 이름을 가져오십시오. CoreOS 작업자 노드의 경우 이름은 작업자의 호스트 이름입니다. 다른 모든 작업자 노드의 경우 작업자 노드 이름은 사설 IP 주소입니다.
oc get nodes -o wide -
이 이름을 환경 변수로 내보내십시오.
export NODE=<NODE_NAME> -
작업자 노드에서 디버그 팟(Pod)을 작성하십시오. 다음 Docker alpine 이미지가 예로 사용됩니다. 워커 노드가 공용 네트워크에 접속할 수 없는 경우, 디버깅을 위해 자체 ICR 저장소에 이미지 사본을 보관하거나, 필요에 따라 다른 도구를 사용하여 맞춤형 이미지를 빌드할 수 있습니다.
kubectl apply -f - << EOF apiVersion: v1 kind: Pod metadata: name: debug-${NODE} namespace: default spec: tolerations: - operator: "Exists" hostNetwork: true containers: - args: ["-c", "sleep 20d"] command: ["/bin/sh"] image: us.icr.io/armada-master/network-alpine:latest imagePullPolicy: Always name: debug securityContext: privileged: true volumeMounts: - mountPath: /host name: host-volume volumes: - name: host-volume hostPath: path: / nodeSelector: kubernetes.io/hostname: ${NODE} restartPolicy: Never EOF -
디버그 팟(Pod)에 로그인하십시오. 이 팟(Pod)의 대화식 쉘이 자동으로 열립니다.
kubectl exec명령이 실패하는 경우 옵션 3으로 진행하십시오.kubectl exec -it debug-${NODE} -- sh워커 노드에서 로그나 기타 파일을 가져오려면 다음 형식에 따라
kubectl cp명령을 사용하십시오. 다음 예제는 워커 노드의 호스트 파일 시스템에서/var/log/messages파일을 가져옵니다.oc cp default/debug-${NODE}:/host/var/log/messages ./messages다음 로그를 가져와서 작업자 노드에 대한 문제를 찾으십시오.
/var/log/messages /var/log/kubelet.log /var/log/crio.log /var/log/calico/cni/cni.log -
정보를 수집하고 문제를 해결하는 데 도움을 받으려면 디버그 명령을 실행하십시오.
dig,tcpdump,mtr,curl,ip,ifconfig,nc,ping,ps등과 같이 디버깅에 사용할 수 있는 명령어들은 셸에서 이미 사용할 수 있습니다.apk add <tool>를 실행하여conntrack와 같은 다른 도구도 설치할 수 있습니다. 예를 들어,conntrack를 추가하려면 ` `apk add conntrack-tools를 실행하십시오. -
디버깅을 위해 작성한 호스트 액세스 팟(Pod)을 삭제하십시오.
kubectl delete pod debug-${NODE}
작업자 노드에서 루트 SSH 액세스를 사용으로 설정하여 디버깅
클러스터 마스터와 작업자 노드 간의 VPN 연결이 중단된 경우와 같이 oc debug node 또는 kubectl exec 명령을 사용할 수 없는 경우에는 루트 SSH 액세스를 가능하게 하고 SSH 액세스를 위해 작업자 노드에 공개 SSH 키를 복사하는 팟(Pod)을 작성할 수 있습니다.
루트 SSH 액세스를 허용하는 것은 보안 위험입니다. SSH 액세스가 필요하며 작업자 노드 문제를 해결하는 데 사용 가능한 다른 옵션이 없는 경우에만 이를 허용하십시오. 문제점 해결을 완료하고 나면 디버깅 후 정리 절의 단계에 따라 SSH 액세스를 사용 안함으로 설정하십시오.
-
기존 공용 SSH 키를 선택하거나 새로 작성하십시오.
ssh-keygen -f /tmp/id_rsa_cluster_worker -t rsa -b 4096 -C temp-worker-ssh-key -P '' ls /tmpid_rsa_cluster_worker id_rsa_cluster_worker.pubcat /tmp/id_rsa_cluster_worker.pub -
액세스하려는 작업자 노드의 이름을 가져오십시오. CoreOS 작업자 노드의 경우 이름은 작업자의 호스트 이름입니다. 다른 모든 작업자 노드의 경우 작업자 노드 이름은 사설 IP 주소입니다.
oc get nodes -o wide -
디버그 팟(Pod)에 대해 다음 YAML 파일을 작성하고 이 파일을
enable-ssh.yaml로 저장하십시오.<NODE_NAME>을 작업자 노드 이름으로 바꾸고SSH_PUBLIC_KEY에 대한 예제value를 공개 SSH 키로 바꾸십시오. 다음 Docker alpine 이미지가 예로 사용됩니다. 워커 노드가 공용 네트워크에 접속할 수 없는 경우, 디버깅을 위해 이미지 사본을 자체 ICR 저장소에 보관하거나, 필요에 맞게 다른 도구를 사용하여 맞춤형 이미지를 빌드할 수 있습니다.apiVersion: v1 kind: Pod metadata: name: enable-ssh-<NODE_NAME> labels: name: enable-ssh spec: tolerations: - operator: "Exists" hostNetwork: true hostPID: true hostIPC: true containers: - image: us.icr.io/armada-master/network-alpine:latest env: - name: SSH_PUBLIC_KEY value: "<ssh-rsa AAA...ZZZ temp-worker-ssh-key>" args: ["-c", "echo $(SSH_PUBLIC_KEY) | tee -a /root/.ssh/authorized_keys && sed -i 's/^#*PermitRootLogin.*/PermitRootLogin yes/g' /host/etc/ssh/sshd_config && sed -i 's/^#*PermitRootLogin.*/PermitRootLogin yes/g' /host/etc/ssh/sshd_config.d/40-rhcos-defaults.conf || true && killall -1 sshd || yes n | ssh-keygen -f /host/etc/ssh/ssh_host_rsa_key -t rsa -b 4096 -C temp-server-ssh-key -P '' && while true; do sleep 86400; done"] command: ["/bin/sh"] name: enable-ssh securityContext: privileged: true volumeMounts: - mountPath: /host name: host-volume - mountPath: /root/.ssh name: ssh-volume volumes: - name: host-volume hostPath: path: / - name: ssh-volume hostPath: path: /root/.ssh nodeSelector: kubernetes.io/hostname: <NODE_NAME> restartPolicy: Never -
클러스터에서 팟(Pod)을 작성하십시오. 이 팟(Pod)이 작성되면 공개 키가 작업자 노드에 추가되고 SSH가 루트 SSH 로그인을 허용하도록 구성됩니다.
oc apply -f enable-ssh.yaml -
사설 또는 공용 네트워크를 사용하여 SSH 키를 통해 작업자 노드에 액세스하십시오.
사설 네트워크의 작업자에 대한 SSH
작업자 노드와 동일한 사설 네트워크에 대한 액세스 권한이 있는 기존 서버 인스턴스를 선택하거나 새로 작성하십시오. VPC 클러스터의 경우, 가상 서버 인스턴스는 워커 노드와 동일한 VPC 내에 존재해야 합니다.
클래식 클러스터의 경우, 가상 라우터 기능(VRF) 또는 VLAN 스패닝이 활성화된 상태라면 장치는 어떤 사설 VLAN에서든 워커 노드에 액세스할 수 있습니다. 그렇지 않은 경우에는 디바이스가 작업자 노드와 동일한 사설 VLAN에 있어야 합니다.
-
1단계의 SSH 개인 키를 로컬 시스템에서 이 서버 인스턴스로 복사하십시오.
scp <SSH_private_key_location> <user@host>:/.ssh/id_rsa_worker_private -
서버 인스턴스에 SSH로 연결하십시오.
-
복사한 SSH 개인 키를 사용하는 데 필요한 올바른 권한을 설정하십시오.
chmod 400 ~/.ssh/id_rsa_worker_private -
개인 키를 사용하여, 2단계에서 찾은 작업자 노드에 SSH를 통해 연결하십시오.
ssh -i ~/.ssh/id_rsa_worker_private root@<WORKER_PRIVATE_IP>
공용 네트워크의 작업자 노드에 대한 SSH
작업자 노드에 로그인하여 공용 VLAN에 연결되는 클래식 클러스터를 디버그하십시오.
-
Calico CLI를 설치 및 구성하고 Calico 명령을 실행할 수 있도록 클러스터의 컨텍스트를 설정하십시오.
-
포트 22에서의 인바운드 SSH 트래픽을 허용하기 위해
ssh-open이라는 Calico 글로벌 네트워크 정책을 작성하십시오.calicoctl apply -f - <<EOF apiVersion: projectcalico.org/v3 kind: GlobalNetworkPolicy metadata: name: ssh-open spec: selector: ibm.role == 'worker_public' ingress: - action: Allow protocol: TCP destination: ports: - 22 order: 1500 EOF -
작업자 노드의 공용 IP 주소를 가져오십시오.
oc get nodes -o wide -
공용 IP 주소를 통해 작업자 노드에 SSH로 연결하십시오.
ssh -i <SSH_private_key_location> root@<WORKER_PUBLIC_IP> -
ip,ifconfig,ping,ps,curl등과 같은 디버그 명령을 실행하여 정보를 수집하고 문제를 해결하십시오.yum install <tool>를 실행하여 기본적으로 설치되지 않을 수 있는 기타 도구 (예:tcpdump또는nc) 를 설치할 수도 있습니다.
디버깅 후 정리
디버깅을 완료하고 나면 리소스를 정리하여 SSH 액세스를 사용 안함으로 설정하십시오.
-
SSH 인에이블먼트 팟(Pod)을 삭제하십시오.
oc delete pod enable-ssh-<NODE_NAME> -
공용 네트워크를 통해 작업자 노드에 액세스한 경우에는 포트 22가 다시 차단되도록 Calico 정책을 삭제하십시오.
calicoctl delete gnp ssh-open [-c <path_to_calicoctl_cfg>/calicoctl.cfg] -
원래 SSH 구성이 사용되고 추가한 SSH 키가 제거되도록 클래식 작업자 노드를 다시 로드하거나 VPC 작업자 노드를 대체하십시오.