Kubernetes 구축

uuuu.jini·2022년 9월 15일
0

Kubernetes

목록 보기
6/14

https://blog.wonizz.tk/2019/08/16/kubenetes-install-guide/

Kubernetes 설치와 사용법


Kubeadm을 사용하여 Kubernetes 클러스터를 구성하는 방법에 대해 설명한다.

K8s는 Worker Node에 명령을 내리는 Master Node와 실제 Container가 구동되는 Wokre Node로 구성되어 있다.

1] 설치 전 작업

기본적으로 쿠버네티스는 컨테이너를 클러스터링 해주는 도구이다보니, 도커가 사전에 설치되어 있어야 한다. 또한, 마스터와 워커노드가 준비되어 있어야 한다.

  • Swap disable: Swap은 메모리가 부족하거나 절전 모드에서 디스크의 일부 공간을 메모리처럼 사용하는 기능이다. Kubelet이 정상 동작할 수 있도록 해당 기능을 swap 디바이스와 파일에서 모두 disable한다.
swapoff -a # paging 과 swap 기능을 끕니다.
echo  0 > /proc/sys/vm/swappiness # 커널 속성을 변경해 swap을 disable 합니다.
sed -e '/swap/ s/^$*/$/' -i /etc/fstab #Swap을 하는 파일 시스템을 찾아 disable 합니다.
  • 노드 간 방화벽 해제: 각 노드의 통신을 원활하게 하기 위해 방화벽 기능을 해제한다.
systemctl disable firewalld
systemctl stop firewalld
  • net filter 모듈 활성화: br_netfilter 모듈이 활성화되어 있어야 한다.
modprobe br_netfilter
  • 도커 설치
  • selinux 권한 제어: SELinux(Security-Enhanced Linux)는 리눅스 보안 모듈로 액세스 권한을 제어한다. 쿠버네티스에서는 컨테이너가 호스트의 파일 시스템에 접속할 수 있도록 해당 기능을 꺼야 한다.
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

2] k8s 설치

  • repository 수정
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=kube*
EOF
  • yum을 통한 설치
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
systemctl enable kubelet && systemctl start kubelet
  • 마스터 노드 초기화: Master 노드에 컨트롤 구성 요소를 설치할 차례이다. 해당 작업은 Master에서만 실행한다.
kubeadm init
 
#그럼 설치가 진행되고 마지막에 다음과 비슷한 로그가 출력된다.
Your Kubernetes master has initialized successfully!

kubeadm: 클러스터를 부트스트랩하는 명령이다. 쿠버네티스에서 제공하는 기본적인 도구이며, k8s 클러스터를 가장 빨리 구축하기 위한 다양한 기능을 제공한다.

kubelet: 각 노드에서 실행되는 기본 Node Agent이다. api-server와 통신하며, PodSpec을 사용해 PodSpec에 기술된 컨테이너들이 정상적으로 작동되도록 돕는다. 관리자가 Pod를 배포하려고 할 경우, api-server를 비롯한 컨트롤 플레인의 컴포넌트들은 명령에 대한 인기 및 인증을 수행하고, 선언된 상태와 일치하지 않는 Pod가 있는지 확인하고, 어떤 NodePod를 배치하면 좋을지 결정한다. 어디에 배치할지는 Master Node의 컴포넌트들 정확히는 Scheduler가 결정하지만 실제로 Container runtime에 배치를 명령하는 것은 Kubelet의 역할이다. 만약, Worker Node에서 동작중인 Kubelet이 정지되면 컨테이너 런타임에 요청을 보내는 역할을 수행하는 컴포넌트가 정지되었으므로 Pod 생성, 삭제 등이 해당 Node에서 정상적으로 수행되지 않는다.

참고: [Worker Node] Kubelet

kubectl: 쿠버네티스 클러스터에 명령을 내리는 CLI(Command Line Interface)이다.
명령어: kubectl [COMMAND][TYPE][NAME][FLAGS]

  • COMMAND: create, get, describe와 같이 하나 혹은 여러개의 리소스에 대한 operation 종류를 선언한다.
  • TYPE: resource type에 대해 선언한다.
  • NAME: 특정 리소스의 이름을 선언한다.
  • FLAGS: 추가적인 OPTION 선언

api-server: 마스터 노드의 중심에서 모든 클라이언트, 컴포넌트로부터 오는 요청을 전부 받아낸다.

  • api서버 주소 확인: kubectl cluster-info

마스터 노드가 활성화 되면 아래의 로그가 출력된다.

To start using your cluster, you need to run the following as a regular user:
 
  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config
 
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/
 
You can now join any number of machines by running the following on each node
as root:
 
  kubeadm join 10.146.0.25:6443 --token yuaea3.d7m8hkpvazrbv5yw --discovery-token-ca-cert-hash sha256:c6a7121c5d5207179f67d913fa654441137f76027ad0f4e23724f0202b280eec

여기서 일반 사용자가 kubectl을 사용할 수 있도록 로그 중간에 있는 명령어를 복사해서 실행한다.

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
  • 인증서 세팅하기: 접속하는 터미널의 인증서를 셋팅하는 과정으로 일반 유저냐 Root 계정이냐에 따라 설정이 다르다.
export KUBECONFIG=/etc/kubernetes/admin.conf
  • Pod network add-on 설치하기: Pod는 실제로 여러 노드에 걸쳐 배포되는데, Pod 끼리는 하나의 네트워크에 있는 것처럼 통신할 수 있다. 이를 오버레이 네트워크라고 한다. Master Node에 아래와 같이 설치한다.
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
  • 워커 노드 클러스터링: 위의 마스터 노드 활성화시 나온 로그에서 맨 아랫줄의 명령어는 워커 노드를 해당 클러스터에 추가하는 명령어이다. 해당 명령어를 복사해서 worker 노드에서 수행한다.
 kubeadm join 10.146.0.25:6443 --token yuaea3.d7m8hkpvazrbv5yw --discovery-token-ca-cert-hash sha256:c6a7121c5d5207179f67d913fa654441137f76027ad0f4e23724f0202b280eec

해당 커맨드를 복사하지 않고 지워진 경우에 다음과 같이 토큰의 확인이 가능하다.
kubeadm token list
해당 토큰은 24시간 동안만 사용이 가능하다. 새로운 토큰이 필요한 경우 다음 명령어를 실행한다.
kubeadm token create

3] 쿠버네티스 확인

쿠버네티스 설치 완료 후 다음 명령어로 확인한다.

CNI를 설치하면 CoreDNS Pod 가 정상적으로 동작하게 된다. 다음 명령어로 각 노드와 상태를 확인할 수 있다.

kubectl get no

다음 명령어로 쿠버네티스의 구성 요소가 모두 동작하는 것을 확인할 수 있다.

kubectl get componentstatuses

4] 간단한 POD 구성하기

간다한 Pod를 배포해서 동작을 확인한다. 아래와 같은 pod-test.yaml 파일을 생성한다.

  • deployment.yml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  # Deployment 객체의 Unique한 명칭
  name: deployment-example
spec:
  # Deployment label selector for pod
  selector:
    matchLabels:
      app: nginx
  # 2 Pods should exist at all times.
  replicas: 2
  template:
    metadata:
      labels:
        # Pod의 라벨
        app: nginx
    spec:
      containers:
      - name: nginx
        # Run this image
        image: nginx:1.10
  • service.yml
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
  labels:
    run: nginx-svc
spec:
  type: NodePort
  ports:
  - port: 8080
    targetPort: 80
    protocol: TCP
  selector:
    app: nginx

deployment 안에 pod를 배포하기 위한 내용들을 기입하였다.

아래의 spec대로 2개의 replica를 생성하기 때문에 pod는 아래와 같이 생성된다.

containers:
- name: nginx
image: nginx:1.10

service는 로드밸런스의 기능을 하는데, 그 타입이 3종류(ClusterIP,noteType,DNS)가 있다.

8080포트로 접속이 되면, target(nginx)의 pod으로 80포트로 분산하겠다라는 내용의 서비스이다.

ports:
  - port: 8080
    targetPort: 80
    protocol: TCP
  selector:
    app: nginx
profile
멋쟁이 토마토

0개의 댓글