Repository navigation
Azure Container Orchestratoin #2
manchiro edited this page Jul 15, 2020
·
15 revisions
- Azure는 구독 기반에 과금 차징을 함.
- AZure 포탈에서 리소스 그룹 > 쿠버네티스 서비스 생성 > 컨테이너 레지스트리 생성
- Azure (http://portal.azure.com) : admin5@gkn2019hotmail.onmicrosoft.com / skcc*
- 리소스 그룹명 : admin5-Resource_Group
- Kubernetes 서비스 : admin5-k8s
- Azure 컨테이너 레지스트리 : admin5acr, admin5acr.azurecr.io
# az account set --subscription "종량제1"
# az aks get-credentials --resource-group admin5-Resource_Group --name admin5-k8s
# az acr login --name admin5acr
# az aks update -n admin5-k8s -g admin5-Resource_Group --attach-acr admin5acr
# nano Dockerfile - Dockerfile 생성
# docker build -t admin5acr.azurecr.io/my-nginx:v2 - docker build
# docker images : docker images 확인
# docker push admin5acr.azurecr.io/my-nginx:v2 : docker를 리파지토리에 push
# kubectl create deploy my-nginx --image=admin5acr.azurecr.io/my-nginx:v2 - AZure portal 에서 확인
# kubectl create -f nginx.yaml
# kubectl apply -f nginx.yaml
# kubectl 동사 목적어
# kubectl get nodes - 클러스터에 만들어 진 노드의 수 (worker nodes. VM. 서버)
# kubectl get pod
# kubectl get pod -o wide - Output을 좀더 많이 출력. node 정보도 같이 보여짐.- 컨테이너의 자동 배포
- Self Healing - Nonn Terminating
# kubectl create deploy my-nginx --image=admin5acr.azurecr.io/my-nginx:v2
# kubectl expose deploy my-nginx --type=LoadBalancer --port=80 : 외부에 오픈. type 을 LoadBalancer로 주어야 External IP로 되어야 함.
skccadmin@SKCC18D00132:~/container-orchestration/yaml$ kubectl get all
NAME READY STATUS RESTARTS AGE
pod/my-nginx-74dcffd6ff-xcp4h 1/1 Running 0 3m5s
pod/nginx-deployment-54f57cf6bf-78pp9 1/1 Running 0 27m
pod/nginx-deployment-54f57cf6bf-svn8x 1/1 Running 0 18m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 38m
service/my-nginx LoadBalancer 10.0.159.90 40.82.129.79 80:30236/TCP 13s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/my-nginx 1/1 1 1 3m5s
deployment.apps/nginx-deployment 2/2 2 2 27m
NAME DESIRED CURRENT READY AGE
replicaset.apps/my-nginx-74dcffd6ff 1 1 1 3m5s
replicaset.apps/nginx-deployment-54f57cf6bf 2 2 2 27m- External IP 로 브라우저에서 조회하면 index.html 내용이 조회됨. http://40.82.129.79
- kubectl describe pod pod명 : 어떻게 생성되었는지 이력
- kubectl logs pod명 -f : kube로그로 확인
- kubectl exec -it pod명 -- /bin/bash : POD로그 확인
- Azure Portal 에서 > 쿠버네티스 서비스 > 나의 클러스터서비스 선택 > 노드풀 > 내가 선택한 "admin5-k8s | 노드 풀" 선택하면 상세 내용 조회 가능.
- RAM(GiB) : 1초/1byte가 돈이기 때문에 정확한 사이즈를 표현하기 위해서 사용하는 단위임. Gibibyte.
- kubectl scale type/type명 --replicas=개수
- kubectl scale replicaset/frontend --replicas=5 : replica 개수 조정
- kubectl scale deployment/my-nginx --replicas=3
- 노드의 수를 늘리고 줄이는 것은 Scale out/in 이고,
- 노드의 성능을 늘리고 줄이는 것은 Scale Up/Down 이다
- CF) deployment의 버젼을 변경하는 방법
- kubectl delete deployment ... 삭제 하고 다시 생성
- kubectl apply -f yaml 명 --- 다시 반영
- kubectl set image .. 로 변경
kubectl set image deployment/nginx deployment nginx=nginx:1.9.1
- 변경하기
CF) kubectl edit deployment nginx-deployment
skccadmin@SKCC18D00132:~/container-orchestration/yaml/replicaset$ kubectl set image deploy nginx-deployment nginx=nginx:1.9.1
skccadmin@SKCC18D00132:~/container-orchestration/yaml/replicaset$ kubectl get deployment -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
my-nginx 2/2 2 2 3h17m my-nginx admin5acr.azurecr.io/my-nginx:v2 app=my-nginx
my-nginx3 0/1 1 0 169m nginx manchiro/nginx app=my-nginx3
nginx-deployment 2/2 2 2 3h41m nginx nginx:1.9.1 app=nginx
# kubectl rollout history deploy nginx-deployment
deployment.apps/nginx-deployment
REVISION CHANGE-CAUSE
1 <none>
2 v2 is nginx:1.9.1
# kubectl rollout undo deploy nginx-deployment - 이전버전으로 다시 올림
deployment.apps/nginx-deployment
REVISION CHANGE-CAUSE
2 v2 is nginx:1.9.1
3 <none>- (오토 스케일링 설정, hpa: HorizontalPodAutoscaler )
> kubectl top pods
> kubectl top nodes
> kubectl apply -f https://k8s.io/examples/application/php-apache.yaml - apache 생성 :
> kubectl autoscale deployment php-apache --cpu-percent=20 --min=1 --max=10
> kubectl get hpa php-apache -o yamlspec:
maxReplicas: 10
minReplicas: 1
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: php-apache
targetCPUUtilizationPercentage: 20
status:
currentCPUUtilizationPercentage: 0
currentReplicas: 1
desiredReplicas: 1- 부하를 발생하는 방법 : 중 조심해야 할것 . External IP 로 만든 후 호출하지 말아라.
- 클라우드 내에서 테스트를 해라.
> kubectl create -f siege.yaml
> kubectl exec -it siege -- /bin/bash
> siege -c30 -t30S -v http://php-apache : -C 30명의 사용자가 -t 30초 동안 http 서비스를 호출해라.- Recreate : 다운하고 배포하고 스타트.
- Ramped (=Rolling Update) : 깜박이면서, 하나씩 순차적으로 배포함 (k8s의 기본 배포 전략).
- Blue/Green : 현재 서비스는 Blue. 새로운 서비스는 Green. Zero Downtime이 발생하지만 비용이 발생함. (*예상문제)
- Canary : 새로운 버젼을 배포 후, 특정 Request만 사용하도록 설정.
- A/B Testing
- Shadow
# kubectl create ns admin5
# kubectl create deploy my-nginx4 --image=nginx -n admin5
# kubectl expose deploy my-nginx3 --type=LoadBalancer --port=80 -n=admin5
# kubectl get all -n=admin5
skccadmin@SKCC18D00132:~/container-orchestration/yaml/replicaset$ kubectl get all -n=admin5
NAME READY STATUS RESTARTS AGE
pod/my-nginx3-9d6bb446b-7qsdw 1/1 Running 0 2m38s
pod/my-nginx3-9d6bb446b-l8vtj 1/1 Running 0 2m38s
pod/my-nginx3-9d6bb446b-m7f6c 1/1 Running 0 6m56s
pod/my-nginx3-9d6bb446b-str45 1/1 Running 0 2m38s
pod/my-nginx3-9d6bb446b-whdfg 1/1 Running 0 2m38s
pod/my-nginx4-6fc7f8b4f8-9wz9v 1/1 Running 0 5m18s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/my-nginx3 LoadBalancer 10.0.242.183 <pending> 80:31012/TCP 3s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/my-nginx3 5/5 5 5 6m56s
deployment.apps/my-nginx4 1/1 1 1 5m18s
NAME DESIRED CURRENT READY AGE
replicaset.apps/my-nginx3-9d6bb446b 5 5 5 6m56s
replicaset.apps/my-nginx4-6fc7f8b4f8 1 1 1 5m18s
# kubectl delete deploy,service,pod --all
- Service 는 클라이언트가 애플리케이션에 접근하는 Kubernetes 의 채널로 런타임시 , 이를 검색할 수 있는 방법이 필요
- Service 생성 시 IP 주소 할당 방식과 서비스 연계 등에 따라 4 가지로 구분
- ClusterIP
- NodePort
- LoadBalancer
- ExternalName
- G/W 역할을 하는 한개만 만들게 됨. 비용과 관련이 있음. 보안. 나머지 파트는 토큰만 체크하도록 하면 됨.
- IngressControlor는 : NodePort Type으로 생성함.
- 클라우드내 서비스 URL
- --- : 객체의 구분자
- -- : array
curl [서비스명].[namespace].[서핏스]
- 예
- 쿠버네티스는 여러 호스트에 걸처 Stateless 한 컨테이너를 마이크로서비스로 배포하는 것이 목표이기에 영속성 있는 저장장치 (Persistent Value)를 고려해야 함.
- PV vs PVC
- PV : 정의된 용량만큼 pod를 사용할 수 있음.
- provisioning : POD가 원하는 만큼의 스토리지를 인프라 적으로 설정하는 것.
skccadmin@SKCC18D00132:~/container-orchestration/yaml$ kubectl get storageclass (=sc)
NAME PROVISIONER AGE
azurefile kubernetes.io/azure-file 23h
azurefile-premium kubernetes.io/azure-file 23h
default (default) kubernetes.io/azure-disk 5h55m
managed-premium kubernetes.io/azure-disk 5h55m (SSD 기반)- 컨테이너 이미지로부터 설정 정보를 분리할 수 있게 해줌.
- 동일한 이미지로 개발/운영에 불변하게 설정하기 위함.
- https://workflowy.com/s/msa/27a0ioMCzlpV04Ib#/6ce6be6e8804
$ docker build -t admin5acr.azurerc.io/cm-sandbox:v1 .
$ docker push admin5acr.azurerc.io/cm-sandbox:v1
# 위 2 명령행을 아래 하나의 명령으로 수행 가능
$ az acr build --registry admin5acr --image admin5acr.azurecr.io/cm-sandbox:v1 .
$ - ConfigMap 이 일반적인 환경 설정 정보나 Config 정보를 저장하도록 디자인 되었다면 , 보안이 중요한 패스워드나 API 키 , 인증서 파일들은 Secret 에 저장
skccadmin@SKCC18D00132:~/container-orchestration/yaml/configmap$ echo test | base64
dGVzdAo=
skccadmin@SKCC18D00132:~/container-orchestration/yaml/configmap$ echo dGVzdAo= | base64 --decode
test
$ az acr build --registry admin5acr --image cm-sandbox:v2 .
- Master에 저장되고 2M의 제약이 있음.
- pod가 platform에게 상태를 주기적으로 알려주는 서비스임.
- Probe Types : 체크하는 방식 - Command probe, HTTP probe, TCP probe
- Liveness Probes
- Readiness Probes : 준비가 되었는지 확인해서 준비가 되면 Traffice을 전달함.
- autoscale out 되는 중 서비스를 보내지 않음.
- Difference between Liveness and Readiness
- Liveness probe 는 컨테이너의 상태가 비정상이라고 판단하면 , 해당 Pod 를 재시작하는데 반해
- Readiness probe 는 컨테이너가 비정상일 경우에는, 해당 Pod 를 사용할 수 없음으로 표시하고 , 서비스등에서 제외한다.
"머리는 차갑게, 가슴은 따뜻하게" | [Top]