[k8s] 스케줄링 & 로깅

타샤's 월드·2025년 5월 6일

스케줄링


1. 매뉴얼 스케줄링

1. 파드.yml spec에 nodeName 지정

2. binding.yml

2. 레이블 & 셀렉터

3. taint & toleration

taint : 파드가 특정 노드에 접근 제한하게 하는 설정(?)
tolerant: 파드가 제한을 뛰어넘을 수 있는 역치
kubectl taint nodes <node-name> key=value:<NoSchedule|PreferNoSchedule|NoExecute>

  • NoSchedule : 새 파드가 해당 노드에 스케줄되지 않음
  • PreferNoSchedule: 새 파드가 해당 노드에 왠만하면 스케줄 되지 않음
  • NoExecute: 현재 존재하는 파드도 제거
apiVersion: v1
kind: Pod
metadata:
spec:
  containers:
  - name: nginx-container
    image: nginx
  toleration:
  - key: "app"
    operator: "Equal"
    value: "blue"
    effect: "NoSchedule"

4. 노드 셀렉터

apiVersion: v1
kind: Pod
metadata:
spec:
  containers:
  - name: nginx-container
    image: nginx
  nodeSelector:
    size: Large #노드에 지정된 레이블 키밸류
  • 노드 키밸류 지정 명령어
    kubectl label node <node-name> <key>=<value>
  • and or not 기능 없이 단순 키밸류로만 매칭 가능

5. Node Affinity

https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#node-affinity

apiVersion: v1
kind: Pod
metadata:
spec:
  containers:
  - name: nginx-container
    image: nginx
  affinity:
    nodeAffinity:
      requireDuringSchedulingIgnoreDuringExecution:
        nodeSeletorTerms:
        - matchExpressions:
            key: size
            operator: In #여러개의 밸류를 추가할 수 있음 (NotIn | Exist | NotExist)
            values:
            - Large
       

6. 리소스

Limit Range

  • 리밋레인지는 이 이후 생성된 파드에 대해서만 적용됨
apiVersion: v1
kind: LimitRange
metadat: cpu-resource-contraint
spec:
  limits:
  - default:
      cpu: 500m
    defaultRequest:
      cpu: 500m
    max:
      cpu: "1"
    min:
      cpu: 100m
    type: Container
  

7. 데몬셋

  • 레플리카셋.yml 과 거의 동일 kind: DaemonSet
  • 레플리카셋과 비슷하지만 1노드당 1개씩 생성되도록 적용.
  • 예를들어 kube-proxy는 데몬셋으로 생성될 수 있음

8. 스태틱 파드

  • 노드가 1개고 마스터노드 없이 kube-apiserver 없이 그냥 kubelet 하나가 파드를 실행할 수 있을까?

  • YES : /etc/kubernetes/manifest 폴더에 yml 파일을 두면 직접 읽어 실행할 수 있음

  • 스태틱 파드의 경우엔 kube-apiserver를 통해 삭제 수정 불가

  • 근데 /etc/kubernetes/manifest 폴더에 없으면 /var/lib/kubelet/config.yml 확인해서 매니페스트 폴더가 다른곳에 지정되어 있는지 확인해보기

9. 멀티플 스케줄러

https://kubernetes.io/docs/reference/scheduling/config/

apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchdulerConfiguration
clientConnection:
  kubeconfig: /etc/srv/kubernetes/kube-scheduler/kubeconfig
apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  container:
  - name: nginx
    image: nginx
  schdulerName: custom-scheduler1

10. 스케줄링 플러그인

  • 큐:PrioritySort
  • 소팅: NodeResourcesFit NodeName NodeUnschedulable
  • 스코어링:NodeResourcesFit, ImageLocality
  • 바인딩: defaultBinder

기타 디버깅

signal 9 = SIGKILL: 사용자가 직접 kill -9 하거나, 커널이 Out Of Memory(OOM) 시 자동으로 프로세스를 강제 종료할 때 발생
kubectl describe pod <파드명>

노드 타고 들어가기

  • kubectl get node -o wide 하면 Internal IP 보임
  • ssh <InternalIP>

2025 버전

https://kubernetes.io/docs/reference/access-authn-authz/rbac/

# role.yml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata: 
  name: developer
rules:
  apiGroups: [""]
  resources: ["pods"]
  verbs: ["create", "get", "watch", "list"]
  resourceNames: ["blue", "orange"] # 파드명이 이런 경우에만 작업 가능

Admission Controller

https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/

  • 어드미션 컨트롤에서 확인이 안되면 api작동도 안함. kubectl get pods에서 pod가 안 보일 수 있음

  • 상황에 따라 pod나 네임스페이스 생성도 가능함

  • kubectl exec kube-apiserver-controlplane -n kube-system -- kube-apiserver -h | grep enable-admission-plugins

  • ps -ef | grep kube-apiserver | grep admission-plugins

  • vi /etc/kubenetes/manifest/kube-apiserver.yml

웹훅

https://kubernetes.io/docs/reference/access-authn-authz/extensible-admission-controllers/

  • 외부 서비스로 admission을 진행하는 방법
  • 웹훅 서버 deployment -> 웹훅 service -> 웹훅 configure
  • 이렇게 하면 기본적으로 새로 생성된 파드에 다 적용됨
# webhook-configure.yml
apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
metadata:
  name: "pod-policy.example.com"
webhooks:
- name: "pod-policy.example.com"
  rules:
  - apiGroups:   [""]
    apiVersions: ["v1"]
    operations:  ["CREATE"]
    resources:   ["pods"]
    scope:       "Namespaced"
  clientConfig:
    service:
      namespace: "example-namespace"
      name: "example-service"
    caBundle: <CA_BUNDLE>
  admissionReviewVersions: ["v1"]
  sideEffects: None
  timeoutSeconds: 5
  • 확인을 위해 kubectl get pod <파드명> -o yaml 해서 해당 security context를 확인하면 됨.
  • 조건 안에 새부 조건을 넣은 파드는 생성 가능하지만 충돌하는 파드는 생성이 안됨
  securityContext:
    runAsNonRoot: true
    runAsUser: 0

로깅


메트릭 서버

git clone http://github.com/kubernetes-incubator/metric-server.git .
kubectl create -f deploy/1.8+/
kubectl top node
kubectl top pod

일반 로깅

파드에 컨테이너가 1개일때:

kubectl logs <파드명>

파드에 컨테이너가 복수개일때

kubectl logs <파드명> <컨테이너명>

profile
그때 그때 꽂힌것 하는 개발블로그

0개의 댓글