Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 3 Next »

쿠버네티스는 기본적으로 마스터 노드와 워커 노드로 구성. 마스터 노드와 워커 노드는 최소한 1개씩 필요.

  • 마스터 노드: 워커 노드에 Pod를 할당하고 Pod 안에 컨테이너를 띄우게 하는 역할. 쿠버네티스의 상태를 관리하고 여러 Pod 들의 스케줄링.

  • 워커 노드: 마스터 노드와 통신하면서 Pod를 할당 받고 그 안에 컨테이너를 띄워 유지 및 관리하는 역할. 네트워크나 볼륨에 대한 기능도 컨트롤.

설치 환경

마스터 노드

  • OS : Ubuntu 18.04 LTS

  • CPU : 2 core

  • RAM : 2 GB

  • Storage : 20GB

워커 노드

  • OS : Ubuntu 18.04 LTS

  • CPU : 2 core

  • RAM : 1 GB

  • Storage : 20GB

설치 전 확인 사항

  • 마스터 노드와 워커 노드 네트워크 연결 확인

  • swap 메모리 비활성화

    $ swapoff -a
    $ vi /etc/fstab
    /swapfile 설정되어있는 구문 주석처리
  • Docker 설치 확인

  • Docker 데몬 드라이버설정 - kubernetes에서 권장하는 Docker 데몬의 드라이버는 systemd. kubernetes가 클러스터 노드에서 사용 가능한 자원을 쉽게 알 수 있도록 구성됨.

    $ sudo cat > /etc/docker/daemon.json <<EOF
    {
      "exec-opts": ["native.cgroupdriver=systemd"],
      "log-driver": "json-file",
      "log-opts": {
        "max-size": "100m"
      },
      "storage-driver": "overlay2"
    }
    EOF
    $ sudo mkdir -p /etc/systemd/system/docker.service.d
    $ sudo systemctl daemon-reload
    $ sudo systemctl restart docker

Kubernetes 설치

마스터, 워커 공동 설치

  • kubeadm : kubernetes 클러스터를 구축하기 위해 사용하는 툴.

  • kubelet : 클러스터의 모든 머신에서 실행되며 Pod 및 컨테이너 시작 등의 작업을 수행하는 구성 요소.

  • kubectl : 클러스터와 통신하는 커맨드라인 인터페이스 유틸.

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

$ cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb <https://apt.kubernetes.io/> kubernetes-xenial main
EOF

$ sudo apt-get update

$ sudo apt-get install -y kubelet kubeadm kubectl

# 패키지가 자동으로 설치, 업그레이드, 제거되지 않도록 hold함.
$ sudo apt-mark hold kubelet kubeadm kubectl

# 설치 완료 확인
$ kubeadm version
$ kubelet --version
$ kubectl version

마스터 노드 설정

  • —-pod-network-cidr : Pod 네트워크를 설정할 때 사용

  • --apiserver-advertise-address : 특정 마스터 노드의 API Server 주소를 설정할 때 사용

$ sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.146.133

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

Pod 네트워크 애드온(Flannel) 클러스터에 배포

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

마스터 노드 설정 확인 명령어

# 노드 확인
$ kubectl get nodes
NAME                 STATUS   ROLES    AGE   VERSION
ubuntu               Ready    master   30s   v1.18.6

# 노드 내의 kube-system 네임스페이스를 가진 컨테이너 확인(마스터 노드 관리 컨테이너)
$ kubectl get pod --namespace=kube-system -o wide
NAME                             READY   STATUS             RESTARTS   AGE   IP                NODE                 NOMINATED NODE   READINESS GATES
coredns-66bff467f8-4kq4x         1/1     Running            2          30s   10.244.0.11       ubuntu               <none>           <none>
coredns-66bff467f8-ndptp         1/1     Running            3          30s   10.244.0.10       ubuntu               <none>           <none>
etcd-ubuntu                      1/1     Running            47         30s   192.168.146.133   ubuntu               <none>           <none>
kube-apiserver-ubuntu            1/1     Running            55         30s   192.168.146.133   ubuntu               <none>           <none>
kube-controller-manager-ubuntu   0/1     CrashLoopBackOff   68         30s   192.168.146.133   ubuntu               <none>           <none>
kube-flannel-ds-amd64-ss9g9      1/1     Running            2          30s   192.168.146.133   ubuntu               <none>           <none>
kube-proxy-n6p7z                 1/1     Running            2          30s   192.168.146.133   ubuntu               <none>           <none>
kube-scheduler-ubuntu            1/1     Running            50         30s   192.168.146.133   ubuntu               <none>           <none>

워커 노드 설정

마스터 노드 결합 명령어

$ kubeadm join 192.168.146.133:6443 --token fnbiji.5wob1hu12wdtnmyr \
    --discovery-token-ca-cert-hash sha256:701d4da5cbf67347595e0653b31a7f6625a130de72ad8881a108093afd06188b
  • 마스터 노드의 IP:6443 (6443 포트는 kubernetes api server 프로세스의 기본 포트. 만약 마스터 노드의 api server 포트가 6443이 아니라면 해당 마스터 노드의 api server 포트 번호를 기입.)

  • --token (기본적으로 24시간 뒤 만료)

  • --discovery-token-ca-cert-hash

token 찾는 명령어

$ kubeadm token list

token 만료 시 생성 명령어

$ kubeadm token create

discovery-token-ca-cert-hash 찾는 명령어

$ openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'

마스터 노드에서 워커 노드 결합 확인

$ kubectl get nodes
NAME                 STATUS   ROLES    AGE   VERSION
ubuntu               Ready    master   10m   v1.18.6
ubuntu-kube-worker   Ready    <none>   30s   v1.18.6

Kubernetes 배포 예제

구글에서 제공하는 Hello world 샘플 프로젝트를 kubectl create deployment 명령어로 배포하는 예제

$ kubectl create deployment kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1

deployment 확인

$ kubectl get deployments
NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
kubernetes-bootcamp   1/1     1            1           23s

pod 확인

$ kubectl get pods -o wide
NAME                                   READY   STATUS    RESTARTS   AGE   IP           NODE                 NOMINATED NODE   READINESS GATES
kubernetes-bootcamp-6f6656d949-vrsn5   1/1     Running   2          30s   10.244.1.4   ubuntu-kube-worker   <none>           <none>

워커 노드에서 curl 명령어를 통해 Pod 내부에 떠있는 컨테이너 확인

$ curl http://10.244.1.4:8080
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-6f6656d949-vrsn5 | v=1

Kubernetes 종료

쿠버네티스 클러스터를 삭제하는 방법

마스터 노드

$ kubectl drain {노드이름} --delete-local-data --force --ignore-daemonsets
$ kubectl delete node {노드이름}

$ kubeadm reset

워커 노드

$ kubeadm reset

  • No labels

0 Comments

You are not logged in. Any changes you make will be marked as anonymous. You may want to Log In if you already have an account.