文章目录
- 主要内容
- 一.Role和ClusterRole
- 1.ClusterRole示例,创建一个名为test-clusterrole且仅有创建Pod和deployment的集群角色
- 代码如下(示例):
- 2.YAML文件创建
- 代码如下(示例):
- 3.将udbs用户和Clusterrole进行绑定,并测试权限
- 代码如下(示例):
- 5.解释
- 二.网络策略
- 总结
主要内容
- Role和ClusterRole
- 网络策略
一.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之间的通信。
网络策略的基本概念和用法如下:
-
网络策略资源:在Kubernetes中,网络策略由NetworkPolicy资源表示。您可以使用kubectl命令或YAML文件来创建、查看和删除NetworkPolicy。
-
选择器(Selectors):您可以使用选择器来定义哪些Pod受网络策略的影响。选择器可以基于标签(Label)来选择Pod。
-
规则(Rules):网络策略由一组规则组成。每个规则定义了允许或拒绝哪些流量的详细规则。规则可以基于源Pod、目标Pod、协议、端口等条件来定义。
-
默认策略(Default Policies):当没有定义任何网络策略时,集群将采用默认策略。默认情况下,所有Pod都可以相互通信。您可以定义默认策略以限制Pod之间的通信。
-
网络插件支持:网络策略的实现依赖于所使用的网络插件。不同的网络插件对网络策略的支持程度可能会有所不同。
使用网络策略的步骤如下:
-
启用网络策略:首先,您需要确保所使用的网络插件支持网络策略,并已在集群中启用。
-
创建NetworkPolicy:使用kubectl命令或YAML文件创建NetworkPolicy资源。在NetworkPolicy中定义选择器和规则,以控制Pod之间的通信。
-
应用NetworkPolicy:创建NetworkPolicy后,它将立即生效,并开始限制Pod之间的通信。
-
验证网络策略:您可以使用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,网络策略。