前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >容器 & 服务:K8s 与 Docker 应用集群 (四)

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

原创
作者头像
程序员架构进阶
修改2021-03-09 14:24:17
7510
修改2021-03-09 14:24:17
举报
文章被收录于专栏:架构进阶架构进阶

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编排文件

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

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

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

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

2.5.3 生成的yaml输出到文件

代码语言:javascript
复制
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文件内容为:

代码语言:javascript
复制
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: web
  name: web
spec:
  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镜像

代码语言:javascript
复制
docker pull tomcat

3.1.2 编辑deployment.yaml

可直接下载deployment.yaml:

代码语言:javascript
复制
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: {}

3.1.3 编辑service.yaml

service.yaml

代码语言:javascript
复制
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

3.1.4  创建deployment

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

代码语言:javascript
复制
kubectl create -f deployment.yaml

3.1.5 创建service

代码语言:javascript
复制
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,旧版的内容如下:

代码语言:javascript
复制
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应用

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

执行:

代码语言:javascript
复制
kubectl create -f deployment.yamlkubectl create -f service.yaml
代码语言:javascript
复制
可以查看部署和service:
图片
图片
图片
图片

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

图片
图片

四 总结

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一 概述
  • 二 k8s编排文件
    • 2.1 YAML
      • 2.2 基本语法
        • 2.3 文件组成
          • 2.4 常用字段
            • 2.5 kubectl快速生成yaml
              • 2.5.1 创建一个nginx镜像应用,名为nginx
              • 2.5.2 kubectl生成yaml文件,并尝试运行:
              • 2.5.3 生成的yaml输出到文件
            • 2.6 文件示例
              • 3.1 tomcat示例
                • 3.1.1 拉取tomcat镜像
                • 3.1.2 编辑deployment.yaml
                • 3.1.5 创建service
                • 3.1.6 浏览器中访问
              • 3.2 总结
                • 3.2.1 概念回顾
                • 3.2.2 理解Pod、service、deployment关系
                • 3.2.3 部署步骤
              • 3.3 注意事项
              • 四 demo应用
              • 四 总结
              相关产品与服务
              容器服务
              腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档