Django, PHP등의 WAS는 프로그램 결과는 전송하지만 이미지나 CSS등은 처리가 되지 않아 보통 nginx를 통해 전송합니다.

이미지등의 처리는 AWS S3등의 클라우드 스토리지를 통해 많이 사용하지만 Ingress를 통해 전송하는 방식을 정리해보았습니다.

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: was  
spec:
  replicas: 1
  selector:
    matchLabels:
      app: was
  template:
    metadata:
      labels:
        app: was
    spec:      
      volumes:
        - name: staticfiles

      containers:
      	# was의 파일을 nginx를 통해 전송
        - name: nginx
          image: nginx:stable
          ports:
            - containerPort: 80
          volumeMounts:          	
            - name: staticfiles
              mountPath: /usr/share/nginx/html/static/          

        - name: was
          image: myimage
          imagePullPolicy: Always
          ports:
            - containerPort: 8000
          volumeMounts:
            - name: staticfiles
              mountPath: /static
          lifecycle:
            postStart:
              exec:
                # was내의 파일을 다른곳으로 복사
                command: ["/bin/sh", "-c", "cp -r /usr/src/app/static /"]

---
apiVersion: v1
kind: Service
metadata:
  name: was-svc  
  labels:
    app: was-svc

spec:
  selector:
    app: was
  type: NodePort

  ports:
    - port: 8000
      targetPort: 8000
      name: was
    - port: 80
      targetPort: 80
      name: nginx

---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: "was-ing"  
  annotations:
    cert-manager.io/cluster-issuer: "letsencrypt-production"
    nginx.ingress.kubernetes.io/force-ssl-redirect: "false"
    nginx.ingress.kubernetes.io/ssl-passthrough: "true"
    nginx.ingress.kubernetes.io/ssl-redirect: "false"

spec:
  ingressClassName: nginx
  tls:
    - hosts:
        - mydomain.com
      secretName: was-tls
  rules:
    - host: mydomain.com
      http:
        paths:
          - path: /static
            pathType: Prefix
            backend:
              service:
                name: was-svc
                port:
                  number: 80
          - path: /
            pathType: Prefix
            backend:
              service:
                name: was-svc
                port:
                  number: 8000

 

 

 

반응형
Posted by 화니.
,

보통 도커 이미지를 잘못 만들었거나 쿠버네티스 환경 셋팅이 잘못되어 나오지만 오류메세지는 뜨지 않는 경우가 있습니다.

Deployment 파일에 

spec:
  containers:
    - name : err-container
      command: ["sleep"]  # 두줄 추가
      args: ["infinity"]  # 두줄 추가

sleep 을 추가하여 

kubelctl exec pod이름 -it -- /bin/bash 로 쉘에 접속하여 오류 파악을 할 수 있습니다.

반응형

'IT > Kubernetes' 카테고리의 다른 글

WAS에서 Static 파일 전송하기  (0) 2022.03.12
Elastic Cloud on Kubernetes (ECK) 설치  (1) 2022.03.07
AWS 에서 서브 도메인만 연결하기(SSL)  (0) 2022.02.26
Posted by 화니.
,

* AWS EKS(Amazon Elastic Kubernetes Service) 에 설치한 기록입니다.

 

- 기본 설정 적용

kubectl create -f https://download.elastic.co/downloads/eck/2.0.0/crds.yaml
kubectl apply -f https://download.elastic.co/downloads/eck/2.0.0/operator.yaml

- 먼저 PV(PersistentVolume)를 설정해 줍니다. 저렴하게 저장하기위해 st1을 위해 셋팅했습니다.

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: hdd
  annotations:
    storageclass.kubernetes.io/is-default-class: "false"
provisioner: kubernetes.io/aws-ebs
parameters:
  type: st1
  fsType: ext4
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-elastic
  namespace: default

spec:
  accessModes:
    - ReadWriteOnce
  awsElasticBlockStore:
    fsType: ext4
    volumeID: aws://ap-northeast-2c(리젼)/볼륨ID
  capacity:
    storage: 500Gi
  persistentVolumeReclaimPolicy: Delete
  storageClassName: hdd

- ElasticSearch를 생성합니다. 미리 생성한 PV에 자동으로 PVC(PersistentVolumeClaim)가 연결됩니다.

apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
  name: es
spec:
  version: 8.0.1
  nodeSets:
    - name: default
      count: 1      
      podTemplate:
        spec:
          containers:
            - name: elasticsearch
              env:
                - name: ES_JAVA_OPTS
                  value: -Xms1g -Xmx1g
              resources:
                requests:
                  memory: 2Gi
                  cpu: 2
                limits:
                  memory: 4Gi
      volumeClaimTemplates:
        - metadata:
            name: elasticsearch-data 
          spec:
            accessModes:
              - ReadWriteOnce
            resources:
              requests:
                storage: 500Gi
            storageClassName: hdd

- Kibana를 셋팅합니다.

Ingress는 nginx-ingress기준으로 설정했습니다.

apiVersion: kibana.k8s.elastic.co/v1
kind: Kibana
metadata:
  name: es
spec:
  version: 8.0.1
  count: 1
  elasticsearchRef:
    name: es
  # Please upgrade your browser 메세지 방지
  config:
    csp.strict: false    
  http:
    tls:
      selfSignedCertificate:
        disabled: true
  podTemplate:
    spec:
      containers:
        - name: kibana
          env:
            - name: NODE_OPTIONS
              value: "--max-old-space-size=1024"
          resources:
            requests:
              memory: 0.5Gi
              cpu: 0.5
            limits:
              memory: 1Gi
              cpu: 1
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: "kibana-ing"
  annotations:    
    cert-manager.io/cluster-issuer: "letsencrypt-production"    
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
    nginx.ingress.kubernetes.io/ssl-passthrough: "true"
    
    

spec:
  ingressClassName: nginx
  tls:
    - hosts:
        - kibana.hwani.net
      secretName: kibana-tls
  rules:
    - host: kibana.hwani.net
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: es-kb-http
                port:
                  number: 5601

- 리눅스

kubectl get secret es-es-elastic-user -o=jsonpath='{.data.elastic}' | base64 --decode; echo

- 파워쉘

$s=kubectl get secret es-es-elastic-user -o=jsonpath='{.data.elastic}'
[System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($s))

 

https://kibana.hwani.net(설정 도메인) 으로 로 접속하여 

아이디 : elastic

암호 : 쉘내용

으로 접속합니다.

 

기본 설정이 끝났습니다.

 

반응형
Posted by 화니.
,