k8s- 3

박형준·2024년 5월 9일

https://kubernetes.io/blog/2019/07/18/api-deprecations-in-1-16/

-야물파일로 Object 정의시

  • apiVersion
    Deployment : apps/v1,
    Pod : v1,
    Replicaset : apps/v1 ,
    service : v1,
    PersistentVolume : v1
    • 위의 양식 따라서 표시, 버전의 순서는 alpha ⇒ beta ⇒ stable 순서

*네임스페이스 정리

  • test 네임스페이스 생성 / 확인 : #kubectl create namespace test

  • 야물파일을 이용해서 네임스페이스 생성시 명령어 [green.yaml]

    • #kubectl create -f green.yaml
  • test네임스페이스 삭제 : #kubectl delete 이름

  • 네임스페이스 교체시 참고 파일 : context #kubectl config --help

  • 이름을 blue 로교체 명령어 : #kubectl config use-context


*파드 ( Pod )

*컨테이너 : app.js ⇒ 도커파일 생성 ⇒ 도커 빌드 ⇒ 생성

  • 파드란? k8s 에서 최소단위 ( 하나의 파드에 하나 또는 여러개의 컨테이너가 포함 될 수 있음 )
    도커에서는 컨테이너 실행이 쿠버에서는 파드 실행 과 같은 의미

https://kubernetes.io/ko/docs/concepts/workloads/pods/pod-lifecycle/


모니터링용 하나 마스터 복제 후

  • #watch -n 1 kubectl get pods ⇒ 1초마다 새로고침 [ -n 1 생략시 기본값은 2초 ]

*파드 생성 2가지 방법

  • -CLI : 이미지는 nginx:1.14 이름은 webserver 생성
    • #kubectl run webserver –image=nginx:1.14 --port=80 [ 포트는 생략해도됨 ]

pods 생성

  • kubectl run webserver --image nginx:1.14
  • 마스터 창을 2개 열어서 kubectl get pods -o wide --watch로 pending, running 확인

-yaml 파일로 생성
야물파일 생성 하는 방법은

  • -cat > 파일명
    • 작성
    • Ctrl + D 종료,
  • -vi, nano 파일명.yaml [pod-nginx.yaml] ⇒ 생성하고 확인 curl 접속까지
  • #kubectl create -f pod-nginx.yaml
    • #kubectl get pods nginx-pod -o yaml
      #kubectl get pods nginx-pod -o json | grep -i podip
      #kubectl get pods nginx-pod -o json | grep -i namespace
      #kubectl describe pod nginx-pod

yaml파일을 통해 pods 생성

  • vim pod-nginx.yaml
  • 파드 생성 내용 작성
    • kubectl create -f pod-nginx.yaml
    • kubectl get pods
    • kubectl get pods nginx-pod -o json | grep -i podip
    • kubectl get pods nginx-pod -o json | grep -i namespace로 확인

*야물파일을 이용해서 멀티 파드 생성 / 접속

  • pod-multi.yaml
  • #kubectl create -f pod-multi.yaml
    • 멀티 생성시 두개의 컨테이너는 하나의 IP 공유해서 사용

하나의 파드에서 두개의 이미지를 배포 ( multi-pod )

  • vim pod-multi.yaml
  • 하나의 파드안에 두개의 컨테이너를 포함하며, 하나의 ip를 공유해서 사용
    ( command: 백그라운드로 동작하는 내용 )
    • kubectl create -f pod-multi.yaml
    • 10.44.0.1의 ip를 공유해서 사용

-컨테이너 접속시 이름으로 구분해서 접속을 함.

  • [root@master ~]# kubectl exec multipod -it -c centos-container -- /bin/bash

    • root@multipod:/# cd /usr/share/nginx/html/
    • root@multipod:/usr/share/nginx/html# ls
      50x.html index.html
    • root@multipod:/usr/share/nginx/html# echo "TEST 5-09" > index.html
  • [root@master ~]# kubectl logs multipod -c nginx-container
    200: 접속 성공

  • [root@master ~]# kubectl logs multipod -c centos-container ⇒ 200번 보여지지 않음

-여러개의 파드 한번에 삭제

  • [root@master ~]# kubectl delete pod --all

-동작중인 파드 확인/정보 보기

  • get pods, get pods -o wide, describe pod 파드 이름

멀티파드 접속

  • kubectl exec multipod -it -c centos-container -- /bin/bash
    ( -c centos-container: 실행하고자 하는 컨테이너의 이름을 지정하는 옵션 )
  • kubectl exec multipod -it -c nginx-container -- /bin/bash
    ( nginx로 접속 )
    • cd /usr/share/nginx/html/
    • echo "TEST 05-09" > index.html
  • 컨테이너에서 나와서 ip 호출로 확인
  • kubectl logs multipod -c nginx-container로 접속 log 확인

멀티파드 삭제

  • kubectl delete pods --all

-동작 중인 파드 수정

  • [root@master ~]# kubectl edit pod webserver

동작 중인 파드 수정

  • kubectl run webserver --image nginx
  • kubectl edit pods webserver로 수정 후 재시작

*livenessProbe ( self-healing) 파드를 관리 해주는 기능

  • httpGet : 컨테이너를 관리하는 방식으로 컨테이너에게 일정한 신호를 보내서 응답이 있으면 정상.
    • 응답이 없으면 컨테이너를 다시 시작 하거나 삭제 하고 다시 설치 / 시작 시키는것.
  • tcpSocket : 포트 상태를 확인해서 포트가 잘 활성화 되어 있으면 이상없다고 판단
  • execAction : 컨테이너에서 명령을 실행해서 숫자 0이 나오면 정상.

일반 파드 야물파일을 라이브네스로 수정
#vi pod-nginx-liveness.yaml

  • 기존파일에는 livenessProbe가 없음 이분을 새로 추가 [ 관리방식은 3가지중에 httpGet]

[root@master ~]# kubectl create -f pod-nginx-liveness.yaml

  • [root@master ~]# kubectl describe pod nginx-pod-liveness
    • 실행된 파드에 대해 라이브네스 확인
      Liveness: http-get http://:80/ delay=0s timeout=1s period=10s #success=1 #failure=3
      – 위 목록은 수정 가능 함. 신호 대기시간 및 실패 횟수 등을 조정 가능 함.

liveness를 통해 파드 관리 ( HTTP get )

  • vim pod-nginx-liveness.yaml
  • livenessProbe가 정의되어 있어 해당 컨테이너의 라이브니스 검사를 수행
    ( httpGet을 사용하여 "/" 경로에 대한 HTTP GET 요청을 80번 포트로 수행 )
    • kubectl create -f pod-nginx-liveness.yaml
    • kubectl describe pod nginx-pod-liveness | grep -i Liveness로 확인

  • tcpSocket과 exec liveNess 사용법

-아래 내용을 추가 한다면

  • Liveness: http-get http://:80/ delay=0s timeout=1s period=10s #success=1 #failure=3
  • port: 80 아래 부분에 기록
    • timeoutSeconds: 2
      successThreshold : 2 이런식으로 추가를 해주면 됨.
  • 안하면 위에 값이 기본으로 적용

*static pod: 노드를 지정해서 파드 를 생성 하는것 .

야물파일을 노드에서 작성후 저장하고 빠져 나오면 바로 파드 실행됨.

⇒ 노드2의 /etc/kubernetes/manifests 이동 후 아래와 같은 야물파일 생성 하고

  • Ctrl+D로 빠져 나오면 바로 파드가 실행됨.
    • 노드에서 삭제 하면 바로 삭제됨.(모니터링 화면에서 확인 가능)
  • cat > pod-nginx.yaml

⇒ 이 파일을 마스터에서 실행시키면 static 이 아닌 일반 파드가 생성(노드는 랜덤)

static pod를 통해 노드를 정해서 파드 생성

  • node2 접속해서 cd /etc/kubernetes/manifests/로 이동
  • vim pod-nginx.yaml
    • pod를 생성하는 yaml 파일 작성후 저장
    • node2에서 yaml 파일 저장하면 마스터에서 nginx-pod 생성,
      node2에서 yaml 파일 삭제하면 pod 삭제

-상황에 따라서 마스터를 하나의 노드로 동작 시키기

  • 야물파일을 마스터의 /etc/kubernetes/manifests 디렉터리로 복사
    • [root@master ~]# kubectl get pod -o wide 해보면 마스터가 하나의 static파드로 동작

마스터를 노드로 동작 (master를 static pod로 지정)

  • cp pod-nginx.yaml /etc/kubernetes/manifests/
  • 복사하는 즉시 파드 생성
  • rm -rf /etc/kubernetes/manifests/pod-nginx.yaml로 파드 삭제

*pod에 리소스 할당( RAM / CPU… )

  • 하나의 노드에서 여러개의 파드가 동작 가능, 만약에 하나의 파드가 모든 리소스를 차지해 버리면 다른 파드는 문제 발생함.
    리소스에 제한을 걸어서 관리

#pod-nginx-resources.yaml 파일 생성 후 수정

[root@master ~]# kubectl create -f pod-nginx-resources.yaml
-리미트가 없이 동작 시켜보기

pod에 리소스 할당 ( ram, cpu ... )

  • vim pod-nginx-resources.yaml
  • 리소스(requests 및 limits) 섹션
    ( 환경 변수(env) 섹션에서는 "MYVAR"라는 이름의 환경 변수가 "testvalue"로 설정 )
    ( 컨테이너가 요청(requests)하는 메모리와 CPU 설정 )
    • kubectl create -f pod-nginx-resources.yaml
    • kubectl describe pod nginx-pod-env로 확인

-마스터에서 야물파일에 requests 부분은 삭제 리미트만 CPU 2 개로 설정
request를 삭제 하고 limits 만 작성하면 request는 자동으로 리미트와 동일하게 생성됨.

다시 동작 시키면 Pending에서 멈춰있음 즉 생성이 안됨.
⇒ 이유는 노드의 CPU가 2개 인데 파드 에서 2개를 요청해서 생성이 안됨.

-노드에서 실행 시켜도 실행이 안됨 .

cpu 제한 갯수를 증가 시키기

  • pod-nginx-resources.yaml파일의 requests를 limits로 변경
    ( cpu도 2로 변경 )
    • kubectl create -f pod-nginx-resources.yaml
    • 생성되는 시간 증가 ( cpu를 2로 설정해서 )

*파드의 환경 변수

  • 실행한 노드에서 적용되도록 yaml 파일에 설정을 해서 실행 후 노드로 진입 확인
  • 기존에 yaml 파일에 환경변수 추가 후

#kubectl create -f pod-nginx.yaml

  • 실행 후 컨테이너로 진입 해서 이름을 환경변수로 적용시켜보기
    • [root@master ~]# kubectl exec nginx-pod -it -- /bin/bash
    • #env ⇒ SOLDESK=testvalue 이 문장이 보이면 환경변수가 잘 적용됨 확인

환경변수 지정

  • vi pod-nginx
  • 환경변수를 지정하는 내용 추가
    • kubectl create -f pod-nginx.yaml
    • kubectl exec nginx-pod -it -- /bin/bash 로 진입
    • env | grep SOLDESK 로 확인

*파드 구성 패턴 3가지

https://matthewpalmer.net/kubernetes-app-developer/articles/multi-container-pod-design-patterns.html


*컨트롤러 : Pod 의 개수를 보장해주는 기능

  • 요구하는 파드의 개수 보장 하고 유지 하는것을 목표
    • 개수가 부족하면 template를 이용해서 추가
    • 개수가 많으면 최근에 생성된 파드 삭제

-모니터링은 : # kubectl get pods -o wide
-rc-nginx.yaml 생성 / 실행 / 동작 개수 확인

  • [root@master ~]# kubectl get rc
  • [root@master ~]# kubectl describe rc rc-nginx
    [root@master ~]# kubectl get pod --show-labels

-똑같은 라벨의 이름을 가진 파드를 생성 하면?
replicas: 3이 기준이 되어서 생성하면 바로 삭제를 시켜버림
(라벨이름이 기준이되어 숫자정해짐)

-라벨의 다른 이름을 가진 파드를 생성 하면? 생성됨

template으로 pod 생성

  • vim rc-nginx.yaml
  • ReplicationController는 특정 수의 Pod 인스턴스를 유지
    • kubectl create -f rc-nginx.yaml
    • kubectl get rc rc-nginx 로 갯수 확인
    • kubectl get pod --show-labels로 label 확인 ( webui )
    • 똑같은 label의 pod를 생성하면 강제 삭제

-야물파일의 개수를 4로 수정 하고 저장하면? ⇒ 바로 생성됨.

  • [root@master ~]# kubectl edit rc rc-nginx

-개수를 2개로 축소 하고 저장 하면?
⇒ 최근에 생성된 파드 부터 삭제 진행[ 서로 다른 노드에 있다면 각 노드에서 하나씩 삭제 진행됨 ]

  • [root@master ~]# kubectl edit rc rc-nginx

-다시 4개로 변경 하고 , 편집을 하지 않고 축소하기

  • [root@master ~]# kubectl scale rc rc-nginx --replicas=2

-만약에 rc-nginx.yaml 에 있는 nginx 버전을 다른것으로 변경하고 저장 하면 새로운 버전의 nginx가 생성이 될까? 안될까?
⇒ 생성이 안됨 ( nginx:1.14 ⇒ 1.15 ) replicas=2 기준 이라 생성안됨.

-그럼 만약에 개수를 하나더 늘리거나 지우면? 어떤 버전으로 생성이 될까?
-> 1.15 버전으로 생성
⇒파드를 중지하지 않고 늘리거나 줄이는것을 롤 업데이트 라고 함.

replication controller 설정

  • kubectl scale rc rc-nginx --replicas 2 ( pods 갯수를 2개로 지정 )
  • kubectl edit rc rc-nginx ( 편집 모드에서 replicas 갯수를 수정해서 pods 갯수 지정 )
    • 로드 밸런스를 고려해서 최근 생성된 pods를 우선 변경
    • 편집 기능을 이용해서 이미지를 변경하고 생성하면 이미지 변경 가능 ( 롤링 업데이트 )

*Replicaset

⇒rc 와 역할은 같음, 기능은 더 풍부함.

ReplicaSet 에서 사용되는 matchExpressions: 연산자

  • In : key와 values를 지정하여 key, value가 일치하는 Pod만 연결
    NotIn : key는 일치하고 value는 일치하지 않는 Pod에 연결
    Exists : key에 맞는 label의 pod를 연결
    DoesNotExist : key와 다른 label의 pod를 연결
    • spec:
      replicas: 3
      selector:
      matchLabels:
      app: webui

-기존거 삭제시 파드만 삭제하면 계속해서 다시 생성 됨.

  • [root@master ~]# kubectl delete rc rc-nginx

Replicaset 설정

  • vim rs-nginx.yaml
  • ReplicaSet의 구성을 정의
    ( "app: webui"와 "ver: 1.15" 라벨을 가진 Pod를 선택하는 selector를 가지고 있다 )
    ( 이를 통해 ReplicaSet이 관리하는 Pod 인스턴스를 식별 )
  • kubectl get pods --show-labels로 확인

-컨트롤러를 삭제 하면? 파드는? 모두 삭제됨.
하지만 파드는 유지 하고 싶다면 연쇄 삭제 비활성화

  • [root@master ~]# kubectl delete rs rs-nginx --cascade=false ( 기본값은 true )
    ⇒ 컨트롤러는 삭제 되지만 파드는 유지됨.
  • [root@master ~]# kubectl get rs ⇒ 컨트롤러 보이지 않음
    • [root@master ~]# kubectl get pods --show-labels ⇒ 파드 확인
      [root@master ~]# kubectl create -f rc-nginx.yaml ⇒ 3개가 더 생성됨 (라벨의 중요성)

relica set을 삭제해도 pod가 삭제되지 않도록 하는 방법

  • kubectl delete rs rs-exam1 --cascade=false

0개의 댓글