Skip to content

Azure Container Orchestratoin #2

manchiro edited this page Jul 15, 2020 · 15 revisions

day1 day2 day3

Azure 실습

  • 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 정보도 같이 보여짐.

1. Kubernetes Basic Objects

1.1 Master가 하는일

  • 컨테이너의 자동 배포
  • Self Healing - Nonn Terminating

1.2 이미지를 통한 어플리케이션 배포

# 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

1.3 Cloud Trouble Shooting

  1. kubectl describe pod pod명 : 어떻게 생성되었는지 이력
  2. kubectl logs pod명 -f : kube로그로 확인
  3. kubectl exec -it pod명 -- /bin/bash : POD로그 확인

1.4 클라우드 서비스 성능 확인

  • Azure Portal 에서 > 쿠버네티스 서비스 > 나의 클러스터서비스 선택 > 노드풀 > 내가 선택한 "admin5-k8s | 노드 풀" 선택하면 상세 내용 조회 가능.
  • RAM(GiB) : 1초/1byte가 돈이기 때문에 정확한 사이즈를 표현하기 위해서 사용하는 단위임. Gibibyte.

1.5 ReplicaSets

  • kubectl scale type/type명 --replicas=개수
    • kubectl scale replicaset/frontend --replicas=5 : replica 개수 조정
    • kubectl scale deployment/my-nginx --replicas=3

1.6 Rolling update

  • 노드의 수를 늘리고 줄이는 것은 Scale out/in 이고,
  • 노드의 성능을 늘리고 줄이는 것은 Scale Up/Down 이다
  • CF) deployment의 버젼을 변경하는 방법
    1. kubectl delete deployment ... 삭제 하고 다시 생성
    2. kubectl apply -f yaml 명 --- 다시 반영
    3. 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 yaml
spec:
  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 서비스를 호출해라.

1.7 배포전략

  • Recreate : 다운하고 배포하고 스타트.
  • Ramped (=Rolling Update) : 깜박이면서, 하나씩 순차적으로 배포함 (k8s의 기본 배포 전략).
  • Blue/Green : 현재 서비스는 Blue. 새로운 서비스는 Green. Zero Downtime이 발생하지만 비용이 발생함. (*예상문제)
  • Canary : 새로운 버젼을 배포 후, 특정 Request만 사용하도록 설정.
  • A/B Testing
  • Shadow

1.8 Namespaces

# 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

1.9 Services

1.9.1 Service Discovery

  • Service 는 클라이언트가 애플리케이션에 접근하는 Kubernetes 의 채널로 런타임시 , 이를 검색할 수 있는 방법이 필요

1.9.2 ServiceType

  • Service 생성 시 IP 주소 할당 방식과 서비스 연계 등에 따라 4 가지로 구분
    • ClusterIP
    • NodePort
    • LoadBalancer
    • ExternalName
  • G/W 역할을 하는 한개만 만들게 됨. 비용과 관련이 있음. 보안. 나머지 파트는 토큰만 체크하도록 하면 됨.
  • IngressControlor는 : NodePort Type으로 생성함.
  • 클라우드내 서비스 URL
    • --- : 객체의 구분자
    • -- : array

    curl [서비스명].[namespace].[서핏스]

    • 예

    curl http://php-apache.default.svc.cluster.local

1.10 Volumes

  • 쿠버네티스는 여러 호스트에 걸처 Stateless 한 컨테이너를 마이크로서비스로 배포하는 것이 목표이기에 영속성 있는 저장장치 (Persistent Value)를 고려해야 함.

1.10.1 emptyDir (P.126)

1.10.2 PersistentVolume & PersistentVolumeClaim

  • 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  기반)

1.11 ConfigMap

1.11.1

$ 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 .
$ 

1.12 Secrets

  • 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의 제약이 있음.

1.13 Liveness Probes & Readiness Probes

  • 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 를 사용할 수 없음으로 표시하고 , 서비스등에서 제외한다.

Clone this wiki locally