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 이 생성 안되거나 이상이 있을 때 확인해야하는 정보임