资源
学习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 | 配置 | ||
yaml
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.yaml
namespace
- 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.yaml
Pod
-
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.yaml
deployment
● 在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 dev
service
- 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
-
EmptyDir是最基础的Volume类型,一个EmptyDir就是Host上的一个空目录。
-
EmptyDir是在Pod被分配到Node时创建的,它的初始内容为空,并且无须指定宿主机上对应的目录文件,因为kubernetes会自动分配一个目录,当Pod销毁时,EmptyDir中的数据也会被永久删除。
-
EmptyDir的用途如下:
-
- 临时空间,例如用于某些应用程序运行时所需的临时目录,且无须永久保留。
-
- 一个容器需要从另一个容器中获取数据的目录(多容器共享目录)。
-
接下来,通过一个容器之间的共享案例来使用描述一个EmptyDir。
-
在一个Pod中准备两个容器nginx和busybox,然后声明一个volume分别挂载到两个容器的目录中,然后nginx容器负责向volume中写日志,busybox中通过命令将日志内容读到控制台。
HostPath
- HostPath就是将Node主机中的一个实际目录挂载到Pod中,以供容器使用,这样的设计就可以保证Pod销毁了,但是数据依旧可以保存在Node主机上。
NFS
PV
-
PV(Persistent Volume)是持久化卷的意思,是对底层的共享存储的一种抽象。一般情况下PV由kubernetes管理员进行创建和配置,它和底层具体的共享存储技术有关,并通过插件完成和共享存储的对接。
-
PVC(Persistent Volume Claim)是持久化卷声明的意思,是用户对于存储需求的一种声明。换言之,PVC其实就是用户向kubernetes系统发出的一种资源需求申请。
-
使用了PV和PVC之后,工作可以得到进一步的提升:
-
- 存储:存储工程师维护。
-
- PV:kubernetes管理员维护。
-
- PVC:kubernetes用户维护。