Kubernetes service&deploy

Seokhyun Yoon·2023년 12월 11일

VMware Workstation Pro v17 환경

vmware에서 VM1,VM2를 프로비저닝
VM1: MasterNode
VM2: WorkerNode
Docker Desktop 설치

  • Extension : Docker labs k8s toolkits 설치

Control Plane in Kubernetes

도커 이미지를 생성하고 컨테이너를 실행시킬 때 API 호출 요청은 도커 런타임이 받아주었었다.

이제 쿠버네티스 환경을 사용하면서 도커 런타임을 사용하지않고 kubectl 대신 API 호출 요청을 받아준다.

Kubectl

쿠버네티스 API를 사용하여 쿠버네티스 클러스터의 컨트롤 플레인과 통신하기 위한 커맨드라인 툴

Kubernetes 영문판 cubeadm 설치 문서

Installing kubeadm

Kubeadm init

아래 키를 복사한다.

kubeadm join 192.168.112.10:6443 --token zl96gs.4atfxs28i86kvhz0 \
        --discovery-token-ca-cert-hash sha256:9cff1655497772113dc870d64c3d8a5533e1f29c315d84fc27256a2604be77fb

SCP 명령어

1. 단일 파일을 원격지로 보낼 때.

구문 : # scp [옵션][파일명] [원격지_id]@[원격지_ip]:[받는 위치]

scp testfile2 root@192.168.159.129:/tmp/testclient

쿠버네티스 세팅하기

  • kubernetes

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

Pods의 yaml 파일 내용

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.14.2
    ports:
    - containerPort: 80

포트포워딩 한다음에 localhost 드가면 페이지띄워짐

yaml 파일을 중복해서 생성하면 너무 불편하다 ⇒ Replica controller(단종) ⇒ Replica set이 대신해준다.

Namespace

쿠버네티스에서 네임스페이스(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의 정보를 화면에 띄워주자!

  1. Express.js 웹 서버 코딩
  2. Dockerfile 작성
  3. VM 가상 머신 세팅
  4. kubeadm 설치 및 Docker Desktop설치
  5. Docker Desktop에서 kubernetes , kubernetes support Extension 설치
  6. Kubernetes deploy.yaml, service.yaml 파일 생성
  7. 올바르게 service와 pod의 label을 매칭시킴
  8. 폴더에 yaml 위 두 파일 저장 후 그 디렉토리 경로에서 kubectl apply -f .

과제

  • index.js (express)
    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}`);
    });
  • package.json
    {
      "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"
      }
    }
  • Dockerfile
    FROM node
    
    WORKDIR /app
    
    COPY package*.json ./
    
    RUN npm install
    
    COPY . .
    
    EXPOSE 3000
    
    CMD ["node", "./index.js"]  # 경로 수정

    롤링 업데이트 & NodePort 노출

아래처럼 롤링 업데이트가 진행

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

profile
Web과 Cloud에 관심이 있습니다.

1개의 댓글

comment-user-thumbnail
2024년 1월 5일

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

답글 달기