k8s角色

查看node节点

1
2
3
4
[root@node1 work]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
node1 Ready <none> 41h v1.14.2
node2 Ready <none> 41h v1.14.2

设置集群角色

1
2
3
4
5
6
7
8
9
10
11
12
13
# 设置 node1 为 master 角色

kubectl label nodes node1 node-role.kubernetes.io/master=

# 设置 node2 为 node 角色

kubectl label nodes node2 node-role.kubernetes.io/node=


[root@node1 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
node1 Ready master 42h v1.14.2
node2 Ready node 42h v1.14.2

设置taint

语法

1
2
3
4
5
kubectl taint node [node] key=value[effect]   
其中[effect] 可取值: [ NoSchedule | PreferNoSchedule | NoExecute ]
NoSchedule: 一定不能被调度
PreferNoSchedule: 尽量不要调度
NoExecute: 不仅不会调度, 还会驱逐Node上已有的Pod

使用

1
2
3
4
5
6
7
8
9
[root@node1 ~]# kubectl taint nodes node1 node-role.kubernetes.io/master=:NoExecute
node/node1 tainted
[root@node1 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-ds-kztdz 1/1 Running 0 18h
nginx-ds-vbjh9 0/1 Terminating 0 18h
[root@node1 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-ds-kztdz 1/1 Running 0 18h

查看taint

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@node1 ~]# kubectl describe node node1
Name: node1
Roles: master
Labels: beta.kubernetes.io/arch=amd64
beta.kubernetes.io/os=linux
kubernetes.io/arch=amd64
kubernetes.io/hostname=node1
kubernetes.io/os=linux
node-role.kubernetes.io/master=
Annotations: node.alpha.kubernetes.io/ttl: 0
volumes.kubernetes.io/controller-managed-attach-detach: true
CreationTimestamp: Tue, 04 Jun 2019 15:28:56 +0800
Taints: node-role.kubernetes.io/master:NoExecute
node-role.kubernetes.io/master:NoSchedule
Unschedulable: false
Conditions:
Type Status LastHeartbeatTime LastTransitionTime Reason Message
---- ------ ----------------- ------------------ ------ -------
MemoryPressure False Thu, 06 Jun 2019 10:08:16 +0800 Tue, 04 Jun 2019 15:28:57 +0800 KubeletHasSufficientMemory kubelet has sufficient memory available
DiskPressure False Thu, 06 Jun 2019 10:08:16 +0800 Tue, 04 Jun 2019 15:28:57 +0800 KubeletHasNoDiskPressure kubelet has no disk pressure
PIDPressure False Thu, 06 Jun 2019 10:08:16 +0800 Tue, 04 Jun 2019 15:28:57 +0800 KubeletHasSufficientPID kubelet has sufficient PID available
Ready True Thu, 06 Jun 2019 10:08:16 +0800 Tue, 04 Jun 2019 15:28:57 +0800 KubeletReady kubelet is posting ready status
Addresses:
InternalIP: 192.168.6.101

删除taint

1
2
[root@node1 ~]# kubectl taint nodes node1 node-role.kubernetes.io/master-
node/node1 untainted

RBAC

Kubernetes有一个很基本的特性就是它的所有资源对象都是模型化的 API 对象,允许执行 CRUD(Create、Read、Update、Delete)操作(也就是我们常说的增、删、改、查操作),比如下面的这下资源:

  • Pods
  • ConfigMaps
  • Deployments
  • Nodes
  • Secrets
  • Namespaces

上面这些资源对象的可能存在的操作有:

  • create
  • get
  • delete
  • list
  • update
  • edit
  • watch
  • exec

在更上层,这些资源和 API Group 进行关联,比如Pods属于 Core API Group,而Deployements属于 apps API Group,要在Kubernetes中进行RBAC的管理,除了上面的这些资源和操作以外,我们还需要另外的一些对象:

  • Rule:规则,规则是一组属于不同 API Group 资源上的一组操作的集合
  • Role 和 ClusterRole:角色和集群角色,这两个对象都包含上面的 Rules 元素,二者的区别在于,在 Role 中,定义的规则只适用于单个命名空间,也就是和 namespace 关联的,而 ClusterRole 是集群范围内的,因此定义的规则不受命名空间的约束。另外 Role 和 ClusterRole 在Kubernetes中都被定义为集群内部的 API 资源,和我们前面学习过的 Pod、ConfigMap 这些类似,都是我们集群的资源对象,所以同样的可以使用我们前面的kubectl相关的命令来进行操作
  • Subject:主题,对应在集群中尝试操作的对象,集群中定义了3种类型的主题资源:
    • User Account:用户,这是有外部独立服务进行管理的,管理员进行私钥的分配,用户可以使用 KeyStone或者 Goolge 帐号,甚至一个用户名和密码的文件列表也可以。对于用户的管理集群内部没有一个关联的资源对象,所以用户不能通过集群内部的 API 来进行管理
    • Group:组,这是用来关联多个账户的,集群中有一些默认创建的组,比如cluster-admin
    • Service Account:服务帐号,通过Kubernetes API 来管理的一些用户帐号,和 namespace 进行关联的,适用于集群内部运行的应用程序,需要通过 API 来完成权限认证,所以在集群内部进行权限操作,我们都需要使用到 ServiceAccount,这也是我们这节课的重点
  • RoleBinding 和 ClusterRoleBinding:角色绑定和集群角色绑定,简单来说就是把声明的 Subject 和我们的 Role 进行绑定的过程(给某个用户绑定上操作的权限),二者的区别也是作用范围的区别:RoleBinding 只会影响到当前 namespace 下面的资源操作权限,而 ClusterRoleBinding 会影响到所有的 namespace。
Donate