2장. 애플리케이션 워크샵 배포
2.1. 워크샵 개요 링크 복사링크가 클립보드에 복사되었습니다!
클러스터를 프로비저닝한 후 이 워크샵에 따라 애플리케이션을 배포하여 컨테이너 기반 애플리케이션 배포 및 운영의 개념을 파악합니다.
2.1.1. 워크샵 목표 링크 복사링크가 클립보드에 복사되었습니다!
다음은 이 클러스터 생성 워크샵의 목적을 자세히 설명합니다.
- S2I(Source-to-Image) 및 Kubernetes 배포 오브젝트를 사용하여 Node.js 기반 애플리케이션 배포
- 소스 코드 변경 사항을 자동으로 푸시하도록 CD(Continuous Delivery) 파이프라인 설정
- 자동 복구 애플리케이션 경험
- ConfigMaps, 보안 및 환경 변수를 통해 구성 관리 살펴보기
- 영구 스토리지를 사용하여 Pod를 다시 시작할 때마다 데이터 공유
- Kubernetes 및 애플리케이션의 네트워킹 살펴보기
- AWS 및 Kubernetes 기능에서 Red Hat OpenShift Service에 대해 숙지
- Horizontal Pod Autoscaler(HPA)에서 로드를 기반으로 Pod 자동 스케일링
2.1.1.1. 사전 요구 사항 링크 복사링크가 클립보드에 복사되었습니다!
- AWS 클러스터의 프로비저닝된 Red Hat OpenShift Service
- OpenShift CLI(명령줄 인터페이스)
- GitHub 계정
2.1.2. OSToy 애플리케이션 정보 링크 복사링크가 클립보드에 복사되었습니다!
OSToy는 Kubernetes의 기능을 탐색할 수 있도록 AWS 클러스터의 Red Hat OpenShift Service에 배포하는 Node.js 애플리케이션입니다.
이 애플리케이션에는 다음을 수행할 수 있는 사용자 인터페이스가 있습니다.
- 로그에 메시지 쓰기 (stdout / stderr)
- 자동 복구 보기를 위해 의도적으로 애플리케이션 충돌
- 활성 상태 프로브 전환 및 OpenShift 동작 모니터링
- ConfigMaps, 보안 및 환경 변수 읽기
- 공유 스토리지에 연결된 경우 파일 읽기 및 쓰기
- 포함된 마이크로 서비스를 사용하여 네트워크 연결, 클러스터 내 DNS 및 intra-communication 확인
- HPA를 사용하여 Pod 자동 스케일링을 보려면 로드를 늘립니다.
2.1.2.1. OSToy UI 이해 링크 복사링크가 클립보드에 복사되었습니다!
- Pod 이름
- 홈: 애플리케이션 홈 페이지
- 영구 스토리지: 애플리케이션에 바인딩된 영구 볼륨에 데이터를 씁니다.
- 구성 맵: 애플리케이션 및 키:값 쌍에서 사용할 수 있는 ConfigMap을 표시합니다.
- 보안: 애플리케이션과 키:값 쌍에서 사용할 수 있는 시크릿을 표시합니다.
- ENV 변수: 애플리케이션에서 사용할 수 있는 환경 변수를 표시합니다.
- 네트워킹: 네트워킹 툴
- Pod 자동 확장: Pod 로드를 늘리고 HPA(horizontal Pod Autoscaler) 테스트
- ACK S3: 버킷에 오브젝트를 읽고 쓰기 위해 AWS S3와 통합
- 정보: 애플리케이션 정보
2.1.2.2. 랩 리소스 링크 복사링크가 클립보드에 복사되었습니다!
- OSToy 애플리케이션 소스 코드
- OSToy 프론트 엔드 컨테이너 이미지
- OSToy 마이크로 서비스 컨테이너 이미지
배포 정의 YAML 파일:
ostoy-frontend-deployment.yamlapiVersion: v1 kind: PersistentVolumeClaim metadata: name: ostoy-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi --- apiVersion: apps/v1 kind: Deployment metadata: name: ostoy-frontend labels: app: ostoy spec: selector: matchLabels: app: ostoy-frontend strategy: type: Recreate replicas: 1 template: metadata: labels: app: ostoy-frontend spec: # Uncomment to use with ACK portion of the workshop # If you chose a different service account name please replace it. # serviceAccount: ostoy-sa containers: - name: ostoy-frontend securityContext: allowPrivilegeEscalation: false runAsNonRoot: true seccompProfile: type: RuntimeDefault capabilities: drop: - ALL image: quay.io/ostoylab/ostoy-frontend:1.6.0 imagePullPolicy: IfNotPresent ports: - name: ostoy-port containerPort: 8080 resources: requests: memory: "256Mi" cpu: "100m" limits: memory: "512Mi" cpu: "200m" volumeMounts: - name: configvol mountPath: /var/config - name: secretvol mountPath: /var/secret - name: datavol mountPath: /var/demo_files livenessProbe: httpGet: path: /health port: 8080 initialDelaySeconds: 10 periodSeconds: 5 env: - name: ENV_TOY_SECRET valueFrom: secretKeyRef: name: ostoy-secret-env key: ENV_TOY_SECRET - name: MICROSERVICE_NAME value: OSTOY_MICROSERVICE_SVC - name: NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace volumes: - name: configvol configMap: name: ostoy-configmap-files - name: secretvol secret: defaultMode: 420 secretName: ostoy-secret - name: datavol persistentVolumeClaim: claimName: ostoy-pvc --- apiVersion: v1 kind: Service metadata: name: ostoy-frontend-svc labels: app: ostoy-frontend spec: type: ClusterIP ports: - port: 8080 targetPort: ostoy-port protocol: TCP name: ostoy selector: app: ostoy-frontend --- apiVersion: route.openshift.io/v1 kind: Route metadata: name: ostoy-route spec: to: kind: Service name: ostoy-frontend-svc --- apiVersion: v1 kind: Secret metadata: name: ostoy-secret-env type: Opaque data: ENV_TOY_SECRET: VGhpcyBpcyBhIHRlc3Q= --- kind: ConfigMap apiVersion: v1 metadata: name: ostoy-configmap-files data: config.json: '{ "default": "123" }' --- apiVersion: v1 kind: Secret metadata: name: ostoy-secret data: secret.txt: VVNFUk5BTUU9bXlfdXNlcgpQQVNTV09SRD1AT3RCbCVYQXAhIzYzMlk1RndDQE1UUWsKU01UUD1sb2NhbGhvc3QKU01UUF9QT1JUPTI1 type: Opaqueostoy-microservice-deployment.yamlapiVersion: apps/v1 kind: Deployment metadata: name: ostoy-microservice labels: app: ostoy spec: selector: matchLabels: app: ostoy-microservice replicas: 1 template: metadata: labels: app: ostoy-microservice spec: containers: - name: ostoy-microservice securityContext: allowPrivilegeEscalation: false runAsNonRoot: true seccompProfile: type: RuntimeDefault capabilities: drop: - ALL image: quay.io/ostoylab/ostoy-microservice:1.5.0 imagePullPolicy: IfNotPresent ports: - containerPort: 8080 protocol: TCP resources: requests: memory: "128Mi" cpu: "50m" limits: memory: "256Mi" cpu: "100m" --- apiVersion: v1 kind: Service metadata: name: ostoy-microservice-svc labels: app: ostoy-microservice spec: type: ClusterIP ports: - port: 8080 targetPort: 8080 protocol: TCP selector: app: ostoy-microserviceACK S3용 S3 버킷 매니페스트
s3-bucket.yamlapiVersion: s3.services.k8s.aws/v1alpha1 kind: Bucket metadata: name: ostoy-bucket namespace: ostoy spec: name: ostoy-bucket
OSToy 애플리케이션의 배포를 단순화하기 위해 위의 배포 매니페스트에 필요한 모든 오브젝트가 함께 그룹화됩니다. 일반적인 엔터프라이즈 배포에는 각 Kubernetes 오브젝트에 대한 별도의 매니페스트 파일이 권장됩니다.