百度智能云容器引擎cce基于kubernetes docker构建的弹性高可用的容器集群服务,您可以轻松地在采购的集群上部署所需的业务应用。
本文将以经典的前端应用guestbook为例,为您展示集群搭建、部署应用的全流程。让您能够使用百度智能云云容器引擎cce,快速构建一个最简单的web应用。
通用操作流程
guestbook搭建步骤
注册百度智能云账号,请参考注册百度账号,完成注册操作。
请根据自身情况,进行“企业认证”或者“个人认证”,具体请参考认证流程。
如果您在创建 cce 集群的时候仍未完成实名认证,你可以点击页面上的认证提示按钮到实名认证页面完成相关操作。
容器集群为一组由服务器构成的资源集合,同时包含了kubernetes的集群能力,您可以在集群之上构建高可用的业务应用,具体容器集群创建流程如下,详情可参考 创建集群。
登录百度智能云。
登录成功后,选择“产品服务>云容器引擎cce”,进入“集群列表”页面。
(可选)“集群列表”页面会显示所有已创建的cce集群名称/id、状态、地域等信息,并且用户可以通过集群名称进行搜索集群的操作。
(可选)选择区域,请根据实际需求进行选择切换。
集群为全局操作,用户可以根据需要选择不同的地区,如果您需要在多区域创建集群,请参考区域选择说明。
在不同区域创建的集群相互独立。
点击“创建集群”,进入“创建集群”界面,根据需要填写集群相关配置信息。
集群配置
配置说明:
- 每个区域默认配额为20个集群,每个集群默认配额为200个节点,如需更大配额,可提交工单。
- 集群名称暂不支持修改,请谨慎输入。用户可以自定义集群名称,自定义名称需遵守“字母、数字以及-_ /.等特殊字符,字母开头,长度1-64”的规则。
网络配置
节点配置
节点是构成集群的单一服务器资源,支持cpu、gpu多种类型可供选择,后续您创建的业务应用所需要的容器将会分布到各个节点上,构建高可用环境。
配置说明: 操作系统支持由百度智能云配置过的集成gpu驱动版系统,如果用户在自己的bcc中创建了gpu自定义镜像的话,镜像是支持gpu自定义镜像,用户如果使用自定义镜像需要手动设置集成gpu驱动。
6.点击“完成”后,系统在后台进行集群的创建。
7.点击链接“管理控制台”,进入“集群列表”界面,查看创建集群的状态,创建成功后该集群状态显示为“运行中”。
容器镜像服务ccr为用户提供专有的docker镜像存储空间,为容器运行的模板服务,支持使用用户自构建镜像、dockerhub、百度智能云镜像,来创建业务应用。详情可参考 容器镜像服务基本操作
首次进入镜像仓库,会弹出下图所示页面,按照要求填写用户名并设置密码。
注意:
用户名:镜像仓库用户名命名规则是:用户名由4-30个英文小写字母与数字组成。 密 码:是用户登录到docker镜像仓库的凭证。
填写新建空间名称并选择空间类型后点击确定完成命名空间的创建。
注意:
命名空间的命名规则为:小写字母、数字及. _ - 构成,开头与结尾必须为小写字母与数字,长度:1-65。
1.点击镜像列表页中新建按钮。
2.选择命名空间、填写镜像名称和版本号然后点击确定。
注意:
1.镜像名称和版本号的命名需遵守“小写字母、数字及. _ - 构成,开头与结尾必须为小写字母与数字,长度:1-65”的规则,且不支持中文。命名空间、镜像名称和版本号三者的名称加起来不能重复。 2.如果用户不选择新建镜像,在完成镜像推送到相应命名空间后,也会自动生成以上基本信息。
登录百度智能云镜像仓库
>$ sudo docker login --username=[username] hub.baidubce.com
username:镜像仓库名称,即是开通镜像仓库服务时填写的用户名。输入密码后完成登录。
上传镜像
$ sudo docker tag [imageid] hub.baidubce.com/[namespace]/[imagename]:[镜像版本号]
$ sudo docker push hub.baidubce.com/[namespace]/[imagename]:[镜像版本号]
kubernetes是谷歌开源的容器集群管理系统,是google多年大规模容器管理技术borg的开源版本,也是cncf最重要的项目之一,主要功能包括:
目前百度智能云容器服务基于kubernetes v1.8.6,如果用户需要从本地个人计算机连接到百度智能云的 kubernetes 集群,需要使用 kubernetes 命令行客户端kubectl,kubectl的安装步骤如下所示
从下载对应的 kubectl 客户端,关于kubectl 的其他信息,可以参见kubernetes官方。
注意: 下载kubectl之前,用户需要先登录自己的服务器使用指令
kubectl version
查看自己创建的集群的版本号,然后选择对应的kubectl版本进行下载。例如:用户的集群版本号为1.8,则需要下载的kubectl为1.8版。
创建集群之后,下载windows版本的kubectl工具,例如64位的工具如下:
注意: 下载kubectl之前,用户需要先登录自己的服务器使用指令
kubectl version
查看自己创建的集群的版本号,然后选择对应的kubectl版本进行下载。例如:用户的集群版本号为1.8,则需要下载的kubectl为1.8版。下载链接为,用户根据自己集群版本号,下载相应版本的工具。
下载之后,将其解压到任意目录,例如放在d盘下
在 目录c:\users\
下进入用户的文件夹,例如用户名为foo,则文件夹应该为c:\users\foo
,同时进入此目录,创建文件夹.kube
在集群列表页面,下载集群配置文件,放在上一步创建的.kube
文件夹中,并且重命名为config
打开windows命令行提示符
进入kubectl文件存放的目录,运行kubectl.exe get node
可以查看集群的节点。
1.解压下载后的文件,为kubectl添加执行权限,并放在path下
chmod x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl
2.配置kubectl,下载集群凭证。在集群界面下载集群配置文件,放在kubectl的默认配置路径
mv kubectl.conf ~/.kube/config
3.配置完成后,您即可以使用 kubectl 从本地计算机访问 kubernetes 集群
kubectl get node
kubernetes dashboard是基于web页面的图形化用户界面,支持用户部署业务、监控、管理业务应用。
在本地使用 kubernetes dashboard 前,用户需要先配置好kubectl,能通过kubectl连接百度智能云的 kubernetes 集群。
在本地通过kubectl工具,可以在kubernetes集群里创建一个dashboard应用,操作步骤如下所示。
首先在存放解压的kubectl.exe的同一个目录下,创建dashboard.yaml文件,例如可以用记事本创建:
对应的dashboard.yaml
文件为:
apiversion: apps/v1
kind: deployment
metadata:
labels:
app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kube-system
spec:
replicas: 1
selector:
matchlabels:
app: kubernetes-dashboard
template:
metadata:
labels:
app: kubernetes-dashboard
spec:
containers:
- name: kubernetes-dashboard
image: hub.baidubce.com/public/dashboard:v1.5.0-caas
imagepullpolicy: always
ports:
- containerport: 9090
protocol: tcp
volumemounts:
- name: "kubeconfig"
mountpath: "/etc/kubernetes/"
readonly: true
args:
- --kubeconfig=/etc/kubernetes/config
livenessprobe:
httpget:
path: /
port: 9090
initialdelayseconds: 30
timeoutseconds: 30
volumes:
- name: "kubeconfig"
hostpath:
path: "/root/.kube/"
---
kind: service
apiversion: v1
metadata:
labels:
app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kube-system
spec:
type: nodeport
ports:
- port: 80
targetport: 9090
selector:
app: kubernetes-dashboard
然后输入kubectl.exe create -f dashboard.yaml
创建dashboard
通过kubectl.exe get pod --all-namespaces
命令可以查看是否创建成功
输入kubectl.exe proxy
可以打开proxy,然后在浏览器中访问127.0.0.1:8001/ui
即可以访问dashboard
输入以下指令完成dashboard服务的创建
$ kubectl create -f dashboard.yaml
deployment "kubernetes-dashboard" created
service "kubernetes-dashboard" created
对应的dashboard.yaml文件为:
apiversion: apps/v1
kind: deployment
metadata:
labels:
app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kube-system
spec:
replicas: 1
selector:
matchlabels:
app: kubernetes-dashboard
template:
metadata:
labels:
app: kubernetes-dashboard
spec:
containers:
- name: kubernetes-dashboard
image: hub.baidubce.com/public/dashboard:v1.5.0-caas
imagepullpolicy: always
ports:
- containerport: 9090
protocol: tcp
volumemounts:
- name: "kubeconfig"
mountpath: "/etc/kubernetes/"
readonly: true
args:
- --kubeconfig=/etc/kubernetes/config
livenessprobe:
httpget:
path: /
port: 9090
initialdelayseconds: 30
timeoutseconds: 30
volumes:
- name: "kubeconfig"
hostpath:
path: "/root/.kube/"
---
kind: service
apiversion: v1
metadata:
labels:
app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kube-system
spec:
type: nodeport
ports:
- port: 80
targetport: 9090
selector:
app: kubernetes-dashboard
在创建好dashboard之后,使用kubectl proxy命令开启一个代理,连接到kubernetes api server。
kubectl proxy
成功开启代理后,可以在本地浏览器中访问,连接到dashboard。
注意:
localhost 是指的用户使用的本地机器,而不是虚拟机,且对应的ip地址为:127.0.0.1
本实践中的guestbook应用由两部分组成:
redis-master:用于前端web应用进行“写”留言操作的redis服务。
*注意: 本操作中所有的yaml文件,都和kubectl在同一目录下保存。
在master节点执行以下命令,将redis-master-deployment.yaml
文件发布到kubernetes集群中,完成redis-master的创建。
kubectl apply -f redis-master-deployment.yaml
对应的redis-master-deployment.yaml
文件为:
apiversion: apps/v1
kind: deployment
metadata:
name: redis-master
spec:
selector:
matchlabels:
app: redis
role: master
tier: backend
replicas: 1
template:
metadata:
labels:
app: redis
role: master
tier: backend
spec:
containers:
- name: master
image: hub.baidubce.com/public/guestbook-redis-master:e2e # or just image: redis
resources:
requests:
cpu: 100m
memory: 100mi
ports:
- containerport: 6379
创建好后,使用以下指令,验证pod是否正在运行:
kubectl get pods
答复应类似如下:
name ready status restarts age
redis-master-1068406935-3lswp 1/1 running 0 28s
当status的状态为:running表示 pod 正常运行。
服务为一组配置相同的容器以及如何访问他们的规则,即微服务架构中的部署单元,即是用户业务应用的最小运行单元。
输入以下指令,创建一个于redis-master pod关联的service。
kubectl apply -f redis-master-service.yaml
对应的redis-master-service.yaml
文件为:
apiversion: v1
kind: service
metadata:
name: redis-master
labels:
app: redis
role: master
tier: backend
spec:
ports:
- port: 6379
targetport: 6379
selector:
app: redis
role: master
tier: backend
注意: tarport属性,指定pod内容器应用监听的端口号。
完成之后通过以下指令验证redis master service是否正在运行:
kubectl get service
答复应该类似于:
name cluster-ip external-ip port(s) age
kubernetes 10.0.0.1 443/tcp 1m
redis-master 10.0.0.151 6379/tcp 8s
redis-slave:用于前端web应用进行“读”留言操作的redis服务,并与redis-master的数据保持同步。
将redis-slave-deployment.yaml
文件发布到kubernetes集群中,完成redis-slave的创建。
kubectl apply -f redis-slave-deployment.yaml
对应的redis-slave-deployment.yaml
文件为:
apiversion: apps/v1
kind: deployment
metadata:
name: redis-slave
spec:
selector:
matchlabels:
app: redis
role: slave
tier: backend
replicas: 2
template:
metadata:
labels:
app: redis
role: slave
tier: backend
spec:
containers:
- name: slave
image: hub.baidubce.com/public/guestbook-redis-slave:v1
resources:
requests:
cpu: 100m
memory: 100mi
env:
- name: get_hosts_from
value: dns
# using `get_hosts_from=dns` requires your cluster to
# provide a dns service. as of kubernetes 1.3, dns is a built-in
# service launched automatically. however, if the cluster you are using
# does not have a built-in dns service, you can instead
# instead access an environment variable to find the master
# service's host. to do so, comment out the 'value: dns' line above, and
# uncomment the line below:
# value: env
ports:
- containerport: 6379
完成上述操作后,执行以下代码查询pods列表以验证redis slave pods是否正在运行:
kubectl get pods
答复应该类似于:
name ready status restarts age
redis-master-1068406935-3lswp 1/1 running 0 1m
redis-slave-2005841000-fpvqc 1/1 running 0 6s
redis-slave-2005841000-phfv9 1/1 running 0 6s
输入以下指令启动redis-slave的两个副本,每个副本上的redis进行都与redis-master进行数据同步,与redis-master共同构成一个具有读写能力的redis集群。
kubectl apply -f redis-slave-service.yaml
对应的redis-slave-service.yaml
文件为:
apiversion: v1
kind: service
metadata:
name: redis-slave
labels:
app: redis
role: slave
tier: backend
spec:
ports:
- port: 6379
selector:
app: redis
role: slave
tier: backend
完成上述操作后,通过以下指令查询服务列表以验证redis slave service是否正在运行:
kubectl get services
答复应该类似于:
name cluster-ip external-ip port(s) age
kubernetes 10.0.0.1 443/tcp 2m
redis-master 10.0.0.151 6379/tcp 1m
redis-slave 10.0.0.223 6379/tcp 6s
将frontend-deployment.yaml
文件发布到kubernetes集群中,完成redis-slave的创建。
kubectl apply -f frontend-deployment.yaml
对应的frontend-deployment.yaml
文件为:
apiversion: apps/v1
kind: deployment
metadata:
name: frontend
spec:
selector:
matchlabels:
app: guestbook
tier: frontend
replicas: 3
template:
metadata:
labels:
app: guestbook
tier: frontend
spec:
containers:
- name: php-redis
image: hub.baidubce.com/public/guestbook-frontend:v4
resources:
requests:
cpu: 100m
memory: 100mi
env:
- name: get_hosts_from
value: dns
# using `get_hosts_from=dns` requires your cluster to
# provide a dns service. as of kubernetes 1.3, dns is a built-in
# service launched automatically. however, if the cluster you are using
# does not have a built-in dns service, you can instead
# instead access an environment variable to find the master
# service's host. to do so, comment out the 'value: dns' line above, and
# uncomment the line below:
# value: env
ports:
- containerport: 80
完成上述操作后,通过以下指令查询pods列表以验证三个前端副本是否正在运行:
kubectl get pods -l app=guestbook -l tier=frontend
答复应该类似于:
name ready status restarts age
frontend-3823415956-dsvc5 1/1 running 0 54s
frontend-3823415956-k22zn 1/1 running 0 54s
frontend-3823415956-w9gbt 1/1 running 0 54s
创建frontend service的目的是使用service的nodeport给kubernetes集群中的redis-master和redis-slave service映射一个外网可以访问的端口。
注意: 如果您使用百度智能云提供的负载均衡器,请注释type: nodeport,并取消注释type: loadbalancer。
输入以下指令完成frontend service的创建
kubectl apply -f frontend-service.yaml
对应的frontend-service.yaml
文件为:
apiversion: v1
kind: service
metadata:
name: frontend
labels:
app: guestbook
tier: frontend
spec:
# comment or delete the following line if you want to use a loadbalancer
type: loadbalancer
# if your cluster supports it, uncomment the following to automatically create
# an external load-balanced ip for the frontend service.
ports:
- port: 80
selector:
app: guestbook
tier: frontend
完成上述操作后,通过以下代码查询服务列表以验证前端服务是否正在运行:
kubectl get services
答复应该类似于:
name cluster-ip external-ip port(s) age
frontend 10.0.0.112 80:32372/tcp 6s
kubernetes 10.0.0.1 443/tcp 4m
redis-master 10.0.0.151 6379/tcp 2m
redis-slave 10.0.0.223 6379/tcp 1m
运行以下命令获取frontend serviceip地址。
kubectl get service frontend
答复应该类似于:
name cluster-ip external-ip port(s) age
frontend 10.0.0.112 180.76.174.157 80:32372/tcp 1m
复制外部ip地址,并在浏览器中加载页面以查看您的guestbook。
如果用户已经有注册过的域名,则可以直接进行下一步绑定域名,如果没有域名,则可以参考域名购买
登录管理控制台,进入
选择需要绑定frontend service的外网ip的域名,点击操作栏中的解析。
在弹出的添加解析菜单栏中,记录类型选择a记录类,记录值填写frontend service的外网ip。
用域名访问服务,结果如下图所示: