1. 실습 내용 소개

2. 실습 준비

  1. 실습 디렉토리 생성

    mkdir ~/k8s-practice-web
    
  2. 웹 어플리케이션 서버는 node로 제작. 이를 위해 index.js 파일 작성

    cat <<EOF > ~/k8s-practice-web/index.js
    var http = require('http');
    var os = require('os');
    http.createServer(function (req, res) {
        res.writeHead(200, {'Content-Type': 'text/html', 'Cache-Control': 'no-cache'});
        res.end("<h1>I'm " + os.hostname() + "</h1>");
    }).listen(8080);
    EOF
    
  3. Dockerfile 작성

    cat <<EOF > ~/k8s-practice-web/Dockerfile
    FROM node
    RUN mkdir -p /usr/src/app
    COPY index.js /usr/src/app
    EXPOSE 8080
    CMD [ "node", "/usr/src/app/index" ]
    EOF
    
  4. 이미지 빌드

    docker build -t node-server ~/k8s-practice-web/
    
  5. 이미지 확인

    docker images | grep node-server
    
    REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
    node-server           latest              6115811ca3c2        28 minutes ago      899MB
    

3. 컨테이너 실행

  1. deployment 디렉토리 생성

    mkdir ~/k8s-practice-web/deployment
    
  2. deployment 파일 작성

    cat <<EOF > ~/k8s-practice-web/deployment/node-server-deployment.yml
    kind: Deployment
    apiVersion: extensions/v1beta1
    metadata:
      name: node-server-deployment
    spec:
      replicas: 1
      template:
        metadata:
          name: node-server-deployment-spec
          labels:
            role: demo
        spec:
          containers:
          - name: node-server-container
            image: node-server
            imagePullPolicy: IfNotPresent
            ports:
            - containerPort: 8080
    EOF
    
  3. deployment 생성

    kubectl create -f ~/k8s-practice-web/deployment/node-server-deployment.yml
    
    deployment.extensions/node-server-deployment created
    
  4. deployment 확인

    kubectl get deployments
    
    NAME                     READY   UP-TO-DATE   AVAILABLE   AGE
    node-server-deployment   0/1     1            0           7s
    
  5. pod 확인

    kubectl get pods
    
    NAME                                      READY   STATUS   RESTARTS   AGE
    node-server-deployment-58776857bb-jx78w   0/1     Error    2          20s
    
  6. pod 접속

    kubectl exec -it \\
        $(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\\n"}}{{end}}') \\
        bash
    
  7. 웹 서버 접속 확인

    curl localhost:8080
    
    <h1>I'm node-server-deployment-58776857bb-jx78w</h1>
    
  8. pod 접속 종료

    exit
    
  9. node-server Pod IP 확인

    kubectl describe pod \\
        $(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\\n"}}{{end}}') \\
        | grep IP | sed -E 's/IP:[[:space:]]+//'
    
    10.32.0.4