Kubernetes_梳理出ServiceAccount服務(wù)賬號一條線
前言
一、每個命名空間都會一個有個serviceAccount
二、Secret三種type
| type類型 | 創(chuàng)建secret的方式 | 使用這個secret的方式 |
|---|---|---|
| Opaque(default) | kubectl 命令手動創(chuàng)建 | 拉取鏡像的Pod yaml文件中,volume文件掛盤或者env使用 |
| kubernetes.io/service-account-token | 新建命名空間會自動新建一個默認的serviceAccount,這個serviceAccount里面會自動新建一個type為serviceAccount的secret;kubectl 命令手動創(chuàng)建,自定義的serviceAccount被創(chuàng)建起來,會自動新建一個type為serviceAccount的secret | 運行的Pod通過volume文件掛盤使用這個type為serviceAccount的secret |
| kubernetes.io/dockercfg | kubectl 命令手動創(chuàng)建 | 所有需要拉取鏡像的場景/kind類型,可以是Pod,也可以是replicasets deployment statefulset daemonset job/cronjob,yaml文件中被imagePullSecrets屬性使用,用來拉取鏡像的賬號密碼 |
2.1 Opaque(default)
2.1.1 Secret創(chuàng)建的兩種方式
創(chuàng)建方式1:從文件中創(chuàng)建Secret
echo -n "admin" > ./username.txt
echo -n "1f2d1e2e67df" > ./password.txt
kubectl create secret generic db-user-pass --from-file=./username.txt --from-file=./password.txt
kubectl get secret
創(chuàng)建方式2:使用yaml文件創(chuàng)建Secret
echo -n 'admin' | base64
echo -n '1f2d1e2e67df' | base64
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
username: YWRtaW4=
password: MWYyZDFlMmU2N2Rm
kubectl create -f ./secret.yaml
kubectl get secret
kubectl get secret mysecret -o yaml
2.1.2 Secret使用的兩種方式
使用方式1:以Volume方式使用Secret
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mypod
image: redis
volumeMounts:
- name: foo
mountPath: "/etc/foo"
readOnly: true
volumes:
- name: foo
secret:
secretName: mysecret
kubectl exec -it pod-name bash ## 進去
ls /etc/foo
cat /etc/foo/username
cat /etc/foo/password
使用方式2:將Secret設(shè)置為環(huán)境變量
kubectl get secret mysecret -o yaml
vi secret-env-pod.yaml
kubectl apply -f secret-env-pod.yaml
kubectl get pod
kubectl exec -it 具體pod名稱 bash
apiVersion: v1
kind: Pod
metadata:
name: secret-env-pod
spec:
containers:
- name: mycontainer
image: redis
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: mysecret
key: username
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password
restartPolicy: Never
2.2 kubernetes.io/service-account-token
2.3 kubernetes.io/dockercfg
apiVersion: v1
kind: Secret
metadata:
name: myregistrykey
namespace: awesomeapps
data:
.dockerconfigjson: UmVhbGx5IHJlYWxseSByZWVlZWVlZWVlZWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGx5eXl5eXl5eXl5eXl5eXl5eXl5eSBsbGxsbGxsbGxsbGxsbG9vb29vb29vb29vb29vb29vb29vb29vb29vb25ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubmdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2cgYXV0aCBrZXlzCg==
type: kubernetes.io/dockerconfigjson
kubectl create secret docker-registry myregistrykey \
--docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER \
--docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL
apiVersion: v1
kind: Pod
metadata:
name: foo
namespace: awesomeapps
spec:
containers:
- name: foo
image: janedoe/awesomeapp:v1
imagePullSecrets:
- name: myregistrykey
cat ~/.docker/config.json
{
"auths": {
"10.39.0.118": {
"auth": "Y2hlbm1vOmNtMTM4MTE2NjY3ODY="
},
"10.39.0.12:5000": {
"auth": "dXNlcjAxOjEyMzQ1YQ=="
},
"http://10.39.0.12:5000": {
"auth": "dXNlcjAxOjEyMzQ1YQ=="
}
}
}
三、自定義ServiceAccount再分析一遍
3.1 Service Account創(chuàng)建
#查看serviceaccount資源
[root@k8s-master ~]# kubectl get sa
NAME SECRETS AGE
default 1 7d19h
#創(chuàng)建一個名為admin的serviceaccount資源
[root@k8s-master ~]# kubectl create serviceaccount admin
serviceaccount/admin created
#查看serviceaccount資源
[root@k8s-master ~]# kubectl get sa
NAME SECRETS AGE
admin 1 7s
default 1 7d19h
#查看serviceaccount資源admin的詳細信息,可以看出已經(jīng)自動生成了一個Tokens:admin-token-lc826
[root@k8s-master ~]# kubectl describe sa/admin
Name: admin
Namespace: default
Labels: <none>
Annotations: <none>
Image pull secrets: <none>
Mountable secrets: admin-token-lc826
Tokens: admin-token-lc826
Events: <none>
#查看secret,可以查看也生成了一個admin-token-lc826的secret資源
[root@k8s-master ~]# kubectl get secret
NAME TYPE DATA AGE
admin-token-lc826 kubernetes.io/service-account-token 3 50s
......
3.2 在Pod中使用自定義的service account
[root@k8s-master manfests]# vim pod-sa-demo.yaml #編輯資源清單文件
apiVersion: v1
kind: Pod
metadata:
name: pod-sa-demo
namespace: default
labels:
app: myapp
tier: frontend
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
ports:
- name: http
containerPort: 80
serviceAccountName: admin #指定serviceAccount資源名稱
[root@k8s-master manfests]# kubectl apply -f pod-sa-demo.yaml
pod/pod-sa-demo created
[root@k8s-master manfests]# kubectl get pods -l app=myapp
NAME READY STATUS RESTARTS AGE
pod-sa-demo 1/1 Running 0 9s
[root@k8s-master manfests]#
[root@k8s-master manfests]# kubectl describe pods/pod-sa-demo
Name: pod-sa-demo
Namespace: default
......
Volumes:
admin-token-lc826:
Type: Secret (a volume populated by a Secret)
SecretName: admin-token-lc826 #這里可以看出掛載token就是上面創(chuàng)建的sa所生成的那個
Optional: false
......
總結(jié)
評論
圖片
表情
















