访问控制2

26 篇文章 0 订阅

主要内容

  1. Role和ClusterRole
  2. 网络策略

一.Role和ClusterRole

RBAC API 声明了四种 Kubernetes 对象:Role、ClusterRole、RoleBinding 和ClusterRoleBinding.
RBAC 的 Role 或 ClusterRole 中包含一组代表相关权限的规则,这些权限是纯粹累加的(不存在拒绝某操作的规则)。Role 总是用来在某个命名空间内设置访问权限;在创建 Role 时,必须指定该 Role 所属的名字空间。ClusterRole 则是一个集群作用域的资源。这两种资源的名字不同(Role 和 ClusterRole)是因为 Kubernetes 对象要么是名字空间作用域的,要么是集群作用域的,不可两者兼具。
如果希望在命名空间内定义角色,就应该使用 Role,如果希望定义集群范围的角色,则应该使用 ClusterRole。

1.ClusterRole示例,创建一个名为test-clusterrole且仅有创建Pod和deployment的集群角色

代码如下(示例):
kubectl create clusterrole --resource=pod,deployment --verb=create,get test-clusterrole
kubectl describe clusterrole test-clusterrole
kubectl delete clusterrole test-clusterrole

在这里插入图片描述

2.YAML文件创建

代码如下(示例):
cat > clusterrole.yml <<EOF
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: test-clusterrole
rules:
- apiGroups:
  - ""
  resources:
  - pods
  verbs:
  - create
  - get
- apiGroups:
  - apps
  resources:
  - deployments
  verbs:
  - create
  - get
EOF

kubectl create -f clusterrole.yml
kubectl describe clusterrole test-clusterrole

在这里插入图片描述

3.将udbs用户和Clusterrole进行绑定,并测试权限

代码如下(示例):
kubectl create clusterrolebinding --clusterrole=test-clusterrole --serviceaccount=test:udbs udbs-clusterbind
kubectl describe clusterrolebinding udbs-clusterbind

在这里插入图片描述

kubectl auth can-i get pods --as=system:serviceaccount:test:udbs
kubectl auth can-i create pods --as=system:serviceaccount:test:udbs
kubectl auth can-i create deployments --as=system:serviceaccount:test:udbs
kubectl auth can-i create secret --as=system:serviceaccount:test:udbs
kubectl auth can-i create service --as=system:serviceaccount:test:udbs

在这里插入图片描述

5.解释

1. `kubectl create clusterrole --resource=pod,deployment --verb=create,get test-clusterrole`:这个命令创建了一个名为"test-clusterrole"的ClusterRole对象。该ClusterRole对象的规则指定了对"pods""deployments"资源的"create""get"权限。

2. `kubectl describe clusterrole test-clusterrole`:这个命令获取名为"test-clusterrole"的ClusterRole对象的详细描述信息。它会显示ClusterRole对象的名称、规则等信息。

3. `kubectl delete clusterrole test-clusterrole`:这个命令删除名为"test-clusterrole"的ClusterRole对象。

4. `cat > clusterrole.yml <<EOF ... EOF`:这个命令将ClusterRole的定义写入到名为"clusterrole.yml"的文件中。文件内容包括ClusterRole对象的API版本、类型、元数据和规则。

5. `kubectl create -f clusterrole.yml`:这个命令使用"clusterrole.yml"文件中的定义创建ClusterRole对象。

6. `kubectl describe clusterrole test-clusterrole`:这个命令获取名为"test-clusterrole"的ClusterRole对象的详细描述信息。

7. `kubectl create clusterrolebinding --clusterrole=test-clusterrole --serviceaccount=test:udbs udbs-clusterbind`:这个命令创建一个名为"udbs-clusterbind"的ClusterRoleBinding对象。该ClusterRoleBinding对象将"test-clusterrole" ClusterRole与"test:udbs" ServiceAccount关联起来。

8. `kubectl describe clusterrolebinding udbs-clusterbind`:这个命令获取名为"udbs-clusterbind"的ClusterRoleBinding对象的详细描述信息。它会显示ClusterRoleBinding对象的名称、关联的ClusterRole、关联的ServiceAccount等信息。

9. `kubectl auth can-i get pods --as=system:serviceaccount:test:udbs`:这个命令用于检查"test:udbs" ServiceAccount是否具有获取pods的权限。它会返回一个布尔值,指示是否具有该权限。

10. `kubectl auth can-i create pods --as=system:serviceaccount:test:udbs`:这个命令用于检查"test:udbs" ServiceAccount是否具有创建pods的权限。

11. `kubectl auth can-i create deployments --as=system:serviceaccount:test:udbs`:这个命令用于检查"test:udbs" ServiceAccount是否具有创建deployments的权限。

12. `kubectl auth can-i create secret --as=system:serviceaccount:test:udbs`:这个命令用于检查"test:udbs" ServiceAccount是否具有创建secrets的权限。

13. `kubectl auth can-i create service --as=system:serviceaccount:test:udbs`:这个命令用于检查"test:udbs" ServiceAccount是否具有创建services的权限。

这些命令的目的是创建和管理ClusterRole、ClusterRoleBinding对象,并验证ServiceAccount是否具有特定资源的特定权限。通过这些命令,可以实现对ServiceAccount的权限分配和权限验证。

二.网络策略

网络策略(Network Policies)是Kubernetes中用于控制Pod之间网络通信的一种机制。它允许您定义规则来限制哪些Pod可以与其他Pod通信,以及允许的通信协议、端口等。网络策略可以帮助提高集群的安全性,并允许您细粒度地控制Pod之间的通信。

网络策略的基本概念和用法如下:

  1. 网络策略资源:在Kubernetes中,网络策略由NetworkPolicy资源表示。您可以使用kubectl命令或YAML文件来创建、查看和删除NetworkPolicy。

  2. 选择器(Selectors):您可以使用选择器来定义哪些Pod受网络策略的影响。选择器可以基于标签(Label)来选择Pod。

  3. 规则(Rules):网络策略由一组规则组成。每个规则定义了允许或拒绝哪些流量的详细规则。规则可以基于源Pod、目标Pod、协议、端口等条件来定义。

  4. 默认策略(Default Policies):当没有定义任何网络策略时,集群将采用默认策略。默认情况下,所有Pod都可以相互通信。您可以定义默认策略以限制Pod之间的通信。

  5. 网络插件支持:网络策略的实现依赖于所使用的网络插件。不同的网络插件对网络策略的支持程度可能会有所不同。

使用网络策略的步骤如下:

  1. 启用网络策略:首先,您需要确保所使用的网络插件支持网络策略,并已在集群中启用。

  2. 创建NetworkPolicy:使用kubectl命令或YAML文件创建NetworkPolicy资源。在NetworkPolicy中定义选择器和规则,以控制Pod之间的通信。

  3. 应用NetworkPolicy:创建NetworkPolicy后,它将立即生效,并开始限制Pod之间的通信。

  4. 验证网络策略:您可以使用kubectl命令或其他工具来验证网络策略是否按预期工作。例如,您可以尝试从一个Pod发送流量到另一个Pod,并确保它符合NetworkPolicy中定义的规则。

总结来说,网络策略是一种用于控制Kubernetes集群中Pod之间网络通信的机制。通过定义选择器和规则,您可以限制哪些Pod可以与其他Pod通信,并允许的通信协议、端口等。网络策略可以提高集群的安全性,并允许您细粒度地控制Pod之间的通信。

1.在名为memdb的namespace中,创建一个仅允许来自名为mobapp的namespace连接的网络策略。

代码如下(示例):
kubectl create namespace memdb
kubectl create namespace mobapp

在这里插入图片描述

2.在memdb namespace中创建一个Pod

代码如下(示例):
cat > nppod.yml <<EOF
apiVersion: v1
kind: Pod
metadata:
  name: pod
  namespace: memdb
  labels:
    app: httpd
spec:
  containers:
  - name: httpd
    image: httpd
    ports:
      - name: web
        containerPort: 80
  restartPolicy: OnFailure
EOF
kubectl create -f nppod.yml
kubectl get pod -n memdb  -o wide

在这里插入图片描述

3.解释

1. `kubectl create namespace memdb`:这个命令用于创建一个名为"memdb"的命名空间。命名空间是Kubernetes中用于组织和隔离资源的一种方式。

2. `kubectl create namespace mobapp`:这个命令用于创建一个名为"mobapp"的命名空间,同样是用于组织和隔离资源的命名空间。

3. `cat > nppod.yml <<EOF`:这个命令用于创建一个名为"nppod.yml"的YAML文件,并将其内容输入到该文件中。

4. `apiVersion: v1`:这行指定了使用的Kubernetes API的版本。

5. `kind: Pod`:这行指定了要创建的资源类型是Pod。

6. `metadata:`:这个部分用于指定Pod的元数据,例如名称、命名空间和标签等。

7. `name: pod`:这行指定了Pod的名称为"pod"8. `namespace: memdb`:这行指定了Pod所属的命名空间为"memdb"9. `labels:`:这个部分用于指定Pod的标签。

10. `app: httpd`:这行指定了一个名为"app"的标签,其值为"httpd"11. `spec:`:这个部分用于指定Pod的规格,包括容器和重启策略等。

12. `containers:`:这个部分用于指定Pod中的容器。

13. `- name: httpd`:这行指定了容器的名称为"httpd"14. `image: httpd`:这行指定了容器所使用的镜像为"httpd",即Apache HTTP服务器。

15. `ports:`:这个部分用于指定容器的端口映射。

16. `- name: web`:这行指定了一个名为"web"的端口映射。

17. `containerPort: 80`:这行指定了容器内部的端口为80。

18. `restartPolicy: OnFailure`:这行指定了Pod的重启策略为"OnFailure",即在容器失败时重启Pod。

19. `EOF`:这个标记表示输入到文件中的内容结束。

20. `kubectl create -f nppod.yml`:这个命令用于创建一个Pod,其配置定义在"nppod.yml"文件中。

21. `kubectl get pod -n memdb -o wide`:这个命令用于获取"memdb"命名空间中的所有Pod,并以表格形式显示详细信息。其中,"-n memdb"指定了命名空间为"memdb""-o wide"指定了显示详细信息,包括IP地址和节点等。

4.在另外一个mobapp namespace中创建一个Pod

代码如下(示例):
cat > nppod1.yml <<EOF
apiVersion: v1
kind: Pod
metadata:
  name: pod1
  namespace: mobapp
  labels:
    app: nginx
spec:
  containers:
  - name: httpd
    image: httpd
    ports:
      - name: web
        containerPort: 80
  restartPolicy: OnFailure
EOF


kubectl create -f nppod1.yml
kubectl get pod -n mobapp -o wide

在这里插入图片描述

5.创建网络策略

代码如下(示例):
cat > np.yml <<EOF
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-from-namesapce-mobapp
  namespace: memdb
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          name: mobapp
    ports:
    - protocol: TCP
      port: 80
EOF

kubectl create -f np.yml

在这里插入图片描述

6.创建测试用例

代码如下(示例):
cat > nptest.yml <<EOF
apiVersion: v1
kind: Pod
metadata:
  name: pod-default
spec:
  containers:
  - name: busybox
    image: busybox
    command:
      - /bin/sh
      - -c
      - "sleep 10m"
  restartPolicy: OnFailure
EOF

kubectl create -f nptest.yml

在这里插入图片描述

kubectl exec -it pod-default -- wget 172.16.245.1
kubectl exec -it pod-default -- wget 172.16.93.194 

访问没有被网络策略选中的Pod,可以看到访问成功:
在这里插入图片描述
而访问被网络策略选中的Pod时,则访问被禁止
在这里插入图片描述

7.解释

以下是您提供的代码片段的详细解释:

1. `cat > nppod1.yml <<EOF`:这个命令用于创建一个名为"nppod1.yml"的YAML文件,并将其内容输入到该文件中。

2. `apiVersion: v1`:这行指定了使用的Kubernetes API的版本。

3. `kind: Pod`:这行指定了要创建的资源类型是Pod。

4. `metadata:`:这个部分用于指定Pod的元数据,例如名称、命名空间和标签等。

5. `name: pod1`:这行指定了Pod的名称为"pod1"6. `namespace: mobapp`:这行指定了Pod所属的命名空间为"mobapp"7. `labels:`:这个部分用于指定Pod的标签。

8. `app: nginx`:这行指定了一个名为"app"的标签,其值为"nginx"9. `spec:`:这个部分用于指定Pod的规格,包括容器和重启策略等。

10. `containers:`:这个部分用于指定Pod中的容器。

11. `- name: httpd`:这行指定了容器的名称为"httpd"12. `image: httpd`:这行指定了容器所使用的镜像为"httpd",即Apache HTTP服务器。

13. `ports:`:这个部分用于指定容器的端口映射。

14. `- name: web`:这行指定了一个名为"web"的端口映射。

15. `containerPort: 80`:这行指定了容器内部的端口为80。

16. `restartPolicy: OnFailure`:这行指定了Pod的重启策略为"OnFailure",即在容器失败时重启Pod。

17. `kubectl create -f nppod1.yml`:这个命令用于创建一个Pod,其配置定义在"nppod1.yml"文件中。

18. `kubectl get pod -n mobapp -o wide`:这个命令用于获取"mobapp"命名空间中的所有Pod,并以表格形式显示详细信息。其中,"-n mobapp"指定了命名空间为"mobapp""-o wide"指定了显示详细信息,包括IP地址和节点等。

19. `cat > np.yml <<EOF`:这个命令用于创建一个名为"np.yml"的YAML文件,并将其内容输入到该文件中。

20. `apiVersion: networking.k8s.io/v1`:这行指定了使用的Kubernetes网络策略API的版本。

21. `kind: NetworkPolicy`:这行指定了要创建的资源类型是网络策略。

22. `metadata:`:这个部分用于指定网络策略的元数据,例如名称和命名空间等。

23. `name: allow-from-namesapce-mobapp`:这行指定了网络策略的名称为"allow-from-namesapce-mobapp"24. `namespace: memdb`:这行指定了网络策略所属的命名空间为"memdb"25. `spec:`:这个部分用于指定网络策略的规格,包括Pod选择器和策略类型等。

26. `podSelector: {}`:这行指定了应用网络策略的Pod选择器为空,即适用于所有Pod。

27. `policyTypes:`:这个部分用于指定策略类型。

28. `- Ingress`:这行指定了策略类型为入口流量。

29. `ingress:`:这个部分用于指定入口流量的规则。

30. `- from:`:这行指定了入口流量的来源。

31. `- namespaceSelector:`:这行指定了命名空间选择器。

32. `matchLabels:`:这行指定了匹配标签。

33. `name: mobapp`:这行指定了一个名为"name"的标签,其值为"mobapp"34. `ports:`:这个部分用于指定允许的端口。

35. `- protocol: TCP`:这行指定了允许的协议为TCP。

36. `port: 80`:这行指定了允许的端口为80。

37. `kubectl create -f np.yml`:这个命令用于创建一个网络策略,其配置定义在"np.yml"文件中。

38. `cat > nptest.yml <<EOF`:这个命令用于创建一个名为"nptest.yml"的YAML文件,并将其内容输入到该文件中。

39. `apiVersion: v1`:这行指定了使用的Kubernetes API的版本。

40. `kind: Pod`:这行指定了要创建的资源类型是Pod。

41. `metadata:`:这个部分用于指定Pod的元数据,例如名称和标签等。

42. `name: pod-default`:这行指定了Pod的名称为"pod-default"43. `spec:`:这个部分用于指定Pod的规格,包括容器和重启策略等。

44. `containers:`:这个部分用于指定Pod中的容器。

45. `- name: busybox`:这行指定了容器的名称为"busybox"46. `image: busybox`:这行指定了容器所使用的镜像为"busybox"47. `command:`:这个部分用于指定容器的启动命令。

48. `- /bin/sh`:这行指定了容器的启动命令为"/bin/sh"49. `- -c`:这行指定了容器的命令参数为"-c"50. `sleep 10m`:这行指定了容器的命令为"sleep 10m",即睡眠10分钟。

51. `restartPolicy: OnFailure`:这行指定了Pod的重启策略为"OnFailure",即在容器失败时重启Pod。

52. `kubectl create -f nptest.yml`:这个命令用于创建一个Pod,其配置定义在"nptest.yml"文件中。

53. `kubectl exec -it pod-default -- wget 172.16.245.1`:这个命令用于在Pod "pod-default" 中执行命令。其中,"-it"指定了交互式终端,"pod-default"是要执行命令的Pod的名称,"wget 172.16.245.1"是要执行的命令,即使用wget工具下载位于172.16.245.1的文件。

总结

以上是今天要讲的内容,学到了访问控制,包括Role和ClusterRole,网络策略。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

K要努力

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值