이 글은 쿠버네티스의 기능들을 간단히 설명하고 해당 기능들의 코드 예시를 작성함.
https://kubernetes.io/ko/docs/concepts/overview/what-is-kubernetes/
컨테이너화된 워크로드와 서비스를 관리하기 위한 이식성이 있고, 확장가능한 오픈소스 플랫폼이다.
좀 더 간단히 이야기하면 컨테이너 관리 시스템이다.
클러스터에 관한 전반적인 결정(예를 들어, 스케줄링)을 수행하고 클러스터 이벤트를 감지하고 반응
동작 중인 파드를 유지시키고 쿠버네티스 런타임 환경을 제공하며, 모든 노드 상에서 동작
쿠버네티스 리소스(데몬셋, 디플로이먼트 등)를 이용하여 클러스터 기능을 구현
kubectl이란?
1) pod 조회 및 접근
# default 네임스페이스 조회
$ kubectl get pod
# 특정 네임스페이스만 조회
$ kubectl get pod -n <해당 네임스페이스>
# 모든 네임스페이스 조회
$ kubectl get pod -A
# 상세 조회
$ kubectl get pod -o wide
# 조회한 파드에 접근할 때 (bash 쉘이 있을 경우에만 아래 사용가능)
$ kubectl exec -it <조회한 파드명> bash
# 파드 로그 확인
$ kubectl logs -f <조회한 파드명>
# yaml파일로 생성 및 수정
$ kubectl apply -f <파일명>
# yaml파일로 생성
$ kubectl create -f <파일명>
apply VS create
apiVersion: v1
kind: Pod
metadata:
name: sample
labels:
app: sample
annotations:
manager: "sunjiho"
contact: "010-1234-5679"
release-version: "v1.0.0"
spec:
containers:
- name: <컨테이너 명>
image: <이미지 명>
imagePullPolicy: Always
ports:
- containerPort: 8080
쿠버네티스가 애플리케이션의 인스턴스를 어떻게 생성하고 업데이트해야 하는지를 지시하는 것
apiVersion: apps/v1
kind: Deployment
metadata:
name: sample
labels:
app: sample
spec:
replicas: 1
selector:
matchLabels:
app: sample
template:
metadata:
name: sample
labels:
app: sample
spec:
nodeSelector:
kubernetes.io/hostname: <특정 노드로만 실행 시키고 싶을 경우>
hostname: krr
containers:
- name: <컨테이너 명>
image: <이미지 명>
imagePullPolicy: Always
volumeMounts:
- name: log
mountPath: /home/danawa/log
volumes:
- name: log
hostPath:
path: /data/danawa/log
조회
# deployment 조회, 같은 결과가 나온다.
$ kubectl get deployments
$ kubectl get deployment
$ kubectl get deploy
$ kubectl get deploy -n <해당 네임스페이스>
apiVersion: batch/v1
kind: CronJob
metadata:
name: sample
labels:
app: sample
spec:
schedule: "30 22 * * 2"
failedJobsHistoryLimit: 1
successfulJobsHistoryLimit: 4
jobTemplate:
metadata:
name: sample
labels:
app: sample
spec:
template:
spec:
restartPolicy: Never
nodeSelector:
kubernetes.io/hostname: <해당 노드 명>
containers:
- name: <컨테이너 명>
image: <이미지 명>
imagePullPolicy: Always
volumeMounts:
- name: log
mountPath: /home/danawa/log
volumes:
- name: log
hostPath:
path: /data/log
조회
$ kubectl get cronjob
$ kubectl get cronjob -n <해당 네임스페이스>
apiVersion: v1
kind: Service
metadata:
name: sample
labels:
app: sample
spec:
type: NodePort
ports:
- port: 9000
targetPort: 9000
name: sample1
- port: 9001
targetPort: 9001
name: sample2
selector:
app: sample
apiVersion: apps/v1
kind: Deployment
metadata:
name: sample
spec:
replicas: 1
selector:
matchLabels:
app: sample
strategy:
type: Recreate
template:
metadata:
labels:
app: sample
spec:
containers:
- name: sample
image: nginx:latest
env:
- name: TZ
value: Asia/Seoul
- name: LANG
value: ko_KR.utf8
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: sample
labels:
app: sample
spec:
type: LoadBalancer
ports:
- port: 10000 # 10000번 포트로 접근하면 접근 됨
targetPort: 80
selector:
app: sample
조회
# 같은 결과
$ kubectl get services
$ kubectl get service
$ kubectl get svc
$ kubectl get svc -n <해당 네임 스페이스>
ServiceType=NodePort일 경우
apiVersion: apps/v1
kind: Deployment
metadata:
name: sample
spec:
replicas: 1
selector:
matchLabels:
app: sample
strategy:
type: Recreate
template:
metadata:
labels:
app: sample
spec:
containers:
- name: sample
image: nginx:latest
env:
- name: TZ
value: Asia/Seoul
- name: LANG
value: ko_KR.utf8
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: sample
labels:
app: sample
spec:
type: NodePort
ports:
- port: 10000
targetPort: 80
selector:
app: sample
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: sample
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx
rules:
- host: rancher.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: sample
port:
number: 10000
조회
$ kubectl get ingress
$ kubectl get ingress -n <해당 네임 스페이스>
$ kubectl config view
# 파일로 작성 시
## 생성 및 업데이트
$ kubectl apply -f <파일명>
## 삭제
$ kubectl delete -f <파일명>
# 일반적으로 실행 시(도커랑 거의 동일)
kubectl run <파드 명칭> --image=<이미지 명> -n <해당 네임 스페이스>
에러가 났을 경우에 확인하는 용도 및 현재 상태 확인 용도
$ kubectl describe pod <파드 명>
$ kubectl describe service <서비스 명>
$ kubectl describe cronjob <크론잡 명>
$ kubectl describe deployment <디플로이먼트 명>
쿠버네티스에서는 volume을 두개를 써야함
volume.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: sample-pv
labels:
type: local
spec:
storageClassName: manual
capacity:
storage: 100Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/mnt/d/storage"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: sample-pvc
spec:
storageClassName: manual
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 100Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: sample
spec:
replicas: 1
selector:
matchLabels:
app: sample
strategy:
type: Recreate
template:
metadata:
labels:
app: sample
spec:
containers:
- name: sample
image: nginx:latest
env:
- name: TZ
value: Asia/Seoul
- name: LANG
value: ko_KR.utf8
ports:
- containerPort: 80
volumeMounts:
- mountPath: /data
name: sample-pvc
volumes:
- name: sample-pvc
persistentVolumeClaim:
claimName: sample-pvc
---
apiVersion: v1
kind: Service
metadata:
name: sample
labels:
app: sample
spec:
type: NodePort
ports:
- port: 10000
targetPort: 80
selector:
app: sample
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: sample
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx
rules:
- host: rancher.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: sample
port:
number: 10000
조회 예시
# persistentVolumeClaim
$ kubectl get pvc
$ kubectl get pvc -n <해당 네임 스페이스>
# persistentVolume
$ kubectl get pv
$ kubectl get pv -n <해당 네임스페이스>