2주차는 금방 끝낼 수 있을거라 생각했는데 도메인 등록이 내 발목을 계속 붙잡은 느낌이였다.
클러스터 등록 시 dig +short 도메인 주소로 클러스터에 사용할 도메인이 정상적으로 동작하는지에 대한 확인이 필수적이였는데 이 때 IP가 할당이 안되면 10.0.2.53 또는 connection timed out 에러가 발생한다.
정상적으로 동작 시
제대로 Kops를 통해서 클러스터를 생성하면 컨트롤 플레인 및 워커노드가 동작함.
클러스터에 필요한 작성해야할 변수들과 yaml을 참고해서 등록해야 함.
클러스터 내 정보가 S3에 저장되는 걸 볼 수있었음.
원래는 kubelet에서 CNI까지 지원이 됐었지만 1.24 버전 이후 CNI 서드파티를 플러그인형태로 추가해줘야 파드 간 통신이 됨.
특히 이번 스터디에서 몰랐던 점을 배운 점은 CNI 구성 시 일반적으로 사용하는 서드파티와 aws VPC cni와의 차이점이였다.
브릿지로 사용되는 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"
...
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)
클라우드와 차이가 생기는 걸 한번 정리하면 좋아보인다.