91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》
  • 首頁 > 
  • 教程 > 
  • 互聯網科技 > 
  • Kubernetes 上安裝 EMQ X 系列文章之三 :使用 Helm 管理、部署 EMQ X 集群

Kubernetes 上安裝 EMQ X 系列文章之三 :使用 Helm 管理、部署 EMQ X 集群

發布時間:2020-08-11 11:10:17 來源:ITPUB博客 閱讀:275 作者:emqx 欄目:互聯網科技

Helm 介紹

Helm 是管理 Kubernetes 包的工具,Helm 能提供下面的能力:

  • 創建新的 charts
  • 將 charts 打包成 tgz 文件
  • 與 chart 倉庫交互
  • 安裝和卸載 Kubernetes 的應用
  • 管理使用 Helm 安裝的 charts 的生命周期

在 Helm 中,有三個需要了解的重要概念:

  • chart:是創建Kubernetes應用實例的信息集合;
  • config:創建發布對象的chart的配置信息
  • release:chart的運行實例,包含特定的config

Helm 組件

在 Helm 中有兩個主要的組件,既 Helm 客戶端和 Tiller 服務器

Helm 客戶端:這是一個供終端用戶使用的命令行工具,客戶端負責如下的工作:

  • 本地 chart 開發
  • 管理倉庫
  • 與 Tiller 服務器交互
    • 發送需要被安裝的 charts
    • 請求關于發布版本的信息
    • 請求更新或者卸載已安裝的發布版本

Tiller 服務器: Tiller 服務部署在 Kubernetes 集群中,Helm 客戶端通過與 Tiller 服務器進行交互,并最終與 Kubernetes API 服務器進行交互。 Tiller 服務器負責如下的工作:

  • 監聽來自于 Helm 客戶端的請求
  • 組合 chart 和配置來構建一個發布
  • 在 Kubernetes 中安裝,并跟蹤后續的發布
  • 通過與 Kubernetes 交互,更新或者 chart

客戶端負責管理 chart,服務器發展管理發布。

Helm技術實現

Helm 客戶端是使用 Go 語言編寫的,它通過 gRPC 協議與 Tiller 服務器交互。

Tiller 服務器也是使用 Go 語言編寫的,它使用 Kubernetes 客戶端類庫(當前是那個 REST+JSON )與 Kubernetes 進行通訊。

Tiller 服務器通過 Kubernetes 的 ConfigMap 存儲信息,因此本身沒有用于存儲數據庫。

Helm 安裝部署

安裝 Helm 客戶端

在進行 Helm 客戶端安裝前,請確認已有可用的 Kubernetes 集群環境,并已安裝了 kubectl

通過訪問: https://github.com/kubernetes/helm/releases。
下載 Helm 的合適的版本。

  1. 此文下載 helm-v2.8.0-linux-amd64.tgz 版本;
  2. 解壓縮文件: tar -zxvf helm-v2.8.0-linux-amd64.tgz
  3. 將解壓縮后的 helm 移至 /usr/local/bin 目錄下: mv linux-amd64/helm /usr/local/bin/helm

注意

  • 最好在安裝 kubectl命令行工具的機器上安裝Helm客戶端;或者將安裝 kubectl 命令行工具生成的配置文件( $HOME/.kube/config)復制到 Helm 客戶端所安裝的機器上( $HOME/.kube/config )。

安裝 Tiller 服務器

使用 Service Account 安裝

  1. 創建一個名為 tiller 的 Service Account

    $ kubectl create serviceaccount tiller --namespace kube-system
    
  2. 授予名為 tiller 的 Service Account 集群管理員角色 cluster-admin:

    • 將 tiller 綁定至集群管理員角色的的 yaml 文件如下所示:

      $vim rbac-config.yaml
      apiVersion: rbac.authorization.k8s.io/v1beta1 
      kind: ClusterRoleBinding 
      metadata: 
      name: tiller 
      roleRef: 
      apiGroup: rbac.authorization.k8s.io 
      kind: ClusterRole 
      name: cluster-admin 
      subjects: 
      - kind: ServiceAccount 
      name: tiller 
      namespace: kube-system
      
    • 通過執行 kubectl create -f將授予 tiller 集群管理員角色:

      $ kubectl create -f rbac-config.yaml
      
  3. 安裝 Tiller 服務器

    $ helm init --service-account tiller
    

驗證安裝

在安裝完成后,可以通過執行如下命令來檢查是安裝成功:

$ helm version

如果正確顯示 Helm 客戶端和 Tiller 服務器的版本,這表示安裝成功。

或者通過執行 kubectl 的如下命令來查看是否已正常按照 Tiller 服務器:

$ kubectl get pods -n kube-system

Helm 使用

常用命令

查看源

helm repo list    #列出所有源,當前還沒有添加源# 添加一個國內可以訪問的阿里源,不過好像最近不更新了helm repo add ali https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts  如果能連外網,可以加google,f8
helm repo add google https://kubernetes-charts.storage.googleapis.com helm repo add fabric8 https://fabric8.io/helm# 更新源helm repo update

查看 chart

# 查看chart,即已經通過helm部署到 k8s 平臺的應用helm list    或者  helm ls# 若要查看或搜索存儲庫中的 Helm charts,鍵入以下任一命令helm search 
helm search 存儲庫名稱 #如 stable 或 incubatorhelm search chart名稱 #如 wordpress 或 spark# 查看charm詳情helm inspect ali/wordpress

下載 chart

helm fetch ali/wordpress
[ubuntu@master1 ~]# ls wordpress-0.8.8.tgz wordpress-0.8.8.tgz

部署應用 wordpress, 通過 ali 源文件

$ helm install --name wordpress-test --set "persistence.enabled=false,mariadb.persistence.enabled=false" ali/wordpress
[ubuntu@master1 ~]# kubectl get pod NAME                                        READY     STATUS    RESTARTS   AGE
wordpress-test-mariadb-84b866bf95-7bx5w     1/1       Running   1          4h
wordpress-test-wordpress-5ff8c64b6c-hrh9q   1/1       Running   0          4h
[ubuntu@master1 ~]# kubectl get svc NAME                       TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
kubernetes                 ClusterIP      10.96.0.1        <none>        443/TCP                      2d
wordpress-test-mariadb     ClusterIP      10.105.71.95     <none>        3306/TCP                     4h
wordpress-test-wordpress   LoadBalancer   10.104.106.150   <pending>     80:30655/TCP,443:32121/TCP   4h

訪問 wordpress,使用 node 節點 ip + nodeport, 192.168.1.181:30655

刪除應用

[ubuntu@master1 ~]# helm listNAME            REVISION    UPDATED                     STATUS      CHART           NAMESPACEwordpress-test  1           Thu May 17 11:35:07 2018    DEPLOYED    wordpress-0.8.8 default  [ubuntu@master1 ~]# helm delete wordpress-testrelease "wordpress-test" deleted

建立自己的 chart

創建一個自己的chart,看下文檔結構,學習下如何使用

$ helm create emqx
Creating emqx
$ tree misa86
emqx
├── charts     #Chart本身的版本和配置信息├── Chart.yaml    #Chart本身的版本和配置信息├── templates    #配置模板目錄│   ├── deployment.yaml    #kubernetes Deployment object│   ├── _helpers.tpl    #用于修改kubernetes objcet配置的模板│   ├── ingress.yaml    #kubernetes Deployment object│   ├── NOTES.txt    #helm提示信息│   └── service.yaml    #kubernetes Serivce└── values.yaml    #kubernetes object configuration,定義變量

模板 template

template 下包含應用所有的 yaml 文件模板,應用資源的類型不僅限于 deployment 和 service 這些,k8s 支持的都可以。

$cat templates/deployment.yaml
apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: {{ include "emqx.fullname" . }}
  labels:
    app.kubernetes.io/name: {{ include "emqx.name" . }}
    helm.sh/chart: {{ include "emqx.chart" . }}
    app.kubernetes.io/instance: {{ .Release.Name }}
    app.kubernetes.io/managed-by: {{ .Release.Service }}
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app.kubernetes.io/name: {{ include "emqx.name" . }}
      app.kubernetes.io/instance: {{ .Release.Name }}
  template:
    metadata:
      labels:
        app.kubernetes.io/name: {{ include "emqx.name" . }}
        app.kubernetes.io/instance: {{ .Release.Name }}
    spec:
      containers:
        - name: {{ .Chart.Name }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          ports:
          - containerPort: 1883
          - containerPort: 8883
          - containerPort: 8080
          - containerPort: 8083
          - containerPort: 8084
          - containerPort: 18083
          env:
          - name: EMQX_NAME
            value: emqx
          - name: EMQX_CLUSTER__K8S__APP_NAME
            value: emqx
          - name: EMQX_CLUSTER__DISCOVERY
            value: k8s
          - name: EMQX_CLUSTER__K8S__SERVICE_NAME
            value: {{ include "emqx.fullname" . }}
          - name: EMQX_CLUSTER__K8S__APISERVER
            value: {{ .Values.env.kubeApiserver }}
          - name: EMQX_CLUSTER__K8S__NAMESPACE
            value: {{ .Values.env.kubeNamespace }}
          - name: EMQX_CLUSTER__K8S__ADDRESS_TYPE
            value: {{ .Values.env.kubeAddressType }}
          - name: EMQX_CLUSTER__K8S__APP_NAME
            value: emqx
          tty: true

這是該應用的 Deploymen t的 yaml 配置文件,其中的雙大括號包擴起來的部分是 Go template, template “emqx.name” 這類是在 _helpers.tpl 文件中定義的,如果不定義,將來文件名會是隨意字符加 chart 名字。

其中的 Values 是在 values.yaml 文件中定義的,應用主要的參數在這邊:

$ cat values.yaml# Default values for emqx.# This is a YAML-formatted file.# Declare variables to be passed into your templates.replicaCount: 2image:
  repository: emqx/emqx
  tag: latest
  pullPolicy: IfNotPresent
env:
  kubeApiserver: http://127.0.0.1:8080
  kubeNamespace: default
  kubeAddressType: ip
service:
  type: ClusterIP
  mqttPort: 1883
  mqttsslPort: 8883
  mgmtPort: 8080
  webscoketPort:8083
  wssPort:8084
  dashboardPort: 18083ingress:
  enabled: false
  annotations: {}    # kubernetes.io/ingress.class: nginx
    # kubernetes.io/tls-acme: "true"
  path: /
  hosts:
    - chart-example.local
  tls: []  #  - secretName: chart-example-tls
  #    hosts:
  #      - chart-example.local

比如在 Deployment.yaml 中定義的容器鏡像 image:

{{ .Values.image.repository }}:{{ .Values.image.tag }}

其中的:

.Values.image.repository就是emqx/emqx
.Values.image.tag就是latest

以上兩個變量值是在 install chart 的時候自動生成的默認值。

檢查配置和模板是否有效

當使用 kubernetes 部署應用的時候實際上將 templates 渲染成最終的 kubernetes 能夠識別的 yaml 格式。

使用 helm install --dry-run --debug <chart_dir>命令來驗證 chart 配置。該輸出中包含了模板的變量配置與最終渲染的 yaml 文件。 deployment service 的名字前半截由兩個隨機的單詞組成,隨機數加 chart 名。這名字也可以改成 value 方式,自己定義如果配置等有問題此處會報錯。

helm install --set env.kubeApiserver=http://172.31.31.241:8080 --dry-run --debug .[debug] Created tunnel using local port: '43251'[debug] SERVER: "127.0.0.1:43251"[debug] Original chart version: ""[debug] CHART PATH: /home/ubuntu/emqx-helm
NAME:   quelling-toad
REVISION: 1RELEASED: Tue Oct 30 08:18:09 2018CHART: emqx-helm-v1.0USER-SUPPLIED VALUES:
env:
  kubeApiserver: http://172.31.31.241:8080COMPUTED VALUES:
env:
  kubeAddressType: ip
  kubeApiserver: http://172.31.31.241:8080
  kubeNamespace: defaultimage:
  pullPolicy: IfNotPresent
  tag: latest
ingress:
  annotations: {}
  enabled: false
  hosts:
  - chart-example.local
  path: /
  tls: []
replicaCount: 2service:
  dashboardPort: 18083
  mappingPort: 4369
  mgmtPort: 8080
  mqttPort: 1883
  mqttsslPort: 8883
  type: ClusterIP
HOOKS:
MANIFEST:
---# Source: emqx-helm/templates/service.yamlapiVersion: v1
kind: Service
metadata:
  name: quelling-toad-emqx-helm
  labels:
    app.kubernetes.io/name: emqx-helm
    helm.sh/chart: emqx-helm-v1.0
    app.kubernetes.io/instance: quelling-toad
    app.kubernetes.io/managed-by: Tiller
spec:
  type: ClusterIP
  ports:
  - name: mqtt
    port: 1883
    protocol: TCP
    targetPort: 1883
  - name: mqttssl
    port: 8883
    protocol: TCP
    targetPort: 8883
  - name: mgmt
    port: 8080
    protocol: TCP
    targetPort: 8080
  - name: webscoket
    port: 8083
    protocol: TCP
    targetPort: 8083
  - name: wss
    port: 8084
    protocol: TCP
    targetPort: 8084
  - name: dashboard
    port: 18083
    protocol: TCP
    targetPort: 18083
  selector:
    app.kubernetes.io/name: emqx-helm
    app.kubernetes.io/instance: quelling-toad
---# Source: emqx-helm/templates/deployment.yamlapiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: quelling-toad-emqx-helm
  labels:
    app.kubernetes.io/name: emqx-helm
    helm.sh/chart: emqx-helm-v1.0
    app.kubernetes.io/instance: quelling-toad
    app.kubernetes.io/managed-by: Tiller
spec:
  replicas: 2
  selector:
    matchLabels:
      app.kubernetes.io/name: emqx-helm
      app.kubernetes.io/instance: quelling-toad
  template:
    metadata:
      labels:
        app.kubernetes.io/name: emqx-helm
        app.kubernetes.io/instance: quelling-toad
    spec:
      containers:
        - name: emqx-helm
          image: "emqx/emqx:latest"
          imagePullPolicy: IfNotPresent
          ports:
          - containerPort: 1883
          - containerPort: 8883
          - containerPort: 8080
          - containerPort: 8083
          - containerPort: 8084
          - containerPort: 18083
          env:
          - name: EMQX_NAME
            value: emqx
          - name: EMQX_CLUSTER__K8S__APP_NAME
            value: emqx
          - name: EMQX_CLUSTER__DISCOVERY
            value: k8s
          - name: EMQX_CLUSTER__K8S__SERVICE_NAME
            value: quelling-toad-emqx-helm
          - name: EMQX_CLUSTER__K8S__APISERVER
            value: http://172.31.31.241:8080
          - name: EMQX_CLUSTER__K8S__NAMESPACE
            value: default
          - name: EMQX_CLUSTER__K8S__ADDRESS_TYPE
            value: ip
          - name: EMQX_CLUSTER__K8S__APP_NAME
            value: emqx
          tty: true

部署到 kubernetes

在 EMQ X 目錄下執行下面的命令將應用部署到 kubernetes 集群上。

$ helm install --set env.kubeApiserver=http://172.31.31.241:8080 .NAME:   ugly-bumblebee
LAST DEPLOYED: Tue Oct 30 08:19:17 2018NAMESPACE: defaultSTATUS: DEPLOYED
RESOURCES:
==> v1/Service
NAME                      AGE
ugly-bumblebee-emqx-helm  0s
==> v1beta2/Deployment
ugly-bumblebee-emqx-helm  0s
==> v1/Pod(related)
NAME                                       READY  STATUS             RESTARTS  AGE
ugly-bumblebee-emqx-helm-5bc599849f-n4htc  0/1    ContainerCreating  0         0s
ugly-bumblebee-emqx-helm-5bc599849f-xwdn7  0/1    ContainerCreating  0         0s
NOTES:1. Get the application URL by running these commands:  export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=emqx-helm,app.kubernetes.io/instance=ugly-bumblebee" -o jsonpath="{.items[0].metadata.name}")
  echo "Visit http://127.0.0.1:8080 to use your application"
  kubectl port-forward $POD_NAME 8080:80

查看部署的 relaese

$ helm listNAME            REVISION    UPDATED                     STATUS      CHART           APP VERSION NAMESPACE
ugly-bumblebee  1           Tue Oct 30 08:19:17 2018    DEPLOYED    emqx-helm-v1.0  v1.0        default$ helm delete ugly-bumblebee
release "ugly-bumblebee" deleted

打包分享

我們可以修改 Chart.yaml 中的 helm chart 配置信息,然后使用下列命令將 chart 打包成一個壓縮文件。

$ helm package .
Successfully packaged chart and saved it to: /home/ubuntu/emqx/emqx-v1.0.tgz

Chart Repository

chart 庫是帶有一個 index.yaml 文件和任意個打包 chart 的 HTTP 服務器。當準備好分享 chart 時,首選方法是將其上傳到 chart 庫。

由于 chart 庫可以是任何可以提供 YAML 和 tar 文件并可以回答 GET 請求的 HTTP 服務器,因此當托管自己的 chart 庫時,很多選擇。例如,可以使用 Google 云端存儲(GCS)存儲桶,Amazon S3 存儲桶,Github Pages,甚至可以創建自己的 Web 服務器。

創建 chart 庫

chart 庫結構

chart 庫由打包的 chart 和一個名為的特殊文件組成, index.yaml 其中包含 chart 庫中所有 chart 的索引。通常,index.yaml 描述的 chart 也是托管在同一臺服務器上,源代碼文件也是如此。

例如,chart 庫的布局 https://example.com/charts 可能如下所示:

charts/  |
  |- index.yaml  |
  |- alpine-0.1.2.tgz  |
  |- alpine-0.1.2.tgz.prov

這種情況下,索引文件包含有關一個 chart(Alpine chart)的信息,并提供該 chart 的下載 URL https://example.com/charts/alpine-0.1.2.tgz。

不要求 chart 包與 index.yaml 文件位于同一臺服務器上 。但是,放在一起這樣做通常是最簡單的。

索引文件

索引文件是一個叫做 yaml 文件 index.yaml。它包含一些關于包的元數據,包括 chart 的 Chart.yaml 文件的內容。一個有效的 chart 庫必須有一個索引文件。索引文件包含有關 chart 庫中每個 chart 的信息。helm repo index 命令將根據包含打包的 chart 的給定本地目錄生成索引文件。

下面一個索引文件的例子:

apiVersion: v1
entries:
  alpine:
    - created: 2016-10-06T16:23:20.499814565-06:00
      description: Deploy a basic Alpine Linux pod
      digest: 99c76e403d752c84ead610644d4b1c2f2b453a74b921f422b9dcb8a7c8b559cd
      home: https://k8s.io/helm
      name: alpine
      sources:
      - https://github.com/kubernetes/helm
      urls:
      - https://technosophos.github.io/tscharts/alpine-0.2.0.tgz
      version: 0.2.0
    - created: 2016-10-06T16:23:20.499543808-06:00
      description: Deploy a basic Alpine Linux pod
      digest: 515c58e5f79d8b2913a10cb400ebb6fa9c77fe813287afbacf1a0b897cd78727
      home: https://k8s.io/helm
      name: alpine
      sources:
      - https://github.com/kubernetes/helm
      urls:
      - https://technosophos.github.io/tscharts/alpine-0.1.0.tgz
      version: 0.1.0
  nginx:
    - created: 2016-10-06T16:23:20.499543808-06:00
      description: Create a basic nginx HTTP server
      digest: aaff4545f79d8b2913a10cb400ebb6fa9c77fe813287afbacf1a0b897cdffffff
      home: https://k8s.io/helm
      name: nginx
      sources:
      - https://github.com/kubernetes/charts
      urls:
      - https://technosophos.github.io/tscharts/nginx-1.1.0.tgz
      version: 1.1.0generated: 2016-10-06T16:23:20.499029981-06:00

生成的索引和包可以從基本的網絡服務器提供。可以使用 helm serve 啟動本地服務器,在本地測試所有內容。

$ helm serve --repo-path ./charts
Regenerating index. This may take a moment.
Now serving you on 127.0.0.1:8879

托管 chart 庫

要配置普通 Web 服務器來服務 Helm chart,只需執行以下操作:

  • 將索引和 chart 置于服務器目錄中
  • 確保 index.yaml 可以在沒有認證要求的情況下訪問
  • 確保 yaml 文件的正確內容類型(text/yaml 或 text/x-yaml)

例如,如果想在 $WEBROOT/charts 以外的目錄為 chart 提供服務,請確保 Web 根目錄中有一個 charts/ 目錄,并將索引文件和 chart 放入該文件夾內。

管理 chart 庫

將 chart 存儲在 chart 庫中

現在已有一個 chart 存儲庫,讓我們上傳一個 chart 和一個索引文件到存儲庫。chart 庫中的 chart 必須正確打包(helm package chart-name/)和版本(遵循 SemVer 2 標準)。

接下來的這些步驟是一個示例工作流程,也可以用你喜歡的任何工作流程來存儲和更新 chart 庫中的 chart。

準備好打包 chart 后,創建一個新目錄,并將打包 chart 移動到該目錄。

$ helm package .
$ mkdir emqx-charts
$ mv emqx-0.1.0.tgz emqx-charts/
$ helm repo index emqx-charts --url  https://example.com/charts

最后一條命令采用剛創建的本地目錄的路徑和遠程 chart 庫的 URL,并在給定的目錄路徑中生成 index.yaml。

現在可以使用同步工具或手動將 chart 和索引文件上傳到 chart 庫。如果使用 Google 云端存儲,請使用 gsutil 客戶端查看此示例工作流程。對于 GitHub,可以簡單地將 chart 放入適當的目標分支中。

新添加 chart 添加到現有存儲庫

每次將新 chart 添加到存儲庫時,都必須重新生成索引。helm repo index 命令將 index.yaml 從頭開始完全重建該文件,但僅包括它在本地找到的 chart。

可以使用 —merge 標志向現有 index.yaml 文件增量添加新 chart(在使用遠程存儲庫(如 GCS)時,這是一個很好的選擇)。運行 helm repo index —help 以了解更多信息,

確保上傳修改后的 index.yaml 文件和 chart。如果生成了出處 provenance 文件,也要上傳。

與他人分享 chart

準備好分享 chart 時,只需讓別人知道存儲庫的 URL 是什么就可以了。

他們將通過 helm repo add [NAME] [URL] 命令將倉庫添加到他們的 helm 客戶端,并可以起一個帶有任何想用來引用倉庫的名字。

$ helm repo add emqx-charts https://example.com/charts
$ helm repo list
emqx-charts    https://example.com/charts

如果 chart 由 HTTP 基本認證支持,也可以在此處提供用戶名和密碼:

$ helm repo add emqx-charts https://example.com/charts --username my-username --password my-password
$ helm repo list
emqx-charts    https://example.com/charts

注意: 如果存儲庫不包含有效信息庫 index.yaml 文件,則添加不會成功。

之后,用戶將能夠搜索 chart。更新存儲庫后,他們可以使用該 helm repo update 命令獲取最新的 chart 信息。

原理是helm repo add和helm repo update命令獲取index.yaml文件并將它們存儲在 $HELM_HOME/repository/cache/目錄中。這是helm search 找到有關chart的信息的地方。

參考資料

  • Chart Repository 存儲庫指南
  • 使用 Helm 管理 kubernetes 應用
  • Kunbernetes -容器云應用的安裝部署工具 Helm
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

安化县| 聂拉木县| 四子王旗| 昌吉市| 井陉县| 扎鲁特旗| 兴海县| 叙永县| 上蔡县| 锡林郭勒盟| 博兴县| 云林县| 新邵县| 天全县| 威宁| 哈尔滨市| 海淀区| 丰城市| 绵阳市| 开阳县| 石棉县| 棋牌| 孟连| 闻喜县| 乌兰察布市| 莱州市| 兖州市| 若尔盖县| 富源县| 屏东市| 玛多县| 仁怀市| 水城县| 南城县| 滨海县| 高邑县| 若羌县| 许昌县| 柳林县| 大渡口区| 新田县|