본문 바로가기
네트워크 수업/쿠버네티스

쿠버네티스 23.06.02

by 6^6 2023. 6. 2.
728x90

 

2023.06.02 - [네트워크 수업/Docker] - Kubernetes.pdf

<master>

kubectl get nodes

cd ~

 

껐다 켜면 다시 조인해야한다.

리셋부터!

[root@manager ~]# kubeadm reset cleanup-node

y

 

[root@k8s-manager ~]# rm /etc/containerd/config.toml
rm: remove 일반 파일 `/etc/containerd/config.toml'? 
[root@k8s-manager ~]# systemctl restart containerd

[root@k8s-manager ~]# kubeadm reset

ping 192.168.0.101

ping 192.168.0.102

 

 

[root@manager sunny]# systemctl start kubelet

[root@manager sunny]# kubeadm reset cleanup-node

[root@manager sunny]# rm -rf $HOME/.kube/

[root@manager sunny]# kubeadm init --apiserver-advertise-address 192.168.0.100 --pod-network-cidr=172.16.0.0/16

해서 나온 명령어 중 밑에 3개 복사해서 넣기

[root@manager sunny]#  mkdir -p $HOME/.kube
[root@manager sunny]#   sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@manager sunny]#   sudo chown $(id -u):$(id -g) $HOME/.kube/config

하고 나온 토큰 복사!! 이게 master로 들어가는 중요한 토큰 키이다.

 

kubeadm join 192.168.0.100:6443 --token um7mju.d1yot3e63f858cnw \
--discovery-token-ca-cert-hash sha256:e37bd7fe950f2002bdbe4539ad00fe2a266e25e46b0bb4ab2e53674db2a53354 

 

[root@manager ~]#   mkdir -p $HOME/.kube
[root@manager ~]#   sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@manager ~]#   sudo chown $(id -u):$(id -g) $HOME/.kube/config
[root@manager ~]# 
[root@manager ~]# export KUBECONFIG=/etc/kubernetes/admin.conf   ==>루트일경우에만 하면됨

 

 


<worker1,2>

 

[root@worker1 sunny]# kubeadm reset cleanup-node

[root@worker1 sunny]# rm -rf $HOME/.kube/

 

kubeadm join 192.168.0.100:6443 --token um7mju.d1yot3e63f858cnw \
--discovery-token-ca-cert-hash sha256:e37bd7fe950f2002bdbe4539ad00fe2a266e25e46b0bb4ab2e53674db2a53354


① 토큰값 확인

# kubeadm token list

 

② 토큰 생성

# kubeadm token create(or generate)

 

③ Hash 확인

# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outfo rm der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'

 

④ Join

# kubeadm join --token <2. Token 값> --discoverytoken-ca-cert-hash sha256:<3. Hash 값>

# <예시> kubeadm join 172.31.0.100:6443 --token yfar6w.w83z3kboqitr4c8i --discove ry-token-ca-cert-hash sha256:00885f00baa97edb6c4fbd49b6d74bebbea1bcad7196ed3e be23040fdcab43cf

 

⑤ 노드 삭제

kubectl delete node {node-name} // 해당 노드의 Pod 삭제

kubectl drain {node-name} // 해당 노드의 Pod들을 다른 노드로 이동

 

⑥ 노드 리셋

kubeadm reset kubeadm reset cleanup-node

// reset 하지 않으면 이전 정보가 남아있어 추후 join 수행 시 error 발생 update node ?

 

⑦ Pod 상태 확인 kubectl get pod -n kube-system

 

4. 컨테이너 네트워크 애드온(플러그인) 설치 쿠버네티스의 네트워크 플러그인은 몇 가지 종류가 있다.

CNI 플러그인: 상호 운용성을 위해 설계된 컨테이너 네트워크 인터페이스(CNI) 명세를 준수한 다.

Kubenet 플러그인: bridge 와 host-local CNI 플러그인을 사용하여 기본 cbr0 구현한다.

쿠버네티스의 컨테이너 간 통신을 위해 flannel, weaveNet 등 여러 오버레이 네트워크를 사용할 수 있지만, 이번 예제에서는 calico를 기준으로 하자.


우리는 weaveNet으로 할거다.

 

쿠버네티스는 객체(object)단위로 동작한다.

그 객체로는 pod, replica set, service, deployment 가 있다.

 

kubectl로 deployment를 생성하게 만들고 삭제한다.

<master>

kubectl apply -f https://github.com/weaveworks/weave/releases/download/v2.8.1/weave-daemonset-k8s.yaml

이거 설치안하면 pod running 안된다.

 

**kubectl  사용법

1. kubectl run 으로 컨테이너 실행하기

kubectl run 디플로이먼트명 --image 컨테이너이미지명 --port=포트번호

kubectl create deploment 디플로이먼트명 --image 컨테이너이미지명 --port=포트번호

 

run은 pod 1개만 생성하고 관리해준다.

create는 그룹 내 pod 1개를 생성하고 관리해준다.

 

정리>>

run은 생성한 pod는 초코파이 1개이고, create로 생성한 pod는 초코파이 박스안에 있는 초코파이 1개이다.

 

# kubectl create deployment  nginx-app --image nginx --port=80

 

디플로이먼트에 pod하나 생성됐다.

레플리카(

 

 

kubectl scale deploy nginx-app --replicas=2

 

 

kubectl get pods

디플로이먼트가 nginx-app이고 여기에 pods가 2개이다.

 

 

kubectl get deployments

2/2는 사용자가 최종 배포한 파드 갯수와 실제로 동작하는 파드 갯수가 각각 2개라는 뜻이다.

 

 

디플로이먼트 삭제

# kubectl delete deployment nginx-app

 

 

yum을 이용해서 deployment를 생성하게 만들고 삭제한다.

2. 템플릿으로 컨테이너 실행하기

# vi nginx-app.yaml

spec : // pod의 스펙

  containers //(pod는 컨테이너로 구성된다.)

  ports://컨테이너로 접속하기 위한 것

 

 

apiVersion: YAML 파일에서 정의한 오브젝트의 API 버전을 나타낸다

(Application Programming Interface(애플리케이션 프로그램 인터페이스)의 줄임말)

 

포드(Pod) : 컨테이너를 다루는 기본 단위

 

도커에서 여러개의 컨테이너가 모여서 서비스 를 이룬다.

한 개의 포드속에는 1개의 컨테이너가 있을 수도, 여러 개의 컨테이너가 존재할 수도 있다.

 

모든 리소스는 오브젝트 형태로 관리된다

 

 

yalm을 실행하면 deployment가 자동으로 생성되는지 확인해보자.

 

위에 설치하고 kubectl apply -f nginx-app.yaml 실행해보자

 

 

 

3. 클러스터 외부에서 클러스터 내부에 접근하기.

위에서 실행중인 nginx 컨테이너에 접근하려고 localhost:80 으로 접근하면 실패한다.

이는 쿠버네티스 내부에서 사용하는 네트워크가 외부와 격리되었기 때문이다.

쿠버네티스 내부에서 실행한 컨테이너를 외부에서 접근하려면 서비스를 사용해야 한다.

서비스 타입은 pdf에 있는 것처럼 ClusterIP, NodePort, LoadBalancer 가 있다. 여기서 NodePort에 대하여 살펴보도록 하자.

 

ClusterIP 타입: 쿠버네티스 내부에서만 포드들에 접근할 때 사용한다. 외부로 포드를 노 출하지 않기 때문에 쿠버네티스 클러스터 내부에서만 사용되는 포드에 적합하다.

NodePort 타입: 포드에 접근할 수 있는 포트를 클러스터의 모든 노드에 동일하게 개방한 다. 따라서 외부에서 포드에 접근할 수 있는 서비스 타입이다. 접근할 수 있는 포트는 랜덤 으로 정해지지만, 특정 포트로 접근하도록 설정할 수도 있다.

LoadBalancer 타입: 클라우드 플랫폼에서 제공하는 로드 밸런서를 동적으로 프로비저닝해 포드에 연결한다. NodePort 타입과 마찬가지로 외부에서 포드에 접근할 수 있는 서비스 타 입이다. 그러나 일반적으로 AWS, GCP 등과 같은 클라우드 플랫폼 환경에서만 사용할 수 있다.

 

 

 

docker run하면 바깥으로 노출할 방법이 없다.

node port라는 서비스를 하나만들어보자.

 

 

kubectl expose deployment 서비스명 --type=NodePort

# kubectl expose deployment nginx-app --type=NodePort   ==>타입은 NodePort로 하겠다.

# kubectl get service  ==> 서비스 만드는 명령어

 

//안된다면 kubectl describe service nginx-app

 

 

nginx-app은 외부로도 보일수 있게된다.

 

192.168.0.100:30571
192.168.0.101:30571

어떤 노드로 들어가든지 다 접근이 가능하다!

 

 

 

몽땅 다 지우고 다시 새로하고싶다면? 

# kubectl delete deployment, service, pod --all    ==> 지금까지 정의한 저 세개가 모조리 다 날아간다.

 

 


 

[root@k8s-worker2 sunny]# systemctl stop NetworkManager
[root@k8s-worker2 sunny]# systemctl start NetworkManager   ==> 이게 리눅스 네트워크 설정하는 명령어이다.

 

 

728x90

'네트워크 수업 > 쿠버네티스' 카테고리의 다른 글

쿠버네티스 23.05.25  (0) 2023.05.25
쿠버네티스 23.05.23  (0) 2023.05.23

댓글