隨着Docker技術的發展和普遍流行,雲原生應用和容器調度管理系統也成爲IT領域大熱的詞彙。事實上,雲原生應用的思想,在Docker技術火爆以前,已經由雲計算技術的領導者和分佈式系統架構的推廣者普遍傳播,例如雲原生應用的12要素早在2011年就由Heroku的工程師提出了;只不過以虛擬機技術做爲雲原生應用的基礎實施,因爲虛擬機鏡像大、鏡像標準不統一以及打包流程和工具不統一,沒法業界普遍接受的雲原生應用標準,限制了雲原生應用的流行。而Docker的出現正好解決了這些限制雲原生應用構建、交付和運行的瓶頸,使得構建雲原生應用成爲了使用Docker的開發者天然而然的選擇。單機的Docker引擎和單一的容器鏡像只能解決單一服務的打包和測試問題。而要運行生產級的企業級應用,就須要容器調度管理系統。在這裏面,Docker技術就彷彿運送系統零件的集裝箱,把雲原生應用的各個標準化零件交付到各個企業的不一樣碼頭,而容器調度管理系統就是企業應用的運行車間,把不一樣的零件組裝、運行、維護起來。node
Kubernetes是爲生產環境而設計的容器調度管理系統,對於負載均衡、服務發現、高可用、滾動升級、自動伸縮等容器雲平臺的功能要求有原生支持。因爲Kubernetes在K和s間有8個字母,所以常簡稱K8s。事實上,隨着對K8s系統架構與設計理念的瞭解深刻,咱們會發現K8s系統正是到處爲運行雲原生應用而設計考慮;同時,隨着對K8s系統使用的加深和加廣,也會有愈來愈多有關雲原生應用的設計模式產生出來,使得基於K8s系統設計和開發生產級的複雜雲原生應用變得像啓動一個單機版容器服務那樣簡單易用。linux
根據CNCF在2018年8月進行的第六次測量容器管理市場的溫度,83%的受訪者更喜歡Kubernetes的容器管理工具,58%的受訪者在生產中使用Kubernetes,42%的受訪者正在進行評估以備未來使用,40%的企業(員工規模在5000+)正在使用Kubernetes。Kubernetes在開發人員中已經變得很是流行。docker
京東雲Kubernetes集羣採用管理節點全託管的方式,爲用戶提供簡單易用、高可靠、功能強大的容器管理服務。該產品徹底兼容標準Kubernetes API ,集成京東雲網絡、存儲等插件。Kubernetes集羣服務簡化了Kubernetes部署、管理,下降了Kubernetes使用門檻,加強應用的可靠性,提高開發的效率,減小資源投入成本。shell
相較於傳統自建Kubernetes集羣,京東雲Kubernetes集羣服務有以下優點:express
下面會演示京東雲Kubernetes集成京東雲鏡像倉庫,構建原生dashboard的最佳實踐,但願能起到拋磚引玉的做用。apache
登錄京東雲控制檯後,點擊帳號下拉菜單,選擇Access Key
管理。設計模式
點擊建立
,並輸入相關手機號碼。api
至此AK、SK建立成功。瀏覽器
選擇容器鏡像倉庫:安全
鏡像倉庫模板爲:registry-URL/repository:tag,因此咱們建立順序爲:
點擊建立
按鈕,後輸入註冊表名稱,本例中的名稱爲:pocexam.
因爲Kubernetes 官方dashboard 鏡像kubernetes-dashboard-amd64
爲國外資源,國內沒法pull,因此咱們須要先從Google鏡像倉庫push到本地後再上傳到鏡像倉庫。
此處建立鏡像倉庫時的名稱爲:kubernetes-dashboard-amd64
。
此處須要建立一臺Linux雲主機(建議使用Ubuntu鏡像),並安裝Docker。此處再也不贅述。經過ssh工具鏈接,執行以下命令安裝Docker工具:
apt-get install -y docker.io
因爲國內網絡緣由,Google官方鏡像k8s.gcr.io/kubernetes-dashboard-amd64:v1.10.1
沒法pull,因此咱們須要從docker.io倉庫的Google容器鏡像進行拉取:
docker 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
,那麼操做命令以下:
docker 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命令:
wget https://pocexam.s3.cn-north-1.jdcloud-oss.com/kubernetes-client-linux-amd64.tar.gz tar zxvf kubernetes-client-linux-amd64.tar.gz && cd kubernetes/client/bin/ chmod +x kubectl && sudo mv ./kubectl /usr/local/bin/kubectl
在Linux雲主機執行以下shell命令,建立相關配置文件,並將Kubernetes的鏈接信息寫入config文件,保存退出:
mkdir -p ~/.kube && vi ~/.kube/config
鏈接信息獲取方式爲:控制檯-->彈性計算-->Kubernetes集羣,點擊建立的Kubernetes集羣名稱
將文本框中的內容保存至~/.kube/config
文件中。而後執行kubectl version
命令,顯示以下信息表示鏈接成功:
參考幫助文檔連接:https://docs.jdcloud.com/cn/jcs-for-kubernetes/deploy-container-registry
在Linux雲主機shell中操做:
kubectl 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
須要注意以下參數的值:
-n
參數,默認爲default
namespace,本次部署綁定到kube-system。將來yaml配置文件中,你要建立pod或者deployment所在的namesapce,必須與本次建立的secret所在的namesapce保證一直,不然會出現ErrImagePullw的問題。在鏡像倉庫中選擇註冊表,點擊獲取臨時令牌
紅框中標識的內容即臨時密碼。
shell中執行以下命令:
#建立相關基於角色的訪問控制(RBAC) kubectl 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內容。
cd ~ wget https://pocexam.s3.cn-north-1.jdcloud-oss.com/jcr-credential-cron.yaml
修改部分變量的值:
apiVersion: batch/v1beta1 kind: CronJob metadata: name: jdcloud-jcr-credential-cron spec: schedule: "0 */1 * * *" # 0表明每小時的整點,您能夠根據須要修改時間,如改爲15表明每小時的第15分鐘獲取臨時令牌。 successfulJobsHistoryLimit: 2 failedJobsHistoryLimit: 2 jobTemplate: spec: backoffLimit: 4 template: spec: serviceAccountName: default terminationGracePeriodSeconds: 0 restartPolicy: Never hostNetwork: true containers: - name: jcr-token-refresher imagePullPolicy: Always image: jdcloudcli/jdcloud-cli:latest command: - "/bin/sh" - "-c" - | ##REGISTRY_NAME變量須要修改成你的的鏡像倉庫註冊表的名稱 REGISTRY_NAME=XXX ##JCR_REGION變量須要修改成你的鏡像倉庫所在的region JCR_REGION=cn-north-1 DOCKER_REGISTRY_SERVER=https://${REGISTRY_NAME}-${JCR_REGION}.jcr.service.jdcloud.com DOCKER_USER=jdcloud ##JDCLOUD_ACCESS_KEY和JDCLOUD_SECRET_KEY須要修改成你的pin的AK、SK的值 JDCLOUD_ACCESS_KEY=xxxxxxxxxxxxxx JDCLOUD_SECRET_KEY=xxxxxxxxxxxxx jdc configure add --profile ${DOCKER_USER} --access-key ${JDCLOUD_ACCESS_KEY} --secret-key ${JDCLOUD_SECRET_KEY} PRECHECK=`jdc cr get-authorization-token --region-id ${JCR_REGION} --registry-name ${REGISTRY_NAME} |jq .result.authorizationToken` if [ 'null' = "$PRECHECK" ]; then echo "jdc cr call failed no valid content" exit 0 else echo "jdc cr call return authentication string" fi; DOCKER_PASSWORD=`echo ${PRECHECK} | base64 -d |cut -d ':' -f2` kubectl delete secret my-secret || true echo "0:"$PRECHECK echo "1:"$DOCKER_REGISTRY_SERVER echo "2:"$DOCKER_USER echo "3:"$DOCKER_PASSWORD46/15555780261891.jpg) kubectl create secret docker-registry my-secret \ --docker-server=$DOCKER_REGISTRY_SERVER \ --docker-username=$DOCKER_USER \ --docker-password=$DOCKER_PASSWORD \ ##docker-email修改成你的郵箱地址 --docker-email=xxxx@jd.com kubectl patch serviceaccount default -p '{"imagePullSecrets":[{"name":"my-secret"}]}' # kubectl patch $SERVICEACCOUNT xxxxx -n $NAMESPACEOFSERVICEACCOUNT
變量修改完成後,shell中執行以下命令,建立Kubernetes的計劃任務:
kubectl apply -f jcr-credential-cron.yaml
在Linux雲主機中執行以下命令,下載dashboard相關yaml配置文件:
wget https://pocexam.s3.cn-north-1.jdcloud-oss.com/db.yml
須要修改鏡像地址爲以前上傳的Kubernetes-dashboard地址:
# Copyright 2017 The Kubernetes Authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # ------------------- Dashboard Secret ------------------- # apiVersion: v1 kind: Secret metadata: labels: k8s-app: kubernetes-dashboard name: kubernetes-dashboard-certs namespace: kube-system type: Opaque --- # ------------------- Dashboard Service Account ------------------- # apiVersion: v1 kind: ServiceAccount metadata: labels: k8s-app: kubernetes-dashboard name: kubernetes-dashboard namespace: kube-system --- # ------------------- Dashboard Role & Role Binding ------------------- # kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: name: kubernetes-dashboard-minimal namespace: kube-system rules: # Allow Dashboard to create 'kubernetes-dashboard-key-holder' secret. - apiGroups: [""] resources: ["secrets"] verbs: ["create"] # Allow Dashboard to create 'kubernetes-dashboard-settings' config map. - apiGroups: [""] resources: ["configmaps"] verbs: ["create"] # Allow Dashboard to get, update and delete Dashboard exclusive secrets. - apiGroups: [""] resources: ["secrets"] resourceNames: ["kubernetes-dashboard-key-holder", "kubernetes-dashboard-certs"] verbs: ["get", "update", "delete"] # Allow Dashboard to get and update 'kubernetes-dashboard-settings' config map. - apiGroups: [""] resources: ["configmaps"] resourceNames: ["kubernetes-dashboard-settings"] verbs: ["get", "update"] # Allow Dashboard to get metrics from heapster. - apiGroups: [""] resources: ["services"] resourceNames: ["heapster"] verbs: ["proxy"] - apiGroups: [""] resources: ["services/proxy"] resourceNames: ["heapster", "http:heapster:", "https:heapster:"] verbs: ["get"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: kubernetes-dashboard-minimal namespace: kube-system roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: kubernetes-dashboard-minimal subjects: - kind: ServiceAccount name: kubernetes-dashboard namespace: kube-system --- # ------------------- Dashboard Deployment ------------------- # kind: Deployment apiVersion: apps/v1 metadata: labels: k8s-app: kubernetes-dashboard name: kubernetes-dashboard namespace: kube-system spec: replicas: 1 revisionHistoryLimit: 10 selector: matchLabels: k8s-app: kubernetes-dashboard template: metadata: labels: k8s-app: kubernetes-dashboard spec: containers: - name: kubernetes-dashboard ##此處修改成你以前上傳到鏡像倉庫的dashboard地址 image: Myregistry-cn-north-1.jcr.service.jdcloud.com/kubernetes-dashboard-amd64:v1.10.1 ports: - containerPort: 8443 protocol: TCP args: - --auto-generate-certificates # Uncomment the following line to manually specify Kubernetes API server Host # If not specified, Dashboard will attempt to auto discover the API server and connect # to it. Uncomment only if the default does not work. # - --apiserver-host=http://my-address:port volumeMounts: - name: kubernetes-dashboard-certs mountPath: /certs # Create on-disk volume to store exec logs - mountPath: /tmp name: tmp-volume livenessProbe: httpGet: scheme: HTTPS path: / port: 8443 initialDelaySeconds: 30 timeoutSeconds: 30 volumes: - name: kubernetes-dashboard-certs secret: secretName: kubernetes-dashboard-certs - name: tmp-volume emptyDir: {} serviceAccountName: kubernetes-dashboard imagePullSecrets: - name: my-secret # Comment the following tolerations if Dashboard must not be deployed on master tolerations: - key: node-role.kubernetes.io/master effect: NoSchedule --- # ------------------- Dashboard Service ------------------- # # ------------------- 此處設置在京東雲自動建立LB並綁定帶寬爲10Mbps的公網IP------------------- # kind: Service apiVersion: v1 metadata: name: dashboard-lb namespace: kube-system labels: k8s-app: kubernetes-dashboard spec: ports: - protocol: TCP port: 9443 targetPort: 8443 nodePort: 30063 type: LoadBalancer selector: k8s-app: kubernetes-dashboard
shell中建立Kubernetes deployment:
kubectl apply -f db.yml
查看集羣中全部的service:
kubectl 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進行認證。
kubectl create serviceaccount dashboard-admin -n kube-system
kubectl create clusterrolebinding dashboard-cluster-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
相關參數:
clusterrole
:指定使用的集羣角色,系統默認自帶不少,建議指定。serviceaccount
:指定認證使用的ServiceAccount,由上一步建立。kubectl describe sa dashboard-admin -n kube-system
由此可知,本例中dashboard-admin-token-wf2tj
爲使用的Secret。
執行shell命令查看對應secret相關信息:
kubectl describe secrets -n kube-system dashboard-admin-token-wf2tj
下圖中獲取到的token即訪問憑證。
將其複製粘貼到瀏覽器中便可登陸成功:
→點擊瞭解更多京東雲K8s產品信息
歡迎點擊「連接」瞭解京東雲更多精彩