오브젝트를 통해 리소스를 생성
https://kubernetes.io/ko/docs/reference/using-api/#api-%EA%B7%B8%EB%A3%B9
kubectl api-versions
그룹이 없는 api는 core 그룹
Alpha -> Beta -> Stable
API 그룹의 버전에 관련된 내용
https://kubernetes.io/ko/docs/reference/using-api/#api-%EA%B7%B8%EB%A3%B9
명세 : 어떻게 정의할 것인지, 오브젝트의 상태는 어떤지(우리가 지정)
상태 : 쿠버네티스가 리소스를 만든 이후에 현재상태를 지정(쿠버네티스가 지정)
kubectl api-resources
apiVersion:
kind:
metdata:
spec:
kubectl api-resources
에서 NAME과 KIND는 다름kubectl explain <확인하고자 하는 리소스의 이름>
FIELDS: 항목 yaml파일에서 정의를 해야하는 목록
필드가 더이상 없으면 자기자신만 있음 -> 자기자신이 끝난다
--recursive
붙이면 이름만 계층적으로 나옴
kubectl explain pods
kubectl explain pods.metadata
kubectl explain pods.spec
kubectl explain pods.spec.containers
kubectl explain pods.spec.containers.images
kubectl explain pods.spec --recursive
API 레퍼런스
https://kubernetes.io/ko/docs/reference/
https://kubernetes.io/ko/docs/concepts/overview/kubernetes-api/
kubectl create
kubectl run
kubectl expose
kubectl create -f a.yaml
# -f는 파일이라는 뜻kubectl replace -f a.yaml
kubectl patch -f a.yaml
kubectl delete -f a.yaml
kubectl apply -f resources/
컨테이너의 컬렉션
쿠버네티스는 컨테이너 직접 컨트롤하지않음 -> pod 관리
vagrant@node1:~/pod$ kubectl explain pods
KIND: Pod
VERSION: v1
DESCRIPTION:
Pod is a collection of containers that can run on a host. This resource is
created by clients and scheduled onto hosts.
kubectl run myweb --image httpd
pod/myweb created # 오브젝트 리소스만들면 오브젝트종류/이름 어떻게 되었다고 나옴
kubectl get pods
NAME READY STATUS RESTARTS AGE
myweb 1/1 Running 0 39s
1/1에서 뒤에는 컨테이너 총 개수 앞에 1은 준비된 컨테이너 수
kubectl get pods myweb
kubectl get pods -o(output 옵션) wide
kubectl get pods -o yaml
kubectl get pods -o json
kubectl describe pods myweb
리소스의 라이프사이클에 대한 정보
리소스를 만들기 위해 쿠버네티스가 이 리소스가 뭐가 만들어졋고 언제 만들어졋고 하는 리소스에 대한 로그 시간순으로 나ㅏ오게 됨 과거로부터
kubectl logs myweb
kubectl delete pods myweb
pod는 종료되지 않는 앱을 실행하는 것이 원칙
kubectl run myubuntu --image ubuntu:focal kubectl describe pods myubuntu crashloopbackoff 에러
myweb.yaml
apiVersion: v1
kind: Pod
metadata:
name: myweb
spec:
containers:
- name: myweb
image: httpd
ports:
- containerPort: 80
protocol: TCP
kubectl explain pods
kubectl create -f myweb.yaml
kubectl get -f myweb.yaml
kubectl describe -f myweb.yaml
kubectl delete -f myweb.yaml
pod관련 문서
https://kubernetes.io/ko/docs/concepts/workloads/pods/
pod하나에 wp,mysql 컨테이너를 하나씩 구성해선 안 됨 -> Anti Pattern
사이드카 패턴
https://kubernetes.io/blog/2015/06/the-distributed-system-toolkit-patterns/
- sidecar: 기능의 확장 ex -> 로그를 로컬에 남기면 로그를 가지고 다른 로그서버로 전송
- ambassador: 프록시/LB 네트워크 흐름을 내부에서 파드 외부로 나가게 하는 네트워크 흐름을 가지고 있는 컨테이너, 일반적으로 프록시 형태
- adpator: 출력의 표준
앱이 로그를 남김. 중앙 집중화된 모니터링 시스템이 있음 수도 없이 많은 정보를 가져오는데 얘가 알아들을 수 있는 표준화된 포맷이 있는데 앱마다 로그 형태가 다른 경우, 가지고 올때부터 표준화시킴 얘가 알아들을 수 있게 sort도 하고 변경도하고 이런작업을 해주는게 어댑터
테스트 & 디버깅 목적
kubectl explain pods.spec.containers.ports
apiVersion: v1
kind: Pod
metadata:
name: myweb
spec:
containers:
- name: myweb
image: httpd
ports:
- containerPort: 80# 컨테이너가 사용할 포트 -> 실제포트가 80이 되느냐는 아니다 실제 서비스포트는 808이다 그냥 정보
protocol: "TCP"
# 단순히 정보일 뿐이다
kubectl port-forward myweb 80:80
kubectl port-forward pods/myweb 80:80
포트를 바인딩할 수가 없다 0~1023 열려면 관리자 권한이 필요함
sudo 하면 되지만 그냥 8080:80으로
이름: 네임스페이스 유일
UID: 클러스터에서 유일
리소스를 분리
서비스: DNS 이름이 분리되는 용도
RBAC: 권한을 NS에 설정
kubectl get namespaces(ns)
kubectl create ns developments
kubectl delete ns developments -> 안에 리소스가 없어야함
kubectl get pods -A | --all-namespaces
kubectl get pods -n kube-system
pod의 이름은 namespace에서 유일 -> namespace가 다르면 pod의 이름은 같아도 됨
삭제 시 -n 을 지정하지않으면 default에 있는 같은 이름의 pod가 삭제되기때문에 주의
ns-dev.yaml
apiVersion: v1
kind: Namespace
metadata:
name: dev
kubectl create -f ns-dev.yaml
myweb-dev.yaml
apiVersion: v1
kind: Pod
metadata:
name: myweb
namespace: dev
spec:
containers:
- name: myweb
image: httpd
ports:
- containerPort: 80
protocol: TCP
kubectl create -f myweb-dev.yaml
kubectl delete -f myweb-dev.yaml
api-resources
로 보면 namespace 필드가 있는데 namespace를 리소스마다 사용하는지 안하는지에 대한 정보 true 는 사용, false는 미사용
aws의 태그와 비슷 리소스의 이름은 네임스페이스에서 유일해야함
레이블은 리소스에 하나이상 설정할 수 있음 중복해서 겹칠 수가 있음
레이블을 붙여서 오브젝트의 특성을 식별하는데 사용
kubectl get pods --show-labels
kubectl get pods X -o yaml
kubectl describe pods X
kubectl label pods myweb APP=apache
kubectl label pods myweb ENV=developments
kubectl label pods myweb ENV=staging
kubectl label pods myweb ENV=staging --overwirte
kubectl label pods myweb ENV-
=
==
!=
kubectl get pods -l APP=nginx
kubectl get pods -l APP==nginx
kubectl get pods -l 'APP!=nginx'
in
notin
exists
: 키만 매칭kubectl get pods -l 'APP'
doesnotexists
: 키 제외 매칭kubectl get pods -l '!APP'
어떤 레이블을 사용해야 할까?
사용동기 예시 https://kubernetes.io/ko/docs/concepts/overview/working-with-objects/labels/#%EC%82%AC%EC%9A%A9-%EB%8F%99%EA%B8%B0
레이블중에 kubernets.io/ k8s.io 들은 예약이 되어있음 -> 다른곳에서 쓰이고 있다
레이블과 비슷
비 식별 메타데이타 -> 셀렉터가 없음
클라이언트가 이 메타데이터를 검색할 수 있음 -> 단순히 가져갈수도 있고
메타데이터로 작업을 하기 위해
kubectl annotate pods myweb created-by=Jang
kubectl annotate pods myweb created-by=Kim --overwrite
kubectl annotate pods myweb created-by-
apiVersion: v1
kind: Pod
metadata:
name: myweb-label-anno
labels:
APP: apache
ENV: staging
annotations:
Created-by: Ken
spec:
containers:
- name: myweb
image: httpd
ports:
- containerPort: 80
protocol: TCP
kubectl get pods -o yaml
로 보면 어노테이션이 붙어 있음, 만든적은 없지만 붙어있음 calico에 의해 만들어졌음 cni
pod 만들면 네트워크 제공하는게 calico 비식별 메타데이터를 붙임
calico가 관리하기 위한 용도로 붙여놓앗음