乾貨 | 京東雲託管Kubernetes集成鏡像倉庫並部署原生DashBoard

乾貨 | 京東雲託管Kubernetes集成鏡像倉庫並部署原生DashBoard

原創: 成晨 京東雲開發者社區  昨天node

在上一篇「Cloud Native 實操系列」文章中,咱們爲你們介紹了如何經過京東雲原生容器實現Eureka的部署(👈可點擊查看原文內容)。今天,咱們將爲你們介紹京東雲託管Kubernetes集成鏡像倉庫並部署原生DashBoard。linux

隨着Docker技術的發展和普遍流行,雲原生應用和容器調度管理系統爆之也成爲IT領域大熱的詞彙。事實上,雲原生應用的思想,在Docker技術火前,已經由雲計算技術的領導者和分佈式系統架構的推廣者普遍傳播,例如雲原生應用的12要素早在2011年就由Heroku的工程師提出了;只不過以虛擬機技術做爲雲原生應用的基礎實施,因爲虛擬機鏡像大、鏡像標準不統一以及打包流程和工具不統一,沒法業界普遍接受的雲原生應用標準,限制了雲原生應用的流行。而Docker的出現正好解決了這些限制雲原生應用構建、交付和運行的瓶頸,使得構建雲原生應用成爲了使用Docker的開發者天然而然的選擇。docker

單機的Docker引擎和單一的容器鏡像只能解決單一服務的打包和測試問題。而要運行生產級的企業級應用,就須要容器調度管理系統。在這裏面,Docker技術就彷彿運送系統零件的集裝箱,把雲原生應用的各個標準化零件交付到各個企業的不一樣碼頭,而容器調度管理系統就是企業應用的運行車間,把不一樣的零件組裝、運行、維護起來。shell

1. 京東雲Kubernetes介紹

Kubernetes是爲生產環境而設計的容器調度管理系統,對於負載均衡、服務發現、高可用、滾動升級、自動伸縮等容器雲平臺的功能要求有原生支持。因爲Kubernetes在K和s間有8個字母,所以常簡稱K8s。事實上,隨着對K8s系統架構與設計理念的瞭解深刻,咱們會發現K8s系統正是到處爲運行雲原生應用而設計考慮;同時,隨着對K8s系統使用的加深和加廣,也會有愈來愈多有關雲原生應用的設計模式產生出來,使得基於K8s系統設計和開發生產級的複雜雲原生應用變得像啓動一個單機版容器服務那樣簡單易用。express

根據CNCF在2018年8月進行的第六次測量容器管理市場的溫度,83%的受訪者更喜歡Kubernetes的容器管理工具,58%的受訪者在生產中使用Kubernetes,42%的受訪者正在進行評估以備未來使用,40%的企業(員工規模在5000+)正在使用Kubernetes。Kubernetes在開發人員中已經變得很是流行。apache

京東雲Kubernetes集羣採用管理節點全託管的方式,爲用戶提供簡單易用、高可靠、功能強大的容器管理服務。該產品徹底兼容標準Kubernetes API ,集成京東雲網絡、存儲等插件。Kubernetes集羣服務簡化了Kubernetes部署、管理,下降了Kubernetes使用門檻,加強應用的可靠性,提高開發的效率,減小資源投入成本。設計模式

1.1 產品優點

相較於傳統自建Kubernetes集羣,京東雲Kubernetes集羣服務有以下優點:api

  • 易用性:在控制檯一鍵式建立Kubernetes集羣服務;管理節點採用全託管的方式,免除繁瑣的部署、運維、升級等工做;提供工做節點定製鏡像,預置集羣工做節點所需的各類組件。瀏覽器

  • 可靠性:同地域下,集羣的管理、工做節點可跨可用區部署,支持單集羣至少運行三臺雲主機做爲管理節點,同時基於京東雲高可用組隔離故障域,進一步加強了可靠性。安全

  • 功能性:基於京東雲SDN網絡,提供CNI網絡插件,依託京東雲私有網絡的高可用及可靠性,輕鬆適應不一樣規模生產環境的網絡需求;提供CRI存儲插件,集成京東云云硬盤,提供安全可靠的持久化存儲;集成京東雲負載均衡服務,提供安全、可靠的網絡訪問。

  • 性價比:京東雲Kubernetes集羣服務自己暫時免費,目前您只需爲集羣中建立的雲主機、公網IP、雲硬盤等雲資源按需付費。

1.2 京東雲Kubernetes部署架構

image

k8s培訓

下面會演示京東雲Kubernetes集成京東雲鏡像倉庫,構建原生dashboard的最佳實踐,但願能起到拋磚引玉的做用。

2. 環境準備

2.1 建立AK、SK

登錄京東雲控制檯後,點擊帳號下拉菜單,選擇Access Key管理。

image

點擊建立,並輸入相關手機號碼。

image

至此AK、SK建立成功。

image

2.2 容器鏡像倉庫準備

選擇容器鏡像倉庫:

image

鏡像倉庫模板爲:registry-URL/repository:tag,因此咱們建立順序爲:

  1. 建立註冊表

  2. 建立倉庫

2.2.1 建立註冊表

點擊建立按鈕,後輸入註冊表名稱,本例中的名稱爲:pocexam.

image

2.2.2 建立鏡像倉庫

因爲Kubernetes 官方dashboard 鏡像kubernetes-dashboard-amd64爲國外資源,國內沒法pull,因此咱們須要先從Google鏡像倉庫push到本地後再上傳到鏡像倉庫。

此處建立鏡像倉庫時的名稱爲:kubernetes-dashboard-amd64

image

2.2.3 上傳Kubernetes-dashboard鏡像

此處須要建立一臺Linux雲主機(建議使用Ubuntu鏡像),並安裝Docker。此處再也不贅述。經過ssh工具鏈接,執行以下命令安裝Docker工具:

1apt-get install -y docker.io
複製代碼

因爲國內網絡緣由,Google官方鏡像k8s.gcr.io/kubernetes-dashboard-amd64:v1.10.1沒法pull,因此咱們須要從docker.io倉庫的Google容器鏡像進行拉取:

1docker pull mirrorgooglecontainers/kubernetes-dashboard-amd64:v1.10.1
複製代碼

而後執行docker images會看到拉取到的鏡像。

image

上傳至京東雲鏡像倉庫以前,須要有上傳權限,能夠經過臨時令牌的方式登陸並上傳鏡像。 獲取臨時令牌方法爲:京東雲控制檯-->容器鏡像倉庫-->註冊表,選擇以前建立的registry,右側點擊獲取臨時令牌:

image

設置有效期:

image

確認後,能夠得到多種格式的登錄方式,本次操做使用Docker客戶端登陸命令,點擊複製按鈕,並在Linux雲主機中執行。

須要注意:徹底複製粘貼到Linux shell 命令中便可,無需修改任何參數。

image

image.gif

k8s.gcr.io/kubernetes-dashboard-amd64:v1.10.1修改成$registry-URL/kubernetes-dashboard-amd64:v1.10.1,此處的registry-URL變量須要替換爲你所建立的registry的值,或者能夠在控制檯獲取到:

image.gif

好比本次操做的值爲pocexam-cn-north-1.jcr.service.jdcloud.com/kubernetes-dashboard-amd64,那麼操做命令以下:

1docker tag mirrorgooglecontainers/kubernetes-dashboard-amd64:v1.10.1 pocexam-cn-north-1.jcr.service.jdcloud.com/kubernetes-dashboard-amd64:v1.10.1 && docker push !$
複製代碼

修改tag併成功上傳至京東雲鏡像倉庫的截圖以下:

image.gif

在控制檯能夠驗證到已成功上傳:

image

2.3 建立Kubernetes集羣

2.3.1 建立Kubernetes所需的基礎網絡

首先建立VPC:控制檯-->網絡-->私有網絡(VPC)

image

劃分子網:控制檯-->網絡-->子網

image

建立Kubernetes集羣,控制檯-->彈性計算-->Kubernetes集羣

注意須要選擇AK,修改node節點的CIDR,避免與集羣中的service、pod衝突。

image

image

點擊確認後,等待若干分鐘,集羣建立成功,目前支持的版本爲1.12.3。

2.4 雲主機Kubernetes客戶端配置

在Linux雲主機上,執行以下shell命令:

1wget https://pocexam.s3.cn-north-1.jdcloud-oss.com/kubernetes-client-linux-amd64.tar.gz2tar zxvf kubernetes-client-linux-amd64.tar.gz && cd kubernetes/client/bin/3chmod +x kubectl && sudo mv ./kubectl /usr/local/bin/kubectl
複製代碼

2.5 配置集羣憑證

在Linux雲主機執行以下shell命令,建立相關配置文件,並將Kubernetes的鏈接信息寫入config文件,保存退出:

1mkdir -p ~/.kube && vi ~/.kube/config
複製代碼

鏈接信息獲取方式爲:控制檯-->彈性計算-->Kubernetes集羣,點擊建立的Kubernetes集羣名稱。

image

image

將文本框中的內容保存至~/.kube/config文件中。而後執行kubectl version命令,顯示以下信息表示鏈接成功:

image

3. Kubernetes集羣集成京東雲鏡像倉庫

參考幫助文檔連接:docs.jdcloud.com/cn/jcs-for-…

3.1 建立具備時效性的secret

在Linux雲主機shell中操做:

1kubectl create secret docker-registry my-secret -n kube-system --docker-server=pocexam-cn-north-1.jcr.service.jdcloud.com --docker-username=jdcloud --docker-password=z7G4sQTHMaNG0GRN --docker-email=chengchen3@jd.com
複製代碼

須要注意以下參數的值:

  • docker-server:你建立的鏡像倉庫的註冊表URL。

  • docker-username:默認jdcloud,無需修改。

  • docker-password:在臨時令牌中獲取,詳情參考下圖(獲取secret所需的臨時密碼)。

  • docker-email:用戶自定義郵箱。

  • -n參數,默認爲default namespace,本次部署綁定到kube-system。將來yaml配置文件中,你要建立pod或者deployment所在的namesapce,必須與本次建立的secret所在的namesapce保證一直,不然會出現ErrImagePullw的問題

3.1.1 獲取secret所需的臨時密碼

在鏡像倉庫中選擇註冊表,點擊獲取臨時令牌:

image

紅框中標識的內容即臨時密碼。

image

3.2 自動按期獲取臨時令牌,長期有效

shell中執行以下命令:

1#建立相關基於角色的訪問控制(RBAC)2kubectl apply -f https://pocexam.s3.cn-north-1.jdcloud-oss.com/jcr-credential-rbac.yaml
複製代碼

下載jcr-credential-cron.yaml文件,設定每個小時獲取臨時令牌,請使用時添加JDCLOUD_ACCESS_KEY和JDCLOUD_SECRET_KEY內容。

1cd ~2wget https://pocexam.s3.cn-north-1.jdcloud-oss.com/jcr-credential-cron.yaml
複製代碼

修改部分變量的值:

1apiVersion: batch/v1beta1 
2kind: CronJob
 3metadata: 
4  name: jdcloud-jcr-credential-cron
 5spec: 
6  schedule: "0 */1 * * *" # 0表明每小時的整點,您能夠根據須要修改時間,如改爲15表明每小時的第15分鐘獲取臨時令牌。 
7  successfulJobsHistoryLimit: 2 
8  failedJobsHistoryLimit: 2   9  jobTemplate:
10    spec:
11      backoffLimit: 4
12      template:
13        spec:
14          serviceAccountName: default
15          terminationGracePeriodSeconds: 0
16          restartPolicy: Never
17          hostNetwork: true
18          containers:
19          - name: jcr-token-refresher
20            imagePullPolicy: Always
21            image: jdcloudcli/jdcloud-cli:latest
22            command:
23            - "/bin/sh"
24            - "-c"
25            - |
26              ##REGISTRY_NAME變量須要修改成你的的鏡像倉庫註冊表的名稱27              REGISTRY_NAME=XXX
28              ##JCR_REGION變量須要修改成你的鏡像倉庫所在的region
29              JCR_REGION=cn-north-1
30              DOCKER_REGISTRY_SERVER=https://${REGISTRY_NAME}-${JCR_REGION}.jcr.service.jdcloud.com
31              DOCKER_USER=jdcloud
32              ##JDCLOUD_ACCESS_KEY和JDCLOUD_SECRET_KEY須要修改成你的pin的AK、SK的值33              JDCLOUD_ACCESS_KEY=xxxxxxxxxxxxxx
34              JDCLOUD_SECRET_KEY=xxxxxxxxxxxxx35              jdc configure add --profile ${DOCKER_USER} --access-key ${JDCLOUD_ACCESS_KEY} --secret-key ${JDCLOUD_SECRET_KEY}
36              PRECHECK=`jdc cr get-authorization-token --region-id ${JCR_REGION} --registry-name ${REGISTRY_NAME} |jq .result.authorizationToken`
37              if [ 'null' = "$PRECHECK" ]; then
38                  echo "jdc cr call failed no valid content"
 39                  exit 0 
40              else41                  echo "jdc cr call return authentication string"
42              fi;
43              DOCKER_PASSWORD=`echo ${PRECHECK} | base64 -d |cut  -d  ':' -f2`
44              kubectl delete secret my-secret || true
45              echo "0:"$PRECHECK
46              echo "1:"$DOCKER_REGISTRY_SERVER
47              echo "2:"$DOCKER_USER
48              echo "3:"$DOCKER_PASSWORD46/15555780261891.jpg)49505152535455565758              kubectl create secret docker-registry my-secret \
59              --docker-server=$DOCKER_REGISTRY_SERVER \60              --docker-username=$DOCKER_USER \
61              --docker-password=$DOCKER_PASSWORD \
62              ##docker-email修改成你的郵箱地址
63              --docker-email=xxxx@jd.com
64              kubectl patch serviceaccount default  -p '{"imagePullSecrets":[{"name":"my-secret"}]}' # kubectl patch  $SERVICEACCOUNT xxxxx  -n $NAMESPACEOFSERVICEACCOUNT
複製代碼

變量修改完成後,shell中執行以下命令,建立Kubernetes的計劃任務:

1kubectl apply -f jcr-credential-cron.yaml
複製代碼

4. 部署dashboard

在Linux雲主機中執行以下命令,下載dashboard相關yaml配置文件:

1wget https://pocexam.s3.cn-north-1.jdcloud-oss.com/db.yml
複製代碼

須要修改鏡像地址爲以前上傳的Kubernetes-dashboard地址:

1# Copyright 2017 The Kubernetes Authors. 2# 3# Licensed under the Apache License, Version 2.0 (the "License"); 4# you may not use this file except in compliance with the License. 5# You may obtain a copy of the License at 6# 7#     http://www.apache.org/licenses/LICENSE-2.0 8# 9# Unless required by applicable law or agreed to in writing, software 10# distributed under the License is distributed on an "AS IS" BASIS, 11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12# See the License for the specific language governing permissions and 13# limitations under the License. 14 15# ------------------- Dashboard Secret ------------------- # 16 17apiVersion: v1 18kind: Secret 19metadata: 20  labels: 21    k8s-app: kubernetes-dashboard 22  name: kubernetes-dashboard-certs 23  namespace: kube-system 24type: Opaque 25 26--- 27# ------------------- Dashboard Service Account ------------------- # 28 29apiVersion: v1 30kind: ServiceAccount 31metadata: 32  labels: 33    k8s-app: kubernetes-dashboard 34  name: kubernetes-dashboard 35  namespace: kube-system 36 37--- 38# ------------------- Dashboard Role & Role Binding ------------------- # 39 40kind: Role 41apiVersion: rbac.authorization.k8s.io/v1 42metadata: 43  name: kubernetes-dashboard-minimal 44  namespace: kube-system 45rules: 46  # Allow Dashboard to create 'kubernetes-dashboard-key-holder' secret. 47- apiGroups: [""] 48  resources: ["secrets"] 49  verbs: ["create"] 50  # Allow Dashboard to create 'kubernetes-dashboard-settings' config map. 51- apiGroups: [""] 52  resources: ["configmaps"] 53  verbs: ["create"] 54  # Allow Dashboard to get, update and delete Dashboard exclusive secrets. 55- apiGroups: [""] 56  resources: ["secrets"] 57  resourceNames: ["kubernetes-dashboard-key-holder", "kubernetes-dashboard-certs"] 58  verbs: ["get", "update", "delete"] 59  # Allow Dashboard to get and update 'kubernetes-dashboard-settings' config map. 60- apiGroups: [""] 61  resources: ["configmaps"] 62  resourceNames: ["kubernetes-dashboard-settings"] 63  verbs: ["get", "update"] 64  # Allow Dashboard to get metrics from heapster. 65- apiGroups: [""] 66  resources: ["services"] 67  resourceNames: ["heapster"] 68  verbs: ["proxy"] 69- apiGroups: [""] 70  resources: ["services/proxy"] 71  resourceNames: ["heapster", "http:heapster:", "https:heapster:"] 72  verbs: ["get"] 73 74--- 75apiVersion: rbac.authorization.k8s.io/v1 76kind: RoleBinding 77metadata: 78  name: kubernetes-dashboard-minimal 79  namespace: kube-system 80roleRef: 81  apiGroup: rbac.authorization.k8s.io 82  kind: Role 83  name: kubernetes-dashboard-minimal 84subjects: 85- kind: ServiceAccount 86  name: kubernetes-dashboard 87  namespace: kube-system 88 89--- 90# ------------------- Dashboard Deployment ------------------- # 91 92kind: Deployment 93apiVersion: apps/v1 94metadata: 95  labels: 96    k8s-app: kubernetes-dashboard 97  name: kubernetes-dashboard 98  namespace: kube-system 99spec:100  replicas: 1101  revisionHistoryLimit: 10102  selector:103    matchLabels:104      k8s-app: kubernetes-dashboard105  template:106    metadata:107      labels:108        k8s-app: kubernetes-dashboard109    spec:110      containers:111      - name: kubernetes-dashboard112        ##此處修改成你以前上傳到鏡像倉庫的dashboard地址113        image: Myregistry-cn-north-1.jcr.service.jdcloud.com/kubernetes-dashboard-amd64:v1.10.1114        ports:115        - containerPort: 8443116          protocol: TCP117        args:118          - --auto-generate-certificates119          # Uncomment the following line to manually specify Kubernetes API server Host120          # If not specified, Dashboard will attempt to auto discover the API server and connect121          # to it. Uncomment only if the default does not work.122          # - --apiserver-host=http://my-address:port123        volumeMounts:124        - name: kubernetes-dashboard-certs125          mountPath: /certs126          # Create on-disk volume to store exec logs127        - mountPath: /tmp128          name: tmp-volume129        livenessProbe:130          httpGet:131            scheme: HTTPS132            path: /133            port: 8443134          initialDelaySeconds: 30135          timeoutSeconds: 30136      volumes:137      - name: kubernetes-dashboard-certs138        secret:139          secretName: kubernetes-dashboard-certs140      - name: tmp-volume141        emptyDir: {}142      serviceAccountName: kubernetes-dashboard143      imagePullSecrets:144        - name: my-secret145      # Comment the following tolerations if Dashboard must not be deployed on master146      tolerations:147      - key: node-role.kubernetes.io/master148        effect: NoSchedule149150---151# ------------------- Dashboard Service ------------------- #152# ------------------- 此處設置在京東雲自動建立LB並綁定帶寬爲10Mbps的公網IP------------------- #153kind: Service154apiVersion: v1155metadata:156  name: dashboard-lb157  namespace: kube-system158  labels:159    k8s-app: kubernetes-dashboard160spec:161  ports:162    - protocol: TCP163      port: 9443164      targetPort: 8443165      nodePort: 30063166  type: LoadBalancer167  selector:168     k8s-app: kubernetes-dashboard
複製代碼

shell中建立Kubernetes deployment:

1kubectl apply -f db.yml
複製代碼

查看集羣中全部的service:

1kubectl get svc --all-namespaces
複製代碼

能夠看到正在建立LB對應的公網IP:

image

稍等1分鐘左右再查看,能夠看到LB已綁定公網IP:

image

查看全部namespace的pod,能夠看到已成功pull:

image

5. 訪問dashboard

使用Chrome或者Firefox瀏覽器訪問service所綁定的公網IP以及對應端口,本次實驗中訪問:https://192.168.125.165:9443,會看到以下信息:

image

本次訪問咱們使用令牌訪問所有權限。認證時的帳號必須爲ServiceAccount,被dashboard的pod拿來由kubernetes進行認證

5.1 建立ServiceAccount

1kubectl create serviceaccount dashboard-admin -n kube-system
複製代碼

5.2 綁定相關Role

1kubectl create clusterrolebinding dashboard-cluster-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
複製代碼

相關參數:

  • clusterrole:指定使用的集羣角色,系統默認自帶不少,建議指定。

  • serviceaccount:指定認證使用的ServiceAccount,由上一步建立。

5.3 獲取Secret

1kubectl describe sa dashboard-admin -n kube-system
複製代碼

image

由此可知,本例中dashboard-admin-token-wf2tj爲使用的Secret。

5.4 獲取Token

執行shell命令查看對應secret相關信息:

1kubectl describe secrets -n kube-system dashboard-admin-token-wf2tj
複製代碼

下圖中獲取到的token即訪問憑證。

image

將其複製粘貼到瀏覽器中便可登陸成功:

image

image

點擊「閱讀原文」,瞭解更多京東雲K8s產品信息

image


福利預警

京東雲開發者社區用戶專屬福利!

參加沙龍活動,免費得CNCF大會門票!

🎁🎁🎁

閱讀原文

相關文章
相關標籤/搜索