본문 바로가기

AWS 교육/Docker-AWS (월)

250217 노드 Kubernetes 컨테이너

728x90

먼저 설치 완료한 k8s-master를 킨 후 mobaxterm으로 접속하여 준다

 이후 node01-03까지 전부 킨 후 "kubectl get nodes"를 입력하여 정상적으로 연결가능 여부를 확인하여 준다

 

01-01. 쿠버네티스 입문.pdf
0.16MB

쿠버네티스 책 p.96~103

◆ 마스터 노드

 ◇ kubectl

  - kubectl을 통해서 쿠버네티스의 명령을 내리는 역할이며, 바로실행되는 바이너리구조이기에 master에만 있을 필요는 없음

 ◇ API 서버

  - 이 명령을 입력 시 api서버로 전송하는 데 메인 전송 통로역할을 하여 필요한 서버들에다가 해당 명령어를 보내주는 것

 ◇ etcd

  - 구성 요소들의 상태 값이 모두 저장되는 곳 = 모든 보고내용을 기록하는 노트

  - 분산저장 가능한 key-value 저장소이기에 복제하여 저장하여 놓으면 하나의 etcd가 장애가 나거나 서버 정보가 날라가도 etcd가 하나라도 멀쩡하면 복구가 가능하다

 ◇ 컨트롤러 매니저

  - 클러스터의 오브젝트 관리

  - 상태 체크와 복구 및 요청받은 pod 개수대로 생성과 서비스와 pod 연결 등의 다양한 상태 값을 관리

 ◇ 스케쥴러

  - 노드의 상태와 자원, 레이블, 요구조건 등을 고려해 pod를 어떤 워커노드에 생성할 지 결정하고 할당

 

◆ 워커 노드

 ◇ kubelet

  - pod 구성내용(PodSpec)을 받아서 컨테이너 런타임으로 전달 및 컨테이너 정상 작동여부를 모니터링

 ◇ 컨테이너 런타임

  - pod를 이루는 컨테이너의 실행을 담당

 ◇ Pod

  - 한개 이상의 컨테이너로 단일 목적의 일을 하기 위해 모인 단위

  - 언제라도 죽을 수 있는 존재 이기에 이해와 주의 필요

02-01. Pod.pdf
0.42MB

 

 

  순서대로 진행하면서 "kubectl apply -f deployment.yaml"을 실행

  ※되지 않을 경우 api버전이 적은 것과 달라서 이기에 home에서 test 디렉토리를 생성하여 "vim deployment.yaml" 파일을 생성하여 내용 추가

 하여 수정한 후 다시 시도 시 가능해짐

 

  kind = 내가 만들고 싶은 쿠버네티스의 오브젝트

  ㄴapi-resources를 통해 들어가는 이름과 경로 등을 확인할 수 있다

 

  지울때 아래 명령어를 통해 삭제하며, 만들 때는 apply를 통해 만들 수 있다

 

  #외부하고 연결 시 kube-proxy가 연결해주어야 하나 연동되지 않아 pod와 외부와는 연결되지 않음

  

  이제 pod의 이름과 버전 등을 설정하여 주기 위해 실습을 진행한다

02-02. [실습] 컨테이너로 환경변수 전달.pdf
0.40MB

쿠버네티스 책 p.112~

  먼저 "mkdir -p sources/ch02/02_env && cd $_"로 해당 디렉토리를 상위디렉토리까지 전부 생성 후 접속하고

  "vim hello-app.yaml"파일을 생성하여 내용을 입력한 후 (맨위에 apiVersion: v1내용포함)

  "vim nginx-pod.yaml"파일을 생성하여 내용을 입력하여 준다

  이후 "kubectl run nginx-pod --image=nginx"명령어를 입력하여 생성하여 준 후

  "kubectl get pod"로 컨테이너를 확인할 수 있다 (Creating > Running)

  그 후 "kubectl create nginx-pod --image=nginx"하면 되지않으나 "kubectl create deployment dpy-nginx --image=nginx"를 통해 pod가 아닌 deployment를 만들 때는 사용가능하다

 

  그리고 "kubectl get pod"를 사용하여 내용을 확인할 수 있다

   (만약 Running이 되지 않을 경우 마지막에 버전 nginx:1.14.2 추가)

  "kg po"로도 확인가능

  ㄴ안될 시 ~/.bashrc의 내용에 추가하여 준 후 reboot

 

  pod  :  단일개체

  replicaset  :  pod의 개수를 늘려주는(복제) 역할(개수 지정)

  deployment  :  여러개의 pod를 관리

  ㄴ내용을 보면 1개가 안되는 것을 볼 수 있는 데 wide 명령어 옵션을 추가하여 어떤 node의 문제인지 알 수 있다

  이렇게 출력된 내용을 자세히 보면 알수 있는 부분이 있으며 pod는 곂치면 안되기에 다 다른것을 볼 수 있다

 

  그리고 deployment를 삭제하는 방법이 있으며,

  이제 test/deployment.yaml 을 사용한다면

  ㄴ이름, replica 개수, 사용 이미지 등을 동일하게 설정가능

 

  주의사항으로는 deployment는 create하면서 replicas를 할 수 는 없으며, 만든 후 scale을 통해 변경할 수 있다

  그렇기에 파일로 만들어서 여러개의 pod를 만들 수 있는 데 이것을 오브젝트 스펙이라 한다

  ㄴ기본 metadata에는 name과 labels가 있는 데 레이블즈는 태그지정과 같이 특정 이름표라고 생각하면 된다

 

  이제 pod를 전부 삭제한 후 nginx-pod.yaml파일로 생성하여 준다

  그 후 replicas를 3으로 변경한 후 생성하여 주면

  이렇게 생성된 것을 볼 수 있으며

  replicas를 6개로 더 늘려주고 실행하게 되면

  이미 있다고 표기되기 때문에 생성이 되어있다면 apply를 이용해야한다

  이렇게 기존 3대에서 6대가 더 생성된 것을 볼 수 있다 (동일한 node01만 되지 않으며, 사람마다 안되는 node가 다름)

 

  다시 pod 전부 삭제를 한 후

 

  이후 각 pod와 deployment에 대한 정보를 보고 싶다면 "kubectl explain __"의 형식으로 정보를 확인 할 수 있다

 

  네트워크 네임스페이스 (vlan처럼 논리적 격리)는 3계층 ip를 활용하여 구분지어 주는 것

 

  예를 들어서 Apache2에서 /var/www/html/index.html이면 https://192.168.56.10/index.html 로 설정되는 데

  local에서는 /var/www/html/이라는 디렉토리가 있으며 root까지 더 올라갈 수 있지만 

  웹에서는 192.168.56.10/의 / 가 root디렉토리가 되기 때문에 이 부분을 "chroot"라고 한다

  chroot를 쓰려면 루트권한이 필요하며, chroot에서 시작된 프로세스또한 루트권한으로 움직인다

참고 : 리눅스 namespace 이해하기 인용

 

  이제 다시 ~/sources/ch02/02_env/ 디렉토리에서 hello-app.yaml파일로 kubectl을 생성하여 준 후

  생성된 ip의 8080포트로 접속 시 html값을 확인할 수 있다

  이렇게 내부에서는 웹에 접속 시 내용을 확인할 수 있으나 56.102로 등록된 ip로 외부접속은 되지 않는 것을 볼 수 있는 데

  외부에서 접속하기 위해서는 포트포워딩이 되어 있어야 따로 접속이 가능하다

728x90