Metrics Server

: Pod과 Node들의 CPU/Memory 사용량을 주기적으로 모니터링하고 metrics 정보를 수집하여 API Server에 제공

(pod Autoscaling 을 위해 반드시 필요함)

 

 

metric server 설치여부확인

-  kubectl top nodes
-  kubectl top pods -A

 

Metric Server 설치

-  yum install git -y
-  git clone https://github.com/237summit/kubernetes-metrics-server.git
-  cd kubernetes-metrics-server
-  kubectl apply -f .
-  kubectl get deploy -A
-  kubectl get pod -n kube-system

metrics server를 통한 각 node와 pod의 사용량 확인

 

'Study > Cloud' 카테고리의 다른 글

AZ-800 (GPO)  (0) 2022.07.27
AZ-800 (AD)  (0) 2022.07.26
Kubernetes - 인증과 권한  (0) 2022.07.25
Kubernetes - Pod Scheduling  (0) 2022.07.25
Kubernetes - Controller-2  (0) 2022.07.23

※ 실시간으로 pod monitoring

-  kubectl get pod -o wide --watch
-  watch kubectl get pod -o wide

 Job 

:  배치 처리에 적합한 Controller로서 Pod의 성공적인 완료를 보장

:  Job을 사용하여 Pod를 실행하면?

  • Pod의 작업이 정상적 종료 → 완료
  • Pod의 작업이 비정상적 종료다시 실행시켜 Application의 작업을 하도록 함

전제 : Kubernetes에서 Pod은 항상 Running

실습) Job
- wget http://down.cloudshell.kr/k8s/lab/job/job-exam1.yaml
- watch kubectl get pod -o wide
- kubectl apply -f job-exam1.yaml
60초 동안 sleep 프로세스 진행 중

60초 이내에 pod 종료(비정상적 종료)
- kubectl delete pod pod_name 이렇게 하면 다시 생성한다

새로운 Pod 재시작

60초 후에 Pod 보기(정상적 종료)
- kubectl get job

정상적 종료되었기에 Pod이 Completed가 됨

(application 실행이 종료되어도 Pod은 재시작하지 않음)


Job으로 만든 Pod 삭제 시 
-  kubectl delete job job_name

 

backoffLimit 옵션

-  backoffLimit: 10 이라면 10번까지 Pod/Container재시작한다(기본값6)


restartPolicy 옵션 (비정상적 종료일 때)

  • restartPolicy:Never = Pod를 재시작
  • restartPolicy:OnFailure = Pod를 재시작하지 않고 Container를 재시작 (Pod 재시작 시 IP가 바뀔 수 있기 때문)
실습 1) 명령이 잘못된 Pod를 실행하는 경우 (restartPolicy:OnFailure)
-  wget http://down.cloudshell.kr/k8s/lab/job/job-exam-error1.yaml
잘못된 명령어

-  kubectl apply -f job-exam-error1.yaml

▶ 이렇게 하면 6번까지 Pod이 아닌 Container가 재시작된다. 이렇게 하다가 해결되지 않으면 Pod만을 삭제한다.


실습 2) 명령이 잘못된 Pod를 실행하는 경우 (restartPolicy:Never)

-  wget http://down.cloudshell.kr/k8s/lab/job/job-exam-error2.yaml
-  kubectl apply -f job-exam-error2.yaml

 이렇게 하면 Container가 아닌 Pod이 재생성된다. (여러 개의 Pod이 생성) 이렇게 하다가 해결되지 않으면 Pod만을 삭제해 버린다.

 

 CronJob 

사용자가 원하는 시간에 Job 실행을 예약하는 것

:  Job의 기능을 포함 (즉, CronJob → Job → Pod)

단지, schedulejobTemplate만 추가된 것이다.

:  반복해서 실행하는 Job을 운영할 때 사용 (주기적인 Data Backup, Email 전송, Log 파일 및 불필요한 데이터 삭제)

 

CronJob 표기법: "분 시간 날짜 월 요일"

  • 분: 0~59
  • 시간: 0~23
  • 날짜: 1~31
  • 월: 1~12
  • 요일: 0~6 (일요일~토요일)
  • *는 전체를 의미
예시)
매월 1일 3시 정각에 실행하라: 0 3 1 * *
주말 새벽 3시 정각에 실행하라: 0 3 * * 0,6
5분마다 반복해서 실행하라: */5 * * * *

 

실습) CronJob
-  wget http://down.cloudshell.kr/k8s/lab/cronjob/cronjob-exam1.yaml   

yaml

-  kubectl apply -f cronjob-exam1.yaml

1분이 지나면 Job이 시작되어 pod이 실행되고, 10초 후에 완료된다. 이 과정을 계속 반복한다.

성공한 Job은 3개까지 남아있는 것이 Default 값. 4번째 Job이 성공하면 첫 번째 Job은 삭제된다.
(kubectl get cronjob -o yaml보면 successfulJobsHistoryLimit: 3으로 되어 있다)


계속 Job실행되므로 CronJob중지하여 JobPod삭제한다
-
kubectl delete cronjobs.batch --all

 

 

'Study > Cloud' 카테고리의 다른 글

Kubernetes - 인증과 권한  (0) 2022.07.25
Kubernetes - Pod Scheduling  (0) 2022.07.25
Kubernetes - Controller  (0) 2022.07.22
Kubernetes - Service  (0) 2022.07.22
Kubernetes - Pod  (0) 2022.07.21

Controller

: Pod를 다양한 방식으로 배포, 관리하는 기능을 수행

 

출처 https://azderica.github.io/00-kubernetes/

https://kubernetes.io/ko/docs/concepts/workloads/controllers/

 

워크로드 리소스

운영 수준의 컨테이너 오케스트레이션

kubernetes.io

 

 Replication Controller 

: 항상 Cluster 안에서 지정된 숫자만큼의 Pod가 동작되도록 한다

 

-  kubectl apply -f replicationcontroller.yaml
yaml
-  kubectl get rc,pod -o wide
-  kubectl delete pod nginx-g5wrg → 특정 pod 삭제 시 새로운 pod 생성됨

-  kubectl run myhttp --image=httpd --labels="app=nginx" --port 80
-  kubectl get rc,pod -o wide --show-labels
새로 만들어진 pod는 알아서 종료된다.
-  kubectl edit rc nginx → pod의 이미지, 갯수 등 다시 설정할 수 있다.


-  kubectl delete rc nginx →  Replication Controller 삭제 시 Pod도 삭제됨!!
-  kubectl delete rc nginx --cascade=orphan → Replication Controller만 삭제되고 Pod는 그대로 유지

 

 ReplicaSet 

: Replication Controller와 동일한 역할

차이점은 Replicaion Controller보다 더 많은 selector를 가진다는 점이다.

 

-  wget http://down.cloudshell.kr/k8s/lab/replicaset/replicaset-nginx.yaml
-  kubectl apply -f replicaset-nginx.yaml

-  kubectl delete -f replicaset-nginx.yaml --cascade=orphan → Pod는 그대로 남고 replicaset만 삭제됨

-  kubectl delete rs --all → 전부 삭제

 

 Deployment 

: Deployment는 ReplicaSet을 사용하여 Pod 개수를 조정함

: Deployment를 생성하면 자동으로 ReplicaSet과 Pod이 생성됨 (Deployment를 삭제하면 자동으로 전부 삭제됨)

: Pod의 Rolling Update 및 Rolling Back 을 위해 주로 사용

 

실습) Rolling Update
-  wget http://down.cloudshell.kr/k8s/lab/deployment/deployment-v1.yaml
-  kubectl apply -f deployment-v1.yaml --record (--record: 업데이트 과정을 history로 기록)
-  kubectl rollout history deployment app-deploy
deployment의 history를 볼 수 있다.

-  kubectl set image deploy app-deploy myweb-con1=nginx:1.15 --record
-  kubectl get pod  → pod가 하나씩 순서대로 Update 된다
-  kubectl describe pod (pod명)
이미지 업데이트 적용

-  kubectl set image deploy app-deploy myweb-con1=nginx:1.16 --record
-  kubectl set image deploy app-deploy myweb-con1=nginx:1.17 --record

-  kubectl rollout history deployment app-deploy
history 확인

-  kubectl rollout undo deploy app-deploy 
undo 결과

-  kubectl rollout undo deploy app-deploy --to-revision=2  → 특정 단계로 돌아간다

 
 Daemon Set 
 
:  Cluster 모든 Node에 Pod를 한 개씩만 배정
:  ReplicaSet과 비교했을 때  --replicas 옵션이 없다

-  wget http://down.cloudshell.kr/k8s/lab/daemonset/daemonset-nginx.yaml
-  kubectl apply -f daemonset-nginx.yaml
-  kubectl apply -f replicaset-nginx.yaml

ReplicaSet과는 다르게 DaemonSet은 한 노드에 하나의 pod만 배정된다.

 

 StatefulSet 

:  관계를 계속해서 유지하는 것

:  즉, 관계의 상태를 유지해야 하는 application을 관리할 때 사용

:  주로 Pod의 이름 순서와 고유성을 보장하는 데 사용

:  상태를 유지하는 항목 ▶ Pod 이름을 순서대로 명명(0~N), Pod의 Volume(PVC 이름), Network (Headless Service)

 

※ 주의 ※ StatefulSet 생성 시 yaml 파일에는 serviceName, replicas, podManagementPolicy, terminationGracePeriodSeconds이 반드시 포함되어야 한다

yaml 일부

-  kubectl apply -f statefulset.yaml

StatefulSet으로 Pod이 생성된 경우에는 Pod이 삭제되면 이전의 삭제된 Pod의 이름과 동일한 Pod이 생성된다.


실습) StatefulSet의 rollingUpdate.partition 수정하기
:  StatefulSet에 변경사항이 있을 때 rollingUpdate.partition에서 지정한 값보다 작은번호의 Pod은 변경되지 않고 크거나 같은 번호만 변경시킨다
:  서버 패치할 때 등의 경우에 사용한다

-  kubectl apply -f statefulset.yaml (## web-0, web-1, web-2가 실행되고 있음)
-  kubectl edit statefulset web
image를 nginx에서 nginx:1.14로 변경
partition 부분을 0에서 2로 변경

-  kubectl get statefulsets.apps

2보다 작은 0과 1은 계속 동작하고 2만 수정된다.

 

 Deployment, DaemonSet, StatefulSet의 공통점과 차이점 

ⓐ 공통점

  • Rolling update 및 Rollback 가능
  • 각각을 삭제하면 Pod도 동시에 삭제됨

ⓑ 차이점

  • Deployment
    - Pod이 어떤 Node에 생성될 지 예측 불가
  • DaemonSet
    - Node별로 동일한 Pod이 하나씩 생성
  • StatefulSet
    - serviceName 필요
    - Pod 이름 및 볼륨 유지
    - partition 값에 따라 업데이트 되지 않을 Pod을 지정할 수 있음

 

 

 

'Study > Cloud' 카테고리의 다른 글

Kubernetes - Pod Scheduling  (0) 2022.07.25
Kubernetes - Controller-2  (0) 2022.07.23
Kubernetes - Service  (0) 2022.07.22
Kubernetes - Pod  (0) 2022.07.21
Kubernetes - Namespace  (0) 2022.07.21

Service

  • 동일한 서비스를 제공하는 여러 개의 Pod에 접근할 수 있는 하나의 IP를 제공
    (Service 자신이 갖고 있는 Selector 값과 Cluster에서 운영중인 Pod의 Label 값이 동일한 Pod으로 연결된다. Service는 자신의 EndPoint에 Pod를 추가시켜 관리한다.)

추가) kubectl run으로 pod 생성 후, Service도 생성했는데 오류가 나는 경우

→ pod의 labels 값과 service의 selector 값을 비교해볼 필요가 있다.

 

※ Pod의 Labels 값 확인

-  kubectl get pod -o wide --show-labels

※  Service 내부 설정 정보 확인

-  kubectl edit service 서비스명

 

  • Service는 Pod에 연결시켜주는 Network
  • 어느 Service 유형이든 결국 Cluster IP를 통해 Pod에 접근
    (Pod기본적으로 Node에서만 실행되지 않고 상황에 따라 Cluster내에 속한 여러 Node옮겨다닌다. 그러므로 PodIP접속하는 데는 한계가 있고 동일한 서비스의 대표 IPServiceIP접근하는 것이 편리하다.)

Service 종류 

 

1. ClusterIP

:  Default Service로서 Pod들이 클러스터 내부의 다른 리소스들과 통신할 수 있도록 해주는 가상의 클러스터 전용 IP

(IP는 Container에는 없고 Pod 에만 있다. Pod IP는 변경이 가능하므로 변경되지 않는 Virtual IP를 갖는 Service를 사용해야 한다)

:  Cluster 내에서 Pod에 접속할 때는 Cluster IP를 이용한다.(Pod는 언제든지 죽고 다시 생성되어 IP가 변경되기 때문)

:  Cluster IP로는 Cluster 내부에서만 접속할 수 있다.

:  ClusterIP → Pod

 

2. NodePort

: 외부에서 노드 IP의 특정 포트(<NodeIP>:<NodePort>)로 들어오는 요청을 감지하여, 해당 포트와 연결된 파드로 트래픽을 전달하는 유형의 서비스다.

: 이때 클러스터 내부로 들어온 트래픽을 특정 파드로 연결하기 위한 ClusterIP 역시 자동으로 생성된다.

: Cluster 내의 아무 Node의 IP에 대한 Port 번호로 접속하도록 한다.

(30,000 ~ 32,767 포트 사용)

:  NodePort ClusterIP → Pod

 

3. LoadBalancer

:  Layer2 ~ Layer4를 지원하는 부하조정 장비 (domain은 Layer7의 Ingress Controller가 처리)

 클라우드 공급자(Public Cloud)의 로드 밸런서, 외부 장비, Metallb를 사용하여 서비스를 외부에 노출시킨다.

:  외부 로드 밸런서가 라우팅되는 NodePort ClusterIP 서비스가 자동으로 생성된다.

:  OnPoremises(사내)에서는 외부 LB 장비를 이용하거나 그것보다는 k8s의 Metallb라는 Load Balancer를 이용한다.

:  로드 밸런서의 (virtual) IP를 통해 접속한다.

:  LoadBalancer → NodePort  ClusterIP → Pod

그림 출처 Google Cloud

 

 

 


실습 1) ClusterIP

CLI로 ClusterIP 생성하기

-  k create deployment mygosmall --image=jesuswithme/gosmall
-  k create service clusterip mygosmall --tcp 80:80
-  k get pod --show-labels 

-  k scale deployment mygosmall --replicas=3 
-  k get svc →  clusterIP 확인
-  curl clusterIP  → 3개의 값이 랜덤으로 나옴을 알 수 있다.
ⓑ YAML로 ClusterIP 생성하기

-  wget http://down.cloudshell.kr/k8s/lab/service/nginx-deploy-clusterip-add-externalip.yaml
-  wget http://down.cloudshell.kr/k8s/lab/service/nginx-deploy-clusterip-add.yaml
-  kubectl apply-f nginx-deploy-clusterip-add-externalip.yaml  ## External IP 수동으로 지정
-  kubectl apply-f nginx-deploy-clusterip-add.yaml ## ClusterIP의 IP를 수동으로 지정
-  kubectl get pod--show-labels
-  kubectl get svc-o wide
-  curl로 clusterip에 접속해보기

Type이 ClusterIP이기 때문에 무조건 cluster 내부에서만 접속 가능하다.
외부에서는 접속 불가능

 

실습 2) NodePort

YAML로 NodePort 생성하기 

-  wget http://down.cloudshell.kr/k8s/lab/service/nginx-deploy-nodeport.yaml
-  kubectl apply -f nginx-deploy-nodeport.yaml (## type을NodePort로만 설정)

yaml 파일
service 확인
외부에서 접속

 

실습 3) Load Balancer - Metallb

※ 기초 작업
MetalLB를 위한 Namespace 생성
-  wget http://down.cloudshell.kr/k8s/namespace.yaml
-  kubectl apply -f namespace.yaml
-  kubectl get namespace : 확인

MetalLB Components 생성
-  wget http://down.cloudshell.kr/k8s/metallb.yaml
-  kubectl apply -f metallb.yaml

Metallb에 사용할 Secret 생성
- kubectl create secret generic -n metallb-system memberlist --from-literal=secretkey="$(openssl rand -base64 128)"

** 외부에서 접속할 때 사용되는 IP생성을 위해 ConfigMap 생성 **
-  wget http://down.cloudshell.kr/k8s/ConfigMap-Metallb.yaml
vi ConfigMap-Metallb.yaml (## 원하는 대역으로 수정 (기본IP 구성은 10.0.2.200-10.0.2.250인데 사내에 맞게 수정))
-  kubectl apply -f ConfigMap-Metallb.yaml 
▷ 이제 Load Balancer에 이 IP를 할당한다

ⓐ CLI로 LoadBalancer 생성하기
yaml
Pod 노출하기
외부 접속

 

ⓑ YAML로 Load Balancer 생성하기

-  wget http://down.cloudshell.kr/k8s/metallb-nginx.yaml
yaml

kubectl create -f metallb-nginx.yaml

ClusterIP -> NodePort -> LoadBalancer 가 순서대로 생김
외부에서 접속

 

 

 

'Study > Cloud' 카테고리의 다른 글

Kubernetes - Controller-2  (0) 2022.07.23
Kubernetes - Controller  (0) 2022.07.22
Kubernetes - Pod  (0) 2022.07.21
Kubernetes - Namespace  (0) 2022.07.21
Kubernetes - yaml  (0) 2022.07.21

Pod Object 특징 
: 1개의 pod는 내부에 여러 개의 컨테이너를 가질 수 있지만 대부분 1~2개의 컨테이너를 갖는다.
= "고래(Containers)들의 떼"

: 클러스터 내에서 사용할 수 있는 고유한 IP 주소를 할당 받지만, 이 ip는 Service에서 사용하지 않는다.
: Pod의 외부에서는 'Service'를 통해 Pod에 접근한다.(Service가 Pod의 Endpoint를 관리한다.)
: Pod 내부의 컨테이너들은 네트워크와 볼륨등을 공유하고 서로 localhost통신할 있다.

 

실습) watch 명령어 : pod 실행 상태를 2초마다 확인한다.

-  kubectl run mypod-cli --image=nginx:1.14 --port 80
-  kubectl create deployment mypod --image=nginx:1.14 --replicas=4

여러 개의 pod를 만들고 다른 창에서 watch 명령어를 통해 상태를 확인한다.

watch kubectl get pod -o wide

 동작중인 Pod 확인하기

- kubectl get pod -o wide
- kubectl get pod -o yaml
- kubectl get pod -o json

 

실습) 하나의 Pod여러개의 Container동작하는 Pod 생성

- wget http://down.cloudshell.kr/k8s/lab/pod-multicon.yaml
- kubectl apply -f pod-multicon.yaml
-
kubectl get pod -o wide
yaml 파일을 확인해보니 두 개의 컨테이너를 포함한다.
 

centos container를 동작시켜서 local로 curl을 실행한다.&nbsp; 웹 서버가 없지만, 잘 동작한다.

그 이유는, 같은 pod에 위치한 또 다른 컨테이너인 nginx container와 IP(네트워크)를 공유하기 때문이다.

 

nginx container에서 로그를 확인한 결과, 127.0.0.1 즉, localhost 자기 자신에서 curl 명령어를 실행한 것으로 나온다.


Pod Life Cycle 단계


PodLife CyclePod생성에서 삭제까지의 과정을 말한다

Pending Running Succeeded/Failed Unknown

Pod생명주기를 구체적으로 보기 위해서 describestatustype참고하면 된다

- kubectl get pod -o wide --watch : 실시간 생명 주기 확인
 

Troubleshooting

Pod생성하는데 실패하였다면 어느 단계에서 문제가 있었는지 필요가 있다

이럴 kubectl describe pod pod_name실행한다

 

'Study > Cloud' 카테고리의 다른 글

Kubernetes - Controller  (0) 2022.07.22
Kubernetes - Service  (0) 2022.07.22
Kubernetes - Namespace  (0) 2022.07.21
Kubernetes - yaml  (0) 2022.07.21
Kubernetes - Deployment & Service  (0) 2022.07.20

하나의 Pod 안에 여러 개의 Container를 두고 싶을 때는 yaml 파일을 사용해야 한다.

 

YAML
: YAML Ain't Markup Language
YAML은 문서 마크업이 아닌 데이터 직렬화가 핵심이다.

 

• YAML 기본문법
(기본형식: Field)
기본 옵션 : apiVersion / kind / metadata / spec

 

• 각 Object 및 Controller의 현재 사용하는 버전 확인하기

- kubectl api-resources


• Object 및 Controller의 사용 가능한 Field가 어떤 것들이 있는지 확인하기

: kubectl explain 명령어 사용

- kubectl explain pods
- kubectl explain pods.metadata(항목별 상세 정보 확인)
 
 
 

※ pod-sample.yaml다운로드하여 실행하기

wget http://down.cloudshell.kr/k8s/lab/pod/pod-sample.yaml
k8s 디렉토리의 pod-sample.yaml 파일
kubectl apply -f pod-sample.yaml
 kubectl get pod -o wide
sample pod가 만들어 졌다.

 
삭제할 때는 다시 pod-sample.yaml사용한다
kubectl delete -f pod-sample.yaml
 kubectl get pod -o wide
 
 
• YAML 구문의 유효성 확인 (http://www.yamllint.com/)

 

'Study > Cloud' 카테고리의 다른 글

Kubernetes - Pod  (0) 2022.07.21
Kubernetes - Namespace  (0) 2022.07.21
Kubernetes - Deployment & Service  (0) 2022.07.20
Kubernetes 소개 및 설치  (0) 2022.07.19
Docker Image Layer  (0) 2022.07.18

Pod

    - 여러 개의 Container를 운영하는 가장 기초적인 모듈

Replicaset

    - Replicaset은 동일 Pod에 대한 가용성을 안정적으로 보장받기 위한 모듈

    - Pod의 개수를 유지시켜 줌

Deployment 

    - 같은 Pod가 여러개의 Node에 배포되는 형태 

    - Pod와 Replicaset에 대한 선언과 업데이트를 관리해주는 모듈

    - 사용이유 : Pod가 죽을 경우를 대비하여 서버를 보호 차원에서 사용

 

Nginx Pod을 K8S cluster에 배포하기

• K8S 환경에서 실행중인 Pod은 한 개 이상의 container로 구성되며, 그 Pod에 있는 docker container들은 storage와 Network을 공유한다


• mynginx라는 deployment 생성하기 >> 이와 함께 pod도 생성됨

- kubectl create deployment mynginx --image=nginx
- kubectl get deployments.apps
- kubectl get pod -o wide (wide 옵션 : 어느 node에 무슨 ip 인지 확인)

pod ip는 10.44.0.1 이며 node1에서 동작 중이다.
deployment 를 생성했는데 , Pod, ReplicaSet 까지 동시에 생성되었음
시간이 지나면, 새로운 pod이 node3에서 생성되어 동작된다.

10.47.0.0 : weave-net IP

deployment, replicaset, pod 정보
replicas 값을 4로 수정하여 똑같은 pod를 4개 Run 하도록 한다.

- kubectl scale deployment mynginx --replicas=4

로도 수정할 수 있다.

4개의 pod가 Running
node1에 돌아가던 pod를 삭제했더니 새로운 pod가 생성된다.

Kubernetes deployment로 pod을 만들 때의 장점

: pod가 죽으면 자동으로 새로운 pod를 생성

기존 데이터는 cluster 외부에 저장하게 설정하여 데이터 유실을 막아야 한다.

 

kubectl describe 명령어로 상세 정보 확인

kubectl describe deployments.apps (deployment 이름) : deployment 정보 확인

kubectl describe pod (pod 이름): pod 정보 확인

 

 

그런데, 외부에서 pod로는 직접 접속이 안된다.
따라서 서비스를 노출시켜야 한다.

 

Kubernetes의 서비스 유형

  1. ClusterIP (기본 형태)
  2. NodePort
  3. LoadBalancer
  4. ExternalName
더보기

1. ClusterIP

파드들이 클러스터 내부의 다른 리소스들과 통신할 수 있도록 해주는 가상의 클러스터 전용 IP

:  Cluster IP로는 Cluster 내부(master, node1, node2, node3)에서만 접속할 수 있다.

2. NodePort

: 외부에서 노드 IP의 특정 포트(<NodeIP>:<NodePort>)로 들어오는 요청을 감지하여, 해당 포트와 연결된 파드로 트래픽을 전달하는 유형의 서비스다.

: 이때 클러스터 내부로 들어온 트래픽을 특정 파드로 연결하기 위한 ClusterIP 역시 자동으로 생성된다.

3. LoadBalancer

클라우드 공급자의 로드 밸런서를 사용하여 서비스를 외부에 노출시킨다.

:  외부 로드 밸런서가 라우팅되는 NodePort ClusterIP 서비스가 자동으로 생성된다.

:  로드 밸런서의 (virtual) IP를 통해 접속한다.

그림 출처 Google Cloud

Nodeport 서비스 이용

: 각 node IP의 특정 포트 번호로 접속 (관리자가 test 할 때의 용도로 많이 쓰임)

 

-kubectl create service nodeport mynginx --tcp=80:80

## 서비스 이름 : mynginx
# 앞의 80: Cluster-IP접속할 사용되는 포트 번호
# 뒤의 80: ContainerPort 번호

 

- kubectl get service -o wide

10.105.138.230이 이 서비스의 대표 클러스터 IP
service 정보를 보니 Endpoints가 각 pod에 연결되어 있음을 알 수 있다.
node3 IP주소의 서비스 포트를 통해 외부에서 접속한다.

'Study > Cloud' 카테고리의 다른 글

Kubernetes - Namespace  (0) 2022.07.21
Kubernetes - yaml  (0) 2022.07.21
Kubernetes 소개 및 설치  (0) 2022.07.19
Docker Image Layer  (0) 2022.07.18
라우터 이해하기3  (0) 2022.07.06

Container의 강점(Docker 관점)

  • 도커 호스트의 커널(프로세스, 하드웨어 관리)을 공유하기 때문에 가볍고 빠르다
    (하드웨어가 차지하는 용량이 적다)
  • Application 운영 시 VM보다 가볍다
  • Application 배포가 빠르다
  • 지속적인 개발, 통합 및 배포가 가능하다
  • 개발, 테스트, 운영 전반에 걸쳐 일관성 있는 환경을 제공한다
  • Resource를 충분하게 활용할 수 있다

 

Container의 약점(Docker 관점)

  • 개발자 입장
    - Application code 작성 > Build > Ship > Run
    - 도커는 container 단위로 관리
    따라서 Container가 많으면 docker 명령어로 일일이 관리하기가 어렵다
  • 운영자 입장
    - Container가 갑자기 죽으면?
    - Container 운영 중 업그레이드는? Rollback은 어떻게?
    - 서비스의 이상 및 부하의 모니터링은 어떻게?

 

>>>> K8S - Container Orchestrarion<<<<

출처 https://ko.m.wikipedia.org/wiki/%ED%8C%8C%EC%9D%BC:Kubernetes_logo_without_workmark.svg

= Container 환경을 효과적으로 관리(생성, 수정, 삭제)하기 위한 도구

 

특징

  1. Clustering : 여러 node 중앙 관리
  2. 상태(State) 관리 : 설정한 Pod 개수 보장, Pod의 livenessProbe(컨테이너가 동작 중인지 여부를 나타낸다. 만약 활성 프로브에 실패한다면, kubelet은 컨테이너를 죽이고, 해당 컨테이너는 재시작 정책의 대상이 된다.)
  3. 부하 조정(Scheduling)으로 배포 관리 : Pod 배포 시 부하 정도가 가장 적절한 node 선정하여 배포
  4. 배포  버전 관리 : Rolling Update (Deployment로 새로운 버전의 App을 이전 버전을 유지한 채 업데이트 진행) + Roll Back (문제 발생 시 이전 버전으로)
  5. Service Discovery
    (Pod 집합에서 실행중인 Application을 네트워크 서비스로 노출하여 Cluster 외부에 있는 User가 Application을 이용하도록 네트워크 경로를 제공하는 것)
    (K8S는 Pod에게 고유한 IP주소 부여, Pod 집합에 대한 단일 DNS명을 부여. 이들간의 로드-밸런싱 수행)
  6. Volume Storage
    (각 node 별 다양한 storage 제공)
    (Volume : Pod에 종속되는 디스크. 해당 Pod에 속해 있는 여러 개의 Container가 공유해서 사용)

 

Kubernetes는 서비스 관리를 개별적이 아닌 집단적으로 관리한다

따라서 대부분의 상황에서 개별 시스템(node)와 상호작용할 필요는 없다

→ 비교적 Stateless(관계의 상태를 유지하지 않는 것) 업무에 적합하다 (stateless 예시 : UDP 프로토콜)

 

 

개발 배경

  • Container는 stateless, immutable, mortal (상태를 가지고 있지 않고, 변화하지 않으며, 언제든 죽을 수 있는)개념을 기반으로 아키텍처를 구성하다 보면 운영에 앞서 반드시 필요한 것이 Container Orchestration(=Kubernetes)이
  • Container Orchestration은 다수의 Container를 다수의 node(Cluster)에 적절하게 분산 실행하고, 원하는 상태(Desired State)로 실행상태를 유지해 주고, 다운타임 없이 유동적으로 스케일을 확장/축소(Scale)할 수 있게 도와준다
  • 사용자가 Container에 대한 동작과 다른 Container와의 관계를 정의하면 배포/운영/스케일링에 문제가 없도록 자동으로 관리되는 운영 시스템이라고 할 수 있다

 

Kubernetes 종류

  • 관리형 Kubernetes
    : Amazon EKS, Azure AKS, Google GKE
  • 설치형 Kubernetes
    : RANCHER, RedHat OPENSHIFT
  • 직접 구성형 Kubernetes
    : Kubeadm, Kubespray, Kops, Krib

 

Kubernetes 설치

설치 구성도

(아래 내용은 master, node1, node2, node3 모두에게 적용)

실행 환경 : centos7-x86_64



1. /etc/hosts 파일 수정

/etc/hosts

각 PC의 IP 작성 후 scp 로 node1,2,3에 복사
- scp /etc/hosts node1:/etc/hosts

 


2. SWAP 기능 끄기
- swapoff -a
- vi /etc/fstab 
(마지막 부분인 swap 부분 주석처리)
- reboot

 


3. br_netfilter Kernel Module 기능 켜기
- modprobe br_netfilter
- echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptables
- vi /etc/sysctl.conf
(net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1 작성)
- reboot

 


4. 방화벽과 selinux disable 처리
- systemctl disable firewalld
- vi /etc/sysconfig/selinux (## centos7 이전 버전 시)
(SELINUX=disabled 수정)

 


5. Kubernetes Repository 파일 다운로드

  • repository : kubelet, kubectl, kubeadm

(원래는 repo 파일을 직접 구성해야 한다. 편의상 있는 자료를 다운받겠다)
- cd /etc/yum.repos.d
- wget http://down.cloudshell.kr/k8s/kubernetes.repo

/etc/yum.repo.d/kubernetes.repo

- yum repolist -y (## kubernetes 설치 확인)

 


6. docker 설치 및 시작 
- curl -sSL http://get.docker.com | bash
- systemctl start docker && systemctl enable docker
- docker info | grep -i cgroup
(이 명령어 입력 시 Cgroup Driver : cgroupfs라고 나타난다.
Kubernetes는 docker의 cgroup을 systemd를 사용하기 때문에 
이를 systemd로 변경해주어야 한다)

 


7. docker cgroup driver를 systemd로 변경
- vi /usr/lib/systemd/system/docker.service
(ExecStart=/usr/bin/dockerd 바로 뒤에 --exec-opt native.cgroupdriver=systemd를 삽입)
- systemctl daemon-reload (## 모든unit filereload)
- systemctl restart docker 
- docker info | grep -i cgroup (## systemd로 변경됨)

 


8. 특정한 이전 버전(1.21.1)의 K8S 설치

※ kubernetes repository 
1. kubeadm - 쿠버네티스 클러스터 구성, 클러스터 가입, 삭제시 사용(init, reset, join..)
2. kubelet - 쿠버네티스 서비스(서버). 클러스터의 각 노드에서 실행되는 에이전트. Kubelet은 파드에서 컨테이너가 확실하게 동작하도록 관리한다.
3. kubectl - kubectl은 쿠버네티스 클러스터 관리자를 제어한다.
container 생성 순서

https://kubernetes.io/ko/docs/setup/production-environment/tools/kubeadm/install-kubeadm/


- yum install -y kubelet-1.21.1-0 kubeadm-1.21.1-0 kubectl-1.21.1-0
- systemctl daemon-reload
- systemctl enable kubelet --now

 


9. K8S Clustering 구성(Master에서만 작업)
#특정한 이전 버전(1.21.1)의 K8S Clustering 구성
- kubeadm init --kubernetes-version=v1.21.1
이때, 설치 결과를 복사하여 다른 곳에 꼭 저장해놓는다.
----------------------------------------------------------------------------

설치 결과
Your Kubernetes control-plane has initialized successfully!

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

(master에서 클러스터 구성 시 필요)

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

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/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 10.0.2.15:6443 --token h1a03j.qe1qctd831cfijxa \
        --discovery-token-ca-cert-hash sha256:538ab8cea29bab9814f850a87450008bf8ee7efcf3706e562bbc6ce5bb08cf74

(나중에 node1,2,3에서 join 할 때 필요)
----------------------------------------------------------------------------
그리고 

  mkdir -p $HOME/.kube
  cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  chown $(id -u):$(id -g) $HOME/.kube/config

이 부분을 순차적으로 입력해준다.

 

10. Kubernetes 버전 정보 확인 - Master에서
- kubectl version --short
- kubeadm version -o yaml
- kubelet --version 

레파지토리 버전 정보


Namespace 확인
- kubectl get namespaces

- kubectl get namespace

- kubectl get ns 

 


11. Cluster 구성정보(ConfigMap) 확인하기 - Master에서
- kubectl get configmap -n kube-system
- kubectl get cm kubeadm-config -n kube-system
- kubectl get cm kubeadm-config -n kube-system -o yaml
- kubeadm config view

 


12. Clustering 상태 및 Pod 상태 확인하기 - Master에서
- kubectl get node (## master가 NotReady 상태)
- kubectl get pod --all-namespaces (## 모든 pod 확인)
- kubectl get pod -A (## 모든 pod 확인)


-->> cluster 상태가 Not Ready이고 coredns 상태가 Pending이다.

이 상태에선 각 Node들에서 실행중인 Pod들간에 통신이 안된다
-->>Pod Network를 생성하여 이 문제를 해결할 수 있다

 


13. Pod Network 구성하기 - Master에서만 작업 (weave-net 설치)
- export kubever=$(kubectl version | base64 | tr -d '\n')
- kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$kubever"

- kubectl get pod -A (## coredns가 이제는 running)
30초 정도 기다린 후 
- kubectl get pods -A

weave - net - xxxxx 이라는 Pod 이 master 에 설치됨

- kubectl get nodes (## master가 Ready 상태가 됨)

 


(node1,2,3에서)
kubeadm join 10.0.2.15:6443 --token h1a03j.qe1qctd831cfijxa \
        --discovery-token-ca-cert-hash sha256:538ab8cea29bab9814f850a87450008bf8ee7efcf3706e562bbc6ce5bb08cf74
입력 후

(master)
- kubectl get nodes (## master 말고 node1,2,3도 Ready 상태가 됐음을 알 수 있다)

 

'Study > Cloud' 카테고리의 다른 글

Kubernetes - yaml  (0) 2022.07.21
Kubernetes - Deployment & Service  (0) 2022.07.20
Docker Image Layer  (0) 2022.07.18
라우터 이해하기3  (0) 2022.07.06
라우터 이해하기2  (0) 2022.07.05

+ Recent posts