간단한 debugging
- kubectl get nodes
- kubectl describe node
- kubectl get pods
- kubectl describe pod
-
kubectl get events –namespace=my-namespace
- container state : Waiting, Running or Terminated
Auditing
감사 기록은 kube-apiserver component 안에서 생명주기를 갖는다. 각 단계의 request 실행은 audit event를 생성하고 특정 정책에 따라 미리 실행되고 backend에 기록된다. backend 구현은 log 파일들과 webhooks이 포함된다.
- RequestReceived : audit handler가 request를 받으면 event가 생성된다. handler chain 아래로 위임되기 전에.
- ResponseStarted : response header가 보내진다.(response body가 보내지기전) long-running request가 생성되는 단계
- ResponseComplete : reponse body가 다 보내진 단계
- Panic : panic이 발생하면 이벤트 생성
Audit policy event가 기록될지 어떤 데이터가 포함되어야하는지 정하는 룰.
- None - events를 로깅하지 않는다.
- Metadata - request metadata(requesting user, timestamp, resource, verb, etc) 로깅, request 또는 response body 미포함
- Request - event metadata 그리고 request body는 로깅 하지만 response body는 미포함
-
RequestResponse - event metadata, request and response bodies 로깅
- kube-apiverser로 –audit-policy-file을 사용하면 file을 보낼 수 있다.
apiVersion: audit.k8s.io/v1 # This is required.
kind: Policy
# Don't generate audit events for all requests in RequestReceived stage.
omitStages:
- "RequestReceived"
rules:
# Log pod changes at RequestResponse level
- level: RequestResponse
resources:
- group: ""
# Resource "pods" doesn't match requests to any subresource of pods,
# which is consistent with the RBAC policy.
resources: ["pods"]
# Log "pods/log", "pods/status" at Metadata level
- level: Metadata
resources:
- group: ""
resources: ["pods/log", "pods/status"]
# Don't log requests to a configmap called "controller-leader"
- level: None
resources:
- group: ""
resources: ["configmaps"]
resourceNames: ["controller-leader"]
# Don't log watch requests by the "system:kube-proxy" on endpoints or services
- level: None
users: ["system:kube-proxy"]
verbs: ["watch"]
resources:
- group: "" # core API group
resources: ["endpoints", "services"]
# Don't log authenticated requests to certain non-resource URL paths.
- level: None
userGroups: ["system:authenticated"]
nonResourceURLs:
- "/api*" # Wildcard matching.
- "/version"
# Log the request body of configmap changes in kube-system.
- level: Request
resources:
- group: "" # core API group
resources: ["configmaps"]
# This rule only applies to resources in the "kube-system" namespace.
# The empty string "" can be used to select non-namespaced resources.
namespaces: ["kube-system"]
# Log configmap and secret changes in all other namespaces at the Metadata level.
- level: Metadata
resources:
- group: "" # core API group
resources: ["secrets", "configmaps"]
# Log all other resources in core and extensions at the Request level.
- level: Request
resources:
- group: "" # core API group
- group: "extensions" # Version of group should NOT be included.
# A catch-all rule to log all other requests at the Metadata level.
- level: Metadata
# Long-running requests like watches that fall under this rule will not
# generate an audit event in RequestReceived.
omitStages:
- "RequestReceived"
Log backend kube-apiserver 옵션
- –audit-log-path : log 파일 위치
- –audit-log-maxage : 오래된 log 파일 유지 날짜
- –audit-log-maxbackup : log 파일 최대 유지 갯수
- –audit-log-maxsize : log 파일 최대 megabytes
...
volumeMounts:
- mountPath: /etc/kubernetes/audit-policy.yaml
name: audit
readOnly: true
- mountPath: /var/log/audit.log
name: audit-log
readOnly: false
...
- name: audit
hostPath:
path: /etc/kubernetes/audit-policy.yaml
type: File
- name: audit-log
hostPath:
path: /var/log/audit.log
type: FileOrCreate
Webhook backend
- –audit-webhook-config-file : webhook configuration file path 지정.
- –audit-webhhok-initial-backoff : 첫번째 실패 후 retrying하기까지 시간
Debug a StatefulSet
app=myapp이라는 라벨의 StatefulSet 조회
kubectl get pods -l app=myapp
Debug Init Containers
kubectl get pod nginx --template '{{.status.initContainerStatuses}}'
Pod status
- Init:N/M : M개 중 N개 완료
- Init:Error : Init Container 실패
- Init:CrashLoopBackOff : Init Container 계속 실패
- Pending : Pod가 Init Containers를 아직 시작 안했음
- PodInitializing OR Running : Pod가 이미 Init Containers 실행을 완료
Debug Pods and ReplicationControllers
불충분한 resource
- cluster에 node 추가
- 불필요한 pod 삭제
- pod가 node보다 큰지 확인
node 수용량 확인 kubectl get nodes -o yaml | egrep ‘\sname:|cpu:|memory:’ kubectl get nodes -o json | jq ‘.items[] | {name: .metadata.name, cap: .status.capacity}’
pod가 waiting일때
- image 이름이 맞는지 확인
- repository에 image를 넣었는지 확인
- docker pull
로 machine에 image가 받아지는지 확인
Debugging ReplicationCotrollers
kubectl describe rc ${CONTROLLER_NAME}
Debug Running Pods
pod logs 조사
kubectl logs ${POD_NAME} ${CONTAINER_NAME} kubectl logs –previous ${POD_NAME} ${CONTAINER_NAME} //이전 container
container exec로 debugging linux 또는 window OS image base면 kubectl exec 사용
kubectl exec ${POD_NAME} -c ${CONTAINER_NAME} – ${CMD} ${ARG1} ${ARG2} … ${ARGN}
kubectl exec cassandra – cat /var/log/cassandra/system.log
임시 debug container로 debugging
버전 1.18부터 제공. container가 충돌했거나 debugging utilities를 제공하지 않을때 사용
kubectl run ephemeral-demo –image=k8s.gcr.io/pause:3.1 –restart=Never // 먼저 pod 생성
kubectl debug -it ephemeral-demo –image=busybox –target=ephemeral-demo // 임시 컨테이너
Debgging using a copy of the Pod
새로운 container 생성 시 pod 복제
kubectl run myapp –image=busybox –restart=Never – sleep 1d // debugging utilities가 없는 상태
kubectl debug myapp -it –image=ubuntu –share-processes –copy-to=myapp-debug
- –container flag를 쓰지 않으면 container명 자동 생성
- -i 를 쓰면 kubectl이 새로운 container에 default로 붙음. –attach=false를 사용해야함. kubectl attach를 통해 disconnected 재연결
- –share-processes는 다른 컨테이너의 프로세스를 볼 수 있음
kubectl delete pod myapp myapp-debug // debug 후 삭제
command 변경 시 pod 복사
kubectl run –image=busybox myapp – false //crashing application 연출
kubectl debug myapp -it –copy-to=myapp-debug –container=myapp – sh //command로 debug copy 생성
container 이미지 변경하는 동안 pod 복제
kubectl run myapp –image=busybox –restart=Never – sleep 1d
kubectl debug myapp –copy-to=myapp-debug –set-image=*=ubuntu // 모든 container를 ubuntu로 변경
Debugging via a shell on the node
kubectl debug node/mynode -it –image=ubuntu
debugging session을 node에 만들때 주의사항
- Node 이름으로 자동으로 새로운 Pod 이름 생성
- container가 host IPC, Network and PID namespaces에서 실행
- Node의 root filesystem이 /host에 mount
출처
https://kubernetes.io/docs/tasks/debug-application-cluster/debug-application-introspection/ https://kubernetes.io/docs/tasks/debug-application-cluster/audit/ https://kubernetes.io/docs/tasks/debug-application-cluster/debug-stateful-set/ https://kubernetes.io/docs/tasks/debug-application-cluster/debug-init-containers/ https://kubernetes.io/docs/tasks/debug-application-cluster/debug-pod-replication-controller/ https://kubernetes.io/docs/tasks/debug-application-cluster/debug-running-pod/