1. Secret
1.1. 정의
시크릿은 암호, 토큰 또는 키와 같은 소량의 중요한 데이터를 포함하는
오브젝트이다. 이를 사용하지 않으면 중요한 정보가 파드 명세나 컨테이너
이미지에 포함될 수 있다. 시크릿을 사용한다는 것은 사용자의 기밀 데이터를
애플리케이션 코드에 넣을 필요가 없음을 뜻한다.
1.2. 사용 목적
시크릿을 사용하는 파드와 독립적으로 생성될 수 있기 때문에, 파드를 생성하고,
확인하고, 수정하는 워크플로우 동안 시크릿(데이터)이 노출되는 것에 대한 위험을
경감시킬 수 있다. 쿠버네티스 및 클러스터에서 실행되는 애플리케이션은 비밀
데이터를 비휘발성 저장소에 쓰는 것을 피하는 것과 같이, 시크릿에 대해 추가 예방
조치를 취할 수도 있다.
1.3. 종류
1.3.1. Opaque(generic)
● 일반적인 용도의 시크릿이다.
● ConfigMap과 동일한 목적으로 사용할 수 있다.
● 민감한 데이터를 컨테이너에 전달하는 목적으로도 사용할 수 있다.
1.3.2. dockerconfigjson
● 도커 이미지 저장소 인증 정보이다.
● 쿠버네티스는 컨테이너를 관리해야 하기 때문에, 이미지 저장소에 접근할 수 있어야한다.
● 다만 도커 허브나 ECR같은 레지스트리 서비스에는 Public과 Private 이미지가 있어서, Private 이미지를 가져올 때는 추가적인 인증절차를 밟아야 한다.
● 인증에 필요한 정보를 Secret에 생성을 해두고, Pod를 띄울 때마다 이미지 pull에 필요한 Secret을 사용할 수 있게 해야 한다. dockerconfigjson는 그런 Private 레지스트리에 접근할 때 사용하는 Secret인 것이다.
1.3.3. tls
● TLS 인증서를 Secret으로 관리할 수 있게 도와준다.
● TLS 인증서 정보를 Secret에 올려두게 되면, Pod나 Service와 같은 오브젝트에서 TLS 인증서 정보를 가져다가 통신 암호화를 수행하거나 할 수 있다.
1.3.4. service-account-token
● RBAC, 즉 사용 접근 제어를 해야할 때 사용하는 대표적인 쿠버네티스의 API 리소스인 ServiceAccount와 연관이 있다.
● ServiceAccount는 Pod에 연결이 되어, 해당 Pod의 권한을 설정해주는 역할을 한다. 그리고 ServiceAccount를 연결시켜주게 되면 ServiceAccount에 대한 인증 정보를 담은 토큰이 Secret으로 자동 생성 된다.
1.4. 예시
# secret 명령어의 종류 확인 [asd@ubu22-01 ~ (kubernetes-admin@cluster.local:happy)]$ kubectl create secret --help Create a secret using specified subcommand. # 시크릿 생성의 3가지 방법 Available Commands: docker-registry Create a secret for use with a Docker registry generic Create a secret from a local file, directory, or literal value tls Create a TLS secret Usage: kubectl create secret [flags] [options] Use "kubectl <command> --help" for more information about a given command. Use "kubectl options" for a list of global command-line options (applies to all commands). [asd@ubu22-01 ~ (kubernetes-admin@cluster.local:happy)]$ k create secret generic webpasswd --from-literal=passwd="dkagh1." secret/webpasswd created [asd@ubu22-01 ~ (kubernetes-admin@cluster.local:happy)]$ k describe configmaps env-test Name: env-test Namespace: happy Labels: <none> Annotations: <none> Data ==== my_emotion: ---- happy Binary Data ==== Events: <none> # secret으로 생성한 webpasswd의 상태를 확인 [asd@ubu22-01 ~ (kubernetes-admin@cluster.local:happy)]$ k describe secrets webpasswd Name: webpasswd Namespace: happy Labels: <none> Annotations: <none> Type: Opaque Data ==== passwd: 7 bytes #(dkagh1.) |
# webpasswd를 yaml 형식으로 확인 [asd@ubu22-01 ~ (kubernetes-admin@cluster.local:happy)]$ k get secret webpasswd -o yaml apiVersion: v1 data: passwd: ZGthZ2gxLg== # 입력한 passwd 값이 base64로 인코딩 되어 보인다. kind: Secret metadata: creationTimestamp: "2023-08-14T06:07:16Z" name: webpasswd namespace: happy resourceVersion: "231223" uid: 3c4a91b9-f4fe-4681-8680-876fefb514f8 type: Opaque # nginx 생성 yaml 파일 [asd@ubu22-01 ~ (kubernetes-admin@cluster.local:happy)]$ vi secnginx.yaml apiVersion: v1 kind: Pod metadata: labels: run: nginx name: nginx spec: containers: - image: docker.io/library/nginx name: nginx volumeMounts: - name: vol mountPath: "/secrets" volumes: - name: vol secret: secretName: webpasswd # 기존에 설치된 nginx 제거. 동일한 이름의 pod로는 생성 불가능. [asd@ubu22-01 ~ (kubernetes-admin@cluster.local:happy)]$ k delete pod nginx pod "nginx" deleted # secnginx로 nginx 생성 [asd@ubu22-01 ~ (kubernetes-admin@cluster.local:happy)]$ k apply -f secnginx.yaml pod/nginx created |
# 컨테이너 내부로 진입 [asd@ubu22-01 ~ (kubernetes-admin@cluster.local:happy)]$ k exec -it nginx -- bash root@nginx:/# ls bin dev docker-entrypoint.sh home lib32 libx32 mnt proc run secrets sys usr boot docker-entrypoint.d etc lib lib64 media opt root sbin srv tmp var root@nginx:/# cd secrets/ root@nginx:/secrets# ls passwd # 컨테이너 내부에서 확인하면 암호화 되어있지 않다. root@nginx:/secrets# cat passwd dkagh1.root@nginx:/secrets# |