2023-09-18-TIL

Today I Learned

Cloud Native

  • https://aws.amazon.com/ko/what-is/cloud-native/

Node vs Pod vs Cluster

  • https://www.cloudzero.com/blog/kubernetes-node-vs-pod
  • https://www.vmware.com/topics/glossary/content/components-kubernetes.html
  • https://medium.com/developerworld/pod-vs-node-in-kubernetes-26c858988f94

Kubernetes NoExecute vs NoSchedule

  • https://stackoverflow.com/questions/50966318/what-is-the-difference-between-noexecute-noschedule-prefernoschedule

Amazon ECR

  • https://docs.aws.amazon.com/ko_kr/AmazonECR/latest/userguide/what-is-ecr.html

Kubernetes Secrets

  • https://kubernetes.io/docs/concepts/configuration/secret/

Kubernetes Vault

  • https://developer.hashicorp.com/vault/docs/platform/k8s
  • https://github.com/hashicorp/vault-k8s

HashiCorp

  • https://local.hashicorp.com/ko

Docker Layering을 효율적으로 사용하여 빌드시간 단축하기

  • https://www.baeldung.com/docker-layers-spring-boot
  • https://jskim1991.medium.com/spring-boot-3-ways-of-dockerizing-spring-boot-application-29a905dd5a5a

Today I Studied

Schduling

  • 스케줄링
  • 실제로 할당하는것을 Kublet

Resource Requirements

Requests and Limits

Requests 최저 요구치, Limits 내가 어디까지 리소스를 가질 수 있을지에 대한 제한 Requests는 노드의 전체 할당량에 대하여 requests만큼은 무조건 할당이 되고, requests보다 많이 필요하면 할당이 안된다. cpu가 4개인데 2개만 쓸 수 있다면 그게 limits, 즉, limit인 2개가 되면 동작하지 못한다.

초기설정은 requests, 운영중에는 limits

노드의 메모리가 10 이고 파드의 메모리 request는 3, limit은 5일 때 노드에 배포할 수 있는 최대 파드의 개수는 3개입니다 근데 모든 파드가 모두 메모리를 5까지 사용할 수 있어요

limit 5, 5, 5인 경우가 발생할 수 있을까? 아마도 10이라면 찰나의 순간에 먼저 선점하는 두 개의 파드가 10을 차지하면 하나의 파드가 쫓겨나거나 할듯?

request는 정해두고, limit는 정하지 않는게 권장사항?

보통 request, limit는 동일하게 두고, cpu는 상황에 따라 변동성이 크기때문에 (예를들면, spring boot의 부팅 시 cpu를 많이 먹지만 이후에는 거의 안 먹음) request = 0.1, limit = 1로 준다

단위 = 코어 하나

여기에서 말하는 단위의 정확한 의미: CPU 스케줄링 가중치

처음에는 메모리처럼 물리적으로 영역이 나누어져있다고 생각했는데 그게아니라 cpu req/limit은 CPU를 점유할 수 있는 권한 가중치 느낌인 것 같아서 신기했어요

하이퍼쓰레드

메모리 단위 = 10^2, 2^2

Kubernetes (K8s)에서 `request`와 `limit`는 컨테이너의 리소스 사용에 관한 중요한 개념입니다. 이 두 가지 매개 변수는 리소스를 할당하고 제한하는 데 사용됩니다.

1. **Resource Requests (요청)**:
   - `request`는 컨테이너가 필요로 하는 최소 리소스 양을 나타냅니다.
   - 컨테이너에 할당되는 리소스의 최소값을 정의합니다. 예를 들어, CPU 요청이 0.5 CPU인 경우, 해당 컨테이너는 적어도 0.5 CPU를 가지게 할당될 것입니다.
   - `request`를 설정하면 Kubernetes 스케줄러가 컨테이너를 호스트 노드에 배치할 때 해당 요청에 맞는 노드를 선택하려고 노력합니다. 이를 통해 리소스가 부족한 상황에서도 컨테이너가 실행될 수 있도록 보장합니다.

2. **Resource Limits (제한)**:
   - `limit`는 컨테이너가 사용할 수 있는 최대 리소스 양을 나타냅니다.
   - 컨테이너가 할당된 리소스를 초과하여 사용하지 못하게 하려면 `limit`를 설정합니다. 예를 들어, 메모리 `limit`이 1GB로 설정된 경우, 컨테이너는 1GB를 초과하여 메모리를 사용할 수 없습니다.
   - `limit`를 설정하면 컨테이너가 너무 많은 리소스를 소비하여 다른 컨테이너들에게 영향을 주는 상황을 방지합니다.

`request`와 `limit`를 올바르게 설정하면 리소스 사용을 관리하고 클러스터의 안정성을 유지하는 데 도움이 됩니다. 요청과 제한을 잘 조절하면 리소스를 효율적으로 활용하면서도 컨테이너의 안정성을 보장할 수 있습니다.
  • https://cloud.google.com/blog/products/containers-kubernetes/kubernetes-best-practices-resource-requests-and-limits
  • https://itchain.wordpress.com/2018/05/16/kubernetes-resource-request-limit/

Affinity

affinity가 그양 nodeSelector보다 상세한 기능이라고만 이해했어요


Taints and Tolerence

mosquito pod 가 spray=에프킬라 테인트 노드에 못다가간다

특정 노드의 특정 파드에 트래픽이 몰리게되면 noexecute … 0개가 되는 경우가 발생해서 위험하기도 함.

노드별로 균등하게 할당하는 방법은 없는가? -> 옵션이 따로 있다.

  • https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/

Node Selectors

affinity 설정한 경험, logstash pod인데 라벨링을 별도로 해준다. 예를들면, devops라는 라벨링이 된 노드에 affinity 설정을 했다. 그런데 devops 라벨링이 개발환경에는 안 걸려있었다. preffered로 걸어주었을 때 잘 옮겨가지 않아서 required로 바꾸려고 했으나, devops라는 라벨이 없으면 pending상태가 되는 문제가 있다.

fluentD…

influxDB

Tip:

로깅시스템의 로그보다 k8s의 로그를 보고있는데, 여러 pod의 로그를 deployment옵션으로 통합해서 볼 수 있다. 파드 쉘 안에서 터미널을 직접 열 수 있어서 그걸로 로그볼 수 있다. 단, 애플리케이션이 stdout으로 찍어야지 k8s로그로 볼 수 있다. Daemon set에서 fluentD가 붙어서 노드의 파일로그를 tail로 읽어서 ES로 쏘는 형태로 되어있다.

pod가 어느 노드에 들어가고, 들어가지 않을것인지를 결정하는 요소


도커 이미지를 만드는 방법에 대한 고민

빌드시간 단축을 위해서

jar를 통째로 올리면 docker의 layer를 제대로 활용하지 못 하는게 아닌지? layering을 효과적으로 하는 방법이 무엇이 있을까?

ECR

k8s도 GitHub action같은 빌드도구가 있지만 느려서 jenkins로 바꿈 환경변수나 시크릿 매니저 값은 애플리케이션에서 집어넣나? vault에 일원화 함

prod의 값들은 git에 안 남기고 secret

k8s 시크릿 오브젝트를 바꾸어 주어야하는데, k8s에 external secret에서 aws secret manager에서 발급한 키를 가져오는 식으로 조합해서 사용

하시코프