초학자가 Kubernetes를 처음 보았다 ~#3 node의 pv와 호스트 volume를 동기화해, pod 안에 pvc를 설정하는 등~

소개



30대 미경험에서 엔지니어를 목표로 공부중인 YN이라고 합니다.
인프라를 공부하고 나면, k8s 아키키 같은 공기감에 초조해요. 캐치업을 위해 배운 것 등을 기록해 가고 싶습니다.
지난번 의 계속입니다.

했던 일



했던 일을 열심히 표제로 표현하려고 했습니다만 무리였습니다.
그림으로 하면 이런 느낌입니다.


사전 준비



kubectl 을 k 에 별칭



명령을 kubectl에서 k로 별칭하면 쉽습니다. 그리고 나서 명령의 보완도 추가해 둡니다. 자세한 내용은 이 문서를 참조하십시오.
이후, 이 기사에서는 특별히 거절하지 않고 kubectl 대신에 k 를 사용합니다.

~/.zshrc
source <(kubectl completion zsh)
alias k=kubectl
complete -o default -F __start_kubectl k

항상 구성 요소의 움직임을 살펴 봅니다.


watch 'kubectl get pod,service,namespace,deploy,ingress,cm,secret,persistentvolume,persistentvolumeclaim'

구성 요소 만들기



secret 만들기



환경 변수 등을 저장하는 secret을 만듭니다.
k create secret generic my-secret --from-literal=SECRET_KEY1=SECRET_VALUE1 --from literal=SECRET_KEY2=SECRET_VALUE2 --dry-run=client -o yaml > secret.yaml
k apply -f secret.yaml

secret.yaml
apiVersion: v1
data:
  SECRET_KEY1: U0VDUkVUX1ZBTFVFMQ==
  SECRET_KEY2: U0VDUkVUX1ZBTFVFMg==
kind: Secret
metadata:
  creationTimestamp: null
  name: my-secret

configmap 만들기



key-value 상점으로 정보를 저장하기 위해 configmap을 사용합니다.
k create configmap my-config --from-literal=TEST_ENV=Hello_World --dry-run=client -o yaml > configmap.yaml
k apply -f congifmap.yaml

configmap.yaml
apiVersion: v1
data:
  TEST_ENV: Hello_World
kind: ConfigMap
metadata:
  creationTimestamp: null
  name: my-config

pv 만들기



노드에 pv를 만듭니다.

pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv
spec:
  storageClassName: manual
  capacity:
    storage: 100M
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/pvc"
k apply -f pv.yaml

pvc 정의



포드의 정보는 포드와 함께 사라집니다. pod가 사라진 후에 pod가 가지는 정보를 유지하기 위해서는 pvc를 사용해 pv에 기입하는 것입니다.
pvc는 pv에서 저장 영역의 몫을 정의합니다.

pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10M
k apply -f pvc.yaml

포드 만들기



컴포넌트를 연결하여 아래 그림의 pod를 만듭니다.


pod.yaml
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: helloworld-pod
  name: helloworld-pod
spec:
  containers:
    - image: gcr.io/google-samples/hello-app:1.0
      name: helloworld-pod
      env:
        - name: TEST_ENV
          valueFrom:
            configMapKeyRef:
              name: my-config
              key: TEST_ENV
      ports:
        - containerPort: 8080
      resources: {}
      volumeMounts:
        - name: my-pv
          mountPath: /mnt/pvc
        - name: my-config-volume
          mountPath: /my-config/TEST_ENV
        - name: my-secret-volume
          mountPath: /my-secret
          readOnly: true
  volumes:
    - name: my-pv
      persistentVolumeClaim:
        claimName: pvc
    - name: my-config-volume
      configMap:
        name: my-config
        items:
          - key: TEST_ENV
            path: keys
    - name: my-secret-volume
      secret:
        secretName: my-secret

노드의 pv와 호스트 볼륨의 동기화 동작 확인



포드의 컨테이너에 쉘로 들어가서 파일을 /mnt/pvc/from_pod.txt 위에 만듭니다.
k exec -it helloworld-pod sh
echo "from pod" > /mnt/pvc/from_pod.txt
cat /mnt/pvc/from_pod.txt

Node로 ssh하고 들어가 Pod에서 컨테이너로 만든 /mnt/pvc/from_pod.txt가 Node에 있는지 확인할 수 있습니다.
minikube ssh
cat /mnt/pvc/from_pod.txt 

학습 로그 해설



configmap 정의





포드에 저장 영역 정의





포드의 저장 영역에 configmap 정의





포드의 저장 영역에 보안을 정의합니다.





pv 정보





pvc 정의





마지막으로



완전히 자기만족한 학습 로그가 되어 버렸습니다. 앞으로도 k8s의 공부를 열심히 하고 싶습니다.

좋은 웹페이지 즐겨찾기