ServiceAccount资源清单格式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 apiVersion: v1 kind: ServiceAccount metadata: name <string> namespace <string> automountServiceAccountToken <boolean> secrets <[]Object> apiVersion <string> kind <string> name <string> namespace <string> uid <string> imagePullSecrets <[]Object> name <string>
ServiceAccount令牌认证 正常情况下k8s所创建的每一个Pod注入一个ServiceAccount令牌
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 root@k8s-master01:~ ...... Containers: demodb-shard: Container ID: docker://b7506f7a44abb86d008c8ddb38ccda4b8a11c25b5e7720877ec1694a9abc0f54 Image: ikubernetes/demodb:v0.1 Image ID: docker-pullable://ikubernetes/demodb@sha256:78edffb2083001b056f85202ca8049bb1e5ecb47b601725aadb5723a96e21b7b Port: 9907/TCP Host Port: 0/TCP State: Running Started: Tue, 27 Jul 2021 01:31:48 +0000 Ready: True Restart Count: 0 Liveness: http-get http://:db/status delay=2s timeout=1s period=10s Readiness: http-get http://:db/status%3Flevel=full delay=15s timeout=1s period=30s Environment: DEMODB_DATADIR: /demodb/data Mounts: /demodb/data from data (rw) /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-zxl6g (ro) .......
在每个名称空间中,会自动存在(由ServiceAccount准入控制器负责)一个ServiceAccount,将被该空间下的每个Pod共享使用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 root@k8s-master01:~ NAME SECRETS AGE default 1 13d root@k8s-master01:~ Name: default Namespace: default Labels: <none> Annotations: <none> Image pull secrets: <none> Mountable secrets: default-token-n6t9r Tokens: default-token-n6t9r Events: <none> root@k8s-master01:~ apiVersion: v1 kind: ServiceAccount metadata: creationTimestamp: "2021-07-15T06:14:15Z" name: default namespace: default resourceVersion: "410" uid: c7ab687e-a63f-45b9-856d-e5038a5c1183 secrets: - name: default-token-n6t9r
认证令牌保存于该空间下的一个Secret对象中,该对象中共有三个信息:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 root@k8s-master01:~ apiVersion: v1 data: ca.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM1ekNDQWMrZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJeE1EY3hOVEEyTVRNek5Gb1hEVE14TURjeE16QTJNVE16TkZvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTnZjCkc0NytMTUUydkxsNzJXNUpWYSt1S2VLY1htWVNFVjVXSmtCSkl4VjBZK0JkRExtb044WWxSWUdVaDVxTmxRRUQKOFhRSzgzOUNOUUl4ZGRSQWc3c1M4Z2I2SWdabGxCRXNobGRGb0JEcjNDUUlzMWxGMEFsVEFyV2RpK0NUbHdZYwpyYTRTREN6ZHVQUDZhdzFHWVBTNE9zOUtsUEpVZHpPMXRkUjdGNVBHVkY3SWpsWE1EMWc3NW1yL2d6NkgrcTVOCkN0S1UraFJ2WGd5QXN1TDY1TFlROUVEMyt1K0lJSE5xQWR4S1lXRkFmZ2tNT3Bqa0V3Z2xRWUUzenhWREdZR0EKdFI5clg5STNQUHF0UkkwWVdqb2EveGtxY1lhUTNRckhzU3ZBTjU5b2FyV3plS2xuMS8wWVdVeEd0cEZtdy92ZQpRMTYzYkVlc21YaDdSMERhMGhzQ0F3RUFBYU5DTUVBd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZIWmV1cEFHdnZ4c0pkSHl5N3hTVUNoZFNGY1hNQTBHQ1NxR1NJYjMKRFFFQkN3VUFBNElCQVFBTVUySkVrdU1QZ0ltSDlaSzk2OHRsY05HNVRsVFVseFVYRm9Uc1VTSWhyU1pycGhmRApKelBOTE5rcTJxMCtUV3ZTbHZxbzFyM2dLckhNWWZDY1AwTnFIU2VYVWNhaW1WeUhwUm12M3AzODBoTlJONnNyCkJZSmZ4RUE0aWJsWEpvYnNVR0tDcmdZeHk5SFJYbE9ud0QvMHdrTVVBZHFuSG90MlRPbGJZSVU3aUNTNklCajMKaWZLeHlGdkdDTWJ6NFhIY0xjajY4L3AzaC9VRDgxRjNGc2ZqdmV6L1A3Nk42L2hCL090TkhKK3pTWGVmdjJjcQpMUXBxYXA5aW9IUGZTVFpnTm5BUndSWUNaMW9DdmI0WitnbzdkQTROM3M2K3NOTUpYZFFERWkxb1dWeDVKUXgyClgzejNtY1hhZHROTVgwOEN0UHorTlQwZGZGOUNhaDVWMTkzWgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg== namespace: ZGVmYXVsdA== token: ZXlKaGJHY2lPaUpTVXpJMU5pSXNJbXRwWkNJNklqZDRPRTVoTVRWMVZVMHRVRFF6Ums0NVVVd3pOV056VURWc2JUZHBjMnR6TUVaWVJVdHdhMWxmZG1NaWZRLmV5SnBjM01pT2lKcmRXSmxjbTVsZEdWekwzTmxjblpwWTJWaFkyTnZkVzUwSWl3aWEzVmlaWEp1WlhSbGN5NXBieTl6WlhKMmFXTmxZV05qYjNWdWRDOXVZVzFsYzNCaFkyVWlPaUprWldaaGRXeDBJaXdpYTNWaVpYSnVaWFJsY3k1cGJ5OXpaWEoyYVdObFlXTmpiM1Z1ZEM5elpXTnlaWFF1Ym1GdFpTSTZJbVJsWm1GMWJIUXRkRzlyWlc0dGJqWjBPWElpTENKcmRXSmxjbTVsZEdWekxtbHZMM05sY25acFkyVmhZMk52ZFc1MEwzTmxjblpwWTJVdFlXTmpiM1Z1ZEM1dVlXMWxJam9pWkdWbVlYVnNkQ0lzSW10MVltVnlibVYwWlhNdWFXOHZjMlZ5ZG1salpXRmpZMjkxYm5RdmMyVnlkbWxqWlMxaFkyTnZkVzUwTG5WcFpDSTZJbU0zWVdJMk9EZGxMV0UyTTJZdE5EVmlPUzA0TlRaa0xXVTFNRE00WVRWak1URTRNeUlzSW5OMVlpSTZJbk41YzNSbGJUcHpaWEoyYVdObFlXTmpiM1Z1ZERwa1pXWmhkV3gwT21SbFptRjFiSFFpZlEuR2ZiSzlfRmpHU3EwME03c2tTYjdMWTd4bHlZUEFVS0dmZWl4U0Zqc2tFRnJvck95QkdJY3MxQXo2YmtaZm1ta1BocmVoSW5qVlhsQnU3dmprc0J2c0tlOHVsYWFtbTlXSGdSU2g3MjRTTUYyT0ZLUVFpMzJsTWVxd1piRDF1dGRJaHVHX21RSk82cWg2UVFoMzkzQ0FCRFJzWUR2MXZMUzVuSlpxY211YWFCUlVVVFA5VjY0RUwzcEVwUUlYVy1iY2o5RDQyOXBvakFyMDFkQUFNbUVRN3pqWWt6eEZnM0s1empQSGF2cVpmWlI1dlFjdmxER1d0ZWZmVTBRYXZFaGJsYXM3dTJLb2g5aWhORl80YjRBdjlRZ0Y3UUdORTBkNFh6aTZOUE9ROUtkbGpXTm50dVRYYXNUcU9iQmVSaC1TRm9iVGdnVUo0ejRKekVIUl9aM2hR kind: Secret metadata: annotations: kubernetes.io/service-account.name: default kubernetes.io/service-account.uid: c7ab687e-a63f-45b9-856d-e5038a5c1183 creationTimestamp: "2021-07-15T06:14:15Z" name: default-token-n6t9r namespace: default resourceVersion: "409" uid: 011e52ae-a4d2-46eb-9b3a-9a25000be0d9 type : kubernetes.io/service-account-token
如果运行pod时没有指定其SA,那么K8S会使用其名称空间下默认的SA。
如果在运行pod时不想使用默认的SA,也可以自己创建SA让pod获得更大的授权,但是在Pod资源清单中使用时,要指明使用的SA账号。
1 2 3 4 5 6 7 8 9 10 k8s-master01:~ KIND: Pod VERSION: v1 FIELD: serviceAccountName <string> DESCRIPTION: ServiceAccountName is the name of the ServiceAccount to use to run this pod. More info: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/
创建SA 基于命令创建SA 1.使用命令创建SA
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 root@k8s-master01:~ namespace/dev created root@k8s-master01:~ serviceaccount/admin created root@k8s-master01:~ NAME SECRETS AGE admin 1 17s default 1 109s root@k8s-master01:~ NAME TYPE DATA AGE admin-token-6lrjw kubernetes.io/service-account-token 3 2m23s default-token-j5lt6 kubernetes.io/service-account-token 3 3m55s
基于资源清单创建SA 1.创建SA资源清单
1 2 3 4 5 6 7 8 9 10 11 root@k8s-master01:~/yaml/chapter09 apiVersion: v1 kind: ServiceAccount metadata: name: ns-admin namespace: default automountServiceAccountToken: true
2.如果SA的资源清单中指定了Secrets,则需要自己创建Secret-token资源清单,(如果未指定此步骤可以省略)
1 2 3 4 5 6 7 8 9 root@k8s-master01:~/yaml/chapter09 apiVersion: v1 kind: Secret metadata: name: k8sadmin-secret namespace: default annotations: kubernetes.io/service-account.name: k8sadmin type : kubernetes.io/service-account-token
其他事项 在Pod的资源清单中有一项名为imagePullSecrets
的选项,用来从私有仓库中获取镜像时做认证时使用,我们可以将其在SA中进行配置,无需在pod上配置,这样的好处是,同一pod在挂载SA时默认会挂载其认证到私有仓库的Secret信息。这样就无需再单独对pod中imagePullSecrets
进行管理。