본문 바로가기

오픈소스

쿠버네티스 설치 및 실행

1. 테스트 환경 구성

OS

   •Ubuntu 20.04.03

Hardware spec

   •2 CPU(2 CPU이상)
   •4 GB(2 GB이상)
   •Ubuntu virtual machine

Software setting

   •도커 설치
   •도커 데몬 드라이버 변경
   •swap 비활성화()
   •방화벽() (firewalld)
   •포트 개방 (iptables)
   •쿠버네티스 설치

쿠버네티스 클러스터

   •마스터노드, 워크노드1, 워크노드2

 

2. 서버 설정

1). IP 설정

§고정 IP 설정

   - /etc/netplan 파일 수정 : node별로 다 해주어함

network:

  ethernets:

    enp1s0:

      addresses: [192.168.50.160/24]

      gateway4: 192.168.50.1

      nameservers:

              addresses: [192.168.50.1]

      dhcp4: false

  version: 2

2). openssh-server설치

   - sudo apt install openssh-server

3). docker 설치

§레포지토리 설정

   - 기본라이브러리 설치

$ sudo apt update

$ sudo apt install \

  apt-transport-https \

  ca-certificates \

  curl \

  gnupg \

  lsb-release

 

   - HTTPS를 통해 repository를 사용할 수 있게 설정

curl -fsSL https://download.docker.com/linux/ubuntu/gpg \

| sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

   - stable repository 설정

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

§도커설치

   - 설치

$ sudo apt update

$ sudo apt install docker-ce docker-ce-cli containerd.io

   - 설치확인

$ sudo docker run hello-world

   - 도커 데몬 드라이버를 systemd변경

# systemd에 경로를 만들어 주고 docker service재시작 합니다

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

$ sudo systemctl daemon-reload

$ sudo systemctl restart docker

 

4). swap 비활성화

   - 쿠버네티스는 스왑 메모리를 지원하지 않습니다. 따라서 linux 스왑 메모리를 비활성화 해주어야 합니다.

$ sudo swapoff –a

$ sudo sed -i '2s/^/#/' /etc/fstab

$ sudo vi /etc/fstab  #/swap 부문 주석 처리

 

5). 방화벽 비활성화

$ sudo systemctl stop firewalld

 

6). 포트 개방 (iptables)

   - kubeadm join이 안될 시 iptables를 확인해 봅니다

   - iptables 조회

$ sudo iptables -L

   - iptables 초기화(flush) 실행하기 전 backup을 꼭 합시다

$ sudo iptables -F

 

3. kubeadm, kubelet, kubectl 설치

1). repository 설정

   - 필요한 라이브러리 설치

$ sudo apt update

$ sudo apt install -y apt-transport-https ca-certificates curl

 

- 구글 클라우드의 공개 사이닝 키를 다운로드

$ sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg

  

- 쿠버네티스 apt 레포지토리 추가

echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" \

| sudo tee /etc/apt/sources.list.d/kubernetes.list

 

 - apt 패키지 색인을 업데이트하고, kubelet, kubeadm, kubectl을 설치하고 해당 버전을 고정

$ sudo apt update

$ sudo apt install -y kubelet kubeadm kubectl

$ sudo apt-mark hold kubelet kubeadm kubectl

 

4. hosts 파일 수정

- local registry사용을 위해서 마스터 추가

sudo vi /et/hosts

192.168.50.160 docker-registry.com

 

5. master node복제(Virtual서버 사용시)

- 서버 복제

virt-clone --original master-node --name worker-node1 --file /data/libvirt/images/k8s/worker-node1.qcow2

 

- hostname변경

sudo hostnamectl set-hostname worker-node1

 

- 복제후

/etc/netplan에서 IP변경, /etc/hosts 파일 수정

 

6. 마스터 노드, 워커 노드 join

1). 마스터 노드 설정

   - Container Network Interfaceflannel사용

   - flanneldefault cidr 네트워크를 구성할 것이기에 10.244.0.0/16을 사용하여 kubeadminit

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

$ mkdir -p $HOME/.kube

$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

$ sudo chown $(id -u):$(id -g) $HOME/.kube/config

# 정상 설치가 되었는지 모든 cluster pod를 조회해 봅시다

$ kubectl get pods –A

   - CNI 네트워크 에드온 Flannel배포

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

   - Flannel을 배포한 후 모든 pod를 조회하면 corednsPending에서 Running으로 바뀌며 동작하는 것을 볼 수 있습니다.

$ kubectl get pod -A

 

2). 워커 노드 설정 : kubeadm init 할때 나온 메시지 복사

sudo kubeadm join 192.168.50.160:6443 --token hyenxs.8vgtxtwh0vfqdeyj \

        --discovery-token-ca-cert-hash sha256:82e4d25b55c03ac3a524f2ced510b96821809ca45fd4de32c8f382b04c56051c

$ kubectl get node     #마스터노드와 조인후 확인

 

7. private docker registry Pod 설치

docker hub를 사용하지 않고 서버내에 private registry를 구축해서 이미지를 push, pull 하기 위해서 설정

1). 공유 폴더 생성

   - 폴더 생성

sudo mkdir docker-registry

   - NAS NSF폴더 공유

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=gineers&logNo=220726615493

   - 공유폴더 마운트

sudo apt install nfs-common

sudo mount 192.168.50.16:/volume1/docker-registry ./docker-registry

   - 리부팅시 자동으로 마운트

sudo vi /etc/fstab 수정

192.168.50.16:/volume1/docker-registry home/cogent/docker-registry nfs

 

   - docker-registry.yaml

# vi docker-registry.yaml

apiVersion: v1

kind: Pod

metadata:

  name: docker-registry

  namespace: default

  labels:

    app: docker-registry #label

spec:

  #nodeName: kube-node2 #node를 지정해도되고 안해도됨

  #nodeSelector: // node labels를 지정해도 됨

    #kubernetes.io/hostname: kube-node2

  containers:

  - name: docker-registry

    image: registry:2

    ports:

    - containerPort: 5000 #registry 기본 port

    volumeMounts:

    - mountPath: /var/lib/registry #container directory

      name: host-path #아래에 volumes name

  volumes: #host pc volume생성

  - name: host-path

    hostPath:

      path: /home/cogent/docker-registry

      type: DirectoryOrCreate

---

apiVersion: v1

kind: Service

metadata:

  name: docker-registry

  namespace: default

spec:

  type: NodePort

  selector:

    app: docker-registry

  ports:

    - protocol: TCP

      port: 5000

      targetPort: 5000

      nodePort: 30500

 

   - /etc/hosts 파일 수정 : 모든 노드에 추가

192.168.50.160 docker-registry.com 추가

   - /etc/docker/daemon.json 수정 : private registry에서 image pull할때 https를 사용하지 않고 http를 사용 하기 위해서

$ sudo vi /etc/docker/daemon.json  #추가

 "insecure-registries" : ["docker-registry.com:30500"]

 

 

8. Application 배포

1). Application 생성

   - node.js 애플리케이션 생성 : server.js

var os = require('os');

var http = require('http');

var handleRequest = function(request, response) {

  response.writeHead(200);

  response.end("Hello World! I'm "+os.hostname());

  //log

  console.log("["+

                Date(Date.now()).toLocaleString()+

                "] "+os.hostname());

}

var www = http.createServer(handleRequest);

www.listen(8080)

   - server.js 실행

node server.js

 

2). 도커로 패키징하기

   - Dockerfile 생성

FROM node:carbon

EXPOSE 8080

COPY server.js .

CMD node server.js > log.out

   - 컨테이너 이미지 생성

docker build -t docker-registry.com:30500/cogent/hello-node:v1 .

리파지토리 docker-registry.com:30500

사용자      cogent

이미지, 태그 hello-node:v1

   - 실행확인

docker run -d -p 8080:8080 docker-registry.com:30500/cogent/hello-node:v1

 

3). ReplicationController 등록

   - hello-node-rc.yaml

# hello-node-rc.yaml

apiVersion: v1

kind: ReplicationController

metadata:

  name: hello-node-rc

spec:

  replicas: 3

  selector:

    app: hello-node

  template:

    metadata:

      name: hello-node-pod

      labels:

        app: hello-node

    spec:

      containers:

      - name: hello-node

        image: docker-registry:30500/cogent/hello-node:v1

        imagePullPolicy: Always

        ports:

        - containerPort: 8080

   - 등록

kubectl apply -f hello-node-rc.yaml

 

4). Service 등록

   - hello-node-svc.yaml

#hello-node-svc.yaml

apiVersion: v1

kind: Service

metadata:

  name: hello-node-svc

spec:

  selector:

    app: hello-node

  ports:

    - port: 80

      protocol: TCP

      targetPort: 8080

      nodePort: 30808

  type: LoadBalancer

   - 등록

kubectl create -f hello-node-svc.yaml

 

5). RC 테스트

   - pod를 삭제 하면 rc가 새로 생성함

   - pod개수 조정

kubectl scale --replicas=4 rc/hello-node-rc

 

 

아래 사이트에서 참조 했습니다.

나에게 필요한 쿠버네티스 설치하기 : https://jwher.github.io/install-kubernetes
쿠버네티스 아키텍처 : https://jwher.github.io/kubernetes-architecture
Kubernetes #1 소개 : https://bcho.tistory.com/1255?category=731548
쿠버네티스 #2 - 개념 이해 : https://bcho.tistory.com/1256?category=731548
쿠버네티스 #4 아키텍쳐 : https://bcho.tistory.com/1258?category=731548
쿠버네티스 #5 - 디스크 (볼륨/Volume) : https://bcho.tistory.com/1259?category=731548
쿠버네티스 #6 - 실제 서비스 배포해보기 : https://bcho.tistory.com/1261?category=731548
쿠버네티스란? : https://kyumdoctor.co.kr/13

 

'오픈소스' 카테고리의 다른 글

쿠버네티스(kubernetes)란?  (0) 2023.04.10