피코스리서치 소개
이 글은 가르다 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
웹 브라우저에 접속하자