Kubernetes快速入门(一)组件与管理方式

kubernetes介绍

kubernetes是一个全新的基于容器技术的分布式架构领先方案,是谷歌严格保密十几年的秘密武器----Borg系统的一个开源版本,于2014年9月发布第一个版本,2015年7月发布第一个正式版本。

kubernetes的本质是一组服务器集群,它可以在集群的每个节点上运行特定的程序,来对节点中的容器进行管理。目的是实现资源管理的自动化,主要提供了如下的主要功能:

  • 自我修复:一旦某一个容器崩溃,能够在1秒中左右迅速启动新的容器
  • 弹性伸缩:可以根据需要,自动对集群中正在运行的容器数量进行调整
  • 服务发现:服务可以通过自动发现的形式找到它所依赖的服务
  • 负载均衡:如果一个服务起动了多个容器,能够自动实现请求的负载均衡
  • 版本回退:如果发现新发布的程序版本有问题,可以立即回退到原来的版本
  • 存储编排:可以根据容器自身的需求自动创建存储卷

 

kubernetes概念

Master:集群控制节点,每个集群需要至少一个master节点负责集群的管控

Node:工作负载节点,由master分配容器到这些node工作节点上,然后node节点上的docker负责容器的运行

Pod:kubernetes的最小控制单元,容器都是运行在pod中的,一个pod中可以有1个或者多个容器

Controller:控制器,通过它来实现对pod的管理,比如启动pod、停止pod、伸缩pod的数量等等

Service:pod对外服务的统一入口,下面可以维护者同一类的多个pod

Label:标签,用于对pod进行分类,同一类pod会拥有相同的标签

NameSpace:命名空间,用来隔离pod的运行环境

 


 

资源管理介绍

在kubernetes中,所有的内容都抽象为资源,用户需要通过操作资源来管理kubernetes

kubernetes的本质上就是一个集群系统,用户可以在集群中部署各种服务,所谓的部署服务,其实 就是在kubernetes集群中运行一个个的容器,并将指定的程序跑在容器中。

kubernetes的最小管理单元是pod而不是容器,所以只能将容器放在 Pod 中,而kubernetes一般也 不会直接管理Pod,而是通过 Pod控制器 来管理Pod的。

Pod可以提供服务之后,就要考虑如何访问Pod中服务,kubernetes提供了 Service 资源实现这个 功能。

当然,如果Pod中程序的数据需要持久化,kubernetes还提供了各种 存储 系统。

 

 


 

YAML语言介绍

YAML是一个类似 XML、JSON 的标记性语言。它强调以数据为中心,并不是以标识语言为重点。因而YAML本身的定义比较简单,号称"一种人性化的数据格式语言"。

<heima>
  <age>15</age>
  <address>Beijing</address>
</heima>

等于:

heima:
  age: 15
  address: Beijing

YAML的语法比较简单,主要有下面几个:

  大小写敏感

  使用缩进表示层级关系

  缩进不允许使用tab,只允许空格( 低版本限制 )

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

  '#'表示注释

YAML支持以下几种数据类型:

  纯量:单个的、不可再分的值

  对象:键值对的集合,又称为映射(mapping)/ 哈希(hash) / 字典(dictionary)

  数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)

# 纯量, 就是指的一个简单的值,字符串、布尔值、整数、浮点数、Null、时间、日期
# 1 布尔类型
c1: true (或者True)
# 2 整型
c2: 234
# 3 浮点型
c3: 3.14
# 4 null类型
c4: ~  # 使用~表示null
# 5 日期类型
c5: 2018-02-17   # 日期必须使用ISO 8601格式,即yyyy-MM-dd
# 6 时间类型
c6: 2018-02-17T15:02:31+08:00  # 时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表
时区
# 7 字符串类型
c7: heima   # 简单写法,直接写值 , 如果字符串中间有特殊字符,必须使用双引号或者单引号包裹
c8: line1
 line2   # 字符串过多的情况可以拆成多行,每一行会被转化成一个空格
# 对象
# 形式一(推荐):
heima:
age: 15
address: Beijing
# 形式二(了解):
heima: {age: 15,address: Beijing}
# 数组
# 形式一(推荐):
address:
- 顺义
- 昌平
# 形式二(了解):
address: [顺义,昌平]
小提示:
1 书写yaml切记 : 后面要加一个空格
2 如果需要将多段yaml配置放在一个文件中,中间要使用 --- 分隔
3 下面是一个yaml转json的网站,可以通过它验证yaml是否书写正确
  https://www.json2yaml.com/convert-yaml-to-json

 

 


 

资源管理方式

命令式对象管理:直接使用命令去操作kubernetes资源

kubectl run nginx-pod --image=nginx:1.17.1 --port=80

命令式对象配置:通过命令配置和配置文件去操作kubernetes资源

kubectl create/patch -f nginx-pod.yaml

声明式对象配置:通过apply命令和配置文件去操作kubernetes资源

kubectl apply -f nginx-pod.yaml 

 

 

 

 命令式对象管理

kubectl命令

kubectl是kubernetes集群的命令行工具,通过它能够对集群本身进行管理,并能够在集群上进行容器化

应用的安装部署。kubectl命令的语法如下:

kubectl [command] [type] [name] [flags]

comand:指定要对资源执行的操作,例如create、get、delete

type:指定资源类型,比如deployment、pod、service

name:指定资源的名称,名称大小写敏感

flags:指定额外的可选参数

# 查看所有
pod kubectl get pod

# 查看某个
pod kubectl get pod pod_name

# 查看某个pod,以yaml格式展示结果
kubectl get pod pod_name -o yaml

 

 

 

 资源类型

 kubernetes中所有的内容都抽象为资源,可以通过下面的命令进行查看:

kubectl api-resources

经常使用的资源下面我做了划分:

 

 

 

 操作

 kubernetes允许对资源进行多种操作,可以通过--help查看详细的操作命令

kubectl --help

经常使用的操作有下面这些:

 

 

 下面以一个namespace / pod的创建和删除简单演示下命令的使用:

 

# 创建一个namespace
[root@master ~]# kubectl create namespace dev
namespace/dev created
# 获取namespace
[root@master ~]# kubectl get ns
NAME             STATUS  AGE
default          Active  21h
dev              Active  21s
kube-node-lease  Active  21h
kube-public      Active  21h
kube-system      Active  21h
# 在此namespace下创建并运行一个nginx的Pod
[root@master ~]# kubectl run pod --image=nginx -n dev
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a
future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.deployment.apps/pod created

# 查看新创建的pod
[root@master ~]# kubectl get pod -n dev
NAME          READY  STATUS   RESTARTS  AGE
pod-864f9875b9-pcw7x  1/1   Running  0      21s
# 删除指定的pod
[root@master ~]# kubectl delete pod pod-864f9875b9-pcw7x
pod "pod-864f9875b9-pcw7x" deleted
# 删除指定的namespace
[root@master ~]# kubectl delete ns dev
namespace "dev" deleted

 

 命令式对象配置

 命令式对象配置就是使用命令配合配置文件一起来操作kubernetes资源。

 1) 创建一个nginxpod.yaml,内容如下:

apiVersion: v1   #指定版本
kind: Namespace  #指定类型
  metadata:      #数据描述
    name: dev    #名字
---
apiVersion: v1   #指定版本
kind: Pod        #指定类型
metadata:        #数据描述
  name: nginxpod #名字
  namespace: dev #命名空间
spec:            #详细说明描述
  containers:    #容器
  - name: nginx-containers  #nginx容器
    image: nginx:1.17.1     #指定镜像版本

2)执行create命令,创建资源:

[root@master ~]# kubectl create -f nginxpod.yaml
namespace/dev created
pod/nginxpod created

此时发现创建了两个资源对象,分别是namespace和pod
3)执行get命令,查看资源:

[root@master ~]# kubectl get -f nginxpod.yaml
NAME       STATUS  AGE
namespace/dev  Active  18s
NAME       READY  STATUS   RESTARTS  AGE
pod/nginxpod   1/1   Running  0      17s

这样就显示了两个资源对象的信息
4)执行delete命令,删除资源:

[root@master ~]# kubectl delete -f nginxpod.yaml
namespace "dev" deleted
pod "nginxpod" deleted

此时发现两个资源对象被删除了

总结:
  命令式对象配置的方式操作资源,可以简单的认为:命令 + yaml配置文件(里面是命令需要的各种参数)

 

 

声明式对象配置

声明式对象配置跟命令式对象配置很相似,但是它只有一个命令apply。

# 首先执行一次kubectl apply -f yaml文件,发现创建了资源
[root@master ~]# kubectl apply -f nginxpod.yaml
namespace/dev created
pod/nginxpod created
# 再次执行一次kubectl apply -f yaml文件,发现说资源没有变动
[root@master ~]# kubectl apply -f nginxpod.yaml
namespace/dev unchanged
pod/nginxpod unchanged
总结:
  其实声明式对象配置就是使用apply描述一个资源最终的状态(在yaml中定义状态)
使用apply操作资源:
   如果资源不存在,就创建,相当于 kubectl create
  如果资源已存在,就更新,相当于 kubectl patch

 


扩展:kubectl可以在node节点上运行吗 ?

kubectl的运行是需要进行配置的,它的配置文件是$HOME/.kube,如果想要在node节点运行此命令,需
要将master上的.kube文件复制到node节点上,即在master节点上执行下面操作

scp  -r  HOME/.kube  node1: HOME/

 

使用推荐: 三种方式应该怎么用 ?

  创建/更新资源 使用声明式对象配置 kubectl apply -f XXX.yaml

  删除资源 使用命令式对象配置 kubectl delete -f XXX.yaml

  查询资源 使用命令式对象管理 kubectl get(describe) 资源名称

 

 

 

 

 

 

posted @ 2021-05-12 09:22  _kerry  阅读(98)  评论(0编辑  收藏  举报