[실습] 쿠버네티스 실습 3 - 기본 사용법(2)
필기자
2023-11-28 19:27
868
0
본문
목차
데몬셋
데몬셋(DemonSet)
데몬셋(실습)
데몬셋 yaml 파일 생성
데몬셋 yaml 파일 내용
데몬셋 생성 및 정보 확인
데몬셋 상세 정보 확인(실행 화면)
상세정보 내용
데몬셋 파드 리스트 확인 및 데몬셋 삭제
데몬셋 파드 리스트 확인(실행 화면)
데몬셋 목록 조회 결과(각 열 의미)
크론잡
잡(job)
크론잡(실습)
크론잡 yaml 파일 생성
크론잡 yaml 파일 내용
크론잡 생성 및 목록 확인
크론잡 목록 확인(실행 화면)
크론잡 목록 상세 정보 확인(실행 화면)
CronJob 리소스에 대한 정보(각 열 의미)
파드 변화 확인 및 크론잡 삭제
파드 변화 확인(실행 화면)
크론잡 삭제(실행 화면)
CoreDNS
DNS
CoreDNS(실습)
CoreDNS 구성 및 서비스 확인
CoreDNS 구성 확인(실행 화면)
두 개의 파드에 대한 서비스 확인(실행 화면)
CoreDNS의 내용을 담고 있는 Corefile 정보 확인
Corefile 정보 확인(실행 화면)
Corefile의 출력 내용
파드 하나 생성후 /erc/resolv.conf 파일 내용 확인(실행 화면)
resolv.conf에 등록된 결과(의미)
컨피그맵
컨피그맵(ConfigMap)
리터럴 값(--from-literal) 사용 방법
컨피그맵 JAVA_HOME 환경 변수 정의(실행 화면)
컨피그맵 삭제
컨피그맵 변수 추가 정의
컨피그맵 변수 추가 정의(실행 화면)
컨피그맵 활용
디플로이먼트, 파드, 리플리카세 데몬셋, 크론잡 등 정리
파일/디렉터리(--from-file) 사용 방법
html 파일 이용하여 컨피그맵 생성
html 파일 이용하여 컨피그맵 생성(실행 화면)
컨피그맵 내용 확인
컨피그맵 내용 확인(실행 화면)
컨피그맵 파일 활용
시크릿
시크릿 생성
시크릿 생성(실행 화면)
시크릿 활용
시크릿 삭제
볼륨
볼륨 분류
볼륨 유형
emptyDir(실습) 임시 볼륨 마운트 후 데이터 읽고 쓰기
emptydir yaml 파일 생성 및 실행
emptydir yaml 파일 내용
emptydata 파드에 접속 및 디렉토리 이동
emptydata 파드에 접속 및 디렉토리 이동(실행 화면)
text 파일 생성 및 확인
text 파일 생성 및 확인(실행 화면)
hostPath(실습) 로컬 볼륨 마운트 후 데이터 생성
hostpath yaml 파일 내용
hostpath yaml 파일 실행 및 hostpath 파드 접속
hostpath yaml 파일 실행(실행 화면)
hostpath 파드 접속 및 디렉토리 이동(실행 화면)
text 파일 생성 및 생성 파일 확인
text 파일 생성 및 생성 파일 확인(실행 화면)
NFS 유틸리티 설치(worker0, worker1)
공유 디렉토리 생성
NFS 공유 설정
변경사항 적용
공유폴더 확인
워크노드에서 마운트 테스트
PersistentVolume 설정
PersistentVolumeClaim 설정
PVC 마운트 pod 생성
- 데몬셋
- 크론잡
- 컨피그맵
- 시크릿
- 볼륨
데몬셋
데몬셋(DemonSet)
- 모든 노드 파드 실행시 사용
- 모니터링 용도로 사용
데몬셋(실습)
데몬셋 yaml 파일 생성
nano daemonsets.yaml
데몬셋 yaml 파일 내용
apiVersion: apps/v1 # Kubernetes API 버전 지정
kind: DaemonSet # 데몬셋 정의
metadata: #
name: prometheus-daemonset # 데몬셋 이름 지정
spec: # 데몬셋 스펙 정의
selector: # 파드 선택하는 방법 지정
matchLabels:
tier: monitoring
name: prometheus-exporter
template: # 파드 템플릿 정의 데몬셋이 생성하는 파드는 템플릿을 기반으로 생성
metadata: # 파드 메타데이터 정의
labels: # 파드 라벨 정의
tier: monitoring
name: prometheus-exporter
spec: # 파드 스펙 정의
containers: # 파드 포함 컨테이너 정의
- name: prometheus # 컨테이너 이름 지정
image: prom/node-exporter # 도커 이미지 지정
ports: # 컨테이너 포트 정의
- containerPort: 80 # 컨테이너 사용 포트
데몬셋 생성 및 정보 확인
#데몬셋 생성
kubectl apply -f daemonsets.yaml
#데몬셋 상세 정보 확인
kubectl describe daemonset/prometheus-daemonset
데몬셋 상세 정보 확인(실행 화면)
상세정보 내용
- Name: prometheus-daemonset: DaemonSet의 이름
- Selector: name=prometheus-exporter,tier=monitoring: DaemonSet이 어떤 노드에 파드를 배포할지 선택하는 데 사용되는 레이블 셀렉터
- Desired Number of Nodes Scheduled: 예상된 노드 수
- Current Number of Nodes Scheduled: 현재 노드 수
- Number of Nodes Scheduled with Up-to-date Pods: 최신 상태의 파드를 가진 노드 수
- Number of Nodes Scheduled with Available Pods: 사용 가능한 파드를 가진 노드 수
- Number of Nodes Misscheduled: 잘못 배치된 노드의 수
- Pods Status: 파드의 상태(실행 중인 파드 수 / 대기 중인 파드 수 / 성공한 파드 수 / 실패한 파드 수)
- Pod Template: 사용되는 파드 템플릿의 정보
- Containers: 파드에 포함된 컨테이너의 정보
- Events: DaemonSet과 관련된 이벤트 정보
- Type: 이벤트의 유형 (Normal, Warning 등)
- Reason: 이벤트의 발생 이유
- Age: 이벤트가 발생한 시간 경과
- From: 이벤트가 발생한 소스
- Message: 이벤트에 대한 메시지
데몬셋 파드 리스트 확인 및 데몬셋 삭제
#데몬셋 확인
kubectl get daemonset
#파드 리스트 확인
kubectl get pods -o wide
데몬셋 파드 리스트 확인(실행 화면)
데몬셋 목록 조회 결과(각 열 의미)
- NAME: DaemonSet의 이름
- DESIRED: DaemonSet이 관리하는 파드의 원하는 수
- CURRENT: 현재 DaemonSet이 관리하는 파드의 실제 수
- READY: 현재 실행 중이고 모든 컨테이너가 정상적으로 시작된 파드 수
- UP-TO-DATE: 최근에 업데이트된 컨트롤러 템플릿을 사용하여 생성된 파드의 수
- AVAILABLE: 사용 가능한 파드 수
- AGE: DaemonSet이 생성된 시간으로 표시된 시간 경과
#데몬셋 삭제 kubectl delete daemonset [데몬셋 이름]
kubectl delete daemonset prometheus-daemonset
크론잡
잡(job)
- 하나 이상 파드가 특정한 파드의 정상적인 상태 유지 및 관리
- 주기적으로 액션을 발생시키는 잡
- 애플리케이션, 데이터 백업시 사용
크론잡(실습)
크론잡 yaml 파일 생성
nano cronjob.yaml
크론잡 yaml 파일 내용
apiVersion: batch/v1
kind: CronJob # CronJob 정의
metadata:
name: hello # CronJob의 이름 지정
spec:
schedule: "*/1 * * * *" # CronJob 실행 일정 지정
jobTemplate: # Job 템플릿 정의
spec:
template:
spec:
containers:
- name: hello # 컨테이너 이름 지정
image: busybox # 도커 이미지 지정
imagePullPolicy: IfNotPresent # 이미지 풀 정책 설정(이미지가 없을 때만 풀도록 설정)
command: # 컨테이너에서 실행할 명령어 정의
- /bin/sh # 셸 실행
- -c # 명령어 실행시 사용할 인자
- date; echo Hello from the Kubernetes cluster # date 명령어와 메시지 출력 명령어
restartPolicy: OnFailure # Job이 실패할 때만 다시 시작되도록 재시작 정책 설정
크론잡 생성 및 목록 확인
#크론잡 생성
kubectl create -f cronjob.yaml
#크론잡 목록 확인
kubectl get cronjob hello
#크론잡 목록 상세정보 확인
kubectl get cronjob -w
크론잡 목록 확인(실행 화면)
크론잡 목록 상세 정보 확인(실행 화면)
CronJob 리소스에 대한 정보(각 열 의미)
- NAME: CronJob의 이름
- SCHEDULE: Cron 표현식에 따라 작업이 예약된 시간
- */1 * * * *"로 설정 매 분마다 실행 예약
- SUSPEND: 현재 CronJob이 일시 중지되었는지 여부
- ACTIVE: 현재 실행 중인 작업의 수
- LAST SCHEDULE: 가장 최근에 작업이 예약된 시간
- AGE: CronJob이 생성된 이후의 경과 시간
파드 변화 확인 및 크론잡 삭제
#파드 변화 확인
kubectl get pod -w
#크론잡 삭제
kubectl delete cronjob hello
파드 변화 확인(실행 화면)
크론잡 삭제(실행 화면)
CoreDNS
DNS
- 사람이 이해하는 도메인과 컴퓨터가 이해하는 IP 주소 간 변환 서비스
- 쿠버네티스 전용 DNS
- kubeadm 설치 시 기본 설치
CoreDNS(실습)
CoreDNS 구성 및 서비스 확인
#CoreDNS 구성 확인
#두 개의 파드로 구성
kubectl get po -n kube-system -l k8s-app=kube-dns
#두 개의 파드에 대한 서비스 확인
#kube-dns는 TCP, UDP 모두 53 포트 사용
kubectl get svc -n kube-system -l k8s-app=kube-dns
CoreDNS 구성 확인(실행 화면)
두 개의 파드에 대한 서비스 확인(실행 화면)
CoreDNS의 내용을 담고 있는 Corefile 정보 확인
- Corefile은 CoreDNS의 구성 파일
- 어떤 서버가 어떤 포트와 프로토콜을 수신하는지에 대한 내용 기록
#Corefile 정보 확인
kubectl describe cm -n kube-system coredns
Corefile 정보 확인(실행 화면)
Corefile의 출력 내용
- errors: 에러 발생시 stdout에 내용 기록
- health: CoreDNS 상태 확인 부분
- ready: DNS 서비스 준비가 되었다면 200 OK 반환
- kubenetes: CoreDNS가 쿠버네티스의 서비스 및 파드의 IP를 기반으로 DNS 질의에 응답
- prometheus: 지정된 포트(9153)로 프로메테우스의 메트릭 정보 확인
- 프로메테우스(Prometheus)는 오픈 소스 시스템 모니터링 및 경고 도구
- 시스템 상태를 모니터링하는 데 사용
- 메트릭(Metrics)은 시스템의 동작을 측정하고 표현하는 수치 값
#파드 하나 생성후 /erc/resolv.conf 파일 내용 확인
#파드 생성시 kubelet은 /erc/resolv.conf 파일에 CoreDNS를 가리키는 IP 주소를 네임서버로 등록
#resolv.conf 파일에 등록된 네임서버를 이용해 도메인을 IP로 변경 가능
kubectl run -it --rm --image=busybox --restart=Never busybox -- cat /etc/resolv.conf
파드 하나 생성후 /erc/resolv.conf 파일 내용 확인(실행 화면)
resolv.conf에 등록된 결과(의미)
- nameserver: CoreDNS의 IP 주소
- search: DNS에 질의하는 부분으로 도메인 주소 표시
- ndots: 도메인에 포함될 .(점)의 최소 개수(예, www.a.com에서 “.”의 개수)
컨피그맵
컨피그맵(ConfigMap)
- 환경 변수 값을 도커 이미지에 포함시키지 않고 별도로 분리해서 관리하는 방법을 제공
- 기밀이 아닌 데이터를 키-값 쌍으로 저장하는데 사용
- kubectl create configmap <map-name> <data-source> <arguments>
- map-name: 컨피그맵 이름
- data-source: 컨피그맵을 포함하는 파일 또는 디렉터리의 경로
- arguments: 컨피그맵을 생성하는 방법 지정
- 파일로 생성: 파일/디렉터리(--frome-file), 환경 파일(--from-env-file)
- 문자로 생성: 리터럴 값(--from-literal)
리터럴 값(--from-literal) 사용 방법
- kubectl create configmap [컨피그맵 이름] --from-literal=[키]=[값]
kubectl create configmap my-config --from-literal=JAVA_HOME=/usr/java
컨피그맵 JAVA_HOME 환경 변수 정의(실행 화면)
컨피그맵 삭제
kubectl delete configmap my-config
컨피그맵 변수 추가 정의
kubectl create configmap my-config --from-literal=JAVA_HOME=/usr/java --from-literal=URL=http://localhost:8000
컨피그맵 변수 추가 정의(실행 화면)
컨피그맵 활용
nano configmap-test.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: java-app
spec:
replicas: 1
selector:
matchLabels:
app: java-app
template:
metadata:
labels:
app: java-app
spec:
containers:
- name: java-container
image: openjdk:11
command: ["sh", "-c", "while true; do sleep 3600; done"]
env:
- name: JAVA_HOME
valueFrom:
configMapKeyRef:
name: my-config
key: JAVA_HOME
- name: URL
valueFrom:
configMapKeyRef:
name: my-config
key: URL
kubectl apply -f configmap-test.yaml
kubectl get pods
kubectl exec -it [Pod 이름] -- /bin/bash
echo $JAVA_HOME
디플로이먼트, 파드, 리플리카세 데몬셋, 크론잡 등 정리
kubectl delete deployments --all
kubectl delete replicaset --all
kubectl delete daemonset --all
kubectl delete CronJob --all
kubectl delete pods --all
파일/디렉터리(--from-file) 사용 방법
- 직접 환경 변수 값을 지정하는 것이 아닌 환경 변수 정의된 파일 이용
echo Hello, World! >> configmap_test.html
html 파일 이용하여 컨피그맵 생성
kubectl create configmap configmap-file --from-file configmap_test.html
html 파일 이용하여 컨피그맵 생성(실행 화면)
컨피그맵 내용 확인
kubectl describe configmap configmap-file
컨피그맵 내용 확인(실행 화면)
컨피그맵 파일 활용
nano configmap-file-test.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
volumeMounts:
- name: configmap-volume
mountPath: /usr/share/nginx/html
volumes:
- name: configmap-volume
configMap:
name: configmap-file
items:
- key: configmap_test.html
path: index.html
kubectl apply -f configmap-file-test.yaml
kubectl get pods -o wide
curl 10.244.2.67
시크릿
- 비밀번호와 같은 민감한 정보들을 저장하는 용도
- 컨테이너에 저장하지 않고 별도 보관 후 파드 실행 시 시크릿 값 가져와 파드에 제공
시크릿 생성
kubectl create secret generic dbuser --from-literal=username=testuser --from-literal=apssword=1234
시크릿 생성(실행 화면)
시크릿 활용
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
replicas: 1
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: mycontainer
image: myimage
env:
- name: USERNAME
valueFrom:
secretKeyRef:
name: dbuser
key: username
- name: PASSWORD
valueFrom:
secretKeyRef:
name: dbuser
key: password
시크릿 삭제
kubectl delete secret dbuser
볼륨
- 데이터를 저장하는 저장소
- 볼륨은 파드의 구성 요소 매니페스트로 정의
- 독립적인 쿠버네티스 리소스가 아니므로 자체적으로 생성되거나 삭제 될 수 없음
볼륨 분류
- 파드 내 위치: 파드(컨테이너) 내 데이터 저장 시, 파드 종료 시 데이터도 삭제
- 워커 노드 내 위치: 파드가 종료되어도 데이터 유지, 노드 종료시 데이터도 삭제
- 노드 외부 위치: 파드 혹은 노드 종료와 무관하게 데이터 항상 보존
볼륨 유형
- 임시 볼륨: 파드 내 공간 사용, 파드가 삭제(종료)시 데이터 삭제
- 로컬 볼륨: 노드 내 디스크를 저장소로 사용, 노드 종료 시 데이터 삭제
- 외부 볼륨: 노드 외부 저장소를 이용, 파드 및 노드와 무관하게 영구적으로 사용할 수 있음
- 외부 저장소가 따로 있어야 해서 비용 고려
임시 볼륨 | 로컬 볼륨 | 외부 볼륨 |
emptyDir | hostPath | NFS |
cephFS | ||
glusterFS | ||
AWS EBS |
emptyDir(실습) 임시 볼륨 마운트 후 데이터 읽고 쓰기
emptydir yaml 파일 생성 및 실행
#emptydir yaml 파일 생성
nano emptydir.yaml
#emptydir yaml 파일 실행
kubectl apply -f emptydir.yaml
emptydir yaml 파일 내용
apiVersion: v1
kind: Pod
metadata:
name: emptydata # Pod의 이름을 'emptydata'로 지정
spec:
containers:
- name: nginx
image: nginx # Nginx 이미지를 사용하는 컨테이너를 정의
volumeMounts:
- name: shared-storage
mountPath: /data/shared # 'shared-storage' 볼륨을 '/data/shared' 경로에 마운트
volumes:
- name : shared-storage
emptyDir: {} # 'shared-storage' 볼륨을 EmptyDir 타입으로 정의
emptydata 파드에 접속 및 디렉토리 이동
#emptydata 파드에 접속
kubectl exec -it emptydata -- /bin/bash
#/data/shared 디렉토리로 이동
cd /data/shared
emptydata 파드에 접속 및 디렉토리 이동(실행 화면)
text 파일 생성 및 확인
#text 파일 생성
echo "hello" > test.txt
#생성 파일 확인
ls –al
#파일 내용 확인
date,cat test.txt
text 파일 생성 및 확인(실행 화면)
hostPath(실습) 로컬 볼륨 마운트 후 데이터 생성
- hostPath 사용하는 다수 파드끼리 데이터 공유 가능
- 파드 삭제시 hostaPath내 파일은 삭제되지 않고 같은 hostPath 사용하는 다른 파드는 해당 볼륨 접근 가능
hostpath yaml 파일 생성
nano hostpath.yaml
hostpath yaml 파일 내용
apiVersion: v1
kind: Pod
metadata:
name: hostpath # Pod의 이름을 'hostpath'로 지정
spec:
containers:
- name: nginx
image: nginx # Nginx 이미지를 사용하는 컨테이너를 정의
volumeMounts:
- name: localpath
mountPath: /data/shared # 'localpath' 볼륨을 '/data/shared' 경로에 마운트
volumes:
- name: localpath
hostPath:
path: /tmp # 호스트 경로를 '/tmp'로 설정
type: Directory # 호스트 경로의 타입을 디렉토리로 지정
hostpath yaml 파일 실행 및 hostpath 파드 접속
#hostpath yaml 파일 실행
kubectl apply -f hostpath.yaml
#hostpath 파드 접속
kubectl exec -it hostpath -- /bin/bash
#/data/shared 디렉토리 이동
cd /data/shared
hostpath yaml 파일 실행(실행 화면)
hostpath 파드 접속 및 디렉토리 이동(실행 화면)
text 파일 생성 및 생성 파일 확인
#text 파일 생성
echo "hello" > test.txt
#생성 파일 확인
ls –al
text 파일 생성 및 생성 파일 확인(실행 화면)
외부 볼륨
NFS (Network File System)
- NFS는 네트워크를 통해 파일 시스템을 공유하는 방식임.
- 쿠버네티스는 NFS 서버에 볼륨을 마운트하여 사용할 수 있음.
- PersistentVolume과 PersistentVolumeClaim을 사용해 NFS 서버의 경로를 쿠버네티스 클러스터에 연결함.
- 다중 읽기/쓰기 작업이 가능하지만, 성능이 중요한 애플리케이션에는 적합하지 않을 수 있음.
CephFS
- CephFS는 Ceph 스토리지 시스템을 사용하는 분산 파일 시스템임.
- 고가용성과 확장성을 제공함.
- 쿠버네티스 cephfs 볼륨 플러그인을 통해 CephFS 볼륨을 사용할 수 있음.
- 병렬 접근이 가능하여, 고성능을 요구하는 작업에 적합함.
GlusterFS
- GlusterFS는 스케일 아웃 방식의 분산 파일 시스템임.
- 여러 서버에 걸쳐 데이터를 저장하며, 확장성이 뛰어남.
- 쿠버네티스 내에서 glusterfs 볼륨 플러그인을 사용하여 볼륨을 연결할 수 있음.
- 높은 가용성과 확장성을 제공하지만, 구성이 복잡할 수 있음.
AWS EBS (Elastic Block Store):
- AWS EBS는 AWS 클라우드 서비스에서 제공하는 블록 스토리지임.
- 쿠버네티스 클러스터가 AWS에 위치한 경우, EBS 볼륨을 쉽게 연결하여 사용할 수 있음.
- awsElasticBlockStore 볼륨 타입을 사용하여 EBS 볼륨을 쿠버네티스에 연결함.
- 높은 내구성과 성능을 제공하지만, AWS 클라우드에 종속적임.
NFS (Network File System) 실습
NFS 서버 설치(marst)
#NFS 서버 패키지 설치
sudo apt-get update
sudo apt-get install nfs-kernel-server
#NFS 서버 재시작
sudo systemctl restart nfs-kernel-server
NFS 유틸리티 설치(worker0, worker1)
sudo apt-get updat
sudo apt-get install --reinstall nfs-common
공유 디렉토리 생성
sudo mkdir -p /nfs_share
#디렉토리 권한 설정
sudo chown nobody:nogroup /nfs_share
sudo chmod 777 /nfs_share
NFS 공유 설정
sudo nano /etc/exports
# /etc/exports 공유 설정
/nfs_share 192.168.47.0/24(rw,sync,no_root_squash,no_subtree_check)
변경사항 적용
sudo systemctl restart nfs-kernel-server
공유폴더 확인
showmount -e 192.168.47.128
워크노드에서 마운트 테스트
#에러 로그 미출력시 성공
sudo mount -t nfs 192.168.47.128:/nfs_share /mnt
#마운트 해제
sudo umount /mnt
PersistentVolume 설정
cd ~
sudo nano nfs-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-pv
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteMany
nfs:
server: 192.168.47.128
path: "/nfs_share"
kubectl apply -f nfs-pv.yaml
PersistentVolumeClaim 설정
sudo nano nfs-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nfs-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
kubectl apply -f nfs-pvc.yaml
PVC 마운트 pod 생성
nano nfs-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: nfs-pod
spec:
containers:
- name: nfs-container
image: nginx
volumeMounts:
- name: nfs-storage
mountPath: "/usr/share/nginx/html"
volumes:
- name: nfs-storage
persistentVolumeClaim:
claimName: nfs-pvc
#파드생성
kubectl apply -f nfs-pod.yaml
#공유폴더에 파일 생성
echo hello nginx >> /nfs_share/index.html
#파드(컨테이너) 내부 접근
kubectl exec -it nfs-pod -- /bin/bash
#root@nfs-pod:/ 컨테이너
cd /usr/share/nginx/html/
cat index.html
댓글목록0