Docker - Kubenetes, 실습

zox2m·2024년 4월 30일

cloudComputing

목록 보기
3/7

클컴... 나를 매우 힘들게 한다.
이를 극복하기 위해 지선생님과 함께 단순한 실습을 진행코자 한다

나는 도커와 쿠버네티스 사용 과정을 체험해보는게 목표이므로,
접속하면 hello world! 가 적힌 웹페이지를 주는 단순한 서버를 만든다.

하면서 느낀 점은 내가 정말 세세하게 하나도 모른다는 것이다.

0. 환경 설정

docker 회원가입
docker desktop도 다운받아둠

난 교수님 서버를 쓴다
학교 IP를 open VPN 으로 접속하고
vs 에서 remote 켜서 ssh 연결해서 쓴다

kubenetes...도 뭔가 설치? 했던것같다 ( 아님말고~ )

조교님이 주신 어떤 깃을 클론했다. 아마 실습 예제였던 것 같으니 환경적으론 상관 없을 것이다..

1. 애플리캐이션 파일 생성

우리가 서비스 할 무언가가 필요하다.
여기선 매우 단순한 js 를 만들엇다.

node.js 가 없다면 다운받아야 할 것이다.

server.js

const http = require('http');

const hostname = '0.0.0.0';
const port = 3000;

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/html');
  res.end('<html><body><h1>Hello World</h1></body></html>');
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

2.Docker Container로 패키징

패키징.. dockerfile을 생성한다

말그대로 vim dockerfile 했는데 뭐.. 됐다.

vim dockerfile

하여 편집기에 들어가면

FROM node:14
WORKDIR /app
COPY server.js /app
RUN npm init -y
EXPOSE 3000
CMD ["node", "server.js"]

를 쓴다. :wq로 나온다

그리고 터미널에 다음 명령어를 써 도커 이미지로 빌드한다

docker build -t hello-world-node .

실행테스트

docker run -p 3000:3000 hello-world-node

여기서 localhost:3000을 접속하면 웹페이지를 확인할 수 있다.

3.쿠버네티스 배포

방금 만든 도커이미지를 사용하는 deployment와 service를 만들어줘야한다. 쿠버네티스 설정 파일인 yaml을 작성해주자

deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-world-node
spec:
  replicas: 1
  selector:
    matchLabels:
      app: hello-world-node
  template:
    metadata:
      labels:
        app: hello-world-node
    spec:
      containers:
      - name: hello-world-node
        image: hello-world-node
        ports:
        - containerPort: 3000

deployment.yaml

apiVersion: v1
kind: Service
metadata:
  name: hello-world-node-service
spec:
  type: NodePort
  ports:
  - port: 3000
    targetPort: 3000
    nodePort: 30001
  selector:
    app: hello-world-node

그리고 터미널에 이렇게 쓰면 해당 애플리케이션이 배포된다

kubectl apply -f deployment.yaml
kubectl apply -f service.yaml

4. 확인

kubectl get nodes -o wide

이 명령어를 터미널에 입력하면 node 정보가 뜬다.
그 중 external IP를 입력하면 접속이 되어야 할 것이다.


문제: externalIP : None 으로 뜸

그렇다. 난 externalIP가 안떳다...

무엇을 놓쳤을까? 일단 도커 로그인을 해봤다

docker login

편리하게도 알아서 로그인 된다.

1. 이미지 레지스트리에 푸시하기

그리고 이미지를 레지스트리에 푸시해봐야겠단 생각을 했다.
이미지가 내 로컬에만 있어서 문제가 되진 않을까?

docker tag hello-world-node:latest username/hello-world-node:latest

먼저 내 노드에 태그를 붙여줬다. 별건 아니다.
위의 username부분엔 진짜 자기 docker 닉네임을 쓰세요

docker push username/hello-world-node:latest

이렇게 해주면 내 레지스트리에 이미지가 푸시 되었을 것이다.
터미널에 ====> 요런 귀여운 화살표 로딩창이 보이면 성공이다.

푸시된 이미지를 쓰고자 하니까 경로가 바뀐 셈이다.
따라서 deployment.yaml을 수정해줘야한다.
spec 아래쪽 image : username/이미지이름
이렇게 바꿔주면 된다.

만약 누군가 내 블로그를 보고 따라하게 된다면.. 이미지 만든 후 푸시해놓고 처음부터 이렇게 작성하세요. 하핫..

그리고 바뀐 yaml을

kubectl apply -f deployment.yaml

이렇게 하면 변경? 업데이트? 된다

2. minicube...

세상에. 문제는 다른 곳에 있었다.
나는 미니큐브를 사용중이었다 ... ;;

Minikube는 기본적으로 로컬 환경에서 싱글 노드 Kubernetes 클러스터를 실행하며,
일반적인 클라우드 환경에서 제공하는 외부 IP 주소를 자동으로 할당받지 않는다.

그럼 미니큐브로 외부접속 하는 방법은?

minikube service list

하면 내 서비스 목록이 보인다. 역시.. 내 헬로월드도 보인다.

minikube service hello-world-node-service --url

를 입력하니 어떤 url을 주었는데!!!
접속 안된다.. 정확히는 time out이 뜬다.

.....

하..
아직 해결 못했다.

이 부분은 더 서치해봐야겠다..

0개의 댓글