阿里云「飞天发布时刻」2024来啦!新产品、新特性、新能力、新方案,等你来探~ 了解详情
写点什么

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

  • 2019-10-30
  • 本文字数:8140 字

    阅读完需:约 27 分钟

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

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

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

1. 京东云 Kubernetes 介绍

Kubernetes 是为生产环境而设计的容器调度管理系统,对于负载均衡、服务发现、高可用、滚动升级、自动伸缩等容器云平台的功能要求有原生支持。由于 Kubernetes 在 K 和 s 间有 8 个字母,因此常简称 K8s。

事实上,随着对 K8s 系统架构与设计理念的了解深入,我们会发现 K8s 系统正是处处为运行云原生应用而设计考虑;同时,随着对 K8s 系统使用的加深和加广,也会有越来越多有关云原生应用的设计模式产生出来,使得基于 K8s 系统设计和开发生产级的复杂云原生应用变得像启动一个单机版容器服务那样简单易用。

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


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

1.1 产品优势

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


  • 易用性:在控制台一键式创建 Kubernetes 集群服务;管理节点采用全托管的方式,免除繁琐的部署、运维、升级等工作;提供工作节点定制镜像,预置集群工作节点所需的各种组件。

  • 可靠性:同地域下,集群的管理、工作节点可跨可用区部署,支持单集群至少运行三台云主机作为管理节点,同时基于京东云高可用组隔离故障域,进一步增强了可靠性。

  • 功能性:基于京东云 SDN 网络,提供 CNI 网络插件,依托京东云私有网络的高可用及可靠性,轻松适应不同规模生产环境的网络需求;提供 CRI 存储插件,集成京东云云硬盘,提供安全可靠的持久化存储;集成京东云负载均衡服务,提供安全、可靠的网络访问。

  • 性价比:京东云 Kubernetes 集群服务本身暂时免费,目前您只需为集群中创建的云主机、公网 IP、云硬盘等云资源按需付费。

1.2 京东云 Kubernetes 部署架构


k8s 培训

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 工具:


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 并成功上传至京东云镜像仓库的截图如下:



在控制台可以验证到已成功上传:


2.3 创建 Kubernetes 集群

2.3.1 创建 Kubernetes 所需的基础网络

首先创建 VPC:控制台–>网络–>私有网络(VPC)



划分子网:控制台–>网络–>子网



创建 Kubernetes 集群,控制台–>弹性计算–>Kubernetes 集群


注意需要选择 AK,修改 node 节点的 CIDR,避免与集群中的 service、pod 冲突。




点击确认后,等待若干分钟,集群创建成功,目前支持的版本为 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 集群名称。




将文本框中的内容保存至~/.kube/config 文件中。然后执行 kubectl version 命令,显示如下信息表示连接成功:


3. Kubernetes 集群集成京东云镜像仓库

参考帮助文档链接

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 所需的临时密码

在镜像仓库中选择注册表,点击获取临时令牌:



红框中标识的内容即临时密码。


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: 412      template:13        spec:14          serviceAccountName: default15          terminationGracePeriodSeconds: 016          restartPolicy: Never17          hostNetwork: true18          containers:19          - name: jcr-token-refresher20            imagePullPolicy: Always21            image: jdcloudcli/jdcloud-cli:latest22            command:23            - "/bin/sh"24            - "-c"25            - |26              ##REGISTRY_NAME变量需要修改为你的的镜像仓库注册表的名称27              REGISTRY_NAME=XXX28              ##JCR_REGION变量需要修改为你的镜像仓库所在的region29              JCR_REGION=cn-north-130              DOCKER_REGISTRY_SERVER=https://${REGISTRY_NAME}-${JCR_REGION}.jcr.service.jdcloud.com31              DOCKER_USER=jdcloud32              ##JDCLOUD_ACCESS_KEY和JDCLOUD_SECRET_KEY需要修改为你的pin的AK、SK的值33              JDCLOUD_ACCESS_KEY=xxxxxxxxxxxxxx34              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" ]; then38                  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 || true45              echo "0:"$PRECHECK46              echo "1:"$DOCKER_REGISTRY_SERVER47              echo "2:"$DOCKER_USER48              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.com64              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:



稍等 1 分钟左右再查看,可以看到 LB 已绑定公网 IP:



查看所有 namespace 的 pod,可以看到已成功 pull:


5. 访问 dashboard

使用 Chrome 或者 Firefox 浏览器访问 service 所绑定的公网 IP 以及对应端口,本次实验中访问,会看到如下信息:



本次访问我们使用令牌访问全部权限。认证时的账号必须为 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
复制代码



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

5.4 获取 Token

执行 shell 命令查看对应 secret 相关信息:


1kubectl describe secrets -n kube-system dashboard-admin-token-wf2tj
复制代码


下图中获取到的 token 即访问凭证。



将其复制粘贴到浏览器中即可登录成功:




2019-10-30 17:591003

评论

发布
暂无评论
发现更多内容

DBeaver Ultimate注册激活版下载(数据库管理软件)

影影绰绰一往直前

DBeaver下载 DBeaver注册版 DBeaver激活版

报名开启!飞桨AI for Science公开课与共创计划邀您来学,探索AI与科学的融合

飞桨PaddlePaddle

人工智能 AI for Science

新手必看:Bitget Wallet 上购买 ETH 的步骤解析

鳄鱼视界

公链开发技术团队 如何设计一个稳定、高效的公链系统架构?

西安链酷科技

DAPP系统开发 区块链浏览器开发 区块链技术公司

dapp软件定制开发公司 DApp开发步骤全解析

西安链酷科技

DAPP系统开发 dapp开发

《用友企业绩效管理白皮书》要点解读之整合计划

用友BIP

企业绩效管理

适用于即席查询(Ad-Hoc)的OLAP引擎

Western Panda

数据库 大数据 开源 数据分析 OLAP

模拟ASP.NET Core MVC设计与实现

EquatorCoco

ASP.NET Core 框架 教程分享

小红书万亿级社交网络关系下的图存储系统的架构设计与实践

JackJiang

网络编程 即时通讯 IM

另辟蹊径者 PoseiSwap:背靠潜力叙事,构建 DeFi 理想国

大瞿科技

对话在行人|安恒信息:通过企业数智化建设实现主营业务100%增长

用友BIP

数智化领先实践

Capture One 23 Enterprise for Mac(RAW图像编辑软件) 企业版 16.3.1.23永久激活版

mac

windows 图像处理软件 苹果mac Capture One 23

IDO私募预售平台软件系统开发

西安链酷科技

IDO代币预售

区块链技术投入公链开发,涨知识了 公链开发团队

西安链酷科技

公链开发 公链团队

开发一个dapp需要多少钱?具体设计那些费用?

西安链酷科技

DAPP系统开发

重磅!百度知识增强大语言模型关键技术荣获“2023世界互联网大会领先科技奖”

飞桨PaddlePaddle

百度 互联网大会 大语言模型

链游开发DAPP智能合约开发搭建

西安链酷科技

DAPP系统开发

All in数字化!这场大会重新定义建筑行业人才模式

用友BIP

人力资源

区块链底层公链开发 公链开发团队

西安链酷科技

公链开发 节点搭建

BI 数据可视化平台建设(1)—交叉表组件演变实战

vivo互联网技术

架构演进 BI可视化 表格组件 交叉表

Dapp技术开发到底需要花多少钱?

西安链酷科技

区块链 dapp开发

搭建一个dapp钱包要多少钱

西安链酷科技

软件开发 区块链系统开发 区块链软件搭建

PostgreSQL 技术内幕(十一)位图扫描

酷克数据HashData

如何选择一个向量数据库|Qdrant Cloud v.s. Zilliz Cloud

Zilliz

Milvus Zilliz zillizcloud qdrant

昇腾CANN DVPP硬件加速训练数据预处理,友好解决Host CPU预处理瓶

华为云开发者联盟

人工智能 华为云 昇腾CANN 华为云开发者联盟

KeyShot Pro 2023中文特别版下载(3D渲染和动画制作)

影影绰绰一往直前

KeyShot Pro2023 KeyShot Pro下载 KeyShot Pro破解版

链游开发外包公司

西安链酷科技

区块链游戏 gamefi 链游开发 游戏链改

新华冶金∣打造业财深度一体化运营模式

用友BIP

有关java设置图片DPI

夜的第七章

base64 图片处理 Java’

Dapp开发的技术原理和设计方案

西安链酷科技

DAPP系统开发

王文京:中国智能会计将引领全球会计创新

用友BIP

智能会计

京东云托管Kubernetes集成镜像仓库并部署原生DashBoard_架构_成晨_InfoQ精选文章