Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >容器 & 服务:K8s 与 Docker 应用集群 (四)

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

原创
作者头像
程序员架构进阶
修改于 2021-03-09 06:24:17
修改于 2021-03-09 06:24:17
87800
代码可运行
举报
文章被收录于专栏:架构进阶架构进阶
运行总次数:0
代码可运行

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
代码运行次数:0
运行
AI代码解释
复制
//创建一个资源名称为“web”的deployment
kubectl create deployment nginx --image=nginx

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl create deployment nginx --image=nginx -o yaml --dry-run=client

2.5.3 生成的yaml输出到文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
docker pull tomcat

3.1.2 编辑deployment.yaml

可直接下载deployment.yaml:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
kubectl create -f deployment.yaml

3.1.5 创建service

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
kubectl create -f deployment.yamlkubectl create -f service.yaml
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
可以查看部署和service:

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

四 总结

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

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
k8s实战之部署PHP/Java网站
对k8s刚入门的朋友而言,光搭建k8s集群是不够的,我们需要更多的理论加实战,才能更好的掌握k8s的好处,当我们成功部署一个k8s集群之后,我们需要在实际项目中进行应用,本文简单的介绍了当前比较主流的PHP/Java网站的部署
没有故事的陈师傅
2019/09/25
6.3K1
k8s实战之部署PHP/Java网站
k8s的Helm
● kubernetes上的应用对象,都是由特定的资源描述组成,包括Deployment、Service等,都保存在各自文件中或者集中写在一个配置文件,然后通过kubectl apply -f 部署。如果应用只由一个或几个这样的服务组成,上面的部署方式就足够了。但是对于一个复杂的应用,会有很多类似上面的资源描述文件,例如微服务架构应用,组成应用的服务可能多达几十、上百个,如果有更新或回滚应用的需求,可能要修改和维护所涉及到大量的资源文件,而这种组织和管理应用的方式就显得力不从心了。并且由于缺少对发布过的应用进行版本管理和控制,使得kubernetes上的应用维护和更新面临诸多的挑战,主要面临以下的问题:
大忽悠爱学习
2022/09/28
2.3K0
k8s的Helm
kubernetes(十三) k8s 业务上线流程(手动版)
外网用户加入k8s任意集群节点的ip:java.cropy.cn 到hosts完成解析,就可以使用域名访问了
alexhuiwang
2020/09/23
1.7K0
kubernetes(十三) k8s 业务上线流程(手动版)
Kubernete-Helm包管理工具
Helm是一个Kubernetes的包管理工具,就像Linux下的包管理工具,可以很方便的将之前打包好的yaml文件部署到Kubernetes上.
Yuou
2022/09/26
3300
容器 & 服务: k8s的扩容与自动扩容
首发:https://mp.weixin.qq.com/s/eWwT1xBvnqvmHMXTVZ7KUA
程序员架构进阶
2021/04/28
7.2K0
容器 & 服务: k8s的扩容与自动扩容
05 . k8s实战之部署PHP/JAVA网站
https://www.cnblogs.com/you-men/p/13121835.html
iginkgo18
2020/09/27
1.3K0
05 . k8s实战之部署PHP/JAVA网站
九、k8s之helm及其它功能性组件
在没使用helm之前,向kubernetes部署应用,我们要依次部署deployment,service,configMap等,步骤较繁琐。况且随着很多项目微服务化,复杂的应用在容器中部署以及管理显得较为复杂.
阿dai学长
2020/10/26
1.1K0
九、k8s之helm及其它功能性组件
【云原生 | Kubernetes篇】深入Kubernetes(k8s)概念(四)
可以使用 kubectl 命令行创建对象,也可以编写 .yaml 格式的文件进行创建
Lansonli
2022/06/07
1.3K0
【云原生 | Kubernetes篇】深入Kubernetes(k8s)概念(四)
不背锅运维:一文搞清楚应用发布到k8s集群的基本流程
下面演示通过get命令来得到yaml文件,使用-o来指定yaml的格式输出,其他资源也是这个套路
不背锅运维
2023/01/26
8251
不背锅运维:一文搞清楚应用发布到k8s集群的基本流程
kubernetes(十七) Helm V3 入门到放弃
K8S上的应用对象,都是由特定的资源描述组成,包括deployment、service等。都保存各自文件中或者集中写到一个配置文件。然后kubectl apply –f 部署。
alexhuiwang
2020/09/23
4.5K0
kubernetes(十七) Helm V3 入门到放弃
k8s的YAML与集群访问
查看服务详情 kubectl describe svc test-k8s ,可以发现 Endpoints 是各个 Pod 的 IP,也就是他会把流量转发到这些节点。
爽朗地狮子
2022/09/22
6750
K8S基础搭建使用
由上可见,需要本地镜像仓库需要 pod-infrastructure:latest 这个 pod 基础镜像,所以需要在拉取镜像 docker pull tianyebj/pod-infrastructure,并且 push 到本地镜像仓库
cuijianzhe
2022/06/14
5830
K8S基础搭建使用
干货满满,从一个案例学习k8s基本架构
Kubernetes(简称K8S,K和S之间有8个字母)是用于自动部署,扩展和管理容器化应用程序的开源系统。它将组成应用程序的容器组合成逻辑单元,以便于管理和服务发现。Kubernetes 源自Google15年的生产环境的运维经验,同时凝聚了社区的最佳创意和实践。
Java程序猿阿谷
2021/03/02
9800
干货满满,从一个案例学习k8s基本架构
Helm
​在没使用 helm 之前,向 kubernetes 部署应用,我们要依次部署 deployment、svc 等,步骤较繁琐。况且随着很多项目微服务化,复杂的应用在容器中部署以及管理显得较为复杂,helm 通过打包的方式,支持发布的版本管理和控制,很大程度上简化了 Kubernetes 应用的部署和管理。
星哥玩云
2022/09/15
9080
Helm
K8s 简单上手
上面的命令就是基于指定的 image,创建一个名为 webserver 的 pod。运行过后,用 kubectl get pods 能够看到当前 namespace 下的所有 pod 的信息
SimpleMaxR
2024/09/30
1650
【云原生】容器服务(K8s版)使用 Kubectl 部署 web 服务到 K8s 集群
使用 K8s 的原生命令 kubectl部署一个web应用的镜像到 k8s 集群中,并通过 Ingress 将部署的服务暴露出来由外部访问。
共饮一杯无
2022/11/28
1K0
【云原生】容器服务(K8s版)使用 Kubectl 部署 web 服务到 K8s 集群
Helm使用自定义Chart模板来部署k8s应用
它本质上就是一个Go的template模板。Helm在Go template模板的基础上,还会增加很多东西。如一些自定义的元数据信息、扩展的库以及一些类似于编程形式的工作流,例如条件语句、管道等等。这些东西都会使得我们的模板变得更加丰富。
王先森sec
2023/04/24
4.9K0
使用Kustomize管理K8S的YAML清单
将应用部署到Kubernetes中的方式有很多,目前主流是就是使用kubectl和Helm,不过其先决条件都需要YAML清单文件。
没有故事的陈师傅
2020/12/02
1.7K0
使用Kustomize管理K8S的YAML清单
Kubernetes/K8S快速入门之Kind
Kind 文档 https://kind.sigs.k8s.io/docs/user/quick-start/
码客说
2021/03/04
3.9K0
Docker集群编排工具之Kubernetes(K8s)介绍、安装及使用
K8s基础原理 k8s中文社区:https://www.kubernetes.org.cn/ 简介 Kubernetes与较早的集群管理系统Mesos和YARN相比,对容器尤其是 Docker的支持更加原生,同时提供了更强大的机制实现资源调度,自动 管理容器生命周期,负载均衡,高可用等底层功能,使开发者可以专注于开发应用。 Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用
863987322
2018/03/29
5.1K0
Docker集群编排工具之Kubernetes(K8s)介绍、安装及使用
相关推荐
k8s实战之部署PHP/Java网站
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验