# Prometheus(모니터링 도구)
## Prometheus 아키텍처
## Grafana : 시각화 도구
## 노드의 설치 항목
- kube-state-metrics
- Node-exporter
- Pull Metrics
@@ 파드 스케줄(자동 배치)
# vi pod-schedule.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-schedule-metadata
labels:
app: pod-schedule-labels
spec:
containers:
- name: pod-schedule-containers
image: 192.168.1.148:5000/nginx:latest
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: pod-schedule-service
spec:
type: NodePort
selector:
app: pod-schedule-labels
ports:
- protocol: TCP
port: 80
targetPort: 80
- pod-schedule2.yaml을 생성해서 다시 생성하면 worker1과 worker2에 pod가 생성된다.
@@ 파드 스케줄(수동 배치)
# vi pod-nodename.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-nodename-metadata
labels:
app: pod-nodename-labels
spec:
containers:
- name: pod-nodename-containers
image: 192.168.1.148:5000/nginx:latest
ports:
- containerPort: 80
nodeName: worker2
---
apiVersion: v1
kind: Service
metadata:
name: pod-nodename-service
spec:
type: NodePort
selector:
app: pod-nodename-labels
ports:
- protocol: TCP
port: 80
targetPort: 80
- kubectl get po --show-labels : label 검색
- kubectl get po --selector=app=pod-nodename-labels -o wide --show-labels : seleteor를 활용한 label 검색
@@ 노드 셀렉터(수동 배치)
# kubectl label nodes worker1 tier=dev # worker1의 노드에 label을 부여
# kubectl get nodes --show-labels
- 수동으로 노드에 label 부여
# vi pod-nodeselector.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-nodeselector-metadata
labels:
app: pod-nodeselector-labels
spec:
containers:
- name: pod-nodeselector-containers
image: 192.168.1.148:5000/nginx:latest
ports:
- containerPort: 80
nodeSelector:
tier: dev # selector 설정
---
apiVersion: v1
kind: Service
metadata:
name: pod-nodeselector-service
spec:
type: NodePort
selector:
app: pod-nodeselector-labels
ports:
- protocol: TCP
port: 80
targetPort: 80
- yaml파일로 node 설렉터를 가진채로 pod와 서비스 생성
# kubectl label nodes worker1 tier- # label 지우는 명령어
# kubectl get nodes --show-labels
@@ taint와 toleration
# kubectl taint node worker1 tier=dev:NoSchedule
# kubectl describe nodes worker1
# vi pod-taint.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-taint-metadata
labels:
app: pod-taint-labels
spec:
containers:
- name: pod-taint-containers
image: nginx
ports:
- containerPort: 80
tolerations:
- key: "tier"
operator: "Equal"
value: "dev"
effect: "NoSchedule"
---
apiVersion: v1
kind: Service
metadata:
name: pod-taint-service
spec:
type: NodePort
selector:
app: pod-taint-labels
ports:
- protocol: TCP
port: 80
targetPort: 80
- kubectl taint node worker1 tier=dev:NoSchedule- : taint 지우는 명령어
# Prometheus, Grafana, Autoscaling
## metric server
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.6.1/components.yaml
- metric server 설치
kubectl edit deployments.apps -n kube-system metrics-server
--kubelet-insecure-tls
- metrics-server 실행을 위한 파일 수정
- kubectl top node 명령어 실행
## 프로메테우스 설치
kubectl create ns monitoring
git clone https://github.com/hali-linux/my-prometheus-grafana.git
cd my-prometheus-grafana
git clone https://github.com/hali-linux/my-prometheus-grafana.git
cd my-prometheus-grafana
kubectl apply -f prometheus-cluster-role.yaml
kubectl apply -f prometheus-config-map.yaml
kubectl apply -f prometheus-deployment.yaml
kubectl apply -f prometheus-node-exporter.yaml
kubectl apply -f prometheus-svc.yaml
kubectl get pod -n monitoring
kubectl get pod -n monitoring -o wide
kubectl apply -f kube-state-cluster-role.yaml
kubectl apply -f kube-state-deployment.yaml
kubectl apply -f kube-state-svcaccount.yaml
kubectl apply -f kube-state-svc.yaml
kubectl get pod -n kube-system
- image 오류시 오류가 나지 않은 worker에서 image push해서 사용하기
## 그라파나 설치
kubectl apply -f grafana.yaml
kubectl get pod -n monitoring
- grafana.yaml 파일 안에서 이미지를 확인
- 해당 포트로 접근
https://grafana.com/grafana/dashboards/
Dashboards | Grafana Labs
grafana.com
## test
- yes > /dev/null & : matster1의 cpu 사용률 늘리기
- CPU 사용률 증가 확인
# cordon, uncordon
* 커든 명령은 지정된 노드에 추가로 파드를 스케줄하지 않는다.
- 커든을 수행한 worker1에는 파드가 만들어 지지 않는다.
- ScheduledDisabeld : 자동 금지
- 수동으로 worker1 node에 pod 생성은 가능하다.
# drain, uncordon
* 드레인 명령은 지정된 노드에 모든 파드를 다른 노드로 이동시킨다.
- worker2 드레인 후 worker2에 pod가 생성이 안된다.
- kubectl drain worker2 --ignore-daemonsets --force --delete-local-data : drain 명령어
- kubectl uncordon worker2 : drain 해제
# 오토스케일링 실습(HPA: Horizontal Pod Autoscaler)
# vi php-apache.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: php-apache
spec:
selector:
matchLabels:
run: php-apache
replicas: 2 # Desired capacity, 시작 갯수
template:
metadata:
labels:
run: php-apache
spec:
containers:
- name: php-apache
image: k8s.gcr.io/hpa-example
ports:
- containerPort: 80
resources:
limits:
cpu: 500m
requests:
cpu: 200m
---
apiVersion: v1
kind: Service
metadata:
name: php-apache
labels:
run: php-apache
spec:
ports:
- port: 80
selector:
run: php-apache
# vi hpa.yaml
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: php-apache
spec:
maxReplicas: 4
minReplicas: 2
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: php-apache
targetCPUUtilizationPercentage: 50
status:
currentCPUUtilizationPercentage: 0
currentReplicas: 2
desiredReplicas: 2
# kubectl apply -f hpa.yaml
- node의 cpu 사용량이 50을 넘으면 scaleOut
docker pull busybox:1.28 # 이미지 가져오기
kubectl run -i --tty load-generator --rm --image=192.168.1.148:5000/busybox:1.28 --restart=Never -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://php-apache; done"
# 부하를 주는 명령어
watch kubectl get pod -o wide # scaling된 pod 상태 보기
kubectl get hpa # scale 상태 보기
'Cloud Solution Architect > 쿠버네티스' 카테고리의 다른 글
Kubernetes6 (0) | 2023.06.09 |
---|---|
Kubernetest4 (0) | 2023.06.05 |
Kubernetes3 (0) | 2023.06.01 |
Kubernetes2 (0) | 2023.05.31 |
Kubernetes1 (0) | 2023.05.30 |