vmware에서 VM1,VM2를 프로비저닝
VM1: MasterNode
VM2: WorkerNode
Docker Desktop 설치
도커 이미지를 생성하고 컨테이너를 실행시킬 때 API 호출 요청은 도커 런타임이 받아주었었다.
이제 쿠버네티스 환경을 사용하면서 도커 런타임을 사용하지않고 kubectl 대신 API 호출 요청을 받아준다.
쿠버네티스 API를 사용하여 쿠버네티스 클러스터의 컨트롤 플레인과 통신하기 위한 커맨드라인 툴
아래 키를 복사한다.
kubeadm join 192.168.112.10:6443 --token zl96gs.4atfxs28i86kvhz0 \
--discovery-token-ca-cert-hash sha256:9cff1655497772113dc870d64c3d8a5533e1f29c315d84fc27256a2604be77fb
1. 단일 파일을 원격지로 보낼 때.
구문 : # scp [옵션][파일명] [원격지_id]@[원격지_ip]:[받는 위치]
scp testfile2 root@192.168.159.129:/tmp/testclient

kubernetes 와 support를 설치한다음
POD 만들기
kubectl run pod명 --image=hifrodo/rapa:v1
kubectl run nginx --image=nginx
kubectl get pod
kubectl get pod -w ( 왓치모드) → 빠져나올 때는 ^c
kubectl get pod -o wide
kubectl delete pod pod명
kubectl describe pod pod명
Pod 포드포워드 하게
kubectl port-forward 파드명 접속포트:파드안에 컨테이너포트
kubectl run nginx --image=nginx --labels=app=nginx --dry-run=client -o yaml > nginx-pod.yaml
kubectl apply -f nginx-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
포트포워딩 한다음에 localhost 드가면 페이지띄워짐
쿠버네티스에서 네임스페이스(Namespace)는 클러스터 내에서 리소스를 논리적으로 분리하고 격리하는 데 사용되는 방법입니다
apiVersion: v1
kind: Namespace
metadata:
name: name
apiVersion: v1
kind: Namespace
metadata:
name: dev
--- #yaml 파일 분리
apiVersion: v1
kind: Pod
metadata:
name: myapp
namespace: dev
labels:
name: myapp
spec:
containers:
- name: myapp
image: nginx
resources:
limits:
memory: "128Mi"
cpu: "500m"
ports:
- containerPort: 80
prod 네임스페이스의 pod에 대한 정보를 wide하게 보는 코드
kubectl get pod -n prod -o wide
네임스페이스는 논리적 격리이기 때문에 물리적으로 하나에 들어가서 통신하면 댄다!
쿠버네티스도 마찬가지로 bash에 접속 할 수 있다.
kubectl exec -it myapp -n dev bash
hifrodo/rapa3:v1
HOST Information V1
Host Name: nginx
Host IP: 10.88.0.108
Server Port: 80
Client IP: 127.0.0.1
Service랑 deployment를 이용해 v1,v2 각 두개의 배포를 띄워보자
또한 node.js 나 python django 혹은 spring을 이용해서 pod의 정보를 화면에 띄워주자!
const express = require('express');
const os = require('os');
const app = express();
const port = 3000;
app.get('/', (req, res) => {
const hostInfo = {
hostName: os.hostname(),
hostIP: getHostIP(),
serverPort: process.env.PORT || 3000,
};
res.send(`
<html>
<head>
<title>Pod Information</title>
</head>
<body>
<h1>HOST Information V1</h1>
<p>Host Name: ${hostInfo.hostName}</p>
<p>Host IP: ${hostInfo.hostIP}</p>
<p>Server Port: ${hostInfo.serverPort}</p>
</body>
</html>
`);
});
function getHostIP() {
const ifaces = os.networkInterfaces();
let hostIP = 'Unknown';
Object.keys(ifaces).forEach((ifname) => {
ifaces[ifname].forEach((iface) => {
if (iface.family === 'IPv4' && !iface.internal) {
hostIP = iface.address;
}
});
});
return hostIP;
}
app.listen(port, () => {
console.log(`Server is running at http://localhost:${port}`);
});{
"name": "pod-info-app",
"version": "1.0.0",
"description": "Pod Info App",
"main": "index.js",
"scripts": {
"start": "node index.js"
},
"dependencies": {
"express": "^4.18.2"
}
}FROM node
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "./index.js"] # 경로 수정

아래처럼 롤링 업데이트가 진행되며 이미지 변경이 pod 무정지 상태로 이루어진다.



안녕하세요! 클라우드 스쿨 관련해서 궁금한 점이 있어, 실례를 무릅쓰고, velog에 나와있는 주소로 메일 드렸습니다! 시간 괜찮으시다면 한 번 확인해주시면 감사하겠습니다!!