스스로 K8S Cluster 구축하기

CHAN LIM·2023년 3월 28일
1

K8S

목록 보기
10/11

1. 전제 조건

  • 물리 PC 3대, Ubuntu Linux 2대, Windows 10 1대
  • Master Node는 Linux
  • 인터넷 접속
  • SSH
  • ContainerD

1.1 ContainerD를 선택한 이유

  • K8S가 1.20ver 이후로 Docker를 Container Runtime으로 더이상 지원하지 않습니다.

    • K8S는 컨테이너 런타임과 통신할 때 CRI라는 표준 인터페이스 API를 사용하지만,
      Docker는 이를 지원하지 않았기 때문에 중간에 Dockershim이라는 서비스로 API, CRI의 변환을 하여 이용.

    • 그러나 이 서비스가 Deprecation 되면서 가까운 미래에 삭제될 예정이므로 더이상 Docker를 사용할 수 없다.

      • Deprecation
        • 소프트웨어에서, 어떤 기능이 아직까지 사용되고는 있지만, 신기능이 나왔기 때문에 조만간 사라지게 될 상태를 말한다.
    • 따라서, K8S는 CRI를 지원하는 컨테이너 런타임만 사용할 수 있다.

      • CRI : Container Runtime Interface
        • kubelet과 컨테이너 런타임 사이의 통신을 위한 주요 프로토콜
        • Kubernetes가 CRI 사양을 지원하는 모든 컨테이너 런타임을 사용할 수 있도록 하는 것
        • Kubernetes가 컨테이너 런타임에 구애받지 않도록 한다는 것
  • 처음 계획은 CRI-O를 선택했었다.

    • 그 이유는 CRI-O는 K8S에서 CRI 구현을 목적으로 만든 "K8S 전용 런타임"으로 알려졌기 때문이다.
    • 그러나, CRI-O는 Linux 기반 운영 체제용 컨테이너 런타임으로 Windows 환경을 직접 지원하지 않습니다.
  • 그래서 ContainerD를,

    • Docker에서 나온 Container Runtime으로 가볍다.
    • Windows 10이 ContainerD를 지원하기 때문에 선택을 변경했다.
      • ContainerD는 광범위한 OS 및 플랫폼을 지원하도록 설계된 런타임.
      • 운영 체제에서 제공하는 저수준 플랫폼 API 위에 구축되기 때문입니다.
      • Windows Server 2016에 도입된 Windows 컨테이너 기능을 활용합니다.
  • 현재 계획에서, Linux와 Windows를 활용하기 때문에 두 운영체제에서 작동하도록 설계된 ContainerD를 선택합니다.


1.2 ContainerD 발전

  • CRI-containerd

    • Kubelet의 CRI (Container Runtime Interface) 서비스 요청을 처리하고 containerd를 사용하여 해당 컨테이너 및 컨테이너 이미지를 관리합니다.
  • 이후 ContainerD 1.1에서는 CRI-Containerd 데몬이 ContainerD CRI Plugin으로 리팩터링되면서,
    ContainerD에 기본 내장됩니다.

  • CRI-containerd와 달리 CRI 플러그인은 직접 함수 호출을 통해 containerd와 상호 작용합니다.

  • 사용자는 이제 containerd1.1과 함께 Kubernetes를 직접 사용할 수 있습니다.


전체 프로세스 요약

1. 상황에 맞게 물리 PC 또는 가상머신 준비.
2. 각 PC에 Container Runtime을 설치.
3. Container Runtime의 Config를 수정하는데, Network, SSH, DNS등등 Add-ons들을 설정하면 편하다.
4. 각 PC 또는 머신에 Kubernetes를 설치한다.
5. Master node가 생성한 Cluster join 명령어를 각 Worker nodes에서 실행한다.
6. 잘 작동하는지 확인한다.


2. OS 설치

Ubuntu Official
Rufus로 Ubuntu USB 만들기
Windows가 설치된 컴퓨터에 Ubuntu 설치하는 방법

Ubuntu를 이렇게 설치하는 이유
본인의 개인 PC가 아니라서 이용이 끝나면 Windows로 되돌려야함.
그래서 하드디스크 파티션을 나누고 설치한 다음
사용이 끝나면 포맷 후 파티션을 해제해 되돌릴 예정이다.


3. 사전 작업

Ubuntu OS 정보 확인

nproc #코어 확인
free -h #메모리 확인
ifconfig -a #Mac 확인
sudo cat /sys/class/dmi/id/product_uuid #product_uuid 확인

swap 메모리 비활성화

sudo swapoff -a
sudo sed -ri '/\sswap\s/s/^#?/#/' /etc/fstab
sudo free -m #swap 메모리가 0인지 확인

스왑 공간을 비활성화

  • kubelet 이 제대로 동작하기 위해서는 swap 메모리를 비활성화
  • 시스템이 메모리를 디스크로 스왑 방지
  • 일관되고 예측 가능한 메모리 사용
  • Kubernetes Pod에는 특정 양의 메모리를 할당
  • 중요한 데이터가 스왑 파일의 디스크에 기록 방지
  • /etc/fstab 은 리눅스 시스템에서 부팅시 자동으로 마운트해주는 정보를 저장

방화벽 설정


sudo apt-get install firewalld
systemctl start firewalld
systemctl enable firewalld

firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https

master node

firewall-cmd --permanent --add-port=2379-2380/tcp
firewall-cmd --permanent --add-port=6443/tcp
firewall-cmd --permanent --add-port=10250-10252/tcp
firewall-cmd --permanent --add-port=8285/udp
firewall-cmd --permanent --add-port=8472/udp

worker node

firewall-cmd --permanent --add-port=10250/tcp
firewall-cmd --permanent --add-port=30000-32767/tcp
firewall-cmd --permanent --add-port=8285/udp
firewall-cmd --permanent --add-port=8472/udp

firewall-cmd --permanent --add-port=26443/tcp
firewall-cmd --reload

K8S Cluster를 구성하는데 필요한 Port 번호와 HTTP, HTTPS를 방화벽으로부터 허용한다.
참고로 Master, Worker 구분해놨지만 다 허용해야한다.


Kubernetes 클러스터를 실행하는 데 필요한 두 개의 커널 모듈을 로드

cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter
  • 이 명령은 /etc/modules-load.d/ 디렉토리에 containerd.conf라는 파일을 생성하고 overlaybr_netfilter 커널 모듈을 부팅 시 로드해야 하는 모듈 목록에 추가합니다.
  • overlay 모듈은 Docker 및 Containerd와 같은 컨테이너 런타임에서
    컨테이너 파일 시스템을 생성하는 데 사용되는 OverlayFS 파일 시스템을 제공합니다.
  • br_netfilter 모듈은 Linux 브리지 네트워크 스택에서 iptables를 사용하여 네트워크 필터링을 지원합니다. 이는 Calico 및 Flannel과 같은 Kubernetes 네트워킹 플러그인에 필요합니다.

  • overlay 모듈

    • Docker와 같은 컨테이너 런타임용 스토리지 드라이버이며 컨테이너용 계층화된 파일 시스템을 생성하는 방법을 제공
    • Kubernetes에서 컨테이너화된 워크로드를 실행하는 데 필요.
  • br_netfilter 모듈

    • 커널에 의한 네트워크 패킷 필터링을 활성화하는 데 사용
    • 네트워크 브리지 생성을 허용하고 iptables 규칙을 사용하여 네트워크 트래픽을 제어

PoD와 서비스 간의 적절한 네트워킹 및 통신

필요한 sysctl 파라미터를 정의합니다.
이 파라미터는 재시작하더라도 그대로 유지됩니다.

cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward                 = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
  • Kubernetes 네트워킹을 위한 패킷 전달 및 IP 매스커레이딩을 활성화
    • IP 매스커레이딩
      • 개인 네트워크의 컴퓨터 또는 네트워크 장치가 인터넷 연결을 제공하는 라우터 또는 방화벽의 공용 IP 주소와 일치하는 소스 IP 주소를 사용하여 인터넷으로 향하는 패킷을 투명하게 전송하도록 구성된 기술
      • 일반적으로 개인 네트워크의 NAT(네트워크 주소 변환)에 사용됩니다.
      • Kubernetes 네트워킹의 맥락에서 IP 매스커레이딩은 사설 네트워크의 포드가 인터넷 또는 클러스터 외부의 다른 네트워크와 통신할 수 있도록 하는 데 사용

Linux 커널에서 IP 전달을 활성화하여 네트워크 트래픽이 노드를 통과하도록 합니다.
IP 전달을 통해 Linux 시스템은 한 네트워크 인터페이스에서 다른 네트워크 인터페이스로 패킷을 전달할 수 있습니다.
네트워크 주소 변환(NAT)에 유용

  • iptables
    • 리눅스에서 방화벽 설정을 도와주는 도구
    • iptables 가 브리지된 네트워크 트래픽을 제대로 보기 위해서는 net.bridge.bridge-nf-call-iptables 값이 1으로 되어야 한다는 것

시스템을 재시작하지 않고 sysctl 파라미터를 반영하기 위한 작업입니다.

sudo sysctl --system

SELinux permissive

setenforce 0

sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

sestatus
  • SELinux는 관리자가 시스템 접근 권한을 제어하기 위한 보안 아키텍쳐
  • 쿠버네티스 클러스터에서는 SELinux 를 permissive 모드로 설정
    • 쿠버네티스가 Pod 네트워크에 필요한 호스트 파일시스템에 접근하기 위해

4. ContainerD 설치

ContainerD 프로젝트에서 제공하는 공식 설치 가이드에 따라 모든 노드에 ContainerD를 설치할 수 있습니다.

4.1 Ubuntu에서 ContainerD 설치하는 과정 + 설정

4.1.1 Containerd.io 설치

sudo apt-get update

sudo apt-get update는 구성된 리포지토리에서 로컬 패키지 인덱스를 업데이트

sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

HTTPS를 활용해 저장소에 접근하기 위해 위의 패키지들을 설치

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# Docker를 **stable** 버전으로 설치하기 위해 아래의 명령을 내립니다.
$ echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

HTTPS 리포지토리와 함께 apt 패키지 관리자를 사용하는 데 필요한 패키지를 설치하고 Docker GPG 키를 추가

GPG Key

  • GPG(GNU Privacy Guard) 키는 안전한 통신과 디지털 콘텐츠의 진위를 확인하는 데 사용되는 암호화 키입니다.
  • 소프트웨어 설치와 관련하여 GPG 키는 소프트웨어 패키지 및 리포지토리의 신뢰성과 무결성을 확인하는 데 사용됩니다.
sudo apt-get update

새로운 저장소가 추가되었으므로, 업데이트

sudo apt-get install containerd.io

containerd.io 설치

containerd : 완전 구현
containerd.io : 경량 런타임 특정 패키지 설치

사실 어떤 것도 사용 가능하다.

sudo systemctl status containerd

설치 확인


4.1.2 ContainerD 구성 파일을 만듭니다.

sudo mkdir -p /etc/containerd
sudo containerd config default | sudo tee /etc/containerd/config.toml

containerd를 실행하기 전에 containerd의 기본 설정을 정의해줍니다.


4.1.3 config.toml 파일을 수정합니다.

sudo nano /etc/containerd/config.toml

다른 건 몰라도

[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
  ...
  [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
    SystemdCgroup = true

systemd를 cgroup driver로 사용하기 는 꼭 설정해야한다.


# For OpenSSH CoreDNS
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
  SystemdCgroup = true
  ShimCgroup = "system.slice"
  CgroupParent = "kubelet"
  Debug = true
  additional_env = [
    "SSH_AUTH_SOCK=/run/user/0/openssh_agent.sock",
    "COREDNS_CONFIG=/etc/coredns/Corefile",
  ]
  • SystemdCgroup: systemd를 사용하여 cgroup 계층 관리
  • ShimCgroup: shim 프로세스용 cgroup(containerd와 runc 간의 통신을 처리하는 중간 프로세스)
  • CgroupParent: 컨테이너의 상위 cgroup
  • Debug: runc에 대한 디버그 모드를 활성화합니다.
  • additional_env
    • SSH_AUTH_SOCKCOREDNS_CONFIG를 포함하여 컨테이너에 설정할 추가 환경 변수 목록입니다.
    • 컨테이너에 전달될 컨테이너 런타임에 대한 환경 변수를 설정합니다.
      • 클러스터에 영향을 주는 변경은 아니다. (다만, 해봐야지 아는 것이니까.)
      • 이것으로 여기서 생성한 컨테이너들은 SSH 통신이 가능하고 DNS가 적용된다.

4.1.4 수정한 config.toml을 적용 및 재실행.

sudo systemctl restart containerd




4.2 Windows에서 ContainerD 설치하는 과정

# 원하는 컨테이너형 윈도우즈 바이너리 다운로드 및 추출
$Version="1.6.4"
curl.exe -L https://github.com/containerd/containerd/releases/download/v$Version/containerd-$Version-windows-amd64.tar.gz -o containerd-windows-amd64.tar.gz
tar.exe xvf .\containerd-windows-amd64.tar.gz

# 복사 및 구성
# ProgramFiles 폴더로 복사하고 config.toml 설정
Copy-Item -Path ".\bin\*" -Destination "$Env:ProgramFiles\containerd" -Recurse -Force
cd $Env:ProgramFiles\containerd\
.\containerd.exe config default | Out-File config.toml -Encoding ascii

# 구성을 검토합니다. 설정에 따라 조정할 수 있습니다:
# - the sandbox_image (Kubernetes pause image)
# - cni bin_dir and conf_dir locations
Get-Content config.toml

# 서비스 등록 및 시작
.\containerd.exe --register-service
Start-Service containerd

containerd 가 윈도우의 서비스 형태로 실행됩니다.



5. SSH 통신 구성 (각 물리 머신들이 연결되는지 확인차)

OpenSSH 설치 및 연결 - Linux

OpenSSH 설치 및 연결 - Windows


6. K8S 설치 및 클러스터 가입

설치 전에,

  • 클러스터의 모든 시스템 간의 완벽한 네트워크 연결
  • Swap 메모리 비활성화
  • Container Runtime 설치

이후에 진행해야 한다.

6.1 Ubuntu Linux에서 Master and Worker

6.1.1 K8S 설치 (Master, Worker)

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add

Kubernetes GPG 키를 검색하여 시스템의 키링에 추가

sudo apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"

시스템의 apt 소스 목록에 Kubernetes 레포지토리를 추가

sudo apt-get install kubeadm kubelet kubectl -y

apt-get 패키지 관리자를 사용하여 kubeadm, kubelet 및 kubectl 패키지를 설치

sudo apt-mark hold kubeadm kubelet kubectl containerd

kubeadm, kubelet 및 kubectl 패키지의 버전 고정

6.1.2 K8S 클러스터 초기화 전의 설정

sudo kubeadm config images pull

네트워크 또는 인터넷이 없을 상황에 대비해 image를 가져오는 것

미리 이미지를 가져오면 초기화 또는 결합 프로세스가 더 빠르고 안정적일 수 있습니다.


6.1.3 K8S 클러스터 초기화 (Master)

sudo kubeadm init --pod-network-cidr=10.244.0.0/16
  • --pod-network-cidr
    • 클러스터에 사용할 Pod 네트워크 CIDR을 지정합니다.
    • 이는 네트워킹 솔루션이 포드에 IP 주소를 할당하는 데 필요합니다.
      • Ex) --pod-network-cidr=10.244.0.0/16.
  • --apiserver-advertise-address
    • API 서버가 퍼블릭 엔드포인트에 대해 알릴 IP 주소를 지정합니다.
    • API 서버와 통신하도록 kubelet 및 기타 구성 요소를 구성하는 데 사용됩니다.
      • Ex) --apiserver-advertise-address=192.168.1.100.
  • --control-plane-endpoint
    • 컨트롤 플레인 구성요소가 서로 통신하는 데 사용할 엔드포인트를 지정합니다.
    • 컨트롤 플레인과 통신하도록 kubelet 및 기타 구성 요소를 구성하는 데 사용됩니다.
      • Ex) --control-plane-endpoint="k8s-control-plane:6443".
  • --upload-certs
    • 구성 요소 간의 통신 보안에 사용되는 TLS 인증서를 생성하고 저장합니다
    • 이 플래그가 설정되면 kubeadm은 새 인증서를 생성하고 이를 kubeadm-certs라는 Kubernetes 비밀에 저장합니다.
    • 그런 다음 이 암호를 다른 노드에 복사하여 클러스터에 연결할 수 있습니다.
      • Ex) --upload-certs.
  • --ignore-preflight-errors
    • 클러스터를 초기화하기 전에 발생할 수 있는 특정 preflight 오류를 무시합니다.
    • 수행 중인 작업을 알고 있고 오류를 안전하게 무시할 수 있다고 확신하는 경우에만 이 플래그를 사용하십시오.
      • Ex) --ignore-preflight-errors=NumCPU.
  • --config
    • kubeadm init 옵션을 지정하는 구성 파일의 경로를 지정합니다.
    • 명령줄 인수를 지정하는 대신 사용할 수 있습니다.
      • Ex) --config=/path/to/kubeadm-config.yaml.

위의 명령어를 실행하면 Worker node를 클러스터에 가입하는데 사용할 수 있는 명령이 출력됩니다.
예를 들어:

kubeadm join 192.168.0.100:6443 --token abcdef.1234567890abcdef \
    --discovery-token-ca-cert-hash sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef

이 명령을 사용하여 작업자 노드를 클러스터에 가입시킵니다.
이 명령을 안전한 곳에 보관해야한다.


6.1.4 kubectl 구성

대체로 안쓰이지만 오류나면 이것도...

unset KUBECONFIG
export KUBECONFIG
mkdir -p $HOME/.kube

Kubernetes 구성 파일을 저장하기 위해 홈 디렉터리에 .kube라는 디렉터리를 만듭니다(아직 없는 경우).

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  • 마스터 노드의 /etc/kubernetes 디렉터리에서 홈의 .kube 디렉터리로 구성 파일을 복사합니다.
  • admin.conf 파일에는 마스터 노드의 Kubernetes API 서버와 통신하는 데 필요한 자격 증명 및 엔드포인트 정보가 포함되어 있습니다.
sudo chown $(id -u):$(id -g) $HOME/.kube/config

구성 파일의 소유권을 사용자 계정으로 변경하여 읽고 수정할 수 있도록 합니다.


6.1.5 CNI

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

Kubernetes 클러스터에 Flannel을 배포하고 서로 다른 작업자 노드에서 실행되는 포드 간의 통신을 활성화하는 데 사용

<중요> - Windows를 위한 설정 변경이 필요.

현재 flannel을
https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
이 경로에서 받은 default flannel yaml을 그대로 설치해서 사용

다만, default로 설정 그대로 사용하게 되면 flannel은 8472 Port로 동작함.

하지만 Windows Worker Node를 추가하기 위해서는
8472 Port를 사용하면 안되고 4096 또는 4789 Port로 동작해야함.

띠라서, flannel Port를 변경해야된다.

# 확인
kubectl describe cm kube-flannel-cfg -n kube-system

# 수정
kubectl edit cm kube-flannel-cfg -n kube-system

수정 후 저장하고, configMap 적용을 위해 flannel 삭제 -> DaemonSet 이므로 재실행

kubectl get pod -n kube-system -o wide

로 확인 후 해당 flannel Pod들 삭제만 해주면 된다.


6.1.6 Workers 클러스터에 가입

각 Worker node에게

kubeadm join 192.168.0.100:6443 --token abcdef.1234567890abcdef \
    --discovery-token-ca-cert-hash sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef


6.2 Window Worker node에서:

1. Docker Desktop 설치 후 K8S 구성

매우 간편하게 K8S 환경을 구축할 수 있다.

2. WSL2로 Windows Linux 환경을 구축 후 K8S 구성

WSL2만 설치하면 Linux처럼 사용할 수 있어 익숙하다.

3. kubectl, Wins, kubelet, kubeadm 설치 후 Join

Windows의 PowerShell을 Administrator 권한으로 실행시켜서 진행함.

curl.exe -LO "https://dl.k8s.io/release/v1.26.0/bin/windows/amd64/kubectl.exe"
# SIG-Windows is really the center for all things Windows in Kubernetes
curl.exe -LO https://raw.githubusercontent.com/kubernetes-sigs/sig-windows-tools/master/kubeadm/scripts/PrepareNode.ps1

설치 후 환경 변수 설정하여 CMD | PS에서 실행할 수 있도록 한다.

.\PrepareNode.ps1 -KubernetesVersion v1.26.4

7. 네트워크 구성

우리는 OpenSSH를 설치하기 전에도 노드들끼리 SSH통신이 가능하다.
OpenSSH를 설치함으로써 무슨 차이가 있는가?

OpenSSH 설치 전에 SSH 통신

  • OpenSSH를 네트워크 추가 기능으로 설치하기 전에 노드 간 SSH 통신을 설정하면 SSH를 통해 각 노드에 직접 액세스할 수 있습니다.
  • Kubernetes 외부의 특정 명령을 문제 해결, 모니터링 또는 실행하는 데 유용할 수 있습니다.
  • 그러나 이 접근 방식을 사용하려면 수동으로 SSH를 구성하고 SSH 키를 관리해야 하므로 시간이 많이 걸리고 노드 수가 증가함에 따라 확장성이 떨어질 수 있습니다.

OpenSSH 설치 후에 SSH 통신

  • OpenSSH를 설치하면 Kubernetes의 내장 네트워킹 및 보안 기능을 활용하여 노드 간의 SSH 통신을 관리하고 자동화할 수 있습니다.
  • OpenSSH를 사용하면 각 노드에서 SSH 키를 설정하고 관리할 필요 없이 클러스터의 Pod가 안전하고 안정적으로 서로 통신할 수 있습니다.
  • 이 접근 방식은 네트워킹 및 보안 측면을 처리하기 위해 Kubernetes에 의존할 수 있으므로 확장 가능하고 관리하기가 더 쉽지만 SSH를 통해 각 노드에 대한 직접 액세스를 제공하지 않을 수 있으므로 특정 사용 사례에서 단점이 될 수 있습니다.

OpenSSHFlannel 또는 Calico와 같은 다른 옵션보다 성능이 낮고 보안 수준이 낮을 수 있으므로 Kubernetes 클러스터에 권장되는 네트워킹 솔루션이 아닙니다.


7.1 Ubuntu에서,

7.1.1 각 노드에 OpenSSH 설치

sudo apt-get update

sudo apt-get install -y openssh-server

7.1.2 노드의 IP 주소 찾기

ip addr show

7.1.3 Master node에서 새 OpenSSH Conf 생성

sudo nano /etc/ssh/sshd_config.d/k8s.conf

7.1.4 구성 파일에 다음 줄을 추가합니다.

Match Address 10.244.0.0/16
    PermitRootLogin yes
    PermitTunnel yes
    AllowAgentForwarding yes
    AllowTcpForwarding yes
    X11Forwarding yes

참고: 10.244.0.0/16을 Pod 네트워크의 CIDR 범위로 바꾸십시오.

7.1.5 OpenSSH 다시 시작.

sudo systemctl restart sshd

7.1.6 방화벽 ssh에 대해 허용

$ sudo ufw allow ssh

Windows에서,

OpenSSH

OpenSSH의 있고 없고 차이

가정 : SSH를 사용하여 한 노드에서 다른 노드로 파일을 복사한다.


OpenSSH가 설치되어 있다면,

scp /path/to/local/file username@remote:/path/to/destination

OpenSSH가 설치된 상태에서 간단히 scp 명령을 사용할 수 있습니다.


OpenSSH가 설치되어 없다면,

cat /path/to/local/file | ssh username@remote 'cat > /path/to/destination'

OpenSSH가 없으면 cat 및 ssh와 같은 명령을 함께 사용해야 합니다.




* 번외 - Flannel, Calico 설치

1. Master node에 로그인하고 다음 명령 실행하여 Flannel 설치

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

2. Flannel Pod가 실행되기 시작할 때까지 기다리기. 몇 분 소모 이후 Pod 상태 확인

kubectl get pods -n kube-system

3. Flannel Pod이 실행되면 작업자 노드 중 하나에서 다음 명령을 실행하여 노드 간 연결을 테스트

ping <IP address of another node>

ping 할 수 있다면 Flannel 성공적 설치 완료


1. Master node에 로그인하고 다음 명령 실행하여 Calico 설치

kubectl create -f https://docs.projectcalico.org/v3.19/manifests/calico.yaml

2. Calico Pod가 실행되기 시작할 때까지 기다리기. 몇 분 소모 이후 Pod 상태 확인

kubectl get pods -n kube-system

3. Calico Pod이 실행되면 작업자 노드 중 하나에서 다음 명령을 실행하여 노드 간 연결을 테스트

ping <IP address of another node>

ping 할 수 있다면 Flannel 성공적 설치 완료


8. DNS 설정

그래도 coredns.yaml로 설정해야 한다.

8.1 CoreDNS가 클러스터에 이미 있는지 확인

kubectl get pods -n kube-system -l k8s-app=kube-dns

8.2 없다면, coredns.yaml이라는 파일을 생성

kubectl apply -f https://github.com/coredns/deployment/blob/master/kubernetes/coredns.yaml

8.3 kube-system 네임스페이스를 확인하여 CoreDNS가 실행 중인지 확인

kubectl get pods -n kube-system -l k8s-app=kube-dns

이것과 비슷한 출력이 있어야 한다.

NAME                      READY   STATUS    RESTARTS   AGE
coredns-5c98db65d4-5npsl  1/1     Running   0          5m
coredns-5c98db65d4-jq2bm  1/1     Running   0          5m

DNS 이름은 어떻게?

kubeadm join 시 --node-name 로 설정할 수 있다.

sudo kubeadm join <control-plane-host>:<control-plane-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash> --node-name <custom-node-name>



Result

master@master-k8s:/$ sudo kubectl get node
NAME         STATUS   ROLES           AGE   VERSION
master-k8s   Ready    control-plane   94m   v1.26.3
work1-k8s    Ready    <none>          23s   v1.26.3
vimosoft     Ready    <none>           1s   v1.26.3
master@master-k8s:/$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp4s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether a8:5e:45:5d:d4:ff brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.123/24 brd 192.168.0.255 scope global dynamic noprefixroute enp4s0
       valid_lft 5738sec preferred_lft 5738sec
    inet6 fe80::8174:84b6:f2dc:9d19/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
3: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN group default 
    link/ether 62:9e:9e:66:b4:d4 brd ff:ff:ff:ff:ff:ff
    inet 10.244.0.0/32 scope global flannel.1
       valid_lft forever preferred_lft forever
    inet6 fe80::609e:9eff:fe66:b4d4/64 scope link 
       valid_lft forever preferred_lft forever
4: cni0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default qlen 1000
    link/ether ee:80:74:85:f0:11 brd ff:ff:ff:ff:ff:ff
    inet 10.244.0.1/24 brd 10.244.0.255 scope global cni0
       valid_lft forever preferred_lft forever
    inet6 fe80::ec80:74ff:fe85:f011/64 scope link 
       valid_lft forever preferred_lft forever
7: veth0dfa08b3@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master cni0 state UP group default 
    link/ether 8a:ce:04:cf:df:2e brd ff:ff:ff:ff:ff:ff link-netns cni-2c120a52-0b01-d49c-b02c-98f5509c26b6
    inet6 fe80::88ce:4ff:fecf:df2e/64 scope link 
       valid_lft forever preferred_lft forever
8: veth6b4c3d66@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master cni0 state UP group default 
    link/ether 7a:58:69:51:cb:ae brd ff:ff:ff:ff:ff:ff link-netns cni-03edc287-173a-b701-ac76-b82436d19f9c
    inet6 fe80::7858:69ff:fe51:cbae/64 scope link 
       valid_lft forever preferred_lft forever
master@master-k8s:/$ ssh work1@10.244.1.0
The authenticity of host '10.244.1.0 (10.244.1.0)' can't be established.
ECDSA key fingerprint is SHA256:amAD/tlcctnQOowAZ7KAEw8V/MtE5/m6GgNGPOOOfo0.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.244.1.0' (ECDSA) to the list of known hosts.
work1@10.244.1.0's password: 
Welcome to Ubuntu 20.04.6 LTS (GNU/Linux 5.15.0-69-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

 * Introducing Expanded Security Maintenance for Applications.
   Receive updates to over 25,000 software packages with your
   Ubuntu Pro subscription. Free for personal use.

     https://ubuntu.com/pro

Expanded Security Maintenance for Applications is not enabled.

12 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

9 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm

New release '22.04.2 LTS' available.
Run 'do-release-upgrade' to upgrade to it.

Your Hardware Enablement Stack (HWE) is supported until April 2025.
Last login: Mon Apr  3 13:19:44 2023 from 192.168.0.123
work1@work1-k8s:~$ 

profile
클라우드, 데이터, DevOps 엔지니어 지향 || 글보단 사진 지향

0개의 댓글