• control plane(master node)
• worker node


-컨테이너화 증가
-컨테이너를 사용한 어플리케이션이 증가하였다
-컨테이너를 관리 할 수 있는 플랫폼에 대한 필요성 증가
-클라우드의 증가
-On Premise의 문제점
배포 관리 방법이 기본적으로 어려웠다.
-자동 배포, 확장 (오케스트레이션)
-수직 오토 스케일링 (Vertical Pod Autoscaler - VPA):
-수평 오토 스케일링 (Horizontal Pod Autoscaler - HPA):
-Auto Healing
-Node Auto Healing:
-Pod Auto Healing:
▶kubectl : 쿠버네티스의 명령줄 툴
▶노드 (Node) : 컴퓨터
▶클러스터 (Cluster)
▶클러스터 구성요소 : 쿠버네티스 클러스터는 컨트롤 플레인(마스터 노드)과 컴퓨팅 머신(워커 노드)
▶네임스페이스 (Namespace) : 클러스터 내의 논리적인 분리 단위이다.
@네임스페이스가 필요한 이유
▶파드 (Pod) : 컨테이너의 집합
▶네트워크 공유: Pod에 포함된 모든 Container는 동일한 하나의 IP 주소를 갖는다.
▶Volume 공유: Pod의 Container들은 Volume 을 공유하여 사용하는 것이 가능하다.
▶컨트롤 플레인 (Control Plane) : 쿠버네티스의 노드를 제어하는 프로세스들이 모여있는 곳이다.
▶컨트롤 플레인 구성 요소
-kube-apiserver (API 서버)
-etcd (분산 저장소)
-kube-controller-manager (컨트롤러 관리자)
-kube-scheduler (스케줄러)
@ kube-apiserver (API 서버): kube-apiserver를 아주 쉽게 비유하면 "중앙 통제실"이다.
@ etcd (분산 저장소): etcd를 쉽게 비유하면 "클러스터의 저장소"이다
@ kube-scheduler (스케줄러): kube-scheduler를 아주 쉽게 비유하면 "창고 관리자"이다.
kubectl ( 확인 명령어 )
- Kubernetes 클러스터 내의 노드들의 상태를 확인
( kubectl get nodes )- 등록된 노드들의 상세 정보를 넓은(wide) 형식으로 출력
( kubectl get nodes -o wide )- 해당 노드의 자원 상태, 이벤트, 조인된 파드, 용량, 라벨, 애너테이션 등의 상세 정보를 확인 ( kubectl describe node master.example.com )
[root@master ~]# kubectl run webserver --image=nginx:1.14 --port 80
[root@master ~]# kubectl get pods
[root@master ~]# kubectl describe pod webserver
[root@master ~]# kubectl get pods -o wide ⇒ 어느 노드에 생성 되었는지 확인
[root@master ~]# curl http://10.44.0.1 ⇒ webserver IP
[root@master ~]# kubectl get pods webserver ⇒ 여러개의 파드중에서 확인 하고 싶은거 .
[root@master ~]# kubectl create deployment mainui --image=httpd --replicas=3
⇒ run 은 하나만 생성 , create deployment 는 여러개 생성
[root@master ~]# kubectl describe deployments.apps mainui
[root@master ~]# kubectl get pod webserver -o wide
[root@master ~]# kubectl get pod webserver -o yaml
[root@master ~]# kubectl get pod webserver -o json
파드 생성 ( CLI 방식 )
- 파드 생성
( 이미지와 포트 지정, kubectl run webserver --image=nginx:1.14 --port 80 )- Kubernetes 클러스터 내 현재 실행 중인 파드들의 목록을 표시
( kubectl get pods )- Kubernetes 클러스터 내에서 특정 파드인 "webserver"의 상세 정보를 출력
( kubectl describe pod webserver )
- node2에서 동작 중 ( 로드 밸런서 역할 )
- curl을 통해 호출
deployment mainui 삭제
파드 생성 ( create, create와 run의 차이점 : create는 여러 개 생성 가능 )
- Kubernetes 클러스터 내에 "mainui"라는 이름의 디플로이먼트를 생성하고, 이를 위한 파드를 관리 ( kubectl create deployment mainui --image=httpd --replicas=3 )
- JSON 형식으로 "webserver" 파드의 정보를 출력
( kubectl get pod webserver -o json )- yaml 형식으로 "webserver" 파드의 정보를 출력
( kubectl get pod webserver -o yaml )
- kubectl delete deployments mainui
[root@master ~]# kubectl run echoserver --image="k8s.gcr.io/echoserver:1.10" --port=8080
*생성된 파드로 접근
[root@master ~]# kubectl port-forward svc/echoserver 8080:8080
⇒ 외부 로컬PC에서 접속하기 위해서 포트포워딩 하기

파드 생성 후 포트 포워딩 및 접속 확인
- Kubernetes 클러스터 내에 "echoserver"라는 이름의 파드를 생성하고, 지정된 이미지를 사용하여 해당 파드를 실행
( kubectl run echoserver --image="k8s.gcr.io/echoserver:1.10" --port=8080 )- "echoserver" 파드를 외부에 노출시키기 위해 서비스를 생성
( po: pod, kubectl expose po echoserver --type=NodePort )- type과 port 확인 ( kubectl get services )
- 로컬 pc에서 접속하기 위한 포트 포워딩
( kubectl port-forward svc/echoserver 8080:8080 ( svc/echoserver: echoserver라는 이름의 서비스 ) , 포트 포워딩을 안해도 curl로 접속 가능 )
-기존 마스터 에서
pods 삭제
- kubectl delete pod echoserver ( pod 삭제 후 service 삭제 )
- kubectl delete service echoserver
- kubectl get pods, kubectl get services로 확인
새로운 마스터 창에
[root@master ~]# kubectl get pods -o wide --watch ⇒ 실시간 확인
pods 실시간 확인
- 실시간으로 pods를 확인 ( kubectl get pods -o wide --watch )
#vi example.yaml

pods 생성 (yaml 파일)
- vim example.yaml
- 지정된 이미지를 이용해서 배포하는 yaml 파일 작성
- Kubernetes 클러스터에 새로운 리소스를 생성하기 위해 YAML 파일을 사용
( -f: 파일 지정 옵션 , kubectl create -f example.yaml )- 배포 확인 ( kubectl get deploy )
- kubectl get rs ( 갯수 확인 )
pods 생성을 늘렸다 줄였다 할 수 있다 (scaling)
- --replicas 옵션을 이용해서 스케일링 ( kubectl scale deploy deploy-exam --replicas=5 )
- kubectl get pod -o wide
- kubectl scale deploy deploy-exam --replicas=3
- kubectl get pod -o wide
삭제
- kubectl delete deploy deploy-exam
*파드 생성 두가지 방법
*외부에서 접속하기 위해 포트포워딩 .
이미지를 지정하여 배포 ( deploy )
- kubectl create deployment testui --image=httpd --replicas=3
- kubectl describe deployments testui ( 자세하게 확인 )
- kubectl get deployments testui -o wide
- kubectl get deployment -o yaml ( 저장해서 배포 가능 )
삭제
- kubectl delete deployment testui
-외부접속 테스트
-컨테이너 안으로 진입
컨테이너 진입 (pod)
- kubectl run webserver --image=nginx:1.14 --port 80
- kubectl exec webserver -it -- /bin/bash
- cd /usr/share/nginx/html/ (컨테이너로 진입 후)
- echo "05-08 TEST WebServer" > index.html
- 빠져나와서 curl 10.36.0.6, kubectl logs webserver로 확인
-포트 포워딩 후 접속
포트 포워딩
- kubectl port-forward webserver 8080:80 ( 포트 포워딩 )
- 포트 포워딩 접속 확인
삭제
- kubectl delete pod webserver ( 삭제 )
[root@master ~]# kubectl run webserver2 --image=nginx:1.14 --port 80
Error from server (AlreadyExists): pods "webserver2" already exists
*야물파일을 만들어 놓고 실행 하면 생성이 됨.
yaml 파일을 이용해서 pod 생성
- kubectl create -f testserver.yaml


*마스터용 컴포넌트
*노드 용 컴포넌트
*애드온( CNI )
*NameSpace : k8s 네임스페이스
[root@master ~]# kubectl get namespaces
[root@master ~]# kubectl get pod --namespace default
[root@master ~]# kubectl get pod -n default
네임 스페이스
- kubectl get namespace로 네임 스페이스 확인
- kubectl get pod --namespace default( kubectl get pod -n default ) 로 확인
-야물파일 생성을 하면 기본적으로 default namespaces 에 지정, 생성됨
#cat > nginx.yaml ( 컨트롤 D로 저장 / 종료 )

[root@master ~]# kubectl create -f nginx.yaml
[root@master ~]# kubectl get pods -n default
[root@master ~]# kubectl create namespace orange --dry-run -o yaml
⇒ 만드는 방법을 보여줌.


[root@master ~]# kubectl create namespace orange --dry-run -o yaml > orang-ns.yaml
yaml파일 생성 시 기본적으로 default namespace에 지정
- vi nginx.yaml
- 네임스페이스 지정 안함
- kubectl get pods --namespace default로 확인
네임 스페이스 생성
- 네임 스페이스 생성 방법
( orange라는 이름의 네임 스페이스를 요약해서 생성 ,
kubectl create namespace orange --dry-run -o yaml )- kubectl create namespace orange --dry-run -o yaml > orange-ns.yaml
( 네임 스페이스 생성 내용을 orange-ns.yaml 파일에 저장 )- cat orange-ns.yaml로 확인
네임 스페이스 수정
- nano orange-ns.yaml ( 수정 )
- 필수 내용 제외하고 제거
- kubectl create -f orange-ns.yaml로 생성
- kubectl get namespace로 확인
[root@master ~]# kubectl create -f orange-ns.yaml
namespace/orange created
#kubectl get namespaces
*야물파일을 수정해서 네임스페이스 생성 [ 야물파일에 위치를 지정 ]

pod 생성 ( 네임스페이스 : orange )
- kubectl create -f nginx.yaml -n orange
- kubectl get pods -n orange로 확인
- 네임 스페이스를 지정 안하면 default로 생성, kubectl get pods는 default만 보여줌
- -n으로 네임 스페이스를 지정하면 이름이 같더라도 pods 생성 가능
*blue이름의 네임스페이스 생성
*nginx.yaml 파일을 수정 blue 네임스페이스에 mypod 생성
( 네임 스페이스가 다르기 때문에 같은 이름의 pods 생성 가능 )
#kubectl get pods하면 default 에 할당된 파드만 보이기에 orang, blue에 할당된 파드 는 안보임
⇒ 네임 스페이스에 할당된 파드를 지우려면 네임스페이스를 지우면됨.
⇒context 수정을 해야함.

-중간에 contexts 부분을 blue 로 수정

기본 네임스페이스를 만들어져 있는 네임 스페이스로 교체
- kubectl config view로 기본 정보 확인 ( context 내용 )
- kubectl config set-context blue@kubernetes --cluster=kubernetes --user=kubernetes-admin --namespace=blue
- 변경된 정보 kubectl config view로 확인
클러스터 추가 설정
- kubectl config current-context
( 현재 활성화된 Kubernetes 클러스터의 컨텍스트 이름이 출력 )- kubectl config use-context blue@kubernetes
( blue@kubernetes" 컨텍스트가 활성화되며,
해당 컨텍스트에 정의된 클러스터와 네임스페이스가 현재 활성화 )
-다시 원래상태로 되돌리기
*기본 네임스페이스를 변경 하고 노드를 추가 할 때 상황에 따라서 토큰이 필요로 할때 가 있음
[root@master ~]# kubeadm token list ⇒ 리스트 확인 [ 시간확인 ]
-1시간 짜리 토큰 생성

-default 네임스페이스에서 생성된 파드 확인 / 삭제

[root@master ~]# kubectl delete namespaces blue ⇒ blue 안에 있는 파드가 모두 삭제됨.
namespace "blue" deleted
토큰 설정
- 토큰 리스트 확인 ( 시간 확인, kubeadm token list )
- kubeadm token create --ttl 1h ( 토큰 생성, 만료 시간 1시간 )
- kubectl delete pods testpod -n default ( 원하는 pod 삭제 )