- pod : 컨테이너들을 포함
- replicaset : 일정 개수의 pod 유지
- deployment : 각 worker node로의 업데이트와 배포
$ kubectl apply -f {.yaml file 절대 경로}
- pod, replicaset, deployment가 없으면 생성후 컨테이너를 실행
- pod, replicaset, deployment가이미 존재하면 변경된 .yaml파일을 적용
# 각 pod, replicaset, deployment 삭제 시
# pod = po
# replica set = rs
# deployemnt
$ kubectl delete po {pod_name} -n {namespaces_name}
$ kubectl delete rs {replicaset_name} -n {namespaces_name}
$ kubectl delete deployment {deployment_name} -n {namespaces_name}
$ kubectl get pods {pod_name} -n {namespaces_name}
$ kubectl get replicaset {replicaset_name} -n {namespaces_name}
$ kubectl get deployment {deployment_name} -n {namespaces_name}
$ kubectl describe pods {pod_name}
$ kubectl describe replicaset {replicaset_name}
$ kubectl describe deployment {deployment_name}
-
쿠버네티스에서 리소스를 구분하고 격리하는 가상적인 공간입니다. 이를 통해 동일한 클러스터 내에서 작업 시 각각의 리소스를 분리하여 사용하고, 리소스 간 충돌을 방지하며, 리소스에 대한 접근 권한을 제어하고, 리소스 사용량을 제한할 수 있습니다.
-
쿠버네티스 클러스터 내에서 모든 리소스에 대한 접근 권한을 가지는 default 네임스페이스가 존재합니다. 이 외에도 사용자가 직접 생성할 수 있는 다른 네임스페이스를 사용할 수 있습니다.
-
Namespace를 사용하면, 동일한 이름의 리소스를 다른 네임스페이스에서 사용할 수 있습니다. 예를 들어, default 네임스페이스에서 my-pod라는 이름의 Pod를 생성하고, test 네임스페이스에서도 my-pod라는 이름의 Pod를 생성할 수 있습니다.
-
리소스 간의 이름 충돌을 방지할 수 있습니다. 예를 들어, default 네임스페이스에서 my-pod라는 이름의 Pod를 생성하고, test 네임스페이스에서도 my-pod라는 이름의 Pod를 생성하더라도, 각각의 네임스페이스에서는 이름 충돌이 발생하지 않습니다.
-
사용하면, 리소스에 대한 접근 권한을 제어할 수 있습니다. 예를 들어, default 네임스페이스에서 생성한 리소스에 대해서는 모든 사용자가 접근할 수 있지만, test 네임스페이스에서 생성한 리소스에 대해서는 특정 사용자만 접근할 수 있도록 설정할 수 있습니다.
-
사용하면, 리소스 사용량을 제한할 수 있습니다. 예를 들어, default 네임스페이스에서 사용할 수 있는 CPU, 메모리 등의 자원을 제한하거나, test 네임스페이스에서 사용할 수 있는 CPU, 메모리 등의 자원을 늘릴 수 있습니다.
# namespamces를 생성하는 방법
$ kubectl create namespace {namespace}
# namespaces를 삭제하는 방법
$ kubectl delete namespace {namespace}
# namespaces를 변경 불가
#--- apiVersion : Kubernetes API 버전 지정
apiVersion: apps/v1
#--- deployment
#- kind : 오브젝트의 종류 지정
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: ivs
name: ivs
#--- replica set
spec:
#- replicas : Deployment에서 생성할 Pod의 개수 지정
replicas: 3
#- selector : Pod를 선택하기 위한 라벨 셀렉터 지정
selector:
matchLabels:
app: ivs
strategy: {}
#--- pod
template:
metadata:
creationTimestamp: null
labels:
app: ivs
spec:
containers:
- image: 192.168.0.104:5000/ivs_ap_test
imagePullPolicy: Never
name: ivs
command: ["/bin/bash"]
args: ["-c", "tail -f /dev/null"]
volumeMounts:
- name: etc
mountPath: /etc
- name: mnt
mountPath: /mnt
- name: var
mountPath: /var
- name: usr
mountPath: /usr
- name: lib64
mountPath: /lib64
- name: bin
mountPath: /bin
resources:
limits:
memory: 2G
restartPolicy: Always
hostNetwork: true
hostIPC: true
hostPID: true
dnsPolicy: ClusterFirstWithHostNet
volumes:
- name: etc
hostPath:
path: /etc
- name: mnt
hostPath:
path: /mnt
- name: var
hostPath:
path: /var
- name: usr
hostPath:
path: /usr
- name: lib64
hostPath:
path: /lib64
- name: bin
hostPath:
path: /bin
apiVersion |
Kubernetes API 버전 지정 |
kind |
오브젝트의 종류 지정 |
replicas |
Deployment에서 생성할 Pod의 개수 지정 |
selector |
Pod를 선택하기 위한 라벨 셀렉터 지정 |
matchLabels |
Pod를 선택하기 위한 라벨을 지정 |
strategy |
Deployment의 업데이트 전략을 지정 |
template |
Pod의 템플릿을 지정 |
metadata |
Pod의 메타데이터를 지정 |
labels |
Pod에 대한 라벨을 지정 |
spec |
Pod의 스펙을 지정 |
containers |
Pod 안에서 실행할 컨테이너를 지정 |
image |
컨테이너에서 사용할 이미지를 지정 |
imagePullPolicy |
이미지를 가져올 때 사용할 정책을 지정 |
name |
컨테이너의 이름을 지정 |
resources |
컨테이너에서 사용할 자원을 지정 |
restartPolicy |
컨테이너의 재시작 정책을 지정 |
hostNetwork |
컨테이너에서 호스트의 네트워크를 사용할지 여부 지정 |
hostIPC |
컨테이너에서 호스트의 IPC(Inter-Process Communication)를 사용할지 여부를 지정 |
hostPID |
컨테이너에서 호스트의 PID(Process ID)를 사용할지 여부 지정 |
dnsPolicy |
컨테이너에서 사용할 DNS 정책을 지정 |
volumes |
컨테이너에서 사용할 볼륨 지정 |
hostPath |
호스트의 경로를 지정 |
$ docker images {images_name_1}
$ kubectl create deployment {deployment_name_1} --image={image_name_1}
$ kubectl get pod -w
-o yaml
: 사용자가 관리하기 쉽게 yaml형태로 추출--dry-run=client
: 해당 내용을 실제로 적용하지 않고 명령 수행
$ kubectl create deployment {deployment_name_2} --dry-run=client -o yaml --image={images_name_1} > {images_name_2}.yaml
imagePullPolicy: Never
- 외부에서 이미지를 가져오지 않고 호스트에 존재하는 이미지를 사용
$ vi {image_name_2}.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: test2
name: test2
spec:
replicas: 1
selector:
matchLabels:
app: test2
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: test2
spec:
containers:
- image: xpm:1.6.1
imagePullPolicy: Never # 추가
name: xpm
resources: {}
status: {}
이렇게 수정한 yaml파일을 적용해도 ErrImagePull/ImagePullBackOff 발생
$ kubectl delete deployment {deployment_name_1}
$ kubectl delete deployment {deployment_name_2}
- Worker node에서 Master node에 존재했던 같은 이미지 생성
- Master Node로 돌아와 {image name 2}.yaml를 {image name 3}.yaml로 변경 및 복사
- replicase를 1에서 원하는 개수로 수정
- 이름도 변경
$ sed -i 's/replicas: 1/replicas: 3/' xpm.yaml
$ sed -i 's/{image_name_2}/{image_name_3}/' xpm.yaml
- Worker Node에서 같은 이미지 빌드 확인
- {image name 3}.yaml 적용
$ kubectl create deployment ivs --dry-run=client -o yaml \
--image=192.168.0.104:5000/ivs_ap --replicas=3 --node-name=dev6-2 > ivs_ap.yaml