Cloud Solution Architect/쿠버네티스

Kubernetes5

YunHyeong 2023. 6. 7. 17:37

# 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