Kubernetes)MSA 쿠버네티스 적용기-2(GKE)

박우영·2023년 7월 29일
0

Cloud

목록 보기
10/10

개요

k8s 오픈소스를 사용하던중 GKE의 오토파일럿을 사용하면 간단하게 배포할 수 있다는 정보를 들었고 gke 솔루션을 활용하여 인프라에 대한 부담을 줄여보고자 합니다.

CI/CD 적용기

GKE autopilot 기능은 정말 간편했다 쿠버네티스의 공부를 따로하지않아도 사용이 가능할 수준이라고 생각되는데, 권장하는것은 GCP의 Cloud Build를 권장한다.
하지만 나는 내 인스턴스를 따로 관리하여 CI/CD 를 구축하고 싶었습니다.

그래서 따로 GCE 인스턴스를 생성하고 GKE 클러스터와 연동후 yml 파일을 생성해서 쉘 스크립트를 작성해 주었습니다.

VM Instance 생성

GCE 를 생성하는데 밑에서 설정을 해줘야 scope 가 적용이 되어 GKE 에 접속 할 수있다.

plug-in

sudo apt-get install google-cloud-sdk-gke-gcloud-auth-plugin

방화벽 적용(태그)

다음과 같이 설정한 후에 GKE 에서 제공하는 코드값을 GCE에 입력한다면 GCE에서 GKE 클러스터를 관리할 수 있습니다.

Troubleshooting

DB Connection Issue

서버가 계속 죽었다 살아났다 하는 모습이 식별됐습니다.

로그를 확인하면 DB 와 연결이 잘 안된다는것을 알 수 있었다. AWS RDS 를 사용하고 있었기 때문에 DB 를 조회 해보니 Too many connections 가 나왔다. 서버 연결이 너무 자주 이루어 졌기 때문에 발생한 Issue 인것같아 wait_timeout 을 default 에서 180초로 설정 하였습니다.

해결되었고 아마 배포가 이루어지고 WAS 가 죽으면 DB Connection 을 놓아주어야 하는데 지속적으로 가지고 있어서 생긴 Issue 라고 추측됩니다.

HTTPS 적용

기존의 gateway의 yml 을 수정하여 https 를 적용하고자 합니다

AS-IS

apiVersion: v1
kind: Service
metadata:
  annotations:
    cloud.google.com/neg: '{"ingress":true}'
  creationTimestamp: "2023-08-05T04:08:01Z"
  finalizers:
  - service.kubernetes.io/load-balancer-cleanup
  generateName: gateway-
  labels:
    baeker: gateway
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:metadata:
        f:finalizers:
          .: {}
          v:"service.kubernetes.io/load-balancer-cleanup": {}
      f:status:
        f:loadBalancer:
          f:ingress: {}
    manager: cloud-controller-manager
    operation: Update
    subresource: status
    time: "2023-08-05T04:08:39Z"
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:metadata:
        f:generateName: {}
        f:labels:
          .: {}
          f:baeker: {}
      f:spec:
        f:allocateLoadBalancerNodePorts: {}
        f:externalTrafficPolicy: {}
        f:internalTrafficPolicy: {}
        f:ports:
          .: {}
          k:{"port":443,"protocol":"TCP"}:
            .: {}
            f:nodePort: {}
            f:port: {}
            f:protocol: {}
            f:targetPort: {}
        f:selector: {}
        f:sessionAffinity: {}
        f:type: {}
    manager: GoogleCloudConsole
    operation: Update
    time: "2023-08-19T14:31:11Z"
  name: gateway-54njn
  namespace: gateway
  resourceVersion: "24592083"
  uid: 7ac2cb50-4418-4ae7-9ae1-57234bcd34dd
spec:
  allocateLoadBalancerNodePorts: true
  clusterIP: 10.22.129.101
  clusterIPs:
  - 10.22.129.101
  externalTrafficPolicy: Cluster
  internalTrafficPolicy: Cluster
  ipFamilies:
  - IPv4
  ipFamilyPolicy: SingleStack
  ports:
  - nodePort: 31502
    port: 80
    protocol: TCP
    targetPort: 9000
  selector:
    baeker: gateway
  sessionAffinity: None
  type: LoadBalancer
status:
  loadBalancer:
    ingress:
    - ip: 34.64.245.180
2023-08-19T23:33:18.929+09:00 WARN 7 --- [or-http-epoll-1] 
r.n.http.server.HttpServerOperations : [30d6483e, 
L:/10.22.0.89:9000 - R:/10.178.15.206:65204] Decoding 
failed: FULL_REQUEST(decodeResult: 
failure(java.lang.IllegalArgumentException: invalid version 
format: ????SNX????????O?X??LM???? ?+?/?,?
0????????/5???DIH2#H2HTTP/1.1), version: 
HTTP/1.0, content: 
UnpooledByteBufAllocator$InstrumentedUnpooledUnsafeHeapByteB
uf(ridx: 0, widx: 0, cap: 0))

TO-BE

apiVersion: v1
kind: Service
metadata:
  annotations:
    cloud.google.com/neg: '{"ingress":true}'
  creationTimestamp: "2023-08-05T04:08:01Z"
  finalizers:
  - service.kubernetes.io/load-balancer-cleanup
  generateName: gateway-
  labels:
    baeker: gateway
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:metadata:
        f:finalizers:
          .: {}
          v:"service.kubernetes.io/load-balancer-cleanup": {}
      f:status:
        f:loadBalancer:
          f:ingress: {}
    manager: cloud-controller-manager
    operation: Update
    subresource: status
    time: "2023-08-05T04:08:39Z"
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:metadata:
        f:generateName: {}
        f:labels:
          .: {}
          f:baeker: {}
      f:spec:
        f:allocateLoadBalancerNodePorts: {}
        f:externalTrafficPolicy: {}
        f:internalTrafficPolicy: {}
        f:ports:
          .: {}
          k:{"port":443,"protocol":"TCP"}:
            .: {}
            f:nodePort: {}
            f:port: {}
            f:protocol: {}
            f:targetPort: {}
        f:selector: {}
        f:sessionAffinity: {}
        f:type: {}
    manager: GoogleCloudConsole
    operation: Update
    time: "2023-08-19T14:31:11Z"
  name: gateway-54njn
  namespace: gateway
  resourceVersion: "24592083"
  uid: 7ac2cb50-4418-4ae7-9ae1-57234bcd34dd
spec:
  allocateLoadBalancerNodePorts: true
  clusterIP: 10.22.129.101
  clusterIPs:
  - 10.22.129.101
  externalTrafficPolicy: Cluster
  internalTrafficPolicy: Cluster
  ipFamilies:
  - IPv4
  ipFamilyPolicy: SingleStack
  ports:
  - nodePort: 31502
    port: 443
    protocol: TCP
    targetPort: 9000
  selector:
    baeker: gateway
  sessionAffinity: None
  type: LoadBalancer
status:
  loadBalancer:
    ingress:
    - ip: 34.64.245.180

keystore 설정 후 port 80 -> 443 으로 변경 해주면 그 외 microserviced 에서의 별도의 설정없이 https 보안설정이 이루어집니다.

1개의 댓글

comment-user-thumbnail
2023년 7월 29일

잘 봤습니다. 좋은 글 감사합니다.

답글 달기