1. 首页 > Linux教程 > 正文

Linux教程FG567-大规模K8s多租户资源隔离与管理

Part01-基础概念与理论知识

1.1 多租户基本概念

多租户是指在一个Kubernetes集群中同时为多个用户或团队提供服务的能力,每个租户可以独立管理自己的应用和资源,而不影响其他租户。在大规模集群中,多租户管理尤为重要,可以提高资源利用率,简化管理,降低运维成本。

1.2 多租户隔离级别

Kubernetes提供了多种级别的多租户隔离:

  • 命名空间隔离:使用命名空间将不同租户的资源隔离开来
  • 资源隔离:使用ResourceQuota和LimitRange限制租户的资源使用
  • 网络隔离:使用NetworkPolicy限制租户间的网络通信
  • 存储隔离:使用不同的存储类和持久卷为租户提供存储
  • 权限隔离:使用RBAC控制租户对资源的访问权限

1.3 多租户管理挑战

多租户管理面临的主要挑战:

  • 资源竞争:多个租户共享集群资源,可能导致资源竞争
  • 安全隔离:确保租户之间的安全隔离,防止恶意攻击
  • 性能影响:一个租户的高负载可能影响其他租户的性能
  • 管理复杂性:需要统一管理多个租户的资源和权限
  • 计费与审计:需要对租户的资源使用进行计费和审计

from PG视频:www.itpux.com

Part02-生产环境规划与建议

2.1 多租户架构设计

在实施多租户前,需要设计合理的多租户架构:

  • 命名空间设计:根据组织架构和业务需求设计命名空间结构
  • 资源分配策略:制定合理的资源分配策略,确保公平性
  • 网络架构:设计隔离的网络架构,确保租户间网络安全
  • 存储策略:为不同租户提供合适的存储方案
  • 权限模型:设计细粒度的权限模型,控制租户的访问权限

风哥提示:多租户架构设计需要考虑可扩展性和可维护性,避免过于复杂的设计。

2.2 资源配额规划

制定合理的资源配额规划:

  • CPU和内存配额:为每个租户设置合理的CPU和内存配额
  • 存储配额:限制租户的存储使用量
  • Pod数量限制:限制租户可以创建的Pod数量
  • 服务和路由限制:限制租户可以创建的服务和路由数量
  • 资源预留:为系统组件和关键租户预留资源

2.3 安全策略制定

制定完善的安全策略:

  • 网络安全策略:使用NetworkPolicy限制租户间的网络通信
  • 访问控制策略:使用RBAC控制租户对资源的访问权限
  • 镜像安全策略:限制租户使用的容器镜像来源
  • Secret管理策略:安全管理租户的敏感信息
  • 审计策略:记录租户的操作行为,便于审计

from Linux:www.itpux.com

Part03-生产环境项目实施方案

3.1 命名空间隔离配置

配置命名空间隔离:

# 创建租户命名空间
$ kubectl create namespace tenant-a
$ kubectl create namespace tenant-b
$ kubectl create namespace tenant-c

# 查看命名空间
$ kubectl get namespaces

# 为租户创建服务账户
$ kubectl create serviceaccount tenant-a-sa -n tenant-a
$ kubectl create serviceaccount tenant-b-sa -n tenant-b
$ kubectl create serviceaccount tenant-c-sa -n tenant-c

# 为租户创建RBAC权限
$ cat > tenant-rbac.yaml << EOF
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: tenant-role
  namespace: tenant-a
rules:
- apiGroups: ["", "apps", "batch"]
  resources: ["pods", "services", "deployments", "jobs", "cronjobs"]
  verbs: ["get", "list", "create", "update", "delete"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: tenant-role-binding
  namespace: tenant-a
subjects:
- kind: ServiceAccount
  name: tenant-a-sa
  namespace: tenant-a
roleRef:
  kind: Role
  name: tenant-role
  apiGroup: rbac.authorization.k8s.io
EOF

$ kubectl apply -f tenant-rbac.yaml

# 为其他租户创建类似的RBAC权限
$ sed 's/tenant-a/tenant-b/g' tenant-rbac.yaml | kubectl apply -f -
$ sed 's/tenant-a/tenant-c/g' tenant-rbac.yaml | kubectl apply -f -

执行结果:

# 查看命名空间
$ kubectl get namespaces
NAME              STATUS   AGE
default           Active   1d
kube-system       Active   1d
kube-public       Active   1d
kube-node-lease   Active   1d
tenant-a          Active   5m
tenant-b          Active   5m
tenant-c          Active   5m

# 查看服务账户
$ kubectl get serviceaccounts -n tenant-a
NAME           SECRETS   AGE
default        1         5m
tenant-a-sa    1         5m

# 查看RBAC权限
$ kubectl get roles -n tenant-a
NAME          CREATED AT
tenant-role   2026-04-03T11:00:00Z

$ kubectl get rolebindings -n tenant-a
NAME                 ROLE             AGE
tenant-role-binding   Role/tenant-role   2026-04-03T11:00:00Z

3.2 资源配额与限制配置

配置资源配额与限制:

# 为租户创建资源配额
$ cat > tenant-a-resourcequota.yaml << EOF
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"
    pods: "50"
    services: "20"
    secrets: "100"
    configmaps: "100"
    persistentvolumeclaims: "20"
EOF

$ kubectl apply -f tenant-a-resourcequota.yaml

# 为其他租户创建资源配额
$ sed 's/tenant-a/tenant-b/g' tenant-a-resourcequota.yaml | kubectl apply -f -
$ sed 's/tenant-a/tenant-c/g' tenant-a-resourcequota.yaml | kubectl apply -f -

# 为租户创建默认资源限制
$ cat > tenant-a-limitrange.yaml << EOF
apiVersion: v1
kind: LimitRange
metadata:
  name: tenant-a-limitrange
  namespace: tenant-a
spec:
  limits:
  - default:
      cpu: "500m"
      memory: "1Gi"
    defaultRequest:
      cpu: "100m"
      memory: "256Mi"
    type: Container
EOF

$ kubectl apply -f tenant-a-limitrange.yaml

# 为其他租户创建默认资源限制
$ sed 's/tenant-a/tenant-b/g' tenant-a-limitrange.yaml | kubectl apply -f -
$ sed 's/tenant-a/tenant-c/g' tenant-a-limitrange.yaml | kubectl apply -f -

# 查看资源配额
$ kubectl get resourcequotas -n tenant-a

# 查看资源限制
$ kubectl get limitranges -n tenant-a

执行结果:

# 查看资源配额
$ kubectl get resourcequotas -n tenant-a
NAME            AGE   REQUEST                                     LIMIT
tenant-a-quota   5m   requests.cpu: 0/4, requests.memory: 0/8Gi   limits.cpu: 0/8, limits.memory: 0/16Gi, pods: 0/50, services: 0/20, secrets: 0/100, configmaps: 0/100, persistentvolumeclaims: 0/20

# 查看资源限制
$ kubectl get limitranges -n tenant-a
NAME                 AGE
tenant-a-limitrange   5m

# 查看资源限制详情
$ kubectl describe limitranges tenant-a-limitrange -n tenant-a
Name:       tenant-a-limitrange
Namespace:  tenant-a
Type        Resource  Min  Max  Default Request  Default Limit  Max Limit/Request Ratio
----        --------  ---  ---  ---------------  -------------  -----------------------
Container   cpu       -    -    100m             500m           -
Container   memory    -    -    256Mi            1Gi            -

3.3 网络隔离与访问控制

配置网络隔离与访问控制:

# 为租户创建网络策略
$ cat > tenant-a-networkpolicy.yaml << EOF
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: tenant-a-networkpolicy
  namespace: tenant-a
spec:
  podSelector:
    matchLabels: {}
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - podSelector:
        matchLabels: {}
    - namespaceSelector:
        matchLabels:
          name: tenant-a
  egress:
  - to:
    - podSelector:
        matchLabels: {}
    - namespaceSelector:
        matchLabels:
          name: tenant-a
    - namespaceSelector:
        matchLabels:
          name: kube-system
    ports:
    - protocol: TCP
      port: 53
    - protocol: UDP
      port: 53
EOF

$ kubectl apply -f tenant-a-networkpolicy.yaml

# 为其他租户创建网络策略
$ sed 's/tenant-a/tenant-b/g' tenant-a-networkpolicy.yaml | kubectl apply -f -
$ sed 's/tenant-a/tenant-c/g' tenant-a-networkpolicy.yaml | kubectl apply -f -

# 为命名空间添加标签
$ kubectl label namespace tenant-a name=tenant-a
$ kubectl label namespace tenant-b name=tenant-b
$ kubectl label namespace tenant-c name=tenant-c
$ kubectl label namespace kube-system name=kube-system

# 查看网络策略
$ kubectl get networkpolicies -n tenant-a

# 查看命名空间标签
$ kubectl get namespaces --show-labels

执行结果:

# 查看网络策略
$ kubectl get networkpolicies -n tenant-a
NAME                     POD-SELECTOR   AGE
tenant-a-networkpolicy   <none>         5m

# 查看命名空间标签
$ kubectl get namespaces --show-labels
NAME              STATUS   AGE   LABELS
default           Active   1d    kubernetes.io/metadata.name=default
kube-system       Active   1d    kubernetes.io/metadata.name=kube-system, name=kube-system
kube-public       Active   1d    kubernetes.io/metadata.name=kube-public
kube-node-lease   Active   1d    kubernetes.io/metadata.name=kube-node-lease
tenant-a          Active   5m    kubernetes.io/metadata.name=tenant-a, name=tenant-a
tenant-b          Active   5m    kubernetes.io/metadata.name=tenant-b, name=tenant-b
tenant-c          Active   5m    kubernetes.io/metadata.name=tenant-c, name=tenant-c

Part04-生产案例与实战讲解

4.1 企业多租户管理案例

企业内部多租户管理配置:

# 创建开发、测试、生产环境命名空间
$ kubectl create namespace dev
$ kubectl create namespace test
$ kubectl create namespace prod

# 为不同环境创建资源配额
$ cat > dev-resourcequota.yaml << EOF
apiVersion: v1
kind: ResourceQuota
metadata:
  name: dev-quota
  namespace: dev
spec:
  hard:
    requests.cpu: "2"
    requests.memory: "4Gi"
    limits.cpu: "4"
    limits.memory: "8Gi"
    pods: "30"
    services: "10"
EOF

$ kubectl apply -f dev-resourcequota.yaml

$ cat > test-resourcequota.yaml << EOF
apiVersion: v1
kind: ResourceQuota
metadata:
  name: test-quota
  namespace: test
spec:
  hard:
    requests.cpu: "4"
    requests.memory: "8Gi"
    limits.cpu: "8"
    limits.memory: "16Gi"
    pods: "50"
    services: "20"
EOF

$ kubectl apply -f test-resourcequota.yaml

$ cat > prod-resourcequota.yaml << EOF
apiVersion: v1
kind: ResourceQuota
metadata:
  name: prod-quota
  namespace: prod
spec:
  hard:
    requests.cpu: "8"
    requests.学习交流加群风哥QQ113257174memory: "16Gi"
    limits.cpu: "16"
    limits.memory: "32Gi"
    pods: "100"
    services: "30"
EOF

$ kubectl apply -f prod-resourcequota.yaml

# 为不同环境创建网络策略
$ cat > dev-networkpolicy.yaml << EOF
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: dev-networkpolicy
  namespace: dev
spec:
  podSelector:
    matchLabels: {}
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - podSelector:
        matchLabels: {}
  egress:
  - to:
    - podSelector:
        matchLabels: {}
    - namespaceSelector:
        matchLabels:
          name: kube-system
EOF

$ kubectl apply -f dev-networkpolicy.yaml

$ cat > test-networkpolicy.yaml << EOF
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-networkpolicy
  namespace: test
spec:
  podSelector:
    matchLabels: {}
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - podSelector:
        matchLabels: {}
  egress:
  - to:
    - podSelector:
        matchLabels: {}
    - namespaceSelector:
        matchLabels:
          name: kube-system
EOF

$ kubectl apply -f test-networkpolicy.yaml

$ cat > prod-networkpolicy.yaml << EOF
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: prod-networkpolicy
  namespace: prod
spec:
  podSelector:
    matchLabels: {}
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - podSelector:
        matchLabels: {}
    - namespaceSelector:
        matchLabels:
          name: dev
  egress:
  - to:
    - podSelector:
        matchLabels: {}
    - namespaceSelector:
        matchLabels:
          name: kube-system
EOF

$ kubectl apply -f prod-networkpolicy.yaml

# 为命名空间添加标签
$ kubectl label namespace dev name=dev
$ kubectl label namespace test name=test
$ kubectl label namespace prod name=prod

执行结果:

# 查看命名空间
$ kubectl get namespaces
NAME              STATUS   AGE
default           Active   1d
kube-system       Active   1d
kube-public       Active   1d
kube-node-lease   Active   1d
dev               Active   10m
test              Active   10m
prod              Active   10m

# 查看资源配额
$ kubectl get resourcequotas -n dev
NAME        AGE   REQUEST                                     LIMIT
dev-quota   5m    requests.学习交流加群风哥微信: itpux-comcpu: 0/2, requests.memory: 0/4Gi   limits.cpu: 0/4, limits.memory: 0/8Gi, pods: 0/30, services: 0/10

$ kubectl get resourcequotas -n test
NAME         AGE   REQUEST                                     LIMIT
test-quota   5m    requests.cpu: 0/4, requests.memory: 0/8Gi   limits.cpu:更多学习教程公众号风哥教程itpux_com 0/8, limits.memory: 0/16Gi, pods: 0/50, services: 0/20

$ kubectl get resourcequotas -n prod
NAME         AGE   REQUEST                                      LIMIT
prod-quota   5m    requests.cpu: 0/8, requests.memory: 0/16Gi   limits.cpu: 0/16, limits.memory: 0/32Gi, pods: 0/100, services: 0/30

# 查看网络策略
$ kubectl get networkpolicies -n dev
NAME                POD-SELECTOR   AGE
dev-networkpolicy   <none>         5m

$ kubectl get networkpolicies -n test
NAME                 POD-SELECTOR   AGE
test-networkpolicy   <none>         5m

$ kubectl get networkpolicies -n prod
NAME                 POD-SELECTOR   AGE
prod-networkpolicy   <none>         5m

4.2 云服务提供商多租户案例

云服务提供商多租户管理配置:

# 创建客户命名空间
$ kubectl create namespace customer-1
$ kubectl create namespace customer-2
$ kubectl create namespace customer-3

# 为客户创建资源配额
$ cat > customer-1-resourcequota.yaml << EOF
apiVersion: v1
kind: ResourceQuota
metadata:
  name: customer-1-quota
  namespace: customer-1
spec:
  hard:
    requests.cpu: "8"
    requests.memory: "16Gi"
    limits.cpu: "16"
    limits.memory: "32Gi"
    pods: "100"
    services: "30"
    persistentvolumeclaims: "20"
EOF

$ kubectl apply -f customer-1-resourcequota.yaml

$ sed 's/customer-1/customer-2/g' customer-1-resourcequota.yaml | kubectl apply -f -
$ sed 's/customer-1/customer-3/g' customer-1-resourcequota.yaml | kubectl apply -f -

# 为客户创建网络策略
$ cat > customer-1-networkpolicy.yaml << EOF
apiVersion: networking.k8s.更多视频教程www.fgedu.net.cnio/v1
kind: NetworkPolicy
metadata:
  name: customer-1-networkpolicy
  namespace: customer-1
spec:
  podSelector:
    matchLabels: {}
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - podSelector:
        matchLabels: {}
    - ipBlock:
        cidr: 192.168.1.0/24
  egress:
  - to:
    - podSelector:
        matchLabels: {}
    - namespaceSelector:
        matchLabels:
          name: kube-system
    - ipBlock:
        cidr: 0.0.0.0/0
EOF

$ kubectl apply -f customer-1-networkpolicy.yaml

$ sed 's/customer-1/customer-2/g' customer-1-networkpolicy.yaml | kubectl apply -f -
$ sed 's/customer-1/customer-3/g' customer-1-networkpolicy.yaml | kubectl apply -f -

# 为客户创建存储类
$ cat > customer-storageclass.yaml << EOF
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: customer-storage
provisioner: kubernetes.io/aws-ebs
parameters:
  type: gp3
reclaimPolicy: Retain
allowVolumeExpansion: true
volumeBindingMode: WaitForFirstConsumer
EOF

$ kubectl apply -f customer-storageclass.yaml

# 为客户创建PVC
$ cat > customer-1-pvc.yaml << EOF
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: customer-1-pvc
  namespace: customer-1
spec:
  storageClassName: customer-storage
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 50Gi
EOF

$ kubectl apply -f customer-1-pvc.yaml

$ sed 's/customer-1/customer-2/g' customer-1-pvc.yaml | kubectl apply -f -
$ sed 's/customer-1/customer-3/g' customer-1-pvc.yaml | kubectl apply -f -

# 为命名空间添加标签
$ kubectl label namespace customer-1 name=customer-1
$ kubectl label namespace customer-2 name=customer-2
$ kubectl label namespace customer-3 name=customer-3

执行结果:

# 查看客户命名空间
$ kubectl get namespaces
NAME              STATUS   AGE
default           Active   1d
kube-system       Active   1d
kube-public       Active   1d
kube-node-lease   Active   1d
customer-1        Active   10m
customer-2        Active   10m
customer-3        Active   10m

# 查看客户资源配额
$ kubectl get resourcequotas -n customer-1
NAME                AGE   REQUEST                                      LIMIT
customer-1-quota    5m    requests.cpu: 0/8, requests.memory: 0/16Gi   limits.cpu: 0/16, limits.memory: 0/32Gi, pods: 0/100, services: 0/30, persistentvolumeclaims: 0/20

# 查看客户PVC
$ kubectl get pvc -n customer-1
NAME             STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS        AGE
customer-1-pvc   Bound    pvc-abcdef12-3456-7890-abcd-ef1234567890   50Gi       RWO            customer-storage    5m

# 查看存储类
$ kubectl get storageclass
NAME              PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
customer-storage   kubernetes.io/aws-ebs   Retain          WaitForFirstConsumer   true                   5m

4.3 大规模集群多租户实践

大规模Kubernetes集群的多租户实践:

# 部署多租户管理工具
$ helm repo add kubesphere https://charts.kubesphere.io/main
$ helm install kubesphere kubesphere/kubesphere --namespace kubesphere-system --create-namespace

# 配置多租户资源管理
$ cat > tenant-management.yaml << EOF
apiVersion: tenant.kubesphere.io/v1alpha1
kind: Tenant
metadata:
  name: tenant-1
spec:
  owner:
    name: admin
    kind: User
  quota:
    cpu:
      request: 16
      limit: 32
    memory:
      request: 32Gi
      limit: 64Gi
    pods: 200
    services: 50
    persistentvolumeclaims: 40
---
apiVersion: tenant.kubesphere.io/v1alpha1
kind: Tenant
metadata:
  name: tenant-2
spec:
  owner:
    name: admin
    kind: User
  quota:
    cpu:
      request: 8
      limit: 16
    memory:
      request: 16Gi
      limit: 32Gi
    pods: 100
    services: 30
    persistentvolumeclaims: 20
EOF

$ kubectl apply -f tenant-management.yaml

# 部署监控与计费系统
$ helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
$ helm install prometheus prometheus-community/kube-prometheus-stack --namespace monitoring --create-namespace

# 配置租户监控
$ cat > tenant-monitoring.yaml << EOF
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: tenant-monitor
  namespace: monitoring
spec:
  selector:
    matchLabels:
      app: tenant-monitor
  endpoints:
  - port: metrics
    interval: 15s
EOF

$ kubectl apply -f tenant-monitoring.yaml

# 查看多租户状态
$ kubectl get tenants

# 查看租户资源使用情况
$ kubectl top pods --all-namespaces

执行结果:

# 查看多租户状态
$ kubectl get tenants
NAME       AGE
tenant-1   10m
tenant-2   10m

# 查看租户资源使用情况
$ kubectl top pods --all-namespaces
NAMESPACE     NAME                                  CPU(cores)   MEMORY(bytes)
default       webapp-12345                         100m         256Mi
default       webapp-67890                         100m         256Mi
tenant-1      app-1                                 200m         512Mi
tenant-1      app-2                                 200m         512Mi
tenant-2      app-3                                 100m         256Mi
kube-system   kube-proxy-node1                    50m          128Mi
kube-system   kube-proxy-node2                    50m          128Mi
kube-system   kube-proxy-node3                    50m          128Mi
monitoring    prometheus-prometheus-node-exporter   30m          64Mi
monitoring    prometheus-grafana                    100m         256Mi

# 查看集群资源使用情况
$ kubectl top nodes
NAME     CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
node1    1000m        25%    4Gi            50%
node2    800m         20%    3Gi            37.5%
node3    600m         15%    2Gi            25%

Part05-风哥经验总结与分享

在大规模Kubernetes集群的多租户资源隔离与管理实践中,我总结了以下经验:

5.1 多租户管理最佳实践

  • 合理的命名空间设计:根据组织架构和业务需求设计清晰的命名空间结构
  • 细粒度的资源配额:为每个租户设置合理的资源配额,确保资源公平分配
  • 严格的网络隔离:使用NetworkPolicy限制租户间的网络通信,提高安全性
  • 完善的权限管理:使用RBAC为租户提供最小必要的权限
  • 定期的资源审计:定期审计租户的资源使用情况,优化资源分配

5.2 常见问题与解决方案

  • 资源争用:解决方案:设置合理的资源配额和限制,使用优先级和抢占机制
  • 安全隔离不足:解决方案:加强网络隔离,使用PodSecurityPolicy和Seccomp
  • 管理复杂性:解决方案:使用多租户管理工具,如KubeSphere、OpenShift等
  • 计费困难:解决方案:部署监控和计费系统,准确记录租户的资源使用情况
  • 性能影响:解决方案:使用节点亲和性和污点,将不同租户的工作负载分布到不同节点

5.3 性能优化建议

  • 节点分组:根据租户的性能需求,将节点分为不同的节点池
  • 资源预留:为系统组件和关键租户预留足够的资源
  • 自动扩缩容:为租户的工作负载配置自动扩缩容,提高资源利用率
  • 存储优化:为不同租户提供适合的存储方案,优化存储性能
  • 网络优化:使用高性能的网络插件,优化租户间的网络通信

5.4 未来发展趋势

  • 智能化多租户管理:使用AI和机器学习技术,自动优化租户的资源分配
  • 服务网格集成:与服务网格结合,提供更细粒度的流量控制和安全策略
  • 多集群多租户:跨多个集群的统一多租户管理
  • 边缘计算多租户:在边缘计算场景中实现多租户管理
  • Serverless集成:与Serverless架构结合,提供更灵活的多租户方案

风哥提示:多租户管理是一个复杂的系统工程,需要根据实际需求和场景进行灵活配置和优化。

from Linux:www.itpux.com

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

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

微信号:itpux-com

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