VPC CNI업데이트 후 외부네트워크에 문제가 생기고 인그레스가 정상적이지 않은 문제가 생겼습니다.

 

VPC CNI 을 제거하고 클러스터에서 이 추가 기능의 기존 구성을 재정의합니다. 를 체크하고 문제가 해결되었습니다.

반응형

먼저 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

 

 

 

반응형

+ Recent posts