公众号文章链接:https://mp.weixin.qq.com/s/LbHI2tHi_eOkuSgSROh3ng
系列文章:
容器 & 服务:开篇,压力与资源
容器 & 服务:Jenkins 本地及 docker 安装部署
容器 & 服务:Jenkins 构建实例
容器 & 服务:一个 Java 应用的 Docker 构建实战
容器 & 服务:Docker 应用的 Jenkins 构建
容器 & 服务:Docker 应用的 Jenkins 构建 (二)
容器 & 服务:K8s 与 Docker 应用集群 (一)
容器 & 服务:K8s 与 Docker 应用集群 (二)
关注公众号:程序员架构进阶,获取更多资料。
容器 & 服务:K8s 与 Docker 应用集群 (二)中使用k8s部署了demo应用,但对k8s的很多概念并没有深入了解,而且也并没有使用到编排文件。本篇将尝试使用YAML创建deployment 和 service配置文件,并用它们来进行部署。
k8s集群中对资源管理和资源对象编排部署都可以通过声明样式(YAML)文件来解决,也就是可以把需要对资源对象操作编辑到 YAML 格式文件中,我们把这种文件叫做资源清单文件,通过 kubectl 命令直接使用资源清单文件就可以实现对大量的资源对象进行编排部署。
YAML仍是一种标记语言。为了强调这种语言以数据做为中心,而不是以标记语言为重点。 YAML 是一个可读性高,用来表达数据序列的格式。
使用空格做为缩进
缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
一般开头缩进俩空格;字符串后缩进一个空格,比如冒号、逗号后边
使用 — 表示新的yaml文件的开始
使用#标识注释,从这个字符一直到行尾,都会被解释器忽略
通常,YAML由控制器定义, 和 被控制对象两部分组成。
apiVersion //API版本
kind //资源类型
metadata //资源元数据
spec //资源规格
replicas //副本数量
selector //标签选择器
template //pod模板
metadata //pod元数据
sepc //pod规格
containers //容器配置
//创建一个资源名称为“web”的deployment
kubectl create deployment nginx --image=nginx
kubectl create deployment nginx --image=nginx -o yaml --dry-run=client
kubectl create deployment web --image=nginx -o yaml --dry-run=client > k8s-nginx.yaml
注:有些较久的文章中可能是使用kubectl create deployment nginx --image=nginx -o yaml --dry-run命令,不过在kubectl新版本中,如果执行这条命令,会给出如下提示:
即--dry-run 参数已经被--dry-run=client取代。
上面生成的yaml文件内容为:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: k8s-tomcat
spec:
replicas: 1
template:
metadata:
labels:
app: k8s-tomcat
spec:
containers:
- name: k8s-tomcat
image: daocloud.io/library/tomcat:6.0-jre7
docker pull tomcat
可直接下载deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: k8s-tomcat
name: k8s-tomcat
spec:
replicas: 1
selector:
matchLabels:
app: k8s-tomcat
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: k8s-tomcat
spec:
containers:
- image: daocloud.io/library/tomcat:6.0-jre7
name: k8s-tomcat
resources: {}
status: {}
service.yaml
apiVersion: v1
kind: Service
metadata:
name: k8s-tomcat
spec:
ports:
- name: k8s-tomcat
port: 8080
targetPort: 8080
nodePort: 30101
selector:
app: k8s-tomcat
type: NodePort
在deployment.yaml文件所在目录,执行:
kubectl create -f deployment.yaml
kubectl create -f service.yaml
等pod状态为ready之后,浏览器中通过nodePort端口30101访问:
回顾一下k8s中的几个关键概念:
pod : 最小执行调度单元
Deployment: 部署无状态应用
Daemonset: 部署守护应用
Cronjob: 部署定时任务
job: 部署定时任务
statefulset: 部署有状态应用
service ,endpoint, ingress:服务类型
1)pod是什么?
pod是kubernetes调度的基本单元,它组织了一个或多个容器,可以理解为容器的载体。
2)deployment
我们有了镜像,镜像的运行时是容器,k8s里面容器以pod的形式运行,deployment是用来创建pod的。
3)service是用来干什么的?
k8s中service是用来访问pod的,由于pod可能被重启,重启之后ip就变了,而service具有名字,可以通过名字来访问service代表的pod。
1)拉取镜像(假设已有镜像,从公共或私有的镜像仓库中拉取)
2)编写kubernetes的deployment文件,将镜像部署成为pod
3)编写kubernetes的service文件,创建pod的服务,并对外暴露端口
不同的kubectl版本之间,使用相同yaml执行的结果可能不同。目前使用的k8s版本是 v1.19.3,对应docker版本为3.1.0(为什么版本变了?别问,问就是手欠点了更新。。。)。
tomcat示例中的deployment.yaml,旧版的内容如下:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: k8s-tomcat
spec:
replicas: 1
template:
metadata:
labels:
app: k8s-tomcat
spec:
containers:
- name: k8s-tomcat
image: daocloud.io/library/tomcat:6.0-jre7
但在当前版本下,执行会报如下错误:
我们把apiVersion后的内容改为apps/v1,再次执行:
依然报错,从错误信息可知,spec下要求必须配置selector属性。
为了更清晰地看到配置的差异,diff结果如下:
基于上面的理解和demo,我们在上面的两个文件的基础上稍作调整就可以了。参考 示例代码,里面的deployment.yaml 和 service.yaml
执行:
kubectl create -f deployment.yaml
kubectl create -f service.yaml
可以查看部署和service:
通过localhost 和 30105端口在浏览器中访问,看到我们期待的结果:
本篇继续完善demo,通过k8s部署示例过程,继续分析可能遇到的问题,以及k8s中涉及的概念和组件。后面将会再此基础上分析部署过程,并在demo代码中增加服务化相关框架和功能。