가상머신 IP 주소

kube-control1 : 192.168.56.11

kube-node1 : 192.168.56.21

kube-node2 : 192.168.56.22

kube-node3 : 192.168.56.23

 


Kubernetes
 - 컨테이너 오케스트레이션 도구
 - 구글 내부 프로젝트 Borg를 2015년 경 구글이 Linux Foundation의 CNCF(Cloud Native Computing Foundation)에 기부하고 다른 벤더사들과 같이 Kubernetes를 공동 개발함
 - 조타수, 파일럿을 의미하는 그리스어에서 이름이 유래됨


Kubernetes가 제공하는 기능
 - Container Platform
 - Microservice Platform
 - 이식성 좋은 Cloud Platform

Kubernetes가 제공하지 않는 기능
 - CI/CD 파이프라인
 - 애플리케이션 레벨의 서비스
 - 로깅, 모니터링, 경고 솔루션

 

쿠버네티스는 선언적 API다.

ex. POD를 5개 띄우겠다 : 5개 진짜 띄워짐.

 

쿠버네티스는 크게 Control Plane과 Node로 이루어지는데, Control Plane은 Node를 관리하는 머신이고

Node가 실제 Computing Power가 있는 머신이다.


Kubernetes 설치 방법
1. kubeadm을 이용한 Kubernetes 설치
2. kubespray를 이용한 Kubernetes 설치


kubeadm을 이용한 Kubernetes 설치

(모든 VM에서 진행)

Ubuntu APT Repository 추가를 위한 패키지 설치
sudo apt-get update -y
sudo apt-get install -y apt-transport-https ca-certificates curl gnupg lsb-release -y

Docker Repository 추가
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

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

-> 받아온 gpg를 docker repository에 넣어주는 과정이래

lsb_release -cs는 우분투 버전에 맞게 넣어주려고 한거래

 

cat /etc/apt/sources.list.d/docker.list 하면 확인할 수 있대


sudo apt-get update -y (도커 레지스토리 들어간거 반영해서 다시 업뎃해주는거임)

Docker Engine 및 containerd.io Container Runtime 설치
sudo apt-get install docker-ce docker-ce-cli containerd.io -y

쿠버네티스 공식 사이트에도 아래 커맨드들 있는데, 실제 운영 환경에서 부족한 점이 있어서 일부 추가한 명령어들이 있다.
Kubernetes APT Repository 추가
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg

ㄴ 이거 안돼서 쿠버 독스 밑에껄로 하니까 잘됨. 뭔 차이임?

 

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

 


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

sudo apt-get update -y

 

구버 독스 그냥 쿠버 설치하는거 따라해버리면 운영 환경에서 문제가 좀 있을 수 있대.

docs는 이렇게 써있찌

무슨 문제가 있을까?

1. 그냥 저렇게 받으면 가장 최신 버전을 받게 되고, 그럼 예기치 못한 문제가 있을 수 있다.

2. 쿠버네티스 버전마다 변경 사항이 있어서, 어떤 실습이 안될 수도 있다.

 

개꿀팁

(인프라를 운영할 때는, 최신버전보다 검증된 버전을 받는게 좋다.

그리고 그냥 apt-get install -y kubectl 하면 시간에 따라서 버전이 달라질 수 있다.

그럼 버전에 따라서 쿠버의 아키텍쳐가 차이가 있을 수도 있어.

최대한 버전 차이를 가급적이면 안만드는게 좋아. 내가 제어 가능하도록.)


sudo apt-get install -y kubelet=1.19.11-00 kubeadm=1.19.11-00 kubectl=1.19.11-00

sudo apt-mark hold kubelet kubeadm kubectl

개꿀팁2
쿠버네티스가 동작중인 상태에서 apt-get update나 upgrade를 해버리면, 업뎃이 되면서 문제가 될 수 있겠지.
그래서 버전을 고정해버리는거야.

실수로 업뎃하다가 장애가 발생하면 안되잖아.

 

--- 여기까지 하면 쿠버네티스 패키지 설치까지는 다 된거야. ---


(kube-control1) -- Control Plane에서

sudo kubeadm init --control-plane-endpoint 192.168.56.11 --pod-network-cidr 192.168.0.0/16 --apiserver-advertise-address 192.168.56.11


mkdir -p $HOME/.kube

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

control plane의 .kube/config  이 인증정보가 있어야 kubectl 명령어를 사용할 수 있다.


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

-> $(id -u):$(id -g) => vagrant:vagrant 요거 말하는거임.

kubectl create -f https://docs.projectcalico.org/manifests/calico.yaml

복붙 안되면 그냥 쳐봐. 그럼 됨.

------

(kube-node1 ~ kube-node3) -- Kubernetes Cluster에 Node 가입
sudo kubeadm join 192.168.56.11:6443 --token TOKEN_VALUE \
    --discovery-token-ca-cert-hash sha256:HASH_VARLUE
쿠버네티스 클러스터에 join하는 명령어

sudo kubeadm join 192.168.56.11:6443 --token df5nb7.8dsh1bgzkwskmhyd \
    --discovery-token-ca-cert-hash sha256:971678d140be0fd1a558174cf88b78c33d1c08a63e7366a974f020c7ed7afe6d



-------

Kubernetes Cluster 구성 요소
 - Control Plane, Nodes

 - Control-Plane : Kubernetes Cluster를 제어하기 위한 서버
                        (master) <-예전 용어
 - Nodes : Container를 실행할 수 있는 컴퓨터

Control Plane 구성요소
- kube-apiserver
  - Kubernetes Cluster의 모든 구성 요소들이  Control Plane에 위치하는 API 서버를 거쳐 메시지를 주고 받음

- etcd : Key-Value로 구성된 Kubernetes Cluster를 구성하는 데이터베이스

(쿠버네티스 오브젝트의 상태 정보들이 저장) 별도로 구성할 수도 있지만 control plane 내에 보통 위치.

- kube-scheduler : 새로 생성되는 Pod를 감지하고 적절한 노드에 배정하는 역할을 수행하는 컴포넌트
- kube-controller-manager 
   Controller는 API Server를 통해 Cluster의 상태를 감시하고 필요한 상태로 유지하도록 기능을 수행하는 컴포넌트
   Controller Manager는 Controller의 기능을 지원하기 위한 구성요소

 - cloud-controller-manager : 
    Kubernetes가 Cloud와 연동되기 위한 Controller Manager


Nodes 구성요소
 kubelet : Kubernetes Cluster의 Agent 역할을 수행하며 각 노드에 존재하는 구성요소
 kube-proxy : Kubernetes Cluster의 각 노드의 네트워크 기능을 담당하는 구성요소


kubectl 기본 명령어

kubectl 명령어 구조
kubectl SUBCOMMAND [RESOURCE] [ARG]


Kubernetes Cluster 정보 조회
kubectl cluster-info


Kubernetes master is running at https://192.168.56.11:6443
KubeDNS is running at https://192.168.56.11:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy


Kubernetes Cluster의 노드 목록 조회
kubectl get nodes

node들이 전부 ready라고 되어있어야 정상. master = control plane임. 원래 control plane이라는 말 쓰기 전에 master라고 했음.

 

c:\vagrant_home\k8s>kubectl get nodes
Unable to connect to the server: dial tcp: lookup akscloocus-dockergroup-b9ed51-193d42d5.hcp.eastus.azmk8s.io: no such host

c:\vagrant_home\k8s>kubectl cluster-info

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
Unable to connect to the server: dial tcp: lookup akscloocus-dockergroup-b9ed51-193d42d5.hcp.eastus.azmk8s.io: no such host

이슈)

원래 control plane의 .kube/config 내용 복붙해서 docker host의 vgrant_home/k8s/.kube/config 여기에 넣으면

외부에서도 원격으로 접속 된다고 했거든? 근데 안되는데? ㅡㅡ. 에러뜸. kubectl get nodes 안먹힘.

-> 이거 내가 뭔가 잘못 설정한듯 ㅋㅋㅋㅋ azure aks할 때 먼가 건드려서 그런거같음.



Kubernetes API

 alpha version API
    버그가 있을 수 있으며 기본적으로 비활성화되어 있음
    기능에 대한 기술지원이 공지 없이 중단될 수 있음
    다음 버전 릴리즈시 호환성이 깨지는 방식으로 지원될 수 있음

 beta version API
   기본적으로 활성화되어있음
    기능에 대한 구체적인 내용이 변경될 수 있으나 기술지원이 중단되지 않음
    stable version에서 호환성이 깨지는 방식으로 지원될 수 있으나 다음 버전으로 마이그레이션이 지원됨

 stable version API
    버전이름이 vN 형태로 지정되는 버전
    이후 여러 버전의 소프트웨어 릴리즈에 포함됨


Kubernetes Cluster에서 지원되는 API 버전 확인
kubecl api-versions


Kubernetes Cluster에서 지원되는 오브젝트 종류 및 버전
kubect api-resources



쿠버네티스 오브젝트 관리 (오브젝트란 뭔데?)
1. 명령형 커멘드
  kubectl 명령어에 인수 또는 옵션을 지정하여 애플리케이션을 관리함
  일회성 작업에서 주로 사용됨

kubectl SUBCOMMAND OBJECT OBJECT_NAME
  kubectl run nginx --image nginx:1.14
  kubectl create deployment nginx --image nginx:1.14

2. 명령형 오브젝트 구성
  오브젝트를 Manifest  File로 정의함
   kubectl 명령어에서 YAML이나 JSON  파일을 인수로 사용하여 오브젝트를 관리함
   kubectl create -f MANIFEST
   kubectl delete -f MANIFEST

3. 선언형 오브젝트 구성
   특정 디렉터리에 모든 오브젝트 파일을 배치하여 관리함
   kubectl  명령어에서 디렉터리를 인수로 하여 오브젝트를 관리함
   kubectl create -f DIR


명령형 커맨드로 애플리케이션 실행
명령어로 nginx Pod 생성
kubectl run nginx --image nginx:1.14


파드에 접근 가능하도록 네트워크 서비스 생성
kubectl expose pods nginx --port=80 --protocol=TCP --name test-svc --type=NodePort

-> localhost로 접근하니까 안되다가 Cluster IP로 접근하니까 되네.


네트워크 서비스 확인
kubectl get services
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP        3h31m
test-svc     NodePort    10.108.78.38   <none>        80:32270/TCP   54s

curl http://10.108.78.38

 

yaml파일 작성 전에 지금 돌아가는 pod이랑 서비스를 지워보자

의아한 것)

pod을 지웠는데 서비스는 남아있어. pod과 서비스의 개념을 자세히 알 필요가 있다.

아! 서비스는 그냥 네트워크 관련한거라 그런가?


hello-pod.yaml [<- yaml 관련 게시글 참고. 중괄호같이 묶어주는게 없어서 indentation이 굉장히 민감하다.]
------
apiVersion: v1
kind: Pod
metadata:
  name: hello-pod
spec:
  containers:
  - name: nginx-hello
    image: nginx:1.14
    ports:
    - name: web-port
      containerPort: 80
      protocol: TCP
------

Manifest File 작성
vim hello-pod.yaml


Manifest File에 정의한 내용으로 오브젝트(파드) 생성
kubectl create -f hello-pod.yaml

생성한 파드를 파드 목록 확인
kubectl get pods

kubectl get nodes -o wide 하면 더 자세하게 볼 수 있음
kubectl get nodes -o json 하면 json 형식으로 나옴

 

kubectl get nodes kube-node1

자세하게 나옴니당

 

kubectl get nodes -o wide 하면 자세하게 나옴

kubectl get pods hello-pod (이렇게 하면 이 pod에 대해서 더 자세하게 나옴)

kubectl get pods hello-pod -o json (일케 하면 json형태로 출력)

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기