写点什么

容器 & 服务:K8s 与 Docker 应用集群 (四)

发布于: 2021 年 03 月 08 日
容器 & 服务:K8s 与 Docker 应用集群 (四)

系列文章:

容器 & 服务:开篇,压力与资源

容器 & 服务:Jenkins 本地及 docker 安装部署

容器 & 服务:Jenkins 构建实例

容器 & 服务:一个 Java 应用的 Docker 构建实战

容器 & 服务:Docker 应用的 Jenkins 构建

容器 & 服务:Docker 应用的 Jenkins 构建 (二)

容器 & 服务:K8s 与 Docker 应用集群 (一)

容器 & 服务:K8s 与 Docker 应用集群 (二)



关注公众号:程序员架构进阶,获取更多资料。


一 概述

容器 & 服务:K8s 与 Docker 应用集群 (二)中使用 k8s 部署了 demo 应用,但对 k8s 的很多概念并没有深入了解,而且也并没有使用到编排文件。本篇将尝试使用 YAML 创建 deployment 和 service 配置文件,并用它们来进行部署。

二 k8s 编排文件

2.1 YAML

k8s 集群中对资源管理和资源对象编排部署都可以通过声明样式(YAML)文件来解决,也就是可以把需要对资源对象操作编辑到 YAML 格式文件中,我们把这种文件叫做资源清单文件,通过 kubectl 命令直接使用资源清单文件就可以实现对大量的资源对象进行编排部署。

YAML 仍是一种标记语言。为了强调这种语言以数据做为中心,而不是以标记语言为重点。 YAML 是一个可读性高,用来表达数据序列的格式。

2.2 基本语法

  • 使用空格做为缩进

  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可

  • 一般开头缩进俩空格;字符串后缩进一个空格,比如冒号、逗号后边

  • 使用 — 表示新的 yaml 文件的开始

  • 使用 #标识注释,从这个字符一直到行尾,都会被解释器忽略

2.3 文件组成

通常,YAML 由控制器定义, 和 被控制对象两部分组成。

2.4 常用字段

apiVersion //API 版本

kind //资源类型

metadata //资源元数据

spec //资源规格

replicas //副本数量

selector //标签选择器

template //pod 模板

metadata //pod 元数据

sepc //pod 规格

containers //容器配置

2.5 kubectl 快速生成 yaml

2.5.1 创建一个 nginx 镜像应用,名为 nginx

//创建一个资源名称为“web”的deploymentkubectl create deployment nginx --image=nginx
复制代码

2.5.2 kubectl 生成 yaml 文件,并尝试运行:

kubectl create deployment nginx --image=nginx -o yaml --dry-run=client
复制代码

2.5.3 生成的 yaml 输出到文件

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 取代。

2.6 文件示例

上面生成的 yaml 文件内容为:

apiVersion: apps/v1kind: Deploymentmetadata:  creationTimestamp: null  labels:    app: web  name: webspec:  replicas: 1  selector:    matchLabels:      app: web  strategy: {}  template:    metadata:      creationTimestamp: null      labels:        app: web    spec:      containers:      - image: nginx        name: nginx        resources: {}status: {}
复制代码


三 示例

3.1 tomcat 示例


3.1.1 拉取 tomcat 镜像

docker pull tomcat
复制代码

3.1.2 编辑 deployment.yaml

可直接下载deployment.yaml:

apiVersion: apps/v1kind: Deploymentmetadata:  creationTimestamp: null  labels:    app: k8s-tomcat  name: k8s-tomcatspec:  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: {}
复制代码


3.1.3 编辑 service.yaml

service.yaml

apiVersion: v1kind: Servicemetadata:  name: k8s-tomcatspec:   ports:   - name: k8s-tomcat     port: 8080     targetPort: 8080     nodePort: 30101   selector:     app: k8s-tomcat   type: NodePort
复制代码

3.1.4 ​ 创建 deployment

在 deployment.yaml 文件所在目录,执行:

kubectl create -f deployment.yaml
复制代码

3.1.5 创建 service

kubectl create -f service.yaml
复制代码

3.1.6 浏览器中访问


等 pod 状态为 ready 之后,浏览器中通过 nodePort 端口 30101 访问:


3.2 总结

3.2.1 概念回顾

回顾一下 k8s 中的几个关键概念:

pod : 最小执行调度单元

Deployment: 部署无状态应用

Daemonset: 部署守护应用

Cronjob: 部署定时任务

job: 部署定时任务

statefulset: 部署有状态应用

service ,endpoint, ingress:服务类型

3.2.2 理解 Pod、service、deployment 关系

1)pod 是什么?

pod 是 kubernetes 调度的基本单元,它组织了一个或多个容器,可以理解为容器的载体。

2)deployment

我们有了镜像,镜像的运行时是容器,k8s 里面容器以 pod 的形式运行,deployment 是用来创建 pod 的。

3)service 是用来干什么的?

k8s 中 service 是用来访问 pod 的,由于 pod 可能被重启,重启之后 ip 就变了,而 service 具有名字,可以通过名字来访问 service 代表的 pod。

3.2.3 部署步骤

1)拉取镜像(假设已有镜像,从公共或私有的镜像仓库中拉取)

2)编写 kubernetes 的 deployment 文件,将镜像部署成为 pod

3)编写 kubernetes 的 service 文件,创建 pod 的服务,并对外暴露端口

3.3 注意事项

不同的 kubectl 版本之间,使用相同 yaml 执行的结果可能不同。目前使用的 k8s 版本是 v1.19.3,对应 docker 版本为 3.1.0(为什么版本变了?别问,问就是手欠点了更新。。。)。

tomcat 示例中的 deployment.yaml,旧版的内容如下:

apiVersion: extensions/v1beta1kind: Deploymentmetadata:  name: k8s-tomcatspec:  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 应用

基于上面的理解和 demo,我们在上面的两个文件的基础上稍作调整就可以了。参考 示例代码,里面的deployment.yamlservice.yaml

执行:

kubectl create -f deployment.yaml
kubectl create -f service.yaml
复制代码

可以查看部署和 service:


通过 localhost 和 30105 端口在浏览器中访问,看到我们期待的结果:

四 总结

本篇继续完善 demo,通过 k8s 部署示例过程,继续分析可能遇到的问题,以及 k8s 中涉及的概念和组件。后面将会再此基础上分析部署过程,并在 demo 代码中增加服务化相关框架和功能。


发布于: 2021 年 03 月 08 日阅读数: 22
用户头像

磨炼中成长,痛苦中前行 2017.10.22 加入

微信公众号【程序员架构进阶】。多年项目实践,架构设计经验。曲折中向前,分享经验和教训

评论

发布
暂无评论
容器 & 服务:K8s 与 Docker 应用集群 (四)