클컴... 나를 매우 힘들게 한다.
이를 극복하기 위해 지선생님과 함께 단순한 실습을 진행코자 한다
나는 도커와 쿠버네티스 사용 과정을 체험해보는게 목표이므로,
접속하면 hello world! 가 적힌 웹페이지를 주는 단순한 서버를 만든다.
하면서 느낀 점은 내가 정말 세세하게 하나도 모른다는 것이다.
docker 회원가입
docker desktop도 다운받아둠
난 교수님 서버를 쓴다
학교 IP를 open VPN 으로 접속하고
vs 에서 remote 켜서 ssh 연결해서 쓴다
kubenetes...도 뭔가 설치? 했던것같다 ( 아님말고~ )
조교님이 주신 어떤 깃을 클론했다. 아마 실습 예제였던 것 같으니 환경적으론 상관 없을 것이다..
우리가 서비스 할 무언가가 필요하다.
여기선 매우 단순한 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}/`);
});
패키징.. 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을 접속하면 웹페이지를 확인할 수 있다.
방금 만든 도커이미지를 사용하는 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
kubectl get nodes -o wide
이 명령어를 터미널에 입력하면 node 정보가 뜬다.
그 중 external IP를 입력하면 접속이 되어야 할 것이다.
그렇다. 난 externalIP가 안떳다...
무엇을 놓쳤을까? 일단 도커 로그인을 해봤다
docker login
편리하게도 알아서 로그인 된다.
그리고 이미지를 레지스트리에 푸시해봐야겠단 생각을 했다.
이미지가 내 로컬에만 있어서 문제가 되진 않을까?
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
이렇게 하면 변경? 업데이트? 된다
세상에. 문제는 다른 곳에 있었다.
나는 미니큐브를 사용중이었다 ... ;;
Minikube는 기본적으로 로컬 환경에서 싱글 노드 Kubernetes 클러스터를 실행하며,
일반적인 클라우드 환경에서 제공하는 외부 IP 주소를 자동으로 할당받지 않는다.
그럼 미니큐브로 외부접속 하는 방법은?
minikube service list
하면 내 서비스 목록이 보인다. 역시.. 내 헬로월드도 보인다.
minikube service hello-world-node-service --url
를 입력하니 어떤 url을 주었는데!!!
접속 안된다.. 정확히는 time out이 뜬다.
.....
하..
아직 해결 못했다.
이 부분은 더 서치해봐야겠다..