kubernetes集群配置serviceaccount;Service Account和RBAC授权

 

https://blog.51cto.com/ylw6006/2067326

Kubernetes API的其它服务。Service Account它并不是给kubernetes集群的用户使用的,而是给pod里面的进程使用的,它为pod提供必要的身份认证。

Kubernetes提供了Secret来处理敏感信息,目前Secret的类型有3种: 
Opaque(default): 任意字符串 
kubernetes.io/service-account-token: 作用于ServiceAccount
kubernetes.io/dockercfg: 作用于Docker registry,用户下载docker镜像认证使用。

本文将介绍在kubernetes集群中配置serviceaccount和secret,可以让kubernetes使用私有仓库,并支持nginx basic认证。由于我们采用的是rpm包方式安装的kubernetes集群,默认没有ca.crt、kubecfg.crt kubecfg.key 、server.cert 、server.key这些文件,需要下载源码生成。

一、使用工具生成key文件

# mkdir git
# cd git/
# git clone https://github.com/kubernetes/kubernetes

科学上网方式下载easy-rsa.tar.gz,下载地址在make-ca-cert.sh脚本中可以找到,将文件放到~/kube目录下

# ls ~/kube
easy-rsa.tar.gz
# cd /root/git/kubernetes/
# sh cluster/centos/make-ca-cert.sh 192.168.115.5
# ls /srv/kubernetes/
ca.crt  kubecfg.crt  kubecfg.key  server.cert  server.key
# chown -R kube:kube /srv/kubernetes/*

将这些文件发送到vm2主机的相同目录

# chown -R kube:kube /srv/kubernetes/*
# scp -rp /srv/ root@vm2:/

二、修改配置文件

# grep -v '^#' /etc/kubernetes/apiserver |grep -v '^$'
KUBE_API_ADDRESS="--insecure-bind-address=192.168.115.5"
KUBE_ETCD_SERVERS="--etcd-servers=http://192.168.115.5:2379"
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,ServiceAccount,SecurityContextDeny,ResourceQuota"
KUBE_API_ARGS="--storage-backend=etcd2 --secure-port=6443 --client-ca-file=/srv/kubernetes/ca.crt --tls-cert-file=/srv/kubernetes/server.cert --tls-private-key-file=/srv/kubernetes/server.key"
# grep -v '^#' /etc/kubernetes/controller-manager |grep -v '^$'
KUBE_CONTROLLER_MANAGER_ARGS="--root-ca-file=/srv/kubernetes/ca.crt --service-account-private-key-file=/srv/kubernetes/server.key"

三、重启相关服务

Master:
# systemctl restart kube-apiserver
# systemctl restart kube-controller-manager
# systemctl restart kube-scheduler

Slave:
# systemctl restart kubelet
# systemctl restart kube-proxy

# kubectl get secret    
# kubectl describe secret default-token-6pddn

四、通过配置secret,让kubernetes可以从私有仓库中拉取镜像

# kubectl create secret docker-registry regsecret \
--docker-server=registry.fjhb.cn  \
--docker-username=ylw \
 --docker-password=123 \
 [email protected]


在yaml文件sepc节加入imagePullSecrets,指定使用创建好的secret

# kubectl create -f frontend-controller.yaml

通过参考kubernetes的官方文档,并不能解决实际问题
https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/

nginx日志依然报401认证错误

我们知道使用docker pull去私有仓库拉取镜像,需要先使用docker login登陆一下私有仓库,而login执行的操作,实际上就是在用户的家目录写入了.docker/config.json文件。将此文件做一个软链接到 /var/lib/kubelet/.docker/就可以解决此问题了。当配置了软连接后就不需要在yaml文件中引用前面的创建的secret了。

# cat /root/.docker/config.json
# ln -s /root/.docker/ /var/lib/kubelet/.docker/

# kubectl create -f frontend-controller.yaml

https://www.cnblogs.com/zhangb8042/p/10199493.html

一、介绍

Service Account概念的引入是基于这样的使用场景:运行在pod里的进程需要调用Kubernetes API以及非Kubernetes API的其它服务。Service Account它并不是给kubernetes集群的用户使用的,而是给pod里面的进程使用的,它为pod提供必要的身份认证。
 

二、创建Service Account

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

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

###serviceaccount(服务账号)

1、#创建serviceaccount

kubectl  create  serviceaccount  mysa

 

2、#查看mysa

[root@k8s-m ~]# kubectl  describe sa mysa

Name:                mysa

Namespace:           default

Labels:             

Annotations:        

Image pull secrets: 

Mountable secrets:   mysa-token-2zjlp

Tokens:              mysa-token-2zjlp

Events:             

3、#查看mysa自动创建的secret

[root@k8s-m ~]# kubectl  get secret

NAME                  TYPE                                  DATA      AGE

default-token-29dpx   kubernetes.io/service-account-token   3         119d

mysa-token-2zjlp      kubernetes.io/service-account-token   3         1m

 

4、#使用mysa的sa资源配置pod

[root@k8s-m ~]# cat mysa-pod.yaml

apiVersion: v1

kind: Pod

metadata:

  name: nginx-pod

  labels:

    app: my-pod

      

spec:

  containers:

  - name: my-pod

    image: nginx

    ports:

    - name: http

      containerPort: 80

  serviceAccountName: mysa

  5、#导入

[root@k8s-m ~]# kubectl apply -f  mysa-pod.yaml

 

 

6、#查看

[root@k8s-m ~]# kubectl  describe pod nginx-pod

 

7、#查看使用的token和secret(使用的是mysa的token)

kubectl  get  pod nginx-pod  -o jsonpath={".spec.volumes"}

 

创建k8s账号及RBAC授权

一、介绍

在Kubernetes中,授权有ABAC(基于属性的访问控制)、RBAC(基于角色的访问控制)、Webhook、Node、AlwaysDeny(一直拒绝)和AlwaysAllow(一直允许)这6种模式。从1.6版本起,Kubernetes 默认启用RBAC访问控制策略。从1.8开始,RBAC已作为稳定的功能。通过设置–authorization-mode=RBAC,启用RABC。在RABC API中,通过如下的步骤进行授权:1)定义角色:在定义角色时会指定此角色对于资源的访问控制的规则;2)绑定角色:将主体与角色进行绑定,对用户进行访问授权。

二、创建k8s账号与RBAC授权使用

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

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

##创建账号

#1、创建私钥

(umask 077; openssl genrsa -out zhang.key 2048)

#用此私钥创建一个csr(证书签名请求)文件

openssl  req -new -key zhang.key -out zhang.csr -subj  "/CN=zhang"

 

openssl x509 -req -in zhang.csr -CA  /etc/kubernetes/pki/ca.crt  -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out zhang.crt -days 365

 

#2、查看证书内容

openssl  x509 -in zhang.crt  -text -noout

 

 

kubectl   config  set-credentials zhang  --client-certificate=./zhang.crt  --client-key=./zhang.key   --embed-certs=true

 

#3、设置上下文

kubectl  config   set-context  zhang@kubernetes --cluster=kubernetes --user=zhang

 

#4、切换用户

kubectl  config use-context zhang@kubernetes

 

 

##测试(还未赋予权限)

[root@k8s-m ssl]# kubectl  get pod

No resources found.

Error from server (Forbidden): pods is forbidden: User "zhang" cannot list pods in the namespace "default"

 

 

##授权

#K8S授权请求是http的请求

对象URL格式:

/apis/[GROUP]/[VERSION]/namespace/[NAMESPACE_NAME]/[KIND]/[OBJECT_ID]

 

 

k8s授权方式分为:serviceaccount和自己签证ca证书的账号,及签证ca的用户组(group)上(授权给这个组的权限)

 

#简介

role:

1、允许的操作,如get,list等

2、允许操作的对象,如pod,svc等

 

rolebinding:将哪个用户绑定到哪个role或clusterrole上

 

clusterrole:(集群角色)

clusterrolebinding:(绑定到集群)

3、如果使用rolebinding绑定到clusterrole上,表示绑定的用户只能用于当前namespace的权限

 

 

#创建一个角色(role)

kubectl  create role  myrole  --verb=get,list,watch --resource=pod,svc

 

#绑定用户zhang(上面创建的用户),绑定role为myrole

kubectl  create  rolebinding myrole-binding  --role=myrole  --user=zhang

#切换用户

[root@k8s-m ~]# kubectl  config use-context zhang@kubernetes

Switched to context "zhang@kubernetes".

 

#查看权限(只授权了default名称空间pod和svc的get,list,watch权限)

[root@k8s-m ~]# kubectl  get pod

NAME                     READY     STATUS              RESTARTS   AGE

nginx-pod                0/1       ImagePullBackOff    0          1h

[root@k8s-m ~]# kubectl  get pod -n kube-system #无权访问kube-system

No resources found.

Error from server (Forbidden): pods is forbidden: User "zhang" cannot list pods in the namespace "kube-system"

 

[root@k8s-m ~]# kubectl  delete pod nginx-pod #无删除权限

Error from server (Forbidden): pods "nginx-pod" is forbidden: User "zhang" cannot delete pods in the namespace "default"

 

 

 

 

#创建clusterrole#可以访问全部的namespace

kubectl  create clusterrole mycluster-role --verb=get,list,watch  --resource=pod,svc 

#删除zhang账号之前绑定的rolebinding

kubectl  delete rolebinding myrole-binding 

#使用clusterrolebinding绑定clusterrole

kubectl  create clusterrolebinding my-cluster-rolebinding   --clusterrole=mycluster-role  --user=zhang

 

#切换账号

kubectl  config use-context zhang@kubernetes

#查看权限 查看kube-system空间的pod

[root@k8s-m ~]# kubectl  get pod -n kube-system

NAME                            READY     STATUS    RESTARTS   AGE

coredns-78fcdf6894-67h9h        1/1       Running   1          11h

coredns-78fcdf6894-lzxmz        1/1       Running   1          11h

etcd-k8s-m                      1/1       Running   2          11h

......

  

 

配置一个新账号和配置文件并授权

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

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

##创建证书

(umask 077; openssl genrsa -out k8s.key 2048)

#用此私钥创建一个csr(证书签名请求)文件(/0是组名)

openssl  req -new -key k8s.key -out k8s.csr -subj  "/CN=k8s/O=zhang"

 

openssl x509 -req -in k8s.csr -CA  /etc/kubernetes/pki/ca.crt  -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out k8s.crt -days 365

 

#查看证书内容

openssl  x509 -in k8s.crt  -text -noout

 

##创建secret

#创建一个generic的secre namespace设置为default

kubectl  create  secret generic k8s  -n default  --from-file=k8s.crt=./k8s.crt   --from-file=k8s.key=./k8s.key

#查看

[root@k8s-m ~]# kubectl  get secret |grep k8s

k8s                   Opaque                                2         35s

 

 

 

###配置生成

kubectl config set-cluster  kubernetes    --certificate-authority=/etc/kubernetes/pki/ca.crt  --server="https://10.0.0.141:6443"  --embed-certs=true   --kubeconfig=./k8s.config

 

## 配置客户端认证

kubectl config set-credentials k8s --client-certificate=./k8s.crt   --client-key=./k8s.key --embed-certs=true  --kubeconfig=./k8s.config

 

### 配置关联

kubectl  config   set-context  k8s@user --cluster=kubernetes --user=k8s --kubeconfig=./k8s.config

 

 

 

##创建role

 kubectl  create role  k8s-role  --verb=get,list,watch --resource=pod,svc

#创建rolebinding

kubectl  create  rolebinding k8s-rolebinding  --role=k8s-role  --user=k8s

 

#替换配置文件

[root@k8s-m ~]# mv /root/.kube/config    /mnt/

[root@k8s-m ~]# cp k8s.config  /root/.kube/config

#修改config的current-context内容

current-context: ""

改成#

current-context: name: k8s@user

 

##查看

[root@k8s-m ~]# kubectl  get pod

NAME                     READY     STATUS              RESTARTS   AGE

my-statefulset-0         0/1       ContainerCreating   0          8d

nginx-6f858d4d45-6qm6g   0/1       ImagePullBackOff    0          9d

[root@k8s-m ~]# kubectl  get pod  -n kube-system

No resources found.

Error from server (Forbidden): pods is forbidden: User "k8s" cannot list pods in the namespace "kube-system"

  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(kubernetes集群配置serviceaccount;Service Account和RBAC授权)