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

1. 京東雲Kubernetes介紹

隨着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

1.1 產品優點

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

  • 易用性:在控制檯一鍵式建立Kubernetes集羣服務;管理節點採用全託管的方式,免除繁瑣的部署、運維、升級等工做;提供工做節點定製鏡像,預置集羣工做節點所需的各類組件。
  • 可靠性:同地域下,集羣的管理、工做節點可跨可用區部署,支持單集羣至少運行三臺雲主機做爲管理節點,同時基於京東雲高可用組隔離故障域,進一步加強了可靠性。
  • 功能性:基於京東雲SDN網絡,提供CNI網絡插件,依託京東雲私有網絡的高可用及可靠性,輕鬆適應不一樣規模生產環境的網絡需求;提供CRI存儲插件,集成京東云云硬盤,提供安全可靠的持久化存儲;集成京東雲負載均衡服務,提供安全、可靠的網絡訪問。
  • 性價比:京東雲Kubernetes集羣服務自己暫時免費,目前您只需爲集羣中建立的雲主機、公網IP、雲硬盤等雲資源按需付費。

1.2 京東雲Kubernetes部署架構

k8s培訓

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

2. 環境準備

2.1 建立AK、SK

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

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


至此AK、SK建立成功。瀏覽器

2.2 容器鏡像倉庫準備

選擇容器鏡像倉庫:安全

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

  1. 建立註冊表
  2. 建立倉庫

2.2.1 建立註冊表

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

2.2.2 建立鏡像倉庫

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

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

2.2.3 上傳Kubernetes-dashboard鏡像

此處須要建立一臺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併成功上傳至京東雲鏡像倉庫的截圖以下:

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

2.3 建立Kubernetes集羣

2.3.1 建立Kubernetes所需的基礎網絡

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

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

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

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

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

2.4 雲主機Kubernetes客戶端配置

在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

2.5 配置集羣憑證

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

mkdir -p ~/.kube && vi ~/.kube/config

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

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

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

參考幫助文檔連接:https://docs.jdcloud.com/cn/jcs-for-kubernetes/deploy-container-registry

3.1 建立具備時效性的secret

在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

須要注意以下參數的值:

  • 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所需的臨時密碼

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

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

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

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

4. 部署dashboard

在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:

5. 訪問dashboard

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

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

5.1 建立ServiceAccount

kubectl create serviceaccount dashboard-admin -n kube-system

5.2 綁定相關Role

kubectl create clusterrolebinding dashboard-cluster-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin

相關參數:

  • clusterrole:指定使用的集羣角色,系統默認自帶不少,建議指定。
  • serviceaccount:指定認證使用的ServiceAccount,由上一步建立。

5.3 獲取ServiceAccount使用的Secret

kubectl describe sa dashboard-admin -n kube-system

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

5.4 獲取Token

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

kubectl describe secrets -n kube-system dashboard-admin-token-wf2tj

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

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

→點擊瞭解更多京東雲K8s產品信息

歡迎點擊「連接」瞭解京東雲更多精彩

圖片描述
圖片描述

相關文章
相關標籤/搜索