...
코드 블럭 |
---|
# k delete limitrange/cpu-min-max-demo-lr │INGW64 ~/project/2024 limitrange "cpu-min-max-demo-lr" deleted # k delete -f 04-limitrange-test.yaml │ deployment.apps "nginx-deployment" deleted |
...
2. Label & Selector
쿠버네티스 스케줄링에 포함된 내용입니다.
노드-파드도 Label&Selector를 이용하여 노드의 리소스 관리를 할 수 있고, 서비스-파드도 Label&Selector를 이용하여 엔드포인트를 지정합니다.
Label
Label은 Pod와 같은 객체에 연결된 키/값 쌍입니다.
리소스를 논리적인 그룹으로 나누거나, 식별의 편의를 위해 붙이는 이름표입니다.
Label은 생성 시 객체에 첨부할 수 있으며 나중에 언제든지 추가 및 수정할 수 있습니다.
Selector
특정 Label에 해당하는 객체를 식별하고 검색할 수 있습니다.
...
코드 블럭 | ||
---|---|---|
| ||
[root@m-k8s vagrant]# k apply -f 012.nginx06-volvolume-1emptydir.ymlyaml deployment.apps/nginx-vol-1 created [root@m-k8s vagrant]# k get pods NAME READY STATUS RESTARTS AGE nginx-vol-1-77d6454655-xscpd 1/1 Running 0 38s 위와같이 Running 상태가 되면 pod내 볼륨이 정상적으로 mount되었는지 확인 합니다 [root@m-k8s vagrant]# k exec -it nginx-vol-1-77d6454655-xscpd -- df -h Filesystem Size Used Avail Use% Mounted on overlay 37G 5.4G 32G 15% / tmpfs 64M 0 64M 0% /dev tmpfs 1.5G 0 1.5G 0% /sys/fs/cgroup /dev/mapper/centos_k8s-root 37G 5.4G 32G 15% /cache shm 64M 0 64M 0% /dev/shm tmpfs 2.9G 12K 2.9G 1% /run/secrets/kubernetes.io/serviceaccount tmpfs 1.5G 0 1.5G 0% /proc/acpi tmpfs 1.5G 0 1.5G 0% /proc/scsi tmpfs 1.5G 0 1.5G 0% /sys/firmware # 마운트 확인 /dev/mapper/centos_k8s-root 37G 5.4G 32G 15% /cache 가 정상적으로 마운트 되었습니다 /dev/mapper/centos_k8s-root은 worker node의 root disk입니다 [root@cp-k8s mapper]# ssh vagrant@w1-k8s vagrant@w1-k8s's password: [vagrant@w1-k8s ~]$ ls -al /dev/mapper/centos_k8s-root lrwxrwxrwx. 1 root root 7 Sep 12 13:49 /dev/mapper/centos_k8s-root -> ../dm-0 # 파일을 쓰고 파드를 삭제하여 데이터가 존재하는지 확인 합니다 [root@m-k8s mapper]# k get pods NAME READY STATUS RESTARTS AGE nginx-vol-1-77d6454655-xscpd 1/1 Running 0 4m34s [root@m-k8s mapper]# k exec -it nginx-vol-1-77d6454655-xscpd -- bash -c "echo 'test' > /cache/test.txt " [root@m-k8s mapper]# k exec -it nginx-vol-1-77d6454655-xscpd -- ls -al /cache total 4 drwxrwxrwx. 2 root root 22 Sep 13 00:33 . drwxr-xr-x. 1 root root 52 Sep 13 00:28 .. -rw-r--r--. 1 root root 5 Sep 13 00:33 test.txt [root@m-k8s vagrant]# k get pod NAME READY STATUS RESTARTS AGE nginx-vol-1-77d6454655-xscpd 1/1 Running 0 8s [root@m-k8s vagrant]# k delete pod/nginx-vol-1-77d6454655-xscpd pod "nginx-vol-1-77d6454655-xscpd" deleted # deploy로 pod가 재배포 되길 기다립니다 [root@m-k8s vagrant]# k get pod NAME READY STATUS RESTARTS AGE nginx-vol-1-77d6454655-fd9tg 1/1 Running 0 6s # 새로운 pod가 배포 되었습니다 # 이후 해당 pod에 마운트된 /cache볼륨에 이전에 생성한 파일이 남아있는지 확인 합니다. [root@m-k8s vagrant]# kubectl exec -it nginx-vol-1-77d6454655-fd9tg -- ls -al /cache total 0 drwxrwxrwx. 2 root root 6 Sep 13 02:01 . drwxr-xr-x. 1 root root 52 Sep 13 02:01 .. 이전에 만든 test.txt가 존재하지 않습니다(Pod가 제거되면 emptydir속성의 볼륨도 삭제) # 다음 실습을 위해 환경을 정리 합니다. [root@m-k8s vagrant]# k delete -f 012.nginx06-volvolume-1emptydir.ymlyaml deployment.apps "nginx-vol-1" deleted |
...
코드 블럭 | ||
---|---|---|
| ||
kubectl apply -f 012.nginx-vol-2.yml07-volume-emptydir-multicon.yaml pod/nginx-vol-2 created kubectl get pod NAME READY STATUS RESTARTS AGE nginx-vol-2 2/2 Running 0 8s # 확인하면 포드내 컨테이너가 2개로 보입니다 # 생성된 컨테이너를 확인합니다 # 컨테이너가 2개 이상인경우 get pod 명령어를 활용해서 컨테이너를 식별하고 제어하지 못합니다. $ kubectl describe pod/nginx-vol-2 ...... Containers: nginx: Container ID: containerd://a9eac4ae13b2a8f052fe9bf6eca53c93e95c0de7ce4352cf1e77a0c4d2e1c5bb Image: nginx Image ID: docker.io/library/nginx@sha256:6926dd802f40e5e7257fded83e0d8030039642e4e10c4a98a6478e9c6fe06153 Port: <none> Host Port: <none> State: Running Started: Wed, 13 Sep 2023 11:05:21 +0900 Ready: True Restart Count: 0 Environment: <none> Mounts: /cache from cache-volume (ro) /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-pjccg (ro) fortune: Container ID: containerd://6e343b738170e0b1d0b0fa18fe641c0cd0b1257ae3cab9d7fc75fff041f09084 Image: luksa/fortune Image ID: docker.io/luksa/fortune@sha256:814dd72ecc4b431560ca6ede8649fc4862c401ba5b6d37520e6672e0657deea9 Port: <none> Host Port: <none> State: Running Started: Wed, 13 Sep 2023 11:05:33 +0900 Ready: True Restart Count: 0 Environment: <none> Mounts: /cache from cache-volume (rw) /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-pjccg (ro) Volumes: cache-volume: Type: EmptyDir (a temporary directory that shares a pod's lifetime) Medium: SizeLimit: <unset> # 두번째 yml을 보면 volume type을 EmptyDir로 선언하는것을 생략하였습니다 아무런 type이 없으면 기본값으로 EmptyDir를 사용 하게 됩니다 ..... # nginx와 fortune 2개의 컨테이너가 생성된것을 확인 할수 있습니다 # rw로 마운트된 fortune에서 파일을 생성하고 nginx컨테이너에서 파일을 볼수 있는지 실습 해봅시다 # pod내 컨테이너 선택은 -c옵션을 이용합니다 # fortune 컨테이너에서 만든 파일을 같은 pod내에 있는 nginx컨테이너테서 확인 할 수 있습니다. [root@m-k8s vagrant]# kubectl exec nginx-vol-2 -c fortune -- bash -c ' echo "test" > /cache/test.txt ' [root@m-k8s vagrant]# kubectl exec nginx-vol-2 -c fortune -- ls -l /cache total 4 -rw-r--r--. 1 root root 5 Sep 13 02:19 test.txt [root@m-k8s vagrant]# kubectl exec nginx-vol-2 -c nginx -- ls -l /cache total 4 -rw-r--r--. 1 root root 5 Sep 13 02:19 test.txt # 아래와 같이 nginx는 ro권한밖에 없으므로, 실제 write는 불가능합니다. [root@m-k8s vagrant]# kubectl exec nginx-vol-2 -c nginx -- bash -c 'echo "test" > /cache/test2.txt' bash: line 1: /cache/test2.txt: Read-only file system command terminated with exit code 1 # 실습환경을 정리합니다. kubectl delete -f 012.nginx-vol-2.yml07-volume-emptydir-multicon.yaml pod "nginx-vol-2" deleted *기본적으로 emptydir은 worker노드에 디스크(파일시스템)에 생성되지만 상황에따라 memory나 fc disk등에 생성 할 수도 있습니다. |
...
코드 블럭 | ||
---|---|---|
| ||
# yaml 파일을 적용합니다. kubectl apply -f 08-volume-hostpath.yaml # 생성된 파드에서 마운트 된 경로의 파일을 확인합니다. kubectl exec -it nginx-vol-3 -- ls -l /usr/share/nginx/html total 4 -rw-r--r-- 1 root root 9 Apr 28 01:17 index.html # 파일 내용을 확인합니다. kubectl exec -it nginx-vol-3 -- cat /usr/share/nginx/html/index.html hihihihi [root@m-k8s vagrant]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-vol-3 1/1 Running 0 107s 172.16.221.185 w1-k8s <none> <none> [root@m-k8s vagrant]# [root@m-k8s vagrant]# curl 172.16.221.185 hihihihi # node에서 생성한 파일이 pod에 hostpath를 이용해 마운트 된것을 확인 할 수 있습니다. # hostpath의 경우 권한이 다르면 사용할수 없으므로 컨테이너 내 사용자로 권한을 바꾸거나 root사용자로 구동되도록 하여야 합니다. # 실습을 위해 실습환경을 정리합니다. [root@m-k8s vagrant]# kubectl delete -f 012.nginx08-volvolume-3hostpath.ymlyaml pod "nginx-vol-3" deleted |
...
NFS를 volume으로 사용할 수 있습니다.
NFS를 이용하면 여러 pod에 동일한 volume을 마운트 할 수 있고, 여러 노드가 읽고 쓸 수 있으므로 파일 공유에 많은 이점이 있습니다.
(1) 실습을 위하여 worker2번 w2-k8s번 노드에 nfs서버를 임시로 구성하여 진행 합니다
코드 블럭 |
---|
# nfs-utils 패키지를 설치 합니다 apt install -y nfs-server # nfs 공유로 사용할 폴더를 생성하고 테스트에 사용할 index.html 파일을 생성합니다 mkdir /nfs chmod 777 /nfs echo "hihihi" > /nfs/index.html # nfs공유 설정을 해줍니다. cat <<EOF | tee /etc/exports /nfs *(rw,no_root_squash) EOF # nfs서버 서비스를 실행하고 활성화 합니다. systemctl enable nfs-server --now Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service. # 확인 # 출력값이 없으면 [systemctl restart nfs-server] 실행합니다. systemctl restart nfs-server [root@w2-k8s ~]# exportfs /nfs w2-k8s # nfs설정이 정상인지 worker1번에서 마운트 하여 테스트 합니다 ssh w1-k8s # 모든 마스터/워커노드에서 nfs 패키지를 설치합니다. apt install nfs-common mkdir /nfs mount w2-k8s:/nfs /nfs df -h Filesystem Size Used Avail Use% Mounted on ..... 192.168.1.102:/nfs 38770304 4569856 34200448 12% /nfs ..... [root@w1-k8s /]# ll /nfs total 4 -rw-r--r--. 1 root root 6 Sep 13 12:47 index.html #nfs서버가 정상 작동되는것을 확인 했으니 이제 실습을 진행 합니다. #/nfs 폴더를 umount 해줍니다. umount /nfs 이제 설정이 완료된 nfs볼륨을 이용하여 pod를 생성하여 줍니다 |
...
(3) 생성된 yaml을 적용하여 파드를 생성 합니다
코드 블럭 |
---|
kubectl apply -f 012.nginx09-volvolume-4nfs.yaml pod/nginx-vol-4 created [root@m-k8s vagrant]# k get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-vol-4 1/1 Running 0 53s 172.16.221.186 w1-k8s <none> <none> [root@m-k8s vagrant]# curl 172.16.221.186 hiihi kubectl exec -it nginx-vol-4 -- df -h Filesystem Size Used Avail Use% Mounted on ... w2-k8s:/nfs 37G 4.4G 33G 12% /usr/share/nginx/html ... # pod가 구동중인 worker1의 마운트 상태 확인 [root@w1-k8s /]# df -h Filesystem Size Used Avail Use% Mounted on w2-k8s:/nfs 37G 4.4G 33G 12% /var/lib/kubelet/pods/23229ac8-acb5-4aa0-b 0f1-6d8f36236366/volumes/kubernetes.io~nfs/nfs-volume #hostpath의 경우 해당파일이 존재하는 워커노드에서만 수행되도록 설정하였으나 nfs사용시에는 어느 노드에서 구동되어도 상관이 없습니다 # 다음 실습을 위해 실습환경을 정리 합니다. kubectl delete -f 012.nginx09-volvolume-4nfs.ymlyaml pod "nginx-vol-4" deleted |
...
(1) 동적 프로비저닝으로 nfs를 가지고 실습합니다.
기존의 세팅값을 지웁니다.
NFS 프로비저너를 설치합니다.
코드 블럭 |
---|
[root@mroot@cp-k8s vagrant]# git clone https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner.git [root@mroot@cp-k8s vagrant]# cd nfs-subdir-external-provisioner/deploy |
...
pvc만 지정하여 구성하면, 자동적으로 하드웨어에 용량이 할당되는 형태의 서비스가 시작됩니다.
deployment.yaml 파일 수정
코드 블럭 |
---|
... env: - name: PROVISIONER_NAME value: k8s-sigs.io/nfs-subdir-external-provisioner - name: NFS_SERVER value: w2-k8s #수정 - name: NFS_PATH value: /nfs #수정 volumes: - name: nfs-client-root nfs: server: w2-k8s #수정 path: /nfs #수정 |
코드 블럭 |
---|
[root@m-k8s deploy]# k apply -f rbac.yaml [root@m-k8s deploy]# k apply -f deployment.yaml [root@m-k8s deploy]# k apply -f class.yaml |
...
코드 블럭 |
---|
[root@m-k8s deploy]# k apply -f 012.mypvc13-volume-dynamic-pvc.yaml |
코드 블럭 |
---|
[root@m-k8s deploy]# k get pv,pvc NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE persistentvolume/pvc-45758961-7542-4f32-a959-d5ee0bdc17e8 1G RWX Delete Bound default/mypvc-dynamic nfs-client 4s NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE persistentvolumeclaim/mypvc-dynamic Bound pvc-45758961-7542-4f32-a959-d5ee0bdc17e8 1G RWX nfs-client 4s [root@m-k8s deploy]# k get sc NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE nfs-client k8s-sigs.io/nfs-subdir-external-provisioner Delete Immediate false 49m |
...
코드 블럭 |
---|
[root@m-k8s vagrant]# k apply -f 012.nginx15-volume-nfs-pvcpod.ymlyaml pod/nginx-nfs-pvc created [root@m-k8s vagrant]# k get pods NAME READY STATUS RESTARTS AGE gitea-66bc89d659-z577q 1/1 Running 0 6h15m nfs-client-provisioner-554d86f86-jlgt6 1/1 Running 0 64m nginx-nfs-pvc 0/1 ContainerCreating 0 3s [root@m-k8s vagrant]# k get pods NAME READY STATUS RESTARTS AGE gitea-66bc89d659-z577q 1/1 Running 0 6h15m nfs-client-provisioner-554d86f86-jlgt6 1/1 Running 0 64m nginx-nfs-pvc 1/1 Running 0 8s |
...