PKOS 스터디 2주차 정리

DevOps Engineer·2023년 2월 2일
0

짧은 후기

2주차는 금방 끝낼 수 있을거라 생각했는데 도메인 등록이 내 발목을 계속 붙잡은 느낌이였다.

과정

클러스터 등록 시 dig +short 도메인 주소로 클러스터에 사용할 도메인이 정상적으로 동작하는지에 대한 확인이 필수적이였는데 이 때 IP가 할당이 안되면 10.0.2.53 또는 connection timed out 에러가 발생한다.

정상적으로 동작 시

제대로 Kops를 통해서 클러스터를 생성하면 컨트롤 플레인 및 워커노드가 동작함.


클러스터에 필요한 작성해야할 변수들과 yaml을 참고해서 등록해야 함.

클러스터 내 정보가 S3에 저장되는 걸 볼 수있었음.

원래는 kubelet에서 CNI까지 지원이 됐었지만 1.24 버전 이후 CNI 서드파티를 플러그인형태로 추가해줘야 파드 간 통신이 됨.

특히 이번 스터디에서 몰랐던 점을 배운 점은 CNI 구성 시 일반적으로 사용하는 서드파티와 aws VPC cni와의 차이점이였다.

CNI 범위 확장 및 POD 생성


브릿지로 사용되는 IP 대역의 차이가 네트워크 트래픽 동작에 있어 최적화가 이뤄질려면 노드와 파드가 동일한 IP 대역대를 사용해야한다는 점.
다만 생각보다 할당할 수 있는 파드 대역대가 적다보니 오늘 과제의 메인은 VPC로 제공되는 IP로 100여대의 파드를 다룰 수 있도록 실습하는게 목적이다.
IP 할당을 32bit가 아닌 28비트로 쪼개서 사용함!

CNI 대역을 늘리기 위해서 edit 한 부분

kops edit cluster
...
  kubelet:
    anonymousAuth: false
    maxPods: 110
...
  networking:
    amazonvpc:
      env:
      - name: ENABLE_PREFIX_DELEGATION
        value: "true"
...

External DNS

IAM role 과 RBAC 기반으로 LB를 생성할 수 있다는 점.

kops edit cluster --name ${KOPS_CLUSTER_NAME}
-----
spec:
  certManager:
    enabled: true
  awsLoadBalancerController:
    enabled: true
-----

애드온형태로 CertManager와 AWSLBC를 붙여줌.

NLB형태로 먼저 테스트를 하고 hostname, 도메인 설정을 ingress Annotation으로 설정함
온프레미스에서 세팅할 때와의 차이점은 spec에 작성할 때와 annotation으로 관리한다는 점에서 차이가 큼
https 동작이 되는 yaml의 차이를 보자면

apiVersion: networking.k8s.io/v1

kind: Ingress

metadata:

  name: tls-example-ingress

spec:

  tls:

  - hosts:

      - https-example.foo.com

    secretName: testsecret-tls

  rules:

  - host: https-example.foo.com

    http:

      paths:

      - path: /

        pathType: Prefix

        backend:

          service:

            name: service1

            port:

              number: 80

▲ Ingress 세팅
(Onpremise 클러스터에서 사용한 ingress yaml)

apiVersion: v1
kind: Service
metadata:
  name: svc-nlb-ip-type
  annotations:
    external-dns.alpha.kubernetes.io/hostname: "${MyDomain}"
    service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: ip
    service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
    service.beta.kubernetes.io/aws-load-balancer-healthcheck-port: "8080"
    service.beta.kubernetes.io/aws-load-balancer-cross-zone-load-balancing-enabled: "true"
    service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "https"
    service.beta.kubernetes.io/aws-load-balancer-ssl-cert: ${CERT_ARN}
    service.beta.kubernetes.io/aws-load-balancer-backend-protocol: "http"
spec:
  ports:
    - port: 80
      targetPort: 8080
      protocol: TCP
      name: http
    - port: 443
      targetPort: 8080
      protocol: TCP
      name: https
  type: LoadBalancer
  loadBalancerClass: service.k8s.aws/nlb
  selector:
    app: deploy-websrv

▲LoadBalancer에서 annotation으로 설정하기
참고문서
https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.4/guide/use_cases/nlb_tls_termination/

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: project4
  namespace: default
  annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/group.name: project4--staging
    alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:ap-northeast-2:060701521359:certificate/104f70c8-4cbb-4873-aed9-eb9bfbeeb021
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS":443}]'
spec:
  rules:
  - host: "eks.devops-altf4.click"
    http:
      paths:
      - path: /auth
        pathType: Prefix
        backend:
          service:
            name: auth-server
            port:
              number: 80

      - path: /
        pathType: Prefix
        backend:
          service:
            name: api-server
            port:
              number: 80

▲ eks에서 ingress에 설정할 때 https 세팅(이전 프로젝트에 사용한 ingress.yaml example)

클라우드와 차이가 생기는 걸 한번 정리하면 좋아보인다.

profile
madame의 Techblog

0개의 댓글