KubeSphere教程FG035-KubeSphere多租户网络隔离与安全策略实战
本教程详细介绍KubeSphere中多租户网络隔离与安全策略的实战操作,包括基础概念、生产环境规划、具体实施方案和实战案例。风哥教程参考KubeSphere官方文档KubeSphere容器平台使用指南、KubeSphere网络策略文档等相关内容。
目录大纲
Part01-基础概念与理论知识
1.1 多租户核心概念
多租户是指在一个KubeSphere集群中支持多个独立的租户,它包括:
- 企业空间:KubeSphere中的租户隔离单位
- 项目:企业空间下的项目隔离单位
- 命名空间:Kubernetes中的资源隔离单位
- 资源配额:限制租户的资源使用
- 网络隔离:租户之间的网络隔离
1.2 网络隔离核心概念
网络隔离是指将不同租户的网络流量隔离开来,它包括:
- 网络策略:控制Pod之间的网络访问
- 命名空间隔离:不同命名空间之间的网络隔离
- Pod隔离:不同Pod之间的网络隔离
- 服务隔离:不同服务之间的网络隔离
- 网络插件:支持网络隔离的网络插件
1.3 安全策略核心概念
安全策略是指保护KubeSphere集群安全的策略,它包括:
- Pod安全策略:控制Pod的安全配置
- RBAC:基于角色的访问控制
- 网络策略:控制网络访问
- 镜像安全策略:控制镜像的安全性
- 审计日志:记录安全事件
Part02-生产环境规划与建议
2.1 多租户架构规划
在实施多租户网络隔离与安全策略时,多租户架构规划是非常重要的:
- 租户划分:合理划分租户
- 资源配额:设置合理的资源配额
- 权限管理:设置合理的权限管理
- 网络规划:规划租户的网络
- 安全规划:规划租户的安全策略
2.2 网络隔离规划
网络隔离规划对于多租户网络隔离与安全策略也非常重要:
- 网络插件选择:选择支持网络隔离的网络插件
- 网络策略规划:规划网络策略
- 网络拓扑规划:规划网络拓扑
- 网络监控:配置网络监控
- 网络故障排查:配置网络故障排查
2.3 安全策略规划
安全策略规划是多租户网络隔离与安全策略的重要组成部分:
- 安全策略设计:设计安全策略
- 权限管理:设置合理的权限管理
- 审计日志:配置审计日志
- 安全监控:配置安全监控
- 安全演练:定期进行安全演练
Part03-生产环境项目实施方案
3.1 企业空间与项目隔离配置
企业空间与项目隔离的配置步骤:
- 创建企业空间:创建新的企业空间
- 创建项目:在企业空间中创建项目
- 配置资源配额:为项目配置资源配额
- 配置网络策略:为项目配置网络策略
- 配置安全策略:为项目配置安全策略
3.2 网络策略配置
网络策略的配置步骤: 风哥提示:
3.3 安全策略配置
安全策略的配置步骤:
- 配置RBAC:配置基于角色的访问控制
- 配置Pod安全策略:配置Pod安全策略
- 配置镜像安全策略:配置镜像安全策略
- 配置审计日志:配置审计日志
- 配置安全监控:配置安全监控
Part04-生产案例与实战讲解
4.1 多租户隔离实战
下面我们来实战演示多租户隔离:
kubectl create namespace tenant-a
namespace/tenant-a created
kubectl create namespace tenant-b
namespace/tenant-b created
cat <<EOF | kubectl apply -f –
apiVersion: v1
kind: ResourceQuota
metadata:
name: tenant-a-quota
namespace: tenant-a
spec:
hard:
requests.cpu: “4”
requests.memory: 8Gi
limits.cpu: “8”
limits.memory: 16Gi
persistentvolumeclaims: “10”
EOF
resourcequota/tenant-a-quota created
kubectl get resourcequota -n tenant-a
NAME AGE REQUEST LIMIT
tenant-a-quota 10s requests.cpu: 0/4, requests.memory: 0/8Gi limits.cpu: 0/8, limits.memory: 0/16Gi, persistentvolumeclaims: 0/10
kubectl create serviceaccount tenant-a-admin -n tenant-a
serviceaccount/tenant-a-admin created
cat <<EOF | kubectl apply -f –
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: tenant-a-admin-role
namespace: tenant-a
rules:
– apiGroups: [“”, “apps”, “batch”]
resources: [“*”]
verbs: [“*”]
—
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: tenant-a-admin-binding
namespace: tenant-a
subjects:
– kind: ServiceAccount
name: tenant-a-admin
namespace: tenant-a
,
roleRef:
kind: Role
name: tenant-a-admin-role
apiGroup: rbac.authorization.k8s.io
EOF
role.rbac.authorization.k8s.io/tenant-a-admin-role created
rolebinding.rbac.authorization.k8s.io/tenant-a-admin-binding created
kubectl get pods -n tenant-a
No resources found in tenant-a namespace.
kubectl get pods -n tenant-b
No resources found in tenant-b namespace.
4.2 网络策略实战
下面我们来实战演示网络策略: 学习交流加群风哥微信: itpux-com
kubectl get networkpolicy -A
No resources found
cat <<EOF | kubectl apply -f –
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all
namespace: tenant-a
spec:
podSelector: {}
policyTypes:
– Ingress
– Egress
EOF
networkpolicy.networking.k8s.io/deny-all created
cat <<EOF | kubectl apply -f –
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-nginx
namespace: tenant-a
spec:
podSelector:
matchLabels:
app: nginx
policyTypes:
– Ingress
ingress:
– from:
– namespaceSelector:
matchLabels:
name: tenant-a
ports:
– protocol: TCP
port: 80
EOF
networkpolicy.networking.k8s.io/allow-nginx created
kubectl get networkpolicy -n tenant-a
NAME POD-SELECTOR AGE
allow-nginx app=nginx 5s
deny-all <none> 10s
cat <<EOF | kubectl apply -f –
apiVersion: v1
kind: Pod
metadata:
name: nginx
namespace: tenant-a
,
labels:
app: nginx
spec:
containers:
– name: nginx
image: nginx:latest
ports:
– containerPort: 80
—
apiVersion: v1
kind: Pod
metadata:
name: busybox
namespace: tenant-a
spec:
containers:
– name: busybox
image: busybox:latest
command: [‘sh’, ‘-c’, ‘sleep 3600’]
EOF
pod/nginx created
pod/busybox created
kubectl exec -n tenant-a busybox — wget -O- http://nginx
Connecting to nginx (10.244.1.15:80)
writing to stdout
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
…
– 100% |********************************| 612 0:00:00 ETA
downloaded 612 bytes in 0.00 seconds (1.7 MB/s)
cat <<EOF | kubectl apply -f –
apiVersion: v1
kind: Pod
metadata:
name: busybox
namespace: tenant-b
spec:
containers:
– name: busybox
image: busybox:latest
command: [‘sh’, ‘-c’, ‘sleep 3600’]
EOF
pod/busybox created
kubectl exec -n tenant-b busybox — wget -O- http://nginx.tenant-a.svc.cluster.local
Connecting to nginx.tenant-a.svc.cluster.local (10.96.0.10:80)
wget: download timed out
4.3 安全策略实战
下面我们来实战演示安全策略: 学习交流加群风哥QQ113257174 更多视频教程www.fgedu.net.cn
cat <<EOF | kubectl apply -f –
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: restricted
spec:
privileged: false
allowPrivilegeEscalation: false
requiredDropCapabilities:
– ALL
volumes:
– ‘configMap’
– ’emptyDir’
– ‘projected’
– ‘secret’
– ‘downwardAPI’
hostNetwork: false
hostIPC: false
hostPID: false
runAsUser:
rule: ‘MustRunAsNonRoot’
seLinux:
rule: ‘RunAsAny’
,
fsGroup:
rule: ‘RunAsAny’
supplementalGroups:
rule: ‘RunAsAny’
readOnlyRootFilesystem: false
EOF
podsecuritypolicy.policy/restricted created
cat <<EOF | kubectl apply -f –
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: psp-restricted
rules:
– apiGroups: [‘policy’]
resources: [‘podsecuritypolicies’]
verbs: [‘use’]
resourceNames:
– restricted
—
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: psp-restricted-binding
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: psp-restricted
subjects:
– kind: ServiceAccount
name: tenant-a-admin
namespace: tenant-a
EOF
clusterrole.rbac.authorization.k8s.io/psp-restricted created
clusterrolebinding.rbac.authorization.k8s.io/psp-restricted-binding created
kubectl get psp
NAME PRIV CAPS SELINUX RUNASUSER FSGROUP SUPGROUP READONLYROOTFS VOLUMES
restricted false RunAsAny MustRunAsNonRoot RunAsAny RunAsAny false configMap,downwardAPI,emptyDir,projected,secret
cat <<EOF | kubectl apply -f –
apiVersion: v1
kind: Pod
metadata:
name: test-privileged
namespace: tenant-a
spec:
containers:
– name: nginx
image: nginx:latest
securityContext:
privileged: true
EOF
Error from server (Forbidden): error when creating “STDIN”: pods “test-privileged” is forbidden: PodSecurityPolicy: unable to admit pod: [spec.containers[0].securityContext.privileged: Invalid value: true: Privileged containers are not allowed]
cat <<EOF | kubectl apply -f –
apiVersion: v1
kind: Pod
metadata:
name: test-restricted
namespace: tenant-a
spec:
containers:
– name: nginx
image: nginx:latest
securityContext:
runAsNonRoot: true
runAsUser: 1000
EOF
pod/test-restricted created
kubectl get pod test-restricted -n tenant-a
NAME READY STATUS RESTARTS AGE
test-restricted 1/1 Running 0 5s
cat <<EOF | kubectl apply -f –
apiVersion: audit.k8s.io/v1
kind: Policy
rules:
– level: Metadata
– level: Request
verbs: [“create”, “update”, “delete”]
resources:
– group: “”
resources: [“pods”, “services”, “deployments”]
– level: RequestResponse
namespaces: [“tenant-a”, “tenant-b”]
EOF
policy/audit-policy created
Part05-风哥经验总结与分享
5.1 常见问题与解决方案
问题1:网络策略不生效
现象:配置了网络策略,但Pod之间仍然可以互相访问 更多学习教程公众号风哥教程itpux_com
原因:网络插件不支持网络策略或网络策略配置错误
解决方案:
kubectl get networkpolicy -A
NAMESPACE NAME POD-SELECTOR AGE
tenant-a deny-all <none> 5m
kubectl describe networkpolicy deny-all -n tenant-a
Name: deny-all
Namespace: tenant-a
Created on: 2024-01-01 00:00:00 +0000 UTC
Labels: <none>
Annotations: <none>
Spec:
PodSelector: <none> (Allowing the specific traffic to all pods in namespace ‘tenant-a’)
Allowing ingress traffic:
<none> (Selected pods are isolated for ingress connectivity)
Allowing egress traffic:
<none> (Selected pods are isolated for egress connectivity)
Policy Types: Ingress, Egress
问题2:资源配额不生效
现象:配置了资源配额,但租户仍然可以创建超过配额的资源
原因:资源配额配置错误或Pod没有设置资源限制
解决方案:
kubectl describe resourcequota tenant-a-quota -n tenant-a
Name: tenant-a-quota
Namespace: tenant-a
Resource Used Hard
——– — —
limits.cpu 0 8
limits.memory 0 16Gi
persistentvolumeclaims 0 10
requests.cpu 0 4
requests.memory 0 8Gi
kubectl describe pod nginx -n tenant-a | grep -A 5 “Limits”
Limits:
cpu: 500m
memory: 128Mi
问题3:Pod安全策略拒绝Pod创建
现象:Pod创建失败,提示PodSecurityPolicy错误
原因:Pod配置不符合安全策略要求
解决方案:
kubectl describe pod test-privileged -n tenant-a
Events:
Type Reason Age From Message
—- —— —- —- ——-
Warning FailedCreate 10s statefulset-controller create Pod test-privileged-0 in StatefulSet test-privileged failed error: pods “test-privileged-0” is forbidden: PodSecurityPolicy: unable to admit pod: [spec.containers[0].securityContext.privileged: Invalid value: true: Privileged containers are not allowed]
5.2 最佳实践建议
建议1:合理规划租户架构
在规划租户架构时,应该: from K8S+DB视频:www.itpux.com
- 按照业务部门或项目划分租户
- 为每个租户设置合理的资源配额
- 为每个租户配置独立的网络策略
- 为每个租户配置独立的安全策略
- 定期审查租户的权限和资源使用情况
建议2:使用网络策略实现细粒度控制
在使用网络策略时,应该:
- 默认拒绝所有流量
- 只允许必要的流量
- 使用标签选择器精确控制流量
- 定期审查和更新网络策略
- 监控网络策略的执行情况
建议3:配置Pod安全策略
在配置Pod安全策略时,应该:
- 禁止特权容器
- 禁止root用户运行容器
- 限制容器的capabilities
- 使用只读根文件系统
- 定期审查和更新Pod安全策略
5.3 性能优化技巧
技巧1:优化网络策略性能
网络策略会影响网络性能,可以通过以下方式优化:
- 减少网络策略的数量
- 使用简单的网络策略规则
- 避免使用复杂的标签选择器
- 使用网络策略的优先级
- 监控网络策略的性能影响
技巧2:优化资源配额性能
资源配额会影响Pod创建性能,可以通过以下方式优化:
- 合理设置资源配额
- 避免过度的资源配额检查
- 使用LimitRange限制资源使用
- 监控资源配额的使用情况
- 定期调整资源配额
技巧3:优化安全策略性能
安全策略会影响Pod创建性能,可以通过以下方式优化:
- 简化Pod安全策略
- 使用多个Pod安全策略
- 避免过度的安全检查
- 监控安全策略的性能影响
- 定期审查和更新安全策略
多租户网络隔离与安全策略是KubeSphere企业级应用的重要组成部分,需要根据实际业务需求进行合理规划和配置。在生产环境中,建议先在测试环境验证配置,然后再应用到生产环境。
本教程由风哥提供,更多KubeSphere实战教程请关注风哥课堂
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
