<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ## 1. 倉庫 `Helm` 的 `Repo` 倉庫和 `Docker Registry` 比較類似,Chart 庫可以用來存儲和共享打包 Chart 的位置,我們在安裝了 Helm 后,默認的倉庫地址是 google 的一個地址,這對于我們不能科學上網的同學就比較苦惱了,沒辦法訪問到官方提供的 Chart 倉庫,可以用`helm repo list`來查看當前的倉庫配置: ```bash $ helm repo list NAME URL stable https://kubernetes-charts.storage.googleapis.com/ local http://127.0.0.1:8879/charts ``` 我們可以看到除了一個默認的 `stable` 的倉庫配置外,還有一個 `local` 的本地倉庫,這是我們本地測試的一個倉庫地址。其實要創建一個 Chart 倉庫也是非常簡單的,Chart 倉庫其實就是一個帶有index.yaml索引文件和任意個打包的 Chart 的 HTTP 服務器而已,比如我們想要分享一個 Chart 包的時候,將我們本地的 Chart 包上傳到該服務器上面,別人就可以使用了,所以其實我們自己托管一個 Chart 倉庫也是非常簡單的,比如阿里云的 OSS、Github Pages,甚至自己創建的一個簡單服務器都可以。 為了解決科學上網的問題,我這里建了一個 Github Pages 倉庫,每天會自動和官方的倉庫進行同步,地址是:https://github.com/cnych/kube-charts-mirror,這樣我們就可以將我們的 Helm 默認倉庫地址更改成我們自己的倉庫地址了: ```bash $ helm repo remove stable "stable" has been removed from your repositories $ helm repo add stable https://cnych.github.io/kube-charts-mirror/ "stable" has been added to your repositories $ helm repo list NAME URL stable https://cnych.github.io/kube-charts-mirror/ local http://127.0.0.1:8879/charts $ helm repo update Hang tight while we grab the latest from your chart repositories... ...Skip local chart repository ...Successfully got an update from the "stable" chart repository Update Complete. ? Happy Helming!? ``` 倉庫添加完成后,可以使用 update 命令進行倉庫更新。當然如果要我們自己來創建一個 web 服務器來服務 `Helm Chart` 的話,只需要實現下面幾個功能點就可以提供服務了: - 將索引和Chart置于服務器目錄中 - 確保索引文件`index.yaml`可以在沒有認證要求的情況下訪問 - 確保 `yaml` 文件的正確內容類型(text/yaml 或 text/x-yaml) 如果你的 web 服務提供了上面幾個功能,那么也就可以當做 Helm Chart 倉庫來使用了。 ## 2. 查找 chart Helm 將 Charts 包安裝到 Kubernetes 集群中,一個安裝實例就是一個新的 Release,要找到新的 Chart,我們可以通過搜索命令完成。 > 記住,如果不能科學上網,將默認的 stable 的倉庫地址更換成上面我們創建的地址 直接運行`helm search`命令可以查看有哪些 Charts 是可用的: ```bash $ helm search NAME CHART VERSION APP VERSION DESCRIPTION ... stable/minio 1.6.3 RELEASE.2018-08-25T01-56-38Z Minio is a high performance distributed object storage se... stable/mission-control 0.4.2 3.1.2 A Helm chart for JFrog Mission Control stable/mongodb 4.2.2 4.0.2 NoSQL document-oriented database that stores JSON-like do... stable/mongodb-replicaset 3.5.6 3.6 NoSQL document-oriented database that stores JSON-like do... ... stable/zetcd 0.1.9 0.0.3 CoreOS zetcd Helm chart for Kubernetes ... ``` 如果沒有使用過濾條件,`helm search` 顯示所有可用的 `charts`。可以通過使用過濾條件進行搜索來縮小搜索的結果范圍: ```bash $ helm search mysql NAME CHART VERSION APP VERSION DESCRIPTION ... stable/mysql 0.10.1 5.7.14 Fast, reliable, scalable, and easy to use open-source rel... stable/mysqldump 0.1.0 5.7.21 A Helm chart to help backup MySQL databases using mysqldump stable/prometheus-mysql-exporter 0.1.0 v0.10.0 A Helm chart for prometheus stable/mariadb 4.4.0 10.1.35 Fast, reliable, scalable, and easy to use open-source rel... ... ``` 可以看到明顯少了很多 charts 了,同樣的,我們可以使用 inspect 命令來查看一個 chart 的詳細信息: ```bash $ helm inspect stable/mysql appVersion: 5.7.14 description: Fast, reliable, scalable, and easy to use open-source relational database system. engine: gotpl home: https://www.mysql.com/ icon: https://www.mysql.com/common/logos/logo-mysql-170x115.png keywords: - mysql - database - sql maintainers: - email: o.with@sportradar.com name: olemarkus - email: viglesias@google.com name: viglesiasce name: mysql sources: - https://github.com/kubernetes/charts - https://github.com/docker-library/mysql version: 0.10.1 --- ## mysql image version ## ref: https://hub.docker.com/r/library/mysql/tags/ ## image: "mysql" imageTag: "5.7.14" ... ``` 使用 `inspect` 命令可以查看到該 chart 里面所有描述信息,包括運行方式、配置信息等等。 通過 `helm search` 命令可以找到我們想要的 chart 包,找到后就可以通過 `helm install` 命令來進行安裝了。 ## 3. 安裝 chart 要安裝新的軟件包,直接使用 `helm install` 命令即可。最簡單的情況下,它只需要一個 chart 的名稱參數: ```bash $ helm install stable/mysql NAME: mewing-squid LAST DEPLOYED: Tue Sep 4 23:31:23 2018 NAMESPACE: default STATUS: DEPLOYED RESOURCES: ==> v1/PersistentVolumeClaim NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE mewing-squid-mysql Pending 1s ==> v1/Service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE mewing-squid-mysql ClusterIP 10.108.197.48 <none> 3306/TCP 1s ==> v1beta1/Deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE mewing-squid-mysql 1 0 0 0 1s ==> v1/Pod(related) NAME READY STATUS RESTARTS AGE mewing-squid-mysql-69f587bdf9-z7glv 0/1 Pending 0 0s ==> v1/Secret NAME TYPE DATA AGE mewing-squid-mysql Opaque 2 1s ==> v1/ConfigMap NAME DATA AGE mewing-squid-mysql-test 1 1s NOTES: MySQL can be accessed via port 3306 on the following DNS name from within your cluster: mewing-squid-mysql.default.svc.cluster.local To get your root password run: MYSQL_ROOT_PASSWORD=$(kubectl get secret --namespace default mewing-squid-mysql -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo) To connect to your database: 1. Run an Ubuntu pod that you can use as a client: kubectl run -i --tty ubuntu --image=ubuntu:16.04 --restart=Never -- bash -il 2. Install the mysql client: $ apt-get update && apt-get install mysql-client -y 3. Connect using the mysql cli, then provide your password: $ mysql -h mewing-squid-mysql -p To connect to your database directly from outside the K8s cluster: MYSQL_HOST=127.0.0.1 MYSQL_PORT=3306 # Execute the following command to route the connection: kubectl port-forward svc/mewing-squid-mysql 3306 mysql -h ${MYSQL_HOST} -P${MYSQL_PORT} -u root -p${MYSQL_ROOT_PASSWORD} ``` 現在 `mysql chart` 已經安裝上了,安裝 chart 會創建一個新 `release` 對象。上面的 `release` 被命名為 `hmewing-squid`。如果你想使用你自己的 `release` 名稱,只需使用`--name`參數指定即可,比如: ```bash $ helm install stable/mysql --name mydb ``` 在安裝過程中,helm 客戶端將打印有關創建哪些資源的有用信息,`release` 的狀態以及其他有用的配置信息,比如這里的有訪問 mysql 服務的方法、獲取 root 用戶的密碼以及連接 mysql 的方法等信息。 > 值得注意的是 Helm 并不會一直等到所有資源都運行才退出。因為很多 charts > 需要的鏡像資源非常大,所以可能需要很長時間才能安裝到集群中去。 要跟蹤 `release` 狀態或重新讀取配置信息,可以使用 `helm status` 查看: ```bash $ helm status mewing-squid LAST DEPLOYED: Tue Sep 4 23:31:23 2018 NAMESPACE: default STATUS: DEPLOYED RESOURCES: ... ``` 可以看到當前 `release` 的狀態是`DEPLOYED`,下面還有一些安裝的時候出現的信息。 ## 4. 自定義 chart 上面的安裝方式是使用 `chart` 的默認配置選項。但是在很多時候,我們都需要自定義 chart 以滿足自身的需求,要自定義 chart,我們就需要知道我們使用的 chart 支持的可配置選項才行。 要查看 chart 上可配置的選項,使用`helm inspect values`命令即可,比如我們這里查看上面的 mysql 的配置選項: ```bash $ helm inspect values stable/mysql ## mysql image version ## ref: https://hub.docker.com/r/library/mysql/tags/ ## image: "mysql" imageTag: "5.7.14" ## Specify password for root user ## ## Default: random 10 character string # mysqlRootPassword: testing ## Create a database user ## # mysqlUser: ## Default: random 10 character string # mysqlPassword: ## Allow unauthenticated access, uncomment to enable ## # mysqlAllowEmptyPassword: true ## Create a database ## # mysqlDatabase: ## Specify an imagePullPolicy (Required) ## It's recommended to change this to 'Always' if the image tag is 'latest' ## ref: http://kubernetes.io/docs/user-guide/images/#updating-images ## imagePullPolicy: IfNotPresent extraVolumes: | # - name: extras # emptyDir: {} extraVolumeMounts: | # - name: extras # mountPath: /usr/share/extras # readOnly: true extraInitContainers: | # - name: do-something # image: busybox # command: ['do', 'something'] # Optionally specify an array of imagePullSecrets. # Secrets must be manually created in the namespace. # ref: https://kubernetes.io/docs/concepts/containers/images/#specifying-imagepullsecrets-on-a-pod # imagePullSecrets: # - name: myRegistryKeySecretName ## Node selector ## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector nodeSelector: {} livenessProbe: initialDelaySeconds: 30 periodSeconds: 10 timeoutSeconds: 5 successThreshold: 1 failureThreshold: 3 readinessProbe: initialDelaySeconds: 5 periodSeconds: 10 timeoutSeconds: 1 successThreshold: 1 failureThreshold: 3 ## Persist data to a persistent volume persistence: enabled: true ## database data Persistent Volume Storage Class ## If defined, storageClassName: <storageClass> ## If set to "-", storageClassName: "", which disables dynamic provisioning ## If undefined (the default) or set to null, no storageClassName spec is ## set, choosing the default provisioner. (gp2 on AWS, standard on ## GKE, AWS & OpenStack) ## # storageClass: "-" accessMode: ReadWriteOnce size: 8Gi annotations: {} ## Configure resource requests and limits ## ref: http://kubernetes.io/docs/user-guide/compute-resources/ ## resources: requests: memory: 256Mi cpu: 100m # Custom mysql configuration files used to override default mysql settings configurationFiles: {} # mysql.cnf: |- # [mysqld] # skip-name-resolve # ssl-ca=/ssl/ca.pem # ssl-cert=/ssl/server-cert.pem # ssl-key=/ssl/server-key.pem # Custom mysql init SQL files used to initialize the database initializationFiles: {} # first-db.sql: |- # CREATE DATABASE IF NOT EXISTS first DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; # second-db.sql: |- # CREATE DATABASE IF NOT EXISTS second DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; metrics: enabled: false image: prom/mysqld-exporter imageTag: v0.10.0 imagePullPolicy: IfNotPresent resources: {} annotations: {} # prometheus.io/scrape: "true" # prometheus.io/port: "9104" livenessProbe: initialDelaySeconds: 15 timeoutSeconds: 5 readinessProbe: initialDelaySeconds: 5 timeoutSeconds: 1 ## Configure the service ## ref: http://kubernetes.io/docs/user-guide/services/ service: ## Specify a service type ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services---service-types type: ClusterIP port: 3306 # nodePort: 32000 ssl: enabled: false secret: mysql-ssl-certs certificates: # - name: mysql-ssl-certs # ca: |- # -----BEGIN CERTIFICATE----- # ... # -----END CERTIFICATE----- # cert: |- # -----BEGIN CERTIFICATE----- # ... # -----END CERTIFICATE----- # key: |- # -----BEGIN RSA PRIVATE KEY----- # ... # -----END RSA PRIVATE KEY----- ## Populates the 'TZ' system timezone environment variable ## ref: https://dev.mysql.com/doc/refman/5.7/en/time-zone-support.html ## ## Default: nil (mysql will use image's default timezone, normally UTC) ## Example: 'Australia/Sydney' # timezone: # To be added to the database server pod(s) podAnnotations: {} ``` 然后,我們可以直接在 YAML 格式的文件中來覆蓋上面的任何配置,在安裝的時候直接使用該配置文件即可:(config.yaml) ```bash mysqlUser: haimaxyUser mysqlDatabase: haimaxyDB service: type: NodePort ``` 我們這里通過 `config.yaml` 文件定義了 `mysqlUser` 和 `mysqlDatabase`,并且把 `service` 的類型更改為了 `NodePort`,然后現在我們來安裝的時候直接指定該 yaml 文件: ```bash $ helm install -f config.yaml stable/mysql --name mydb NAME: mydb LAST DEPLOYED: Wed Sep 5 00:09:44 2018 NAMESPACE: default STATUS: DEPLOYED RESOURCES: ==> v1/Secret NAME TYPE DATA AGE mydb-mysql Opaque 2 1s ==> v1/ConfigMap NAME DATA AGE mydb-mysql-test 1 1s ==> v1/PersistentVolumeClaim NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE mydb-mysql Pending 1s ==> v1/Service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE mydb-mysql NodePort 10.96.150.198 <none> 3306:32604/TCP 0s ==> v1beta1/Deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE mydb-mysql 1 1 1 0 0s ==> v1/Pod(related) NAME READY STATUS RESTARTS AGE mydb-mysql-dfc999888-hbw5d 0/1 Pending 0 0s ... ``` 我們可以看到當前 release 的名字已經變成 mydb 了。然后可以查看下 mydb 關聯的 Service 是否變成 NodePort 類型的了: ```bash $ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 110d mewing-squid-mysql ClusterIP 10.108.197.48 <none> 3306/TCP 46m mydb-mysql NodePort 10.96.150.198 <none> 3306:32604/TCP 8m ``` 看到服務 `mydb-mysql` 變成了 `NodePort` 類型的,二之前默認創建的 `mewing-squid-mysql` 是 `ClusterIP` 類型的,證明上面我們通過 YAML 文件來覆蓋 values 是成功的。 接下來我們查看下 Pod 的狀況: ```bash $ kubectl get pods NAME READY STATUS RESTARTS AGE mewing-squid-mysql-69f587bdf9-z7glv 0/1 Pending 0 49m mydb-mysql-dfc999888-hbw5d 0/1 Pending 0 11m ``` 比較奇怪的是之前默認創建的和現在的 `mydb` 的 `release` 創建的 Pod 都是 `Pending` 狀態,直接使用 `describe` 命令查看下: ```bash $ kubectl describe pod mydb-mysql-dfc999888-hbw5d Name: mydb-mysql-dfc999888-hbw5d Namespace: default Node: <none> Labels: app=mydb-mysql pod-template-hash=897555444 ... Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning FailedScheduling 2m (x37 over 12m) default-scheduler pod has unbound PersistentVolumeClaims (repeated 2 times) ``` 我們可以發現兩個 Pod 處于 `Pending` 狀態的原因都是 PVC 沒有被綁定上,所以這里我們可以通過 storageclass 或者手動創建一個合適的 PV 對象來解決這個問題。 另外為了說明 helm 更新的用法,我們這里來直接禁用掉數據持久化,可以在上面的 `config.yaml` 文件中設置: ```bash persistence: enabled: false ``` 另外一種方法就是在安裝過程中使用`--set`來覆蓋對應的 value 值,比如禁用數據持久化,我們這里可以這樣來覆蓋: ```bash $ helm install stable/mysql --set persistence.enabled=false --name mydb ``` ## 5. 升級 我們這里將數據持久化禁用掉來對上面的 mydb 進行升級: ```bash $ echo config.yaml mysqlUser: haimaxyUser mysqlDatabase: haimaxyDB service: type: NodePort persistence: enabled: false $ helm upgrade -f config.yaml mydb stable/mysql helm upgrade -f config.yaml mydb stable/mysql Release "mydb" has been upgraded. Happy Helming! LAST DEPLOYED: Wed Sep 5 00:38:33 2018 NAMESPACE: default STATUS: DEPLOYED RESOURCES: ... ``` 可以看到已經變成 `DEPLOYED` 狀態了,現在我們再去看看 Pod 的狀態呢: ```bash $ kubectl get pods NAME READY STATUS RESTARTS AGE mewing-squid-mysql-69f587bdf9-z7glv 0/1 Pending 0 1h mydb-mysql-6ffc84bbf6-lcn4d 0/1 PodInitializing 0 49s ... ``` 我們看到 mydb 關聯的 Pod 已經變成了 `PodInitializing` 的狀態,已經不是 `Pending` 狀態了,同樣的,使用 `describe` 命令查看: ```bash $ kubectl describe pod mydb-mysql-6ffc84bbf6-lcn4d Name: mydb-mysql-6ffc84bbf6-lcn4d Namespace: default Node: node02/10.151.30.63 Start Time: Wed, 05 Sep 2018 00:38:33 +0800 Labels: app=mydb-mysql pod-template-hash=2997406692 Annotations: <none> Status: Pending ... Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal SuccessfulMountVolume 58s kubelet, node02 MountVolume.SetUp succeeded for volume "data" Normal SuccessfulMountVolume 58s kubelet, node02 MountVolume.SetUp succeeded for volume "default-token-n9w2d" Normal Scheduled 57s default-scheduler Successfully assigned mydb-mysql-6ffc84bbf6-lcn4d to node02 Normal Pulling 57s kubelet, node02 pulling image "busybox:1.25.0" Normal Pulled 45s kubelet, node02 Successfully pulled image "busybox:1.25.0" Normal Created 44s kubelet, node02 Created container Normal Started 44s kubelet, node02 Started container Normal Pulling 41s kubelet, node02 pulling image "mysql:5.7.14" ``` 我們可以看到現在沒有任何關于 PVC 的錯誤信息了,這是因為我們剛剛更新的版本中就是禁用掉了的數據持久化的,證明 `helm upgrade` 和 `--values` 是生效了的。現在我們使用 `helm ls` 命令查看先當前的 `release`: ```bash $ helm ls NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE mewing-squid 1 Tue Sep 4 23:31:23 2018 DEPLOYED mysql-0.10.1 5.7.14 default mydb 2 Wed Sep 5 00:38:33 2018 DEPLOYED mysql-0.10.1 5.7.14 ``` 可以看到 mydb 這個 `release` 的REVISION已經變成2了,這是因為 release 的版本是遞增的,每次安裝、升級或者回滾,版本號都會加1,第一個版本號始終為1,同樣我們可以使用 `helm history` 命令查看 `release` 的歷史版本: ```bash $ helm history mydb REVISION UPDATED STATUS CHART DESCRIPTION 1 Wed Sep 5 00:09:44 2018 SUPERSEDED mysql-0.10.1 Install complete 2 Wed Sep 5 00:38:33 2018 DEPLOYED mysql-0.10.1 Upgrade complete ``` 當然如果我們要回滾到某一個版本的話,使用 helm rollback 命令即可,比如我們將 mydb 回滾到上一個版本: ```bash $ helm rollback mydb 1 ``` ## 6. 刪除 上節課我們就學習了要刪除一個 release 直接使用 `helm delete` 命令就 OK: ```bash $ helm delete mewing-squid release "mewing-squid" deleted ``` 這將從集群中刪除該 `release`,但是這并不代表就完全刪除了,我們還可以通過`--deleted`參數來顯示被刪除掉 release: ```bash $ helm list --deleted NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE mewing-squid 1 Tue Sep 4 23:31:23 2018 DELETED mysql-0.10.1 5.7.14 default $ helm list --all NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE mewing-squid 1 Tue Sep 4 23:31:23 2018 DELETED mysql-0.10.1 5.7.14 default mydb 2 Wed Sep 5 00:38:33 2018 DEPLOYED mysql-0.10.1 5.7.14 ``` `helm list --all`則會顯示所有的 `release`,包括已經被刪除的 由于 Helm 保留已刪除 release 的記錄,因此不能重新使用 release 名稱。(如果 確實 需要重新使用此 release 名稱,則可以使用此 `--replace` 參數,但它只會重用現有 release 并替換其資源。)這點是不是和 `docker container` 的管理比較類似 請注意,因為 release 以這種方式保存,所以可以回滾已刪除的資源并重新激活它。 如果要徹底刪除 release,則需要加上`--purge`參數: ```bash $ helm delete mewing-squid --purge release "mewing-squid" deleted ``` ## 7. 創建您自己的charts [charts開發指南](https://v2.helm.sh/docs/developing_charts/) ```bash $ helm create deis-workflow Creating deis-workflow ``` 現在有一個charts `./deis-workflow`。您可以編輯它并創建自己的模板。 在編輯charts時,您可以通過運行`helm lint .` 當需要打包charts以進行分發時,您可以運行以下 `helm package`命令: ```bash $ helm package deis-workflow deis-workflow-0.1.0.tgz ``` 現在可以通過`helm install`以下方式輕松安裝該charts: ```bash $ helm install ./deis-workflow-0.1.0.tgz ... ``` ## 一條命令安裝或升級版本 ```bash $ helm upgrade --install <release name> --values <values file> <chart directory> ``` --- ?<font color= #FF4500 size=4 style="font-family:Courier New">推薦閱讀:</font> - [陽明](https://www.qikqiak.com/k8s-book/docs/43.Helm%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8.html) - [官方文檔(含有更多細節)](https://v2.helm.sh/docs/using_helm/#initialize-helm-and-install-tiller) - [kubernetes 快速學習手冊](https://ghostwritten.blog.csdn.net/article/details/108562082) -----------
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看