버전 비교

  • 이 줄이 추가되었습니다.
  • 이 줄이 삭제되었습니다.
  • 서식이 변경되었습니다.
목차

1. Pod

Image Removed

1.1 Pod 개요

  • 쿠버네티스 노드 내에 한개 이상의 컨테이너를 가진 파드가 각각 실행되고 있으며, 파드마다 다른 IP를 가지고 있고 파드 내의 컨테이너끼리는 통신이 가능합니다.

  • 파드 내 컨테이너끼리 볼륨을 공유하며 컨테이너가 죽고 재시작 되어도 파드가 살아있는 한 shared volume은 유지할 수 있습니다.

  • init-container(초기화 컨테이너) :파드의 앱 컨테이너들이 실행되기 전에 실행되는 특수한 컨테이너로 유틸리티 또는 스크립트 등을 포함할 수 있습니다.

(1) Pod Lifecycle

...

value

...

description

...

Pending

...

파드가 클러스터에 승인되었지만, 하나 이상의 컨테이너가 설정되지 않았고 실행할 준비가 되지 않은 상태입니다.

...

Running

...

파드가 노드에 바인딩되었고, 모든 컨테이너가 생성된 상태. 하나의 컨테이너가 아직 실행 중이거나, 시작 또는 재시작 중에 있는 상태입니다.

...

Succeeded

...

파드에 있는 모든 컨테이너들이 성공적으로 종료되었고, 재시작되지 않는 상태입니다.

...

Failed

...

파드에 있는 모든 컨테이너가 종료되었고, 적어도 하나 이상의 컨테이너가 실패로 종료된 상태입니다.

...

Unknown

...

어떤 이유에 의해서 파드의 상태를 얻을 수 없는 상태. 일반적으로 파드가 실행되어야 하는 노드와의 통신 오류로 인해 발생합니다.

...

(2) kubectl run으로 pod 생성

코드 블럭
kubectl run test-nginx --image=nginx:1.19

정보

또한 dry-run 옵션과 -o옵션을 이용하여 yaml파일을 간단하게 생성 할 수 도 있습니다

kubectl create deploy nginx --image=nginx --dry-run -o yaml > nginx-deploy.yaml

(3) yaml 형식으로 pod 생성

5/00-nginx-pod.yaml

코드 블럭
apiVersion: v1
kind: Pod
metadata:
  name: test-nginx
spec:
  containers:
  - name: test-nginx
    image: nginx:1.19
    ports:
    - containerPort: 80
코드 블럭
# yaml 파일 적용
kubectl apply -f [yaml file]

...

value

...

description

...

apiVersion

...

오브젝트를 생성하기 위해 사용할 쿠버네티스 API 버전을 명세합니다.

https://kubernetes.io/ko/docs/concepts/overview/kubernetes-api/

...

kind

...

어떤 종류의 오브젝트를 생성하고자 하는지 명세합니다.

ex) pod, services, replicaset ...

...

metadata

...

name, UID, namespace 등을 기본적인 정보를 포함합니다.

  • name: 특정 namespace에서 유일한 값으로 설정

  • labels: 특정 오브젝트만 나열하거나 검색할 때 사용되는 key-value 쌍

  • spec: 생성할 오브젝트의 구체적인 내용을 정의. spec에 대한 포맷은 오브젝트의 종류마다 다릅니다.

(4) pod 조회, 수정 및 삭제

코드 블럭
# pod 조회
kubectl get pod -n [namespace]
=> namespace를 지정하지 않으면 default namespace에 있는 pod를 조회합니다.

# 모든 Namespace의 pod 조회
kubectl get pod -A

# pod 수정
kubectl edit pod [pod name]

# pod 삭제 
kubectl delete pod [pod name]
kubectl delete -f [yaml 파일]

(5) 운영중에 이미지 버전 바꾸기

[root@m-k8s 0907]# cat nginx.yaml apiVersion: v1 kind: Pod metadata: name: test-nginx2 spec: containers: - name: test-nginx2 image: nginx:1.19 ports: - containerPort: 80 [root@m-k8s 0907]# kubectl edit pod/test-nginx2 pod/test-nginx2 edited [root@m-k8s 0907]# kubectl describe pod/test-nginx2 Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Created 18s (x2 over 64m) kubelet Created container test-nginx2 Normal Killing 18s
코드 블럭
정보

실습환경 연결

  1. 먼저 Vagrantfile이 있는 폴더로 위치한다.

    코드 블럭
    osc-edu1@DESKTOP-VLF5KR3 MINGW64 ~/vagrant/2024_k8s (main)
    $ ls
    Vagrantfile            edu/             extra-k8s-pkgs.sh*  k8s_pkg_cfg.sh*
    controlplane_node.sh*  extra-k8s-pkgs/  k8s_env_build.sh*   worker_nodes.sh*
  2. 현재 VM 상태를 확인한다.

    코드 블럭
    $ vagrant status
    Current machine states:
    
    cp-k8s-1.29.2             running (virtualbox)
    w1-k8s-1.29.2             running (virtualbox)
    w2-k8s-1.29.2             running (virtualbox)
    w3-k8s-1.29.2             running (virtualbox)
    
    This environment represents multiple VMs. The VMs are all listed
    above with their current state. For more information about a specific
    VM, run `vagrant status NAME`.
  3. master node에 들어간다.

    코드 블럭
    osc-edu1@DESKTOP-VLF5KR3 MINGW64 ~/vagrant/2024_k8s (main)
    $ vagrant ssh cp-k8s-1.29.2
  4. 만일 poweroff라면 vagrant up 명령어를 수행한뒤 3번으로 진입한다.

    코드 블럭
    $ vagrant status
    Current machine states:
    
    cp-k8s-1.29.2             poweroff (virtualbox)
    w1-k8s-1.29.2             poweroff (virtualbox)
    w2-k8s-1.29.2             poweroff (virtualbox)
    w3-k8s-1.29.2             poweroff (virtualbox)
    
    This environment represents multiple VMs. The VMs are all listed
    above with their current state. For more information about a specific
    VM, run `vagrant status NAME`.
    
    osc-edu1@DESKTOP-VLF5KR3 MINGW64 ~/vagrant/2024_k8s (main)
    $ vagrant up

TIp> 아래와같이 forwarding된 포트가 있으면 바로 진입이 가능하다.

코드 블럭
$ ssh vagrant@127.0.0.1 -p 60010
passwd: vagrant

이 세팅은 Vagrantfile에서 아래와 같이 세팅한다.

코드 블럭
      cfg.vm.host_name = "cp-k8s"
      cfg.vm.network "private_network", ip: "192.168.1.10"
      cfg.vm.network "forwarded_port", guest: 22, host: 60010, auto_correct: true, id: "ssh"

특정 포트를 열기위해서는 아래와 같이 세팅한다.

코드 블럭
  # Create a forwarded port mapping which allows access to a specific port
  # within the machine from a port on the host machine. In the example below,
  # accessing "localhost:8080" will access port 80 on the guest machine.
  # NOTE: This will enable public access to the opened port
  cfg.vm.network "forwarded_port", guest: 80, host: 8080

세팅후 reload로 cofiguration을 반영한다.

코드 블럭
 vagrant reload cp-k8s-1.29.2
정보

file위치는 master node의 아래에 위치한다.

root@cp-k8s:~/2024_k8s/edu# pwd
/root/2024_k8s/edu
root@cp-k8s:~/2024_k8s/edu# ls
10 12 13 15 3 5 6 7 8 9 Readme.md

1. Pod

Image Added

1.1 Pod 개요

  • 쿠버네티스 노드 내에 한개 이상의 컨테이너를 가진 파드가 각각 실행되고 있으며, 파드마다 다른 IP를 가지고 있고 파드 내의 컨테이너끼리는 통신이 가능합니다.

  • 파드 내 컨테이너끼리 볼륨을 공유하며 컨테이너가 죽고 재시작 되어도 파드가 살아있는 한 shared volume은 유지할 수 있습니다.

  • init-container(초기화 컨테이너) :파드의 앱 컨테이너들이 실행되기 전에 실행되는 특수한 컨테이너로 유틸리티 또는 스크립트 등을 포함할 수 있습니다.

(1) Pod Lifecycle

value

description

Pending

파드가 클러스터에 승인되었지만, 하나 이상의 컨테이너가 설정되지 않았고 실행할 준비가 되지 않은 상태입니다.

Running

파드가 노드에 바인딩되었고, 모든 컨테이너가 생성된 상태. 하나의 컨테이너가 아직 실행 중이거나, 시작 또는 재시작 중에 있는 상태입니다.

Succeeded

파드에 있는 모든 컨테이너들이 성공적으로 종료되었고, 재시작되지 않는 상태입니다.

Failed

파드에 있는 모든 컨테이너가 종료되었고, 적어도 하나 이상의 컨테이너가 실패로 종료된 상태입니다.

Unknown

어떤 이유에 의해서 파드의 상태를 얻을 수 없는 상태. 일반적으로 파드가 실행되어야 하는 노드와의 통신 오류로 인해 발생합니다.

(2) kubectl run으로 pod 생성

코드 블럭
kubectl run test-nginx --image=nginx:1.19

정보

또한 dry-run 옵션과 -o옵션을 이용하여 yaml파일을 간단하게 생성 할 수 도 있습니다

kubectl create deploy nginx --image=nginx --dry-run -o yaml > nginx-deploy.yaml

(3) yaml 형식으로 pod 생성

5/00-nginx-pod.yaml

코드 블럭
apiVersion: v1
kind: Pod
metadata:
  name: test-nginx
spec:
  containers:
  - name: test-nginx
    image: nginx:1.19
    ports:
    - containerPort: 80
코드 블럭
# yaml 파일 적용
kubectl apply -f [yaml file]

value

description

apiVersion

오브젝트를 생성하기 위해 사용할 쿠버네티스 API 버전을 명세합니다.

https://kubernetes.io/ko/docs/concepts/overview/kubernetes-api/

kind

어떤 종류의 오브젝트를 생성하고자 하는지 명세합니다.

ex) pod, services, replicaset ...

metadata

name, UID, namespace 등을 기본적인 정보를 포함합니다.

  • name: 특정 namespace에서 유일한 값으로 설정

  • labels: 특정 오브젝트만 나열하거나 검색할 때 사용되는 key-value 쌍

  • spec: 생성할 오브젝트의 구체적인 내용을 정의. spec에 대한 포맷은 오브젝트의 종류마다 다릅니다.

(4) pod 조회, 수정 및 삭제

코드 블럭
# pod 조회
kubectl get pod -n [namespace]
=> namespace를 지정하지 않으면 default namespace에 있는 pod를 조회합니다.

# 모든 Namespace의 pod 조회
kubectl get pod -A

# pod 수정
kubectl edit pod [pod name]

# pod 삭제 
kubectl delete pod [pod name]
kubectl delete -f [yaml 파일]

(5) 운영중에 이미지 버전 바꾸기 (===> nginx:latest로 변경 )

코드 블럭
[root@m-k8s 0907]# cat nginx.yaml
apiVersion: v1
kind: Pod
metadata:
  name: test-nginx2
spec:
  containers:
  - name: test-nginx2
    image: nginx:1.19    ===> nginx:latest로 변경 
    ports:
    - containerPort: 80
[root@m-k8s 0907]# kubectl edit pod/test-nginx2
pod/test-nginx2 edited
[root@m-k8s 0907]# kubectl describe pod/test-nginx2
Events:
  Type    Reason   Age                From     Message
  ----    ------   ----               ----     -------
  Normal  Created  18s (x2 over 64m)  kubelet  Created container test-nginx2
  Normal  Killing  18s                kubelet  Container test-nginx2 definition changed, will be restarted
  Normal  Pulled   18s                kubelet  Container image "nginx:latest" already present on machine
  Normal  Started  17s (x2 over 64m)  kubelet  Started container test-nginx2

(6) Pod 설정 변경

  • 파드 설정 변경 시, 변경 불가 항목인 경우 백업파일 생성 → 백업파일로 생성 가능
    Pod.metadata.name: test-nginx ==> test-nginx3

코드 블럭
[root@m-k8s 0907]# kubectl edit pod test-nginx
A copy of your changes has been stored to "/tmp/kubectl-edit-1281676954.yaml"
error: At least one of apiVersion, kind and name was changed
[root@m-k8s 0907]# kubectl get pods
NAME          READY   STATUS   kubelet RESTARTS   ContainerAGE
test-nginx2nginx definition changed, will be1/1 restarted   Normal Running Pulled  0 18s           11m
test-nginx2   1/1 kubelet  Container image "nginx:latest"Running already present on0 machine   Normal  Started  17s (x2 over 64m)  kubelet  Started container test-nginx2

(6) Pod 설정 변경

  • 파드 설정 변경 시, 변경 불가 항목인 경우 백업파일 생성 → 백업파일로 생성 가능

코드 블럭
10m
[root@m-k8s 0907]# kubectl apply -f /tmp/kubectl-edit-1281676954.yaml
pod/test-nginx3 created

[root@m-k8s 0907]# kubectl edit pod test-nginx
A copy of your changes has been stored to "/tmp/kubectl-edit-1281676954.yaml"
error: At least one of apiVersion, kind and name was changed
[root@m-k8s 0907]# kubectl get pods
NAME          READY   STATUS    RESTARTS   AGE
test-nginx     get pods
NAME          READY   STATUS    RESTARTS      AGE
test-nginx    1/1     Running   0             84m
test-nginx2   1/1     Running   1 (18m ago)   83m
test-nginx3   1/1     Running   0            11m
test-nginx2   1/1     Running   0          10m 72m

  • 새로 yaml 파일을 만들어서 생성

코드 블럭
[root@m-k8s 0907]# kubectl get pod test-nginx2 -o yaml > test-nginx4.yaml
[root@m-k8s 0907]# vi test-nginx4.yaml
# name change from test-nginx2 to test-nginx4
[root@m-k8s 0907]# kubectl applycreate -f /tmp/kubectl-edit-1281676954test-nginx4.yaml
pod/test-nginx3nginx4 created

[root@m-k8s 0907]# kubectl get pods
NAME          READY   STATUS    RESTARTS      AGE
test-nginx    1/1     Running   0   STATUS    RESTARTS      AGE165m
test-nginxnginx2    1/1     Running   01 (99m ago)   163m
test-nginx3   1/1    84m test-nginx2Running   1/10     Running   1 (18m ago)   83m153m
test-nginx3nginx4   1/1     Running   0             72m

...

17s

(7) Pod 정보 확인

코드 블럭
[root@m-k8s 0907]# kubectl get pod test-nginx2 -o yaml > test-nginx4.yaml
[root@m-k8s 0907]# vi test-nginx4.yaml
# name change from test-nginx2 to test-nginx4
[root@m-k8s 0907]# kubectl create -f test-nginx4.yaml
pod/test-nginx4 created
[root@m-k8s 0907]# kubectl get pods
NAME          READY   STATUS    RESTARTS      AGE
test-nginx    1/1     Running   0             165m
test-nginx2   1/1     Running   1 (99m ago)   163m
test-nginx3   1/1     Running   0             153m
test-nginx4   1/1     Running   0             17s

(7) Pod 정보 확인

코드 블럭
# pod 정보 자세히 보기
kubectl get pod -o wide

# pod 로그 확인
kubectl logs [pod name]

# pod의 상세 정보 
kubectl describe pod [pod name]

# pod 정보를 yaml 파일 형식으로 출력
kubectl get pod [pod name] -o yaml

(8) Pod 구성 설명서

apiVerion은 아래와 같이 확인 할 수 있습니다

정보

yaml 파일은 아래 4가지의 형태를 가지며 해당 오브젝트내 값을 선언하여 사용

apiVersion : # kubectl api-version 명령어로 사용가능한 apiversion을 확인
kind : # kubectl api-resources : 명령어로 해당 api에서 사용가능한 리소스 확인
metadata :
spec :

모든데이터는 key: value 형태로 정의 합니다 :(콜론)와 value 사이에는 꼭 띄어쓰기가 들어가야 합니다.

(9) kubectl 자동완성

정보

bash-completion 를 이용하여 kubectl도 자동완성 기능을 사용 할 수 있습니다

[root@m-k8s 0907]# yum install bash-completion -y
kubectl completion bash >> ~/.bashrc 등록후 재 접속 합니다 exit

[root@m-k8s 0907]# kubectl ap <tab> 누르면 자동완성

정보

통상적으로 kubernetes는 k로 alias 주어서 수행

[root@m-k8s 0907]# which k
alias k='kubectl'
/bin/kubectl

2. 워크로드 리소스

2.1 ReplicaSet

  • 파드를 생성 및 복제하고 복제된 파드의 개수를 yaml 파일에서 선언된 개수 만큼 지속적으로 유지합니다.

image-20230308-032451.pngImage Removed

5/01-replicaset.yaml

코드 블럭
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx-rs
  labels:
    app: nginx-rs
    tier: nginx-rs
spec:
  # modify replicas according to your case
  replicas: 3
  selector:
    matchLabels:
      tier: nginx-rs
  template:
    metadata:
      labels:
        tier: nginx-rs
    spec:
      containers:
      - name: nginx-rs
        image: nginx
  • yaml 파일에 선언된 대로 3개의 Pod가 실행되며, 하나의 Pod가 문제가 발생했을 경우 ReplicaSet은 문제가 생긴 파드를 지우고, 기존 것과 다른 IP와 Name을  가진 파드를 새롭게 구동시킵니다.

...

코드 블럭
# kubectl get pod
NAME             READY   STATUS    RESTARTS   AGE
nginx-rs-hxd29정보 자세히 보기
kubectl get pod -o wide

# pod 로그 확인
kubectl logs [pod name]

# pod의 상세 정보 
kubectl describe pod [pod name]

# pod 정보를 yaml 파일 형식으로 출력
kubectl get pod [pod name] -o yaml

(8) Pod 구성 설명서

apiVerion은 아래와 같이 확인 할 수 있습니다

정보

yaml 파일은 아래 4가지의 형태를 가지며 해당 오브젝트내 값을 선언하여 사용

apiVersion : # kubectl api-versions 명령어로 사용가능한 apiversion을 확인
kind : # kubectl api-resources : 명령어로 해당 api에서 사용가능한 리소스 확인
metadata :
spec :

정보

kubectl explain으로 하위 정보를 모두 확인할수 있다.

root@cp-k8s:~/2024_k8s/edu/5# kubectl explain pod.metadata.name

모든데이터는 key: value 형태로 정의 합니다 :(콜론)와 value 사이에는 꼭 띄어쓰기가 들어가야 합니다.

(9) kubectl 자동완성

정보

bash-completion 를 이용하여 kubectl도 자동완성 기능을 사용 할 수 있습니다

[root@m-k8s 0907]# apt install bash-completion -y
kubectl completion bash >> ~/.bashrc 등록후 재 접속 합니다 exit

[root@m-k8s 0907]# kubectl ap <tab> 누르면 자동완성

정보

통상적으로 kubernetes는 k로 alias 주어서 수행

[root@m-k8s 0907]# which k
alias k='kubectl'
/bin/kubectl

...

2. 워크로드 리소스

2.1 ReplicaSet

  • 파드를 생성 및 복제하고 복제된 파드의 개수를 yaml 파일에서 선언된 개수 만큼 지속적으로 유지합니다.

image-20230308-032451.pngImage Added

5/01-replicaset.yaml

코드 블럭
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx-rs
  labels:
    app: nginx-rs
    tier: nginx-rs
spec:
  # modify replicas according to your case
  replicas: 3
  selector:
    matchLabels:
      tier: nginx-rs
  template:
    metadata:
      labels:
        tier: nginx-rs
    spec:
      containers:
      - name: nginx-rs
        image: nginx

  • yaml 파일에 선언된 대로 3개의 Pod가 실행되며, 하나의 Pod가 문제가 발생했을 경우 ReplicaSet은 문제가 생긴 파드를 지우고, 기존 것과 다른 IP와 Name을  가진 파드를 새롭게 구동시킵니다.

...

코드 블럭
# kubectl get pod
NAME             READY   STATUS    RESTARTS   AGE
nginx-rs-hxd29   1/1     Running   0          79s
nginx-rs-nh7q4   1/1     Running   0          79s
nginx-rs-zr4fl   1/1     Running   0          79s
=> replica로 생성된 3개의 pod를 확인할 수 있습니다.

# pod 삭제
kubectl delete pod nginx-rs-hxd29

# kubectl get pod
NAME             READY   STATUS    RESTARTS   AGE
nginx-rs-nh7q4   1/1     Running   0          2m4s
nginx-rs-zbqlc   1/1     Running   0          79s8s
nginx-rs-nh7q4zr4fl   1/1     Running   0          2m4s
=> yaml  79s파일에 선언된 개수만큼 유지하기 위해 한 개의 pod 새로 생성됩니다.

# kubectl scale replicaset --replicas 2 nginx-rs-zr4fl
# kubectl get pods
NAME              1/1     Running   0          79s => replica로 생성된 3개의 pod를 확인할READY  있습니다. STATUS # pod 삭제 kubectlRESTARTS delete pod nginx-rs-hxd29  # kubectl get pod
NAMEAGE
nginx-rs-2d9f6              READY   STATUS    RESTARTS   AGE nginx-rs-nh7q4   1/1     Running   0          2m4s    2m23s
nginx-rs-zbqlcpk7ll      1/1     Running   0          8s nginx-rs-zr4fl   1/1     Running   0          2m4s
=> yaml 파일에 선언된 개수만큼 유지하기2m23s
위해
# 개의kubectl pod 새로 생성됩니다.delete rs/nginx-rs

2.2 Deployment

  • Deployment는 쿠버네티스가 어플리케이션의 인스턴스를 어떻게 생성하고 업데이트 해야하는지를 지시합니다.

  • Replica 개수변경을 통해 손쉬운 Pod 증설/축소 가능합니다.

  • Deployment는 파드가 구동될 때, 가장 리소스 사용량이 적은 쪽으로 여러 개의 파드를 구동시킬 수 있습니다.

...

코드 블럭
root@k8s-master01:~# kubectl -n kube-system get ds
NAME           DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
calico-node    5         5         5       5            5           kubernetes.io/os=linux   25h
kube-proxy     5         5         5       5            5                kubernetes.io/os=linux   25h
nodelocaldns   5         5         5       5            5           kubernetes.io/os=linux   22h

2.4 Static Pod

  • 모든 Node가 Kubernetes Cluster 내에서 정상적으로 동작하기 위해서는 노드 시작(부팅)과 동시에 실행되어야할 Pod가 존재하며, 이를 Static Pod라고 지칭합니다.

  • Static Pod는 노드의 Kubelet 데몬이 실행되면서 자동으로 기동됩니다.

  • /etc/kubernetes/manifest 경로에 yaml 파일이 존재합니다.

    • kube-apiserver, kube-controller-manager, kube-scheduler

...

 kubernetes.io/os=linux   25h

2.4 Static Pod

  • 모든 Node가 Kubernetes Cluster 내에서 정상적으로 동작하기 위해서는 노드 시작(부팅)과 동시에 실행되어야할 Pod가 존재하며, 이를 Static Pod라고 지칭합니다.

  • Static Pod는 노드의 Kubelet 데몬이 실행되면서 자동으로 기동됩니다.

  • /etc/kubernetes/manifest 경로에 yaml 파일이 존재합니다.

    • kube-apiserver, kube-controller-manager, kube-scheduler

image-20230308-034759.pngImage Added

코드 블럭
root@cp-k8s:~/2024_k8s/edu/5# ls -al /etc/kubernetes/manifests/
total 24
drwxrwxr-x 2 root root 4096 May 23 18:46 .
drwxrwxr-x 4 root root 4096 May 23 18:46 ..
-rw------- 1 root root 2394 May 23 18:46 etcd.yaml
-rw------- 1 root root 4032 May 23 18:46 kube-apiserver.yaml
-rw------- 1 root root 3543 May 23 18:46 kube-controller-manager.yaml
-rw-r--r-- 1 root root    0 Feb 14 20:32 .kubelet-keep
-rw------- 1 root root 1463 May 23 18:46 kube-scheduler.yaml

...

3. 컨피그맵

  • Key-Value 쌍으로 기밀이 아닌 데이터를 저장하는 데 사용하는 API 오브젝트입니다.

  • 컨테이너 이미지에서 환경 별 구성을 분리하여, 애플리케이션을 쉽게 이식할 수 있습니다.

  • 개발/운영 환경의 컨테이너는 동일하게 구성하고, 컨피그맵 설정을 다르게 적용하여 서비스를 관리할 수 있습니다.

  • 파드와 컨피그맵은 동일한 네임스페이스에 있어야 합니다.

...

코드 블럭
apiVersion: v1
kind: ConfigMap
metadata:
  name: prod-account
  namespace: default
data:
  ID: prod-user
  PASSWORD: prod-pass
  LOG_LEVEL: infoLEVEL: info
코드 블럭
# k apply -f 03-configmap.yaml

(2) 컨테이너에서 prod-account 컨피그맵의 LOG_LEVEL값을 가지고 오도록 설정합니다.

...

빌트인 타입

사용처

Opaque

임의의 사용자 정의 데이터

kubernetes.io/service-account-token

서비스 어카운트 토큰

kubernetes.io/dockercfg

직렬화 된(serialized) ~/.dockercfg 파일

kubernetes.io/dockerconfigjson

직렬화 된 ~/.docker/config.json 파일

kubernetes.io/basic-auth

기본 인증을 위한 자격 증명(credential)

kubernetes.io/ssh-auth

SSH를 위한 자격 증명

kubernetes.io/tls

TLS 클라이언트나 서버를 위한 데이터

bootstrap.kubernetes.io/token

부트스트랩 토큰 데이터

4.1 불투명(Opaque) 시크릿 사용

...

bootstrap.kubernetes.io/token

부트스트랩 토큰 데이터

4.1 불투명(Opaque) 시크릿 사용

(1) 명령어로 시크릿 생성

코드 블럭
root@cp-k8s:~/2024_k8s/edu/5# echo "prod-user" > prod-user.txt
root@cp-k8s:~/2024_k8s/edu/5# echo "prod-pass" > prod-pass.txt
코드 블럭
root@k8s-master01:~/kb# cat prod-user.txt
prod-user
root@k8s-master01:~/kb# cat prod-pass.txt
prod-pass


root@k8s-master01:~/kb# kubectl create secret generic prod-user-secret --from-file=./prod-user.txt --from-file=./prod-pass.txt
secret/prod-user-secret created


root@k8s-master01:~/kb# kubectl get secrets
NAME               TYPE     DATA   AGE
prod-user-secret   Opaque   2      4s


root@k8s-master01:~/kb# kubectl get secrets prod-user-secret -o yaml
apiVersion: v1
data:
  prod-pass.txt: cHJvZC1wYXNzCg==
  prod-user.txt: cHJvZC11c2VyCg==
kind: Secret
metadata:
  creationTimestamp: "2023-03-13T02:35:54Z"
  name: prod-user-secret
  namespace: default
  resourceVersion: "1226226"
  uid: 41a2cb2d-97f2-41bc-824f-c0c2783ec678
type: Opaque


*원래 값 확인방
root@k8s-master01:~/kb# echo cHJvZC11c2VyCg== | base64 --decode
prod-user

root@k8s--decode
master01:~/kb# kubectl delete secret/prod-user-secret
secret "prod-user" deleted

(2) yaml 파일로 시크릿 생성

  • yaml 파일로 생성시 필요 값들을 base64로 인코딩된 값을 넣어야 합니다.

...

코드 블럭
root@k8s-master01:~/kb# kubectl apply -f prod05-user-secret.yaml


root@k8s-master01:~/kb# kubectl get secrets
NAME        TYPE     DATA   AGE
prod-user   Opaque   2      5s


root@k8s-master01:~/kb# kubectl get secrets prod-user -o yaml
apiVersion: v1
data:
  password: cHJvZC1wYXNz
  username: cHJvZC11c2Vy
kind: Secret
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","data":{"password":"cHJvZC1wYXNz","username":"cHJvZC11c2Vy"},"kind":"Secret","metadata":{"annotations":{},"name":"prod-user","namespace":"default"},"type":"Opaque"}
  creationTimestamp: "2023-03-13T02:49:45Z"
  name: prod-user
  namespace: default
  resourceVersion: "1228228"
  uid: a5eff12c-2329-4697-92f7-f252a4f724ba
type: Opaque

...

코드 블럭
apiVersion: apps/v1
kind: Deployment
metadata:
  name: secretapp
  labels:
    app: secretapp
spec:
  replicas: 1
  selector:
    matchLabels:
      app: secretapp
  template:
    metadata:
      labels:
        app: secretapp
    spec:
      containers:
      - name: testapp
        image: nginx:1.19
        ports:
        - containerPort: 8080
        env:
          - name: SECRET_USERNAME
            valueFrom:
              secretKeyRef:
                name: prod-user
                key: username
          - name: SECRET_PASSWORD
            valueFrom:
              secretKeyRef:
                name: prod-user
                key: password
코드 블럭
kubectl apply -f 06-secret-deployment.yaml
  • 파드 안에서 시크릿 데이터를 확인합니다.

코드 블럭
root@k8s-master01:~/kb# kubectl exec -it secretapp-69d4797f86-7r95g -- bash

root@secretapp-69d4797f86-7r95g:/# env | grep SECRET
SECRET_USERNAME=prod-user
SECRET_PASSWORD=prod-pass
  • 실습파일을 정리합니다.

코드 블럭
root@cp-k8s:~/2024_k8s/edu/5# kubectl delete deploy/configmap-test
deployment.apps  key: password
  • 파드 안에서 시크릿 데이터를 확인합니다.

코드 블럭
root@k8s-master01:~/kb# kubectl exec -it secretapp-69d4797f86-7r95g -- bash

root@secretapp-69d4797f86-7r95g:/# env | grep SECRET
SECRET_USERNAME=prod-user
SECRET_PASSWORD=prod-pass"configmap-test" deleted
root@cp-k8s:~/2024_k8s/edu/5# kubectl delete deploy/secretapp
deployment.apps "secretapp" deleted
root@cp-k8s:~/2024_k8s/edu/6# kubectl delete deploy/nginx-deployment