자습서: 중요한 구성 데이터를 Kubernetes 기밀로 저장하는 방법

안녕하십니까?👋👋 우리는'요언의 쿠버네트'여행을 계속한다!이전의 한 블로그에서 우리는 보았다.본고에서 우리는 KubernetesSecrets와 이를 어떻게 사용하여 보안 처리가 필요한 민감한 설정 데이터, 예를 들어 데이터베이스 인증서, API 키 등을 저장하는지 연구하고자 한다.
이 예제는 여느 때와 마찬가지로 구동됩니다.
  • 생성 방법Secrets(CLI, yaml 등) 및
  • 애플리케이션에서 다양한 방식(환경 변수, 볼륨 등) 사용
  • 코드(및YAML!)사용 가능on GitHub

    Happy to get your feedback via or just drop a comment 🙏🏻


    이 블로그는 두 가지 논리적 섹션으로 나뉩니다.
  • 작성 방법Secrets
  • 어플리케이션에서 사용Secrets 기술

  • 선행 조건:


    본고의 예시를 보려면 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 Secret details using kubectl get does 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
    
    base64stringData의 값은 순수한 텍스트 형식으로 전달됩니다.생성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 data section 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
    
    이 결과stringDataSecret라는 키를 포함하고, 그 내용(값)은 제공된 데이터의 인코딩이 될 것이다 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 Secret configuration. 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'
    
    사용Secret
    kubectl create secret generic topsecret --from-file=api_keys.txt
    
    이렇게 하면
  • 파일 이름이 같은 키, 즉 base64, 이 예에서
  • 및 파일 컨텐트 값
  • 디렉토리에서 파일
    디렉터리 하나만 가리키면 모든 파일이 생성됩니다 --from-file
    kubectl 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 상태로 전환합니다.그리고 환경 변수가 주입되었는지 확인Pod
    kubectl 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
    
    우리가 사용하는 SecretenvFrom Pod 을 가리킨다.이 만들기 plaintext-secret
    kubectl 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
    
    이것은 PodPod가 각각 환경 변수와 디코딩 값RunningfooPod에 추가됨을 증명하였다
    두루마리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 가 파일 (이름 SecretPod 디렉터리에 불러온 것을 확인합니다.파일의 내용은 비밀 값에 불과하다. 즉, 이 예에서 Pod사용Running응용 프로그램 Pod에서 개인 Docker 등록표에서 Docker 이미지를 검증하고 추출하는 데 사용할 수 있는 방법apikey이 있습니다.
    실제로는 세 가지 유형이 있다service-apikey
  • apikey - 지금까지 예시된 바와 같이 키 값을 저장하는 데 사용됩니다
  • /secret - 상점 공공.개인 키 대 정보 asfoobar
  • imagePullSecrets - Docker 레지스트리의 자격 증명을 확인합니다.
  • 이 기술의 사용법은 매우 간단하다.
  • 사용SecretsSecrets 유형은 Kubernetes
  • 에 개인 Docker 레지스트리 자격 증명을 저장합니다.
  • 그리고generic(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.nameit
    docker 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 ErrImagePull error, 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;donePod에 적용됩니다. 즉, Pod만 동일imagePullSecrets에서만 사용할 수 있습니다.
  • 키가 존재하지 않는 것에 대한 참조가 Secret(사용Secrets
  • 에 있는 경우 Secret가 시작되지 않습니다.
  • 1MiB는 단일 Pod 크기 제한입니다.
  • 이번 호 《요컨대 쿠베르네츠》 시리즈는 여기까지다.더 많은 관심 부탁드립니다!
    Kubernete와 용기를 배우는 데 관심이 있으시면 Azure 시작하세요!좋은 출발점은 문서의 create a free account 를 사용하여 서비스를 익히는 것이다.나는 또한 보기를 강력히 건의한다quickstarts, tutorials and code samples.고급 사용자는 50 days Kubernetes Learning Path 또는 Kubernetes best practices 중 일부 프레젠테이션, 최고급 기능 및 기술 회의를 참조하기를 원할 수 있습니다.
    나는 정말 네가 좋아하고 이 문장에서 뭔가를 배웠으면 좋겠다🙌 만약 당신이 한다면 좋아하고 따라가세요!

    좋은 웹페이지 즐겨찾기