기본적인 kubernetes resource, option 등을 설명한 블로그입니다. 추가적인 기능을 보고싶으시면 docs를 참고바랍니다.
https://kubernetes.io/docs/home/
- ReplicationController은 old한 기술이여서, 이와 같은 역할을 하지만, 보다 다양한 selector를 제공해주는 ReplicaSet 컨트롤러를 쓴다.
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: frontend
labels:
app: guestbook
tier: frontend
spec:
# 케이스에 따라 레플리카를 수정한다.
replicas: 3
selector:
matchLabels:
component: redis
matchExpressions:
- {key: tire, operator: In, values: ["1.1", "1,2"]} # tire라는 key에 1.1 혹은 1.2가 있어야함
- {key: environment, operator: NotIn, values: [a,b]}# environment에 a,b가 들어있으면 안됨.
template:
metadata:
labels:
tier: frontend
spec:
containers:
- name: php-redis
image: gcr.io/google_samples/gb-frontend:v3
# In: key, value가 일치하는 pod만 연결.
# NotIn: key는 일치하고 value는 일치하지 않는 pod만 연결
# Exists: key에 맞는 label의 pod를 연결
# DoesNotExist: key와 다른 label의 pod를 연결
# replicationController는 여러 selector가 있으면 and조건, matchLabels도 같은 의미.
- template이 있는데 selector가 왜 필요한지 궁금할 텐데 그건, replicaset은 그 전에 만들어진 즉, 모든 pod들을 관찰하기 때문에, 이미 selector에 해당하는 label을 가지고 있는 pod가 존재하면 더이상 생성 x.
- kubectl get rs(replicaset)
- kubectl scale rs [replicaset name] --replicas=[num] # replicaset 개수 조정
- kubectl scale --replicas=[num] -f [file name] 도 가능
- kubectl replace -f [rs file name]으로 replace 가능
- kubectl delete rs [rs_name] --cascade=false # relicaset controller만 삭제하고 pod는 그대로 남겨둬서 독립된 pod로 바뀜.
- deployment가 replicaset을 컨트롤하고 replicaset은 pod들을 컨트롤한다.
- deployment는 rolling update, rolling back을 수행하며, 새로운 replicaset을 만들어 서비스 중단없이 update, back하는 것.
- deployment는 replicaset이랑 kind만 다르고 같은 yaml형식을 띄며 역시나 version은 apps/v1이다.
- kubectl get deploy,rs,pod
- kubectl delete rs [rs name]해도 다시 deployment가 replicaset을 생성한다.
- rollout update는 apply와 set, edit명령을 쓸 수 있다. -> kubectl apply, set, edit으로 update 가능. 하지만 특정 field만 update가능. ex) image, name
- --record는 기록을 위한 용도로 kubectl rollout history명령어에서 기록된 버전으로 되돌아 가기 위해서 써야한다.
- --record 대신 metadata.annotation에 써도 된다.
- annotations -> kubernetes에게 특정 정보를 전달할 용도로 사용. ex) deployment의 rolling update 정보 저장. 혹은 release, logging, monitoring
...
metadata:
name: [name]
annotations:
[key]: [value]
- kubectl create -f deployment.yaml --record
- kubectl set image deployment app-deploy web=nginx:1.15 --record
- kubectl rollout status deployment [deployment name] -> 업데이트 과정 상태
- kubectl rollout pause deployment [deployment name] -> 업데이트 일시정지
- kubectl rollout resume deployment [deployment name] -> 업데이트 다시 시작
- kubectl rollout history deployment [deployment name] -> 업데이트 history
- kubectl rollout undo deployment [deployment name] -> 업데이트 바로 전 단계로
- kubectl rollout history deployment [deployment name] --to-revision=[num] -> 업데이트 to-revision 단계로
- kubectl apply -f [deployment.yaml] -> 위의 명령어가 너무 길면 yaml파일의 version을 바꿔서 실행하면 된다.
- 카나리 업데이트는 기존 버전을 유지한 채로 일부 버전만 신규버전으로 올려서 버그나 이상이 없는지 확인 후 배포.
- 올드 버전과 뉴 버전의 중복 label을 이용해 selector로 배포한다음 올드 버전의 replicas의 개수를 줄이고 뉴 버전의 replicas 수를 늘려 배포한다.
- kubectl create -f old-canary.yaml -> kubectl create -f new-canary.yaml -> 이상없음 -> kubectl scale deployment new-canary --replicas=2 -> kubectl delete deployments.apps old-canary
# replicaset or deployment
metadata:
name: deploy-nginx
annotations:
kubernetes.io/change-cause: version 1.14 # record
spec:
progressDeadlineSeconds: 600 # 10분동안 업데이트가 진행되지 않으면 취소시킨다.
revisionHistoryLimit: 10 # history 기록을 10개로 한정
strategy:
rollingUpdate:
maxSurge: 25% # update할때 running pod를 몇개로 유지할 것인가. 높을수록 update빠르다.
masUnavailable: 25% # terminating되는 pod 비율
type: RollingUpdate
replicas: 3
...
- Daemonset이란 전체 노드에서 pod가 한개씩 실행되도록 보장. -> 로그, 모니터링 에이전트와 같은 프로그램 실행시 쓰인다. (kube scheduler에 의해 무시된다.)
apiVersion: apps/v1
kind: DaemonSet
metadata:
...
spec:
selector:
...
template:
...
# replicaset과 비슷하지만 replicas 개수 정보가 없다. -> 각노드당 1개씩 이니까
- kubectl get daemonsets.apps
- kubectl create -f [daemonset.yaml]를 하면 중간에 노드가 삭제되거나 추가되거나, pod가 삭제되더라도 1개 보장.
- kubectl edit damonsets.apps [damonset name]을 통해 version을 바꾸고 저장하면 rolling update된다.
- kubectl rollout undo도 지원해준다.
'kubernetes, helm, rancher' 카테고리의 다른 글
kubernetes HA(Highly Available), multi master node (0) | 2021.11.27 |
---|---|
kubernetes Statefulset, Job, Cronjob (0) | 2021.11.25 |
kubernetes pod resources, env, ReplicationController (0) | 2021.11.23 |
kubernetes pod, static pod, self-healing, container type (0) | 2021.11.22 |
kubernetes namespace, resourcequota (0) | 2021.11.20 |