作者:Happy老师

链接:https://blog.51cto.com/happylab/2500457

写在前面

前面的系列文章已介绍kubernetes架构,安装,升级和快速入门,读者通过文章的实操已对kubernetes已有初步的认识和理解,从本章开始逐步介绍kubernetes中的基础概念概念和核心概念,基础概念包括:namespace,labels,annotations,pods,volumes等;核心概念包含kubernetes中各种controller,包含以下几种:

  • 应用副本控制器:ReplicaSets,Deployments,DaemonSets,StatefulSets;

  • 批处理任务控制器: Jobs和CronJob

  • 存储控制器: PersistentVoloume,PersistentVolumeClaim,StorageClass;

  • 服务负载均衡: Service,Ingress,NetworkPolicy和DNS名称解析;

  • 配置和密钥: ConfigMaps和Secrets

    本文从最基础的概念pod开始讲解,后续逐步介绍应用部署,存储,负载均衡等相关的控制器,kubernetes内部由多个不同的控制器组成,每个控制器完成不同的功能。

1. 深入学习pod

1.1 Container和Pod概念

容器是一种便携式,轻量级别的容器虚拟化技术,使用linux cggroup技术实现各种资源的隔离,如cpu,memory,pid,mount,IPC等,相比于虚拟化技术如KVM,容器技术更加轻量级,它的产生主要解决环境的环境发布的问题,目前主流的容器技术是docker,说到容器,一般都等同于docker。

要运行容器首先需要有镜像,应用和应用依赖的环境运行在容器中,在kubernetes中不会直接运行container,而是运行pod,一个pod里面包含多个container,container之间共享相同的namespace,network,storage等。镜像存储在私有镜像或者公有镜像中,运行时通过docker image pull的方式拉取到本地运行,images的拉取策略包含有两种:

  • ImagePullPolicy为Always,不管本地是否有直接下载

  • ImagePullPolicy为IfNotPresent,默认镜像拉取得策略,本地不存在再拉取

Pods是kubernetes中最小的调度单位,Pods内运行一个或者多个container,container之间共享pod的网络ip资源,存储volume资源,计算等资源,方便pod内部的container之间能够实现快速的访问和交互。

如上图所示,Pod的使用方式通常包含两种:

  • Pod中运行一个容器,最经常使用的模式,container封装在pod中调度,两者几乎等同,但k8s不直接管理容器

  • Pod中运行多个容器,多个容器封装在pod中一起调度,适用于容器之间有数据交互和调用的场景,如app+redis,pod内部共享相同的网络命名空间,存储命名空间,进程命名空间等。

1.2 如何创建pod

kubernetes交互的方式通常分为四种:

  • 命令行,kubectl和kubernetes交互,完成资源的管理,命令行入门简单,但只能支持部分资源创建

  • API,通过resfulAPI以http的方式和kubernetes交互,适用于基于API做二次开发

  • SDK,提供各种语言原生的SDK,实现各种语言编程接入

  • YAML,通过易于理解的YAML文件格式,描述资源的定义,功能最丰富,最终转换为json格式

kubernetes中通过定义生申明式的方式定义资源,即通过在yaml文件中定义所需的资源,kubernetes通过controller-manager按照yaml文件中定义的资源去生成所需的资源(match the current state to desired state)。通常在kubernetes中通过yaml文件的方式定义资源,然后通过kubectl create -f 文件.yaml的方式应用配置,如下演示创建一个nginx应用的操作。

1、编写yaml文件,定义一个pod资源

[root@node-1 demo]# cat nginx.yamlapiVersion: v1kind: Podmetadata:  name: nginx-demo  labels:    name: nginx-demospec:  containers:  - name: nginx-demo    image: nginx:1.7.9    imagePullPolicy: IfNotPresent    ports:    - name: nginx-port-80      protocol: TCP      containerPort: 80

关于配置文件,说明如下:

  • apiVersion api使用的版本,kubectl api-versions可查看到当前系统能支持的版本列表

  • kind 指定资源类型,表示为Pod的资源类型

  • metadata 指定Pod的元数据,metadata.name指定名称,metadata.labels指定Pod的所属的标签

  • spec 指定Pod的模版属性,spec.containers配置容器的信息,spec.containers.name指定名字,spec.containers.image指定容器镜像的名称,spec.containers.imagePullPolicy是镜像的下载方式,IfNotPresent表示当镜像不存在时下载,spec.containers.ports.name指定port的名称,spec.containers.ports.protocol协议类型为TCP,spec.containers.ports.containerPort为容器端口。

2、创建pod应用

[root@node-1 demo]# kubectl apply -f nginx.yamlpod/nginx-demo created

3、访问应用

获取容器的IP地址[root@node-1 demo]# kubectl get pods -o wideNAME                    READY   STATUS    RESTARTS   AGE   IP            NODE     NOMINATED NODE   READINESS GATESdemo-7b86696648-8bq7h   1/1     Running   0          8h    10.244.1.11   node-2   <none>           <none>demo-7b86696648-8qp46   1/1     Running   0          8h    10.244.1.10   node-2   <none>           <none>demo-7b86696648-d6hfw   1/1     Running   0          8h    10.244.1.12   node-2   <none>           <none>nginx-demo              1/1     Running   0          50s   10.244.2.11   node-3   <none>           <none>

访问站点内容:[root@node-1 demo]# curl http://10.244.2.11<html><head><title>Welcome to nginx!title><style>body {width: 35em;margin: 0 auto;font-family: Tahoma, Verdana, Arial, sans-serif;    }style>head><body><h1>Welcome to nginx!h1><p>If you see this page, the nginx web server is successfully installed andworking. Further configuration is required.p><p>For online documentation and support please refer to<a href="http://nginx.org/">nginx.orga>.<br/>Commercial support is available at<a href="http://nginx.com/">nginx.coma>.p><p><em>Thank you for using nginx.em>p>body>html>

前面我们我们学习过kubernetes支持滚动升级RollingUpdate,弹性扩容replicas等特性,如何给Pod做滚动升级保障业务不中断,如何提高Pod的副本个数保障高可用呢?答案是:不支持。Pod是单个,无法支持一些高级特性,高级特性需要通过高级的副本控制器如ReplicaSets,Deployments,StatefulSets,DaemonSets等才能支持。Pod在实际应用中很少用,除了测试和运行一些简单的功能外,实际使用建议使用Deployments代替,Pod的定义以Template的方式嵌入在副本控制器中。

1.3. 如何编写yaml文件

前面我们提到过kubernetse是申明式的方式部署应用,应用的部署都定义在yaml文件中来实现,如何来编写应用的yaml文件呢,下面我来分享两个实际使用的技巧:

1、通过定义模版快速生成,kubectl create apps -o yaml --dry-run的方式生成,--dry-run仅仅是试运行,并不实际在k8s集群中运行,通过指定-o yaml输出yaml格式文件,生成后给基于模版修改即可,如下:

[root@node-1 demo]# kubectl create deployment demo --image=nginx:latest  --dry-run -o yamlapiVersion: apps/v1kind: Deploymentmetadata:  creationTimestamp: null  labels:    app: demo  name: demospec:  replicas: 1  selector:    matchLabels:      app: demo  strategy: {}  template:    metadata:      creationTimestamp: null      labels:        app: demo    spec:      containers:      - image: nginx:latest        name: nginx        resources: {}status: {}

2、explain命令,explain命令堪称是语法查询器,可以查到每个字段的含义,使用说明和使用方式,如想要查看Pod的spec中containers其他支持的字段,可以通过kubectl explain Pod.spec.containers的方式查询,如下:

[root@node-1 demo]# kubectl explain Pods.spec.containersKIND:     PodVERSION:  v1

RESOURCE: containers 

DESCRIPTION:     List of containers belonging to the pod. Containers cannot currently be     added or removed. There must be at least one container in a Pod. Cannot be     updated.

     A single application container that you want to run within a pod.

FIELDS:   args  #命令参数     Arguments to the entrypoint. The docker image's CMD is used if this is not     provided. Variable references $(VAR_NAME) are expanded using the     container's environment. If a variable cannot be resolved, the reference in     the input string will be unchanged. The $(VAR_NAME) syntax can be escaped     with a double $$, ie: $$(VAR_NAME). Escaped references will never be     expanded, regardless of whether the variable exists or not. Cannot be     updated. More info:     https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell

   image    #镜像定义     Docker image name. More info:     https://kubernetes.io/docs/concepts/containers/images This field is     optional to allow higher level config management to default or override     container images in workload controllers like Deployments and StatefulSets.   ports     #端口定义     List of ports to expose from the container. Exposing a port here gives the     system additional information about the network connections a container     uses, but is primarily informational. Not specifying a port here DOES NOT     prevent that port from being exposed. Any port which is listening on thedefault "0.0.0.0" address inside a container will be accessible from the     network. Cannot be updated.   readinessProbe    #可用健康检查     Periodic probe of container service readiness. Container will be removedfrom service endpoints if the probe fails. Cannot be updated. More info:     https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes   resources     #资源设置     Compute Resources required by this container. Cannot be updated. More info:     https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/...省略部分输出...   volumeMounts  #挂载存储     Pod volumes to mount into the container's filesystem. Cannot be updated.   workingDir        Container's working directory. If not specified, the container runtime's     default will be used, which might be configured in the container image.     Cannot be updated.

关于explain内容解释说明

  • 表示后面接一个字符串

  • 表示后面是一个列表的对象,列表需要以-开始,且可以写多个

  • 表示一个对象,对象内部包含多个属性

如继续上面的内容,如果需要查看resource资源定义,可以通过explain pods.spec.containers.resource来查看具体的使用方法。

通过上面两个工具的介绍,平时在日常工作中找到编写yaml文件部署应用的地图,建议手工多写几次,注意语法锁进,多写几次就熟悉了。Pod中设计到有很多的特性,如资源分配,健康检查,存储挂载等(参考附录文章),后续我们做详细介绍,Pod将以Template的方式嵌入到副本控制器如Deployments中。

附录

容器镜像介绍:https://kubernetes.io/docs/concepts/containers/images/

Pod介绍:https://kubernetes.io/docs/concepts/workloads/pods/pod-overview/

Resource限定内存资源:https://kubernetes.io/docs/tasks/configure-pod-container/assign-memory-resource/

Resource限定CPU资源:https://kubernetes.io/docs/tasks/configure-pod-container/assign-cpu-resource/

Pod挂载存储:https://kubernetes.io/docs/tasks/configure-pod-container/configure-volume-storage/

Pod配置健康检查:https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/

往期文章

Kubernetes部署

Kubernetes 1.18.2集群部署 (单Master)+docker—kubeadm方式

Kubernetes 1.18.2集群部署 (多Master)+docker—kubeadm方式

Kubernetes 1.18.2集群部署 (多Master)+docker—二进制方式

Kubernetes 1.18.2集群部署 (单Master)+docker—shell脚本方式

Kubernetes 1.19.0集群部署 (多Master)+docker—kubeadm方式

Kubernetes 1.19.0集群部署 (多Master)+docker—二进制方式

Kubernetes 一条命令快速部署 Kubernetes 高可用集群—sealos

Kubernetes 一条命令快速部署 Kubernetes 高可用集群—kubei

Kubernetes Harbor v2.0.0私有镜像仓库部署

Kubernetes Harbor v2.0.2高可用私有镜像仓库部署

Kubernetes kubectx/kubens切换context和namespace

Kubernetes kubeadm更新一个10年有效期的证书

Kubernetes kubeadm初始化kubernetes集群延长证书过期时间

Kubernetes kubeadm升级集群

Kubernetes kubeadm基础使用

Kubernetes基础篇

Kubernetes 是什么?

Kubernetes 基础概念

Kubernetes 从零开始了解

Kubernetes 快速了解Kubernetes

Kubernetes kubectl命令

Kubernetes kubectl常用命令

Kubernetes kubectl常用命令大全

Kubernetes 创建、更新应用

Kubernetes 资源清单

Kubernetes Pod状态和生命周期管理

Kubernetes Pod Controller

Kubernetes ReplicaSet Controller

Kubernetes Deployment Controller

Kubernetes DamonSet Controller

Kubernetes Job、CronJob Controller

Kubernetes HPA Controller

Kubernetes HPA Controller 使用详解

Kubernetes KEDA基于Kubernetes事件驱动的自动缩放

Kubernetes 服务发现—Service

Kubernetes 内部服务发现—Coredns

Kubernetes 外部服务发现—Traefik ingress

Kubernetes 外部服务发现—Nginx Ingress Controller

Kubernetes 存储卷—Volumes

Kubernetes 存储卷—部署NFS服务器,供给静态pv和动态pv

Kubernetes 存储卷—PV和PVC的状态变化

Kubernetes 特殊存储卷—Secret和ConfigMap

Kubernetes StatefulSet Controller

Kubernetes 认证、授权和准入控制

Kubernetes dashboard认证访问-更新

Kubernetes 网络模型和网络策略

Kubernetes 网络原理解析

Kubernetes 网络插件-flannel

Kubernetes 网络插件-calico

Kubernetes Pod资源调度

Kubernetes 资源指标和集群监控

Kubernetes 容器云平台技术落地方案

Kubernetes v1.19.0 正式发布

Kubernetes Ratel自动生成yaml文件

Kubernetes 部署策略详解

Kubernetes 集群规模应该有多大?

Kubernetes 集群备份/恢复velero实战

Kubernetes 集群备份/恢复etcd数据实战

Kubernetes基础篇—Kubernetes 原理剖析与实战应用

Kubernetes 如何深入掌握 Kubernetes

Kubernetes 如何火起来的

Kubernetes 架构为什么是这样的

Kubernetes 集群搭建

Kubernetes 是如何搞定“不可变基础设施”的

Kubernetes Pod:最小调度单元的使用进阶及实践

Kubernetes 无状态应用:剖析K8S业务副本及水平扩展底层原理

Kubernetes 有状态应用:K8S如何通过 StatefulSet 支持有状态应用

Kubernetes 配置管理:K8S管理业务配置方式有哪些

Kubernetes 存储类型:如何挑选合适的存储插件

Kubernetes 存储管理:怎样对业务数据进行持久化存储

Kubernetes基础篇—Kubernetes 入门到实战

Kubernetes 入门到实战(一)俯瞰kubernetes全貌

Kubernetes 入门到实战(二)kubeadm部署kubernetes集群

Kubernetes 入门到实战(三)kubernetes快速入门

Kubernetes 入门到实战(四)kubernetes dashboard图形界面

Kubernetes应用部署

Kubernetes 部署WordPress博客

Kubernetes 部署Nginx+php-fpm+MySQL并运行Discuz

Kubernetes 使用StatefulSet部署MySQL高可用集群

Kubernetes 使用StatefulSet部署MongoDB高可用集群

Kubernetes 包管理工具—Helm2.13安装和使用

Kubernetes Helm2部署gitlab私有代码仓库

Kubernetes Helm2部署MySQL数据库

Kubernetes 包管理工具—Helm3.3安装和使用

Kubernetes Helm3部署MySQL数据库

Kubernetes Helm3部署kubernetes-dashboard

Kubernetes Helm3部署nginx-ingress  NodePort方式

Kubernetes Helm3部署nginx-ingress  LoadBalancer方式

Kubernetes监控

Kubernetes 部署Prometheus+Grafana+Alertmanager监控告警系统

Kubernetes Prometheus监控Nginx

Kubernetes Prometheus监控MySQL

Kubernetes Prometheus监控tomcat

Kubernetes 部署kube-prometheus监控告警系统

Kubernetes kube-prometheus中添加自定义监控项-监控etcd

Kubernetes kube-prometheus监控指标targets

Kubernetes kube-prometheus配置kubernetes-cadvisor服务自动发现

Kubernetes kube-prometheus Configuration信息

Kubernetes kube-prometheus中添加自定义监控项-监控MySQL

Kubernetes Grafana匿名登录/密码登录Kubernetes

Kubernetes Grafana迁移(导出导入)dashboard

Kubernetes Grafana数据持久化

Kubernetes日志

Kubernetes 使用Elastic Stack构建Kubernetes全栈监控

Kubernetes 日志架构

Kubernetes 使用 Loki 进行日志监控和报警

Kubernetes故障排除

Kubernetes 删除namespace时卡在Terminating状态

Kubernetes deploy,rs,sts Mismatch 的处理

Kubernetes master机器文件系统故障恢复过程

Kubernetes 如何修改容器时间而不改变宿主机时间?

Kubernetes面试问题

Kubernetes IT运维面试问题总结-简述Etcd、Kubernetes、Lvs、HAProxy等

Kubernetes 50个必须了解的Kubernetes面试问题

Kubernetes 面试题汇总1

Kubernetes 面试题汇总2

8s pod 查看 的yaml_Kubernetes入门到实战(五)深入浅出详解Pod相关推荐

  1. 小白入门!网络安全基础知识详解(附知识问答)

    小白入门!网络安全基础知识详解(附知识问答) 一.引论 提到网络安全,一般人们将它看作是信息安全的一个分支,信息安全是更加广义的一个概念:防止对知识.事实.数据或能力非授权使用.误用.篡改或拒绝使用所 ...

  2. LSTM入门必读:从入门基础到工作方式详解 By 机器之心2017年7月24日 12:57 长短期记忆(LSTM)是一种非常重要的神经网络技术,其在语音识别和自然语言处理等许多领域都得到了广泛的应用

    LSTM入门必读:从入门基础到工作方式详解 By 机器之心2017年7月24日 12:57 长短期记忆(LSTM)是一种非常重要的神经网络技术,其在语音识别和自然语言处理等许多领域都得到了广泛的应用. ...

  3. JDBC学习笔记01【JDBC快速入门、JDBC各个类详解、JDBC之CRUD练习】

    黑马程序员-JDBC文档(腾讯微云)JDBC笔记.pdf:https://share.weiyun.com/Kxy7LmRm JDBC学习笔记01[JDBC快速入门.JDBC各个类详解.JDBC之CR ...

  4. python编程入门与案例详解-Pythony运维入门之Socket网络编程详解

    Socket是什么? Socket 是电脑网络中进程间数据流的端点Socket 是操作系统的通信机制应用程序通过Socket进行网络数据的传输 首先,简单了解一下TCP通信过程: TCP三次握手(面试 ...

  5. 第二讲:ADS入门和Data DisPlay操作详解

    第二讲:ADS入门和Data DisPlay操作详解 设计流程简介 创建Workspace的过程和设计讲解 仿真设计要素和原理图 元件面板和元器件操作 仿真控件 仿真分析设置和运行仿真分析 查看分析结 ...

  6. 微信小程序云开发入门(二)-数据库详解

    微信小程序云开发入门(二)-数据库详解 接上一篇:微信小程序云开发入门(一) 摘要: 因为微信小程序云数据库有点类似传统的关系型数据库,但又有所不同.所以刚入手的时候会有点困扰,经过一段时间的学习和摸 ...

  7. Elastic search入门到集群实战操作详解(原生API操作、springboot整合操作)-step1

    Elastic search入门到集群实战操作详解(原生API操作.springboot整合操作)-step2 https://blog.csdn.net/qq_45441466/article/de ...

  8. Elasticsearch实战——function_score 查询详解

    Elasticsearch实战--function_score 查询详解 文章目录 Elasticsearch实战--function_score 查询详解 1. function_score简介 2 ...

  9. Spring Cloud Eureka 入门 (二)服务提供者详解

    2019独角兽企业重金招聘Python工程师标准>>> 摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢! "优秀不是过 ...

最新文章

  1. 安装Nginx的方法教程
  2. Python中的map()函数
  3. P1984 [SDOI2008]烧水问题
  4. 【五线谱】还原记号 ( 还原记号使用简介 | 变音记号、还原记号实例分析 )
  5. python爬取动态网页的内容
  6. linux下文件夹压缩解压.tar , .gz , .tar.gz , .bz2 , .tar.bz2 , .bz , .tar.bz , .zip , .rar
  7. python多线程调用携程,进程、线程和携程的通俗解释【刘新宇Python】
  8. oracle取本月最后一天是星期几_oracle SQL语句取本周本月本年的数据
  9. 设备树和pinctrl粗解
  10. webpack安装报错(Unexpected end of JSON input while parsing near '...e6139ad7957,tarball')
  11. 在Flex中获取一个屏幕截图(Screenshot)并将其传递给ASP.NET
  12. 什么是南向接口和北向接口?
  13. 【FPGA】:ip核-----CIC滤波器
  14. PM Interview 60quiz
  15. 设计师网页导航 php,设计师必须收藏的7个网址导航
  16. 降维打击!记录我在大二的腾讯面试
  17. 使用cfssl签发证书
  18. 生活随记 - 上海普通百姓一个月的开销记录
  19. 年终考核 对你的上司,你是如何评价的
  20. 科学数据库(Pandas)——第二节 pandas之DataFrame

热门文章

  1. OpenGL编程指南13:光源移动
  2. vc2010中设置ipch与sdf的位置
  3. [转载]项目经理必备工具包:项目管理中的22个思维导图
  4. c#开发中程序集调用时容易忽略的问题
  5. 关于动态生成输入界面的一些想法及实践
  6. 封装SQLDMO操作的类
  7. ▼▲Delphi面向对象编程的20条规则
  8. 线性回归python代码实现
  9. 《网络安全——应用技术与工程实践》
  10. 关于Spring 声明式事务处理时,throws exception不回滚的问题