kubernetes,是一个全新的基于容器技术的分布式架构领先方案,是谷歌严格保密十几年的秘密武器----Borg系统的一个开源版本,于2014年9月发布第一个版本,2015年7月发布第一个正式版本。
kubernetes的本质是一组服务器集群,它可以在集群的每个节点上运行特定的程序,来对节点中的容器进行管理。目的是实现资源管理的自动化,主要提供了如下的主要功能:
- 自我修复:一旦某一个容器崩溃,能够在1秒中左右迅速 启动新的容器
- 弹性伸缩:可以根据需要,自动对集群中正在运行的 容器数量进行调整
- 服务发现:服务可以通过自动发现的形式 找到它所依赖的服务
- 负载均衡:如果一个服务起动了多个容器,能够自动 实现请求的负载均衡
- 版本回退:如果发现新发布的程序版本有问题,可以立即 回退到原来的版本
- 存储编排:可以根据容器自身的需求 自动创建存储卷
一、资源管理介绍
在kubernetes中,所有的内容都抽象为资源,用户需要通过操作资源来管理kubernetes。
- kubernetes的本质上就是一个集群系统,用户可以在集群中部署各种服务。所谓的部署服务,其实就是在kubernetes集群中运行一个个的容器,并将指定的程序跑在容器中。
- kubernetes的 最小管理单元是pod 而不是容器,所以只能将 容器放在Pod中,而kubernetes一般也不会直接管理Pod,而是通过 PodController 管理。
- Pod可以提供服务之后,就要考虑如何 访问Pod中服务,kubernetes提供了 Service资源 实现这个功能。
- 当然,如果Pod中程序的数据需要 持久化,kubernetes还提供了 各种存储系统。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EMzkQn5j-1671010223032)(images/2020-04-06_22-53-34627.png)]
学习kubernetes的核心,就是学习如何对集群上的
Pod、Pod控制器、Service、存储
等各种资源进行操作
二、YAML语言概述
YAML是一个类似 XML、JSON 的标记性语言。它强调以数据为中心,并不是以标识语言为重点。因而YAML本身的定义比较简单,号称"一种人性化的数据格式语言"。
xml举例:需要加上闭合标签
<heima>
<age>15</age>
<address>Beijing</address>
</heima>
yaml举例:相对简洁
heima:
age: 15
address: Beijing
语法
- 大小写敏感
- 使用 缩进表示层级关系
- 为了兼容低版本,缩进建议使用空格
- 缩进的 空格数不重要,只要相同层级的元素左对齐即可
- '#'表示注释
数据类型
-
纯量:单个的、不可再分的值。字符串、布尔值、整数、浮点数、Null、时间、日期
#布尔类型 c1: true (或者True) #整型 c2: 234 #浮点型 c3: 3.14 #null类型 c4: ~ #日期:必须使用ISO 8601格式,即yyyy-MM-dd c5: 2018-02-17 #时间日期:时间日期使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区 c6: 2018-02-17T15:02:31+08:00 #字符串类型:如果字符串中间有特殊字符,必须使用双引号或者单引号包裹 c7: heima c8: 'line1 line2' # 字符串过多的情况可以拆成多行,每一行会被转化成一个空格
-
对象:键值对的集合,又称为映射(mapping)/ 哈希(hash) / 字典(dictionary)
# 形式一(推荐): heima: age: 15 address: Beijing # 形式二(了解): heima: {age: 15,address: Beijing}
-
数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
# 形式一(推荐): address: - 顺义 - 昌平 # 形式二(了解): address: [顺义,昌平]
小提示
- 书写yaml切记
:
后面要加一个空格 - 如果需要将多段yaml配置放在一个文件中,中间要使用
---
分隔 - 下面是一个yaml转json的网站,可以通过它验证yaml是否书写正确:链接
三、管理方式
-
命令式对象管理:直接使用命令去操作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
类型 | 操作对象 | 适用环境 | 优点 | 缺点 |
---|---|---|---|---|
命令式对象管理 | 对象 | 测试 | 简单 | 只能操作活动对象,无法审计、跟踪 |
命令式对象配置 | 文件 | 开发 | 可以审计、跟踪 | 项目大时,配置文件多,操作麻烦 |
声明式对象配置 | 目录 | 开发 | 支持目录操作 | 意外情况下难以调试 |
四、命令式对象管理
直接使用命令去操作kubernetes资源
4.1 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、json、wide格式展示结果
kubectl get pod pod_name -o yaml
4.2 操作命令
kubernetes允许对资源进行多种操作,可以通过–help查看详细的操作命令
kubectl --help
经常使用的操作有下面这些:
命令分类 | 命令 | 翻译 | 命令作用 |
---|---|---|---|
基本命令 | create | 创建:–record | 创建一个资源 |
run | 运行:–image、–port、–replicas、–requests=cpu=100m | 在集群中运行一个指定的镜像 | |
expose | 暴露:–name、–type=NodePort、–port=80、–target-port、 | 暴露资源为Service | |
edit | 编辑 | 编辑一个资源 | |
get | 获取:-o、-w、–show-labels | 获取一个资源 | |
patch | 更新 | 更新一个资源 | |
delete | 删除:–force、–grace-period=0 | 删除一个资源 | |
explain | 解释 | 展示资源文档 | |
set | 修改 | 在对象上设置特定功能 | |
部署命令 | rollout | 首次展示 | 管理资源的发布 |
scale | 规模:–replicas=3 | 命令方式扩(缩)容Pod的数量 | |
autoscale | 自动调整 | 自动调整Pod的数量 | |
集群管理命令 | cluster-info | 集群信息 | 显示集群信息 |
certificate | 修改证书资源 | ||
top | 显示资源(CPU/内存/存储)使用情况 | ||
cordon | 将节点标记为不可调度 | ||
uncordon | 将节点标记为可调度 | ||
drain | 为维护做准备时排空节点 | ||
taint | 污点 | 更新一个或多个节点上的污点 | |
故障排除和调试命令 | describe | 描述 | 显示资源内部信息 |
logs | 日志:-f volume-emptydir、-c busybox | 查看容器在 pod 中的标准输出 | |
attach | 缠绕进入运行中的容器 | 进入运行中的容器 | |
exec | 执行容器中的一个命令 | 执行容器中的一个命令 | |
cp | 复制 | 在Pod内外复制文件 | |
port-forward | 将一个或多个本地端口转发到pod | ||
proxy | 运行Kubernetes API服务器的代理 | ||
auth | 检查授权 | ||
高级命令 | apply | rc | 通过文件对资源进行配置 |
label | 标签:–overwrite | 更新资源上的标签 | |
diff | 将实时版本与将要应用的版本进行比较 | ||
replace | 用文件名或标准输入替换资源 | ||
wait | 实验性:等待一个或多个资源上的特定条件 | ||
convert | 在不同API版本之间转换配置文件 | ||
kustomize | 从目录或远程url构建一个目标库 | ||
annotate | 更新资源上的注释 | ||
completion | 输出指定shell (bash或zsh)的shell完成代码 | ||
其他命令 | version | 版本 | 显示当前Server和Client的版本 |
api-resources | 打印服务器上支持的API资源 | ||
api-versions | 以“组/版本”的形式打印服务器上支持的API版本 | ||
config | 修改kubeconfig文件 | ||
plugin | 提供与插件交互的实用程序 |
4.3 资源类型
kubernetes中所有的内容都抽象为资源,可以通过下面的命令进行查看:
kubectl api-resources
经常使用的资源有下面这些:
资源分类 | 资源名称 | 缩写 | 资源作用 |
---|---|---|---|
集群级别资源 | nodes | no | 集群组成部分 |
namespaces | ns | 隔离Pod | |
pod资源 | pods | po | 装载容器 |
pod资源控制器 | replicationcontrollers | rc | 控制pod资源 |
replicasets | rs | 控制pod资源 | |
deployments | deploy | 控制pod资源 | |
daemonsets | ds | 控制pod资源 | |
jobs | 控制pod资源 | ||
cronjobs | cj | 控制pod资源 | |
horizontalpodautoscalers | hpa | 控制pod资源 | |
statefulsets | sts | 控制pod资源 | |
服务发现资源 | services | svc | 统一pod对外接口 |
ingress | ing | 统一pod对外接口 | |
存储资源 | volumeattachments | 存储 | |
persistentvolumes | pv | 存储 | |
persistentvolumeclaims | pvc | 存储 | |
配置存储资源 | configmaps | cm | 配置 |
secrets | 配置 |
4.4 命令参数
通过下面的命令查看全局命令行选项列表(适用于所有命令)
kubectl options
选项 | 是否使用过 | 作用 |
---|---|---|
–add-dir-header=false | 如果为true,则将文件目录添加到头部 | |
–alsologtostderr=false | 记录标准错误和文件 | |
–as=‘’ | 为操作模拟的用户名 | |
–as-group=[] | 为操作模拟的组,该标志可以重复指定 多组 | |
–cache-dir=‘/root/.kube/http-cache’ | 默认HTTP缓存目录 | |
–certificate-authority=‘’ | 证书颁发机构的证书文件的路径 | |
–client-certificate=‘’ | TLS的客户端证书文件的路径 | |
–client-key=‘’ | TLS的客户端密钥文件的路径 | |
–cluster=‘’ | 要使用的kubeconfig集群的名称 | |
–context=‘’ | 要使用的kubeconfig上下文的名称 | |
–insecure-skip-tls-verify=false | 如果为true,将不检查服务器的证书有效性。这将使你的HTTPS连接不安全 | |
–kubeconfig=‘’ | 用于CLI请求的kubeconfig文件的路径 | |
–log-backtrace-at=:0 | 当日志记录命中行file:N时,发出堆栈跟踪 | |
–log-dir=‘’ | 如果非空,将日志文件写入此目录 | |
–log-file=‘’ | 如果非空,则使用此日志文件 | |
–log-file-max-size=1800 | 定义日志文件可以增长到的最大大小。单位是兆字节。 如果该值为0,则最大文件大小不受限制。 | |
–log-flush-frequency=5s | 日志刷新之间的最大秒数 | |
–logtostderr=true | 记录标准错误而不是文件 | |
–match-server-version=false | 要求服务器版本与客户端版本相匹配 | |
-n, --namespace=‘’ | 是 | 如果存在,此CLI请求该命名空间范围 |
–password=‘’ | API服务器基本身份验证的密码 | |
–profile=‘none’ | 要捕获的配置文件的名称。 (无| cpu |堆| goroutine |线程创建|块|互斥体)之一 | |
–profile-output=‘profile.pprof’ | 要写入配置文件的文件的名称 | |
–request-timeout=‘0’ | 在放弃单个服务器请求之前等待的时间长度。 非零值应包含相应的时间单位(如1s、2m、3h)。零值意味着不要让请求超时。 | |
-s, --server=‘’ | Kubernetes API服务器的地址和端口 | |
–skip-headers=false | 如果为真,请避免在日志消息中使用标头前缀 | |
–skip-log-headers=false | 如果为true,则在打开日志文件时避免标题 | |
–stderrthreshold=2 | 等于或高于此阈值的日志将转至stderr | |
–token=‘’ | 用于对API服务器进行身份验证的不记名令牌 | |
–user=‘’ | 要使用的kubeconfig用户的名称 | |
–username=‘’ | 对API服务器进行基本身份验证的用户名 | |
-v, --v=0 | 日志级别详细程度的数字 | |
–vmodule= | 文件过滤日志记录的pattern=N设置的逗号分隔列表 |
4.5 操作案例
下面以一个namespace / pod的创建和删除简单演示下命令的使用:
-
创建一个 namespace
[root@master ~]# kubectl create namespace test
-
获取 namespace
[root@master ~]# kubectl get namespace
-
在此namespace下创建并运行一个nginx的 Pod
[root@master ~]# kubectl run pod --image=nginx -n test
-
查看新创建的pod。注意:默认命名空间为 default
[root@master ~]# kubectl get pods -n test
-
查看pod的内部信息
[root@master ~]# kubectl describe pod pod-864f9875b9-mq2jl -n test
-
删除指定的pod。注意:默认命名空间为 default
[root@master ~]# kubectl delete pod pod-864f9875b9-mq2jl -n test
-
删除指定的namespace
[root@master ~]# kubectl delete namespace test
五、命令式对象配置
通过 命令 和 配置文件(提供资源信息) 操作kubernetes资源
-
创建一个nginxpod.yaml,内容如下:
apiVersion: v1 kind: Namespace metadata: name: dev --- apiVersion: v1 kind: Pod metadata: name: nginxpod namespace: dev spec: containers: - name: nginx-containers image: nginx:latest
-
执行create命令,创建资源
[root@master ~]# kubectl create -f nginxpod.yaml namespace/dev created pod/nginxpod created
-
执行get命令,查看资源
[root@master ~]# kubectl get -f nginxpod.yaml
-
执行delete命令,删除资源
[root@master ~]# kubectl delete -f nginxpod.yaml
六、声明式对象配置
通过 apply命令(创建、更新) 和 配置文件 操作kubernetes资源
其实声明式对象配置就是使用apply描述一个资源最终的状态(在yaml中定义状态)
- 如果资源不存在:创建,相当于 kubectl create
- 如果资源已存在:更新,相当于 kubectl patch
操作案例
-
还是使用 nginxpod.yaml配置文件 创建资源
[root@master ~]# kubectl apply -f nginxpod.yaml
-
更新资源失败
[root@master ~]# kubectl apply -f nginxpod.yaml
-
更新资源成功:将 nginx的镜像从 latest 改为 1.17.1
[root@master ~]# kubectl apply -f nginxpod.yaml
七、小结与扩展
使用推荐: 三种方式应该怎么用 ?
- 查询资源:使用命令式对象管理 kubectl get(describe) 资源名称
- 删除资源:使用命令式对象配置 kubectl delete -f XXX.yaml
- 创建/更新资源:使用声明式对象配置 kubectl apply -f XXX.yaml
扩展:kubectl可以在node节点上运行吗 ?
kubectl的运行是需要进行配置的,它的配置文件是$HOME/.kube,如果想要在node节点运行此命令,需要将master上的.kube文件复制到node节点上,即在master节点上执行下面操作:
[root@master ~]# scp -r ~/.kube node1:~/