node?

node 개념

  • Kubernetes 컴포넌트는 아래 세가지로 구분됨
    • master node
    • worker node
    • addon component (필수는아님)

Master node

Master node는 kubernetes cluster 를 관리하는 node로 크게 아래의 컴포넌트로 이루어짐

  • kube-apiserver : kubernetes 로 오는 모든 요청을 apiserver가 받아서 이 요청이 유효한지 검증함. kubernetes 내 모든 컴포넌트는 kube-apiserver를 통해 필요한 정보를 주고받음
  • kube-scheduler : Pod 생성 요청이 왔을 때 affinity, anti-affinity, resource requests 등의 Pod 생성조건을 확인하여 조건에 부합하는 node를 찾아 Pod를 생성하는 역할을 수행함
  • kube-controller-manager : node , network routing, loadbalancer, volume 을 관리하는 역할
  • etcd : kubernetes 의 status를 key value 로 저장하는 kubernetes의 database 역할

Worker node

Pod 실행 및 관리 등 kubernetes내 오브젝트들의 실행 환경을 제공하고 관리함

  • kubelet : kubernetes cluster 내 모든 node에서 실행되는 에이전트로 Pod 내 container를 실행하고 헬스체크하는 역할
  • kube-proxy : 노드에 들어오는 네트워크 트래픽을 포드 내의 컨테이너에게 라우팅하고 노드와 마스터간의 네트워크 통신을 관리하는 역할
  • Container runtime : container를 실행시키는 역할로 주로 docker를 사용함

worker node 간 pod 통신은 어떻게 이루어질까?

  • host01 의 Pod -> host02의 Pod으로 접속할 때 host01의 cbr0 (10.168.20.1) -> NAT -> eth0 (192.168.10.11) -> 라우터/게이트웨이로 도착
  • 라우터/게이트웨이에는 192.168.30.0/24 로의 요청이 오면 어느 호스트로 보내야하는지에 대한 규칙을 가지고 있어서 host02로 전달함
  • 이와 같은 구조를 host 간의 network 위에 별도의 network 가 또 존재한다 하여 overlay network라고 함

node 사용 현황

$ kubectl get nodes
NAME                                         STATUS   ROLES    AGE   VERSION
kimdubi-test-default-w-46niimovcith-node-0   Ready    <none>   46h   v1.17.6
kimdubi-test-default-w-46niimovcith-node-1   Ready    <none>   46h   v1.17.6
kimdubi-test-default-w-46niimovcith-node-2   Ready    <none>   46h   v1.17.6

node template을 살펴보자

$ kubectl get node  kimdubi-test-default-w-46niimovcith-node-0 -o yaml
apiVersion: v1
kind: Node
metadata:
  annotations:
    node.alpha.kubernetes.io/ttl: "0"
    volumes.kubernetes.io/controller-managed-attach-detach: "true"
  creationTimestamp: "2021-02-21T05:46:58Z"
  labels:
    beta.kubernetes.io/arch: amd64
    beta.kubernetes.io/instance-type: 6efa0e80-84f1-49b2-b641-7737b878ee56
    beta.kubernetes.io/os: linux
    failure-domain.beta.kubernetes.io/region: RegionOne
    failure-domain.beta.kubernetes.io/zone: kr-pub-b
    kubernetes.io/arch: amd64
    kubernetes.io/hostname: kimdubi-test-default-w-46niimovcith-node-0
    kubernetes.io/os: linux
    magnum.openstack.org/nodegroup: default-worker
    magnum.openstack.org/role: worker
    node.kubernetes.io/instance-type: 6efa0e80-84f1-49b2-b641-7737b878ee56
    topology.kubernetes.io/region: RegionOne
    topology.kubernetes.io/zone: kr-pub-b
  name: kimdubi-test-default-w-46niimovcith-node-0
  resourceVersion: "602658"
  selfLink: /api/v1/nodes/kimdubi-test-default-w-46niimovcith-node-0
  uid: 8b0642fe-cc69-461c-bfd1-cb20647b60d5
spec:
  podCIDR: 10.100.0.0/24
  podCIDRs:
  - 10.100.0.0/24
  providerID: openstack:///e0d624b0-346a-44d8-8eae-448bd6b15701
status:
  addresses:
  - address: 192.168.0.16
    type: InternalIP
  - address: kimdubi-test-default-w-46niimovcith-node-0
    type: Hostname
  allocatable:
    cpu: "1"
    ephemeral-storage: "18904622254"
    hugepages-1Gi: "0"
    hugepages-2Mi: "0"
    memory: 1780444Ki
    pods: "110"
  capacity:
    cpu: "1"
    ephemeral-storage: 20512828Ki
    hugepages-1Gi: "0"
    hugepages-2Mi: "0"
    memory: 1882844Ki
    pods: "110"
  conditions:
  - lastHeartbeatTime: "2021-02-23T04:15:34Z"
    lastTransitionTime: "2021-02-22T09:21:49Z"
    message: kubelet has sufficient memory available
    reason: KubeletHasSufficientMemory
    status: "False"
    type: MemoryPressure
  - lastHeartbeatTime: "2021-02-23T04:15:34Z"
    lastTransitionTime: "2021-02-22T09:21:49Z"
    message: kubelet has no disk pressure
    reason: KubeletHasNoDiskPressure
    status: "False"
    type: DiskPressure
  - lastHeartbeatTime: "2021-02-23T04:15:34Z"
    lastTransitionTime: "2021-02-22T09:21:49Z"
    message: kubelet has sufficient PID available
    reason: KubeletHasSufficientPID
    status: "False"
    type: PIDPressure
  - lastHeartbeatTime: "2021-02-23T04:15:34Z"
    lastTransitionTime: "2021-02-22T09:21:50Z"
    message: kubelet is posting ready status
    reason: KubeletReady
    status: "True"
    type: Ready
  daemonEndpoints:
    kubeletEndpoint:
      Port: 10250
  images:
  - names:
    - nvidia/k8s-device-plugin@sha256:631573a476b7e18512c5dae8990ea571bad3c14de3abaf6a8bc09a22c49be771
    - nvidia/k8s-device-plugin:v0.7.0-centos7
    sizeBytes: 264403050
  - names:
    - kubernetesui/dashboard@sha256:24b77588e57e55da43db45df0c321de1f48488fa637926b342129783ff76abd4
    - kubernetesui/dashboard:v2.0.0-rc7
    sizeBytes: 220798514
  - names:
    - k8s.gcr.io/kube-proxy@sha256:3691aecddfd13179dd6185a3dc4fd809c4964b64121c00b202cd972303edc4a9
    - k8s.gcr.io/kube-proxy:v1.17.6
    sizeBytes: 116521281
  - names:
    - k8s.gcr.io/node-problem-detector@sha256:f7a97be0fae649f95228bd89836590fb3dfddadc98a48e4be3fee1b19854bf9b
    - k8s.gcr.io/node-problem-detector:v0.8.2
    sizeBytes: 110047285
  - names:
    - bitnami/redis-cluster@sha256:dfedcaa03878564f6eb75c101a66d8ecd18a9558971ade5c82611bfa9fb6da96
    - bitnami/redis-cluster:6.0.10-debian-10-r5
    sizeBytes: 100302970
  - names:
    - k8s.gcr.io/autoscaling/cluster-autoscaler@sha256:d6e51b58808b5abe74b57666114efab748a6d8ba73afdb24cd2a7f91f11c4b1b
    - k8s.gcr.io/autoscaling/cluster-autoscaler:v1.19.0
    sizeBytes: 90379091
  - names:
    - quay.io/coreos/flannel@sha256:6d451d92c921f14bfb38196aacb6e506d4593c5b3c9d40a8b8a2506010dc3e10
    - quay.io/coreos/flannel:v0.12.0-amd64
    sizeBytes: 52767393
  - names:
    - gcr.io/google_containers/cluster-proportional-autoscaler-amd64@sha256:791836c2a2471ecb23a975cf12835f2a35ada3f9d841f3f1a363b83eca99e2aa
    - gcr.io/google_containers/cluster-proportional-autoscaler-amd64:1.1.2
    sizeBytes: 50485461
  - names:
    - quay.io/coreos/flannel-cni@sha256:734b4222110980abd0abe74974b6ca36452d26bdd2a20e25f37fdf7fdc2da170
    - quay.io/coreos/flannel-cni:v0.3.0
    sizeBytes: 49786179
  - names:
    - coredns/coredns@sha256:7ec975f167d815311a7136c32e70735f0d00b73781365df1befd46ed35bd4fe7
    - coredns/coredns:1.6.5
    sizeBytes: 41578211
  - names:
    - k8s.gcr.io/metrics-server-amd64@sha256:78938f933822856f443e6827fe5b37d6cc2f74ae888ac8b33d06fdbe5f8c658b
    - k8s.gcr.io/metrics-server-amd64:v0.3.1
    sizeBytes: 40767713
  - names:
    - kubernetesui/metrics-scraper@sha256:555981a24f184420f3be0c79d4efb6c948a85cfce84034f85a563f4151a81cbf
    - kubernetesui/metrics-scraper:v1.0.4
    sizeBytes: 36937728
  - names:
    - k8s.gcr.io/pause@sha256:f78411e19d84a252e53bff71a4407a5686c46983a2c2eeed83929b888179acea
    - k8s.gcr.io/pause:3.1
    sizeBytes: 742472
  nodeInfo:
    architecture: amd64
    bootID: c5eda8c3-5d63-45db-854f-6a563e9a7870
    containerRuntimeVersion: docker://19.3.13
    kernelVersion: 3.10.0-862.14.4.el7.x86_64
    kubeProxyVersion: v1.17.6
    kubeletVersion: v1.17.6
    machineID: e0d624b0346a44d88eae448bd6b15701
    operatingSystem: linux
    osImage: CentOS Linux 7 (Core)
    systemUUID: E0D624B0-346A-44D8-8EAE-448BD6B15701
  volumesAttached:
  - devicePath: /dev/vdc
    name: kubernetes.io/cinder/5aa9bfc5-5cac-48ba-a9dc-f1e19926763d
  - devicePath: /dev/vdb
    name: kubernetes.io/cinder/01f43c11-b446-48ee-8898-bdd3f247dfbd
  volumesInUse:
  - kubernetes.io/cinder/01f43c11-b446-48ee-8898-bdd3f247dfbd
  - kubernetes.io/cinder/5aa9bfc5-5cac-48ba-a9dc-f1e19926763d

.metadata.labels

  • node의 labels 은 주로 Pod 의 affinity , antiAffinity 에 사용되어 Pod이 특정 node에 생성될 수 있도록 할 때 사용됨

.status.conditions

  • node 의 현재 상태를 확인할 수 있음 주로 kubectl decribe node node명으로 확인함
  • memory나 disk 가 부족한지 등의 상태가 나오기 때문에 Pod 이 생성 안되거나 이상이 있을 때 확인해야하는 정보임