文章目录
- 主要内容
- 一.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:- podsverbs:- create- get
- apiGroups:- appsresources:- deploymentsverbs:- 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: podnamespace: memdblabels:app: httpd
spec:containers:- name: httpdimage: httpdports:- name: webcontainerPort: 80restartPolicy: 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: pod1namespace: mobapplabels:app: nginx
spec:containers:- name: httpdimage: httpdports:- name: webcontainerPort: 80restartPolicy: OnFailure
EOFkubectl 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-mobappnamespace: memdb
spec:podSelector: {}policyTypes:- Ingressingress:- from:- namespaceSelector:matchLabels:name: mobappports:- protocol: TCPport: 80
EOFkubectl create -f np.yml
6.创建测试用例
代码如下(示例):
cat > nptest.yml <<EOF
apiVersion: v1
kind: Pod
metadata:name: pod-default
spec:containers:- name: busyboximage: busyboxcommand:- /bin/sh- -c- "sleep 10m"restartPolicy: OnFailure
EOFkubectl 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,网络策略。