Learning Kubernetes
1. 쿠버네티스 간단하게 맛보기
1.1 단축형 키워드 사용하기
kubectl get po # PODs
kubectl get svc # Service
kubectl get rc # Replication Controller
kubectl get deploy # Deployment
kubectl get ns # Namespace
kubectl get no # Node
kubectl get cm # Configmap
kubectl get pv # PersistentVolumns
1.2 도움말 보기
kubectl -h
kubectl controls the Kubernetes cluster manager.
Find more information at: https://kubernetes.io/docs/reference/kubectl/overview/
Basic Commands (Beginner):
create Create a resource from a file or from stdin.
expose Take a replication controller, service, deployment or pod and expose it as a new Kubernetes Service
run Run a particular image on the cluster
set Set specific features on objects
Basic Commands (Intermediate):
explain Documentation of resources
get Display one or many resources
edit Edit a resource on the server
delete Delete resources by filenames, stdin, resources and names, or by resources and label selector
Deploy Commands:
kubectl get -h
Display one or many resources
Prints a table of the most important information about the specified resources. You can filter the list using a label
selector and the --selector flag. If the desired resource type is namespaced you will only see results in your current
namespace unless you pass --all-namespaces.
Uninitialized objects are not shown unless --include-uninitialized is passed.
By specifying the output as 'template' and providing a Go template as the value of the --template flag, you can filter
the attributes of the fetched resources.
Use "kubectl api-resources" for a complete list of supported resources.
Examples:
# List all pods in ps output format.
kubectl get pods
# List all pods in ps output format with more information (such as node name).
kubectl get pods -o wide
1.3 리소스 정의에 대한 도움말
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.
FIELDS:
apiVersion <string>
APIVersion defines the versioned schema of this representation of an
object. Servers should convert recognized schemas to the latest internal
value, and may reject unrecognized values. More info:
https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
kind <string>
Kind is a string value representing the REST resource this object
represents. Servers may infer this from the endpoint the client submits
requests to. Cannot be updated. In CamelCase. More info:
https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
metadata <Object>
Standard object's metadata. More info:
https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata
spec <Object>
Specification of the desired behavior of the pod. More info:
https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status
status <Object>
Most recently observed status of the pod. This data may not be up to date.
Populated by the system. Read-only. More info:
https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status
1.4 리소스 감시하기
- Kube-system 네임스페이스에 있는 모든 pod에 대해 모니터링 합니다.
kubectl get pods --watch -n kube-system
root@master:~# k get pods --watch -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-6955765f44-glcdc 1/1 Running 0 19d
coredns-6955765f44-h7fbb 1/1 Running 0 19d
etcd-master.sas.com 1/1 Running 1 19d
kube-apiserver-master.sas.com 1/1 Running 1 19d
kube-controller-manager-master.sas.com 1/1 Running 1 19d
kube-proxy-gm44f 1/1 Running 1 19d
kube-proxy-ngqr6 1/1 Running 0 19d
kube-proxy-wmq7d 1/1 Running 0 19d
kube-scheduler-master.sas.com 1/1 Running 1 19d
weave-net-2pm2x 2/2 Running 0 19d
weave-net-4wksv 2/2 Running 0 19d
weave-net-7j7mn 2/2 Running 0 19d
...
2. 쿠버네티스 Pod
2.1 도커 허브 이미지로 컨테이너 생성 및 확인
-
컨테이너 생성
# POD 만 생성 $ kubectl run goapp-project --image=chungsju/goapp --port=8080
-
컨테이너 확인
$ kubectl get pods
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
goapp-project-bcv5q 1/1 Running 0 2m26s
아래 명령어를 추가적으로 수행해 보세요
kubectl get pods -o wide kubectl describe pod goapp-project-bcv5q
- POD 삭제
Replication Controller 를 통해 생성된 POD 는 개별 POD 가 삭제 되지 않습니다. Replication Controller 자체를 삭제 해야 합니다.
kubectl delete rc goapp-project
2.2 POD 설정을 yaml 파일로 가져오기
kubectl get pod goapp-project-bcv5q -o yaml
kubectl get po goapp-project-bcv5q -o json
크게 metadata, spec, status 항목으로 나누어 집니다.
[출력 - yaml]
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: "2020-01-10T07:37:49Z"
generateName: goapp-project-
labels:
run: goapp-project
name: goapp-project-bcv5q
namespace: default
ownerReferences:
- apiVersion: v1
blockOwnerDeletion: true
controller: true
kind: ReplicationController
name: goapp-project
uid: e223237f-17e2-44f4-aaee-07e8ff4592b2
resourceVersion: "3082141"
selfLink: /api/v1/namespaces/default/pods/goapp-project-bcv5q
uid: 72bebcbd-8e6e-4906-9f66-1c3821fa49ec
spec:
containers:
- image: chungsju/goapp
imagePullPolicy: Always
name: goapp-project
ports:
- containerPort: 8080
protocol: TCP
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /var/run/secrets/kubernetes.io/serviceaccount
name: default-token-qz4fh
readOnly: true
dnsPolicy: ClusterFirst
enableServiceLinks: true
nodeName: worker01.sas.com
priority: 0
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
serviceAccount: default
serviceAccountName: default
terminationGracePeriodSeconds: 30
tolerations:
- effect: NoExecute
key: node.kubernetes.io/not-ready
operator: Exists
tolerationSeconds: 300
- effect: NoExecute
key: node.kubernetes.io/unreachable
operator: Exists
tolerationSeconds: 300
volumes:
- name: default-token-qz4fh
secret:
defaultMode: 420
secretName: default-token-qz4fh
status:
conditions:
- lastProbeTime: null
lastTransitionTime: "2020-01-10T07:37:49Z"
status: "True"
type: Initialized
- lastProbeTime: null
lastTransitionTime: "2020-01-10T07:37:55Z"
status: "True"
type: Ready
- lastProbeTime: null
lastTransitionTime: "2020-01-10T07:37:55Z"
status: "True"
type: ContainersReady
- lastProbeTime: null
lastTransitionTime: "2020-01-10T07:37:49Z"
status: "True"
type: PodScheduled
containerStatuses:
- containerID: docker://de3418e51fea7f7a19e7b1d6ff5a4a6f386f337578838e6f1ec0589275ca6f48
image: chungsju/goapp:latest
imageID: docker-pullable://chungsju/goapp@sha256:e5872256539152aecd2a8fb1f079e132a6a8f247c7a2295f0946ce2005e36d05
lastState: {}
name: goapp-project
ready: true
restartCount: 0
started: true
state:
running:
startedAt: "2020-01-10T07:37:55Z"
hostIP: 192.168.56.103
phase: Running
podIP: 10.40.0.2
podIPs:
- ip: 10.40.0.2
qosClass: BestEffort
startTime: "2020-01-10T07:37:49Z"
2.3 POD 생성을 위한 YAML 파일 만들기
아래와 같이 goapp.yaml 파일을 만듭니다.
apiVersion: v1
kind: Pod
metadata:
name: goapp-pod
spec:
containers:
- image: chungsju/goapp
name: goapp-container
ports:
- containerPort: 8080
protocol: TCP
ports 정보를 yaml 파일에 기록 하지 않으면 아래 명령어로 향후에 포트를 할당해도 됩니다.
kubectl port-forward goapp-pod 8080:8080
2.4 YAML 파일을 이용한 POD 생성 및 확인
$ kubectl create -f goapp.yaml
[output]
pod/goapp-pod created
$ kubectl get pod
[output]
NAME READY STATUS RESTARTS AGE
goapp-pod 1/1 Running 0 12m
goapp-project-bcv5q 1/1 Running 0 41m
goapp-project-c8hml 1/1 Running 0 25m
goapp-project-r7kx5 1/1 Running 0 25m
2.5 POD 및 Container 로그 확인
- POD 로그 확인
kubectl logs goapp-pod
[output]
Starting GoApp Server......
- Container 로그 확인
kubectl logs goapp-pod -c goapp-container
[output]
Starting GoApp Server......
현재 1개 POD 내에 Container 가 1이기 때문에 출력 결과는 동일 합니다. POD 내의 Container 가 여러개 일 경우 모든 컨테이너의 표준 출력이 화면에 출력됩니다.
[Exercise #1]
- Yaml 파일로 nginx 1.18 버전기반의 이미지를 사용해 nginx-app 이라는 이름의 Pod 를 만드세요(port : 8080)
- nginx Pod 의 정보를 yaml 파일로 출력 하세요
- nginx-app Pod 를 삭제 하세요
2.6 Lable 정보를 추가해서 POD 생성하기
- goapp-with-lable.yaml 이라 파일에 아래 내용을 추가 하여 작성 합니다.
apiVersion: v1
kind: Pod
metadata:
name: goapp-pod2
labels:
env: prod
spec:
containers:
- image: chungsju/goapp
name: goapp-container
ports:
- containerPort: 8080
protocol: TCP
- yaml 파일을 이용해 pod 를 생성 합니다.
$ kubectl create -f ./goapp-with-lable.yaml
[output]
pod/goapp-pod2 created
- 생성된 POD를 조회 합니다.
kubectl get po --show-labels
[output]
NAME READY STATUS RESTARTS AGE LABELS
goapp-pod 1/1 Running 0 160m <none>
goapp-pod2 1/1 Running 0 3m53s env=prod
goapp-project-bcv5q 1/1 Running 0 9h run=goapp-project
goapp-project-c8hml 1/1 Running 0 9h run=goapp-project
goapp-project-r7kx5 1/1 Running 0 9h run=goapp-project
- Lable 태그를 출력 화면에 컬럼을 분리해서 출력
kubectl get pod -L env
[output]
NAME READY STATUS RESTARTS AGE ENV
goapp-pod 1/1 Running 0 161m
goapp-pod2 1/1 Running 0 5m19s prod
goapp-project-bcv5q 1/1 Running 0 9h
goapp-project-c8hml 1/1 Running 0 9h
goapp-project-r7kx5 1/1 Running 0 9h
- Lable을 이용한 필터링 조회
kubectl get pod -l env=prod
[output]
NAME READY STATUS RESTARTS AGE
goapp-pod2 1/1 Running 0 39h
- Label 추가 하기
kubectl label pod goapp-pod2 app="application" tier="frondEnd"
- Label 삭제 하기
kubectl label pod goapp-pod2 app- tier-
2.7 Label 셀렉터 사용
- AND 연산
kubectl get po -l 'app in (application), tier in (frontEnd)'
- OR 연산
kubectl get po -l 'app in (application,backEnd)'
kubectl get po -l 'app in (application,frontEnd)'
2.8 생성된 POD 로 부터 yaml 파일 얻기
kubectl get pod goapp-pod -o yaml
[output]
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: "2020-01-10T08:07:04Z"
name: goapp-pod
namespace: default
resourceVersion: "3086366"
selfLink: /api/v1/namespaces/default/pods/goapp-pod
uid: 18cf0ed0-be56-4b54-869c-4473117800b1
spec:
containers:
- image: chungsju/goapp
imagePullPolicy: Always
name: goapp-container
ports:
- containerPort: 8080
protocol: TCP
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /var/run/secrets/kubernetes.io/serviceaccount
name: default-token-qz4fh
readOnly: true
dnsPolicy: ClusterFirst
enableServiceLinks: true
nodeName: worker02.sas.com
priority: 0
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
serviceAccount: default
serviceAccountName: default
terminationGracePeriodSeconds: 30
tolerations:
- effect: NoExecute
key: node.kubernetes.io/not-ready
operator: Exists
tolerationSeconds: 300
- effect: NoExecute
key: node.kubernetes.io/unreachable
operator: Exists
tolerationSeconds: 300
volumes:
- name: default-token-qz4fh
secret:
defaultMode: 420
secretName: default-token-qz4fh
status:
conditions:
- lastProbeTime: null
lastTransitionTime: "2020-01-10T08:07:04Z"
status: "True"
type: Initialized
- lastProbeTime: null
lastTransitionTime: "2020-01-10T08:07:09Z"
status: "True"
type: Ready
- lastProbeTime: null
lastTransitionTime: "2020-01-10T08:07:09Z"
status: "True"
type: ContainersReady
- lastProbeTime: null
lastTransitionTime: "2020-01-10T08:07:04Z"
status: "True"
type: PodScheduled
containerStatuses:
- containerID: docker://d76af359c556c60d3ac1957d7498513f42ace14998c763456190274a3e4a1d5e
image: chungsju/goapp:latest
imageID: docker-pullable://chungsju/goapp@sha256:e5872256539152aecd2a8fb1f079e132a6a8f247c7a2295f0946ce2005e36d05
lastState: {}
name: goapp-container
ready: true
restartCount: 0
started: true
state:
running:
startedAt: "2020-01-10T08:07:08Z"
hostIP: 10.0.2.5
phase: Running
podIP: 10.32.0.4
podIPs:
- ip: 10.32.0.4
qosClass: BestEffort
startTime: "2020-01-10T08:07:04Z"
2.9 Lable을 이용한 POD 스케줄링
- 노드목록 조회
kubectl get nodes
[output]
NAME STATUS ROLES AGE VERSION
master.sas.com Ready master 16d v1.17.0
worker01.sas.com Ready <none> 16d v1.17.0
worker02.sas.com Ready <none> 16d v1.17.0
- 특정 노드에 레이블 부여
kubectl label node worker02.sas.com memsize=high
- 레이블 조회 필터 사용하여 조회
kubectl get nodes -l memsize=high
[output]
NAME STATUS ROLES AGE VERSION
worker02.sas.com Ready <none> 17d v1.17.0
-
특정 노드에 신규 POD 스케줄링
아래 내용과 같이 goapp-label-node.yaml 파을을 작성 합니다.
apiVersion: v1
kind: Pod
metadata:
name: goapp-pod-memhigh
spec:
nodeSelector:
memsize: "high"
containers:
- image: chungsju/goapp
name: goapp-container-memhigh
- YAML 파일을 이용한 POD 스케줄링
kubectl create -f ./goapp-lable-node.yaml
[output]
pod/goapp-pod-memhigh created
- 생성된 노드 조회
kubectl get pod -o wide
[output]
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
goapp-pod-memhigh 1/1 Running 0 17s 10.32.0.5 worker02.sas.com <none> <none>
2.10 POD 에 Annotation 추가하기
kubectl annotate pod goapp-pod-memhigh maker="chungsju" team="k8s-team"
[output]
pod/goapp-pod-memhigh annotated
2.11 Annotation 확인하기
- YAML 파일을 통해 확인하기
kubectl get po goapp-pod-memhigh -o yaml
[output]
kind: Pod
metadata:
annotations:
maker: chungsju
team: k8s-team
creationTimestamp: "2020-01-12T15:25:05Z"
name: goapp-pod-memhigh
namespace: default
resourceVersion: "3562877"
selfLink: /api/v1/namespaces/default/pods/goapp-pod-memhigh
uid: a12c35d7-d0e6-4c01-b607-cccd267e39ec
spec:
containers:
- DESCRIBE 를 통해 확인하기
kubectl describe pod goapp-pod-memhigh
[output]
Name: goapp-pod-memhigh
Namespace: default
Priority: 0
Node: worker02.sas.com/10.0.2.5
Start Time: Mon, 13 Jan 2020 00:25:05 +0900
Labels: <none>
Annotations: maker: chungsju
team: k8s-team
Status: Running
IP: 10.32.0.5
2.12 Annotation 삭제
kubectl annotate pod goapp-pod-memhigh maker- team-
[[Exercise #2]]
- bitnami/apache 이미지로 Pod 를 만들고 tier=FronEnd, app=apache 라벨 정보를 포함하세요
- Pod 정보를 출력 할때 라벨을 함께 출력 하세요
- app=apache 라벨틀 가진 Pod 만 조회 하세요
- 만들어진 Pod에 env=dev 라는 라벨 정보를 추가 하세요
- created_by=kevin 이라는 Annotation을 추가 하세요
- apache Pod를 삭제 하세요
2.13. Liveness probes
liveness prove는 Pod에 지정된 주소에 Health Check 를 수행하고 실패할 경우 Pod를 다시 시작 합니다.
이때 중요한 점은 단순히 다시 시작만 하는 것이 아니라, 리포지토리로 부터 이미지를 다시 받아 Pod 를 다시 시작 합니다.
아래 내용으로.
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-http
spec:
containers:
- name: liveness
image: k8s.gcr.io/liveness
args:
- /server
livenessProbe:
httpGet:
path: /healthz
port: 8080
httpHeaders:
- name: Custom-Header
value: Awesome
initialDelaySeconds: 3
periodSeconds: 3
K8s.gcr.io/liveness 이미지는 liveness 테스트를 위해 만들어진 이미지 입니다. Go 언어로 작성 되었으며, 처음 10초 동안은 정상적인 서비스를 하지만, 10초 후에는 에러를 발생 시킵니다. 자세한 사항은 URL 을 참고 하세요
2.14. Pod 생성
kubectl create -f ./liveness-probe-pod.yaml
2.15 Pod 확인
kubectl get pod
아래
NAME READY STATUS RESTARTS AGE
liveness-http 1/1 Running 0 5s
NAME READY STATUS RESTARTS AGE
liveness-http 1/1 Running 1 26s
NAME READY STATUS RESTARTS AGE
liveness-http 1/1 Running 3 68s
NAME READY STATUS RESTARTS AGE
liveness-http 0/1 CrashLoopBackOff 3 81s
NAME READY STATUS RESTARTS AGE
liveness-http 0/1 CrashLoopBackOff 5 2m50s
2.16 Pod 로그 이벤트 확인
kubectl describe pod liveness-http
Name: liveness-http
Namespace: default
Priority: 0
Node: worker02.acorn.com/192.168.56.110
Start Time: Wed, 01 Apr 2020 05:54:29 +0000
Labels: test=liveness
Annotations: <none>
Status: Running
IP: 10.36.0.1
IPs:
IP: 10.36.0.1
Containers:
liveness:
Container ID: docker://0f1ba830b830d5879fe99776cd0db5f3678bf52a11e3ccb1a1e9c65460957817
Image: k8s.gcr.io/liveness
Image ID: docker-pullable://k8s.gcr.io/liveness@sha256:1aef943db82cf1370d0504a51061fb082b4d351171b304ad194f6297c0bb726a
Port: <none>
Host Port: <none>
Args:
/server
State: Running
Started: Wed, 01 Apr 2020 06:01:15 +0000
Last State: Terminated
Reason: Error
Exit Code: 2
Started: Wed, 01 Apr 2020 05:58:16 +0000
Finished: Wed, 01 Apr 2020 05:58:32 +0000
Ready: True
Restart Count: 7
Liveness: http-get http://:8080/healthz delay=3s timeout=1s period=3s #success=1 #failure=3
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-zshgs (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
default-token-zshgs:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-zshgs
Optional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled <unknown> default-scheduler Successfully assigned default/liveness-http to worker02.acorn.com
Normal Pulled 6m14s (x3 over 6m53s) kubelet, worker02.acorn.com Successfully pulled image "k8s.gcr.io/liveness"
Normal Created 6m14s (x3 over 6m52s) kubelet, worker02.acorn.com Created container liveness
Normal Started 6m14s (x3 over 6m52s) kubelet, worker02.acorn.com Started container liveness
Normal Pulling 5m55s (x4 over 6m54s) kubelet, worker02.acorn.com Pulling image "k8s.gcr.io/liveness"
Warning Unhealthy 5m55s (x9 over 6m40s) kubelet, worker02.acorn.com Liveness probe failed: HTTP probe failed with statuscode: 500
Normal Killing 5m55s (x3 over 6m34s) kubelet, worker02.acorn.com Container liveness failed liveness probe, will be restarted
Warning BackOff 108s (x17 over 5m36s) kubelet, worker02.acorn.com Back-off restarting failed container
로그이벤트를 보면 Liveness Probe 가 실패해서 컨테이너를 재가동 하는 메시지가 보입니다.
뿐만아니라, 재가동 시에서 Pull image 를 통해 이미지를 다시 가져 와서 재가동 시키는 것을 볼 수 있습니다.
3. Replication Controller
3.1 Replication Controller 생성
아래와 같이 template를 작성합니다.
apiVersion: v1
kind: ReplicationController
metadata:
name: goapp-rc
spec:
replicas: 3
selector:
app: goapp
template:
metadata:
name: goapp-pod
labels:
tier: forntend
app: goapp
env: prod
priority: high
spec:
containers:
- name: goapp-container
image: chungsju/goapp
ports:
- containerPort: 8080
3.2 Pod 생성
kubectl create -f ./rc-goapp.yaml
3.3 Pod 생성 확인
kubectl get po
NAME READY STATUS RESTARTS AGE
goapp-rc-9q689 1/1 Running 0 39s
goapp-rc-d5rnf 1/1 Running 0 39s
goapp-rc-fm7kr 1/1 Running 0 39s
3.4 Replication Controller 확인
kubectl get rc
NAME DESIRED CURRENT READY AGE
goapp-rc 3 3 3 58s
kubectl get rc -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
goapp-rc 3 3 3 72s goapp-container chungsju/goapp app=goapp
3.5 특정 Pod 삭제하고 변화 확인하기
아래와 같이 3개의 Pod 중에 하나를 선택해서 삭제 합니다.
kubectl deleete pod goapp-rc-9q689
kubectl get pod
NAME READY STATUS RESTARTS AGE
goapp-rc-d5rnf 1/1 Running 0 2m
goapp-rc-fm7kr 1/1 Running 0 2m
goapp-rc-szv2r 1/1 ContainerCreating 0 6s
기존 컨테이너를 Terminating 하고 새로운 컨테이너를 생성하는 것을 볼 수 있습니다.
3.6 Pod 정보를 라벨과 함께 출력해보기
kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
goapp-rc-d5rnf 1/1 Running 0 7m26s app=goapp
goapp-rc-fm7kr 1/1 Running 0 7m26s app=goapp
goapp-rc-szv2r 1/1 Running 0 4m51s app=goapp
3.7 Pod 라벨을 변경해보기
기존 "app=nginx" 라는 label 을 "app=goapp-exit" 로 변경 합니다.
kubectl label pod goapp-rc-szv2r app=goapp-exit --overwrite
아래와 같이 pod 를 조회 해봅니다.
kubectl get po
NAME READY STATUS RESTARTS AGE
goapp-rc-d5rnf 1/1 Running 0 8m49s
goapp-rc-fm7kr 1/1 Running 0 8m49s
goapp-rc-mmn2b 0/1 ContainerCreating 0 5s
goapp-rc-szv2r 1/1 Running 0 6m14s
기존 3개의 Pod 중 하나의 Label을 변경하면 기존 app=goapp 에는 2개의 Pod 만 남기 때문에 Replication Controller 는 추가적으로 하나의 Pod 를 생성 합니다.
NAME READY STATUS RESTARTS AGE LABELS
goapp-rc-d5rnf 1/1 Running 0 9m27s app=goapp
goapp-rc-fm7kr 1/1 Running 0 9m27s app=goapp
goapp-rc-mmn2b 1/1 Running 0 43s app=goapp
goapp-rc-szv2r 1/1 Running 0 6m52s app=goapp-exit
3.8 Pod Template 변경 해보기
아래와 같이 Pod Template의 spec ➢ spec ➢ containers ➢ image 항목을 chungsju/goapp-v2 로 변경 합니다.
kubectl edit rc nginx
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
kind: ReplicationController
metadata:
creationTimestamp: "2020-04-01T09:32:23Z"
generation: 1
labels:
app: goapp
name: goapp-rc
namespace: default
resourceVersion: "405444"
selfLink: /api/v1/namespaces/default/replicationcontrollers/goapp-rc
uid: 17198300-d964-4de6-a160-825a7a9c16bf
spec:
replicas: 3
selector:
app: goapp
template:
metadata:
creationTimestamp: null
labels:
app: goapp
name: goapp-pod
spec:
containers:
- image: chungsju/goapp-v2 # 이부분을 변경 합닏다.(기존 : chungsju/goapp)
imagePullPolicy: Always
name: goapp-container
ports:
- containerPort: 80
protocol: TCP
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
status:
availableReplicas: 3
fullyLabeledReplicas: 3
observedGeneration: 1
readyReplicas: 3
replicas: 3
저장후 편집기를 종료 합니다.
리눅스 편집기에는 다양한 종유가 있습니다. 만약 기본 편집기를 변경하고 싶으면
KUBE_EDITOR="/bin/nano" 를 $HOME/.bashrc 파일에 선언 해주면 원하는 편집기를 사용 할수 있습니다.
3.9 Pod Template 를 적용하기 위해 임의의 Pod 삭제하기
kubectl get pod
goapp-rc-mvw57 1/1 Running 0 3h6m 10.36.0.2 worker02.acorn.com
goapp-rc-qkrpw 1/1 Running 0 6m26s 10.32.0.2 worker01.acorn.com
goapp-rc-x6q4d 1/1 Running 0 3h6m 10.36.0.1 worker02.acorn.com
Pod 삭제
kubectl delete pod goapp-rc-mvw57
pod "goapp-rc-mvw57" deleted
Pod 확인
kubectl get pod
NAME READY STATUS RESTARTS AGE
goapp-rc-bf2xk 0/1 ContainerCreating 0 8s
goapp-rc-qkrpw 1/1 Running 0 7m5s
goapp-rc-x6q4d 1/1 Running 0 3h7m
kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
goapp-rc-bf2xk 1/1 Running 0 21s 10.32.0.3 worker01.acorn.com
goapp-rc-qkrpw 1/1 Running 0 7m18s 10.32.0.2 worker01.acorn.com
goapp-rc-x6q4d 1/1 Running 0 3h7m 10.36.0.1 worker02.acorn.com
접속 해보기
# chungsju/goapp
curl http://10.32.0.2:8080
hostname: goapp-rc-qkrpw
# chungsju/goapp-v3
curl http://10.32.0.3:8080
hostname: goapp-rc-bf2xk
version: goapp-v2
3.10 Pod 스케일링
-
Template 변경을 통한 스케일링
아래와 같이 goapp-rc 를 edit 명령으로 수정 합니다. (replicas 항목을 3에서 4로 수정)
kubectl edit rc goapp-rc
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
kind: ReplicationController
metadata:
creationTimestamp: "2020-04-01T09:51:49Z"
generation: 3
labels:
app: goapp
name: goapp-rc
namespace: default
resourceVersion: "416408"
selfLink: /api/v1/namespaces/default/replicationcontrollers/goapp-rc
uid: 23f58f51-88ab-4828-9a76-cde8a646fff4
spec:
replicas: 4 # 이부분을 변경 합니다. (기존 : 3)
selector:
app: goapp
template:
metadata:
creationTimestamp: null
labels:
app: goapp
name: goapp-pod
spec:
containers:
- image: chungsju/goapp-v2
imagePullPolicy: Always
name: goapp-container
ports:
저장 한다음 Pod 및 RC 확인
kubectl get pod
NAME READY STATUS RESTARTS AGE
goapp-rc-bf2xk 1/1 Running 0 19m
goapp-rc-mr6kb 0/1 ContainerCreating 0 7s
goapp-rc-qkrpw 1/1 Running 0 26m
goapp-rc-x6q4d 1/1 Running 0 3h26m
kubectl get rc
NAME DESIRED CURRENT READY AGE
goapp-rc 4 4 4 4h17m
- 명령어를 통한 스케일링
명령어를 이용해서 스케일링을 수행 할 수 있습니다.
kubectl scale rc goapp-rc --replicas=5
실제로 Pod 가 늘어 났는지 확인해봅니다.
kubectl get pod
NAME READY STATUS RESTARTS AGE
goapp-rc-bf2xk 1/1 Running 0 72m
goapp-rc-dlgfc 0/1 ContainerCreating 0 4s
goapp-rc-mr6kb 1/1 Running 0 53m
goapp-rc-qkrpw 1/1 Running 0 79m
goapp-rc-x6q4d 1/1 Running 0 4h19m
3.11 Replication Controller 삭제
Replication Controller 와 POD 모두 삭제
kubectl delete rc goapp-rc
Replication Controller 만 삭제. POD 는 그대로 유지 합니다.
kubectl delete rc goapp-rc --cascade=false
4.ReplicaSet
4.1 RS 생성
Selector 를 작성 할때 ForntEnd 이고 운영계 이면서 중요도가 High 인 POD 에 대해 RS 를 생성 합니다.
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: frontend
labels:
app: guestbook
tier: frontend
spec:
replicas: 3
selector:
matchLabels:
tier: frontend
matchExpressions:
- {key: env, operator: In, values: [prod]}
- {key: priority, operator: NotIn, values: [low]}
template:
metadata:
labels:
tier: frontend
env: prod
priority: high
spec:
containers:
- name: php-redis
image: gcr.io/google_samples/gb-frontend:v3
4.2 RS 확인
$ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE
frontend-bstms 1/1 Running 0 53s 10.32.2.7 gke-gke1-default-pool-ad44d907-cq8j
frontend-d4znb 1/1 Running 0 53s 10.32.2.9 gke-gke1-default-pool-ad44d907-cq8j
frontend-rv9bl 1/1 Running 0 53s 10.32.2.8 gke-gke1-default-pool-ad44d907-cq8j
$ kubectl get rs -o wide
AME READY STATUS RESTARTS AGE IP NODE
frontend-bstms 1/1 Running 0 68s 10.32.2.7 gke-gke1-default-pool-ad44d907-cq8j
frontend-d4znb 1/1 Running 0 68s 10.32.2.9 gke-gke1-default-pool-ad44d907-cq8j
frontend-rv9bl 1/1 Running 0 68s 10.32.2.8 gke-gke1-default-pool-ad44d907-cq8j
$ kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
frontend-bstms 1/1 Running 0 107s env=prod,priority=high,tier=frontend
frontend-d4znb 1/1 Running 0 107s env=prod,priority=high,tier=frontend
frontend-rv9bl 1/1 Running 0 107s env=prod,priority=high,tier=frontend
[[Exercise]
- Nginx:1.18 Pod 3개로 구성된 Replication Controller를 작성 하세요
- Replication Controller 만 삭제 하세요(Pod 는 유지)
- 남겨진 Nginx Pod를 관리하는 ReplicaSet 을 작성하된 replica 4개로 구성 하시요
- Nginx Pod 를 6개로 Scale Out 하세요
5.Deployment
5.1 Deployment 생성
아래와 같이 nginx 를 서비스 하고 replica 가 3개인 Deployment 를 작성합니다.(nginx-deploy.yaml)
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
kubectl apply -f ./nginx-deploy.yaml
5.2 Deployment 확인
kubectl get pod,rs,deploy
NAME READY STATUS RESTARTS AGE
pod/nginx-deployment-54f57cf6bf-dpsn4 1/1 Running 0 30s
pod/nginx-deployment-54f57cf6bf-ghfwm 1/1 Running 0 30s
pod/nginx-deployment-54f57cf6bf-rswwk 1/1 Running 0 30s
NAME DESIRED CURRENT READY AGE
replicaset.apps/nginx-deployment-54f57cf6bf 3 3 3 30s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx-deployment 3/3 3 3 30s
5.3 이미지 업데이트
- 기본 방식
kubectl --record deployment.apps/nginx-deployment set image deployment.v1.apps/nginx-deployment nginx=nginx:1.9.1
- 단축 방식
kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1 --record
- yaml 파일 수정(.spec.template.spec.containers[0].image 변경)
kubectl edit deployment.v1.apps/nginx-deployment
- 롤아웃
kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.7.9 --record
5.4 Deployment ScaleOut
kubectl scale deploy nginx-deployment –replicas=4
goapp-deployment-5857594fbb-2hhnv 1/1 Running 0 32m
goapp-deployment-5857594fbb-6s9lx 1/1 Running 0 6s
goapp-deployment-5857594fbb-7nqsg 1/1 Running 0 32m
goapp-deployment-5857594fbb-9b28s 1/1 Running 0 32m
5.5 deployment 확인 하기
- 롤아웃 확인
kubectl rollout status deployment.v1.apps/nginx-deployment
kubectl rollout history deployment.v1.apps/nginx-deployment
- deployment 상세 확인
kubectl describe deploy nginx-deployment
5.6 deployment 롤백
- 롤아웃 확인
kubectl rollout undo deployment nginx-deployment --to-revision 3