실습

Generic

  1. Secret 생성

    kubectl create secret generic db-credential \
    --from-literal=DB_PASSWORD=Asdf'!'234
  2. 생성된 Secret 확인

    kubectl get secret db-credential -o yaml
  3. 생성된 Secret 데이터의 평문 확인

    kubectl get secret db-credential -o jsonpath={.data.DB_PASSWORD} | base64 -d && echo
  4. 생성된 Secret 삭제

    kubectl delete secret db-credential
  5. Secret 생성

    cat <<'EOF' | kubectl apply -f -
    apiVersion: v1
    kind: Secret
    metadata:
      name: db-credential
    type: Opaque
    data:
      DB_PASSWORD: Asdf!234
    EOF
  6. Secret 으로 사용할 문자열을 Base64로 인코딩

    echo -n 'Asdf!234' | base64
  7. Secret 생성

    cat <<EOF | kubectl apply -f -
    apiVersion: v1
    kind: Secret
    metadata:
      name: db-credential
    type: Opaque
    data:
      DB_PASSWORD: $(echo -n 'Asdf!234' | base64)
    EOF
  8. 생성된 Secret 데이터의 평문 확인

    kubectl get secret db-credential -o jsonpath={.data.DB_PASSWORD} | base64 -d && echo
  9. Pod 생성

    cat <<EOF | kubectl apply -f -
    apiVersion: v1
    kind: Pod
    metadata:
      name: alpine
    spec:
      containers:
      - image: alpine
        name: alpine
        command: [ "env" ]
        env:
          - name: DB_CREDENTIAL
            valueFrom:
              secretKeyRef:
                name: db-credential
                key: DB_PASSWORD
      restartPolicy: Never
    EOF
  10. Pod 로그 확인

    kubectl logs alpine
  11. Pod 생성

    cat <<EOF | kubectl replace --force -f -
    apiVersion: v1
    kind: Pod
    metadata:
      name: alpine
    spec:
      containers:
      - image: alpine
        name: alpine
        command: [ "sleep", "3600" ]
        volumeMounts:
        - name: secret
          mountPath: "/etc/secret"
          readOnly: true
      volumes:
      - name: secret
        secret:
          secretName: db-credential
          items:
          - key: DB_PASSWORD
            path: db.properties
    EOF
  12. Secret을 마운트한 경로에 있는 파일 확인

    kubectl exec alpine -- ls -al /etc/secret
  13. 파일 내용 확인

    kubectl exec alpine -- cat /etc/secret/db.properties && echo
  14. 파일 권한 확인

    kubectl exec alpine -- ls -alL /etc/secret
  15. Pod 재생성

    cat <<EOF | kubectl replace --force -f -
    apiVersion: v1
    kind: Pod
    metadata:
      name: alpine
    spec:
      containers:
      - image: alpine
        name: alpine
        command: [ "sleep", "3600" ]
        volumeMounts:
        - name: secret
          mountPath: "/etc/secret"
          readOnly: true
      volumes:
      - name: secret
        secret:
          secretName: db-credential
          defaultMode: 0400
    EOF
  16. Secret을 마운트한 경로에 있는 파일 확인

    kubectl exec alpine -- ls -al /etc/secret
  17. 파일 내용 확인

    kubectl exec alpine -- cat /etc/secret/DB_PASSWORD && echo
  18. 파일 권한 확인

    kubectl exec alpine -- ls -alL /etc/secret
  19. Secret 수정

    cat <<EOF | kubectl apply -f -
    apiVersion: v1
    kind: Secret
    metadata:
      name: db-credential
    type: Opaque
    data:
      DB_PASSWORD: bmV3cGFzc3dvcmQ=
      DB_NAME: bmV3ZGF0YWJhc2U=
    EOF
  20. Secret을 마운트한 경로에 있는 파일 확인

    kubectl exec alpine -- ls -al /etc/secret
  21. 파일 내용 확인

    kubectl exec alpine -- cat /etc/secret/DB_PASSWORD && echo
  22. 생성한 리소스 삭제

    {
        kubectl delete pod alpine
        kubectl delete secret db-credential
    }

Container Registry

  1. Pod 생성

    cat <<EOF | kubectl apply -f -
    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
    spec:
      containers:
      - image: youngwjungtest/nginx
        name: nginx
    EOF
  2. 생성된 Pod 확인

    kubectl get pod nginx
  3. Pod에 발생한 Event 확인

    kubectl describe pod nginx
  4. Pod가 배포된 Node 확인

    kubectl get pod nginx -o wide
  5. Pod가 배포된 노드의 인스턴스 아이디 확인

    kubectl get node $(kubectl get pod nginx -o=jsonpath='{.spec.nodeName}') \
    -o jsonpath='{.spec.providerID}{"\n"}' | grep -E "i-[a-z0-9]+"
  6. 새로운 터미널을 열고 Pod가 배포된 Node로 Session Manager 연결

    aws ssm start-session --target \
    $(kubectl get node $(kubectl get pod nginx -o=jsonpath='{.spec.nodeName}') \
    -o jsonpath='{.spec.providerID}{"\n"}' | grep -oE "i-[a-z0-9]+")
  7. Docker Hub 자격증명 설정

    echo "dckr_pat_njVpXiQla1Soj0rbGP0PIvF2mbc" \
    | sudo docker login -u youngwjungtest --password-stdin
  8. Docker 자격증명 파일을 복사

    sudo cp /root/.docker/config.json /var/lib/kubelet/
  9. Kubelet 재시작

    {
        sudo systemctl restart kubelet
        sudo systemctl status kubelet
    }
  10. 기존 터미널로 이동해서 Pod 상태 확인

    kubectl get pod nginx
  11. 다른 터미널로 이동해서 Docker 자격증명 파일을 삭제

    sudo rm /var/lib/kubelet/config.json
  12. Kubelet 재시작

    {
        sudo systemctl restart kubelet
        sudo systemctl status kubelet
    }
  13. 기존 터미널로 이동해서 Pod 삭제

    kubectl delete pod nginx
  14. Secret 생성

    kubectl create secret docker-registry my-docker \
    --docker-username=youngwjungtest \
    --docker-password=dckr_pat_njVpXiQla1Soj0rbGP0PIvF2mbc 
  15. Deployment 생성

    cat <<EOF | kubectl apply -f -
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: nginx
      name: nginx
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - image: youngwjungtest/nginx
            name: nginx
          imagePullSecrets:
          - name: my-docker
    EOF
  16. Pod 상태 확인

    kubectl get pod -o wide -l app=nginx
  17. 컨테이너가 정상적으로 구동중인지 확인

    kubectl exec deploy/nginx -- curl -s localhost 
  18. 생성한 리소스 삭제

    {
        kubectl delete deploy nginx
        kubectl delete secret my-docker
    }

Last updated