- 资源
- yaml
- namespace
- Pod
- Label
- deployment
- service
- 数据存储
- EmptyDir
- HostPath
- NFS
- PV
学习kubernets的核心,就是学习如何对集群中的Pod、Pod控制器、Service、存储等各种资源进行操作。
kubectl api-resources
| 级别 | 资源名称 | 缩写 | 资源作用 |
|---|---|---|---|
| 集群 | nodes | no | 集群组成部分 |
| namespaces | ns | 隔离pod | |
| pod资源 | pods | po | 装载容器 |
| pod资源控制器 | replication controllers | rc | 控制pod资源 |
| replicasets | rs | 控制pod资源 | |
| deployments | deploy | 控制pod资源 | |
| daemonsets | ds | 控制pod资源 | |
| jobs | 控制pod资源 | ||
| cronjobs | cj | 控制pod资源 | |
| horizontal pod auto saclers | hpa | 控制pod资源 | |
| statefulsets | sts | 控制pod资源 | |
| 服务发现 | services | svc | 统一pod对外接口 |
| ingress | ing | 统一pod对外接口 | |
| 存储资源 | volume attachments | 存储 | |
| persistent volumes | pv | 存储 | |
| persistent volume claims | pvc | 存储 | |
| 配置资源 | config maps | cm | 配置 |
| secrets | 配置 | ||
1 使用kubectl create命令生成yaml文件 kubectl create deployment nginx --image=nginx:1.17.1 --dry-run=client -n dev -o yaml kubectl create deployment nginx --image=nginx:1.17.1 --dry-run=client -n dev -o yaml > test.yaml #此种方式适用于没有真正部署资源 -------- 2 使用kubectl get命令导出yaml文件 kubectl get deployment nginx -n dev -o yaml --export > test2.yamlnamespace
- Namespace是kubernetes系统中一种非常重要的资源,它的主要作用是用来实现多套系统的资源隔离或者多租户的资源隔离。
kubectl get namespace kubectl get ns kubectl get ns default -o wide kubectl get ns default -o json kubectl get ns default -o yaml kubectl describe namespace default kubectl create namespace dev kubectl create ns dev kubectl delete ns dev kubectl create -f ns-dev.yaml kubectl delete -f ns-dev.yamlPod
-
Pod是kubernetes集群进行管理的最小单元,程序要运行必须部署在容器中,而容器必须存在于Pod中。
-
Pod可以认为是容器的封装,一个Pod中可以存在一个或多个容器。
kubectl get pods -n kube-system
kubectl run (Pod的名称) [参数]
# --image 指定Pod的镜像
# --port 指定端口
# --namespace 指定namespace
kubectl run nginx --image=nginx:1.17.1 --port=80 --namespace=dev
kubectl get pods -n dev
kubectl describe pod nginx -n dev
kubectl get pods -n dev -o wide
kubectl delete pod nginx -n dev
Label
-
Label是kubernetes的一个重要概念。它的作用就是在资源上添加标识,用来对它们进行区分和选择。
-
Label的特点:
-
- 一个Label会以key/value键值对的形式附加到各种对象上,如Node、Pod、Service等。
-
- 一个资源对象可以定义任意数量的Label,同一个Label也可以被添加到任意数量的资源对象上去。
-
- Label通常在资源对象定义时确定,当然也可以在对象创建后动态的添加或删除。
-
可以通过Label实现资源的多纬度分组,以便灵活、方便地进行资源分配、调度、配置和部署等管理工作。
一些常用的Label标签示例如下:
版本标签:“version”:”release”,”version”:”stable”。。。
环境标签:“environment”:”dev”,“environment”:”test”,“environment”:”pro”。。。
架构标签:“tier”:”frontend”,”tier”:”backend”。。。
kubectl label pod xxx key=value [-n 命名空间] kubectl label pod nginx version=1.0 -n dev kubectl label pod xxx key=value [-n 命名空间] --overwrite kubectl label pod nginx version=2.0 -n dev --overwrite kubectl get pod xxx [-n 命名空间] --show-labels kubectl get pod nginx -n dev --show-labels kubectl get pod -l key=value [-n 命名空间] --show-labels kubectl get pod -l version=2.0 -n dev --show-labels kubectl label pod xxx key- [-n 命名空间] kubectl label pod nginx version- -n dev kubectl create -f pod-nginx.yaml kubectl delete -f pod-nginx.yamldeployment
● 在kubernetes中,Pod是最小的控制单元,但是kubernetes很少直接控制Pod,一般都是通过Pod控制器来完成的。 ● Pod控制器用于Pod的管理,确保Pod资源符合预期的状态,当Pod的资源出现故障的时候,会尝试进行重启或重建Pod。 ● 在kubernetes中Pod控制器的种类有很多,本章节只介绍一种:Deployment kubectl create deployment xxx [-n 命名空间] kubectl create deployment nginx --image=nginx:1.17.1 -n test kubectl scale deployment xxx [--replicas=正整数] [-n 命名空间] kubectl scale deployment nginx --replicas=4 -n dev kubectl create -f deploy-nginx.yaml kubectl delete -f deploy-nginx.yaml kubectl get pods -n dev kubectl get deployment [-n 命名空间] kubectl get deployment -n devservice
- Service可以看做是一组同类的Pod对外的访问接口,借助Service,应用可以方便的实现服务发现和负载均衡。
kubectl expose deployment xxx --name=服务名 --type=ClusterIP --port=暴露的端口 --target-port=指向集群中的Pod的端口 [-n 命名空间] # 会产生一个CLUSTER-IP,这个就是service的IP,在Service的生命周期内,这个地址是不会变化的 kubectl expose deployment nginx --name=svc-nginx1 --type=ClusterIP --port=80 --target-port=80 -n test kubectl get service [-n 命名空间] [-o wide] kubectl get service -n test # 创建集群外部可访问的Service kubectl expose deployment xxx --name=服务名 --type=NodePort --port=暴露的端口 --target-port=指向集群中的Pod的端口 [-n 命名空间] # 会产生一个外部也可以访问的Service kubectl expose deploy nginx --name=svc-nginx2 --type=NodePort --port=80 --target-port=80 -n test kubectl get service [-n 命名空间] [-o wide] kubectl get service -n test kubectl delete service xxx [-n 命名空间] kubectl delete service svc-nginx1 -n test kubectl create -f svc-nginx.yaml kubectl delete -f svc-nginx.yaml数据存储
-
kubernetes的Volume支持多种类型,比较常见的有下面的几个:
-
- 简单存储:EmptyDir、HostPath、NFS。
-
- 高级存储:PV、PVC。
-
- 配置存储:ConfigMap、Secret。
-
EmptyDir是最基础的Volume类型,一个EmptyDir就是Host上的一个空目录。
-
EmptyDir是在Pod被分配到Node时创建的,它的初始内容为空,并且无须指定宿主机上对应的目录文件,因为kubernetes会自动分配一个目录,当Pod销毁时,EmptyDir中的数据也会被永久删除。
-
EmptyDir的用途如下:
-
- 临时空间,例如用于某些应用程序运行时所需的临时目录,且无须永久保留。
-
- 一个容器需要从另一个容器中获取数据的目录(多容器共享目录)。
-
接下来,通过一个容器之间的共享案例来使用描述一个EmptyDir。
-
在一个Pod中准备两个容器nginx和busybox,然后声明一个volume分别挂载到两个容器的目录中,然后nginx容器负责向volume中写日志,busybox中通过命令将日志内容读到控制台。
- HostPath就是将Node主机中的一个实际目录挂载到Pod中,以供容器使用,这样的设计就可以保证Pod销毁了,但是数据依旧可以保存在Node主机上。
-
PV(Persistent Volume)是持久化卷的意思,是对底层的共享存储的一种抽象。一般情况下PV由kubernetes管理员进行创建和配置,它和底层具体的共享存储技术有关,并通过插件完成和共享存储的对接。
-
PVC(Persistent Volume Claim)是持久化卷声明的意思,是用户对于存储需求的一种声明。换言之,PVC其实就是用户向kubernetes系统发出的一种资源需求申请。
-
使用了PV和PVC之后,工作可以得到进一步的提升:
-
- 存储:存储工程师维护。
-
- PV:kubernetes管理员维护。
-
- PVC:kubernetes用户维护。



