1. 首页 > KubeSphere教程 > 正文

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
    # 创建租户A的服务账户
    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
    # 创建测试Pod
    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)
    # 创建租户B的测试Pod
    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

    # 创建Pod安全策略
    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
    # 创建RBAC角色
    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
    # 查看Pod安全策略
    kubectl get psp
    NAME PRIV CAPS SELINUX RUNASUSER FSGROUP SUPGROUP READONLYROOTFS VOLUMES
    restricted false RunAsAny MustRunAsNonRoot RunAsAny RunAsAny false configMap,downwardAPI,emptyDir,projected,secret
    # 创建测试Pod验证安全策略
    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]
    # 创建符合安全策略的Pod
    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
    # 验证Pod状态
    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
    # 检查Pod资源限制
    kubectl describe pod nginx -n tenant-a | grep -A 5 “Limits”
    Limits:
    cpu: 500m
    memory: 128Mi

    问题3:Pod安全策略拒绝Pod创建

    现象:Pod创建失败,提示PodSecurityPolicy错误

    原因:Pod配置不符合安全策略要求

    解决方案:

    # 查看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

    联系我们

    在线咨询:点击这里给我发消息

    微信号:itpux-com

    工作日:9:30-18:30,节假日休息