포스팅 목차
nginx app 간단하게 배포해보기
nginx app 배포 하기
ps0107@k8smaster1:~$ kubectl create deployment nginx --image=nginx
deployment.apps/nginx created
현재 클러스터의 event 확인
ps0107@k8smaster1:~$ kubectl get events
LAST SEEN TYPE REASON OBJECT MESSAGE
29s Normal Scheduled pod/nginx-554b9c67f9-cncvz Successfully assigned default/nginx-554b9c67f9-cncvz to k8sworker1
27s Normal Pulling pod/nginx-554b9c67f9-cncvz Pulling image "nginx"
21s Normal Pulled pod/nginx-554b9c67f9-cncvz Successfully pulled image "nginx"
20s Normal Created pod/nginx-554b9c67f9-cncvz Created container nginx
19s Normal Started pod/nginx-554b9c67f9-cncvz Started container nginx
29s Normal SuccessfulCreate replicaset/nginx-554b9c67f9 Created pod: nginx-554b9c67f9-cncvz
29s Normal ScalingReplicaSet deployment/nginx Scaled up replica set nginx-554b9c67f9 to 1
nginx object의 자세한 정보를 확인
ps0107@k8smaster1:~$ kubectl describe deployment nginx
Name: nginx
Namespace: default
CreationTimestamp: Tue, 28 Jan 2020 10:10:43 +0000
Labels: app=nginx
Annotations: deployment.kubernetes.io/revision: 1
Selector: app=nginx
Replicas: 1 desired | 1 updated | 1 total | 1 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=nginx
Containers:
nginx:
Image: nginx
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets: <none>
NewReplicaSet: nginx-554b9c67f9 (1/1 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 71s deployment-controller Scaled up replica set nginx-554b9c67f9 to 1
yaml 파일 템플릿 만드는 3가지 방법
명령어 | 리소스 생성 | 설명 |
$ kubectl get deployment nginx -o yaml | 필요 | 템플릿 내용 중에서 아래 라인 삭제하여 사용 -- createTimestamp -- resourceVersion -- selfLink -- uid -- status 포함 아래 전체 |
$ kubectl get deployment nginx --export | 필요 | 템플릿 내용 그대로 사용 가능. 필요한 부분만 수정해서 사용. |
$ kubectl create deployment nginx --dry-run | 필요없음 | 실제 object를 생성하지 않고 yaml 파일 템플릿을 얻을 수 있음. |
-o 옵션을 nginx object의 정보를 yaml 형태로 볼수 있다
ps0107@k8smaster1:~$ kubectl get deployment nginx -o yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "1"
creationTimestamp: "2020-01-28T10:10:43Z"
generation: 1
labels:
app: nginx
name: nginx
namespace: default
resourceVersion: "8641"
selfLink: /apis/extensions/v1beta1/namespaces/default/deployments/nginx
uid: 7de7b7fa-7897-45e8-af80-7fa18af75220
spec:
progressDeadlineSeconds: 600
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
app: nginx
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
app: nginx
spec:
containers:
- image: nginx
imagePullPolicy: Always
name: nginx
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
status:
availableReplicas: 1
conditions:
- lastTransitionTime: "2020-01-28T10:10:53Z"
lastUpdateTime: "2020-01-28T10:10:53Z"
message: Deployment has minimum availability.
reason: MinimumReplicasAvailable
status: "True"
type: Available
- lastTransitionTime: "2020-01-28T10:10:43Z"
lastUpdateTime: "2020-01-28T10:10:53Z"
message: ReplicaSet "nginx-554b9c67f9" has successfully progressed.
reason: NewReplicaSetAvailable
status: "True"
type: Progressing
observedGeneration: 1
readyReplicas: 1
replicas: 1
updatedReplicas: 1
--dry-run 옵션을 사용하면 현재 object resource 가 없더라도 템플릿을 얻을수 있다.
ps0107@k8smaster1:~$ kubectl create deployment two --image=nginx --dry-run -o yaml
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: two
name: two
spec:
replicas: 1
selector:
matchLabels:
app: two
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: two
spec:
containers:
- image: nginx
name: nginx
resources: {}
status: {}
--export 옵션을 사용하여 현재 nginx 객체에서 필요없는 부분이 삭제 되어 템플릿을 보여준다.
ps0107@k8smaster1:~$ kubectl get deployments nginx --export -o yaml
Flag --export has been deprecated, This flag is deprecated and will be removed in future.
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "1"
creationTimestamp: null
generation: 1
labels:
app: nginx
name: nginx
selfLink: /apis/extensions/v1beta1/namespaces/default/deployments/nginx
spec:
progressDeadlineSeconds: 600
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
app: nginx
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
app: nginx
spec:
containers:
- image: nginx
imagePullPolicy: Always
name: nginx
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
status: {}
nginx app 서비스 expose 해보기
참고로 nginx expose 후 ifconfig로 인터페이스를 보면 calico 인터페이스가 두개 생성이 되는것을 볼수 있다.
nginx 서비스 expose를 시도했으나 컨테이너 포트 미지정으로 에러 발생.
ps0107@k8smaster1:~$ kubectl expose deployment/nginx
error: could not find port via --port flag or introspection
See kubectl expose -h for help and examples
-o 옵션으로 현재 nginx 리소스의 템플릿 파일 만듬.
ps0107@k8smaster1:~$ kubectl get deployment nginx -o yaml > nginx_1.yaml
만들어진 템플릿 파일에 필요 없는 부분 삭제하 아래와 같이 container port 부분 추가
ps0107@k8smaster1:~$ vi nginx_1.yaml
....
spec:
containers:
- image: nginx
imagePullPolicy: Always
name: nginx
ports:
- containerPort: 80
protocol: TCP
resources: {}
....
수정된 yaml 파일로 nginx update
replace 옵션: 해당 yaml 파일에 내용으로 전체 update, 새로운 deployment를 생성하고 기존 것을 terminate 시킴
ps0107@k8smaster1:~$ kubectl replace -f nginx_1.yaml
deployment.extensions/nginx replaced
AGE 부분 보면 새로 생성된것에 대해 확인이 가능하다.
ps0107@k8smaster1:~$ kubectl get deployment,pod
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.extensions/nginx 1/1 1 1 49m
NAME READY STATUS RESTARTS AGE
pod/nginx-7bffc778db-6bhr6 1/1 Running 0 2m9s
다시 서비스 expose 해본다.
이번에 정상적으로 됐다.
ps0107@k8smaster1:~$ kubectl expose deployment/nginx
service/nginx exposed
nginx svc 조회
ps0107@k8smaster1:~$ kubectl get svc nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx ClusterIP 10.97.139.18 <none> 80/TCP 13s
nginx endpoint 조회 (endpoint는 pod ip + container port)
ps0107@k8smaster1:~$ kubectl get ep nginx
NAME ENDPOINTS AGE
nginx 192.168.1.3:80 25s
nginx cluster ip로 curl 테스트
ps0107@k8smaster1:~$ curl 10.97.139.18:80
Welcome to nginx!
nginx endpoint 로 curl 테스트
ps0107@k8smaster1:~$ curl 192.168.1.3:80
Welcome to nginx!
nginx web server를 scale out 해보기
replicas를 3으로 조정해보고 확인해보자.
3개의 pod가 생성된것을 확인할 수 있다.
ps0107@k8smaster1:~$ kubectl scale deployment nginx --replicas=3
deployment.extensions/nginx scaled
ps0107@k8smaster1:~$ kubectl get deployment nginx
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 3/3 3 3 15h
endpoint도 pod 갯수대로 생성이 되었다.
ps0107@k8smaster1:~$ kubectl get ep nginx
NAME ENDPOINTS AGE
nginx 192.168.0.10:80,192.168.1.3:80,192.168.1.4:80 14h
3개의 pod정보를 확인할 수 있다.
예전에 생성된거 1개 제외하고 2개가 추가로 생성되었다.
ps0107@k8smaster1:~$ kubectl get po -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-7bffc778db-4zbb2 1/1 Running 0 42s 192.168.1.4 k8sworker1 <none> <none>
nginx-7bffc778db-6bhr6 1/1 Running 0 14h 192.168.1.3 k8sworker1 <none> <none>
nginx-7bffc778db-zvlft 1/1 Running 0 42s 192.168.0.10 k8smaster1 <none> <none>
예전에 생성된 pod를 삭제해 보자.
ps0107@k8smaster1:~$ kubectl delete po nginx-7bffc778db-6bhr6
pod "nginx-7bffc778db-6bhr6" deleted
# pod가 새로 생성이 되었다.
ps0107@k8smaster1:~$ kubectl get po -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-7bffc778db-4zbb2 1/1 Running 0 2m45s 192.168.1.4 k8sworker1 <none> <none>
nginx-7bffc778db-svxw2 1/1 Running 0 29s 192.168.1.5 k8sworker1 <none> <none>
nginx-7bffc778db-zvlft 1/1 Running 0 2m45s 192.168.0.10 k8smaster1 <none> <none>
# endpoint도 새로 생성된걸 확인 할 수있다.
ps0107@k8smaster1:~$ kubectl get ep nginx
NAME ENDPOINTS AGE
nginx 192.168.0.10:80,192.168.1.4:80,192.168.1.5:80 14h
cluster ip로 curl 테스트 해보면 3개의 pod로 분산되어 들어간다.
# 클러스터 외부에서 접근할 수 있도록 설정해보기
현재 pod 정보를 살펴보자.
ps0107@k8smaster1:~$ kubectl get po
NAME READY STATUS RESTARTS AGE
nginx-7bffc778db-4zbb2 1/1 Running 0 37m
nginx-7bffc778db-svxw2 1/1 Running 0 35m
nginx-7bffc778db-zvlft 1/1 Running 0 37m
pod 안에 환경설정 정보를 확인해본다 (KUBERNETES란 네이밍이 들어간 것만)
ps0107@k8smaster1:~$ kubectl exec nginx-7bffc778db-4zbb2 -- printenv | grep KUBERNETES
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_SERVICE_HOST=10.96.0.1
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT_443_TCP_PROTO=tcp
현재 svc 정보를 확인해 보자.
ps0107@k8smaster1:~$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 17h
nginx ClusterIP 10.97.139.18 <none> 80/TCP 14h
다시 생성하기 위해서 nginx svc 리소스를 삭제 해준다.
ps0107@k8smaster1:~$ kubectl delete svc nginx
service "nginx" deleted
이번엔 LoadBalancer 타입으로 생성해준다.
ps0107@k8smaster1:~$ kubectl expose deployment nginx --type=LoadBalancer
service/nginx exposed
생성된 것을 확인할 수 있다.
참고로 external-ip는 eks 같은 클라우드 서비스를 쓸 경우 elb 주소가 들어간다.
현재는 없으므로 pending 상태이다. 대신 node port 하나가 생성되었다 (31325 port)
ps0107@k8smaster1:~$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 17h
nginx LoadBalancer 10.103.105.106 <pending> 80:31325/TCP 8s
웹브라우저를 통해서 http://{노드아이피}:{노드포트} 로 접속하면 nginx 화면을 볼수 있다.
3개의 pod로 분산되어 들어가게 된다.
replicas를 0으로 해서 다시 접속하면 웹접속은 실패할 것이다.
실습 후 이제 리소스를 정리해본다.
상위 객체 삭제시 하위객체까지 삭제되고, 하위 객체 삭제시 상위객체는 남아 있게 된다.
ps0107@k8smaster1:~$ kubectl delete deployments nginx
deployment.extensions "nginx" deleted
ps0107@k8smaster1:~$ kubectl delete ep nginx
endpoints "nginx" deleted
ps0107@k8smaster1:~$ kubectl delete svc nginx
service "nginx" deleted
참조) CKA 대비 간단 실습
01. kubeadm 을 이용한 설치 및 세팅
02. kubernetes 클러스터 노드 확장 및 셋팅
03. 간단한 application 배포, yaml템플릿, 서비스 expose 해보기
04. deployment 의 CPU, Memory 제약
05. namespace 를 위한 resource limit 설정
06. 좀더 복잡한 deployment 배포해보기
07. 기본 Node 의 maintenance (유지보수)
08. API AND ACCESS
09. API 객체
10. Managing State with Deployments
11. Service Resource
12. Volumes and Data : ConfigMap 간단 테스트
13. PV 와 PVC 생성
14. ResourceQuota 사용 (PVC Count 와 Usage를 제한)
15. ingress 간단 실습
16. Scheduling - label 사용한 pod 할당
17. Scheduling - Taint를 이용한 pod 배포 관리
18. 로깅과 트러블슈팅 : 로그위치와 로그 출력 보기
19. 로깅과 트러블슈팅 : Metrics와 DashBoard
20. CRD (Custom Resource Definition)
21. helm
22. Security - TLS
23. Security - Authentication, Authorization, Admission
24. HA(High Availability) 구성 - master node