第一章、前言

  1. 每一个用户对API资源进行操作都需要通经过以下三个步骤:
  1. 第一步:对客户端访问进行认证操作,确认是否具有访问k8s权限
  2. token(共享秘钥)
  3. SSL(双向SSL认证)
  4.   ....
      通过任何一个认证即表示认证通过,进入下一步
    第二步:授权检查,确认是否对资源具有相关的权限
  5. ABAC(基于属性的访问控制)
  6. RBAC(基于角色的访问控制)
  7. NODE(基于节点的访问控制)
  8. WEB HOOK(自定义HTTP回调方法的访问控制)
  9. 第三步:准入控制(对操作资源相关联的其他资源是否有权限操作)

Kubernetes只对以下的API请求属性进行检查:

  1. user - username,uid
  2. group - user group
  3. "extra"- 额外信息
  4. API - API资源的对象
  5. Request path - 请求资源的路径(k8s使用resultful风格接口的API)
  6. http://Node_IPaddr:6443/apis/apps/v1/namespaces/namespaces_name/resource_name/
  7. HTTP 请求动作 - HTTP verbs getpostput,和delete用于非资源请求
  8. HTTP 请求动作映射到 API资源操作- getlistcreateupdatepatchwatchproxyredirectdelete,和deletecollection用于请求resource
  9. Resource -被访问(仅用于resource 请求)的resource ID或名字- *对于使用resource 的请求getupdatepatch,和delete,必须提供resource 名称。
  10. Subresource - 正在访问的subresource (仅用于请求resource
  11. Namespace - 正在访问对象的命名空间(仅针对命名空间的请求资源)
  12. API group - 正在访问的API组(仅用于请求资源)。空字符串指定核心API组。

什么是serviceaccount

  1. Service account是为了方便Pod里面的进程调用Kubernetes API或其他外部服务而设计的。它与User account不同
  2.   .User account是为人设计的,而service account则是为Pod中的进程调用Kubernetes API而设计;
  3.   .User account是跨namespace的,而service account则是仅局限它所在的namespace
  4.   .每个namespace都会自动创建一个default service account
  5.   .Token controller检测service account的创建,并为它们创建secret
  6.   .开启ServiceAccount Admission Controller
  7. .每个Pod在创建后都会自动设置spec.serviceAccountdefault(除非指定了其他ServiceAccout
  8.     .验证Pod引用的service account已经存在,否则拒绝创建
  9.     .如果Pod没有指定ImagePullSecrets,则把service accountImagePullSecrets加到Pod
  10.     .每个container启动后都会挂载该service accounttokenca.crt到/var/run/secrets/kubernetes.io/serviceaccount/  

 验证:

  1. [root@k8s-master01 ~]# kubectl create namespace qiangungun #创建一个名称空间
  2. namespace "qiangungun" created
  3. [root@k8s-master01 ~]# kubectl get sa -n qiangungun #名称空间创建完成后会自动创建一个sa
  4. NAME SECRETS AGE
  5. default 11s
  6. [root@k8s-master01 ~]# kubectl get secret -n qiangungun #同时也会自动创建一个secret
  7. NAME TYPE DATA AGE
  8. default-token-5jtz2 kubernetes.io/service-account-token 19s

在创建的名称空间中新建一个pod

  1. [root@k8s-master01 pod-example]# cat pod_demo.yaml
  2. kind: Pod
  3. apiVersion: v1
  4. metadata:
  5. name: task-pv-pod
  6. namespace: qiangungun
  7. spec:
  8. containers:
  9. - name: nginx
  10. image: ikubernetes/myapp:v1
  11. ports:
  12. - containerPort:
  13. name: www

查看pod信息

  1. [root@k8s-master01 pod-example]# kubectl apply -f pod_demo.yaml
  2. pod "task-pv-pod" created
  3. [root@k8s-master01 pod-example]# kubectl get pod -n qiangungun
  4. NAME READY STATUS RESTARTS AGE
  5. task-pv-pod / Running 13s
  6. [root@k8s-master01 pod-example]# kubectl get pod task-pv-pod -o yaml -n qiangungun
  7. ......
  8. volumeMounts:
  9. - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
  10. name: default-token-5jtz2
  11. ......
  12. volumes: #挂载sa的secret
  13. - name: default-token-5jtz2
  14. secret:
  15. defaultMode:
  16. secretName: default-token-5jtz2
  17. ......

#名称空间新建的pod如果不指定sa,会自动挂载当前名称空间中默认的sa(default)

第二章、创建serviceaccount(以下简称sa)

  1. [root@k8s-master01 ~]# kubectl create serviceaccount admin #创建一个sa 名称为admin
  2. serviceaccount "admin" created
  3. [root@k8s-master01 ~]# kubectl get sa
  4. NAME SECRETS AGE
  5. admin 6s
  6. default 28d
  7. [root@k8s-master01 ~]# kubectl describe sa admin #查看名称为admin的sa的信息,系统会自动创建一个token信息
  8. Name: admin
  9. Namespace: default
  10. Labels: <none>
  11. Annotations: <none>
  12. Image pull secrets: <none>
  13. Mountable secrets: admin-token-rxtrc
  14. Tokens: admin-token-rxtrc
  15. Events: <none>
  16. [root@k8s-master01 ~]# kubectl get secret #会自动创建一个secret(admin-token-rxtrc),用于当前sa连接至当前API server时使用的认证信息
  17. NAME TYPE DATA AGE
  18. admin-token-rxtrc kubernetes.io/service-account-token 1m
  19. default-token-tcwjz kubernetes.io/service-account-token 28d
  20. myapp-ingress-secret kubernetes.io/tls 6h
  21. mysql-passwd Opaque 17d
  22. tomcat-ingress-secret kubernetes.io/tls 7h

创建一个pod应用刚刚创建的sa

  1. [root@k8s-master01 service_account]# cat deploy-demon.yaml
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5. name: sa-demo
  6. labels:
  7. app: myapp
  8. release: canary
  9. spec:
  10. containers:
  11. - name: myapp
  12. image: ikubernetes/myapp:v2
  13. ports:
  14. - name: httpd
  15. containerPort:
  16. serviceAccountName: admin #此处指令为指定sa的名称
  17. [root@k8s-master01 service_account]# kubectl apply -f deploy-demon.yaml
  18. pod "sa-demo" created
  19. [root@k8s-master01 service_account]# kubectl describe pod sa-demo
  20. ......
  21. Mounts:
  22. /var/run/secrets/kubernetes.io/serviceaccount from admin-token-rxtrc (ro) #pod会自动挂载自己sa的证书
  23. ......

Volumes:
    admin-token-rxtrc:
      Type: Secret (a volume populated by a Secret)
      SecretName: admin-token-rxtrc

......

  1.  

集群交互的时候少不了的是身份认证,使用 kubeconfig(即证书) 和 token 两种认证方式是最简单也最通用的认证方式,下面我使用kubeconfing来进行认证

使用kubeconfig文件来组织关于集群,用户,名称空间和身份验证机制的信息。使用 kubectl命令行工具对kubeconfig文件来查找选择群集并与群集的API服务器进行通信所需的信息。

默认情况下 kubectl使用的配置文件名称是在$HOME/.kube目录下 config文件,可以通过设置环境变量KUBECONFIG或者--kubeconfig指定其他的配置文件

查看系统的kubeconfig

  1. [root@k8s-master01 ~]# kubectl config view
  2. apiVersion: v1
  3. clusters: #集群列表
  4. - cluster:
  5. certificate-authority-data: REDACTED #认证集群的方式
  6. server: https://172.16.150.212:6443 #访问服务的APIserver的路径
  7. name: kubernetes #集群的名称
  8. contexts: #上下文列表
  9. - context:
  10. cluster: kubernetes #访问kubernetes这个集群
  11. user: kubernetes-admin #使用 kubernetes-admin账号
  12. name: kubernetes-admin@kubernetes #给定一个名称
  13. current-context: kubernetes-admin@kubernetes #当前上下文,表示使用哪个账号访问哪个集群
  14. kind: Config
  15. preferences: {}
  16. users: #用户列表
  17. - name: kubernetes-admin #用户名称
  18. user:
  19. client-certificate-data: REDACTED #客户端证书,用于与apiserver进行认证
  20. client-key-data: REDACTED #客户端私钥
  1. [root@k8s-master01 ~]# kubectl get svc
  2. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  3. kubernetes ClusterIP 10.96.0.1 <none> /TCP 29d
  4. my-nginx NodePort 10.104.13.148 <none> :/TCP 18h
  5. myapp ClusterIP 10.102.229.150 <none> /TCP 19h
  6. tomcat ClusterIP 10.106.222.72 <none> /TCP,/TCP 19h
  7. [root@k8s-master01 ~]# kubectl describe svc kubernetes
  8. Name: kubernetes
  9. Namespace: default
  10. Labels: component=apiserver
  11. provider=kubernetes
  12. Annotations: <none>
  13. Selector: <none>
  14. Type: ClusterIP
  15. IP: 10.96.0.1
  16. Port: https /TCP
  17. TargetPort: /TCP
  18. Endpoints: 172.16.150.212:6443 #可以看到此处svc后端的Endpoint是当前节点的IP地址,通过svc的IP地址进行映射,以确保cluster中的pod可以通过该sa与集群内api进行通讯,仅仅是身份认证
  19. Session Affinity: ClientIP
  20. Events: <none>

查看kubeconfig命令行配置帮助

  1. [root@k8s-master01 ~]# kubectl config --help
  2. Modify kubeconfig files using subcommands like "kubectl config set current-context my-context"
  3.  
  4. The loading order follows these rules:
  5.  
  6. . If the --kubeconfig flag is set, then only that file is loaded. The flag may only be set once
  7. and no merging takes place.
  8. . If $KUBECONFIG environment variable is set, then it is used a list of paths (normal path
  9. delimitting rules for your system). These paths are merged. When a value is modified, it is
  10. modified in the file that defines the stanza. When a value is created, it is created in the first
  11. file that exists. If no files in the chain exist, then it creates the last file in the list.
  12. . Otherwise, ${HOME}/.kube/config is used and no merging takes place.
  13.  
  14. Available Commands:
  15. current-context 显示 current_context
  16. delete-cluster 删除 kubeconfig 文件中指定的集群
  17. delete-context 删除 kubeconfig 文件中指定的 context
  18. get-clusters 显示 kubeconfig 文件中定义的集群
  19. get-contexts 描述一个或多个 contexts
  20. rename-context Renames a context from the kubeconfig file.
  21. set 设置 kubeconfig 文件中的一个单个值
  22. set-cluster 设置 kubeconfig 文件中的一个集群条目
  23. set-context 设置 kubeconfig 文件中的一个 context 条目
  24. set-credentials 设置 kubeconfig 文件中的一个用户条目
  25. unset 取消设置 kubeconfig 文件中的一个单个值
  26. use-context 设置 kubeconfig 文件中的当前上下文
  27. view 显示合并的 kubeconfig 配置或一个指定的 kubeconfig 文件
  28.  
  29. Usage:
  30. kubectl config SUBCOMMAND [options]
  31.  
  32. Use "kubectl <command> --help" for more information about a given command.
  33. Use "kubectl options" for a list of global command-line options (applies to all commands).

第三章、创建一个cluster用户及context

使用当前系统的ca证书认证一个私有证书

  1. [root@k8s-master01 ~]# cd /etc/kubernetes/pki/
  2. [root@k8s-master01 pki]# (umask ;openssl genrsa -out qiangungun.key )
  3. Generating RSA private key, bit long modulus
  4. .........................+++
  5. ..........................................................+++
  6. e is (0x10001)
  7. [root@k8s-master01 pki]# openssl req -new -key qiangungun.key -out qiangungun.csr -subj "/CN=qiangungun" #qiangungun是后面我们创建的用户名称,需要保持一致
  8. [root@k8s-master01 pki]# openssl x509 -req -in qiangungun.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out qiangungun.crt -days
  9. Signature ok
  10. subject=/CN=qiangungun
  11. Getting CA Private Key

查看证书内容

  1. [root@k8s-master01 pki]# openssl x509 -in qiangungun.crt -text -noout
  2. Certificate:
  3. Data:
  4. Version: (0x0)
  5. Serial Number:
  6. b6::cb:::e3:fe:
  7. Signature Algorithm: sha256WithRSAEncryption
  8. Issuer: CN=kubernetes #由谁签署的
  9. Validity #证书的有效时间
  10. Not Before: Nov :: GMT
  11. Not After : Nov :: GMT
  12. Subject: CN=qiangungun #证书使用的用户
  13. Subject Public Key Info:
  14. Public Key Algorithm: rsaEncryption
  15. Public-Key: (
  16. ......

创建一个当前集群用户

  1. [root@k8s-master01 pki]# kubectl config set-credentials qiangungun --client-certificate=./qiangungun.crt --client-key=./qiangungun.key --embed-certs=true #--embed-certs表示是否隐藏证书路径及名称,默认不隐藏
  2. User "qiangungun" set.
  3. [root@k8s-master01 pki]# kubectl config view
  4. apiVersion: v1
  5. clusters:
  6. - cluster:
  7. certificate-authority-data: REDACTED
  8. server: https://172.16.150.212:6443
  9. name: kubernetes
  10. contexts:
  11. - context:
  12. cluster: kubernetes
  13. user: kubernetes-admin
  14. name: kubernetes-admin@kubernetes
  15. current-context: kubernetes-admin@kubernetes
  16. kind: Config
  17. preferences: {}
  18. users:
  19. - name: kubernetes-admin
  20. user:
  21. client-certificate-data: REDACTED
  22. client-key-data: REDACTED
    - name: qiangungun #我们新建的用户
  23. user:
  24. client-certificate-data: REDACTED
  25. client-key-data: REDACTED

为qiangungun用户创建一个context

  1. [root@k8s-master01 pki]# kubectl config set-context qiangungun@kubernetes --cluster=kubernetes --user=qiangungun
  2. Context "qiangungun@kubernetes" created.
  3. [root@k8s-master01 pki]# kubectl config view
  4. apiVersion: v1
  5. clusters:
  6. - cluster:
  7. certificate-authority-data: REDACTED
  8. server: https://172.16.150.212:6443
  9. name: kubernetes
  10. contexts:
  11. - context:
  12. cluster: kubernetes
  13. user: kubernetes-admin
  14. name: kubernetes-admin@kubernetes
  15. - context: #新创建的context
  16. cluster: kubernetes
  17. user: qiangungun
  18. name: qiangungun@kubernetes
  19. current-context: kubernetes-admin@kubernetes
  20. kind: Config
  21. preferences: {}
  22. users:
  23. - name: kubernetes-admin
  24. user:
  25. client-certificate-data: REDACTED
  26. client-key-data: REDACTED- name: qiangungun
  27. user:
  28. client-certificate-data: REDACTED
  29. client-key-data: REDACTED

切换serviceaccount

  1. [root@k8s-master01 pki]# kubectl config use-context qiangungun@kubernetes
  2. Switched to context "qiangungun@kubernetes".
  3. [root@k8s-master01 pki]# kubectl get pod
  4. Error from server (Forbidden): pods is forbidden: User "qiangungun" cannot list pods in the namespace "default"

自定义一个cluster

  1. [root@k8s-master01 pki]# kubectl config set-cluster mycluster --kubeconfig=/tmp/test.conf --server="https://172.16.150.212:6443" --certificate-authority=/etc/kubernetes/pki/ca.crt --embed-certs=true
  2. Cluster "mycluster" set.
  3. [root@k8s-master01 pki]# kubectl config view --kubeconfig=/tmp/test.conf
  4. apiVersion: v1
  5. clusters:
  6. - cluster:
  7. certificate-authority-data: REDACTED
  8. server: https://172.16.150.212:6443
  9. name: mycluster
  10. contexts: []
  11. current-context: ""
  12. kind: Config
  13. preferences: {}
  14. users: []

k8s学习笔记之九: Service Account的更多相关文章

  1. Docker 与 K8S学习笔记(九)—— 容器间通信

    容器之间可通过IP.Docker DNS Server或joined三种方式进行通信,今天我们来详细学习一下. 一.IP通信 IP通信很简单,前一篇中已经有所涉及了,只要容器使用相同网络,那么就可以使 ...

  2. 【K8s学习笔记】K8s是如何部署应用的?

    本文内容 本文致力于介绍K8s一些基础概念与串联部署应用的主体流程,使用Minikube实操 基础架构概念回顾 温故而知新,上一节[K8S学习笔记]初识K8S 及架构组件 我们学习了K8s的发展历史. ...

  3. 简单的玩玩etimer <contiki学习笔记之九 补充>

    这幅图片是对前面  <<contiki学习笔记之九>>  的一个补充说明. 简单的玩玩etimer <contiki学习笔记之九> 或许,自己正在掀开contiki ...

  4. VSTO学习笔记(九)浅谈Excel内容比较

    原文:VSTO学习笔记(九)浅谈Excel内容比较 说起文件内容比较,或许我们首先想到的是UltraCompare这类专业比较的软件,其功能非常强大,能够对基于文本的文件内容作出快速.准确的比较,有详 ...

  5. Python学习笔记(九)

    Python学习笔记(九): 装饰器(函数) 内置函数 1. 装饰器 1. 作用域 2. 高阶函数 3. 闭包 如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就 ...

  6. python3.4学习笔记(十九) 同一台机器同时安装 python2.7 和 python3.4的解决方法

    python3.4学习笔记(十九) 同一台机器同时安装 python2.7 和 python3.4的解决方法 同一台机器同时安装 python2.7 和 python3.4不会冲突.安装在不同目录,然 ...

  7. 汇编入门学习笔记 (九)—— call和ret

    疯狂的暑假学习之  汇编入门学习笔记 (九)--  call和ret 參考: <汇编语言> 王爽 第10章 call和ret都是转移指令. 1. ret和retf ret指令:用栈中的数据 ...

  8. Directx11学习笔记【九】 3D渲染管线

    原文:Directx11学习笔记[九] 3D渲染管线 原文地址:http://blog.csdn.net/bonchoix/article/details/8298116 3D图形学研究的基本内容,即 ...

  9. EF学习笔记(九):异步处理和存储过程

    总目录:ASP.NET MVC5 及 EF6 学习笔记 - (目录整理) 上一篇:EF学习笔记(八):更新关联数据 本篇原文:Async and Stored Procedures 为何要采用异步? ...

随机推荐

  1. zabbix3.4.7常用监控项

    Zabbix中内置了很多监控参数(Key_),可以获取监控对象中的系统.CPU.网络.内存.文件系统等信息.下面就详细介绍一下这些监控参数的意义. 1. 测试获取监控参数内容的方法 在Zabbix S ...

  2. 深入理解vue-router之keep-alive

    keep-alive 简介 keep-alive 是 Vue 内置的一个组件,可以使被包含的组件保留状态,或避免重新渲染. 用法也很简单: ? 1 2 3 4 5 <keep-alive> ...

  3. unity中 UGUI的按下、拖动接口事件的实现

    using UnityEngine; using System.Collections.Generic; using DG.Tweening; using UnityEngine.EventSyste ...

  4. 指导手册04:运行MapReduce

    指导手册04:运行MapReduce   Part 1:运行单个MapReduce任务 情景描述: 本次任务要求对HDFS目录中的数据文件/user/root/email_log.txt进行计算处理, ...

  5. ubuntu 安装 nvm 管理Node.js 以及vim 插件增强

    安装curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.2/install.sh | bashsource ~/.bashr ...

  6. latex中使用listings显示代码

    \documentclass[12pt,a4paper]{article}\usepackage{ctex}\usepackage{listings}\usepackage{xcolor}\begin ...

  7. 13--Python入门--文件读写--CSV&Excel文件

    EXCEL文件 import pandas as pd excel=pd.read_excel('read_excel.xlsx') print(excel) CSV文件 import pandas ...

  8. L2-023. 图着色问题*

    L2-023. 图着色问题 参考博客 #include <iostream> #include <cstring> #include <set> using nam ...

  9. ASP.NET之使用Ajax实现页面异步刷新(无需刷新整个页面)

    目前在使用ASP.NET技术做毕业设计,但是关于网页中的各种配置我到现在还不是很清楚,正在努力进化... 一般情况下,新建网页页面的话,应该为.aspx后缀的文件,建好之后对应一个同名的.cs文件,属 ...

  10. Erlang-接口技术

    系统的构建一定会设计到简历接口,让他与不同的语言的应用程序之间简历系统的联系.这就叫做erlang的接口技术. 接口技术的三种实现方法: 1.让程序以外部操作系统进行的形式在Erlang虚拟机以外运行 ...