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
**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하나 생성됐다.
레플리카(
디플로이먼트가 nginx-app이고 여기에 pods가 2개이다.
2/2는 사용자가 최종 배포한 파드 갯수와 실제로 동작하는 파드 갯수가 각각 2개라는 뜻이다.
디플로이먼트 삭제
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은 외부로도 보일수 있게된다.
어떤 노드로 들어가든지 다 접근이 가능하다!
몽땅 다 지우고 다시 새로하고싶다면?
# kubectl delete deployment, service, pod --all ==> 지금까지 정의한 저 세개가 모조리 다 날아간다.
[root@k8s-worker2 sunny]# systemctl stop NetworkManager
[root@k8s-worker2 sunny]# systemctl start NetworkManager ==> 이게 리눅스 네트워크 설정하는 명령어이다.
'네트워크 수업 > 쿠버네티스' 카테고리의 다른 글
쿠버네티스 23.05.25 (0) | 2023.05.25 |
---|---|
쿠버네티스 23.05.23 (0) | 2023.05.23 |
댓글