阿里、蚂蚁、晟腾、中科加禾精彩分享 AI 基础设施洞见,现购票可享受 9 折优惠 |AICon 了解详情
写点什么

京东云托管 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:591000

评论

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

重读《重构2》- 改变函数声明

顿晓

重构 4月日更

阿里内部热捧“Spring全线笔记”,不止是全家桶,太完整了

Java架构追梦

Java spring 源码 架构 微服务

Vue3、Vuex4、Ant Design2的实战项目开发管理系统

devpoint

vite Vue3 and design of vue

专访中寰卫星导航项目管理部负责人卜钢:如何演绎人生之路

打工人!

采访 调查采访能力考核

从被踢出局到5个30K+的offer,一路坎坷走来,沉下心,何尝不是前程万里

北游学Java

Java 数据库 分布式 微服务

一个极简的冲突管理工具

石云升

28天写作 职场经验 管理经验 4月日更 冲突管理

函数计算助力高德地图平稳支撑亿级流量高峰

阿里巴巴中间件

怎么拥有个人磁力

帅安技术

IP 个人磁力 KOL 思想 吸引力法则

1分钟搞定 Nginx 版本的平滑升级与回滚

民工哥

nginx 后端 linux运维

学会这15点,让你分分钟拿下Redis数据库

民工哥

后端 linux运维 redis cluster

中国数字人民币试点有序扩大至“10+1” 拜登政府正加强研究数字人民币计划

CECBC

数字货币

json基础学习

ベ布小禅

4月日更

智慧城市现状调研

程序员架构进阶

华为 智慧城市 28天写作 4月日更

隐私安全的城池营垒,能成为手机品牌高端化的赛点吗?

脑极体

接口的幂等性怎么设计?

xcbeyond

设计 幂等性 4月日更

函数计算助力语雀构建稳定且安全的业务架构

阿里巴巴中间件

文档 企业架构和云服务 业务架构

曾国藩:人生惟有常是第一美德

帅安技术

曾国藩 坚持 有常 天赋 成事心法

聊聊十种常见的软件架构模式

架构精进之路

4月日更

不想搞Java了,4年经验去面试10分钟结束,现在Java面试为何这么难

Java 编程 程序员 面试 计算机

云存储中不可不知的五个安全问题及应对措施

浪潮云

云计算

金融科技数据链的DNA

博睿数据

金融科技 博睿数据 数据链DNA

不愧是阿里内部“Spring Cloud Alibaba学习笔记”这细节讲解,神了!

Java架构追梦

Java 阿里巴巴 架构 微服务 SpringCloud

计算机原理学习笔记 Day6

穿过生命散发芬芳

计算机原理 4月日更

云原生技术及可观测实践

滴滴云

浅谈 MySQL 集群高可用架构

民工哥

MySQL MySQL 高可用 集群 linux运维

mosquitto支持websocket搭建记录

风翱

4月日更 web socket mosquitto

Coinbase上市,对加密市场将带来哪些影响?

CECBC

货币

你管这破玩意叫哨兵?

Java 数据库 redis 程序员 架构

2年进入苏宁,第5年入职阿里,专科学历的他是如何做到?

Java架构师迁哥

使用JavaScript解析XML文件

空城机

JavaScript xml 大前端 递归 4月日更

我常用的两个外国应用

彭宏豪95

产品 产品经理 工具 社交 Slack

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