리소스 관리
쿠버네티스는 파일구성과 레이블을 통해 에플리케이션을 배포하고 관리한다.
설정/구성
master node = docker1
local node = docker2
alias k='kubectl'
LABELS
동일한 네임스페이스 내에서 리소스를 구별하기 위해 레이블을 사용한다.
리소스가 많을 경우, -l 또는 --selector 를 사용하여 지정된 셀렉터(레이블 쿼리)를 지정하여
레이블별로 리소스를 필터링하는 것이 더 쉽다.
nginx로 실행한 컨테이너의 정보를 yaml 파일로 저장
k run webserver --image=nginx:1.14 --port=80 --dry-run -o yaml > webserver.yaml
metadata 레이블과 이름을 webserver1로 수정
vi webserver.yaml
yaml파일로 컨테이너 실행
k create -f webserver.yaml
lable 확인
k get pods --show-labels
레이블로 pods 검색
k get pods -l run=webserver
in 이라는 논리 연산자를 통해 OR 연산을 사용할수있다
k get pods -l 'run in (webserver,web-apaches)'
레이블 삭제
k label pods webserver run-
레이블로 지정해서 명령 수행 가능(삭제)
k delete pods -l run=webserver1
k apply -f webserver.yaml
컨테이너 환경 확인
Path, port, ip,service 정보를 확인하려면 해당 컨테이너에 접속해서 환경정보를 조회해보면 된다.
k exec webserver -- env
리소스 구성
많은 애플리케이션들은 디플로이먼트 및 서비스와 같은 여러 리소스를 필요로 한다.
여러 리소스의 관리는 동일한 파일에 그룹화하여 단순화할 수 있다. (YAML에서 --- 로 구분)
https://kubernetes.io/ko/docs/concepts/cluster-administration/manage-deployment/
예를 들어 아래와 같은 YAML 파일이 있다면 --- 를 기준으로 윗쪽은 nginx service 이고
아랫쪽은 deployment nginx 3 레플리카에 대한 생성 내용이다.
이 파일로 컨테이너를 실행해보자.
apiVersion: v1
kind: Service
metadata:
name: my-nginx-svc
labels:
app: nginx
spec:
type: LoadBalancer
ports:
- port: 80
selector:
app: nginx
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
다음 주소가 해당 yaml파일 다운주소이므로 바로 이렇게 적용해본다.
kubectl apply -f https://k8s.io/examples/application/nginx-app.yaml
--- 기준 윗쪽에 있는 service가 먼저 생성되고 그 다음 --- 아랫쪽의 deployment가 생성된다.
k get services
k get pods
이렇게 리소스는 파일에 표시된 순서대로 생성된다.
따라서, 스케줄러가 디플로이먼트와 같은 컨트롤러에서 생성한 서비스와 관련된 파드를 분산시킬 수 있으므로,
서비스를 먼저 지정하는 것이 가장 좋다.
참고
create VS apply
run으로 실행하는 방법은 그냥 단일 pod 하나만 생성하는 방법이다.
create는 deployment를 실행할 때나, yaml 등의 파일로 실행할 때, 디렉터리를 지정하여 실행할 때 쓴다.
https://may9noy.tistory.com/302
create 명령어는 yaml 파일안에 모든 것을 기술해야 하는 반면
apply 명령어는 부분적인 spec만 주어져도 업데이트가 잘 진행 된다
디렉터리 지정
위와 같이 개별 파일을 지정하는 대신 디렉터리를 지정할 수 있다.
kubectl 은 접미사가 .yaml, .yml 또는 .json 인 파일을 읽는다.
그래서 동일한 마이크로서비스 또는 애플리케이션 티어(tier)와 관련된 리소스를 동일한 파일에 배치하고,
애플리케이션과 연관된 모든 파일을 동일한 디렉터리에 그룹화하는 것이 좋다.
애플리케이션의 티어가 DNS를 사용하여 서로 바인딩되면, 스택의 모든 컴포넌트를 함께 배포할 수 있다.
URL을 구성 소스로 지정할 수도 있다. 이는 GitHub에 체크인된 구성 파일에서 직접 배포하는 데 편리하다.
webs 디렉토리 안에
webserver.yaml 과
webserver1.yaml을 넣어놓고 서로 레이블과 네임을 다르게 작성한다.
yaml파일끼리 다른 부분 대조
diff webserver.yaml webserver1.yaml
다음과 같이 디렉토리를 지정하더라도 자동으로 그 하위의 yaml파일들을 인식해 실행할 수 있다.
k create -f ./webs/
-f 옵션으로 다중 사용도 가능하다.
kubectl apply -f https://k8s.io/examples/application/nginx/nginx-svc.yaml -f https://k8s.io/examples/application/nginx/nginx-deployment.yaml
yaml 파일 구성 - 다중컨테이너
다음과 같이 'webserver1'과 'webserver2' 컨테이너가 실행되는 'webserver' pod 구성파일을 만들어보자.
vi web.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
app: webserver
name: webserver
spec:
containers:
- image: nginx:1.14
name: webserver1
ports:
- containerPort: 80
- image: nginx:1.14
name: webserver2
ports:
- containerPort: 80
command:
- sleep
- "10000"
k apply -f web.yaml
한 pod 안에 컨테이너가 여러 개인 경우, 1개의 아이피를 공유한다
어떤 pod에 접속할 때 특정 컨테이너를 지정 -c 해서 접속할 수 있다.
k exec webserver -it -c webserver1 -- /bin/bash
cat /etc/hosts아래와 같이 webserver1 컨테이너는 10.44.0.1 을 webserver pod로부터 받아 쓰고있다.
webserver2 컨테이너도 마찬가지다.
k exec webserver -it -c webserver2 -- /bin/bash
pods의 정보를 자세히 보면 포함된 컨테이너들을 확인할 수 있다
k describe pods webserver | more -10
k get pods webserver -o custom-columns=CONTAINER:.spec.containers[0].name,IMAGE:.spec.containers[0].image
응용 - 삭제 방법
1. 레이블로 리소스를 필터링해서 만들었던 포드와 서비스를 삭제해보자.
kubectl delete deployment,services -l app=nginx
2. 또는 리소스/이름 구문을 사용하여 커맨드 라인에서 둘다 모두 지정할 수도 있다.
kubectl delete deployments/my-nginx services/my-nginx-svc
3. 또는 구성 파일을 다시 지정해서 리소스의 이름들을 추출해 전부 삭제하는 방법이 있다.
(yaml 실행 후 해당 yaml로 인해 생성된 모든것 undo 실행취소 삭제)
kubectl delete -f https://k8s.io/examples/application/nginx-app.yaml
참고로 포드 전부 삭제
k delete pods --all
'Kubernetes' 카테고리의 다른 글
kubectl config 명령어 (클러스터 context 변경) (0) | 2022.12.27 |
---|---|
Namespace (0) | 2022.12.26 |
Kubernetes 기본 명령어 (0) | 2022.12.21 |
Kubernetes image pull error (0) | 2022.12.20 |
Kubernetes 개념 /설치 /조인 (0) | 2022.12.19 |