apiVersion: apps/v1
kind: Deployment // 파스칼 표기법
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
$ kubectl apply -f deployment.yaml
$ kubectl run --image=nginx nginx
alias k=kubectl
$ k get node
$ k get node -o wide
$ k get node <node명> -o yaml
$ k describe node <node명>
cordon: 현재 노드에 배포된 Pod은 그대로 유지하면서, 추가적인 Pod의 배포를 제한하는 명령어
해제 방법: uncordon
drain: Pod를 더이상 사용하지 않을 경우
$ k cordon <node명>
$ k uncordon <node명>
$ k drain <node명>
$ k drain <node명> --ignore-daemonsets // daemonset으로 생성된 Pod일 경우
# namespace 생성 및 확인
$ k create ns my-app
$ k get ns --show-labels
$ k delete ns my-app
# 특정 namespace내에 있는 자원 확인
$ k get pod -n kube-system
$ k get all -n kube-system
# 모든 namespace내의 자원을 확인
$ k get all -A
create: 단순히 오브젝트를 생성하는것이라 트래킹이 제한
apply: yaml 파일을 생성 후 yaml파일로 오브젝트를 생성, yaml로 트래킹
# namespace에 종속된 리소스 확인
$ kubectl api-resources --namespaced=true
# namespace에 종속되지 않는 글로벌 서비스 확인
$ kubectl api-resources -namespaced=false
같은 IP 주소를 가지고 localhost 통신
포드 할당
apiVersion:v1
kind: Pod
metadata:
name: myapp-prod
namespace: app
labels:
app: myapp
type: front-end
spec:
containers:
- name: nginx-container
image: nginx
ports:
- containerports: 8080
멀티 컨테이너
apiVersion:v1
kind: Pod
metadata:
name: myapp2-prod
namespace: app
labels:
app: myapp
type: front-end
spec:
containers:
- name: nginx-container
image: nginx
- name: redis-container
image: redis:3.2
# pod 생성 및 확인
$ kubectl run nginx --image=nginx
$ kubectl run nginx2 --image=nginx --dry-run=client -o yaml > pod.yaml
$ k apply -f pod.yaml
$ k get pod
$ k get pod -o wide
# pod의 로그 확인
$ k logs nginx
# pod에 라벨 할당
$ k label pods nginx app=front-end
$ k get pod --show-labels
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: myapp-replicaset
labels:
app: myapp
type: front-end
spec:
template:
metadata: // pod의 metadata 이하를 그대로 가져옴
name: myapp-replicaset
labels:
app: myapp
type: front-end
spec:
containers:
- name: nginx-container
image: nginx
replicas: 3
selector: // 어떤 파드가 해당 replicaset에 할당되는지를 나타냄
matchLabels:
type: front-end
# replicaset 생성
$ kubectl apply -f test-replicaset.yaml
$ k get rs
$ k get rs -o wide
# replicaset와 연결된 pod 확인
$ k get pod -l type=front-end --show-labels
# 자동 복구 확인
$ k delete pod <pod명>
$ k get pod
$ k scale replicaset myapp-replicaset --replicas 6
$ k get rs
$ k get pod
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deployment
labels:
app: myapp
type: front-end
spec:
template:
metadata:
name: myapp-pod
labels:
app: myapp
type: front-end
spec:
containers:
- name: nginx-container
image: nginx:1.22
replicas: 3
strategy:
type: RollingUpdate
selector:
matchLabels:
type: front-end
# deployment 생성
$ kubectl apply -f test-deploy.yaml --record
// --record: 어떤 명령어를 실행하고 업데이트를 하였는지 이력을 저장, 롤백 시 참고 가능
$ k get deploy
$ k describe deploy myapp-deployment
$ k get rs
$ k get pod
# deployment 롤링 업데이트
$ k set image deployment myapp-deployment nginx-container=nginx:1.23 --record
$ k rollout status deployment myapp-deployment
$ k get deploy
$ k get rs
$ k get pod
# deployment 변경 이력 확인
$ k rollout history deployment myapp-deployment
$ k rollout history deployment myapp-deployment --revision 4
# deployment 변경 롤백
$ k rollout undo deployment myapp-deployment --to-revision 1
# 롤백 확인
$ k get replicasets
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: monitoring-daemon
spec:
template:
metadata:
labels:
app: monitoring-agent
spec:
containers:
- name: monitoring-agent
image: nginx
selector:
matchLabels:
app: monitoring-agent
# daemonset 생성
$ k apply -f test-daemonset.yaml
$ k get ds
$ k get pod -A -l app=monitoring-agent -o wide
# daemonset 재시작
$ k rollout restart daemonset/monitoring-daemon
apiVersion: v1
kind: Service
metadata:
name: back-end
spec:
type: ClusterIP
ports:
- targetPort: 80
port: 80
selector:
app: myapp
type: back-end
apiVersion: v1
kind: Service
metadata:
name: myapp-service
spec:
type: NodePort
port:
- targetPort: 80
port: 80
NodePort: 30008
selector:
app: myapp
type: front-end
apiVersion: v1
kind: Service
metadata:
name: mytest-service
spec:
type: Loadbalancer
ports:
- targetPort: 80
port: 80
NodePort: 30008
selector:
app: myapp
type: proxy
# deployment 생성
$ k create deployment nginx-svc --image=nginx
$ k get deploy
# Node Port 서비스로 노출
$ k expose deployment/nginx-svc --type="NodePort" --port 80
# 서비스 확인
$ k get svc -o wide
$ k get pod --show-labels
# 서비스 호출
$ k run curl -it --rm --image curlimages/curl -- sh
$ curl nginx-svc(:80)
$ curl <Node명>:<NodePort>