干货 | 京东云托管Kubernetes集成镜像仓库并部署原生DashBoard

在上一篇“Cloud Native 实操系列”文章中,咱们为你们介绍了如何经过京东云原生容器实现Eureka的部署(👈可点击查看原文内容)。今天,咱们将为你们介绍京东云托管Kubernetes集成镜像仓库并部署原生DashBoard。node

 

随着Docker技术的发展和普遍流行,云原生应用和容器调度管理系统爆之也成为IT领域大热的词汇。事实上,云原生应用的思想,在Docker技术火前,已经由云计算技术的领导者和分布式系统架构的推广者普遍传播,例如云原生应用的12要素早在2011年就由Heroku的工程师提出了;只不过以虚拟机技术做为云原生应用的基础实施,因为虚拟机镜像大、镜像标准不统一以及打包流程和工具不统一,没法业界普遍接受的云原生应用标准,限制了云原生应用的流行。而Docker的出现正好解决了这些限制云原生应用构建、交付和运行的瓶颈,使得构建云原生应用成为了使用Docker的开发者天然而然的选择。linux

单机的Docker引擎和单一的容器镜像只能解决单一服务的打包和测试问题。而要运行生产级的企业级应用,就须要容器调度管理系统。在这里面,Docker技术就仿佛运送系统零件的集装箱,把云原生应用的各个标准化零件交付到各个企业的不一样码头,而容器调度管理系统就是企业应用的运行车间,把不一样的零件组装、运行、维护起来。docker

1. 京东云Kubernetes介绍

根据CNCF在2018年8月进行的第六次测量容器管理市场的温度,83%的受访者更喜欢Kubernetes的容器管理工具,58%的受访者在生产中使用Kubernetes,42%的受访者正在进行评估以备未来使用,40%的企业(员工规模在5000+)正在使用Kubernetes。Kubernetes在开发人员中已经变得很是流行。shell

京东云Kubernetes集群采用管理节点全托管的方式,为用户提供简单易用、高可靠、功能强大的容器管理服务。该产品彻底兼容标准Kubernetes API ,集成京东云网络、存储等插件。Kubernetes集群服务简化了Kubernetes部署、管理,下降了Kubernetes使用门槛,加强应用的可靠性,提高开发的效率,减小资源投入成本。express

1.1 产品优点

相较于传统自建Kubernetes集群,京东云Kubernetes集群服务有以下优点:apache

  • 易用性:在控制台一键式建立Kubernetes集群服务;管理节点采用全托管的方式,免除繁琐的部署、运维、升级等工做;提供工做节点定制镜像,预置集群工做节点所需的各类组件。
  • 可靠性:同地域下,集群的管理、工做节点可跨可用区部署,支持单集群至少运行三台云主机做为管理节点,同时基于京东云高可用组隔离故障域,进一步加强了可靠性。
  • 功能性:基于京东云SDN网络,提供CNI网络插件,依托京东云私有网络的高可用及可靠性,轻松适应不一样规模生产环境的网络需求;提供CRI存储插件,集成京东云云硬盘,提供安全可靠的持久化存储;集成京东云负载均衡服务,提供安全、可靠的网络访问。
  • 性价比:京东云Kubernetes集群服务自己暂时免费,目前您只需为集群中建立的云主机、公网IP、云硬盘等云资源按需付费。

1.2 京东云Kubernetes部署架构

k8s培训

k8s培训api

下面会演示京东云Kubernetes集成京东云镜像仓库,构建原生dashboard的最佳实践,但愿能起到抛砖引玉的做用。浏览器

2. 环境准备

2.1 建立AK、SK

登录京东云控制台后,点击帐号下拉菜单,选择Access Key管理。安全

点击建立,并输入相关手机号码。网络


至此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产品信息

欢迎点击“连接”了解京东云更多精彩内容

相关文章
相关标签/搜索