首页 > 其他分享 >kubernetes之 认证和serviceaccount

kubernetes之 认证和serviceaccount

时间:2023-07-14 23:45:19浏览次数:48  
标签:kubectl kubernetes serviceaccount sunny 认证 master k8s root

第十部分 认证和serviceaccount
前面讲的都是admin超级用户在操作k8s,Kubectl不能所有人都可以使用和访问。
用户访问逻辑图,

认证:第一种令牌认证token,最简单的认证,(只需要对方认证的共享密钥即可)
服务器需要认可客户端的证书。
授权:RBAC,基于角色的访问控制,目前用的比较多。
          web服务
目前一直在使用admin(类似root)用户使用。
准入控制:后续可操作范围

实现原理

客户端——>API Server
  User:username,uid
  Group:
  Extra:
  Request path:  https://192.168.19.134:6443/apis/apps/v1/namespaces/default/deployments/myapp-deploy/
  HTTP request verb:  Get、post、put、delete
  API request verb:  Get、list、create、update、path、watch、proxy
  Resource:
  API group:
  beta公测版本
默认https,需要进行双向证书认证。

通过kubectl proxy代理https实现http方式访问(本地已有证书)。
Restful接口形式存在
[root@master ~]# kubectl proxy --port=8081
Starting to serve on 127.0.0.1:8081
[root@k8s-master ~]# nohup kubectl proxy --port=8081 &
[root@master ~]# ss -ntl |grep 8081
LISTEN 0 128 127.0.0.1:8081
[root@k8s-master ~]# curl http://localhost:8081/api/v1/namespaces
[root@k8s-master ~]# curl http://localhost:8081/api/v1/namespaces/kube-system/

Api接口有两类客户端访问。
  集群内部pod客户端
  集群外部访问的客户端
默认所有pod都有对应的secert密钥。

[root@k8s-master ~]# kubectl get pod/myapp-0 -oyaml --export |grep serviceaccount
Flag --export has been deprecated, This flag is deprecated and will be removed in future.
         - mountPath: /var/run/secrets/kubernetes.io/serviceaccount

--dry-run 来生成pod结构。

[root@k8s-master ~]# kubectl create sa mysa --dry-run -oyaml   
apiVersion: v1
kind: ServiceAccount
metadata:
  creationTimestamp: null
  name: mysa

[root@k8s-master ~]# kubectl get sa # 如上,--dry-run没有真正创建,可以查看生成框架。
NAME SECRETS AGE
default 1 4d19h

示例,自行生成了一个token信息;创建pod并使用自定义的sa

[root@k8s-master ~]# kubectl create sa sunny
serviceaccount/sunny created
[root@k8s-master sa]# kubectl describe sa sunny        
Name:                sunny
Namespace:           default
Labels:              <none>
Annotations:         <none>
Image pull secrets:  <none>
Mountable secrets:   sunny-token-8drq6
Tokens:              sunny-token-8drq6
Events:              <none>    
[root@k8s-master sa]# cat sa-demol.yaml 
apiVersion: v1
kind: Pod
metadata:
  labels:
    app: myapp
    tier: frontend
  name: pod-sa-demo
  namespace: default
spec:
  containers:
  - image: ikubernetes/myapp:v1
    name: myapp
    ports:
    - name: http
      containerPort: 80
  serviceAccountName: sunny

[root@k8s-master sa]# kubectl apply -f sa-demol.yaml
[root@k8s-master sa]# kubectl describe pods/pod-sa-demo # 查看token,跟上述token信息保持一致。
Name: pod-sa-demo
Namespace: default
...
Volumes:
sunny-token-8drq6:
Type: Secret (a volume populated by a Secret)
SecretName: sunny-token-8drq6
...
如上,token关系对应。

Kubernetes认证时用户账户有两类

  Useracount:用户账户
  Serveracount:服务账户,pod运行账户

将secert方法sa中,不直接放置到pod里面。私有ca不要轻易授权给别人,需要做专用ca。
查看系统内部配置信息,
[root@k8s-master sa]# kubectl config view

[root@k8s-master sa]#  kubectl config view
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: DATA+OMITTED
    server: https://192.168.1.203:6443
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
    user: kubernetes-admin
  name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-admin
  user:
    client-certificate-data: REDACTED
    client-key-data: REDACTED

如上,以集群维度扩展,集群之间的使用。

[root@k8s-master stateful]# ls /etc/kubernetes/pki/ # 系统证书,安全保密,不要随便泄漏。

apiserver.crt              apiserver.key                 ca.crt  front-proxy-ca.crt      front-proxy-client.key
apiserver-etcd-client.crt  apiserver-kubelet-client.crt  ca.key  front-proxy-ca.key      sa.key
apiserver-etcd-client.key  apiserver-kubelet-client.key  etcd    front-proxy-client.crt  sa.pub

这里的ca证书都是被apiserver所信任的,ca证书不要泄露。

自作证书,创建新的账户。
自作证书,作为另外一个账号去认证k8s apiserver证书文件(连接apiserver账号)。
a、做私钥
[root@k8s-master pki]# cd /etc/kubernetes/pki
[root@k8s-master pki]# (umask 077;openssl genrsa -out sunny.key 2048)
[root@k8s-master pki]# ll sunny.key
-rw------- 1 root root 1675 7月 14 22:13 sunny.key
b、通过上面私钥做证书
通过上面私钥做证书,有ca.crt来签署。
[root@k8s-master pki]# openssl req -new -key sunny.key -out sunny.csr -subj "/CN=sunny" # 证书签署请求:CN=sunny,代表生成的用户账号是sunny
[root@k8s-master pki]# openssl x509 -req -in sunny.csr -CA ./ca.crt -CAkey ./ca.key -CAcreateserial -days 365 -out # ca签证:

配置客户端证书
把这个用户添加到连接认证的k8s集群信息,
[root@k8s-master pki]# kubectl config set-credentials sunny --client-certificate=./sunny.csr --client-key=./sunny.key --embed-certs=true # --embed-certs=true参数表示把证书隐藏起来
User "sunny" set.
[root@k8s-master pki]# kubectl config set-context sunny@kubernetes --cluster=kubernetes --user=sunny # 配置上下文
Context "sunny@kubernetes" created.
切换到新的用户访问。
[root@k8s-master pki]# kubectl config use-context sunny@kubernetes
[root@k8s-master pki]# kubectl get pods # 切换用户,看不到权限了
Error from server (Forbidden): pods is forbidden: User "sunny" cannot list resource "pods" in API group "" in the namespace "default"
[root@k8s-master pki]# kubectl config use-context kubernetes-admin@kubernetes
[root@k8s-master pki]# kubectl get pods

回切到admin用户,将证书文件加到新的集群中。

kubectl config use-context kubernetes-admin@kubernetes
kubectl config set-cluster mycluster --kubeconfig=/tmp/test.conf --server="https://192.168.1.203:6443" --certificate-authority=/etc/kubernetes/pki/ca.crt  --embed-certs=true
kubectl config view --kubeconfig=/tmp/test.conf 
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: DATA+OMITTED
    server: https://192.168.1.203:6443
  name: mycluster
contexts: []
current-context: ""
kind: Config
preferences: {}
users: []

整节内容综合:如何使用k8s认证接入apiserver。接下来就是讲授权了,RBAC。

标签:kubectl,kubernetes,serviceaccount,sunny,认证,master,k8s,root
From: https://www.cnblogs.com/sunnyyangwang/p/17555356.html

相关文章

  • kubernetes之 statefulset控制器
    第九部分statefulset控制器参考:https://blog.csdn.net/styshoo/article/details/73731993     https://blog.51cto.com/xuexinhuan/5424144即便是有状态管理,也需要使用脚本来运维。CoreOS:OperatorStatusfulSet:有状态Cattle,petPetSet->StatefulSeta、稳定......
  • kubernetes网络模式
     一个K8s的集群中至少有三个网络:集群节点所在的网络,这个网络就是你的主机所在的网络,通常情况下是你的网络基础设施提供。如果你的node处于不同的网段,那么你需要保证路由可达。如上图中的192.168.10.0/24和10.0.0.0/8这两个网络第二个网络是Pod的网络,K8s中一个Pod由多个......
  • Ubuntu部署Kubernetes
    Docker安装信任Docker的GPG公钥:curl-fsSLhttps://repo.huaweicloud.com/docker-ce/linux/ubuntu/gpg|sudoapt-keyadd-`添加软件仓库:sudoadd-apt-repository"deb[arch=amd64]https://repo.huaweicloud.com/docker-ce/linux/ubuntu$(lsb_release-cs)stable"......
  • mongodb4.4.22主从(副本集附仲裁节点)部署带认证模式
    环境:OS:CentOS7DB:4.4.22机器角色:192.168.1.102:29001主192.168.1.104:29001从192.168.1.105:29001仲裁节点 1.下载相应的版本https://www.mongodb.com/download-center/community我这里下载的是mongodb-linux-x86_64-rhel70-4.4.22.tgz 2.创建安装目录192.168.1.102......
  • kubernetes之 pv、pcv、cm、secret引入
    第八部分pv、pcv、cm、secret引入pv、pvc如果pvc需要空间很多,pv空间不足以支持,那么生产的pod就会一致hang住,这就需要根据pvc容量,动态生成pv了。借助中间层StorageClass:针对尚有存储空间,还未做成PV的空间进行分类。需要restful接口,做强认证cm明文存储数据,信息容易泄露secret基于b......
  • Vue项目配置Https双向认证
    访问双向认证的Https接口本地运行设置修改webpack配置 jsconstfs=require('fs')constoptions={//客户端密钥key:fs.readFileSync(path.join(__dirname,'../ca/key.pem')),//客户端公钥cert:fs.readFileSync(path.join(__dirname,'../ca......
  • kubernetes 实现 list-watch 的底层原理
    我们都知道,controller-manager,scheduler,kubelet会向apiserver监听感兴趣的对象,当监听对象的内容或状态发生变化后,对应的事件会立即推送到监听者。借由这套事件通知机制,kubernetes才能良好地运转。那么这套事件通知机制是如何实现并驱动的呢?1.etcd在k8s中,apiserver是......
  • (二)kubernetes部署kafka
    与前面的zookeeper一样需要持久化存储,因此还是先创建PV,然后再部署kafka。2、配置nfs创建需要作为nfs共享的目录mkdir/home/nfs/kafka-0添加权限chmod777/home/nfs/kafka-0编辑配置root@ubuntu:#vim/etc/export#/etc/exports:theaccesscontrollistforfilesyste......
  • Kubernetes轻量级日志工具Loki安装及踩坑记录
    Loki简介Loki是Grafana出品的一个轻量级日志系统,熟悉ELK的都知道ELK使用起来的成本,而且仅仅是日志检索使用ELK的话有点大材小用了。Loki8技术栈中使用了以下组件。Promtail用来将容器日志发送到Loki或者Grafana服务上的日志收集工具,该工具主要包括发现采集目标以及给日志......
  • kubernetes之 存储卷
    第八部分kubernetes之存储卷脱离节点而存在共享存储。存储卷不属于容器,他属于pod缓存,宿主机,不具备真正意义上存储,宿主机退役后,存储资源随之丢失,除非宿主机上也挂载独立的卷信息。容器真正意义上的存储卷类型emptyDir:pod删除,存储内容也删除,只能当临时存储空间或缓存使用,无真正意......