原創: 成晨 京東雲開發者社區 昨天node
在上一篇「Cloud Native 實操系列」文章中,咱們爲你們介紹了如何經過京東雲原生容器實現Eureka的部署(👈可點擊查看原文內容)。今天,咱們將爲你們介紹京東雲託管Kubernetes集成鏡像倉庫並部署原生DashBoard。linux
隨着Docker技術的發展和普遍流行,雲原生應用和容器調度管理系統爆之也成爲IT領域大熱的詞彙。事實上,雲原生應用的思想,在Docker技術火前,已經由雲計算技術的領導者和分佈式系統架構的推廣者普遍傳播,例如雲原生應用的12要素早在2011年就由Heroku的工程師提出了;只不過以虛擬機技術做爲雲原生應用的基礎實施,因爲虛擬機鏡像大、鏡像標準不統一以及打包流程和工具不統一,沒法業界普遍接受的雲原生應用標準,限制了雲原生應用的流行。而Docker的出現正好解決了這些限制雲原生應用構建、交付和運行的瓶頸,使得構建雲原生應用成爲了使用Docker的開發者天然而然的選擇。docker
單機的Docker引擎和單一的容器鏡像只能解決單一服務的打包和測試問題。而要運行生產級的企業級應用,就須要容器調度管理系統。在這裏面,Docker技術就彷彿運送系統零件的集裝箱,把雲原生應用的各個標準化零件交付到各個企業的不一樣碼頭,而容器調度管理系統就是企業應用的運行車間,把不一樣的零件組裝、運行、維護起來。shell
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使用門檻,加強應用的可靠性,提高開發的效率,減小資源投入成本。設計模式
相較於傳統自建Kubernetes集羣,京東雲Kubernetes集羣服務有以下優點:api
易用性:在控制檯一鍵式建立Kubernetes集羣服務;管理節點採用全託管的方式,免除繁瑣的部署、運維、升級等工做;提供工做節點定製鏡像,預置集羣工做節點所需的各類組件。瀏覽器
可靠性:同地域下,集羣的管理、工做節點可跨可用區部署,支持單集羣至少運行三臺雲主機做爲管理節點,同時基於京東雲高可用組隔離故障域,進一步加強了可靠性。安全
功能性:基於京東雲SDN網絡,提供CNI網絡插件,依託京東雲私有網絡的高可用及可靠性,輕鬆適應不一樣規模生產環境的網絡需求;提供CRI存儲插件,集成京東云云硬盤,提供安全可靠的持久化存儲;集成京東雲負載均衡服務,提供安全、可靠的網絡訪問。
性價比:京東雲Kubernetes集羣服務自己暫時免費,目前您只需爲集羣中建立的雲主機、公網IP、雲硬盤等雲資源按需付費。
下面會演示京東雲Kubernetes集成京東雲鏡像倉庫,構建原生dashboard的最佳實踐,但願能起到拋磚引玉的做用。
登錄京東雲控制檯後,點擊帳號下拉菜單,選擇Access Key
管理。
點擊建立
,並輸入相關手機號碼。
至此AK、SK建立成功。
選擇容器鏡像倉庫:
鏡像倉庫模板爲:registry-URL/repository:tag,因此咱們建立順序爲:
建立註冊表
建立倉庫
點擊建立
按鈕,後輸入註冊表名稱,本例中的名稱爲:pocexam.
因爲Kubernetes 官方dashboard 鏡像kubernetes-dashboard-amd64
爲國外資源,國內沒法pull,因此咱們須要先從Google鏡像倉庫push到本地後再上傳到鏡像倉庫。
此處建立鏡像倉庫時的名稱爲:kubernetes-dashboard-amd64
。
此處須要建立一臺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
會看到拉取到的鏡像。
上傳至京東雲鏡像倉庫以前,須要有上傳權限,能夠經過臨時令牌的方式登陸並上傳鏡像。 獲取臨時令牌方法爲:京東雲控制檯-->容器鏡像倉庫-->註冊表,選擇以前建立的registry,右側點擊獲取臨時令牌:
設置有效期:
確認後,能夠得到多種格式的登錄方式,本次操做使用Docker客戶端登陸命令,點擊複製按鈕,並在Linux雲主機中執行。
須要注意:徹底複製粘貼到Linux shell 命令中便可,無需修改任何參數。
將k8s.gcr.io/kubernetes-dashboard-amd64:v1.10.1
修改成$registry-URL/kubernetes-dashboard-amd64:v1.10.1
,此處的registry-URL變量須要替換爲你所建立的registry的值,或者能夠在控制檯獲取到:
好比本次操做的值爲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併成功上傳至京東雲鏡像倉庫的截圖以下:
在控制檯能夠驗證到已成功上傳:
首先建立VPC:控制檯-->網絡-->私有網絡(VPC)
劃分子網:控制檯-->網絡-->子網
建立Kubernetes集羣,控制檯-->彈性計算-->Kubernetes集羣。
注意須要選擇AK,修改node節點的CIDR,避免與集羣中的service、pod衝突。
點擊確認後,等待若干分鐘,集羣建立成功,目前支持的版本爲1.12.3。
在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
複製代碼
在Linux雲主機執行以下shell命令,建立相關配置文件,並將Kubernetes的鏈接信息寫入config文件,保存退出:
1mkdir -p ~/.kube && vi ~/.kube/config
複製代碼
鏈接信息獲取方式爲:控制檯-->彈性計算-->Kubernetes集羣,點擊建立的Kubernetes集羣名稱。
將文本框中的內容保存至~/.kube/config
文件中。而後執行kubectl version
命令,顯示以下信息表示鏈接成功:
參考幫助文檔連接:docs.jdcloud.com/cn/jcs-for-…
在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的問題。
在鏡像倉庫中選擇註冊表,點擊獲取臨時令牌:
紅框中標識的內容即臨時密碼。
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
複製代碼
在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:
稍等1分鐘左右再查看,能夠看到LB已綁定公網IP:
查看全部namespace的pod,能夠看到已成功pull:
使用Chrome或者Firefox瀏覽器訪問service所綁定的公網IP以及對應端口,本次實驗中訪問:https://192.168.125.165:9443,會看到以下信息:
本次訪問咱們使用令牌訪問所有權限。認證時的帳號必須爲ServiceAccount,被dashboard的pod拿來由kubernetes進行認證。
1kubectl create serviceaccount dashboard-admin -n kube-system
複製代碼
1kubectl create clusterrolebinding dashboard-cluster-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
複製代碼
相關參數:
clusterrole
:指定使用的集羣角色,系統默認自帶不少,建議指定。
serviceaccount
:指定認證使用的ServiceAccount,由上一步建立。
1kubectl describe sa dashboard-admin -n kube-system
複製代碼
由此可知,本例中dashboard-admin-token-wf2tj
爲使用的Secret。
執行shell命令查看對應secret相關信息:
1kubectl describe secrets -n kube-system dashboard-admin-token-wf2tj
複製代碼
下圖中獲取到的token即訪問憑證。
將其複製粘貼到瀏覽器中便可登陸成功:
點擊「閱讀原文」,瞭解更多京東雲K8s產品信息
福利預警
京東雲開發者社區用戶專屬福利!
參加沙龍活動,免費得CNCF大會門票!
🎁🎁🎁