컨트롤 플레인 컴포넌트
- Kube-apiserver : 쿠버네티스의 모든 컴포넌트의 통신을 담당
- Etcd : 모든 클러스터 데이터를 담는 쿠버네티스 뒷단의 저장소로 사용되는 키-밸류 저장소
- Kube-scheduler : 노드가 배정되지 않은 새로 생성된 파드를 감지하고, 실행할 노드를 선택하는 컴포넌트.
- Kube-controller-manager : 컨트롤러를 구동하는 컴포넌트.
구동되는 컨트롤러로 노드 컨트롤러, 레플리케이션 컨트롤러, 앤드포인트 컨트롤러, 서비스 어카운트, 토큰 컨트롤러 등이 있음.
- Cloud-controller-manager : 바탕을 이루는 클라우드 제공 사업자와 상호작용하는 컨트롤러를 작동시킴. Cloud-controller-manager 바이너리는 쿠버네티스 릴리스에서 도입된 알파 기능.
- Node-component : 동작 중인 파드를 유지시키고 쿠버네티스 런타임 환경을 제공하며, 모든 노드 상에서 동작함.
- Kubelet: 클러스터의 각 노드에서 실행되는 에이전트. Kubelet은 파드에서 컨테이너가 확실하게 동작하도록 관리함.
- Kube-proxy: 클러스터의 각 노드에서 실행되는 네트워크 프록시로, 쿠버네티스 서비스 개념의 구현부임. 또한 노드의 네트워크 규칙을 유지, 관리함. 이 네트워크 규칙이 내부 네트워크 세션이나 클러스터 바깥에서 파드로 네트워크 통신을 할 수 있도록 해줌.
- Container-runtime : 컨테이너 실행을 담당하는 소프트웨어.
예제 소스 : https://github.com/uphiller/dockerbook
- sudo apt-get update
- sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ gnupg2 \ software-properties-common
- curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
- sudo add-apt-repository “deb [arch=amd64]
https://download.docker.com/linux/debian$(lsb_release -cs) stable”- sudo apt-get update
- Sudo apt-get install docker-ce docker-ce-cli containered.io
- sudo usermod -aG docker $USER
- curl -s https://packages.cloud.googole.com/apt/doc/apt-key.gpg | sudo apt-key add –
- Cat <<EOF | sudo tee /etc/apt/sources.list.d/Kubernetes.list deb https://apt.kubernetes.io/ Kubernetes-xenial main EOF
- sudo apt-get update
- sudo apt-get install -y kubelet kubeadm kubectl
- sudo apt-mark hold kubelet kubeadm kubectl
- sudo kubeadm init
쿠버네티스 control-plane 이 성공적으로 설치됨.
worker노드 조인
토큰은 24시간의 제한 시간이 있고, 이 시간이 지나면 kubeadm create token 명령을 통해 재발급 가능.
Kubeadm token create --print-join-command
파드 네트워크 Add-On설치
- kubectl apply -f https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base 64 | tr -d ‘\n’)
- watch kubectl get pods -all-namespaces
-kubectl taint nodes –all node-role.kubernets.io/master-node/kube-master untainted- kubectl get nodes -o wide
포트 추가
도커를 사용할 때 처럼 컨테이너를 하나 실행하기
- Kubectl run nginx-app --image nginx --port=80
- Kybectl get pods
- kubectl expose pod nginx-app –type=NodePort
- Kubectl get service
쿠버네티스에서 컨테이너를 담고 있는 객체인 파드(pod)를 생성하였고, 생성된 파드를 외부에 노출시킬 수 있도록 서비스(service)를 생성하였음.
삭제하기
- Kubectl delete pod nginx-app
- Kubectl delete svc nginx-app
단일 인스턴스에 쿠버네티스를 설치했고, nginx 컨테이너까지 실행함
네임스페이스
- 네임 스페이스 조회 : kubectl get namespace
Namespace.yaml 파일 생성
apiVersion: v1
kind: Namespace
metadata:
name: team1
- kubectl apply -f namespace.yaml : 구성 파일 실행
- kubectl run nginx –image=nginx –namespace=team1 : 네임스페이스를 이용하여 파드 생성
- kubectl get pod -n team1 : 파드가 잘 만들어졌는지 확인
- kubectl delete pod nginx -n team1 : 삭제
- kubectl delete namespace team1 : 삭제
파드
1) 생명주기
: 파드의 상태들
(파드가 생성, 변경되었을 때 파드의 상태 부분에서 확인 가능 )
- Pending : 파드가 쿠버네티스 시스템에 의해 승인되었지만, 파드를 위한 하나 또는 하나 이상의 컨테이너 이미지 생성이 아직 완료되지 않은 상태.
- Running : 파드가 한 노드에 결합되었고, 모든 컨테이너 생성이 완료. 적어도 하나의 컨테이너가 동작 중이거나, 시작 또는 재시작 중에 있는 상태
- Succeeded : 파드에 있는 모든 컨테이너가 성공적으로 생성된 상태
- Failed : 파드에 있는 모든 컨테이너가 종료되었고, 적어도 하나 이상의 컨테이너가 실패로 종료된 상태
- Unknown : 어떤 이유에 의해 파드의 상태를 얻을 수 없는 상태. 일반적으로 파드 호스트와의 통신 오류에 의해 발생함.
2) 파드 생성 (파드에 두 개의 컨테이너 포함 가능)
apiVersion: v1
kind: Pod
metadata:
name: nodejs-app
spec:
containers:
- name: nodejs-app
Image: uphiller/nodejs-hello-world
Ports:
- containerPort:3000
- name: mysql-app
Image: mysql
Env:
-name: MYSQL_ROOT_PASSWORD
value : “1234”
Ports:
- containerPort: 3306
- kubectl apply -f pod.yaml : 파드 생성
- kubectl get pod : 파드 조회
- kubectl describe pod nodejs-app : 두 개의 컨테이너가 실행되었는지 확인
하나의 파드에 여러 개의 컨테이너를 배치시키면, 하나의 서비스에 필요한 부분들을 그룹핑 해서 파드 내의 컨테이너들끼리는 자유롭게 통신하고 다른 파드들과는 노출된 포트로만 통신할 수 있어서 하나의 마이크로서비스를 만드는 것과 유사한 형태를 만들 수 있음.
일반적으로 복제 관리를 해야 하기 때문에 사용자가 파드를 직접 만들지는 않음
디플로이먼트
서비스
- ClusterIP : 서비스가 클러스터-내부 IP에 노출되도록 한다.
- NodePort: 고정 포트(NodePort)로 각 노드의 IP에 서비스가 노출되도록 한다.
- LoadBalancer : 클라우드 공급자의 로드 밸런서를 사용하여 서비스가 외부에 노출되도록 함. 외부 로드 밸런서가 라우팅되는 NodePort와 ClusterIP 서비스가 자동 생성됨.
- ExternalName : 값과 함께 CNAME 레코드를 리턴하여, 서비스를 externalName 필드의 콘텐츠에 맵핑함.
위 네 가지 옵션은 서비스가 파드를 노출해 줄 수 있는 방식을 나타낸 것.
- kubectl apply -f nodejs.yaml : 이전에 생성한 디플로이먼트를 사용
- kubectl expose deploy nodejs-app : 서비스 생성
인그레스
스토리지
노드
쿠버네티스 네트워크 구성도
Container Network Intefaces(CNI)
설정 파일 일반적인 구성 팁
- apiVersion : 이 오브젝트를 생성하기 위해 사용하고 있는 쿠버네티스 API의 버전
- kind: 생성하려는 오브젝트의 종류
- metadata: 이름 문자열, UID 그리고 선택적인 네임스페이스를 포함하여 오브젝트를 유일하게 구분할 데이터
- spec : 오브젝트에 대하여 의도하는 상태
- diff 명령어를 사용하면 어떤 부분이 변경되었는지 볼 수 있음.