P254 시크릿 - 예제: nginx의 기본인증정보가 담긴 파일을 시크릿으로 관리
접근통제 3단계
- 식별(identification)
- 인증(authentication)
-
TYPE1 : 알고 있는 정보 (지식기반) - 패스워드
-
TYPE2 : 가고 있는 정보 (소유기반) - 주민등록증, OTP, 인증서, 스마트폰, …
-
TYPE3 : 특징 - 홍채, 지문, 성문, 정맥, … , 필기체 서명(싸인)
~~~~~~~~~~~~~~~~~~~~~~
생물학적 특징을 이용 ⇒ 바이오 인증
-
2가지 이상을 혼용 : 2-factor 인증, multi-factor 인증(=다중인증방식)
-
멀티 디바이스 인증 = 멀티 채널 인증
- 인가(authorization)
HTTP 기본인증(HTTP Basic Authentication)

#1 openssl 모듈을 이용해서 사용명과 암호화한 패스워드를 BASE64로 인코딩
[vagrant@master ~]$ echo "your_name:$(openssl passwd -quiet -crypt your_password)" | base64
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
(1) your_password 문자열을 암호화
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~
(2) "your_name:암호화된패스워드" 문자열을 생성 (3) (2)에서 생성된 문자열을
BASE64로 인코딩해서 반환
eW91cl9uYW1lOjVOU1h3NTFsd1pmOHcK
#2 시크릿을 생성하는 YAML 파일을 작성
[vagrant@master ~]$ vi nginx-secret.yaml
apiVersion: v1 kind: Secret metadata: name: nginx-secret type: Opaque data: .htpasswd: eW91cl9uYW1lOjVOU1h3NTFsd1pmOHcK ⇐ basic authentication에 사용할 사용자 파일
|
[vagrant@master ~]$ kubectl create secret generic nginx-secret --from-literal .htpasswd=eW91cl9uYW1lOjVOU1h3NTFsd1pmOHcK --dry-run -o yaml > test.yaml
[vagrant@master ~]$ cat test.yaml
apiVersion: v1
data:
.htpasswd: ZVc5MWNsOXVZVzFsT2pWT1UxaDNOVEZzZDFwbU9IY0s=
kind: Secret
metadata:
creationTimestamp: null
name: nginx-secret
#3 시크릿 생성
[vagrant@master ~]$ kubectl apply -f nginx-secrect.yaml
secret/nginx-secret created
[vagrant@master ~]$ kubectl get secrets
NAME TYPE DATA AGE
default-token-mmbs5 kubernetes.io/service-account-token 3 8d
my-password Opaque 1 136m
nginx-secret Opaque 1 13s
our-password Opaque 2 127m
#4 시크릿을 활용해 기본인증을 적용하는 nginx 파드를 구성
[vagrant@master ~]$ vi basic-auth.yaml
apiVersion: v1 kind: Service metadata: name: basic-auth spec: type: NodePort selector: app: basic-auth ports: - protocol: TCP port: 80 targetPort: http nodePort: 30060 ⇐ 클러스터 외부에서 해당 포트로 서비스를 이용 --- apiVersion: apps/v1 kind: Deployment metadata: name: basic-auth labels: app: basic-auth spec: replicas: 1 selector: matchLabels: app: basic-auth template: metadata: labels: app: basic-auth spec: containers: - name: nginx image: "gihyodocker/nginx:latest" imagePullPolicy: Always ports: - name: http containerPort: 80 env: - name: BACKEND_HOST value: "localhost:8080" - name: BASIC_AUTH_FILE value: "/etc/nginx/secret/.htpasswd" ⇐ (1) 기본인증에 사용하는 인증정보가 담긴 파일 volumeMounts: - mountPath: /etc/nginx/secret ⇐ 볼륨과 연결된 디렉터리 아래에 시크릿 키 이름의 파일이 생성 (1) name: nginx-secret ⇐ 볼륨 이름 readOnly: true - name: echo image: "gihyodocker/echo:latest" imagePullPolicy: Always ports: - containerPort: 8080 env: - name: HTTP_PORT value: "8080" volumes: - name: nginx-secret ⇐ 볼륨 이름 secret: secretName: nginx-secret ⇐ 시크릿 이름
|
#3 생성 및 확인
[vagrant@master ~]$ kubectl apply -f basic-auth.yaml
service/basic-auth created
deployment.apps/basic-auth created
[vagrant@master ~]$ kubectl get pods,deployments,services
NAME READY STATUS RESTARTS AGE
pod/basic-auth-745c944d45-mq747 2/2 Running 0 5m7s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.extensions/basic-auth 1/1 1 1 5m7s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/basic-auth NodePort 10.100.206.209 <none> 80:30060/TCP 5m7s
service/hello-service NodePort 10.104.232.118 <none> 8001:32480/TCP 5d1h
service/hostname-svc-nodeport NodePort 10.98.73.80 <none> 8080:30355/TCP 9h
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 8d
service/nginx-test NodePort 10.100.68.211 <none> 80:32228/TCP 5d7h
#4 인증 정보 없이 호출 시 401 오류를 반환
[vagrant@master ~]$ curl -i http://127.0.0.1:30060
HTTP/1.1 401 Unauthorized ⇐ 응답(response) 시작 ← 인증 정보가 없는 경우 401 오류를 반환
Server: nginx/1.13.12 ⇐ 응답 헤더 시작
Date: Wed, 24 Feb 2021 10:11:03 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 196
Connection: keep-alive
WWW-Authenticate: Basic realm="Restricted" ⇐ 기본인증 방식으로 인증정보를 요청
⇐ 응답 헤더 끝
<html> ⇐ 응답 본문 → 사용자 브라우저에 출력되는 내용
<head><title>401 Authorization Required</title></head>
<body bgcolor="white">
<center><h1>401 Authorization Required</h1></center>
<hr><center>nginx/1.13.12</center>
</body>
</html>
#5 인증 정보와 함께 호출 시 정상 처리
[vagrant@master ~]$ curl -i --user your_name:your_password http://127.0.0.1:30060
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
⇐ 인증 정보
HTTP/1.1 200 OK ⇐ 정상 처리
Server: nginx/1.13.12
Date: Wed, 24 Feb 2021 10:16:44 GMT
Content-Type: text/plain; charset=utf-8
Content-Length: 14
Connection: keep-alive
Hello Docker!!
P250 잡(job)
하나 이상의 파드를 생성해 지정된 수(parallelism)의 파드가 정상 종료될 때까지 이를 관리하는 리소스
잡이 생성한 파드는 정상 종료 후에도 삭제되지 않고 남아 있어 로그나 실행 결과를 분석할 수 있음
배치 작업 형태에 적합
[vagrant@master ~]$ vi simple-job.yaml
apiVersion: batch/v1 kind: Job metadata: name: pingpong labels: app: pingpong spec: parallelism: 3 ⇐ 동시에 실행하는 포드의 수 (= 병렬로 실행) template: ⇐ 포드를 정의 metadata: labels: app: pingpong spec: containers: - name: pingpong image: gihyodocker/alpine:bash command: ["/bin/bash"] args: - "-c" - | echo [`date`] ping! sleep 10 echo [`date`] pong! restartPolicy: Never ⇐ 포드 종류 후 재실행 여부를 설정 Always, Never, OnFailure 포드는 Always가 기본 잡은 Always로 설정 불가, Never, OnFailure만 설정 가능 |
[vagrant@master ~]$ kubectl apply -f simple-job.yaml
job.batch/pingpong created
[vagrant@master ~]$ kubectl logs -l app=pingpong
[Wed Feb 24 10:35:37 UTC 2021] ping! ← (1) 37초
[Wed Feb 24 10:35:47 UTC 2021] pong!
[Wed Feb 24 10:35:39 UTC 2021] ping! ← (2) 39초
[Wed Feb 24 10:35:49 UTC 2021] pong!
[Wed Feb 24 10:35:53 UTC 2021] ping! ← (3) 53초
[Wed Feb 24 10:36:03 UTC 2021] pong!
[vagrant@master ~]$ kubectl get pods -l app=pingpong -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pingpong-mgb58 0/1 Completed 0 3m52s 192.168.104.1 node2 <none> <none>
pingpong-vdm7r 0/1 Completed 0 3m52s 192.168.104.2 node2 <none> <none>
pingpong-w9hs6 0/1 Completed 0 3m52s 192.168.166.137 node1 <none> <none>
⇒ 종료 상태
P252 크론잡(CronJob)
잡은 한 번만 실행되는 반면, 크론잡은 스케줄을 지정해 정기적으로 포드를 실행
cron 등을 사용해 정기적으로 실행하는 작업에 적합
* * * * *
분(0-59) 시간(0-23) 일(1-31) 월(1-12) 요일(0-7)
[vagrant@master ~]$ vi simple-cronjob.yaml
apiVersion: batch/v1beta1 kind: CronJob metadata: name: pingpong spec: schedule: "*/1 * * * *" ⇐ 파드를 실행할 스케줄을 정의 jobTemplate: ⇐ 파드를 정의 spec: template: metadata: labels: app: pingpong spec: containers: - name: pingpong image: gihyodocker/alpine:bash command: ["/bin/bash"] args: - "-c" - | echo [`date`] ping! sleep 10 echo [`date`] pong! restartPolicy: OnFailure |
[vagrant@master ~]$ kubectl delete -f simple-job.yaml
job.batch "pingpong" deleted
[vagrant@master ~]$ kubectl apply -f simple-cronjob.yaml
cronjob.batch/pingpong created
[vagrant@master ~]$ kubectl get job -l app=pingpong
NAME COMPLETIONS DURATION AGE
pingpong-1614164340 1/1 13s 2m7s ⇐ 약 60초 간격으로 실행
pingpong-1614164400 1/1 12s 66s
pingpong-1614164460 0/1 6s 6s
[vagrant@master ~]$ kubectl logs -l app=pingpong
[Wed Feb 24 10:57:52 UTC 2021] ping!
[Wed Feb 24 10:58:02 UTC 2021] pong!
[Wed Feb 24 10:58:53 UTC 2021] ping!
[Wed Feb 24 10:59:03 UTC 2021] pong!
[Wed Feb 24 10:59:52 UTC 2021] ping!
[Wed Feb 24 11:00:02 UTC 2021] pong!
'CLOUD > Docker' 카테고리의 다른 글
2/24 - 도커/쿠버네티스 활용 컨테이너 개발 11차시 (0) | 2021.02.24 |
---|---|
2/23 - 도커/쿠버네티스 활용 컨테이너 개발 10차시 (0) | 2021.02.23 |
2/22 - 도커/쿠버네티스 활용 컨테이너 개발 9차시 (0) | 2021.02.22 |
2/19 - 도커/쿠버네티스 활용 컨테이너 개발 8차시 (0) | 2021.02.19 |
2/16 - 도커/쿠버네티스 활용 컨테이너 개발 7차시 (0) | 2021.02.16 |