기본적인 환경 변수 사용
환경변수는 컨테이너 내에서 설정되는 간단한 키-값 쌍으로, 애플리케이션의 동작을 조정하는 데 유용
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: my-app-image
env:
- name: ENV_VARIABLE_1
value: "value1"
- name: ENV_VARIABLE_2
value: "value2"
위와 같이 ENV_VARIABLE_1 : "value1" 등의 값을 정적 설정을 통해서 사용 가능
kubectl exec -it sample-env --env | grep ENV_VARIABLE_1 으로 확인 가능함
아래와 같이 타임존에 대해서 UTC(기본값)을 제외한 다른 값도 변경 가능
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: alpine:latest
env:
- name: TZ
value: "Asia/Seoul"
파드정보, 컨테이너 정보
fieldRef는 파드 내부 또는 파드와 관련된 쿠버네티스 API 오브젝트의 필드 값을 가져와서 환경변수로 설정하는 데 사용.
이를 통해 쿠버네티스 클러스터의 상태 정보를 환경변수로 쉽게 사용가능
valueFrom과 fieldRef를 사용하여 환경변수를 설정하는 예시
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: my-app-image
env:
- name: MY_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
위 YAML 파일에서 fieldRef를 사용하여 MY_NAMESPACE 환경변수를 설정. (fieldPath는 파드의 metadata.namespace 값을 참조)
(컨테이너 정보는 더 이상 기본적으로 제공안함)
(주의사항 : command나 args에서 정의된 환경변수를 사용하려면 ${}이 아니라 $()을 사용해야 한다.)
시크릿
(https://kubernetes.io/docs/concepts/configuration/secret/)
쿠버네티스 시크릿(Secret)은 민감한 데이터를 안전하게 저장하고 관리하는 데 사용되는 리소스입니다. 암호, API 토큰, 데이터베이스 비밀번호 등과 같이 애플리케이션에 사용되는 민감한 정보를 안전하게 저장할 때 유용합니다. 시크릿은 Base64 인코딩된 데이터로 저장되기 때문에, 평문으로 노출되는 것을 방지하여 더욱 안전한 환경을 제공합니다.
(My sql 데이터 베이스 접속 정보 등 기밀 정보)
쿠버네티스 시크릿은 크게 두 가지 유형으로 생성될 수 있습니다:
1. Opaque: Opaque 시크릿은 가장 일반적인 시크릿 유형입니다. 이 유형은 사용자가 지정한 임의의 키-값 쌍을 저장할 수 있습니다. 값들은 base64로 인코딩되어 저장되므로 보안을 위해서라면 base64로 인코딩된 데이터를 다시 디코딩하는 작업이 필요합니다.
kubectl create secret generic my-opaque-secret --from-literal=key1=value1 --from-literal=key2=value2
2. TLS: TLS 시크릿은 SSL/TLS 인증서와 개인 키를 저장하는 데 사용됩니다. 주로 HTTPS를 지원하는 서비스를 배포할 때 사용되며, 인증서와 키를 쌍으로 저장하고 관리할 수 있습니다.
kubectl create secret tls my-tls-secret --cert=path/to/cert.crt --key=path/to/key.key
3. DockerConfigJSON: 이 유형의 시크릿은 Docker 레지스트리에 대한 인증 정보를 저장하는 데 사용됩니다. Docker 레지스트리에 이미지를 푸시하거나 풀(다운로드)할 때 사용자의 권한을 인증하는 데 필요한 데이터를 포함합니다.
kubectl create secret docker-registry my-docker-secret --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USERNAME --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL
4. Generic: Generic 시크릿은 Opaque 시크릿과 비슷하게 임의의 키-값 쌍을 저장하는 데 사용됩니다. 하지만 Generic 시크릿은 값을 base64로 인코딩하지 않기 때문에 사용자가 직접 데이터를 암호화하여 저장해야 합니다.
kubectl create secret generic my-generic-secret --from-literal=key1=value1 --from-file=path/to/file.txt
5. SSH: SSH 시크릿은 SSH 키를 저장하는 데 사용됩니다. 이는 파드가 SSH 프로토콜을 사용하여 다른 노드에 연결해야 할 때 사용될 수 있습니다.
kubectl create secret generic my-ssh-secret --from-file=ssh-privatekey=path/to/id_rsa --from-file=ssh-publickey=path/to/id_rsa.pub
6. ServiceAccount: ServiceAccount 시크릿은 쿠버네티스 내부에서 사용되는 인증 정보를 포함합니다. 주로 파드(Pod)들이 API 서버와 통신할 때 사용되는 인증 토큰이 포함되어 있습니다. 이를 통해 파드들은 클러스터 내부의 리소스에 접근할 수 있습니다.
- 쿠버네티스가 ServiceAccount를 생성하고 관리하므로 개별적인 명령어로 생성할 필요는 없음
7. BootstrapToken: BootstrapToken 시크릿은 쿠버네티스 클러스터의 부트스트랩 토큰을 저장하는 데 사용됩니다. 부트스트랩 토큰은 쿠버네티스 클러스터에 새로운 노드를 가입시키는 데 사용되는 인증 정보입니다.
- 클러스터를 부트스트랩할 때 생성
8. Certificate: Certificate 시크릿은 인증서와 개인 키를 저장하는 데 사용됩니다. 주로 HTTPS를 지원하는 서비스나 TLS 기반의 통신을 위해 사용됩니다.
- TLS 인증서를 생성하여 시크릿으로 저장하는 경우에 사용
9. kubernetes.io/service-account-token: 이 시크릿은 ServiceAccount와 관련된 토큰 정보를 저장합니다. ServiceAccount 생성 시 자동으로 생성되는 시크릿으로, ServiceAccount와 연결된 토큰 정보를 제공합니다.
- 쿠버네티스가 각 ServiceAccount에 대해 자동으로 해당 시크릿을 생성
시크릿 사용하기
1. 생성
kubectl create secret generic my-secret --from-literal=USERNAME=myusername --from-literal=PASSWORD=mypassword
2. 환경변수로 전달 및 파드 생성
- valueFrom: secretKeyRef로 환경변수로 추가 (my-secret-USERNAME 으로 저장된 시크릿 값을 MY_USERNAME 으로 사용)
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: my-image
env:
- name: MY_USERNAME
valueFrom:
secretKeyRef:
name: my-secret
key: USERNAME
- name: MY_PASSWORD
valueFrom:
secretKeyRef:
name: my-secret
key: PASSWORD
시크릿에 저장된 Env 전체를 key value 값으로 가져 올 수도 있다.
여러개의 시크릿을 가져올 경우 접두사를 통해 시크릿을 구별 가능
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: my-image
envFrom:
- secretRef:
name: my-secret
prefix: db1_
- secretRef:
name: my-secret
prefix: db2_
볼륨으로 마운트 할 수도 있다.
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: my-image
volumeMounts:
- name: secret-volume
mountPath: /etc/my-secrets
volumes:
- name: secret-volume
secret:
secretName: my-secret
볼륨으로 마운트한 경우 동적으로 시크릿의 변경사항에 대해서 업데이트가 가능해 진다.
kubelet의 --sync-frequency 옵션을 지정해서 기본 업데이트 주가(60초)를 변경 하는것도 가능하다.
대신 pod 기동 시에 환경변수로 사용한 값은 동적으로 변경 할 수는 없다.
Practice
How many secrets?
How many secrets are defined in the dashboard-token secret?
What is the type of the dashboard-token secret?
controlplane ~ ➜ kubectl get secrets
NAME TYPE DATA AGE
dashboard-token kubernetes.io/service-account-token 3 33s
secrets 1개, data 3개 , service-account-token 시크릿
Which of the following is not a secret data defined in dashboard-token secret?
1. ca.crt
2. token
3. type
4. namespace
controlplane ~ ✖ kubectl describe secret dashboard-token
Name: dashboard-token
Namespace: default
Labels: <none>
Annotations: kubernetes.io/service-account.name: dashboard-sa
kubernetes.io/service-account.uid: a2b94097-4526-4fc0-a63b-d978cfec9d9a
Type: kubernetes.io/service-account-token
Data
====
namespace: 7 bytes
token: eyJhbGciOiJSUzI1NiIsImtpZCI6Im5JVl9kUDUwbk8ySjZpX2QzX1hjY2ZmWUJVelFfWFZDdE5qSFVsUlFVSmMifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImRhc2hib2FyZC10b2tlbiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJkYXNoYm9hcmQtc2EiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiJhMmI5NDA5Ny00NTI2LTRmYzAtYTYzYi1kOTc4Y2ZlYzlkOWEiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6ZGVmYXVsdDpkYXNoYm9hcmQtc2EifQ.Rd30Cqh0YXWRVEIOC_CJjimJmQv-IscD0xJbSwycFIg4DrPko5hS9l50bJip_MUlvyYXKUKt0-5jLOcKm0GiB0BoMgye6uoo0oQ2gS74G84EYK_mvV_jRxdAoaxlW0RlvaOFnCyvWJqnZkNat8hSNzKDeXfp4xc1VvDQKY_7uBqICoULJ9AcZBYwUZRzfZpVFJWg0X5WJTfJOwE9mmId1Jzm3RDTGzyxKI50t7k2sJaSXeVTnh6sc8oUxqHSTalxjzlg3UhphHUSGlUsQOCY6s4YUVAeDzU-IMhpwEYzI5BZBVB7jdOGXZrFXumTkHwRm4zR2R8_WBkVv8_o5poaLQ
ca.crt: 570 bytes
type은 없음
'Tools > K8S' 카테고리의 다른 글
K8S Ingress & Egress Gateway (0) | 2024.03.25 |
---|---|
Kubernetes PV & PVC (0) | 2023.08.12 |
Kubernetes Deployment (0) | 2023.07.01 |
Kubernetes ReplicaSet (0) | 2023.07.01 |
Kubernetes Config (1) | 2023.06.17 |