구성한 클러스터를 기반으로 여러가지 오브젝트를 사용해보고자 한다.
모든 오브젝트를 다룰수는 없으니 Deployment와 각종 Service 들을 사용해보고자 한다.
파드가 생성 되었을 때 어떤 노드에 스케쥴링 되는지 확인해보기 위해 접근 시 호스트네임을 리턴하는 Flask를 준비했다.
추후 배포 과정과 URL 기반 트래픽 분산 등의 확장과 K8S 이상의 확장까지 고려하고 있다.
FROM python:3.9.4
RUN mkdir -p /root/k8s-web
WORKDIR /root/k8s-web
COPY . .
RUN python -m pip install --upgrade pip
RUN pip install -r ./requirements.txt
EXPOSE 5000
CMD python main.py
위 파일을 기반으로 Dockerfile을 작성해 이미지를 빌드해서 docker hub의 private repo에 올려두었다.
private repo이기 때문에 image pulling시 별도의 설정이 필요하다.
https://kubernetes.io/ko/docs/tasks/configure-pod-container/pull-image-private-registry/
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-deployment
labels:
app: flask-web
spec:
replicas: 3
selector:
matchLabels:
app: flask-web
template:
metadata:
labels:
app: flask-web
spec:
containers:
- name: k8s-web
image: maduee2/k8s-web:0.1
ports:
- containerPort: 5000
imagePullSecrets:
- name: regcred
deployment를 만들고 클러스터에 생성한다.
kubectl apply -f web-dp.yaml
외부에서 앱에 접근이 불가능하다면 의미가 없으므로, Service를 붙여 본다.
apiVersion: v1
kind: Service
metadata:
name: web-np
labels:
app: flask-web
spec:
selector:
app: flask-web
ports:
- name: np
protocol: TCP
port: 5000
targetPort: 5000
nodePort: 30000
type: NodePort
잘 생성되었는지 확인하고 GCP에서 Nodeport인 30000번 포트를 열고 외부에서 접근해본다.
IP 정보를 가리기 위해 return 값만 확인한다.
잘 접근되긴 하나 한 IP로만 접근하는데 모든 pod으로 통신이 가는 것을 확인할 수 있다.
이는 Service가 자신에게 연결된 Pod를 구분없이 아무나 연결하기 때문인데,
이것을 막으려면 yaml 파일에 externalTrafficPolicy: Local
옵션을 추가해서 해당 IP에 맞는 node로만 연결할 수 있다.
apiVersion: v1
kind: Service
metadata:
name: web-lb
spec:
selector:
app: flask-web
ports:
- port: 80
targetPort: 5000
type: LoadBalancer
loadBalancerIP: 외부 IP 할당 시도해보았음..ㅠ
위 yaml 파일로 LoadBalancer를 만들어 보았다.
생성은 잘 되지만 EXTERNAL-IP가 할당이 되지 않는다.
퍼블릭 클라우드 업체를 사용하면 LB 타입을 사용할 수 있다고 여기저기서 들었는데, 새 FIP를 생성해서 IP를 부여해봐도 할당되지 않는다.
아마 k8s 서비스를 사용해서 FIP를 할당해야 할 것 같다.
혹시 누가 나에게 답을 알려주지 않으려나..ㅠ
온프레미스 환경에서는 LB를 공부할 때 Metal LB를 통해 많이 하기 때문에, 나도 Metal LB라도 사용해 볼까 했는데
어짜피 그래도 FIP를 할당할 수 없고 L2 통신용으로만 사용 가능할테니,
굳이 지금도 할 수 있는 것을 할 필요는 없을 것 같아 넘어가도록 하자..
LoadBalancer에 부여된 Cluster-IP로도 충분히 L2 접근이 가능하다.