Case 5. OS(windows) + Network(NatNetwork + Port Forwarding) + 가상화(VirtualBox-CentOS7) + k8s(v1.19.4)

쿠버네티스 1.19.4 버전의 설치 방법으로써 설치시 영상 강의 UI와 약간의 차이가 있을 수 있습니다.
VM 생성시 노트북에 연결되어 있는 공유기로부터 IP를 할당 받을 수 없는 경우 Virtualbox로부터 VM끼리 통신할 수 있는 가상의 네트워크를 생성하는 방법입니다.
VirtualBox Installation for Kubernetes.


전체 네트워크 구성


Virtualbox with NatNetwork.


1-1) Install Virtualbox


1-1-1) virtualbox 다운로드 및 설치

[윈도우10 버전으로 진행] 아래 경로에서 [Windows hosts] 클릭 하여 다운로드 후 설치 (별다른 변경없이 Next만 함)

https://www.virtualbox.org/wiki/Downloads


Mac 사용자 참고 URL

https://www.virtualbox.org/wiki/Mac%20OS%20X%20build%20instructions


1-1-2) CentOS Download

아래 경로로 들어가서 원하는 경로에서 Minimal 버전의 파일 다운로드

http://isoredirect.centos.org/centos/7/isos/x86_64/


1-1-3) 원격접속 툴 MobaXterm 설치

꼭 MobaXterm이 아닌 각자 편한 원격접속 툴을 사용하셔도 되세요.
아래 예제는 MobaXterm를 설치하고 필요한 Host 등록 예제입니다.

https://mobaxterm.mobatek.net/

- [GET MOBAXTERM NOW] 버튼 클릭
- Free 버전 [Download now]
- Installer editon 다운로드 및 실행
- Sessions > SSH > Remote host : 127.0.0.1, Port : 10030 > [Bookmark settings] Session name : master-30 > [ok]
- Sessions > SSH > Remote host : 127.0.0.1, Port : 10031 > [Bookmark settings] Session name : node1-31 > [ok]
- Sessions > SSH > Remote host : 127.0.0.1, Port : 10032 > [Bookmark settings] Session name : node2-32 > [ok]


Create VM for Kubernetes.

2-1) Setting VM


2-1-1) NatNetwork 생성

1. 파일 > 환경설정 > 네트워크 > 새 NAT 네트워크 생성 추가
2. 편집 버튼 클릭
   - 네트워크 CICR 수정 : 30.0.2.0/24
Virtualbox with NatNetwork-1.
3. 포트 포워딩(P) 클릭 후 아래와 같이 설정
Virtualbox with NatNetwork-3.
  • 현재 크롬 브라우져에서 10080 포트를 블럭처리해놨기 때문에, 18080 등 다른 포트로 변경바랍니다.

2-1-3) VM 스펙 설정

메모리 및 디스크는 각자 상황에 맞게 참고해서 VM 설정

1. [VM 생성 1단계] 머신 > 새로 만들기 클릭
2. [VM 생성 1단계] 이름 : k8s-master, 종류: Linux, 버전: Other Linux(64-bit)
3. [VM 생성 2단계] 메모리 : 4096 MB
4. [VM 생성 3단계] 하드디스크 : 지금 새 가상 하드 디스크 만들기 (VDI:VirtualBox 디크스 이미지, 동적할당, 150GB)
5. VM 생성 후 설정 클릭
   1) [시스템] 프로세서 개수 : CPU 2개
   2) [저장소] 컨트롤러:IDE 하위에 있는 광학드라이브 클릭 > CentOS 이미지 선택 후 확인
   3) [네트워크] 네트워크 > 어댑터 1 탭 > 다음에 연결됨 [NAT 네트워크] 선택
6. 시작


2-2) Install CentOS


2-2-1) CentOS 설치

4번 단계에서 8.8.8.8는 Google DNS입니다. 원하는 DNS 쓰셔도 되요.

1. Test this media & install CentOS 7
2. Language : 한국어 
3. Disk 설정 [시스템 > 설치 대상]
   - case1 : 기본 설정을 할 경우
     1) [완료]
   - case2 : 디테일하게 설정을 할 경우
     1)[기타 저장소 옵션 > 파티션 설정] 파티션을 설정합니다. [체크][완료]
     2) 새로운 CentOS 설치 > 여기를 클릭하여 자동으로 생성합니다. [클릭]
     3) /home [클릭] 후 용량 5.12 GiB로 변경 [설정 업데이트 클릭]
     4) / [클릭]140 GiB 변경 후 [설정 업데이트 클릭]
     5) [완료], [변경 사항 적용]
4. 네트워크 설정 [시스템 > 네트워크 및 호스트명 설정]
   - 호스트 이름: k8s-master [적용]
   1) 이더넷(enp0s3) [설정]
      [일반] 탭
      - 사용 가능하면 자동으로 이 네트워크에 연결 [체크]
      [IPv4 설정] 탭
      - 방식: 수동으로 선택, 
      - [Add] -> 주소: 30.0.2.30, 넷마스크 : 255.255.255.0, 게이트웨이: 30.0.2.1, DNS 서버 : 8.8.8.8 
      - [저장][완료]
5. 설치시작
6. [설정 > 사용자 설정] ROOT 암호 설정 
7. 설치 완료 후 [재부팅]


Docker, Kubernetes Installation.

3-1) Pre-Setting


3-1-1) SELinux 설정

Ubuntu나 Debian등 다른 OS를 설치하시는 분들께서는 아래 경로에서 명령어 참고 바래요
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
https://kubernetes.io/docs/setup/production-environment/container-runtimes/#docker
쿠버네티스가 Pod Network에 필요한 호스트 파일 시스템에 액세스가 가능하도록 하기 위해서 필요한 설정이예요
아래 설정으로 SELinux을 permissive로 변경해야하고

setenforce 0

리부팅시 다시 원복되기 때문에 아래 명령을 통해서 영구적으로 변경 해야되요

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

아래 명령어를 실행해서 Current mode:permissive 내용 확인

sestatus

3-1-2) 방화벽 해제

firewalld 비활성화

systemctl stop firewalld && systemctl disable firewalld

NetworkManager 비활성화

systemctl stop NetworkManager && systemctl disable NetworkManager

3-1-3) Swap 비활성화

Swap 사용에 관련해서는 많은 의견이 있어요.

https://github.com/kubernetes/kubernetes/issues/53533
위 내용을 참고하셔서 swap 사용시의 고려해야할 점을 확인하시고 일단 여기선 사용하지 않도록 설정할께요.

swapoff -a && sed -i '/ swap / s/^/#/' /etc/fstab

3-1-4) iptables 커널 옵션 활성화

RHEL이나 CentOS7 사용시 iptables가 무시되서 트래픽이 잘못 라우팅되는 문제가 발생한다고 하여 아래 설정이 추가되요

cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system

3-1-5) 쿠버네티스 YUM Repository 설정

YUM에 대해서 좀더 상세한 내용이 궁금한 분께서는 아래 싸이트가 잘 정리되어 있는거 같아 링크 첨부했어요.

https://www.lesstif.com/display/1STB/yum

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF

3-1-6) Centos Update

yum -y update

3-1-7) hosts 등록

계획된 master와 node의 호스트 이름과 IP를 모두 등록해주세요. 안하시면 추후 kubeadm init시 Host이름으로 IP를 찾을 수 없다고 에러가 나요.

cat << EOF >> /etc/hosts
30.0.2.30 k8s-master
30.0.2.31 k8s-node1
30.0.2.32 k8s-node2
EOF


3-2) Install


3-2-1) Docker 설치

도커 설치 전에 필요한 패키지 설치

yum install -y yum-utils device-mapper-persistent-data lvm2 

도커 설치를 위한 저장소 를 설정

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

도커 패키지 설치

yum update -y && yum install -y containerd.io-1.2.13 docker-ce-19.03.11 docker-ce-cli-19.03.11
mkdir /etc/docker

cat > /etc/docker/daemon.json <<EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ]
}
EOF

mkdir -p /etc/systemd/system/docker.service.d

3-2-2) Kubernetes 설치

yum install -y --disableexcludes=kubernetes kubeadm-1.19.4-0.x86_64 kubectl-1.19.4-0.x86_64 kubelet-1.19.4-0.x86_64


Clone VM on Node For Kubernetes.

4-1) Clone VM


4-1-1) 시스템 shutdown

여기까지 만든 이미지를 복사해 놓기 위해서 Master를 잠시 Shutdown 시켜요.

shutdown now

4-1-2) VM 복사

VirtualBox UI를 통해 Master 선택 후 마우스 우클릭을 해서 [복제] 버튼 클릭

1. 이름 : k8s-node1, MAC 주소정책 : 모든 네트워크 어댑터의 새 MAC 주소 생성
2. 복제방식 : 완전한 복제

4-1-3) node2도 반복



4-2) Config Node


4-2-1) Network 변경하기

VirtualBox UI에서 k8s-node1을 시작 시키면 뜨는 Console 창을 통해 아래 명령어 입력

NatNetwork 설정 변경 (이더넷:enp0s3)

vi /etc/sysconfig/network-scripts/ifcfg-enp0s3

IPADDR= 부분을 해당 Node의 IP (30.0.2.31)로 변경해주세요

...
IPADDR="30.0.2.31"
...

그리고 아래 명령어로 네트워크 재시작

systemctl restart network

4-2-2) Host Name 변경

해당 Node의 Host 이름을 변경해주세요

hostnamectl set-hostname k8s-node1

이와 같은 방식으로 k8s-node2도 설정합니다.



Initialize Master and Join Node for Kubernetes.

5-1) Master


5-1-1) 도커 및 쿠버네티스 실행

도커 실행

systemctl daemon-reload
systemctl enable --now docker

아래 명령어를 입력하면 image를 다운받는 내용이 나오면서 중간에 Hello for Docker! 가 보이면 설치 확인되면 설치가 잘 된거예요.

docker run hello-world

쿠버네티스 실행

systemctl enable --now kubelet

5-1-2) 쿠버네티스 초기화 명령 실행

kubeadm init 명령관련 해서 상세 내용이 궁금하신 분은 아래 싸이트 참고하세요.

https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-init/
pod-network-cidr 를 설정하면 Pod의 IP가 자동으로 생성될때 해당 network으로 생성되요


`service-cidr` 를 설정하면 Service의 IP가 자동으로 생성될때 해당 대역으로 생성되요 `Default: 10.96.0.0/12`
kubeadm init --pod-network-cidr=20.96.0.0/12 --apiserver-advertise-address=30.0.2.30

실행 후 [Your Kubernetes master has initialized successfully!] 문구를 확인하고 아래 내용 복사해서 별도로 저장해 둡니다.
kubeadm join 30.0.2.30:6443 –token ki4szr.t3wondaclij6d1a3
–discovery-token-ca-cert-hash sha256:2370f0451342c6e4bd0d38f6c2511bda5c50374c85e9c09da28e12dd666d5987

5-1-3) 환경변수 설정

root 계정을 이용해서 kubectl을 실행하기 위한 환경 변수를 설정

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

5-1-4) kubectl 자동완성 기능 설치

kubectl 사용시 [tab] 버튼을 이용해서 다음에 올 명령어 리스트를 조회 할 수 있어요.
명령 실행 후 바로 적용이 안되기 때문에 접속을 끊고 다시 연결 후에 사용 가능합니다.

yum install bash-completion -y
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc

5-2) Node


5-2-1) 도커 및 쿠버네티스 실행

도커 실행

systemctl daemon-reload
systemctl enable --now docker

쿠버네티스 실행

systemctl enable --now kubelet

5-2-2) Node 연결

Master Init 후 복사 했었던 내용 붙여넣기

kubeadm join 30.0.2.30:6443 --token 7xd747.bfouwf64kz437sqs \
    --discovery-token-ca-cert-hash sha256:ec75641cd258f2930a7f73abfe540bb484eb295ad4500ccdaa166208f97c5117

5-2-3) Node 연결 확인

Master 서버에 접속해서 아래 명령 입력 후 추가된 Node가 보이는지 확인 (Status는 NotReady)

kubectl get nodes


Add Networking and Dashboard Plugin for Kubernetes.

6-1) Networking


6-1-1) Calico 설치

Kubernetes Cluster Networking에는 많은 Plugin들이 있는데 그중 Calico 설치에 대한 내용 입니다.

https://docs.projectcalico.org/v3.9/getting-started/kubernetes/

kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

calico와 coredns 관련 Pod의 Status가 Running인지 확인

kubectl get pods --all-namespaces

6-2) Dashboard


6-2-1) Dashboard 설치

해당 설정은 교육목적으로 권한 설정을 모두 해제하는 방법이기 때문에 프로젝트에서 사용하실때는 이점 유의바래요

https://github.com/kubernetes/dashboard

kubectl apply -f https://kubetm.github.io/documents/appendix/kubetm-dashboard-v2.0.0.yaml

6-2-2) 권한 해지 설정

접속시 인증 Skip 설정

  • updated 2021-08-26
위 kubetm-dashboard-v2.0.0.yaml에 해당 내용 포함되어 있습니다. 별도로 안하셔도 되세요.

6-2-3) 백그라운드로 proxy 띄우기

--address에 자신의 Host IP 입력

nohup kubectl proxy --port=8001 --address=30.0.2.30 --accept-hosts='^*$' >/dev/null 2>&1 &
  • 만약 Master 노드가 Restart 됐을 경우 이 부분은 다시 실행해 줘야 합니다.

6-2-4) 접속 URL

http://127.0.0.1:10080/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/
  • 현재 크롬 브라우져에서 10080 포트를 블럭처리해놨기 때문에, 18080 등 다른 포트로 변경바랍니다.

6-2-5) 언어 설정변경

Chrome 설정 > 언어 > 언어(한국어) > 원하는 언어를 위로 추가