Kubernetes K8S 스토리지 비밀 상세 설명
원래 주소 :
Kubernetes K8S 스토리지 비밀 세부 정보
비밀 개요
Secret은 이러한 민감한 데이터를 미러 또는 포드 사양에 노출하지 않고 비밀번호, 토큰, 비밀 키와 같은 민감한 데이터의 구성 문제를 해결합니다. Secret은 Volume 또는 환경 변수의 형태로 사용할 수 있습니다.
사용자는 비밀을 생성 할 수 있으며 시스템은 일부 비밀도 생성합니다.
비밀을 사용하려면 포드가 비밀을 참조해야합니다. 포드는 볼륨의 파일로, 포드의 하나 이상의 컨테이너에 마운트되거나, kubelet이 포드의 이미지를 가져올 때 사용되는 두 가지 방법으로 secret을 사용할 수 있습니다.
비밀 유형
- 서비스 계정 : Kubernetes API에 액세스하는 데 사용됩니다. Kubernetes에서 자동으로 생성되며 Pod의 /run/secrets/kubernetes.io/serviceaccount 디렉터리에 자동으로 마운트됩니다.
- 불투명 : 암호, 비밀 키 등을 저장하는 데 사용되는 base64 인코딩 형식의 비밀입니다.
- kubernetes.io/dockerconfigjson : 개인용 Docker 레지스트리의 인증 정보를 저장하는 데 사용됩니다.
서비스 계정
kube-proxy를 통해보기
[root@k8s-master ~]# kubectl get pod -A | grep 'kube-proxy'
kube-system kube-proxy-6bfh7 1/1 Running 12 7d3h
kube-system kube-proxy-6vfkf 1/1 Running 11 7d3h
kube-system kube-proxy-bvl9n 1/1 Running 11 7d3h
[root@k8s-master ~]#
[root@k8s-master ~]# kubectl exec -it -n kube-system kube-proxy-6bfh7 -- /bin/sh
# ls -l /run/secrets/kubernetes.io/serviceaccount
total 0
lrwxrwxrwx 1 root root 13 Jun 8 13:39 ca.crt -> ..data/ca.crt
lrwxrwxrwx 1 root root 16 Jun 8 13:39 namespace -> ..data/namespace
lrwxrwxrwx 1 root root 12 Jun 8 13:39 token -> ..data/token
불투명 한 비밀
비밀 만들기
base64 암호화를 기반으로하는 수동 암호화
[root@k8s-master ~]# echo -n 'admin' | base64
YWRtaW4=
[root@k8s-master ~]# echo -n '1f2d1e2e67df' | base64
MWYyZDFlMmU2N2Rm
yaml 파일
1 [root@k8s-master secret]# pwd
2 /root/k8s_practice/secret
3 [root@k8s-master secret]# cat secret.yaml
4 apiVersion: v1
5 kind: Secret
6 metadata:
7 name: mysecret
8 type: Opaque
9 data:
10 username: YWRtaW4=
11 password: MWYyZDFlMmU2N2Rm
또는 다음 명령 줄을 사용하여 [시크릿 이름은보기와 비교를 용이하게하기 위해 의도적으로 다르게 설정 됨]을 생성하면 해당 시크릿은 일반 텍스트로 저장되지 않고 생성 후 자동으로 암호화됩니다.
kubectl create secret generic db-user-pass --from-literal=username=admin --from-literal=password=1f2d1e2e67df
비밀 생성 및 상태보기
[root@k8s-master secret]# kubectl apply -f secret.yaml
secret/mysecret created
[root@k8s-master secret]#
[root@k8s-master secret]# kubectl get secret ### 查看默认名称空间的secret简要信息
NAME TYPE DATA AGE
basic-auth Opaque 1 2d12h
default-token-v48g4 kubernetes.io/service-account-token 3 27d
mysecret Opaque 2 23s ### 可见已创建
tls-secret kubernetes.io/tls 2 3d2h
[root@k8s-master secret]#
[root@k8s-master secret]# kubectl get secret mysecret -o yaml ### 查看mysecret详细信息
apiVersion: v1
data:
password: MWYyZDFlMmU2N2Rm
username: YWRtaW4=
kind: Secret
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","data":{"password":"MWYyZDFlMmU2N2Rm","username":"YWRtaW4="},"kind":"Secret","metadata":{"annotations":{},"name":"mysecret","namespace":"default"},"type":"Opaque"}
creationTimestamp: "2020-06-08T14:08:59Z"
name: mysecret
namespace: default
resourceVersion: "987419"
selfLink: /api/v1/namespaces/default/secrets/mysecret
uid: 27b58929-71c4-495b-99a5-0d411910a529
type: Opaque
[root@k8s-master secret]#
[root@k8s-master secret]# kubectl describe secret mysecret ### 查看描述信息
Name: mysecret
Namespace: default
Labels: <none>
Annotations:
Type: Opaque
Data
====
password: 12 bytes
username: 5 bytes
볼륨에 Secret 마운트
yaml 파일
[root@k8s-master secret]# pwd
/root/k8s_practice/secret
[root@k8s-master secret]# cat pod_secret_volume.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-secret-volume
spec:
containers:
- name: myapp
image: registry.cn-beijing.aliyuncs.com/google_registry/myapp:v1
volumeMounts:
- name: secret-volume
mountPath: /etc/secret
readOnly: true
volumes:
- name: secret-volume
secret:
secretName: mysecret
포드를 시작하고 상태를 확인합니다.
[root@k8s-master secret]# kubectl apply -f pod_secret_volume.yaml
pod/pod-secret-volume created
[root@k8s-master secret]#
[root@k8s-master secret]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-secret-volume 1/1 Running 0 16s 10.244.2.159 k8s-node02 <none> <none>
비밀 정보보기
[root@k8s-master secret]# kubectl exec -it pod-secret-volume -- /bin/sh
/ # ls /etc/secret
password username
/ #
/ # cat /etc/secret/username
admin/ #
/ #
/ # cat /etc/secret/password
1f2d1e2e67df/ #
위에서 보면 포드의 비밀 정보가 실제로 복호화되었음을 알 수 있습니다.
환경 변수로 Secret 가져 오기
yaml 파일
[root@k8s-master secret]# pwd
/root/k8s_practice/secret
[root@k8s-master secret]# cat pod_secret_env.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-secret-env
spec:
containers:
- name: myapp
image: registry.cn-beijing.aliyuncs.com/google_registry/myapp:v1
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: mysecret
key: username
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password
restartPolicy: Never
포드를 시작하고 상태를 확인합니다.
[root@k8s-master secret]# kubectl apply -f pod_secret_env.yaml
pod/pod-secret-env created
[root@k8s-master secret]#
[root@k8s-master secret]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-secret-env 1/1 Running 0 6s 10.244.2.160 k8s-node02 <none> <none>
비밀 정보보기
[root@k8s-master secret]# kubectl exec -it pod-secret-env -- /bin/sh
/ # env
………………
HOME=/root
SECRET_PASSWORD=1f2d1e2e67df ### secret信息
MYAPP_SVC_PORT_80_TCP=tcp://10.98.57.156:80
TERM=xterm
NGINX_VERSION=1.12.2
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_PROTO=tcp
MYAPP_SVC_SERVICE_HOST=10.98.57.156
SECRET_USERNAME=admin ### secret信息
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
………………
위에서 보면 포드의 비밀 정보가 실제로 복호화되었음을 알 수 있습니다.
도커 레지스트리 비밀
하버 미러 창고
먼저 Harbor를 사용하여 미러웨어 하우스를 구축하고 배포 프로세스 참조를 구축합니다. " Harbor 엔터프라이즈 수준의 개인 Docker 미러웨어 하우스 배포 "
하버 부분 구성 파일 정보
[root@k8s-master harbor]# pwd
/root/App/harbor
[root@k8s-master harbor]# vim harbor.yml
# Configuration file of Harbor
hostname: 172.16.1.110
# http related config
http:
# port for http, default is 80. If https enabled, this port will redirect to https port
port: 5000
# https related config
https:
# https port for harbor, default is 443
port: 443
# The path of cert and key files for nginx
certificate: /etc/harbor/cert/httpd.crt
private_key: /etc/harbor/cert/httpd.key
harbor_admin_password: Harbor12345
항구 시작 후 클라이언트 http 설정
클러스터의 모든 머신이 작동되어야합니다.
[root@k8s-master ~]# vim /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"insecure-registries": ["172.16.1.110:5000"]
}
[root@k8s-master ~]#
[root@k8s-master ~]# systemctl restart docker # 重启docker服务
"insecure-registries": [ "172.16.1.110:5000"] 줄이 추가되었습니다. 여기서 172.16.1.110은 인트라넷 IP 주소입니다. 파일은 json 사양을 준수해야합니다. 그렇지 않으면 Docker가 시작되지 않습니다.
Harbor가있는 시스템에서 Docker 서비스를 다시 시작하는 경우 Harbor를 다시 시작해야합니다.
"개인"창고 만들기
미러 업로드
docker pull registry.cn-beijing.aliyuncs.com/google_registry/myapp:v1
docker tag registry.cn-beijing.aliyuncs.com/google_registry/myapp:v1 172.16.1.110:5000/k8s-secret/myapp:v1
# 登录
docker login 172.16.1.110:5000 -u admin -p Harbor12345
# 上传
docker push 172.16.1.110:5000/k8s-secret/myapp:v1
로그 아웃
그 후, 후속 데모를 위해 운영 기계의 항구에서 로그 아웃하십시오.
### 退出harbor登录
[root@k8s-node02 ~]# docker logout 172.16.1.110:5000
Removing login credentials for 172.16.1.110:5000
### 拉取失败,需要先登录。表明完成准备工作
[root@k8s-master secret]# docker pull 172.16.1.110:5000/k8s-secret/myapp:v1
Error response from daemon: pull access denied for 172.16.1.110:5000/k8s-secret/myapp, repository does not exist or may require 'docker login': denied: requested access to the resource is denied
포드 다운로드 미러 직접
yaml 파일에 이미지를 지정한 후 포드를 직접 시작합니다.
[root@k8s-master secret]# pwd
/root/k8s_practice/secret
[root@k8s-master secret]# cat pod_secret_registry.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-secret-registry
spec:
containers:
- name: myapp
image: 172.16.1.110:5000/k8s-secret/myapp:v1
포드를 시작하고 상태를 확인합니다.
[root@k8s-master secret]# kubectl apply -f pod_secret_registry.yaml
pod/pod-secret-registry created
[root@k8s-master secret]#
[root@k8s-master secret]# kubectl get pod -o wide ### 可见镜像下载失败
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-secret-registry 0/1 ImagePullBackOff 0 7s 10.244.2.161 k8s-node02 <none> <none>
[root@k8s-master secret]#
[root@k8s-master secret]# kubectl describe pod pod-secret-registry ### 查看pod详情
Name: pod-secret-registry
Namespace: default
Priority: 0
Node: k8s-node02/172.16.1.112
Start Time: Mon, 08 Jun 2020 23:59:07 +0800
Labels: <none>
Annotations: kubectl.kubernetes.io/last-applied-configuration:
{
"apiVersion":"v1","kind":"Pod","metadata":{
"annotations":{
},"name":"pod-secret-registry","namespace":"default"},"spec":{
"containers":[{
"i...
Status: Pending
IP: 10.244.2.161
IPs:
IP: 10.244.2.161
Containers:
myapp:
Container ID:
Image: 172.16.1.110:5000/k8s-secret/myapp:v1
Image ID:
………………
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 23s default-scheduler Successfully assigned default/pod-secret-registry to k8s-node02
Normal BackOff 19s (x2 over 20s) kubelet, k8s-node02 Back-off pulling image "172.16.1.110:5000/k8s-secret/myapp:v1"
Warning Failed 19s (x2 over 20s) kubelet, k8s-node02 Error: ImagePullBackOff
Normal Pulling 9s (x2 over 21s) kubelet, k8s-node02 Pulling image "172.16.1.110:5000/k8s-secret/myapp:v1"
Warning Failed 9s (x2 over 21s) kubelet, k8s-node02 Failed to pull image "172.16.1.110:5000/k8s-secret/myapp:v1": rpc error: code = Unknown desc = Error response from daemon: pull access denied for 172.16.1.110:5000/k8s-secret/myapp, repository does not exist or may require 'docker login': denied: requested access to the resource is denied
Warning Failed 9s (x2 over 21s) kubelet, k8s-node02 Error: ErrImagePull
[root@k8s-master secret]#
[root@k8s-master secret]# kubectl delete -f pod_secret_registry.yaml
비공개 이미지 가져 오기가 실패했음을 알 수 있습니다.
비밀을 통해 포드 다운로드 미러
명령 줄을 통해 비밀을 만들고 설명보기
[root@k8s-master secret]# kubectl create secret docker-registry myregistrysecret --docker-server='172.16.1.110:5000' --docker-username='admin' --docker-password='Harbor12345'
secret/myregistrysecret created
[root@k8s-master secret]#
[root@k8s-master secret]# kubectl get secret
NAME TYPE DATA AGE
basic-auth Opaque 1 2d14h
default-token-v48g4 kubernetes.io/service-account-token 3 27d
myregistrysecret kubernetes.io/dockerconfigjson 1 8s # 刚刚创建的
mysecret Opaque 2 118m
tls-secret kubernetes.io/tls 2 3d4h
[root@k8s-master secret]#
[root@k8s-master secret]# kubectl get secret myregistrysecret -o yaml ### 查看详细信息
apiVersion: v1
data:
.dockerconfigjson: eyJhdXRocyI6eyIxMC4wLjAuMTEwOjUwMDAiOnsidXNlcm5hbWUiOiJhZG1pbiIsInBhc3N3b3JkIjoiSGFyYm9yMTIzNDUiLCJhdXRoIjoiWVdSdGFXNDZTR0Z5WW05eU1USXpORFU9In19fQ==
kind: Secret
metadata:
creationTimestamp: "2020-06-08T16:07:32Z"
name: myregistrysecret
namespace: default
resourceVersion: "1004582"
selfLink: /api/v1/namespaces/default/secrets/myregistrysecret
uid: b95f4386-64bc-4ba3-b43a-08afb1c1eb9d
type: kubernetes.io/dockerconfigjson
[root@k8s-master secret]#
[root@k8s-master secret]# kubectl describe secret myregistrysecret ### 查看描述信息
Name: myregistrysecret
Namespace: default
Labels: <none>
Annotations: <none>
Type: kubernetes.io/dockerconfigjson
Data
====
.dockerconfigjson: 109 bytes
수정 전 Yaml 파일
[root@k8s-master secret]# cat pod_secret_registry.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-secret-registry
spec:
containers:
- name: myapp
image: 172.16.1.110:5000/k8s-secret/myapp:v1
imagePullSecrets:
- name: myregistrysecret
포드를 시작하고 상태를 확인합니다.
[root@k8s-master secret]# kubectl apply -f pod_secret_registry.yaml
pod/pod-secret-registry created
[root@k8s-master secret]#
[root@k8s-master secret]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-secret-registry 1/1 Running 0 8s 10.244.2.162 k8s-node02 <none> <none>
[root@k8s-master secret]#
[root@k8s-master secret]# kubectl describe pod pod-secret-registry
Name: pod-secret-registry
Namespace: default
Priority: 0
Node: k8s-node02/172.16.1.112
Start Time: Tue, 09 Jun 2020 00:22:40 +0800
Labels: <none>
Annotations: kubectl.kubernetes.io/last-applied-configuration:
{
"apiVersion":"v1","kind":"Pod","metadata":{
"annotations":{
},"name":"pod-secret-registry","namespace":"default"},"spec":{
"containers":[{
"i...
Status: Running
IP: 10.244.2.162
IPs:
IP: 10.244.2.162
Containers:
myapp:
Container ID: docker://ef4d42f1f1616a44c2a6c0a5a71333b27f46dfe76eb392962813a28d69150c00
Image: 172.16.1.110:5000/k8s-secret/myapp:v1
Image ID: docker-pullable://172.16.1.110:5000/k8s-secret/myapp@sha256:9eeca44ba2d410e54fccc54cbe9c021802aa8b9836a0bcf3d3229354e4c8870e
Port: <none>
Host Port: <none>
State: Running
Started: Tue, 09 Jun 2020 00:22:41 +0800
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-v48g4 (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
default-token-v48g4:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-v48g4
Optional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 22s default-scheduler Successfully assigned default/pod-secret-registry to k8s-node02
Normal Pulling 22s kubelet, k8s-node02 Pulling image "172.16.1.110:5000/k8s-secret/myapp:v1"
Normal Pulled 22s kubelet, k8s-node02 Successfully pulled image "172.16.1.110:5000/k8s-secret/myapp:v1"
Normal Created 22s kubelet, k8s-node02 Created container myapp
Normal Started 21s kubelet, k8s-node02 Started container myapp
위로부터 비밀 인증을 통과 한 후 pod가 비공개 이미지를 가져올 수 있음을 알 수 있습니다.