
$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


--지우고 다시 설치
[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)
--웹사이트에서 확인
----변경사항 적용해보기-----
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)

$vagrant halt로 가상머신 power off 만들기
'CLOUD > Docker' 카테고리의 다른 글
2/23 - 도커/쿠버네티스 활용 컨테이너 개발 10차시 (0) | 2021.02.23 |
---|---|
2/22 - 도커/쿠버네티스 활용 컨테이너 개발 9차시 (0) | 2021.02.22 |
2/16 - 도커/쿠버네티스 활용 컨테이너 개발 7차시 (0) | 2021.02.16 |
2/15 - 도커/쿠버네티스 활용 컨테이너 개발 6차시 (0) | 2021.02.15 |
2/10 - 도커/쿠버네티스 활용 컨테이너 개발 5차시 (0) | 2021.02.10 |