관리 메뉴

공부공부 공부공부내용

[3.1] 쿠버네티스 POD 본문

클라우드 구성 및 관리/[쿠버네티스]

[3.1] 쿠버네티스 POD

wkdth04 2021. 3. 22. 11:01

sudo apt-get install -y curl

sudo apt-get update && sudo apt-get install -y apt-transport-https gnupg2
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubectl


## copy kube config file #exit#
scp -r devops@192.168.122.11:~/.kube .

pod :

  • 쿠버네티스 작업의 단위.
  • 파드에는 하나의 컨테이너만 가질 수도 있고 하나이상의 여러개의 컨테이너가 존재할 수도 있다. 그 컨테이너들은 각각 다른 동작을 해야한다.
  • 메인기능을 가진 컨테이너가 있고 서브 기능을 가진 컨테이너가 존재할 수 있다.
  • 파드에만 IP가 할당되고 각각의 컨테이너들에게는 IP없음.
  • 하나의 파드안에 있는 다중의 컨테이너는 volume을 공유할 수 있다.
  • 워드프레스 디비가 있다면 이 두개가 각각 pod로 분리되는 것.
  • 쿠버네티스 클러스터 내부의 파드는 주로 두 가지 방법으로 사용된다.
    • 단일 컨테이너만 동작하는 파드
    • 함께 동작하는 작업이 필요한 다중 컨테이너가 동작하는 파드
      • 파드에 하나이상의 컨테이너가 있다고 하더라도 파드의 컨테이너는 같은 노드에서만 동작하고 , 하나의 파드에 있는 다중 컨테이너는 저장소, 네트워크 IP 등을 공유한다.

*클러스터: 여러개의 물리적 서버가 하나의 서버처럼 동작되는 것.

여러 대의 컴퓨터들이 연결되어 하나의 시스템처럼 동작하는 컴퓨터들의 집합

실습환경은 우분투 환경이 클라이언트, 가상머신이 서버환경

 

  • 파드 리소스의 주요 필드
.spec.containers: 컨테이너 정의
.spec.containers.image: 컨테이너에 사용할 이미지
.spec.containers.name: 컨테이너 이름
.spec.containers.ports: 노출할 포트 정의
.spec.containers.ports.containerPort: 노출할 컨테이너 포트번호
.spec.containers.ports.protocol: 노출할 컨테이너 포트의 프로토콜(기본:TCP)
  • 파드 생성

$ kubectl create -f mynapp-pod.yml

  • 파드 목록확인

$ kubectl get pods

  • 실행 중인 파드 정의 확인

$ kubectl get pods mynapp-pod -o yaml #yaml 형태로 출력가능 $ kubectl get pods mynapp-pod -o json #json 도 가능

  • pod의 정보를 자세히 보는 방법

**$ kubectl describe pods mynapp-pod # 파드생성후 running떠야 정상. pending 뜨면 이 describe로 Events 항목 봐보기.**

  • pod의 로그 확인

**$ kubectl logs mynapp-pod**

  • 파드를 생성할 수 있는 YAML 파일 작성해보기
apiVersion: v1
kind: Pod
metadata:
  name: mynapp-pod
spec:
  containers:
  - image: c1t1d0s7/myweb
    name: mynapp
    ports:
    - containerPort: 8080
      protocol: TCP


student@student:~/k8s$ kubectl create -f pod.yaml
kubectl get pods mynapp-pod -o yaml

 

  • 실습과정

$ source <(kubectl completion zsh) # z쉘 쓰면 이렇게 추가 (자동완성기능)

$ source ~/.zshrc
$ kubectl completion bash | sudo tee /etc/bash_completion.d/kubectl
$ source ~/.bashrc
bash쉘 사용할 때 자동완성 기능 추가하려고 하면 이 커맨드.
apiVersion: v1
kind: Pod
metadata:
  name: mynapp-pod
spec:
  containers:
  - image: c1t1d0s7/myweb
    name: mynapp
    ports:
    - containerPort: 8080
      protocol: TCP
  - image: httpd:latest
    name: apache
    ports:
    - containerPort: 80
      protocol: TCP

네트워크와 볼륨에 대한 제어권은 없어서 컨테이너만 생성한다고 생각하기.

가상호스트 세가지 (이름기반, IP기반, 포트기반)

 

student@student:~$ kubectl describe pod mynapp-pod 
Name:         mynapp-pod
Namespace:    default
Priority:     0
Node:         node3/192.168.122.23
Start Time:   Wed, 22 Jul 2020 10:18:44 +0900
Labels:       <none>
Annotations:  <none>
Status:       Running
IP:           10.233.92.11    # 내부네트워크 대역. 이 주소로 현재는 통신 불가. 같은네트워크 대역인 파드를 하나 띄워서 통신 가능하지만 나중에 배울 서비스하나만 동작하면 통신이 더 쉽게 가능해짐.
IPs:
  IP:  10.233.92.11
Containers:
  mynapp:
    Container ID:   docker://10f1159279a12d46bcaca2237afbdc790eef5200090a4f3c98f8158cb88bba31
    Image:          c1t1d0s7/myweb
    Image ID:       docker-pullable://c1t1d0s7/myweb@sha256:5958dd35380b332e178662a185179c8230ac9008cf6788400d89525a7d2478a4
    Port:           8080/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Wed, 22 Jul 2020 10:18:49 +0900
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-hnrh5 (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  default-token-hnrh5:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-hnrh5
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type    Reason     Age        From               Message
  ----    ------     ----       ----               -------
  Normal  Scheduled  <unknown>  default-scheduler  Successfully assigned default/mynapp-pod to node3
  Normal  Pulling    41m        kubelet, node3     Pulling image "c1t1d0s7/myweb"
  Normal  Pulled     41m        kubelet, node3     Successfully pulled image "c1t1d0s7/myweb"
  Normal  Created    41m        kubelet, node3     Created container mynapp
  Normal  Started    41m        kubelet, node3     Started container mynapp

 

 

$ kubectl run -it os --rm --image=centos

os란 파드 생성. —rm?

통신이 되기 위해 띄운 파드이다.

아직 외부네트워크와 통신하는 법을 모르기 때문에 일단 이방법!

만든 os 지우는법?? exit?? 뭐하라고하셧는데

생각

왜 파드에 여러개의 컨테이너를 생성하는가?

각각 계층별로 정의하는 것들 자세히 확인할 수 있음. 아래

required영역은 필수로 참조.

pod를 정의하는 세가지 → 이름,이미지, 포트

 

$ kubectl explain pod   
$ kubectl explain pod.spec
$ kubectl explain pod.spec.containers
 #에서 필요한 섹션들 복사해서 vscode로 가져와 수정하기.
apiVersion: v1
kind: Pod
metadata:
  name: mynapp-pod   # 오브젝트 이름을 여기에 정의
spec:
  containers:
  - image: c1t1d0s7/myweb
    name: mynapp
    ports:
    - containerPort: 8080
      protocol:TCP