(PKOS) 2주 차 – AWS VPC CNI

피코스리서치 소개

이 글은 가르다 PKOS(생산 칼륨베넷츠 유럽온라인 작은tudy) 이것은 연구의 요약입니다.

PKOS 연구 공부, 공부 개념 자료, 숙제(본 게시물) 모두 <通过 24 步实践征服 Kubernetes> 내용에 따르면.

AWS VPC CNI 소개

Kubernetes CNI란 무엇입니까?

컨테이너 네트워크 인터페이스.

Kubernetes 네트워킹 환경을 구성합니다.

CNCF 프로젝트 CNI에는 Linux 컨테이너에서 네트워크 인터페이스를 구성하기 위한 플러그인 작성을 위한 사양 및 라이브러리와 지원되는 여러 플러그인이 포함되어 있습니다.


CNI는 “컨테이너 네트워킹”과 “컨테이너가 파괴될 때 할당된 리소스 제거”에만 관심이 있습니다.

원천: https://github.com/containernetworking/cni#what-is-cni

Calico, Flannel, Cilium, Weave 등 다양한 CNI 플러그인이 있습니다.


https://kubernetes.io/docs/concepts/cluster-administration/addons/
https://github.com/containernetworking/cni#3rd-party-plugins

AWS VPC CNI란 무엇입니까?

AWS의 탄력적 네트워크 인터페이스를 사용하는 Kubernetes의 네트워킹 포드용 네트워킹 플러그인입니다.

원천: https://github.com/aws/amazon-vpc-cni-k8s#amazon-vpc-cni-k8s
한마디로 AWS에서 만든 CNI 플러그인이라고 생각하면 편합니다.

AWS VPC CNI의 기능

  • 포드의 IP 할당
  • Pod의 IP 네트워크 주파수 대역은 노드(worker)와 동일하며 직접 통신 가능

본 연구의 기본 환경인 Kops도 공식적으로 AWS VPC CNI를 지원합니다.


https://kops.sigs.k8s.io/networking/#supported-networking-options

https://kops.sigs.k8s.io/networking/aws-vpc/

Kubernetes CNI(Calico)와 AWS VPC CNI의 차이점은 무엇입니까?

AWS VPC CNI의 특징은 노드와 포드의 네트워크 대역폭이 동일하다는 것입니다.


동일한 네트워크 대역폭을 갖는 노드와 포드의 요점은 무엇입니까?

오버레이(VXLAN, IP-IP 등) 통신 기술 없이도 VPC Native(클라우드 존엄성) 내 포드 간 직접 통신이 가능해진다.

포드가 서로 직접 통신할 수 있으면 네트워크 통신(성능, 대기 시간)을 최적화하는 측면에서 더 좋습니다.

쿠버네티스 네트워크

제공하다

클러스터 IP

클러스터 IP는 클러스터 내 포드 간에만 통신하는 서비스입니다.


서비스 생성 시 타입을 지정하지 않으면 기본 클러스터 IP가 생성됩니다.


클러스터 외부의 Pod는 클러스터 IP에 액세스할 수 없습니다.

apiVersion: v1
kind: Service
metadata:
  name: svc-clusterip
spec:
  selector:
    app: pod
  ports:
  - port: 9000
    targetPort: 8080
  type: ClusterIP

노드 포트

NodePort는 모든 작업자 노드의 특정 포트(=NodePort)를 통해 클러스터 외부에서 Pod에 액세스할 수 있도록 하는 서비스입니다.


노드 포트 번호 범위는 30000~32767입니다.

apiVersion: v1
kind: Service
metadata:
  name: svc-nodeport
spec:
  selector:
    app: pod
  ports:
  - port: 9000
    targetPort: 8080
    nodePort: 30000
  type: NodePort

로드 밸런서

클러스터 외부의 트래픽이 올바른 포트로 전송될 수 있도록 연결 가능한 IP 주소를 제공하는 서비스입니다.


일반적으로 CSP에서 제공하는 LB 플러그인을 사용하여 설정합니다.

apiVersion: v1
kind: Service
metadata:
  name: svc-lb
spec:
  selector:
    app: example
  ports:
    - port: 8765
      targetPort: 9376
  type: LoadBalancer

입구

Ingress는 HTTP, HTTPS 및 기타 네트워크 계층 7 리소스 구성을 담당합니다.

https://lifeoncloud.kr/entry/Ingress

입구

Ingress는 HTTP, HTTPS 및 기타 네트워크 계층 7 리소스 구성을 담당합니다.

Ingress의 가장 기본적인 역할은 외부 HTTP 호출의 트래픽을 처리하는 것입니다.

(예: 로드 밸런싱, TLS 종료, 도메인 기반

lifeoncloud.kr

인그레스 + ALB + 외부 DNS

# 변수 지정 - 자신의 full 도메인
WEBDOMAIN=<각자편한웹서버도메인>
WEBDOMAIN=albweb.$KOPS_CLUSTER_NAME

entry2.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: game-2048
---
apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: game-2048
  name: deployment-2048
spec:
  selector:
    matchLabels:
      app.kubernetes.io/name: app-2048
  replicas: 2
  template:
    metadata:
      labels:
        app.kubernetes.io/name: app-2048
    spec:
      containers:
      - image: public.ecr.aws/l6m2t8p7/docker-2048:latest
        imagePullPolicy: Always
        name: app-2048
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  namespace: game-2048
  name: service-2048
spec:
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
  type: NodePort
  selector:
    app.kubernetes.io/name: app-2048
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  namespace: game-2048
  name: ingress-2048
  annotations:
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip
spec:
  ingressClassName: alb
  rules:
    - host: ${WEBDOMAIN}
      http:
        paths:
        - path: /
          pathType: Prefix
          backend:
            service:
              name: service-2048
              port:

분포

# 게임 Pod와 Service, Ingress 배포
cat ~/pkos/3/ingress2.yaml | yh
WEBDOMAIN=$WEBDOMAIN envsubst < ~/pkos/3/ingress2.yaml | kubectl apply -f -

# 확인
kubectl get ingress,svc,ep,pod -n game-2048

# AWS R53 적용 확인
dig +short $WEBDOMAIN
dig +short $WEBDOMAIN @8.8.8.8

# 외부단말(집PC 등)에서 접속 확인 : curl or 웹브라우저

# 로그 확인
kubectl logs -n kube-system -f $(kubectl get po -n kube-system | egrep -o 'external-dns(A-Za-z0-9-)+')

# 삭제
kubectl delete ingress ingress-2048 -n game-2048
kubectl delete svc service-2048 -n game-2048 && kubectl delete deploy deployment-2048 -n game-2048 && kubectl delete ns game-2048

이를 그래픽으로 표현하면 다음과 같습니다.



<任务> 하위 경로를 통해 애플리케이션 연결

네임스페이스

apiVersion: v1
kind: Namespace
metadata:
  name: game

마리오 앱 및 서비스

apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: game
  name: mario
  labels:
    app: mario
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mario
  template:
    metadata:
      labels:
        app: mario
    spec:
      containers:
      - name: mario
        image: pengbai/docker-supermario
---
apiVersion: v1
kind: Service
metadata:
  namespace: game
  name: mario
  annotations:
    alb.ingress.kubernetes.io/healthcheck-path: /mario/index.html
spec:
  selector:
    app: mario
  ports:
  - port: 80
    protocol: TCP
    targetPort: 8080
  type: NodePort
  externalTrafficPolicy: Local

Tetris 앱 및 서비스

apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: game
  name: tetris
  labels:
    app: tetris
spec:
  replicas: 1
  selector:
    matchLabels:
      app: tetris
  template:
    metadata:
      labels:
        app: tetris
    spec:
      containers:
      - name: tetris
        image: bsord/tetris
---
apiVersion: v1
kind: Service
metadata:
  namespace: game
  name: tetris
  annotations:
     alb.ingress.kubernetes.io/healthcheck-path: /tetris/index.html
spec:
  selector:
    app: tetris
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  type: NodePort

입구

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  namespace: game
  name: ingress-game-soojin
  annotations:
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip
    alb.ingress.kubernetes.io/certificate-arn: {Certificate Manager에서 발급받은 정보}
    alb.ingress.kubernetes.io/healthcheck-port: traffic-port
    alb.ingress.kubernetes.io/listen-ports: '({"HTTP": 80}, {"HTTPS":443})'
    alb.ingress.kubernetes.io/ssl-redirect: '443'
spec:
  ingressClassName: alb
  rules:
    - host: {내 도메인}
      http:
        paths:
        - path: /tetris
          pathType: Prefix
          backend:
            service:
              name: tetris
              port:
                number: 80
        - path: /mario
          pathType: Prefix
          backend:
            service:
              name: mario
              port:
                number: 80

웹 브라우저에 접속하자