먼저 Gitlab에서 Kubernetes연동을 해줍니다.

Environment scope는 * 로 지정해줍니다.

다중 클러스터를 사용하시면 별도이름을 지정해 주어야 합니다.

 

그 다음 Gitlab-runner를 등록해야합니다.

Linux방식의 shell executor와 docker방식 2개를 등록했습니다.

docker방식만 사용하면 캐시가 되지 않아 도커빌드가 시간이 오래걸리게 됩니다.

docker만 사용하실분은 https://docs.gitlab.com/ee/ci/docker/using_docker_build.html 참고해주세요.

 

#  .gitlab-ci.yml 파일 예제

stages:
  - test
  - build
  - deploy

test:
  image:
    name: python3 #사용하는 언어에 맞는 이미지
  script:
	- pip install -r requirements.txt
    - python manage.py test
  tags:
    - docker #사용할 runner 테그

build:
  stage: build
  script:
  	# private 저장소를 이용시 로그인. gitlab 변수에 설정해둡니다.
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
    - echo "Building the app"
    - docker build --tag myimage:latest .
    - docker image push -a $CI_REGISTRY/$CI_PROJECT_NAMESPACE/$CI_PROJECT_NAME
  tags:
    - shell #사용할 runner 테그

# staging환경. master로 커밋시 작동
deploy_staging:
  stage: deploy
  image:
    name: bitnami/kubectl:latest
    entrypoint: [""]
  only:
    - master
  script:
    - echo "Deploy to staging server"
    - kubectl apply -f devops/deploy-dev.yaml 

  environment:
    name: staging        
  tags:
    - docker #docker로만 쿠버네티스 연동 가능

# production 환경. 배포는 수동으로만 작동
deploy_prod:
  stage: deploy
  image:
    name: bitnami/kubectl:latest
    entrypoint: [""]
  only:
    - master
  script:
    - echo "Deploy to production server"
    - kubectl apply -f devops/deploy-prod.yaml 
  environment:
    name: production        
  tags:
    - docker #docker로만 쿠버네티스 연동 가능

 

 

반응형

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

 

 

 

반응형

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

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

* 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

암호 : 쉘내용

으로 접속합니다.

 

기본 설정이 끝났습니다.

 

반응형

보통 AWS에 도메인을 연결하려면 Route53을 통해 aaa.com, bbb.net 과 같이 전체를 이용해야 합니다.

하지만 원하는 *.abc.helllo.com 만 사용하는 방법을 정리해 보았습니다.

 

먼저 Certificate Manager 에 접속하여 *.abc.hello.com 이나 원하는 서브 도메인을 입력합니다.

이메일 인증과 cname인증을 지원하며 원하는 방식으로 인증을 할 수 있습니다.

 

인증에 성공시 인증서 리소스에서 아래와 같은 코드를 복사해둡니다.

arn:aws:elasticloadbalancing:********************

 

사용하던 Deployment 와 Service를 띄워주고 

아래와 같이 인그레스(Ingress)를 작성하여 적용해줍니다.

---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: "이름"
  namespace: test
  annotations:
    alb.ingress.kubernetes.io/scheme: internet-facing
    kubernetes.io/ingress.class: alb    
    external-dns.alpha.kubernetes.io/hostname: test.abc.hello.com
    # AWS Certificate Manager certificate's ARN
    alb.ingress.kubernetes.io/certificate-arn: "arn:aws:acm:*************"
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS":443}]'
    # http접속시 https로 리다이렉트
    alb.ingress.kubernetes.io/ssl-redirect: "443"

spec:
  ingressClassName: alb
  rules:    
    - http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: "서비스명"
                port:
                  number: 80

 

kubectl apply -f 파일명

 

현재 인그레스에 보이는 ADDRESS를 사용하는 DNS업체에서 CNAME을 통해 연결하시면 됩니다.

kubectl get ingress --all-namespaces

NAMESPACE   NAME       CLASS   HOSTS   ADDRESS                   PORTS   AGE
test     test-ingress   alb     *       abcdef.elb.amazonaws.com   80      176m

DNS업체별로 등록방식은 다르지만 CNAME명 *.abc.hello.com CNAME값 abcdef.elb.amazonaws.com 식으로 적어주시면 됩니다.

 

이제 지정한 도메인 test.abc.hello.com 로 접속하면 https로 잘 나오게 됩니다.

 

반응형

 

다운로드

BeeCut.zip
0.97MB

 

 

 

 

반응형
프로젝트를 거의 갈아업다시피 하여 만듬.
IRC연동구조를 버리고 서버와 클라이언트를 제작.

주말내내 키보드 치니 손가락이 아프구려...ㅠㅠ



머리없는 귀신이 돌아다니는...ㅎㅎ

- 현재 구현된것.
고스트/아바타 기능
방향 전환
어설픈 리젼 이동


프로그램 제작시 참고될 기존 유리도시의 자료들을 모으고 있습니다. 혹시 자료가 있으시면 올려주세요^^;
반응형

'프로젝트 > 유리도시 Third Party' 카테고리의 다른 글

통신구조  (0) 2005.03.03
클라이언트 디자인  (3) 2005.02.28
반응형

'프로젝트 > 유리도시 Third Party' 카테고리의 다른 글

현재 진행 상황  (8) 2005.08.01
클라이언트 디자인  (3) 2005.02.28

+ Recent posts