728x90

<Port Forwarding>

 

 

 

 

$vagrant status

$vagrant up

$vagrant ssh-config master(private key가 있는 파일 장소)

 

(node-1)ssh -i .vagrant/machines/node-1/virtualbox/private_key vagrant@192.168.56.11

(node-2)ssh -i .vagrant/machines/node-2/virtualbox/private_key vagrant@192.168.56.12

(master)ssh -i .vagrant/machines/master/virtualbox/private_key vagrant@192.168.56.10

 

$su -(vagrant)

 

root@master~#kubectl get nodes

NAME     STATUS   ROLES                  AGE     VERSION

master   Ready    control-plane,master   2d20h   v1.20.2

node1    Ready    <none>                 2d19h   v1.20.2

node2    Ready    <none>                 2d19h   v1.20.2

 

--Ready로 안뜰경우

root@master~#ksystemctl status kubelet

root@master~#ksystemctl start kubelet

 

 

[root@master ~]# kubectl get pods

NAME         READY   STATUS    RESTARTS   AGE

nginx-test   1/1     Running   0          2d17h

 

 

 

<같은 클러스터 내부 - Cluster IP 사용>
<클러스터 외부(리눅스) : Node Port사용>

 

 

 

--지우고 다시 설치

[root@master ~]# kubectl get services

NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE

kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP        2d20h

nginx-test   NodePort    10.96.141.61   <none>        80:30069/TCP   2d17h

 

[root@master ~]# kubectl delete pod nginx-text

[root@master ~]# kubectl delete service nginx-text

 

$vagrant halt node-1 node-2

 

[root@master ~]# kubectl get nodes

NAME     STATUS     ROLES                  AGE     VERSION

master   Ready      control-plane,master   2d20h   v1.20.2

node1    NotReady   <none>                 2d20h   v1.20.2

node2    NotReady   <none>                 2d20h   v1.20.2

 

$vagrant up node-1 node-2

 

[root@node1 ~]# systemctl status kubelet

[root@node1 ~]# systemctl start kubelet

[root@node1 ~]# systemctl status kubelet(active 상태 확인)

 

[root@master ~]# kubectl get nodes

NAME     STATUS   ROLES                  AGE     VERSION

master   Ready    control-plane,master   2d20h   v1.20.2

node1    Ready    <none>                 2d20h   v1.20.2

node2    Ready    <none>                 2d20h   v1.20.2

 

 

----pod 재설치 과정

-pod 실행

kubectl run nginx-test --image=nginx --port 80 --generator=run-pod/v1

 

-service 실행

kubectl expose pod nginx-test
kubectl get services

 

-service Type 변경

kubectl edit service nginx-test # (ClusterIp -> NodePort)

(vi):set nu (number 보이게 설정)

 

<기본골격>

apiVersion:v1

kind:Service

metadata:

  labels:

    run: nginx-test

spec:

 

service의 종류 : ClusterIP, ExternalName, LoadBalancer, NodePort

 

[root@master ~]# kubectl get pods -o wide

NAME         READY   STATUS    RESTARTS   AGE   IP                NODE    NOMINATED NODE   READINESS GATES

nginx-test   1/1     Running   0          21m   192.168.166.130   node1   <none>           <none>

 

[root@node1 ~]# docker ps | grep nginx-test

 

**쿠버네티스에 설치된 노드의 도커 컨테이너(nginx)가 잘 가동되는지 컨테이너 안으로 이동

[root@node1 ~]# docker exec -it 4d9cdab2def3 /bin/bash

root@nginx-test:/# curl -X GET http://127.0.0.1:80

 

[root@master ~]# kubectl describe pod nginx-test

Name:         nginx-test

Namespace:    default

Priority:     0

Node:         node1/192.168.56.11

Start Time:   Fri, 19 Feb 2021 01:08:34 +0000

Labels:       run=nginx-test

Annotations:  cni.projectcalico.org/podIP: 192.168.166.130/32

Status:       Running

IP:           192.168.166.130

IPs:

  IP:  192.168.166.130

Containers:

  nginx-test:

    Container ID:   docker://4d9cdab2def32c6277957a7ca34162ed83d458d438ba08359165c0031db5aab1

    Image:          nginx

    Image ID:       docker-pullable://nginx@sha256:f3693fe50d5b1df1ecd315d54813a77afd56b0245a404055a946574deb6b34fc

    Port:           80/TCP

    Host Port:      0/TCP

    State:          Running

      Started:      Fri, 19 Feb 2021 01:08:45 +0000

    Ready:          True

    Restart Count:  0

    Environment:    <none>

    Mounts:

      /var/run/secrets/kubernetes.io/serviceaccount from default-token-n8flt (ro)

Conditions:

  Type              Status

  Initialized       True 

  Ready             True 

  ContainersReady   True 

  PodScheduled      True 

Volumes:

  default-token-n8flt:

    Type:        Secret (a volume populated by a Secret)

    SecretName:  default-token-n8flt

    Optional:    false

QoS Class:       BestEffort

Node-Selectors:  <none>

Tolerations:     node.kubernetes.io/not-ready:NoExecute op=Exists for 300s

                 node.kubernetes.io/unreachable:NoExecute op=Exists for 300s

Events: (추후에 에러나면 여기서 확인)

  Type    Reason     Age   From               Message

  ----    ------     ----  ----               -------

  Normal  Scheduled  29m   default-scheduler  Successfully assigned default/nginx-test to node1

  Normal  Pulling    29m   kubelet            Pulling image "nginx"

  Normal  Pulled     29m   kubelet            Successfully pulled image "nginx" in 9.769923218s

  Normal  Created    29m   kubelet            Created container nginx-test

  Normal  Started    29m   kubelet            Started container nginx-test

 

[root@master ~]# kubectl get services

NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE

kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP        2d21h

nginx-test   NodePort    10.111.201.195   <none>        80:32185/TCP   34m

 

-->쿠버네티스 내부의 80포트가 외부의 32185포트로 연결되어 있음

--linux에서 컨테이너 내부 접속

[root@master ~]# curl -X GET http://127.0.0.1:32185

 

 

--host PC에서 사용할 수 있게 포트포워딩 걸기

#Vagrantfile

# Node1
config.vm.define:"node-1" do |cfg|
  cfg.vm.box = "centos/7"
  cfg.vm.provider:virtualbox do |vb|
    vb.name="node-1"
    vb.customize ["modifyvm", :id, "--cpus", 1]
    vb.customize ["modifyvm", :id, "--memory", 1024]
  end
  cfg.vm.host_name="node1"
  # cfg.vm.synced_folder ".", "/vagrant", type: "nfs"
  cfg.vm.network "private_network", ip: "192.168.56.11"
  cfg.vm.network "forwarded_port", guest: 22, host: 19211,
  auto_correct: false, id: "ssh"
  cfg.vm.network "forwarded_port", guest: 8080, host: 18080
  cfg.vm.network "forwarded_port", guest: 32185, host: 32185
  cfg.vm.provision "shell", path: "bash_ssh_conf_4_CentOS.sh"
end

-> Node1에 cfg.vm.network "forwarded_port", guest: 32185, host: 32185 추가

 

$vagrant reload node-1

 

[root@node1 ~]# systemctl enable --now kubelet (자동으로 active 상태 만들어줌)

그게아니라면, [root@node1 ~]# systemctl start kubelet

 

[root@master ~]# kubectl get nodes

NAME     STATUS   ROLES                  AGE     VERSION

master   Ready    control-plane,master   2d21h   v1.20.2

node1    Ready    <none>                 2d21h   v1.20.2

node2    Ready    <none>                 2d21h   v1.20.2

 

--hostPC에서 접근가능

$curl -X GET http://127.0.0.1:32185

 

--Dashboard(버전달라서 작동불가)

kubectl apply -f https://raw.githubusercontent.com/kubetm/kubetm.github.io/master/sample/practice/appendix/gcp-kubernetes-dashboard.yaml

 

[root@master ~]# kubectl get nodes -n kube-system

[root@master ~]# nohup kubectl proxy --port=8000 --address=192.168.56.10 --accept-hosts='^*$' >/dev/null 2>&1 &

 

http://192.168.56.10:8000/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/

 

네임스페이스 = 작업공간

 

 

[root@master ~]# kubectl exec -it nginx-test /bin/bash(컨테이너 내부접속)

root@nginx-test:/# 

 

[root@master ~]# kubectl get pods nginx-test -o wide(자세한 정보 확인)

NAME         READY   STATUS    RESTARTS   AGE     IP                NODE    NOMINATED NODE   READINESS GATES

nginx-test   1/1     Running   1          3h18m   192.168.166.131   node1   <none>           <none>

 

[root@master ~]# kubectl get pods nginx-test -o yaml > nginx_pod.yml (파드 만들기)

[root@master ~]# ls -al nginx_pod.yml

-rw-r--r--. 1 root root 4611 Feb 19 04:28 nginx_pod.yml

[root@master ~]# vi nginx_pod.yml

 

[root@master ~]# kubectl get service nginx-test -o yaml > nginx_service.yml (서비스 만들기)

[root@master ~]# ls -l *.yml

-rw-r--r--. 1 root root 4611 Feb 19 04:28 nginx_pod.yml

-rw-r--r--. 1 root root 1213 Feb 19 04:30 nginx_service.yml

 

 

-pod/service 정보 검색

https://kubernetes.io/ko/docs/home

 

쿠버네티스 문서

쿠버네티스는 컨테이너화된 애플리케이션의 배포, 확장 및 관리를 자동화하기 위한 오픈소스 컨테이너 오케스트레이션 엔진이다. 오픈소스 프로젝트는 Cloud Native Computing Foundation에서 주관한다.

kubernetes.io

 

 

<kubernetes Demo 실습>

쿠버네티스 사용 -> 다양한, 많은 종류의 파드(컨테이너)관리 가능

 

 

 

--순서

1. hello.js 작성
2. CentOS 서버에 NodeJS 설치 여부 확인
3. 설치 안되어있으면
	3-1. NodeJS ver12설치
    	$yum remove nodejs
        $yum install epel-release
        $yum install -y gcc-c++ make
        $curl -sL https://rpm.nodesource.com/setup_12.x | sudo -E bash -
        $yum install nodejs
        $node -v
4. 설치 되었으면,
	4-1. $node hello.js

 

[root@master ~]# mkdir node_project

 

[root@master ~]# cd node_project/

[root@master node_project]# vi hello.js

 

 

#node_project/hello.js

var http = require('http');
var content = function(req, res){
    res.end("Hello Kubernetes! (on Docker)" + "\n");
    res.writeHead(200);
}
var my_server = http.createServer(content);
my_server.listen(8000);

 

[vagrant@master ~]$ curl -X GET http://127.0.0.1:8001

Hello Kubernetes!

 

http://192.168.56.10:8001/(포트포워딩 거쳤을때)

http://127.0.0.1:48001/(포트포워딩 안거치고 바로접속할 때)

 

Hello Kubernetes!

 

 

#Vagrantfile

# master
config.vm.define:"master" do |cfg|
  cfg.vm.box = "centos/7"
  cfg.vm.provider:virtualbox do |vb|
    vb.name="master"
    vb.customize ["modifyvm", :id, "--cpus", 2]
    vb.customize ["modifyvm", :id, "--memory", 2048]
  end
  cfg.vm.host_name="master"
  #cfg.vm.synced_folder ".", "/vagrant", type: "nfs"
  cfg.vm.network "private_network", ip: "192.168.56.10"
  cfg.vm.network "forwarded_port", guest: 22, host: 19214, auto_correct: false, id: "ssh"
  cfg.vm.network "forwarded_port", guest: 8080, host: 48080
  cfg.vm.network "forwarded_port", guest: 8001, host: 48001
  end
end

CentOs :8001 -> HostPC : 48001

 

 

[root@master node_project]# vi Dockerfile

 

#node_project/Dockerfile

FROM node:slim
EXPOSE 8000
COPY hello.js .
CMD node hello.js

 

--image 만들기

[root@master node_project]# docker build -t mhee4321/hello .

[root@master node_project]# docker run -d -p 8001:8000 mhee4321/hello

 

(접속 확인)

http://192.168.56.10:8001/ (guest-master 포트 - 포트포워딩 거쳐서 들어감)

http://127.0.0.1:48001/ (hostPC 자기자신 포트 - 그냥 자기 자신으로 접속)

 

 

[root@master node_project]# docker ps -a | grep hello

 

[root@master node_project]# docker login

[root@master node_project]# docker push mhee4321/hello

 

[root@master node_project]# vi my_hello_pod.yml

 

#my_hello_pod.yml

apiVersion: v1
kind: Pod
metadata:
  name: hello-pod
  labels:
    app: hello
spec:
  containers:
  - name: hello-container1
    image: mhee4321/hello
    ports:
    - containerPort: 8000

 

[root@master node_project]# kubectl apply -f my_hello_pod.yml 

pod/hello-pod created

 

[root@master node_project]# kubectl get pods (--namespace default)

NAME         READY   STATUS    RESTARTS   AGE

hello-pod    1/1     Running   0          23s

nginx-test   1/1     Running   1          5h16m

 

[root@master node_project]# kubectl get all

NAME             READY   STATUS    RESTARTS   AGE

pod/hello-pod    1/1     Running   0          45s

pod/nginx-test   1/1     Running   1          5h17m

 

NAME                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE

service/kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP        3d1h

service/nginx-test   NodePort    10.111.201.195   <none>        80:32185/TCP   5h17m

 

[root@master node_project]# kubectl describe pod hello-pod

[root@master node_project]# kubectl describe pod/hello-pod(위 커맨드랑 동일)

 

[root@master node_project]# kubectl exec -it hello-pod /bin/bash

root@hello-pod:/# apt-get update && apt-get install -y curl

 

root@hello-pod:/# curl -X GET http://127.0.0.1:8000

Hello Kubernetes! (on Docker)

 

 

 

++하나의 pod 더 만들기

[root@master node_project]# vi my_second_pod.yml

 

#my_second_pod.yml

apiVersion: v1
kind: Pod
metadata:
  name: pod-1
spec:
  containers:
  - name: container1
    image: kubetm/p8000
    ports:
    - containerPort: 8000
  - name: container2
    image: kubetm/p8080
    ports:
    - containerPort: 8080

 

[root@master node_project]# kubectl apply -f my_second_pod.yml 

pod/pod-1 created

 

[root@master node_project]# kubectl get pods

NAME         READY   STATUS    RESTARTS   AGE

hello-pod    1/1     Running   0          26m

nginx-test   1/1     Running   1          5h42m

pod-1        2/2     Running   0          41s

 

[root@master node_project]# kubectl describe pod pod-1(=kubectl describe pod/pod-1)

 

[root@master node_project]# kubectl get pods -o wide

NAME         READY   STATUS    RESTARTS   AGE     IP                NODE    NOMINATED NODE   READINESS GATES

hello-pod    1/1     Running   0          57m     192.168.166.132   node1   <none>           <none>

nginx-test   1/1     Running   1          6h14m   192.168.166.131   node1   <none>           <none>

pod-1        2/2     Running   0          32m     192.168.104.5     node2   <none>           <none>

 

[root@node2 ~]# docker ps -a | grep pod-1

7a24d62a49b0   kubetm/p8080             "docker-entrypoint.s…"   36 minutes ago   Up 36 minutes                        k8s_container2_pod-1_default_4ca1e58b-6a61-4be6-ae29-885d0d78ff21_0

b84b63dfb686   kubetm/p8000             "docker-entrypoint.s…"   36 minutes ago   Up 36 minutes                        k8s_container1_pod-1_default_4ca1e58b-6a61-4be6-ae29-885d0d78ff21_0

09d5f9ee2e92   k8s.gcr.io/pause:3.2     "/pause"                 36 minutes ago   Up 36 minutes                        k8s_POD_pod-1_default_4ca1e58b-6a61-4be6-ae29-885d0d78ff21_0

 

 

**Running 상태가 아닌 오류가 뜬다면

[root@master node_project]# kubectl describe pod/pod-1

 

 

[root@master node_project]# kubectl exec -it hello-pod /bin/bash

root@hello-pod:/# curl -X GET http://127.0.0.1:8000

Hello Kubernetes! (on Docker)

 

[root@master node_project]# vi my_hello_svc.yml 

 

#my_hello_svc.yml

apiVersion: v1
kind: Service
metadata:
  name: hello-service
spec:
  selector:
    app: hello
  ports:
    - port: 8001
      targetPort: 8000
  type: NodePort

#-p 8001:8000 (host - target)

 

[root@master node_project]# kubectl apply -f my_hello_svc.yml 

service/hello-service created

 

[root@master node_project]# kubectl get services

NAME            TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE

hello-service   NodePort    10.97.227.37     <none>        8001:31730/TCP   8s

kubernetes      ClusterIP   10.96.0.1        <none>        443/TCP          3d3h

nginx-test      NodePort    10.111.201.195   <none>        80:32185/TCP     6h31m

 

[root@master node_project]# curl -X GET http://127.0.0.1:31730

Hello Kubernetes! (on Docker)

[root@master node_project]# curl -X GET http://127.0.0.1:8001

Hello Kubernetes! (on Docker)

 

--웹사이트에서 확인

http://192.168.56.10:8001/

 

 

----변경사항 적용해보기-----

Hello Kubernetes (on Docker)! -> Hello Kubernetes (on k8s)!

 

  • 이미지 빌드

  • pod yaml 파일에 적용

  • 기존 파드 삭제 -> 새로운 파드 생성

  • 웹 브라우저에서 확인

 

 

[root@master node_project]# kubectl get pods

[root@master node_project]# kubectl get svc

 

[root@master node_project]# kubectl delete pod/hello-pod

pod "hello-pod" deleted

 

[root@master node_project]# kubectl delete service/hello-service

service "hello-service" deleted

 

[root@master node_project]# vi hello.js

Hello Kubernetes (on Docker)! -> Hello Kubernetes (on k8s)!

 

[root@master node_project]# docker build -t mhee4321/hello:2.0 .

 

[root@master node_project]# docker push mhee4321/hello:2.0

 

[root@master node_project]# docker ps -a | grep hello(있으면 지우기)

 

[root@master node_project]# docker run -d -p 8001:8000 mhee4321/hello:2.0

[root@master node_project]# curl -X GET http://127.0.0.1:8001

[root@master node_project]# docker stop && rm

 

[root@master node_project]# vi my_hello_pod.yml

 

#my_hello_pod.yml

apiVersion: v1
kind: Pod
metadata:
  name: hello-pod
  labels:
    app: hello
spec:
  containers:
  - name: hello-container1
    image: mhee4321/hello:2.0
    ports:
    - containerPort: 8000

 

[root@master node_project]# kubectl apply -f my_hello_pod.yml 

[root@master node_project]# kubectl get pods -o wide

NAME         READY   STATUS    RESTARTS   AGE     IP                NODE    NOMINATED NODE   READINESS GATES

hello-pod    1/1     Running   0          4m32s   192.168.166.133   node1   <none>           <none>

nginx-test   1/1     Running   1          7h31m   192.168.166.131   node1   <none>           <none>

pod-1        2/2     Running   0          109m    192.168.104.5     node2   <none>           <none>

 

[root@node1]# docker ps -a | grep hello

[root@node1]# docker exec -it 컨테이너 아이디 /bin/bash

root@hello-pod:/# cat hello.js

root@hello-pod:/# apt-get update && apt-get install -y curl

root@hello-pod:/# curl -X GET http://127.0.0.1:8000

Hello Kubernetes! (on k8s)

 

[root@master node_project]# vi my_hello_svc.yml

[root@master node_project]# kubectl apply -f my_hello_svc.yml

 

[root@master node_project]# kubectl get svc

NAME            TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE

hello-service   NodePort    10.103.0.239     <none>        8001:31757/TCP   4s

kubernetes      ClusterIP   10.96.0.1        <none>        443/TCP          3d4h

nginx-test      NodePort    10.111.201.195   <none>        80:32185/TCP     7h28m

 

 

[root@master node_project]# kubectl get nodes -o wide

NAME     STATUS   ROLES                  AGE    VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION                CONTAINER-RUNTIME

master   Ready    control-plane,master   3d4h   v1.20.2   192.168.56.10   <none>        CentOS Linux 7 (Core)   3.10.0-1160.15.2.el7.x86_64   docker://20.10.3

node1    Ready    <none>                 3d3h   v1.20.2   192.168.56.11   <none>        CentOS Linux 7 (Core)   3.10.0-1160.15.2.el7.x86_64   docker://20.10.3

node2    Ready    <none>                 3d4h   v1.20.2   192.168.56.12   <none>        CentOS Linux 7 (Core)   3.10.0-1160.15.2.el7.x86_64   docker://20.10.3

 

[root@master node_project]# curl -X GET http://127.0.0.1:31757

Hello Kubernetes! (on k8s)

 

http://192.168.56.11:31757/

 

$vagrant halt로 가상머신 power off 만들기

 

 

 

 

 

 

 

728x90

+ Recent posts