精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

K8s中明明配置了HPA,但是沒擴容

人工智能
最令人興奮的是,這種測試時計算可能展現出與預訓練相似的擴展規律 —— 換言之,就像增加訓練計算量能帶來模型能力的指數級提升一樣,若在推理階段分配更多計算資源(延長思考時間),模型性能理論上也會出現可預測的指數級增長。

Kubernetes 的 Horizontal Pod Autoscaler(HPA)是一種根據觀察到的 CPU 利用率或其他自定義指標自動擴展 Pod 副本數的控制器。它在業務繁忙的時候可以有效的對 Pod 進行橫線擴展,但是最近發現明明使用率已經超過了定義的目標值,但是為何沒有擴容呢?

9906771bea31d64adb2a89a2f2b88207 MD59906771bea31d64adb2a89a2f2b88207 MD5

為了搞清楚原由,我們從源碼層面來找找原因。

一、HPA 的整體架構與核心組件

HPA 的實現位于 Kubernetes 的 k8s.io/kubernetes/pkg/controller/podautoscaler 目錄下,主要由以下幾個組件構成:

  • HorizontalController:主控制器,負責監聽 HPA 和 Pod 資源,協調擴縮容。
  • ReplicaCalculator:計算目標副本數的核心邏輯。
  • MetricsClient:獲取指標數據(如 CPU、內存、自定義指標)。
  • ScaleClient:用于修改工作負載(如 Deployment、ReplicaSet)的副本數。

二、源碼入口:HPA 控制器的啟動

HPA 控制器在cmd/kube-controller-manager 啟動時被初始化。

在 cmd/kube-controller-manager/controllermanager.go 中的 Run() 調用 NewControllerDescriptors() 中將控制器注冊。

func NewControllerDescriptors() map[string]*ControllerDescriptor {
 ...
 register(newHorizontalPodAutoscalerControllerDescriptor())
 ...
}

然后在 cmd/kube-controller-manager/autoscaling.go 里面最終通過 startHPAControllerWithMetricsClient() 來啟動。

func newHorizontalPodAutoscalerControllerDescriptor() *ControllerDescriptor {
 return &ControllerDescriptor{
  name:     names.HorizontalPodAutoscalerController,
  aliases:  []string{"horizontalpodautoscaling"},
  initFunc: startHorizontalPodAutoscalerControllerWithRESTClient,
 }
}

func startHorizontalPodAutoscalerControllerWithRESTClient(ctx context.Context, controllerContext ControllerContext, controllerName string) (controller.Interface, bool, error) {

 ...
 return startHPAControllerWithMetricsClient(ctx, controllerContext, metricsClient)
}

func startHPAControllerWithMetricsClient(ctx context.Context, controllerContext ControllerContext, metricsClient metrics.MetricsClient) (controller.Interface, bool, error) {

 ...

 go podautoscaler.NewHorizontalController(
  ctx,
  hpaClient.CoreV1(),
  scaleClient,
  hpaClient.AutoscalingV2(),
  controllerContext.RESTMapper,
  metricsClient,
  controllerContext.InformerFactory.Autoscaling().V2().HorizontalPodAutoscalers(),
  controllerContext.InformerFactory.Core().V1().Pods(),
  controllerContext.ComponentConfig.HPAController.HorizontalPodAutoscalerSyncPeriod.Duration,
  controllerContext.ComponentConfig.HPAController.HorizontalPodAutoscalerDownscaleStabilizationWindow.Duration,
  controllerContext.ComponentConfig.HPAController.HorizontalPodAutoscalerTolerance,
  controllerContext.ComponentConfig.HPAController.HorizontalPodAutoscalerCPUInitializationPeriod.Duration,
  controllerContext.ComponentConfig.HPAController.HorizontalPodAutoscalerInitialReadinessDelay.Duration,
 ).Run(ctx, int(controllerContext.ComponentConfig.HPAController.ConcurrentHorizontalPodAutoscalerSyncs))
 return nil, true, nil
}

三、控制器核心邏輯

控制器的核心實現邏輯的代碼位于 k8s.io/kubernetes/pkg/controller/podautoscaler 中,其調用鏈路為:

Run() -> worker() -> processNextWorkItem() -> reconcileKey() -> reconcileAutoscaler()

其中主要的邏輯在 reconcileAutoscaler 中實現。

(1)使用 a.monitor.ObserveReconciliationResult(actionLabel, errorLabel, time.Since(start)) 記錄協調過程中的監控指標。

(2)使用 hpaShared.DeepCopy() 和 hpa.Status.DeepCopy() 對 hpa 和 hpaStaus 對象進行深度拷貝,避免修改共享緩存。

(3)然后對資源進行解析并實現資源映射。

// API版本解析
targetGV, err := schema.ParseGroupVersion(hpa.Spec.ScaleTargetRef.APIVersion)

// REST映射獲取
mappings, err := a.mapper.RESTMappings(targetGK)

// 獲取Scale子資源
scale, targetGR, err := a.scaleForResourceMappings(ctx, hpa.Namespace, hpa.Spec.ScaleTargetRef.Name, mappings)

其中:

  • schema.ParseGroupVersion : 解析目標資源的API版本
  • a.mapper.RESTMappings : 獲取資源的REST映射信息
  • a.scaleForResourceMappings : 獲取目標資源的Scale子資源

(4)對指標進行核心計算獲取期望副本

// 計算基于指標的期望副本數
metricDesiredReplicas, metricName, metricStatuses, metricTimestamp, err = a.computeReplicasForMetrics(ctx, hpa, scale, hpa.Spec.Metrics)

(5)根據是否配置了 Behavior 選擇不通的標準化策略

// 根據是否配置了Behavior選擇不同的標準化策略
if hpa.Spec.Behavior == nil {
    desiredReplicas = a.normalizeDesiredReplicas(hpa, key, currentReplicas, desiredReplicas, minReplicas)
} else {
    desiredReplicas = a.normalizeDesiredReplicasWithBehaviors(hpa, key, currentReplicas, desiredReplicas, minReplicas)
}

(6)對于滿足擴縮容要求的進行擴縮容操作

// 重試機制更新Scale子資源
err := retry.RetryOnConflict(retry.DefaultRetry, func() error {
    scale.Spec.Replicas = desiredReplicas
    _, updateErr := a.scaleNamespacer.Scales(hpa.Namespace).Update(ctx, targetGR, scale, metav1.UpdateOptions{})
    // ... 沖突處理邏輯
})

這里使用 retry.RetryOnConflict 處理并發沖突的重試機制。實際上對目標資源的更新操作是調用 a.scaleNamespacer.Scales().Update 實現。

(7)最后更新狀態和事件記錄

// 設置HPA狀態條件
setCondition(hpa, autoscalingv2.AbleToScale, v1.ConditionTrue, "SucceededRescale", "...")

// 記錄事件
a.eventRecorder.Eventf(hpa, v1.EventTypeNormal, "SuccessfulRescale", "New size: %d; reason: %s", desiredReplicas, rescaleReason)

// 存儲擴縮容事件(用于Behavior計算)
a.storeScaleEvent(hpa.Spec.Behavior, key, currentReplicas, desiredReplicas)

// 更新HPA狀態
a.setStatus(hpa, currentReplicas, desiredReplicas, metricStatuses, rescale)
err = a.updateStatusIfNeeded(ctx, hpaStatusOriginal, hpa)

以上就是 reconcileAutoscaler 這個方法中的主要流程。其中最核心的地方在于副本數計算,它是在 computeReplicasForMetrics 中實現。

四、核心算法

現在我們對 computeReplicasForMetrics 方法進行解析,看看具體是怎么實現的。

(1)進行前置驗證和初始化

// 解析 HPA 選擇器,確保能夠正確識別目標 Pod
selector, err := a.validateAndParseSelector(hpa, scale.Status.Selector)
if err != nil {
    return -1, "", nil, time.Time{}, err
}

// 獲取目標資源的副本數信息
specReplicas := scale.Spec.Replicas      // 期望副本數
statusReplicas := scale.Status.Replicas  // 當前副本數

// 初始化指標狀態列表
statuses = make([]autoscalingv2.MetricStatus, len(metricSpecs))

// 無效指標
invalidMetricsCount := 0
var invalidMetricError error
var invalidMetricCondition autoscalingv2.HorizontalPodAutoscalerCondition

(2)對指標進行循環計算

for i, metricSpec := range metricSpecs {
    // 為每個指標計算建議副本數
    replicaCountProposal, metricNameProposal, timestampProposal, condition, err := a.computeReplicasForMetric(ctx, hpa, metricSpec, specReplicas, statusReplicas, selector, &statuses[i])
    
    if err != nil {
        // 記錄第一個無效指標的錯誤信息
        if invalidMetricsCount <= 0 {
            invalidMetricCondition = condition
            invalidMetricError = err
        }
        invalidMetricsCount++
        continue
    }
    
    // 采用最大值策略選擇副本數
    if replicas == 0 || replicaCountProposal > replicas {
        timestamp = timestampProposal
        replicas = replicaCountProposal
        metric = metricNameProposal
    }
}

這里調用 replicaCountProposal, metricNameProposal, timestampProposal, condition, err := a.computeReplicasForMetric(ctx, hpa, metricSpec, specReplicas, statusReplicas, selector, &statuses[i]) 對每個指標進行計算。

在 computeReplicasForMetric 會根據不通的指標類型進行計算。

switch spec.Type {
case autoscalingv2.ObjectMetricSourceType:
    // 對象指標處理
case autoscalingv2.PodsMetricSourceType:
    // Pod指標處理
case autoscalingv2.ResourceMetricSourceType:
    // 資源指標處理
case autoscalingv2.ContainerResourceMetricSourceType:
    // 容器資源指標處理
case autoscalingv2.ExternalMetricSourceType:
    // 外部指標處理
default:
    // 未知指標類型錯誤處理
}

這里我們只拿對象指標 autoscalingv2.ObjectMetricSourceType 進行說明。如果類型是對象指標,則會調用 a.computeStatusForObjectMetric 來進行計算。

在 computeStatusForObjectMetric 中會先初始化指標狀態,用于記錄指標的當前狀態。

// 初始化指標狀態,用于記錄指標的當前狀態
metricStatus := autoscalingv2.MetricStatus{
    Type: autoscalingv2.ObjectMetricSourceType,
    Object: &autoscalingv2.ObjectMetricStatus{
        DescribedObject: metricSpec.Object.DescribedObject,
        Metric: autoscalingv2.MetricIdentifier{
            Name:     metricSpec.Object.Metric.Name,
            Selector: metricSpec.Object.Metric.Selector,
        },
    },
}

然后調用 a.tolerancesForHpa(hpa) 獲取當前對象的容忍度,在 tolerancesForHpa 中的代碼實現如下:

func (a *HorizontalController) tolerancesForHpa(hpa *autoscalingv2.HorizontalPodAutoscaler) Tolerances {
    // 初始化默認容忍度
 t := Tolerances{a.tolerance, a.tolerance}
 // 查看特性門控是否開啟
 behavior := hpa.Spec.Behavior
 allowConfigurableTolerances := utilfeature.DefaultFeatureGate.Enabled(features.HPAConfigurableTolerance)
 // 如果特性門控未啟用,則直接返回默認值
 if behavior == nil || !allowConfigurableTolerances {
  return t
 }
 // 如果自定義了容忍度,則返回自定義的容忍度
 if behavior.ScaleDown != nil && behavior.ScaleDown.Tolerance != nil {
  t.scaleDown = behavior.ScaleDown.Tolerance.AsApproximateFloat64()
 }
 if behavior.ScaleUp != nil && behavior.ScaleUp.Tolerance != nil {
  t.scaleUp = behavior.ScaleUp.Tolerance.AsApproximateFloat64()
 }
 return t
}

默認容忍度在 pkg\controller\podautoscaler\config\v1alpha1\defaults.go 中定義,默認是 0.1,也就是 10% 的容忍度。

if obj.HorizontalPodAutoscalerTolerance == 0 {
    obj.HorizontalPodAutoscalerTolerance = 0.1
}

獲取到容忍度之后,會分別就 絕對值目標 和 平均值目標 進行計算。

if metricSpec.Object.Target.Type == autoscalingv2.ValueMetricType && metricSpec.Object.Target.Value != nil {
// 計算絕對值目標的副本數
replicaCountProposal, usageProposal, timestampProposal, err := a.replicaCalc.GetObjectMetricReplicas()
...
} else if metricSpec.Object.Target.Type == autoscalingv2.AverageValueMetricType && metricSpec.Object.Target.AverageValue != nil {
// 計算平均值目標的副本數
replicaCountProposal, usageProposal, timestampProposal, err := a.replicaCalc.GetObjectPerPodMetricReplicas()
...
}

在計算 絕對值 目標的副本數中,使用 usageRatio := float64(usage) / float64(targetUsage) 來計算使用率,然后通過replicaCountFloat := usageRatio * float64(readyPodCount) 獲取期望的副本數,如果副本數不是整數,則會向上取整。

// GetObjectMetricReplicas

func (c *ReplicaCalculator) GetObjectMetricReplicas(currentReplicas int32, targetUsage int64, metricName string, tolerances Tolerances, namespace string, objectRef *autoscaling.CrossVersionObjectReference, selector labels.Selector, metricSelector labels.Selector) (replicaCount int32, usage int64, timestamp time.Time, err error) {
 // 獲取當前的指標值
 usage, _, err = c.metricsClient.GetObjectMetric(metricName, namespace, objectRef, metricSelector)
 if err != nil {
  return 0, 0, time.Time{}, fmt.Errorf("unable to get metric %s: %v on %s %s/%s", metricName, objectRef.Kind, namespace, objectRef.Name, err)
 }
 // 計算使用率
 usageRatio := float64(usage) / float64(targetUsage)
 // 計算期望的副本數
 replicaCount, timestamp, err = c.getUsageRatioReplicaCount(currentReplicas, usageRatio, tolerances, namespace, selector)
 return replicaCount, usage, timestamp, err
}

func (c *ReplicaCalculator) getUsageRatioReplicaCount(currentReplicas int32, usageRatio float64, tolerances Tolerances, namespace string, selector labels.Selector) (replicaCount int32, timestamp time.Time, err error) {
 // 當當前副本數不為0的時候
 if currentReplicas != 0 {
  // 檢查使用率比例是否在容忍度中,如果在容忍度內,直接返回當前副本數
  if tolerances.isWithin(usageRatio) {
   return currentReplicas, timestamp, nil
  }
  // 獲取就緒的Pod
  readyPodCount := int64(0)
  readyPodCount, err = c.getReadyPodsCount(namespace, selector)
  if err != nil {
   return 0, time.Time{}, fmt.Errorf("unable to calculate ready pods: %s", err)
  }
  // 計算期望的副本數
  replicaCountFloat := usageRatio * float64(readyPodCount)
  // 檢查副本數是否超過最大int32值
  if replicaCountFloat > math.MaxInt32 {
   replicaCount = math.MaxInt32
  } else {
   // 向上取整
   replicaCount = int32(math.Ceil(replicaCountFloat))
  }
 } else {
  // 當當前副本數為0的時候,直接使用使用率計算,向上取整
  replicaCount = int32(math.Ceil(usageRatio))
 }

 return replicaCount, timestamp, err
}

在處理 平均值 目標的副本數中,是采用 usageRatio := float64(usage) / (float64(targetAverageUsage) * float64(replicaCount)) 來計算使用率,也就是 使用率 = 實際指標值 / (目標平均值 × 當前副本數)。當使用率超出容忍范圍,則采用 math.Ceil(實際指標值 / 目標平均值) 重新計算副本數,否則副本數不變。

func (c *ReplicaCalculator) GetObjectPerPodMetricReplicas(statusReplicas int32, targetAverageUsage int64, metricName string, tolerances Tolerances, namespace string, objectRef *autoscaling.CrossVersionObjectReference, metricSelector labels.Selector) (replicaCount int32, usage int64, timestamp time.Time, err error) {
 // 獲取當前的指標值
 usage, timestamp, err = c.metricsClient.GetObjectMetric(metricName, namespace, objectRef, metricSelector)
 if err != nil {
  return 0, 0, time.Time{}, fmt.Errorf("unable to get metric %s: %v on %s %s/%s", metricName, objectRef.Kind, namespace, objectRef.Name, err)
 }

 // 初始化副本數為當前副本數
 replicaCount = statusReplicas
 // 計算使用率
 usageRatio := float64(usage) / (float64(targetAverageUsage) * float64(replicaCount))
 if !tolerances.isWithin(usageRatio) {
  // 重新計算副本數
  replicaCount = int32(math.Ceil(float64(usage) / float64(targetAverageUsage)))
 }
 // 計算平均使用量
 usage = int64(math.Ceil(float64(usage) / float64(statusReplicas)))
 return replicaCount, usage, timestamp, nil
}

(3)如果指標無效則返回錯誤,否則返回期望副本數

// 如果所有指標都無效或部分指標無效且會導致縮容,則返回錯誤
if invalidMetricsCount >= len(metricSpecs) || (invalidMetricsCount > 0 && replicas < specReplicas) {
    setCondition(hpa, invalidMetricCondition.Type, invalidMetricCondition.Status, 
        invalidMetricCondition.Reason, "%s", invalidMetricCondition.Message)
    return -1, "", statuses, time.Time{}, invalidMetricError
}

// 設置伸縮活躍狀態
setCondition(hpa, autoscalingv2.ScalingActive, v1.ConditionTrue, "ValidMetricFound", 
    "the HPA was able to successfully calculate a replica count from %s", metric)

// 返回期望副本數
return replicas, metric, statuses, timestamp, invalidMetricError

這里的 容忍度 可以解釋為何指標達到了87%,但是未觸發擴容。

在上面我們介紹了默認的容忍度是 0.1 ,也就是 10%,也就是當前使用率在目標值的 ±10% 范圍內,不會觸發擴縮容。 我們可以使用容忍度的比較方法 (1.0-t.scaleDown) <= usageRatio && usageRatio <= (1.0+t.scaleUp) 來進行計算。

// 使用率
usageRatio = 實際值 / 目標值 = 87% / 80% = 1.0875
// 默認容忍度為 0.1,則容忍度范圍為 [0.9,1.1]
// 0.9 ≤ 1.0875 ≤ 1.1
// 所以目標值在容忍度范圍內,不會觸發擴容

五、約束機制

HPA 的擴縮容也不是無限制的,為了避免頻繁的擴縮容,除了容忍度之外,還增加了許多約束條件。

其主要在 a.normalizeDesiredReplicas 或 a.normalizeDesiredReplicasWithBehaviors 中進行實現。這兩個實現的區別在于:

  • normalizeDesiredReplicas是基礎的標準化處理,而 normalizeDesiredReplicasWithBehaviors是高級的行為策略處理
  • 要使用 normalizeDesiredReplicasWithBehaviors,則需要配置 hpa.Spec.Behavior,比如:
behavior:
  scaleUp:
    policies:
    - type: Percent
      value: 100
      periodSeconds: 15
  scaleDown:
    policies:
    - type: Percent
      value: 100
      periodSeconds: 300

下面,我們在 normalizeDesiredReplicas 中進行說明,源代碼如下:

func (a *HorizontalController) normalizeDesiredReplicas(hpa *autoscalingv2.HorizontalPodAutoscaler, key string, currentReplicas int32, prenormalizedDesiredReplicas int32, minReplicas int32) int32 {
 // 對推薦副本數進行穩定性處理
 stabilizedRecommendation := a.stabilizeRecommendation(key, prenormalizedDesiredReplicas)
 // 如果穩定化推薦值和原始值不同,則發生了穩定化變化,需要設置相應的狀態條件來反映當前的擴縮容能力
 if stabilizedRecommendation != prenormalizedDesiredReplicas {
  setCondition(hpa, autoscalingv2.AbleToScale, v1.ConditionTrue, "ScaleDownStabilized", "recent recommendations were higher than current one, applying the highest recent recommendation")
 } else {
  setCondition(hpa, autoscalingv2.AbleToScale, v1.ConditionTrue, "ReadyForNewScale", "recommended size matches current size")
 }

 // 應用規則,確保最終副本數在 [minReplicas, maxReplicas] 范圍內
 desiredReplicas, reason, message := convertDesiredReplicasWithRules(currentReplicas, stabilizedRecommendation, minReplicas, hpa.Spec.MaxReplicas)

 // 如果最終副本數與穩定化推薦值相同,說明沒有受到限制
 // 如果不同,說明受到了某種限制(如最小/最大副本數限制、擴容速率限制等)
 if desiredReplicas == stabilizedRecommendation {
  setCondition(hpa, autoscalingv2.ScalingLimited, v1.ConditionFalse, reason, "%s", message)
 } else {
  setCondition(hpa, autoscalingv2.ScalingLimited, v1.ConditionTrue, reason, "%s", message)
 }

 return desiredReplicas
}

在 convertDesiredReplicasWithRules 中通過 calculateScaleUpLimit 來計算擴容限制。

func calculateScaleUpLimit(currentReplicas int32) int32 {
    return int32(math.Max(scaleUpLimitFactor*float64(currentReplicas), scaleUpLimitMinimum))
}

其中:

  • scaleUpLimitFactor = 2.0 (擴容因子)
  • scaleUpLimitMinimum = 4.0 (最小擴容限制)

其計算邏輯是:

  • 擴容限制 = max(當前副本數 × 2, 4)
  • 例如:當前2個副本,擴容限制為max(2×2, 4) = 4
  • 例如:當前10個副本,擴容限制為max(10×2, 4) = 20

假設當前副本數為5,HPA配置最小2個、最大20個:

  1. 期望副本數為1 :返回2(最小限制),條件"TooFewReplicas"
  2. 期望副本數為8 :返回8(在范圍內),條件"DesiredWithinRange"
  3. 期望副本數為15 :
  • 擴容限制 = max(5×2, 4) = 10
  • 返回10(擴容限制),條件"ScaleUpLimit"
  1. 期望副本數為25 :
  • 擴容限制 = max(5×2, 4) = 10
  • 返回10(擴容限制),條件"ScaleUpLimit"

這個函數是HPA安全擴縮容機制的重要組成部分,確保擴縮容操作既滿足業務需求又不會造成系統不穩定。

六、最后

上面我們通過源碼了解 HPA 的工作機制,了解到為何 HPA 的目標值設置為 80%,但是實際使用達到 87% 而沒觸發擴容。

其直接原因是 容忍度 導致的,但是在其他常見也可能因為 冷卻窗口 影響擴容,甚至還可能是指標采集延遲導致指標不準確等各種因素。如果要用好 HPA,我們應該:

  1. 監控 HPA 狀態:使用 kubectl describe hpa 查看 Conditions 和 Current Metrics
  2. 合理設置目標值:避免設置過高的目標利用率(如 >75%)
  3. 啟用 Behavior 配置:精細化控制擴縮容節奏
  4. 結合日志與事件:關注 ScalingActiveScalingLimited 等狀態變化
責任編輯:武曉燕 來源: 運維開發故事
相關推薦

2023-02-08 07:55:33

K8sHPA服務器

2023-08-04 08:19:02

2022-04-22 13:32:01

K8s容器引擎架構

2023-11-06 07:16:22

WasmK8s模塊

2025-01-07 14:36:12

2022-09-07 09:22:36

SpringBootWeb

2025-11-12 11:52:20

2023-09-06 08:12:04

k8s云原生

2022-09-15 08:04:54

k8skubernetes

2021-08-05 07:28:26

K8sNFS ProvisiSubdir

2025-11-12 01:22:00

2024-09-26 18:04:02

2022-02-07 08:42:28

k8sdocker命令

2025-04-09 07:58:15

2020-05-12 10:20:39

K8s kubernetes中間件

2022-09-05 08:26:29

Kubernetes標簽

2023-08-03 08:36:30

Service服務架構

2023-05-25 21:38:30

2024-07-15 18:20:18

2020-07-17 08:40:47

K8SServicePOD
點贊
收藏

51CTO技術棧公眾號

亚洲夜晚福利在线观看| 五月激情综合色| 99久久99久久| 特级西西444www大精品视频免费看| 国产aⅴ精品一区二区三区久久| 在线看不卡av| www.国产二区| 国产美女性感在线观看懂色av| 老司机一区二区| 国产综合在线视频| 超碰人人人人人人人| 99久久婷婷国产综合精品青牛牛| 色综合天天综合网国产成人综合天 | 日韩一区二区av| 国产人妻精品午夜福利免费| av资源在线| 日韩一区日韩二区| 狼狼综合久久久久综合网| 国产精品国产三级国产普通话对白| 99视频精品| 久久av中文字幕| 一区二区三区在线观看免费视频| 黄色免费大全亚洲| 538在线一区二区精品国产| 久久网站免费视频| 日本一本在线免费福利| 国产精品久久久久婷婷| 久久综合九色综合久99| 精品久久国产视频| 老司机免费视频一区二区| 欧美亚洲在线观看| 久草视频免费播放| 911久久香蕉国产线看观看| 亚洲人成五月天| 国产精品福利导航| 亚洲1区在线| 欧美疯狂做受xxxx富婆| 欧美日韩亚洲一二三| 精精国产xxxx视频在线播放| 亚洲综合成人在线视频| 一区国产精品| 中文字幕日本在线| 欧美国产成人精品| 日本亚洲欧洲精品| 好男人免费精品视频| 99riav一区二区三区| 超碰国产精品久久国产精品99| 国产一区二区在线不卡| 美女视频第一区二区三区免费观看网站 | 久久久久久蜜桃一区二区| 激情黄产视频在线免费观看| 亚洲视频香蕉人妖| 久久av秘一区二区三区| 日本不卡不卡| 亚洲三级免费观看| 免费的av在线| 欧美巨大xxxx做受沙滩| 亚洲最新视频在线观看| 无码人妻少妇伦在线电影| 蜜桃传媒在线观看免费进入 | 日韩 国产 欧美| 亚洲欧美视频| 国产精品劲爆视频| 亚洲图片视频小说| 国产一区在线看| 91在线视频成人| 精品国产一级片| 成人av电影免费在线播放| 激情视频在线观看一区二区三区| 水莓100国产免费av在线播放| 97精品视频在线观看自产线路二| 免费毛片一区二区三区久久久| 久热av在线| 国产精品嫩草久久久久| 国产一二三四五| xxxx成人| 日本道色综合久久| 久久久久xxxx| 国产伦精品一区二区三区免费优势| 亚洲电影第1页| 中文字幕人妻一区二区| 日韩欧美一区二区三区免费看| 久久精品福利视频| 日本少妇吞精囗交| 蜜桃精品视频在线| 91av免费看| 深夜福利在线观看直播| 国产精品无圣光一区二区| 中国女人做爰视频| 欧美黑人巨大xxxxx| 欧美肥胖老妇做爰| 亚洲av人人澡人人爽人人夜夜| 亚洲视频分类| 久久不射电影网| 天天操天天操天天操天天| 蜜臀久久99精品久久久久久9| 91久久极品少妇xxxxⅹ软件| 亚洲 欧美 精品| 中文字幕在线一区二区三区| 97在线国产视频| 日本精品网站| 精品1区2区在线观看| 级毛片内射视频| 欧美暴力喷水在线| 国产福利精品av综合导导航| 国产成人a人亚洲精品无码| 2024国产精品视频| 青青草原国产免费| 日韩不卡免费高清视频| 日韩美女视频在线| 超碰97av在线| 99国产精品| 亚洲最大福利网| 国产一二在线观看| 亚洲妇熟xx妇色黄| 91精产国品一二三产区别沈先生| 日韩大胆成人| 欧美成人精品在线播放| 中文字幕日日夜夜| 91免费观看国产| 久久香蕉视频网站| a屁视频一区二区三区四区| 亚洲国产天堂久久综合| 欧美激情图片小说| 久久99久国产精品黄毛片色诱| 久久精品日产第一区二区三区| 自由的xxxx在线视频| 欧美日韩亚洲高清一区二区| av小说在线观看| 亚洲一区二区成人| 精品乱子伦一区二区三区| 四虎影视国产在线视频| 欧美久久久一区| 成人免费视频入口| 日本不卡视频在线| 日韩av大全| 国产另类xxxxhd高清| 日韩av有码在线| 国产 日韩 欧美 成人| 国产精品自产自拍| 亚洲天堂第一区| 日韩免费精品| 欧美激情在线观看视频| 99热这里只有精品9| 成人免费在线视频观看| 少妇一级淫免费播放| 成人激情在线| 国产日韩精品视频| 欧美日韩在线看片| 69堂亚洲精品首页| 亚洲欧美小视频| 国产精品1区2区| 丁香六月激情婷婷| 日韩激情啪啪| 日本午夜精品理论片a级appf发布| 午夜小视频免费| 日韩欧美亚洲成人| www.99热| 激情欧美日韩一区二区| 国产一二三四五| 国产精品中文字幕制服诱惑| 欧美中文字幕在线| 福利视频在线播放| 欧美欧美欧美欧美| 久久国产精品波多野结衣| 国产成人aaa| 六月丁香激情网| 精品国精品国产自在久国产应用| 国产精品视频在线播放| 免费av不卡| 亚洲第一天堂无码专区| 波多野结衣爱爱| 中文字幕中文字幕一区| 成人做爰69片免费| 小嫩嫩精品导航| 五月天婷亚洲天综合网鲁鲁鲁| 成人激情久久| 8x拔播拔播x8国产精品| 成人影院免费观看| 欧美一区中文字幕| 在线能看的av| 中文字幕一区二区视频| 亚洲一级Av无码毛片久久精品| 亚洲欧美日韩国产一区| 亚洲一区高清| 久久久久影视| 91精品国产综合久久香蕉| bl在线肉h视频大尺度| 亚洲一区999| 囯产精品久久久久久| 在线观看国产91| 免费无遮挡无码永久在线观看视频 | 91九色鹿精品国产综合久久香蕉| 欧美肥老妇视频| 国产鲁鲁视频在线观看免费| 91精品国产综合久久福利| 日韩av在线天堂| 1000精品久久久久久久久| 日本一卡二卡在线| 国产在线乱码一区二区三区| 成人综合视频在线| 欧美福利一区| 日韩女优中文字幕| 欧美日韩一区二区三区在线电影| 国产免费亚洲高清| 中文在线а√在线8| 欧美精品在线免费播放| 黄视频在线观看免费| 欧美成人一区二区三区片免费| 精品无码一区二区三区的天堂| 一区二区不卡在线视频 午夜欧美不卡在| xxx在线播放| 成人黄色一级视频| 韩国三级丰满少妇高潮| 热久久一区二区| 欧美日韩中文在线视频| 欧美日韩精品| 裸体裸乳免费看| 成人直播大秀| 免费看国产精品一二区视频| 国产精品午夜av| 成人黄色在线免费观看| 亚洲图片小说区| 国产精品情侣自拍| 成人啊v在线| 欧美专区在线播放| 黄色污网站在线观看| 欧美激情精品久久久| 99在线播放| 久久综合电影一区| 麻豆传媒在线完整视频| 中文字幕成人在线| 国产在线一在线二| 亚洲精品影视在线观看| 亚洲 欧美 激情 另类| 亚洲国模精品一区| 国内爆初菊对白视频| 日韩美一区二区三区| 国产suv精品一区二区69| 5858s免费视频成人| av男人天堂av| 日韩一区二区三区av| www.天堂在线| 欧美不卡在线视频| 亚洲AV无码一区二区三区性 | 日本一区二区三区在线播放| 三妻四妾完整版在线观看电视剧 | 伊人一区二区三区久久精品| 国产中文字幕在线观看| 国产一区二区三区直播精品电影| 国产小视频在线| 伊人久久男人天堂| 日本视频不卡| 久久国产精品久久久| 国内小视频在线看| 高清在线视频日韩欧美| 一根才成人网| 国产精品美女999| 日韩成人精品一区二区三区| 91精品免费视频| 亚洲2区在线| 欧美激情导航| 欧美中文一区二区| 精品一区二区成人免费视频| 欧美暴力喷水在线| www黄色日本| 日韩国产欧美视频| 午夜啪啪小视频| 成人高清av在线| 精品无码在线观看| 亚洲欧美日韩国产一区二区三区| 青娱乐国产盛宴| 色综合天天综合网天天看片| 亚洲图片在线播放| 精品三级在线看| 你懂的在线观看视频网站| 中文字幕在线看视频国产欧美在线看完整| 嫩草在线视频| 91chinesevideo永久地址| 91大神在线观看线路一区| 91亚洲国产成人精品性色| 精品午夜电影| 亚洲亚洲精品三区日韩精品在线视频 | 亚洲在线一区| wwww.国产| 成人av在线看| 国产精品suv一区二区88| 亚洲一区二区三区视频在线播放| 国产专区第一页| 欧美精品乱人伦久久久久久| 日日夜夜精品免费| 最近2019中文字幕大全第二页| 亚洲国产精品精华素| 国产99久久精品一区二区 夜夜躁日日躁| 91嫩草国产线观看亚洲一区二区 | 国产精品xxxxx| 亚洲一区二区三区中文字幕在线观看| 欧美成人一区二区在线| 一区二区三区四区日韩| 日韩精品一区二区三区不卡| 国产精品正在播放| 亚洲天堂久久新| 亚洲一本大道在线| 一卡二卡三卡在线观看| 亚洲精品永久免费| 欧美巨大xxxx做受沙滩| 国产欧美一区二区三区四区| 日韩精品福利一区二区三区| 青青草视频国产| 久久精品国产99| 日韩av在线看免费观看| 亚洲成人一区二区在线观看| 国产一区二区麻豆| 国产一区二区三区直播精品电影| 国产v日韩v欧美v| 97超碰在线播放| 91精品国产乱码久久久久久久| 50路60路老熟妇啪啪| jvid福利写真一区二区三区| 中文字幕另类日韩欧美亚洲嫩草| 欧美日韩国产一级| 成人性爱视频在线观看| 欧美在线一区二区三区四| 999在线精品| 亚洲熟妇无码av在线播放| 精品在线亚洲视频| 九九热久久免费视频| 日本精品免费观看高清观看| 色资源在线观看| 欧美有码在线观看| 六月丁香久久丫| 五月丁香综合缴情六月小说| 国产传媒一区在线| 中文字幕影音先锋| 日韩一级免费观看| 影院在线观看全集免费观看| 成人福利网站在线观看11| 久久香蕉国产| 亚洲免费黄色网| 成人免费在线视频观看| 国产欧美日韩综合精品一区二区三区| 日韩中文字在线| japansex久久高清精品| 色中文字幕在线观看| 国产主播一区二区| 波多野结衣亚洲一区二区| 日韩小视频在线观看专区| 丝袜美女在线观看| 国产精品视频一区二区三区经| 亚洲午夜在线| 亚洲欧美日韩偷拍| 欧美日韩性生活视频| 青青国产在线| 国产精品网址在线| 四虎成人精品永久免费av九九| 亚洲黄色av片| 亚洲一区在线电影| 天天操天天爱天天干| 日本中文字幕成人| 成人直播大秀| 杨幂一区二区国产精品| 亚洲国产日产av| 欧美偷拍视频| 国产免费亚洲高清| 亚洲最新色图| xxxx黄色片| 欧美亚洲综合另类| 操你啦视频在线| 国产私拍一区| 奇米色777欧美一区二区| 久久爱一区二区| 亚洲第一中文字幕在线观看| 无人区在线高清完整免费版 一区二| 天天综合色天天综合色hd| 国产资源在线一区| 成人在线免费看视频| 国产一区二区三区视频| 国产一区二区三区免费观看在线 | 欧美精品久久久久久久久46p| 日韩精品最新网址| 久久夜夜操妹子| 久久久成人精品一区二区三区| 99精品国产一区二区三区不卡| 狠狠躁夜夜躁人人爽视频| 欧美xxxx做受欧美.88| 欧美亚洲大陆| 在线看免费毛片| 黑人欧美xxxx| 国内外激情在线| 裸模一区二区三区免费| 国内一区二区视频| 亚洲黄色免费观看| 久久成人免费视频| 色综合综合网| 熟女人妻一区二区三区免费看| 在线免费观看日本一区| 后进极品白嫩翘臀在线播放| 日本一区二区三区免费观看| 国产激情视频一区二区三区欧美 | 日韩免费在线观看|