컨피그맵(Configmap), 시크릿(Secret)
설정값을 파드(pod)로 전달
컨피그맵
일반적인 설정 정보(값)을 저장할 수 있는 쿠버네티스 오브젝트
네임스페이스 별로 존재
컨피그맵 설정
vagrant@ubuntu:~$ kubectl create configmap log-level-configmap --from-literal LOG_LEVEL=DEBUG
configmap/log-level-configmap created
vagrant@ubuntu:~$ kubectl create configmap start-k8s --from-literal k8s=kubernetes --from-literal container=docker
configmap/start-k8s created
- start-k8s : 컨피그맵 이름
- --from-literal k8s=kubernetes : 키=값
- --from-literal container=docker : 키=값
컨피그맵 확인
vagrant@ubuntu:~$ kubectl get configmap
NAME DATA AGE
log-level-configmap 1 3m41s
start-k8s 2 2m27s
vagrant@ubuntu:~$ kubectl describe configmap log-level-configmap
Name: log-level-configmap
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
LOG_LEVEL:
----
DEBUG
Events: <none>
컨피그맵을 YAML 형식으로 출력
vagrant@ubuntu:~$ kubectl get configmap log-level-configmap -o yaml
apiVersion: v1
data:
LOG_LEVEL: DEBUG
kind: ConfigMap
metadata:
creationTimestamp: "2020-09-22T01:13:06Z"
managedFields:
- apiVersion: v1
fieldsType: FieldsV1
fieldsV1:
f:data:
.: {}
f:LOG_LEVEL: {}
manager: kubectl-create
operation: Update
time: "2020-09-22T01:13:06Z"
name: log-level-configmap
namespace: default
resourceVersion: "68473"
selfLink: /api/v1/namespaces/default/configmaps/log-level-configmap
uid: 6ddcde79-4ff9-4403-87ac-00335744bb7a
파드에서 컨피그맵을 사용하는 방법 1. 컨피그맵의 값을 환경변수로 사용
파드 정의 - YAML 파일 생성
vagrant@ubuntu:~$ vi all-env-from-configmap.yml
apiVersion: v1 kind: Pod metadata: name: container-env-example spec: containers: - name: my-container image: busybox args: ['tail', '-f', '/dev/null'] envFrom: ⇒ 컨피그맵에 정의된 모든 키-값 쌍을 가져와서 환경변수로 설정 - configMapRef: name: log-level-configmap ⇒ LOG_LEVEL=DEBUG --------+ my-container의 환경변수로 설정 - configMapRef: | name: start-k8s ⇒ k8s=kubernetes, container=docker --+ |
파드 생성
vagrant@ubuntu:~$ kubectl apply -f all-env-from-configmap.yml
pod/container-env-example created
vagrant@ubuntu:~$ kubectl get pods
NAME READY STATUS RESTARTS AGE
container-env-example 1/1 Running 0 30s
hostname-deployment-7dfd748479-7zdv7 1/1 Running 0 19h
hostname-deployment-7dfd748479-pp8x4 1/1 Running 0 19h
hostname-deployment-7dfd748479-rtgzv 1/1 Running 0 19h
컨테이너의 환경변수를 확인
vagrant@ubuntu:~$ kubectl exec container-env-example -- env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=container-env-example
k8s=kubernetes
LOG_LEVEL=DEBUG
container=docker
KUBERNETES_SERVICE_HOST=10.96.0.1
KUBERNETES_PORT_443_TCP_PROTO=tcp
HOSTNAME_SVC_NODEPORT_PORT=tcp://10.111.29.91:8080
KUBERNETES_SERVICE_PORT=443
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
HOSTNAME_SVC_NODEPORT_SERVICE_HOST=10.111.29.91
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
HOSTNAME_SVC_NODEPORT_SERVICE_PORT_WEB_PORT=8080
HOSTNAME_SVC_NODEPORT_PORT_8080_TCP_PROTO=tcp
HOSTNAME_SVC_NODEPORT_PORT_8080_TCP_PORT=8080
HOSTNAME_SVC_NODEPORT_PORT_8080_TCP_ADDR=10.111.29.91
KUBERNETES_PORT_443_TCP_PORT=443
HOSTNAME_SVC_NODEPORT_SERVICE_PORT=8080
HOSTNAME_SVC_NODEPORT_PORT_8080_TCP=tcp://10.111.29.91:8080
HOME=/root
컨피맵에 존재하는 키-값 쌍 중에서 원하는 데이터만 환경변수로 설정
vagrant@ubuntu:~$ cp all-env-from-configmap.yml selective-env-from-configmap.yml
vagrant@ubuntu:~$ vi selective-env-from-configmap.yml
apiVersion: v1 kind: Pod metadata: name: container-env-example spec: containers: - name: my-container image: busybox args: ['tail', '-f', '/dev/null'] env: - name: ENV_KEYNAME_1 ⇐ 새롭게 설정될 환경변수 이름 -------------+ ENV_KEYNAME_1=LOG_LEVEL값 valueFrom: | configMapKeyRef: | name: log-level-configmap ⇐ 참조할 컨피그맵 이름 | key: LOG_LEVEL ⇐ 참조할 컨피그맵에서 가져올 데이터의 키 --+ - name: ENV_KEYNAME_2 valueFrom: configMapKeyRef: name: start-k8s key: k8s |
### 기존 POD 삭제 (POD 이름이 중복되므로)
vagrant@ubuntu:~$ kubectl delete -f all-env-from-configmap.yml
pod "container-env-example" deleted
### 파드 생성
vagrant@ubuntu:~$ kubectl apply -f selective-env-from-configmap.yml
pod/container-env-example created
### 파드 생성 확인
vagrant@ubuntu:~$ kubectl get pods
NAME READY STATUS RESTARTS AGE
container-env-example 1/1 Running 0 28s
hostname-deployment-7dfd748479-7zdv7 1/1 Running 0 19h
hostname-deployment-7dfd748479-pp8x4 1/1 Running 0 19h
hostname-deployment-7dfd748479-rtgzv 1/1 Running 0 19h
### 컨테이너 내부의 환경변수를 확인
vagrant@ubuntu:~$ kubectl exec container-env-example -- env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=container-env-example
ENV_KEYNAME_1=DEBUG
ENV_KEYNAME_2=kubernetes
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP_PROTO=tcp
HOSTNAME_SVC_NODEPORT_SERVICE_PORT=8080
HOSTNAME_SVC_NODEPORT_SERVICE_PORT_WEB_PORT=8080
HOSTNAME_SVC_NODEPORT_PORT_8080_TCP=tcp://10.111.29.91:8080
HOSTNAME_SVC_NODEPORT_PORT_8080_TCP_PORT=8080
KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_SERVICE_HOST=10.96.0.1
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
HOSTNAME_SVC_NODEPORT_SERVICE_HOST=10.111.29.91
HOSTNAME_SVC_NODEPORT_PORT=tcp://10.111.29.91:8080
HOSTNAME_SVC_NODEPORT_PORT_8080_TCP_PROTO=tcp
HOSTNAME_SVC_NODEPORT_PORT_8080_TCP_ADDR=10.111.29.91
KUBERNETES_SERVICE_PORT_HTTPS=443
HOME=/root
파드에서 컨피그맵을 사용하는 방법 2. 컨피그맵의 값을 포드 내부 파일로 마운트해서 사용
컨피그맵의 모든 키-쌍 데이터를 포드에 마운트
vagrant@ubuntu:~$ vi volume-mount-configmap.yml
apiVersion: v1 kind: Pod metadata: name: configmap-volume-pod spec: containers: - name: my-container image: busybox args: ["tail", "-f", "/dev/null"] volumeMounts: ⇐ #1에서 정의한 볼륨을 컨테이너 내부의 어떤 디렉터리에 마운트할 것인지 명시 - name: configmap-volume ⇐ 컨피그맵 볼룸의 이름 (#1에서 정의한 이름) mountPath: /etc/config ⇐ 컨피그맵 파일이 위치할 경로 volumes: ⇐ #1 사용할 볼륨 목록 - name: configmap-volume configMap: name: start-k8s ⇐ 컨피그맵 이름 |
### 파드 생성
vagrant@ubuntu:~$ kubectl apply -f volume-mount-configmap.yml
pod/configmap-volume-pod created
### 파드 생성 확인
vagrant@ubuntu:~$ kubectl get pods
NAME READY STATUS RESTARTS AGE
configmap-volume-pod 1/1 Running 0 27s
container-env-example 1/1 Running 0 53m
hostname-deployment-7dfd748479-7zdv7 1/1 Running 0 20h
hostname-deployment-7dfd748479-pp8x4 1/1 Running 0 20h
hostname-deployment-7dfd748479-rtgzv 1/1 Running 0 20h
### 파드의 /etc/config 디렉터리를 확인
vagrant@ubuntu:~$ kubectl exec configmap-volume-pod -- ls -l /etc/config
total 0
lrwxrwxrwx 1 root root 16 Sep 22 02:33 container -> ..data/container
lrwxrwxrwx 1 root root 10 Sep 22 02:33 k8s -> ..data/k8s
### 파일 내용 확인
vagrant@ubuntu:~$ kubectl exec configmap-volume-pod -- cat /etc/config/container
docker
vagrant@ubuntu:~$ kubectl exec configmap-volume-pod -- cat /etc/config/k8s
kubernetes
vagrant@ubuntu:~$
⇒ 컨피그맵에 키는 파일명으로, 값은 파일의 내용으로 변경되어서 전달
원하는 키-값 쌍의 데이터만 선택해서 포드로 마운트
vagrant@ubuntu:~$ cp volume-mount-configmap.yml selective-volume-configmap.yml
vagrant@ubuntu:~$ vi selective-volume-configmap.yml
apiVersion: v1 kind: Pod metadata: name: configmap-volume-pod spec: containers: - name: my-container image: busybox args: ["tail", "-f", "/dev/null"] volumeMounts: - name: configmap-volume mountPath: /etc/config volumes: - name: configmap-volume configMap: name: start-k8s items: - key: k8s ⇐ 가져올 키를 명시 path: k8s_fullname ⇐ 키 값을 저장할 파일명 |
### 앞에서 생성한 파드를 삭제
vagrant@ubuntu:~$ kubectl delete -f volume-mount-configmap.yml
pod "configmap-volume-pod" deleted
### 파드 생성 및 확인
vagrant@ubuntu:~$ kubectl apply -f selective-volume-configmap.yml
pod/configmap-volume-pod created
vagrant@ubuntu:~$ kubectl get pods
NAME READY STATUS RESTARTS AGE
configmap-volume-pod 1/1 Running 0 8s
container-env-example 1/1 Running 0 63m
hostname-deployment-7dfd748479-7zdv7 1/1 Running 0 20h
hostname-deployment-7dfd748479-pp8x4 1/1 Running 0 20h
hostname-deployment-7dfd748479-rtgzv 1/1 Running 0 20h
### 파드(컨테이너) 내부의 파일 생성 여부 확인
vagrant@ubuntu:~$ kubectl exec configmap-volume-pod -- ls /etc/config
k8s_fullname
vagrant@ubuntu:~$ kubectl exec configmap-volume-pod -- cat /etc/config/k8s_fullname
kubernetes
파일로부터 컨피그맵을 생성
### 테스트 파일 생성
vagrant@ubuntu:~$ echo Hello, world! >> index.html
vagrant@ubuntu:~$ cat index.html
Hello, world!
### 테스트 파일(index.html)을 이용해서 index-file이라는 컨피그맵을 생성
vagrant@ubuntu:~$ kubectl create configmap index-file --from-file ./index.html
configmap/index-file created
### 생성한 index-file 컨피그맵을 확인
vagrant@ubuntu:~$ kubectl describe configmap index-file
Name: index-file
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
index.html: ⇐ 파일명이 키(key)로 사용
----
Hello, world! ⇐ 파일의 내용이 값(value)로 사용
Events: <none>
### 키이름을 직접 지정해서 컨피그맵을 생성
vagrant@ubuntu:~$ kubectl create configmap index-file-customkey --from-file myindex=./index.html
configmap/index-file-customkey created
vagrant@ubuntu:~$ kubectl describe configmap index-file-customkey
Name: index-file-customkey
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
myindex: ⇐ 컨피그맵 생성 시 지정한 키 이름을 사용
----
Hello, world!
Events: <none>
여러 개의 키-값 형태의 내용으로 구성된 설정 파일을 한번에 컨피그맵으로 설정
### 키-값 형태의 내용으로 구성된 설정 파일을 생성
vagrant@ubuntu:~$ vi ./multiple-keyvalue.env
mykey1=myvalue1 mykey2=myvalue2 mykey3=myvalue3 |
### 설정 파일에 정의된 키-값 형태를 컨피그맵의 키-값 항목으로 일괄 전환
kubectl create configmap abcd --from-literal mykey1=myvalue1 --from-literal mykey2=myvalue2 --from-literal mykey3=myvalue3 … 형식의 명령어를 파일을 이용해서 구현
vagrant@ubuntu:~$ kubectl create configmap from-envfile --from-env-file ./multiple-keyvalue.env
configmap/from-envfile created
vagrant@ubuntu:~$ kubectl describe configmap from-envfile
Name: from-envfile
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
mykey1:
----
myvalue1
mykey2:
----
myvalue2
mykey3:
----
myvalue3
Events: <none>
YAML 파일로 컨피그맵을 정의
### 컨피그맵을 실제로 생성하지 않고 YAML 형식으로 출력
vagrant@ubuntu:~$ kubectl create configmap my-configmap --from-literal mykey=myvalue --dry-run -o yaml
W0922 04:34:05.917495 358937 helpers.go:553] --dry-run is deprecated and can be replaced with --dry-run=client.
apiVersion: v1
data:
mykey: myvalue
kind: ConfigMap
metadata:
creationTimestamp: null
name: my-configmap
vagrant@ubuntu:~$ kubectl get configmap
NAME DATA AGE ⇒ my-configmap 이름의 컨피그맵이 존재하지 않음
from-envfile 3 4m2s → --dry-run 옵션: 실제로 컨피그맵 오브젝트를 생성하지는 않음
index-file 1 16m
index-file-customkey 1 12m
log-level-configmap 1 3h21m
start-k8s 2 3h20m
### YAML 형식의 출력을 YAML 파일로 저장
vagrant@ubuntu:~$ kubectl create configmap my-configmap --from-literal mykey=myvalue --dry-run -o yaml > my-config.yml
W0922 04:42:17.088587 360577 helpers.go:553] --dry-run is deprecated and can be replaced with --dry-run=client.
vagrant@ubuntu:~$
vagrant@ubuntu:~$ cat my-config.yml
apiVersion: v1
data:
mykey: myvalue
kind: ConfigMap
metadata:
creationTimestamp: null
name: my-configmap
### YAML 파일로 컨피그맵을 생성
vagrant@ubuntu:~$ kubectl apply -f my-config.yml
configmap/my-configmap created
vagrant@ubuntu:~$ kubectl get configmaps
NAME DATA AGE
from-envfile 3 13m
index-file 1 26m
index-file-customkey 1 22m
log-level-configmap 1 3h31m
my-configmap 1 9s
start-k8s 2 3h30m
시크릿(Secret)
민감한 정보를 저장하기 위한 용도
네임스페이스에 종속
시크릿 생성 방법
### password=1q2w3e4r 라는 키-값을 저장하는 my-password 이름의 시크릿을 생성
vagrant@ubuntu:~$ kubectl create secret generic my-password --from-literal password=1q2w3e4r
secret/my-password created
vagrant@ubuntu:~$ kubectl get secrets
NAME TYPE DATA AGE
default-token-sh8hv kubernetes.io/service-account-token 3 3d22h ⇐ ServiceAccount에 의해 네임스페이스별로 자동으로 생성된 시크릿
my-password Opaque 1 9s
### 파일로부터 시크릿을 생성
vagrant@ubuntu:~$ echo mypassword > pw1 && echo yourpassword > pw2
vagrant@ubuntu:~$ cat pw1
mypassword
vagrant@ubuntu:~$ cat pw2
yourpassword
vagrant@ubuntu:~$ kubectl create secret generic out-password --from-file pw1 --from-file pw2
secret/out-password created
vagrant@ubuntu:~$ kubectl get secrets
NAME TYPE DATA AGE
default-token-sh8hv kubernetes.io/service-account-token 3 3d22h
my-password Opaque 1 5m29s
out-password Opaque 2 51s
### 시크릿 내용을 확인
vagrant@ubuntu:~$ kubectl describe secret my-password
Name: my-password
Namespace: default
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
password: 8 bytes ⇐ password 키에 해당하는 값을 확인할 수 없음 (값의 크기(길이)만 출력)
vagrant@ubuntu:~$ kubectl get secret my-password -o yaml
apiVersion: v1
data:
password: MXEydzNlNHI= ⇐ BASE64로 인코딩
kind: Secret
metadata:
creationTimestamp: "2020-09-22T04:49:44Z"
managedFields:
- apiVersion: v1
fieldsType: FieldsV1
fieldsV1:
f:data:
.: {}
f:password: {}
f:type: {}
manager: kubectl-create
operation: Update
time: "2020-09-22T04:49:44Z"
name: my-password
namespace: default
resourceVersion: "81153"
selfLink: /api/v1/namespaces/default/secrets/my-password
uid: e597d8d2-479e-464f-934d-5d2ae7f232c8
type: Opaque
vagrant@ubuntu:~$ echo MXEydzNlNHI= | base64 -d
1q2w3e4r
시크릿에 저장된 키-값 쌍을 포드로 가져오기
### 시크릿에 저장된 모든 키-값 쌍을 포드의 환경변수로 가져오기
vagrant@ubuntu:~$ vi env-from-secret.yml
apiVersion: v1 kind: Pod metadata: name: secret-env-example spec: containers: - name: my-container image: busybox args: ["tail", "-f", "/dev/null"] envFrom: - secretRef: name: my-password |
vagrant@ubuntu:~$ kubectl apply -f env-from-secret.yml
pod/secret-env-example created
vagrant@ubuntu:~$ kubectl exec secret-env-example -- env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=secret-env-example
password=1q2w3e4r
HOSTNAME_SVC_NODEPORT_SERVICE_PORT_WEB_PORT=8080
HOSTNAME_SVC_NODEPORT_PORT=tcp://10.111.29.91:8080
HOSTNAME_SVC_NODEPORT_PORT_8080_TCP_PORT=8080
KUBERNETES_SERVICE_PORT=443
HOSTNAME_SVC_NODEPORT_SERVICE_PORT=8080
KUBERNETES_PORT_443_TCP_PROTO=tcp
HOSTNAME_SVC_NODEPORT_PORT_8080_TCP_ADDR=10.111.29.91
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
HOSTNAME_SVC_NODEPORT_SERVICE_HOST=10.111.29.91
HOSTNAME_SVC_NODEPORT_PORT_8080_TCP=tcp://10.111.29.91:8080
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_SERVICE_HOST=10.96.0.1
HOSTNAME_SVC_NODEPORT_PORT_8080_TCP_PROTO=tcp
HOME=/root
### 시크릿에 저장된 특정 키-값 쌍을 포드의 환경변수로 가져오기
vagrant@ubuntu:~$ cp env-from-secret.yml selective-env-from-secret.yml
vagrant@ubuntu:~$ vi selective-env-from-secret.yml
apiVersion: v1 kind: Pod metadata: name: secret-env-example spec: containers: - name: my-container image: busybox args: ["tail", "-f", "/dev/null"] env: - name: YOUR_PASSWORD valueFrom: secretKeyRef: name: out-password key: pw2 |
vagrant@ubuntu:~$ kubectl delete -f env-from-secret.yml
pod "secret-env-example" deleted
vagrant@ubuntu:~$ kubectl apply -f selective-env-from-secret.yml
pod/secret-env-example created
vagrant@ubuntu:~$ kubectl exec secret-env-example -- env | grep YOUR_PASSWORD
YOUR_PASSWORD=yourpassword ⇐ out-password 시크릿에 pw2 키에 저장되어 있는 값
### 시크릿의 저장된 모든 키-값 데이터를 파일로 포드의 볼륨에 마운트
vagrant@ubuntu:~$ cp env-from-secret.yml volume-mount-secret.yml
vagrant@ubuntu:~$ vi volume-mount-secret.yml
apiVersion: v1 kind: Pod metadata: name: secret-env-example spec: containers: - name: my-container image: busybox args: ["tail", "-f", "/dev/null"] volumeMounts: - name: secret-volume mountPath: /etc/secret ⇐ 컨테이너 내부에 /etc/secret/ 디렉터리 아래에 시크릿에 저장된 키 이름의 volumes: 파일을 생성 (파일 내용은 키에 해당하는 값) - name: secret-volume secret: secretName: out-password |
vagrant@ubuntu:~$ kubectl delete -f selective-env-from-secret.yml
pod "secret-env-example" deleted
vagrant@ubuntu:~$ kubectl apply -f volume-mount-secret.yml
pod/secret-env-example created
vagrant@ubuntu:~$ kubectl exec secret-env-example -- ls /etc/secret
pw1
pw2
vagrant@ubuntu:~$ kubectl exec secret-env-example -- cat /etc/secret/pw1 /etc/secret/pw2
mypassword
yourpassword
### 시크릿의 저장된 특정 키-값 데이터를 파일로 포드의 볼륨에 마운트
vagrant@ubuntu:~$ cp volume-mount-secret.yml selective-volume-secret.yml
vagrant@ubuntu:~$ vi selective-volume-secret.yml
apiVersion: v1 kind: Pod metadata: name: secret-env-example spec: containers: - name: my-container image: busybox args: ["tail", "-f", "/dev/null"] volumeMounts: - name: secret-volume mountPath: /etc/secret volumes: - name: secret-volume secret: secretName: out-password items: - key: pw1 path: password1 |
vagrant@ubuntu:~$ kubectl delete -f volume-mount-secret.yml
pod "secret-env-example" deleted
vagrant@ubuntu:~$ kubectl apply -f selective-volume-secret.yml
pod/secret-env-example created
vagrant@ubuntu:~$ kubectl exec secret-env-example -- ls /etc/secret
password1
vagrant@ubuntu:~$ kubectl exec secret-env-example -- cat /etc/secret/password1
mypassword
시크릿은 사용 목적에 따라 여러 종류의 스크릿을 사용할 수 있음
vagrant@ubuntu:~$ kubectl get secrets
NAME TYPE DATA AGE
default-token-sh8hv kubernetes.io/service-account-token 3 3d23h
my-password Opaque 1 65m
out-password Opaque 2 60m
Opaque 타입
시크릿 종류를 명시하지 않으면 자동으로 설정되는 타입
kubectl create secret generic 명령으로 생성
사용자가 정의한 데이터를 저장할 수 있는 일반적인 목적의 시크릿
kubernetes.io/dockerconfigjson 타입 - private registry에 접근할 때 사용하는 인증 정보를 저장하는 시크릿
#1 ~/.docker/config.json 파일을 이용해서 시크릿을 생성
vagrant@ubuntu:~$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: myanjini
Password:
WARNING! Your password will be stored unencrypted in /home/vagrant/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
vagrant@ubuntu:~$ ls -al ~/.docker
total 12
drwx------ 2 vagrant vagrant 4096 Sep 22 06:06 .
drwxr-xr-x 9 vagrant vagrant 4096 Sep 22 06:06 ..
-rw------- 1 vagrant vagrant 165 Sep 22 06:06 config.json ⇐ docker login 성공하면 도커 엔진이 자동으로 config.js 파일에 인증 정보를 저장, config.json 파일을 그대로 시크릿으로 생성
vagrant@ubuntu:~$ cat ~/.docker/config.json
{
"auths": {
"https://index.docker.io/v1/": {
"auth": "bXzzzmpxxxxQGyyyyU5MjE4" ⇐ BASE64로 인코딩
}
},
"HttpHeaders": {
"User-Agent": "Docker-Client/19.03.6 (linux)"
}
}
vagrant@ubuntu:~$ kubectl create secret generic registry-auth --from-file=.dockerconfigjson=/home/vagrant/.docker/config.json --type=kubernetes.io/dockerconfigjson
secret/registry-auth created
vagrant@ubuntu:~$ kubectl get secrets
NAME TYPE DATA AGE
default-token-sh8hv kubernetes.io/service-account-token 3 4d
my-password Opaque 1 83m
out-password Opaque 2 79m
registry-auth kubernetes.io/dockerconfigjson 1 12s
#2 직접 인증 정보를 명시
vagrant@ubuntu:~$ kubectl create secret docker-registry registry-auth-by-cmd --docker-username=myanjini --docker-password=wkrlvotmdnjem
secret/registry-auth-by-cmd created
vagrant@ubuntu:~$ kubectl get secrets
NAME TYPE DATA AGE
default-token-sh8hv kubernetes.io/service-account-token 3 4d
my-password Opaque 1 89m
out-password Opaque 2 84m
registry-auth kubernetes.io/dockerconfigjson 1 5m53s
registry-auth-by-cmd kubernetes.io/dockerconfigjson 1 31s
TLS 타입
TLS 연결에 사용되는 공개키와 비밀키 등을 저장하는데 사용
포드 내의 애플리케이션이 보안 연결을 위해 인증서나 비밀키 등을 가져와야 할 때 TLS 타입의 시크릿을 제공
kubectl create secret tls 명령으로 생성
#1 테스트용 인증서와 비밀키를 생성
vagrant@ubuntu:~$ openssl req -new -newkey rsa:4096 -days 365 -nodes -x509 -subj "/CN=example.com" -keyout cert.key -out cert.crt
Can't load /home/vagrant/.rnd into RNG
139804440682944:error:2406F079:random number generator:RAND_load_file:Cannot open file:../crypto/rand/randfile.c:88:Filename=/home/vagrant/.rnd
Generating a RSA private key
..................++++
...............................................++++
writing new private key to 'cert.key'
-----
vagrant@ubuntu:~$ ls cert*
cert.crt cert.key
#2 TLS 타입의 시크릿을 생성
vagrant@ubuntu:~$ kubectl create secret tls my-tls --cert ./cert.crt --key ./cert.key
secret/my-tls created
vagrant@ubuntu:~$ kubectl get secrets my-tls -o yaml
apiVersion: v1
data:
tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JS...S0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JS...S0tLS1FTkQgUFJJVkFURSBLRVktLS0tLQo=
kind: Secret
metadata:
creationTimestamp: "2020-09-22T06:40:27Z"
managedFields:
- apiVersion: v1
fieldsType: FieldsV1
fieldsV1:
f:data:
.: {}
f:tls.crt: {}
f:tls.key: {}
f:type: {}
manager: kubectl-create
operation: Update
time: "2020-09-22T06:40:27Z"
name: my-tls
namespace: default
resourceVersion: "87661"
selfLink: /api/v1/namespaces/default/secrets/my-tls
uid: 26b5272a-e3ed-43b0-b082-682c37ef2620
type: kubernetes.io/tls
컨피그맵이나 시크릿의 업데이트한 내용을 애플리케이션에서 사용하는 설정값에 반영
### 컨피그맵 정의(매니페스트) 파일 내용을 확인
vagrant@ubuntu:~$ cat my-config.yml
apiVersion: v1
data:
mykey: myvalue
kind: ConfigMap
metadata:
creationTimestamp: null
name: my-configmap
### 컨피그맵을 생성
vagrant@ubuntu:~$ kubectl apply -f my-config.yml
configmap/my-configmap configured
### 컨피그맵 내용 확인
vagrant@ubuntu:~$ kubectl get configmap my-configmap -o yaml
apiVersion: v1
data:
mykey: myvalue
kind: ConfigMap
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","data":{"mykey":"myvalue"},"kind":"ConfigMap","metadata":{"annotations":{},"creationTimestamp":null,"name":"my-configmap","namespace":"default"}}
creationTimestamp: "2020-09-22T04:44:13Z"
managedFields:
- apiVersion: v1
fieldsType: FieldsV1
fieldsV1:
f:data:
.: {}
f:mykey: {}
f:metadata:
f:annotations:
.: {}
f:kubectl.kubernetes.io/last-applied-configuration: {}
manager: kubectl-client-side-apply
operation: Update
time: "2020-09-22T04:44:13Z"
name: my-configmap
namespace: default
resourceVersion: "80831"
selfLink: /api/v1/namespaces/default/configmaps/my-configmap
uid: 99c5cb04-3798-410b-9fea-0c7fc0db26b8
### kubectl edit 명령으로 컨피그맵 내용을 변경
vagrant@ubuntu:~$ kubectl edit configmap/my-configmap
apiVersion: v1 data: mykey: yuourvalue ⇐ 내용 변경 후 저장 kind: ConfigMap metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | : |
vagrant@ubuntu:~$ kubectl get configmap my-configmap -o yaml
apiVersion: v1
data:
mykey: yourvalue
kind: ConfigMap
metadata:
annotations:
:
### yaml 파일을 수정 후 kubectl apply 명령으로 재생성
vagrant@ubuntu:~$ cat ./my-config.yml
apiVersion: v1
data:
mykey: myvalue
kind: ConfigMap
metadata:
creationTimestamp: null
name: my-configmap
vagrant@ubuntu:~$ sed -i -e 's/myvalue/ourvalues/g' my-config.yml
vagrant@ubuntu:~$ cat ./my-config.yml
apiVersion: v1
data:
mykey: ourvalues
kind: ConfigMap
metadata:
creationTimestamp: null
name: my-configmap
vagrant@ubuntu:~$ kubectl apply -f my-config.yml
configmap/my-configmap configured ⇐ 변경
vagrant@ubuntu:~$ kubectl get configmap my-configmap -o yaml
apiVersion: v1
data:
mykey: ourvalues
kind: ConfigMap
metadata:
annotations:
:
컨피그맵의 내용이 업데이트 되었을 때, 변경된 내용이 파드에 반영되는 것을 확인
### 컨피그맵을 사용한 파드 생성 확인
vagrant@ubuntu:~$ cat volume-mount-configmap.yml
apiVersion: v1
kind: Pod
metadata:
name: configmap-volume-pod
spec:
containers:
- name: my-container
image: busybox
args: ["tail", "-f", "/dev/null"]
volumeMounts:
- name: configmap-volume
mountPath: /etc/config
volumes:
- name: configmap-volume
configMap:
name: start-k8s
vagrant@ubuntu:~$ kubectl apply -f volume-mount-configmap.yml
pod/configmap-volume-pod created
vagrant@ubuntu:~$ kubectl exec configmap-volume-pod -- cat /etc/config/container
docker
dockervagrant@ubuntu:~$ kubectl edit configmap/start-k8s
container 키의 값을 docker 에서 docker_and_kubernetes 로 변경 후 저장
configmap/start-k8s edited
vagrant@ubuntu:~$ kubectl get configmap start-k8s -o yaml
apiVersion: v1
data:
container: docker_and_kubernetes ⇐ 컨피그맵 오브젝트는 변경된 것을 확인
k8s: kubernetes
kind: ConfigMap
metadata:
creationTimestamp: "2020-09-22T01:14:20Z"
managedFields:
- apiVersion: v1
fieldsType: FieldsV1
fieldsV1:
f:data:
.: {}
f:k8s: {}
:
vagrant@ubuntu:~$ kubectl exec configmap-volume-pod -- cat /etc/config/container
docker_and_kubernetes ⇐ 변경이 반영된 것을 확인
리소스 정리
vagrant@ubuntu:~$ kubectl delete deployment,replicaset,pod,service,configmap,secret --all
or
vagrant@ubuntu:~$ minikube stop
vagrant@ubuntu:~$ minikube delete ⇐ 모든 리소스 삭제
vagrant@ubuntu:~$ minikube start
# docker-compose.yml
version: "3.3"
services:
frontend:
image: zzid/safehome-fe
ports:
- "80:80"
restart: always
backend:
image: likeyu96/django-docker
ports:
- "8000:8000"
restart: always
# docker-compose up
# http://가상머신IP(192.168.111.110)/
'클라우드 > Kubernetes(쿠버네티스)' 카테고리의 다른 글
[쿠버네티스] 컨트롤러(데몬세트, 스테이트풀세트, 잡, 크론잡) (0) | 2021.06.06 |
---|---|
[쿠버네티스] 컨트롤러(레플리케이션 컨트롤러, 레플리카세트, 디플로이먼트) (0) | 2021.06.05 |
[클라우드] PaaS-TA (0) | 2021.05.27 |
[쿠버네티스] ReplicaSet & 디플로이먼트(Deployment) & 서비스 & 네임스페이스 (0) | 2020.09.22 |
[쿠버네티스] kubectl & Pods (0) | 2020.09.21 |