자습서: 중요한 구성 데이터를 Kubernetes 기밀로 저장하는 방법
Secrets와 이를 어떻게 사용하여 보안 처리가 필요한 민감한 설정 데이터, 예를 들어 데이터베이스 인증서, API 키 등을 저장하는지 연구하고자 한다.이 예제는 여느 때와 마찬가지로 구동됩니다.
Secrets(CLI, yaml 등) 및 YAML!)사용 가능on GitHubHappy to get your feedback via or just drop a comment 🙏🏻
이 블로그는 두 가지 논리적 섹션으로 나뉩니다.
SecretsSecrets 기술
선행 조건:
본고의 예시를 보려면
minikube 클러스터와 kubectl CLI 도구 하나만 있으면 클러스터를 방문할 수 있습니다.minikube 를 컴퓨터의 가상 시스템에 단일 노드 Kubernetes 클러스터로 설치합니다.Mac 컴퓨터에서 간단히 다음을 수행할 수 있습니다.curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-amd64 \
&& chmod +x minikube
sudo mv minikube /usr/local/bin
kubectl 클러스터와 상호 작용하도록 설치minikube.Mac 컴퓨터에서 다음을 수행할 수 있습니다.curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/darwin/amd64/kubectl
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl
비밀을 만들다
창설
Secret의 기술을 살펴보겠습니다.목록 파일 사용
사용
data 섹션정의된
Secret 부분에 저장된 설정 데이터를 키 값으로 만들 수 있습니다.apiVersion: v1
kind: Secret
metadata:
name: service-apikey
data:
apikey: Zm9vYmFy
data 민감한 정보를 나타내는 키 값 데이터가 포함되어 있으며, 그 중에서 Secret 키는 키이고, 값은 apikey 인코딩 문자열이다Kubernetes에서 만들려면
base64:kubectl apply -f https://raw.githubusercontent.com/abhirockzz/kubernetes-in-a-nutshell/master/secrets/secret-data.yaml
To keep things simple, the YAML file is being referenced directly from the GitHub repo, but you can also download the file to your local machine and use it in the same way.
확인
Secret이 생성되었습니다.kubectl get secret/service-apikey -o yaml
다음과 같은 (YAML) 응답을 받게 됩니다.apiVersion: v1
data:
apikey: Zm9vYmFy
kind: Secret
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","data":{"apikey":"Zm9vYmFy"},"kind":"Secret","metadata":{"annotations":{},"name":"service-apikey","namespace":"default"}}
creationTimestamp: "2019-12-17T11:11:27Z"
name: service-apikey
namespace: default
resourceVersion: "113009"
selfLink: /api/v1/namespaces/default/secrets/service-apikey
uid: 671b547c-3316-4916-b6dc-be2b551b974e
type: Opaque
Fetching the
Secretdetails usingkubectl getdoes not disclose its contents
참고
Secret 는 YAML 목록에서 제공합니다.디코딩을 통해 일반 텍스트 양식을 확인할 수 있습니다.echo 'Zm9vYmFy' | base64 --decode
//foobar
사용apikey: Zm9vYmFy 섹션이전 예에서 사용된
stringData 속성은 인코딩 정보를 저장하는 데 사용됩니다.순수한 텍스트 데이터를 안전하게 저장하려면 data 절을 사용하십시오.다음은 예입니다.apiVersion: v1
kind: Secret
metadata:
name: plaintext-secret
stringData:
foo: bar
mac: cheese
base64와 stringData의 값은 순수한 텍스트 형식으로 전달됩니다.생성foo 및 확인:kubectl apply -f https://raw.githubusercontent.com/abhirockzz/kubernetes-in-a-nutshell/master/secrets/secret-plaintext.yaml
kubectl get secret/plaintext-secret -o yaml
YAML 응답 mac 섹션입니다.실제 데이터는 Secret단 인코딩 형식으로 저장된다data:
foo: YmFy
데이터를 디코딩하면 원래 텍스트 입력 data 과 일치하는지 확인할 수 있습니다.echo 'YmFy' | base64 --decode
//bar
Note that
datasection does not accept plain text attribute. Trying to do so will result in error similar to this:illegal base64 data at input byte 8
파일 내용
전체 파일의 내용을 입력
base64 부분에 제공할 수도 있습니다!이 가능하다, ~할 수 있다,...apiVersion: v1
kind: Secret
metadata:
name: secret-in-a-file
stringData:
app-config.yaml: |-
hello: world
john: doe
이 생성bar:kubectl apply -f https://raw.githubusercontent.com/abhirockzz/kubernetes-in-a-nutshell/master/secrets/secret-file.yaml
이 결과stringData는 Secret라는 키를 포함하고, 그 내용(값)은 제공된 데이터의 인코딩이 될 것이다 Secret평소처럼 쿠베르니테스에서 이 점을 확인하고 내용을 디코딩하세요kubectl get secret/secret-in-a-file -o yaml
echo '<"data" content in yaml response> | base64 --decode
Note: when you use this technique, your application is responsible for parsing out the data which represents the
Secretconfiguration. In this case, it happens to be newline-separated key-value pairs, but it could be anything else
응용 프로그램 구성을 사용합니다.아마르
base64 명령을 사용하여 기밀 객체를 작성할 수 있습니다.사용
kubectl일반 텍스트 데이터를 사용하여 CLI를 사용하여 생성kubectl create secret(Kubernetes의 --from-literal 인코딩 형식으로 저장)kubectl create secret generic redis-credentials --from-literal=user=poweruser --from-literal=password='f0ob@r'
사용Secretkubectl create secret generic topsecret --from-file=api_keys.txt
이렇게 하면base64, 이 예에서 디렉터리 하나만 가리키면 모든 파일이 생성됩니다
--from-filekubectl create secret generic topsecrets --from-file=/home/credentials/
너는 결국기밀을 사용하다
기밀을 유용하게 사용하려면 응용 프로그램, 즉
topsecrets에 사용할 수 있도록 확보해야 합니다. 이를 실현하는 방법을 탐색해 봅시다.환경 변수
api_keys.txt 데이터를 Secret 의 환경 변수로 사용할 수 있습니다 (예: Pod.다음은 예입니다.apiVersion: v1
kind: Pod
metadata:
name: pod1
spec:
containers:
- name: nginx
image: nginx
env:
- name: API_KEY
valueFrom:
secretKeyRef:
name: service-apikey
key: apikey
우리는 SecretPod의 키ConfigMap를 사용하고 그 값이 apikey의 환경 변수Secret로 사용할 수 있는지 확인합니다.만들기
service-apikey (이전 예시에 따라 만든 비밀이 있다고 가정) 및 확인kubectl apply -f https://raw.githubusercontent.com/abhirockzz/kubernetes-in-a-nutshell/master/secrets/pod-secret-env.yaml
kubectl get pods -w
대기 API_KEY 상태에서 Pod 상태로 전환합니다.그리고 환경 변수가 주입되었는지 확인Podkubectl exec pod1 -- env | grep API_KEY
다음 답변을 받으셔야 합니다 - PodRunning 를 사용하면 참조Pod의 단일 항목이 아니라 모든 항목을 API_KEY=foobar 의 환경 변수로 편리하게 사용할 수 있습니다.다음과 같이 사용할 수 있습니다.apiVersion: v1
kind: Pod
metadata:
name: pod2
spec:
containers:
- name: nginx
image: nginx
envFrom:
- secretRef:
name: plaintext-secret
우리가 사용하는 Secret 은 envFrom Pod 을 가리킨다.이 만들기 plaintext-secretkubectl apply -f https://raw.githubusercontent.com/abhirockzz/kubernetes-in-a-nutshell/master/secrets/pod-secret-envFrom.yaml
kubectl get pods -w
대기Secret상태envFrom.secretRef로 전환한 다음 환경 변수가 있는지 확인합니다.kubectl exec pod2 -- env | grep foo
//foo=bar
kubectl exec pod2 -- env | grep mac
//mac=cheese
이것은 Pod과Pod가 각각 환경 변수와 디코딩 값Running과fooPod에 추가됨을 증명하였다두루마리
mac 을(를) the 에 설치할 수 있습니다.예를 들면apiVersion: v1
kind: Pod
metadata:
name: pod3
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: apikey-config-volume
mountPath: /secret
readOnly: true
volumes:
- name: apikey-config-volume
secret:
secretName: service-apikey
bar권지cheeseSecrets.이것을 만들려면Volume:kubectl apply -f https://raw.githubusercontent.com/abhirockzz/kubernetes-in-a-nutshell/master/secrets/pod-secret-volume.yaml
kubectl get pods -w
대기 Pod 상태에서 apikey-config-volume 상태로 전환합니다.다음 명령을 수행합니다.kubectl exec pod3 -- cat /secret/apikey
//foobar
이것은 비밀 키 service-apikey 가 파일 (이름 Secret 로 Pod 디렉터리에 불러온 것을 확인합니다.파일의 내용은 비밀 값에 불과하다. 즉, 이 예에서 Pod사용Running응용 프로그램 Pod에서 개인 Docker 등록표에서 Docker 이미지를 검증하고 추출하는 데 사용할 수 있는 방법apikey이 있습니다.실제로는 세 가지 유형이 있다
service-apikeyapikey - 지금까지 예시된 바와 같이 키 값을 저장하는 데 사용됩니다 /secret - 상점 공공.개인 키 대 정보 asfoobarimagePullSecrets - Docker 레지스트리의 자격 증명을 확인합니다.SecretsSecrets 유형은 Kubernetesgeneric(Pod에서) Docker 레지스트리 자격 증명tls 참조예를 들면 항상 도움이 된다.
apiVersion: v1
kind: Pod
metadata:
name: pod4
spec:
containers:
- name: privateapp
image: abhirockzz/test-private-repo:latest
command: ["/bin/sh"]
args: ["-c", "while true; do date; sleep 5;done"]
imagePullSecrets:
- name: docker-repo-secret
Secrets라고 하는 docker-registry를 참조하십시오.만들래요.But, before that please ensure that you have a private Docker registry - I used
DockerHub, but you can choose any other
먼저
docker-registry 명령을 사용하여 Docker 자격 증명이 포함된 Secret 을 만듭니다.kubectl create secret docker-registry docker-repo-secret --docker-server=DOCKER_REG_SERVER --docker-username=DOCKER_REG_USERNAME --docker-password=DOCKER_REG_PASSWORD --docker-email=DOCKER_REG_EMAIL
Docker Hub의 경우(예:kubectl create secret docker-registry docker-repo-secret --docker-server=https://index.docker.io/v1/ --docker-username=foobarbaz --docker-password=t0ps3cr3t [email protected]
kubectl get secret/docker-repo-secret -o yaml
https://index.docker.io/v1/is the Docker Hub registry server
테스트를 위해
imagePullSecrets 이미지와 Secret 이미지를 사용합니다.docker pull busybox
docker tag busybox [DOCKER_REG]/[DOCKER_PRIVATE_REPO]:[IMAGE_TAG]
e.g.
docker tag busybox abhirockzz/test-private-repo:latest
... 및 imagePullSecrets.nameitdocker push [DOCKER_REG]/[DOCKER_PRIVATE_REPO]:[IMAGE_TAG]
e.g.
docker push abhirockzz/test-private-repo:latest
개인 환매 준비가 완료되면 Secret 을 만들 수 있습니다. docker-repo-secret 을 통해 제공된 등록표 증빙서류를 사용하여 개인 환매에서 이미지를 추출할 수 있습니다.kubectl apply -f https://raw.githubusercontent.com/abhirockzz/kubernetes-in-a-nutshell/master/secrets/pod-secret-docker.yaml
kubectl get pods -w
대기 Secret 상태docker-repo-secret로 이동합니다.If you see an
ErrImagePullerror, it indicates that there might be problem authenticating to the Docker registry. To get details use:kubectl describe pod/pod4
크레인 정상 확인:
kubectl create secret docker-registrybusybox 이미지 자체가 실제로 아무것도 하지 않았기 때문에 우리는 tag (예를 들어 push 규범에서 제공한 것) 을 실행한다.따라서 로그를 보셔야 합니다 (5초마다 인쇄)Tue Dec 17 14:17:34 UTC 2019
Tue Dec 17 14:17:39 UTC 2019
Tue Dec 17 14:17:44 UTC 2019
Tue Dec 17 14:18:49 UTC 2019
다 좋아요!이것은 Pod이 Docker 자격 증명을 사용하여 개인 Docker 재구매에서 이미지를 추출할 수 있음을 의미합니다. Docker 자격 증명은 Pod 을 사용하여 주입되고 Secret 자체는 Pod 를 참조합니다.반갑습니다.
다음은
Running 사용 시 기억해야 할 사항 목록입니다.kubectl logs -f pod4 를 사용하려는 모든 busybox 이전에 만들어야 합니다.while true; do date; sleep 5;done은Pod에 적용됩니다. 즉, Pod만 동일imagePullSecrets에서만 사용할 수 있습니다.Secret(사용SecretsSecret가 시작되지 않습니다.Pod 크기 제한입니다.Kubernete와 용기를 배우는 데 관심이 있으시면 Azure 시작하세요!좋은 출발점은 문서의 create a free account 를 사용하여 서비스를 익히는 것이다.나는 또한 보기를 강력히 건의한다quickstarts, tutorials and code samples.고급 사용자는 50 days Kubernetes Learning Path 또는 Kubernetes best practices 중 일부 프레젠테이션, 최고급 기능 및 기술 회의를 참조하기를 원할 수 있습니다.
나는 정말 네가 좋아하고 이 문장에서 뭔가를 배웠으면 좋겠다🙌 만약 당신이 한다면 좋아하고 따라가세요!
Reference
이 문제에 관하여(자습서: 중요한 구성 데이터를 Kubernetes 기밀로 저장하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/itnext/tutorial-how-to-use-kubernetes-secrets-for-storing-sensitive-config-data-3dl5텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)