目录
1.kubernetes资源管理介绍
在kubernetes中,所有的内容都抽象称为资源,用户需要通过操作资源来管理k8s
kubernetes的本质上就是一个集群系统,用户可以在集群中部署各种服务,所谓的部署,就是在k8s集群中运行一个个的容器,将执行的程序运行在容器中
kubernetes的最小管理单元是pod而不是容器,所以只能将容器放在pod中,而k8s一般也不会直接管理pod,而是通过pod控制器来管理pod
pod可以提供服务,就要考虑如何访问pod中的服务,kubernetes提供了service和ingress这两种资源来时间这个功能
当pod数据需要持久化,k8s也提供了很多种存储系统
2.YAML语言介绍
kubernetes中资源配置文件都是基于YAML语言编写
YAML语法
- 大小写敏感
- 使用缩进表示层级关系
- 冒号后面至少有一个空格
- #表示注释
- 多段yaml配置放在一个文件中使用—分隔
YAML支持的数据类型
- **纯量:**单个的、不可再分的值
- **对象:**键值对的集合
- **数组:**一组按次序排列的值
yaml转换json工具:http://json2yaml.com/convert-yaml-to-json
纯量数据
1.布尔类型
test1: true
2.整形
test2: 234
3.浮点型
test3: 5.27
4.null类型
test4: ~
5.日期类型
test5: 2020-01-01
6.时间类型
test6: 2020-02-11T9:02+09:00
7.字符串类型
test7: jiangxl
对象
jiangxl:
job: it
ad: beijing
数组
hosts:
- 192.168.10.1
- 192.168.10.2
3.kubernetes资源管理方式
-
命令式对象管理:直接使用命令对资源进行操作
kubectl run nginx-pod --image=nginx --port=80
-
命令式对象配置:通过命令指定配置文件去操作资源
kubectl create -f nginx-pod.yaml
-
声明式对象配置:通过apply命令和配置文件去操作资源,相当于更新
kubectl apply -f nginx-pod.yaml
类型 | 操作对象 | 适用环境 | 优点 | 缺点 |
---|---|---|---|---|
命令式对象管理 | 一个资源 | 测试 | 简单 | 只能操作活动对象,无法审计、跟踪 |
命令式对象配置 | 一个文件 | 生产 | 可以审计、跟踪 | 项目大时,配置文件太多,操作复杂 |
声明式对象配置 | 整个目录 | 生产 | 支持目录操作 | 意外情况下难以调试 |
4.kubectl命令参数
使用kubectl命令可以对集群的各种资源对象进行管理
kubectl命令语法:
kubectl [command] [type] [name] [flags]
**command:**指定要对资源进行什么操作,如create、delete、get
**type:**指定资源类型,如pod、deployment、service
**name:**指定资源的名称
**flags:**指定额外的可选参数
4.1.kubectl基本操作
1.查看所有pod
[root@k8s-master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-6d4cf56db6-wwmvl 1/1 Running 0 3h44m
2.查看某个pod
[root@k8s-master ~]# kubectl get pod nginx-6d4cf56db6-wwmvl
NAME READY STATUS RESTARTS AGE
nginx-6d4cf56db6-wwmvl 1/1 Running 0 3h45m
3.查看pod的yaml文件
[root@k8s-master ~]# kubectl get pod nginx-6d4cf56db6-wwmvl -o yaml
4.查看pod的json格式
[root@k8s-master ~]# kubectl get pod nginx-6d4cf56db6-wwmvl -o json
5.查看pod的详细信息
[root@k8s-master ~]# kubectl get pod nginx-6d4cf56db6-wwmvl -o wide
6.查看所有的资源类型
[root@k8s-master ~]# kubectl api-resources
4.2.kubectl常用命令参数
基本命令参数
命令 | 含义 | |
---|---|---|
create | 创建一个资源 | |
edit | 编辑一个资源 | |
get | 查看一个资源信息 | |
patch | 更新一个资源 | |
delete | 删除一个资源 | |
explain | 展示资源文档 |
运行和调试相关命令参数
命令 | 含义 |
---|---|
run | 运行一个指定的镜像 |
expose | 暴露资源为service |
describe | 查看资源的详细输出 |
logs | 查看容器在pod中的日志 |
attach | 进入运行的容器 |
exec | 进入容器 |
cp | 在pod内外复制文件 |
rollout | 管理资源的发布 |
scale | 扩容或收缩pod的数量 |
autoscale | 自动跳转pod的数量 |
高级命令参数
命令 | 含义 |
---|---|
apply | 更新资源配置 |
label | 更新资源上的标签 |
其他命令
命令 | 含义 |
---|---|
cluster-info | 显示集群信息 |
version | 显示集群版本 |
4.3.k8s常用资源类型
集群级别资源
资源名称 | 缩写 | 资源作用 |
---|---|---|
nodes | no | 集群组成部分 |
namespace | ns | 隔离pod |
pod资源
资源名称 | 缩写 | 资源作用 |
---|---|---|
pod | po | 装在容器 |
pod资源控制器
资源名称 | 缩写 | 资源作用 |
---|---|---|
replicationcontrollers | rc | 控制pod资源 |
replicasets | rs | 控制pod资源 |
deployment | 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 | 配置 |
5.k8s集群资源管理方式
创建更新资源:kubectl apply -f xxx.yaml kubect create -f xxx.yaml
删除资源:kubectl delete -f xxx.yaml
查看资源:kubect get|describe 资源名
5.1.命令式对象管理
索引命令式对象管理,就是通过kubectl命令加上各种参数运行一个资源
kubectl的-n参数用于指定namespace
创建一个namespace运行一个pod后再删除
1.创建一个dev的namespace
[root@k8s-master ~]# kubectl create ns dev
namespace/dev created
2.查看所有的namespace
[root@k8s-master ~]# kubectl get ns
NAME STATUS AGE
cattle-system Active 4h13m
default Active 5h53m
dev Active 6s
kube-node-lease Active 5h53m
kube-public Active 5h53m
kube-system Active 5h53m
3.在dev namespace下运行一个nginx的pod
[root@k8s-master ~]# kubectl run pod --image=nginx -n dev
pod/pod created
4.查看创建的pod
[root@k8s-master ~]# kubectl get pod -n dev
NAME READY STATUS RESTARTS AGE
pod 1/1 Running 0 5m8s
5.删除一个pod
[root@k8s-master ~]# kubectl delete pod pod -n dev
pod "pod" deleted
6.删除一个namespace
[root@k8s-master ~]# kubectl delete ns dev
namespace "dev" deleted
5.2.命令式对象配置
所谓命令式对象配置就是kubectl命令加yaml配置文件的形式,yaml配置文件中定义了pod运行容器的各种参数
下面操作一个通过yaml来创建nginx pod
1.设置vim tab空格数
[root@k8s-master ~]# vim .vimrc
set ts=2
2.编写nginx yaml文件
[root@k8s-master ~]# cd k8s_1.19_yaml/
[root@k8s-master ~/k8s_1.19_yaml]# cat nginxpod.yaml
apiVersion: v1
kind: Namespace
metadata:
name: dev
---
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
namespace: dev
spec:
containers:
- name: nginx-containers
image: nginx
3.通过yaml创建pod
[root@k8s-master ~/k8s_1.19_yaml]# kubectl create -f nginxpod.yaml
namespace/dev created
pod/nginx-pod created
4.查看pod信息
[root@k8s-master ~/k8s_1.19_yaml]# kubectl get all -n dev
NAME READY STATUS RESTARTS AGE
pod/nginx-pod 1/1 Running 0 18s
5.通过yaml删除pod
[root@k8s-master ~/k8s_1.19_yaml]# kubectl delete -f nginxpod.yaml
namespace "dev" deleted
pod "nginx-pod" deleted
5.3.声明式对象配置
所谓声明式对象配置其实就是更新资源的一些配置,比如nginx pod要更换新的镜像、更改pod名这些操作都需要用更新来实现
使用apply操作资源时,如果资源不存在,则创建,相当于执行了create命令,如果资源以及存在,则会更新
1.准备一个nginx yaml文件
[root@k8s-master ~/k8s_1.19_yaml]# vim nginxpod.yaml
apiVersion: v1
kind: Namespace
metadata:
name: dev
---
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
namespace: dev
spec:
containers:
- name: nginx-containers
image: nginx
2.使用kubectl create创建
[root@k8s-master ~/k8s_1.19_yaml]# kubectl create -f nginxpod.yaml
namespace/dev created
pod/nginx-pod created
3.更新yaml文件中镜像版本
[root@k8s-master ~/k8s_1.19_yaml]# vim nginxpod.yaml
apiVersion: v1
kind: Namespace
metadata:
name: dev
---
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
namespace: dev
spec:
containers:
- name: nginx-containers
image: nginx:1.15 #镜像版本调整为1.15
4.更新yaml
[root@k8s-master ~/k8s_1.19_yaml]# kubectl apply -f nginxpod.yaml
namespace/dev configured
pod/nginx-pod configured
5.查看更新的过程
[root@k8s-master ~/k8s_1.19_yaml]# kubectl describe pod nginx-pod -n dev
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 93s default-scheduler Successfully assigned dev/nginx-pod to k8s-node2
Normal Pulling 93s kubelet Pulling image "nginx"
Normal Pulled 92s kubelet Successfully pulled image "nginx" in 907.242957ms
Normal Created 92s kubelet Created container nginx-containers
Normal Started 91s kubelet Started container nginx-containers
Normal Killing 22s kubelet Container nginx-containers definition changed, will be restarted
Normal Pulling 22s kubelet Pulling image "nginx:1.15"
可以看到镜像从nginx调整为nginx:1.15
6.在node节点执行kubectl命令
默认情况下,node节点无法执行kubectl命令
kubectl命令运行是需要配置文件的,配置文件默认在集群master节点初始化时,将文件放在了$HOME/.kube目录,如果想在node节点运行kubelet命令,需要将master节点的.kube目录拷贝至node节点上即可使用
一般不建议在node节点也开启kubectl命令
1.master节点将配置文件拷贝至node节点
[root@k8s-master ~]# scp -r .kube root@192.168.81.220:/root/
[root@k8s-master ~]# scp -r .kube root@192.168.81.230:/root/
2.查看node节点是否可用使用kubectl命令
[root@k8s-node1 ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master Ready master 6h45m v1.19.6
k8s-node1 Ready <none> 6h27m v1.19.6
k8s-node2 Ready <none> 6h26m v1.19.6
[root@k8s-node2 ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master Ready master 6h44m v1.19.6
k8s-node1 Ready <none> 6h26m v1.19.6
k8s-node2 Ready <none> 6h26m v1.19.6