버전 비교

  • 이 줄이 추가되었습니다.
  • 이 줄이 삭제되었습니다.
  • 서식이 변경되었습니다.

...

코드 블럭
root@k8s-master01:~# kubectl get pod
NAME                               READY   STATUS    RESTARTS   AGE
nginx-deployment-5bccc488d-bqkvz   1/1     Running   0          18h
nginx-deployment-5bccc488d-r4s5d   1/1     Running   0          18h
nginx-deployment-5bccc488d-z29wp   1/1     Running   0          18h

root@k8s-master01:~# kubectl get quota
NAME      AGE   REQUEST                                         LIMIT
default   32s   cpu: 750m/1k, memory: 192Mi/200Gi, pods: 3/10
코드 블럭
# k delete quota/default                                                              │INGW64 ~/project/2024
resourcequota "default" deleted 

2.3 LimitRange

  • ResourceQuota를 사용하면 네임스페이스의 리소스를 제한하고, LimitRange는 네임스페이스 내 파드(컨테이너)의 리소스를 제한합니다.

  • 사용자가 컨테이너 리소스를 너무 크게 사용하면 특정 컨테이너가 많은 리소스를 점유하는 것을 방지할 수 있기 때문에 LimitRange를 사용합니다.

...

경고

# kubectl get event --sort-by='lastTimestamp'
LAST SEEN TYPE REASON OBJECT MESSAGE
78s Warning FailedCreate replicaset/nginx-deployment-8579d7f98c Error creating: pods "nginx-deployment-8579d7f98c-mxw8q" is forbidden: maximum cpu usage per Pod is 800m, but limit is 1500m

2. Label & Selector

  • Label

    • Label은 Pod와 같은 객체에 연결된 키/값 쌍입니다.

    • 리소스를 논리적인 그룹으로 나누거나, 식별의 편의를 위해 붙이는 이름표입니다.

    • Label은 생성 시 객체에 첨부할 수 있으며 나중에 언제든지 추가 및 수정할 수 있습니다.

  • Selector

    • 특정 Label에 해당하는 객체를 식별하고 검색할 수 있습니다.

2.1 Node Label

코드 블럭
# Node Label 확인
kubectl get nodes --show-labels

# Node Label 추가
kubectl label nodes k8s-worker01 svc=web

2.2 Pod Selector

8/05-pod-selector.yaml

...

코드 블럭
# 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에 해당하는 객체를 식별하고 검색할 수 있습니다.

2.1 Node Label

코드 블럭
# Node Label 확인
kubectl get nodes --show-labels

# Node Label 추가
kubectl label nodes w1-k8s svc=web

2.2 Pod Selector

8/05-pod-selector.yaml

코드 블럭
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    env: test
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
  nodeSelector:
    svc: web
코드 블럭
8# k get pod -o wide
NAME                                      READY   STATUS        RESTARTS       AGE     IP               NODE     NOMINATED NODE   READINESS GATES
frontend                                  2/2     Running       2 (3h3m ago)   4h50m   172.16.132.5     w3-k8s   <none>           <none>
nfs-client-provisioner-5cf87f6995-rdkfr   1/1     Running       40 (14m ago)   14h     172.16.221.136   w1-k8s   <none>           <none>
nginx                                     1/1     Running       0              5m3s    172.16.221.140   w1-k8s   <none>           <none>

...

3. 쿠버네티스 볼륨

지금까지 우리는 많은 실습을 통해 Pod를 배포하고 Service를 만들어 접속 할 수 있게 되었습니다.

...

코드 블럭
languagebash
[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@mroot@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
 

...

코드 블럭
languagebash
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등에 생성 할 수도 있습니다.

...

코드 블럭
languagebash
# yaml 파일을 적용합니다.
kubectl apply -f 012.nginx08-volvolume-3hostpath.ymlyaml
 
# 생성된 파드에서 마운트 된 경로의 파일을 확인합니다.
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 패키지를 설치합니다.
yumapt install nfs-utils -ycommon
 
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

...