-
K8S 기본 개념 && 기본 명령어DevOps/K8s 2023. 10. 21. 18:01
기본적인 쿠버네티스 동작 흐름
마스터 컴포넌트
etcd
key-value 타입의 저장소
kube-apiserver
k8s API를 사용하도록 요청을 받고 요청이 유효한지 검사
kube-scheduler
파드를 실행할 노드 선택
kube-controller-manager
파드를 관찰하며 개수를 보장
kubeproxy
각 노드에 존재하며 서비스를 생성 시 iptable룰을 설정하여 nat을 수행한다.
워커 노드 컴포넌트
kubelet
각 노드별로 존재하며 파드의 컨테이너 상태를 추적하고, 오류가 발생하면 정상 상태로 만들기 위한 조치로 컨테이너를 재시작한다. 마스터 노드와는 API Server를 통해서 통신하며 파드가 스케줄된다.
kube-proxy
k8s의 network 동작을 관리, iptables rule을 구성
컨테이너 런타임
컨테이너를 실행하는 엔진, docker, containerd, runc
coreDNS
클러스터내에 파드에서 도메인을 찾고자할때 사용됨
CNI
노드간의 컨테이너들 통신 지원
동작 과정 예시 )
1. 마스터 노드에 kubectl create -f nginx.yaml 이런식으로 명령을 실행
2. 해당 문법과 권한을 판단하고 etcd(워커노드의 상태 정보)를 가져온다.
3. api-server는 scheduler에 etcd 정보를 전달하여 파드를 실행시킬 적절한 노드를 선정하도록 요청
4. scheduler는 etcd 정보를 바탕으로 적합한 노드를 선정 후 해당 노드의 kubelet에 전달하여 파드를 실행해달라 요청
5. kubelet은 컨테이너 런타임에 해당 파드를 띄워 달라고 요청한다.
6. 파드가 생성된 후는 컨트롤러를 통해서 파드의 갯수를 보장받는다.
7. 파드가 죽은 경우
8. 컨트롤러가 api-server에 요청을 보내 다시 새로운 파드가 생성될 수 있도록 요청한다.
etcd에 노드 정보가 저장되는 과정 )
etcd는 각 노드의 kubelet의 (cAdvisor)모니터툴이 내장되어있기때문에 마스터는 이 정보를 etcd에 저장해둔다.
쿠버네티스 기본적인 명령어
1. K8S api 정보 확인
kubectl api-resources
2. api 도움말
kubectl [api command]--help
3. namespace
목적
원하는 파드, 서비스, 디플로이먼트를 구분지어서 관리하기 위함
서비스가 많아지는 경우 원하는 서비스에 해당하는 파드를 구분해서 확인하기 어렵기 때문에 미리 그룹을 구분하여 관리할 수 있다.
네임스페이스 목록 조회
kubectl get namespace
네임스페이스 생성
kubectl create namespace test
네임스페이스 삭제
kubectl delete namespace test
네임스페이스 설정 정보 확인
kubectl config view
네임스페이스 설정 정보 등록
kubectl config set-context test --cluster=kubernetes --user=kubernetes-admin --namespace=test
현재 네임스페이스 확인
kubectl config current-context
네임 스페이스 변경
kubectl config use-context test
4. pod 정보 확인
파드 정보
kubectl describe pod [podName]
파드 로그
kubectl logs pod [podName]
파드안에 컨테이너 복수인경우
kubectl logs [podName] -c [containerName]
파드 레이블 확인
kubectl get pods --show-labels
특정 레이블을 가진 파드 확인
kubectl get pods --selector [labelKey]=[labelValue]5. pod 생성, 수정, 삭제
파드 CLI로 생성
kubectl run redis --image=redis
파드 yaml로 생성
kubectl create -f [FileName.yaml]
파드 yaml 파일로 만들기
kubectl run redis --image=reds --dry-run -o yaml > redis.yaml
파드 정보 수정
kubectl edit pod [podName]
동작 중인 파드 정보 확인
1. kubectl get pods
2. kubectl get pods
3. kubectl describe pod [podName]
4. kubectl get pods --all-namespace
파드 삭제
1. kubectl delete pod [podName]
2. kubectl delete pod --all
6. 파드가 정상실행 검사
(livenessProbe, readinessProbe, startupProbe)
목적
파드의 상태, 준비 여부를 체크하여 원하는 상태에서 동작하도록 조절 한다.
특정 시간, 반복횟수, 실행 명령어, 성공 횟수 등을 설정하여 파드 상태 체크
7. init container (동작 전 실행할 컨테이너)
initContainer를 먼저 실행후 메인 컨테이너를 실행하도록 설정한다.
https://kubernetes.io/docs/concepts/workloads/pods/init-containers/
8. 파드 리소스 설정
CPU 단위 : 1core = 1000m 0.5core = 500m
Memory 단위 : 100Mi = 100메가 1Gi = 1기가 바이트
https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/
9. Controller
노드에 원하는 컨테이너를 배정하는것이 주 역할이다.
파드의 라벨을 통해서 구분하여 replicas수만큼 배포하며 없는경우 template를 보고 추가적으로 파드를 생성한다.
selector
key value 형태 (파드의 라벨 셀렉터를 보고 설정된 배포 수만큼 파드 수를 조절)
replicas
배포수
template
컨테이너 템플릿
컨트롤러의 종류(Kind)는 7개 존재하며 각 컨트롤러의 특징이 있다.
1. replicationController
기본 Basic 컨트롤러 요구하는 파드의 수 보장
2. replicationSet
다양한 셀렉터 방식 지원
matchExpressions : in, notIn, exist, DoesNotExist 를 통해서 셀렉터를 지원
예시 )
matchLabels -> matchExpressions: {key: '', operator: In, value: [value]}
3. Deployment
replicationSet와 유사하지만 RollingUpdate, RollBack 지원
3.1 RollingUpdate
kubectl set image deployment [deployName] [containerName]=[newVersionImage] --record
--record 옵션을 줘서 리비전을 기록하면 추후 변경지점을 확인하고 버전 롤백이 가능하다.
revisionHistoryLimit로 리비전 기록수 조절
3.2 RollingBack
kubectl rollout history deployment [deployment]
kubectl rollout undo deployment [deployment]
4. DaemonSet
노드당 하나씩 파드가 동작하도록 보장하는 컨트롤러이다.
예시 ) log-agent, monitoring등이 사용됨
5. StatefulSet
파드증가시 이름과 파드 저장소를 유지시켜주는 컨트롤러다. 파드명에 0부터 순차적으로 뒤에 번호가 붙음.
6. JobController
Pod를 running 중인 상태로 유지
Batch 처리하는 Pod는 작업이 완료되면 종료됨
Batch 처리에 적합하는 컨트롤러로 Pod의 성공적인 완료를 보장
- 비정상 종료 시 다시 실행
- 정상 종료 시 완료
7. CronJobController
JobController기능을 포함하며 일정 시간에 JobController가 동작하도록 실행하는 컨트롤러
예시 ) 백업 작업, 로그 정보 수집, 메일 전송 등..
컨트롤러 삭제시 셀렉터에 해당되는 파드 삭제하지않기
kubectl delete rs [name] --cascade=false
주의
컨트롤러는 셀렉터만 보기때문에 deployment를 edit해서 템플릿 정보를 바꿔도 이미 충분한 양의 레플리카수가 배정되어있다면 바로 수정되지 않는다. 즉 이미 배포 되어있는 파드의 스펙은 보지않고 셀렉터만 보고 배포 여부를 결정한다.
변경된 템플릿 정보를 반영하기 위해서는 파드를 죽이는 RollingUpdate를 통해서 적용이 가능하다.
10. 서비스
목적
여러 파드 그룹을 라벨로 구분지어 단일 진입점 제공
가상아이피를 etcd에 등록하고 lb형태로 각 파드에 요청할 수 있도록 설정한다.
파드가 새로 생성되면 새로운 아이피를 할당 받기때문에 매번 새로운 아이피를 맵핑하기 힘들기때문에 셀렉터로 특정 라벨 파드를 맵핑하여 진입점을 설정한다.
4가지 Type 지원
1. ClusterIP(default)
Pod 그룹의 단일 진입점 생성 (Virtual IP)
https://kubernetes.io/ko/docs/concepts/services-networking/service/
apiVersion: v1 kind: Service metadata: name: my-service spec: selector: app: MyApp ports: - protocol: TCP port: 80 targetPort: 9376
2. NodePort
ClusterIP가 생성된 후
모든 Woker Node에 외부에서 접속가능한 포트 설정한다.
워커 노드 특정 포트 접속시 로드 밸런스 되어 워커노드들 중 하나로 접속
https://kubernetes.io/ko/docs/concepts/services-networking/service/#type-nodeport
apiVersion: v1 kind: Service metadata: name: my-service spec: type: NodePort selector: app: MyApp ports: # 기본적으로 그리고 편의상 `targetPort` 는 `port` 필드와 동일한 값으로 설정된다. - port: 80 targetPort: 80 # 선택적 필드 # 기본적으로 그리고 편의상 쿠버네티스 컨트롤 플레인은 포트 범위에서 할당한다(기본값: 30000-32767) nodePort: 30007
3. LoadBalancer
클라우드 인프라스트럭처나 오픈스택 클라우드에 적용
LoadBalancer를 자동으로 프로비전하는 기능 지원
4. ExternalName
클러스터 안에서 외부에 접속 시 사용할 도메인 등록하여 사용
클러스터 도메인이 실제 외부 도메인으로 치환되어 동작
clusterIP는 배정되지않는다. CNAME과 같이 동작한다.
https://kubernetes.io/ko/docs/concepts/services-networking/service/#loadbalancer
apiVersion: v1 kind: Service metadata: name: my-service spec: selector: app: MyApp ports: - protocol: TCP port: 80 targetPort: 9376 clusterIP: 10.0.171.239 type: LoadBalancer status: loadBalancer: ingress: - ip: 192.0.2.127
Headless Service
ClusterIP 없는 서비스로 단일 진입점이 필요 없을때 사용
Service와 연결된 Pod의 endpoint로 DNS레코드가 생성된다.
K8S Ingress
HTTP나 HTTPS를 통해서 클러스터 내부의서비스를 외부로 노출 기능
service에 외부 URL을 제공
트래픽을 로드밸런싱
SSL 인증서 처리
Virtual Hosting을 지정
https://kubernetes.io/ko/docs/concepts/services-networking/ingress/
인그레스 컨트롤러 종류
https://kubernetes.io/ko/docs/concepts/services-networking/ingress-controllers
'DevOps > K8s' 카테고리의 다른 글
[쿠버네티스] CLI 플러그인들 (0) 2023.10.29 [쿠버네티스] 로컬에서 클러스터 관리 (0) 2023.10.29 K8S HA(멀티 마스터 노드) 구성하기 (0) 2023.10.16 K3S로 프로젝트 구성하기 - 7 (0) 2023.06.20