精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

亚洲av成人片色在线观看高潮| 久久另类ts人妖一区二区| 国产免费嫩草影院| 国产日韩中文在线中文字幕| 亚洲一区二区三区四区在线 | 成人美女免费网站视频| 久久精品视频免费在线观看| 日韩成人一级| 在线综合视频播放| www.com毛片| 黄色小网站在线观看| 粉嫩一区二区三区在线看| 欧美刺激性大交免费视频| 欧美视频国产视频| 免费成人在线电影| 亚洲欧美国产三级| 精品国产乱码久久久久久108| 日韩欧美大片在线观看| 水蜜桃久久夜色精品一区| 欧美色视频在线| 少妇高潮喷水在线观看| 快射视频在线观看| 中文一区二区完整视频在线观看| 国产精品高清在线观看| 精品处破女学生| 欧洲亚洲成人| 日韩免费电影一区| 中文字幕日韩综合| 蜜桃视频成人m3u8| 欧美性色xo影院| 无码熟妇人妻av在线电影| 伊人免费在线| 国产欧美综合在线观看第十页| 国产精品高清免费在线观看| 久久狠狠高潮亚洲精品| 欧美日韩三级| 精品偷拍一区二区三区在线看| 日韩一级免费在线观看| ririsao久久精品一区| 91网址在线看| 久久大片网站| 嫩草影院一区二区| 丁香一区二区三区| 99久久久精品免费观看国产| 黄色免费av网站| 亚洲精品乱码| 韩日欧美一区二区| 亚洲欧美在线视频免费| 中文日韩欧美| 清纯唯美日韩制服另类| 欧产日产国产69| 久久久久免费| 国产精品高潮呻吟久久av无限| 麻豆91精品91久久久| 在线中文字幕第一区| 久久精品一本久久99精品| 国产精品三级在线观看无码| 欧美深夜视频| 亚洲欧美国产精品久久久久久久| 99中文字幕在线| 国产精品美女久久久久人| 51午夜精品国产| 中国男女全黄大片| 最新日韩一区| 欧美日韩国产电影| 人妻换人妻仑乱| 国产成人福利av| 亚洲精品二三区| 欧美熟妇精品黑人巨大一二三区| 欧美专区一区| 亚洲国产欧美一区二区三区同亚洲 | 一级日本在线| 久久亚洲二区三区| 999热视频在线观看| www久久久com| 99久久免费国产| 色噜噜一区二区| 色老头视频在线观看| 日韩一区在线播放| 男人添女荫道口女人有什么感觉| 欧美被日视频| 中文字幕av一区 二区| 色撸撸在线观看| a'aaa级片在线观看| 亚洲激情自拍偷拍| 青青草原成人网| 日本久久一区| 亚洲国产日韩一区| 调教驯服丰满美艳麻麻在线视频| 亚洲资源网站| 日韩毛片视频| 欧美一级理论片| 欧美一级片黄色| 日本欧美肥老太交大片| 欧美日本高清视频| 国产免费a视频| 国内精品自线一区二区三区视频| 国产精品视频男人的天堂| 国产成人精品一区二三区四区五区 | 高清精品xnxxcom| 尤物99国产成人精品视频 | 91原创在线视频| 精品乱子伦一区二区三区| av男人的天堂在线| 国产精品乱人伦中文| 日本a在线天堂| 中文另类视频| 亚洲激情自拍图| 亚洲最大免费视频| 亚洲啊v在线观看| 日本久久久久久久久久久| 区一区二在线观看| 国产白丝精品91爽爽久久 | 男人日女人视频网站| av资源一区| 色偷偷一区二区三区| 日本少妇xxx| 日韩一级毛片| 国产91精品最新在线播放| 不卡视频免费在线观看| 国产精品美女久久久久av爽李琼| 资源网第一页久久久| 在线天堂新版最新版在线8| 色综合久久久久综合体桃花网| 毛片av免费在线观看| 素人一区二区三区| 亚洲免费av片| www.国产成人| 懂色av中文一区二区三区| 久久久7777| av丝袜在线| 精品久久久久久久久久久久久久久| 性色av蜜臀av色欲av| 色狮一区二区三区四区视频| 国产精品99一区| 青梅竹马是消防员在线| 婷婷中文字幕综合| 国产午夜在线一区二区三区| 在线观看日韩| 91黄色国产视频| 动漫一区在线| 91精品国产综合久久婷婷香蕉| 亚洲天堂av网站| 精品电影一区| 91精品国产综合久久久久久久久| 亚洲va欧美va| 亚洲制服丝袜av| 天天操天天爽天天射| 国产精品视频一区二区三区四蜜臂| 久久香蕉国产线看观看网| 在线观看国产小视频| 国产91精品精华液一区二区三区| 久久影视中文粉嫩av| 国产直播在线| 亚洲美女福利视频网站| 日本特级黄色片| 国产欧美一区二区三区在线老狼| 丁香婷婷综合激情| 国产成人高清精品免费5388| 7777免费精品视频| 暖暖视频在线免费观看| 91久久精品一区二区| 丰满的亚洲女人毛茸茸| 经典三级在线一区| 菠萝蜜视频在线观看入口| 欧美日韩免费观看视频| 中文字幕一区电影| 狠狠人妻久久久久久| 国产91精品一区二区| 777精品久无码人妻蜜桃| 蜜乳av综合| 国产精品一区二区久久精品| 成人在线视频亚洲| 亚洲精品乱码久久久久久金桔影视 | 一区二区三区四区不卡在线 | 懂色一区二区三区免费观看| 中文字幕在线中文字幕日亚韩一区 | 色偷偷中文字幕| 亚洲激情综合| 日韩中文一区| 一本色道69色精品综合久久| 538国产精品一区二区免费视频| www.97超碰| 欧美日韩亚洲一区二区三区| 国产亚洲精品精品精品| 国产麻豆成人精品| 亚洲色精品三区二区一区| 四虎成人精品永久免费av九九| 国产成一区二区| 超碰电影在线播放| 亚洲精品自产拍| 国产精品无码天天爽视频| 亚洲图片欧美一区| 中文字幕精品亚洲| 99视频有精品| 亚洲欧美日韩三级| 国产日韩1区| 9l视频自拍9l视频自拍| 视频福利一区| 91精品天堂| 99热播精品免费| 91禁外国网站| 可以直接在线观看的av| 欧美成人女星排行榜| 在线免费观看av片| 欧美日韩亚洲精品内裤| 免费中文字幕视频| 不卡电影免费在线播放一区| 少妇一级淫免费播放| 亚洲日本免费| 无颜之月在线看| 91亚洲国产| 欧美日韩精品中文字幕一区二区| 色综合天天色| 91av视频在线| 欧洲中文在线| 久久精品视频一| 成人午夜电影在线观看| 精品视频久久久| 嫩草影院一区二区| 欧美成人午夜电影| 在线观看污污网站| 亚洲第一主播视频| 欧美激情视频二区| 久久综合狠狠综合久久综合88| 日本中文字幕高清| 久久一区亚洲| 欧美三级午夜理伦三级| 亚洲精品欧美| 精品视频在线观看一区| 国产综合久久久| 玛丽玛丽电影原版免费观看1977| 成人国产一区| 国产精品海角社区在线观看| 小视频免费在线观看| 亚州国产精品久久久| 国产视频精品久久| 亚洲视频在线免费观看| 猫咪在线永久网站| 亚洲男人天堂古典| 国产99视频在线| 91精品国产综合久久久久| 97人妻精品一区二区三区软件| 亚洲一区二区在线视频| 日韩a级片在线观看| 综合久久久久久久| 国产精品夜夜夜爽阿娇| 亚洲桃色在线一区| 午夜少妇久久久久久久久| 亚洲免费在线视频| 欧美日韩一级大片| 日本一区二区三区四区在线视频 | 亚洲欧美一二三区| 91国产免费观看| 中文在线免费看视频| 欧美精品在线一区二区三区| 欧美一区二区三区四| 欧美视频在线免费看| 国产99免费视频| 欧美视频一区二| 国产伦理吴梦梦伦理| 在线观看国产91| 日韩毛片在线视频| 欧美性猛交xxxx富婆| 黄色小视频在线免费看| 午夜视频一区在线观看| 看黄色录像一级片| 亚洲伊人色欲综合网| 99精品在线播放| 欧美情侣在线播放| 亚洲av无码一区二区三区性色 | 婷婷亚洲成人| 日本不卡高清视频一区| 欧美超碰在线| 男人添女荫道口女人有什么感觉| 久久精品免费一区二区三区| 日本一区免费| 91精品精品| 男人添女人下面高潮视频| 日本系列欧美系列| 精产国品一二三区| 91免费看片在线观看| 欧美h片在线观看| 亚洲成人综合网站| 中文字幕一区二区三区四区免费看| 色综合色狠狠综合色| 这里只有精品6| 精品国产亚洲在线| 蜜桃久久一区二区三区| 一区二区三区久久精品| 亚洲wwwww| 国产精品久久久久久久久久久久久| 我爱我色成人网| 91精品国产91久久久久青草| 亚洲宅男网av| 国产精品自拍合集| 美腿丝袜在线亚洲一区| 亚州av综合色区无码一区| 中文字幕精品一区二区三区精品| 懂色av蜜桃av| 午夜精品免费在线观看| 中文字幕视频一区二区| 亚洲黄色在线观看| www.在线视频| 国产精品主播视频| 开心久久婷婷综合中文字幕| 国产在线资源一区| 欧美日韩ab| 亚洲精品www.| 久久久久久一级片| 国产在线视频99| 7777精品伊人久久久大香线蕉完整版 | 亚洲精品国产精品国自产观看浪潮| 婷婷色在线视频| 精品国模在线视频| 污影院在线观看| 国产精品午夜一区二区欲梦| 欧美在线关看| 欧美日韩福利在线| 韩国v欧美v日本v亚洲v| 一级特黄曰皮片视频| 色综合久久久久久久久久久| 中文字幕 日韩有码| 亚洲欧洲黄色网| 欧美激情护士| 精品国产一区二区三| 黄色日韩精品| 国产成人精品综合久久久久99| 91免费观看在线| 国产黄色片免费看| 亚洲变态欧美另类捆绑| 牛牛在线精品视频| 成人3d动漫一区二区三区91| 婷婷丁香综合| 日本中文字幕影院| 中文字幕一区二区三区四区| 国产亚洲欧美精品久久久久久| 91豆麻精品91久久久久久| 日本一区高清| 青青久久av北条麻妃海外网| 亚洲亚洲免费| 91激情视频在线| 欧美激情一区二区三区全黄| 日本三级一区二区三区| 国产亚洲成av人片在线观看桃| 操你啦视频在线| 91久久极品少妇xxxxⅹ软件| 国产精品一在线观看| 国产情侣av自拍| 中文字幕av免费专区久久| 亚洲在线视频播放| 日韩一级黄色av| 欧美成人a交片免费看| 日本精品一区二区三区不卡无字幕| 一区二区在线影院| 中文字幕乱妇无码av在线| 亚洲国产欧美日韩另类综合| 色一情一乱一乱一区91av| 97视频在线观看播放| 中文字幕av一区二区三区人| aaaaaa亚洲| 亚洲欧洲三级电影| 天堂网一区二区| 色偷偷av亚洲男人的天堂| 久久久久久久久成人| 久久这里只有精品8| zzijzzij亚洲日本少妇熟睡| 九九热精品视频在线| 一本色道久久88综合亚洲精品ⅰ| 僵尸再翻生在线观看| 日本一区视频在线观看| 蓝色福利精品导航| 免费网站看av| 亚洲老头同性xxxxx| 精品亚洲a∨| www.日本在线视频| 国产欧美日韩中文久久| 国产伦精品一区二区三区四区 | 1stkiss在线漫画| 国产精品一区二区免费看| 欧美女激情福利| 少妇精品一区二区三区| 欧美日本一区二区在线观看| 欧美hdxxx| 日本一区二区三区视频在线观看 | 性色av浪潮av| 日韩欧美精品中文字幕| 麻豆网站在线| 久久久久久一区| 国产精品1区2区| 国产精品午夜一区二区| 久久91亚洲精品中文字幕奶水| 国产va免费精品观看精品| 免费看毛片的网址| 国产精品乱码一区二三区小蝌蚪| 久草热在线观看| 久久久久成人精品| 日韩精品一区二区久久| 欧美xxxxx精品| 黑人精品xxx一区一二区|