企业级运维之云原生与Kubernetes实战课程
第一章第7讲 实验一:从0开始创建云原生应用
视频地址:https://developer.aliyun.com/learning/course/913/detail/14601
摘要:本小节主要讲解从0开始创建云原生应用的实验部分,以及Pod的几种状态、Pod在宿主机上体现方式。
一、实验简介
将一个web应用进行容器化改造,制作好容器镜像,通过deployment部署到K8s,副本数为2,使用负载均衡类型的service把应用暴露到公网,通过公网访问到web应用。
实验目标:掌握容器镜像制作、deployment部署、service使用。该实验是“云原生与Kubernetes基础课程”的配套实验,实验前需熟悉上述理论概念,建议完成配套理论课程学习。
实验地址:https://developer.aliyun.com/adc/scenario/ea62728855c841e29536335b8954fd5a
二、实验步骤
1. 了解实验架构
实验之前需要理解相关理论概念,然后了解整体的实验架构。
2. 实验准备
注:后台已创建好了对应的云产品资源,这里仅核实环境和相关配置。
a. 核实后台已经创建好的阿里云托管版ACK集群,已经部署好了nginx-ingress-controller组件,已经部署好了logtail组件(默认勾选了“使用日志服务”, 选择创建了新的Project)。
b. 后台提供了一台本地机器(如centos7.6的服务器),现需要安装docker-ce,用于镜像制作。(可直接使用集群节点,省略安装docker步骤)
安装docker-ce具体步骤:
(1)添加docker-ce yum源,使用阿里云的mirror的docker-ce仓库
yum install -y yum-utils //扩展yum功能
yum-config-manager --add-
repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo //添加软件源信息
yum makecache //自动选择最快yum仓库源
(2)查看当前可以安装的docker-ce版本
yum list docker-ce --showduplicates | sort -r
yum -y install docker-ce-[VERSION] //安装指定版本的格式
yum install -y docker-ce-19.03.5-3.el7
(3)启动测试
systemctl start docker
docker info
docker version
c. 可使用ack里面的Cloud Shell进行连接以配置管理集群。
d. 保证开通了阿里云容器镜像服务,创建好了容器镜像服务的namespace和本地仓库。
具体操作可参考文档:https://help.aliyun.com/document_detail/198212.html
3. 拉取nginx基础镜像,创建一个静态index.html页面,编写dockerfile进行容器镜像制作。
a. 在有docker 环境的机器里,使用 docker pull nginx 命令拉取 nginx 镜像作为基础镜像。
b. 创建一个静态index.html 页面。
使用命令 mkdir -p /root/image_build_dir 创建一个用来构建镜像的目录;
cd /root/image_build_dir 进入目录;
使用命令:echo '
Hello Kubernetes !
' > index.html 创建一个静态页面。
c. 编写dockerfile 文件进行容器镜像制作。
使用vi命令创建一个Dockerfile 文件,注意大小写,保存并退出。内容如下:
执行命令制作容器镜像;
docker build -t web:latest . (注意最后有一个空格和英文句号 “.”,代表容器构建目录为当前目录。)
docker images|grep web
查看刚制作好的容器镜像,按照如下操作将本地镜像推送到容器镜像服务:
(1)登陆容器镜像服务 docker login --username=g****t registry.cn-hangzhou.aliyuncs.com
仓库密码可以在阿里云容器镜像服务控制台页面,实例列表->个人实例->访问凭证 设置固定密码。
(2)修改镜像tag标签 docker tag web:latest registry.cn-hangzhou.aliyuncs.com/mubin/zuorong:v1
(3)push镜像到容器镜像服务
docker push registry.cn-hangzhou.aliyuncs.com/mubin/zuorong:v1
注意:registry.cn-hangzhou.aliyuncs.com/mubin/zuorong:v1需要替换为从容器镜像服务控制台拿到的地址,参考下图:
4. 使用上述步骤获取的镜像来建应用和service。
在部署好kubectl机器上执行命令:kubectl create -f /root/test.yaml
/root/test.yaml内容如下,这个yaml内包含2个资源,一个是deployment应用,另一个是用来把应用暴露到公网的service,两个资源使用 --- 来分割。
如果之前步骤创建的仓库类型是私有,建议改为公开即可直接拉取镜像创建应用,否则还需要为应用创建仓库密钥才能正常拉取镜像。
具体步骤参考文档:
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
spec:
progressDeadlineSeconds: 600
replicas: 2
revisionHistoryLimit: 10
selector:
matchLabels:
app: web
version: v1
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
labels:
app: web
version: v1
spec:
containers:
- image: 'registry.cn-hangzhou.aliyuncs.com/mubin/zuorong:v1'
imagePullPolicy: IfNotPresent
name: web
ports:
- containerPort: 80
protocol: TCP
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
---
apiVersion: v1
kind: Service
metadata:
name: web-svc
spec:
externalTrafficPolicy: Local
ports:
- name: http-80
port: 80
protocol: TCP
targetPort: 80
selector:
app: web
sessionAffinity: None
type: LoadBalancer
5. 检查pod状态是否正常,测试通过负载均衡类型的service的slb ip+端口访问是否正常。
Kubectl get pod 查看web pod是否是running的;
Kubectl get svc 查看web-svc的扩展ip(下图的EXTERNAL-IP扩展ip),测试请求情况;
curl 扩展ip:80,或直接通过浏览器打开扩展ip地址来访问;
三、实验小结
登录云原生应用实验地址,创建资源,等待完成资源创建后,可以看到已创建好的云产品K8s资源、ECS云资源,可以ssh到K8s资源,按照实验手册进行安装docker环境,然后是拉取镜像、创建Deployment、创建服务。
通过dockerfile创建镜像,编写dockerfile文件,然后执行docker build命令创建镜像,执行docker push推送到在阿里平台创建的镜像仓库中,执行kubectl apply -f xxx.yaml(xxx为docker文件名),通过kubectl get pod命令可以查看到创建好了Pod应用,通过kubectl get svc查看对外暴露的IP地址,如果是Loadbalancer类型,可以通过浏览器访问测试该地址。
四、其他内容回顾
1. 容器在宿主机上的体现方式(pid,cgroup)
这种方式已在前面讲解过。
2. Pod怎么在宿主机上体现?(cgroup,kubelet)
- 登录K8s集群,执行kubectl get pod -o wide查看Pod所在的节点信息,然后ssh到该节点上,如果是lpvs集群可以通过lpvsadm -Ln命令查看转发规则。
- 在master节点上执行kubectl get pod xxx(Pod服务名) -o yaml,以yaml文件的方式输出Pod服务信息,可以查到Pod的uid,那么Pod在宿主机上如何体现呢?
- 登录该Pod所在的worker节点上,进入cgroup目录,查看cgroup目录下文件信息:
cd /sys/fs/cgroup/
ls -lrth
- 然后进入cpu目录,查看cpu下目录文件信息,可以看到文件kubepods.slice,进入该目录可以看到kubepods-burstable.slice和kubepods-besteffort.slice,进入kubepods-burstable.slice目录下可以看到在master节点上查到的Pod的uid,这是容器在宿主机上以cgroup的体现方式。
- 登录该Pod所在的worker节点上进入/var/lib/kubelet/pods目录可以看到在master节点上查到的Pod的uid,这是容器在宿主机上以kubelet的体现方式。
3. Pod的几种状态
- kill:被动的方式可能原因是node节点资源不足,网络中断等,也可能是主动方式被kill掉,比如更新deployment、更新镜像、主动调度等,假如某个节点上有3个deployment创建的Pod,现需要将3个Pod驱逐,会导致应用挂掉,而PDB可以限制Pod中断数量,来保障应用的高可用。
- Starting:Pod启动中。
- Evcited:Pod退出的状态。
五、阶段小结
1. 容器的基本概念、容器与K8s、虚拟机的区别,docker基本命令,容器在宿主机上的显示。
2. K8s基本模块,worker:kubelet、kube-proxy,master组件的作用及联系。
3. Controller类型及使用场景,SVC类型(iptables/ipvs)及区别,存储类型及使用方式。
4. Pod在宿主机的体现方式、Pod的几种状态。