[클라우드/K8S 기본(4) - Kubeadm을 이용한 Kubernetes 설치]

SooYeon Yeon·2022년 9월 13일
0

클라우드 K8S

목록 보기
6/18

Kubeadm을 이용한 Kubernetes 설치

현재 상태

  • 모든 노드가 ubuntu 20.04
  • 모든 노드에 동일한 패키지가 설치 되어 있다.(1,2번)
  • kubelet도 master에 설치되어 있다.(없어도 되는데)
  • 토큰 발행은 되어있지 않은 상태
  • swapoff -a
    • 각 노드에서 가상메모리를 사용하지 않는다.

    • 모든 노드의 일관성을 유지하기위해 k8s에서는 가상 메모리 사용을 하지 못하도록 한다.

    • 노드 실행시마다 자동으로 가상메모리 사용을 못하도록 하고싶다면? /etc/fstab의 마지막줄 /swap 관련 내용을 주석처리

      #/swapfile                                 none            swap    sw              0       0
  1. 모든 노드에 필요한 패키지 설치(루트계정으로)
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF > /etc/apt/sources.list.d/kubernetes.list
deb http://apt.kubernetes.io/ kubernetes-xenial main
EOF
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
systemctl daemon-reload
systemctl restart kubelet
  1. vi /etc/docker/daemon.json 구성
{
"exec-opts": ["native.cgroupdriver=systemd"]
}

step1

master에서 토큰 발행 - 클러스터 실행

root에서 작업하기 위해 모든 노드에서

su
# test123
cd

[master]

kubeadm init --apiserver-advertise-address 211.183.3.100
또는
kubeadm init

master에 apiserver가 들어가고, apiserver는 스케쥴러, 컨트롤러, etcd와 연결되어 있으며 api는 각 노드(worker)의 kubelet과 연결을 한다.

init까지만 써도 지금은 인터페이스가 하나기때문에 입력하지 않아도 되긴함(default로)

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

admin.conf : 관리자를 위한 설정값 들어있음

export KUBECONFIG=/etc/kubernetes/admin.conf # export 전역변수

현재 사용자가 쿠버네티스의 어드민 계정에 대한 설정 내용이 포함된 파일을 관리할 수 있다. → 현재 사용자가 쿠버네티스 관리자로 등록된다

*내일 오전에 재부팅한 뒤 kubectl 이용해 클러스터에 대한 명령을 실행하는데 오류가 발생한다면 export~를 다시 입력해주어야 한다.

또는 KUBECONFIG=/etc/kubernetes/admin.conf를 처음 실행 시 자동으로 실행될 수 있도록 .bashrc에 등록해둔다.

KUBECONFIG는 service의 정보를 누구로 할 것인지 파일을 지정하는 변수

/etc/kubernetes/admin.conf → 쿠버네티스 전체 관리자 admin

  • worker에 토큰 붙여넣기
kubeadm join 211.183.3.100:6443 --token gko962.mkl1pj8vn8dw5vgy \
        --discovery-token-ca-cert-hash sha256:9eefa379e1e9c2032199910f4f8fe7e58b926467f5dd11ba666190b7e1bc5677

나온 토큰값을 worker1,2,3에 붙여넣기

  • master에서 확인
root@manager:/home/user1# kubectl get node
NAME      STATUS     ROLES                  AGE    VERSION
manager   NotReady   control-plane,master   9m8s   v1.21.0
worker1   NotReady   <none>                 21s    v1.21.0
worker2   NotReady   <none>                 20s    v1.21.0
worker3   NotReady   <none>                 19s    v1.21.0
  • 이후 인증정보 문제나지않게 하기 위해 master에서 도커 로그인
docker login

step2

오버레이를 위한 애드온 중 calico를 설치

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

calico 가 아닌 weave net을 사용하고자 하는 경우에는 아래와 같이 설치한다.
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version
| base64 | tr -d '\n')"

  • 동작상태 확인 (calico ~ 확인)
root@manager:/home/user1# kubectl get pod -n kube-system
NAME                                       READY   STATUS     RESTARTS   AGE
calico-kube-controllers-867d8d6bd8-78m76   0/1     Pending    0          88s
calico-node-fj4nh                          0/1     Init:0/3   0          88s
calico-node-fr246                          0/1     Init:0/3   0          88s
calico-node-jf5s8                          0/1     Init:0/3   0          88s
calico-node-qgghs                          0/1     Init:0/3   0          88s
coredns-558bd4d5db-g7k27                   0/1     Pending    0          12m
coredns-558bd4d5db-kt4p2                   0/1     Pending    0          12m
etcd-manager                               1/1     Running    0
...
kube-proxy-6wbj5                           1/1     Running                 0          18m
kube-proxy-9w5th                           1/1     Running                 0          27m
kube-proxy-p4hwr                           1/1     Running                 0          18m
kube-proxy-qbxq7                           1/1     Running                 0          18m
kube-scheduler-manager                     1/1     Running                 0          27m

시간이 지나 설치되면 0→1로 바뀌게 되는데 설치 후 kubectl get node를 실행하면 상태가 바뀐다.

pod가 예를들어 nfs로 나가고싶다면 직접 나갈 수없고 kube-proxy를 통해 나갈 수 있다.

pod간 통신을 위해서는 네트워크 플러그인이 필요하다. 일반적으로 CNI로 구성. 여기서 사용한 것이 Calico

manager에 있는 api, 스케쥴러, 컨트롤러 등은 모두 pod형태로 생성되어 서비스를 제공한다. 또한 coreDNS, calico도 pod형태로 서비스가 제공된다. 따라서 이미지 다운로드 → Pod 생성 의 단계를 거쳐야한다.

만약, 리셋하고 다시 시작하고 싶다면 kubeadm reset → kubeadm init

CNI (Container Network Interface)

  • 컨테이너들과의 통신을 위한 개발된 인터페이스이며 표준화를 통해 어떠한 컨테이너가 됐건 상관없이 연결이 가능하도록 해준다.
  • CNI의 종류는 크게 L2, L3로 구분한다.
    • L2(ex. flannel)는 각각의 노드에 나뉘어 배포된 모든 포드를 하나의 가상 스위치에 연결하여 통신시킬 수 있다.
    • L3(CALICO)는 각 네트워크간 통신을 가상의 라우터를 사용하여 라우팅한다. 또한, BGP를 제공하여 회사내에서 보유하고있는 독립된 공인주소대역을 ISP와의 통신에 활용할 수 있다.
    • 어느 것을 사용하더라도 포드간 통신에는 문제가 없다.

노드에 생성된 각각의 포드는 별도의 독립적인 주소와 이에 해당하는 도메인 이름이 할당된다. 우리는 이 정보가 저장된 coreDNS를 통해 통신시킬 수 있다.

0개의 댓글