02_k8s资源清单
02_k8s资源清单
1.k8s常用资源分类
1.1工作负载workloads
https://kubernetes.io/zh-cn/docs/concepts/workloads/简单来说使用k8s发布应用主要有就是选用那种pod控制器来管理,运行pod那么就是如下几种控制类型Deployment 和 ReplicaSet
Deployment是用来管理几群上的无状态的应用,Deployment中所有的pod都是等价的,并且在需要时可以被替代StatefulSet让你能够运行一个或者多个应用状态的podsDaemonSet定义提供节点本地支撑设施的pods,Job和CronJob。定义一些一直运行到结束并且停止的任务
1.2发现服务,负载均衡
service
将运行在一组pods上的应用程序公开为网络服务的抽象方法
使用k8s,无需修改应用程序即可使用服务发现机制
Ingress 可以提供负载均衡、SSL 终结和基于名称的虚拟托管。Ingress-nginx就是k8s集群下的负载均衡器软件。
https://kubernetes.io/zh-cn/docs/concepts/services-networking/ingress/#what-is-ingress
1.3匹配资源,存储资源
https://kubernetes.io/zh-cn/docs/concepts/configuration/configmap/ConfigMap是一种API对象,用来将非机密性的数据保存到键值对中。pods可以将其作为环境变量,命令行参数或存储卷中的配置文件ConfigMap将你的环境配置信息和容器镜像,解耦,便于应用配置修改注意
ConfigMap并不提供保密或者加密功能如果存储数据是加密的使用secret
存储资源
https://kubernetes.io/zh-cn/docs/concepts/storage/persistent-volumes/Container中文件在磁盘上是临时存放的,这给container中运行的重要应用程序带来问题
1.当容器崩溃时,容器是重新起一个新的
2.在同一个pod运行多个容器并且共享文件出现k8s(volume)这一抽象概念就解决了这个问题
1.4集群内资源分配
Namespace
Node
Role
ClusterRole
RoleBinding
ClusterRoleBinding
2.资源配置清单
2.1k8s资源清单
声明式管理k8s
https://kubernetes.io/zh-cn/docs/tasks/manage-kubernetes-objects/declarative-config/
docker,我们有两种方式管理容器
1.docker run
- docker-compose.yaml
k8s也一样除了直接运行镜像生产容器,同样也可以使用yaml来描述所创建爱你的k8s资源
最后,关于yaml的编写,到底应该写哪些资源,按什么要求去写
这就要看官网给的【k8s对象】文档
https://kubernetes.io/zh-cn/docs/concepts/overview/working-with-objects/kubernetes-objects/
命令的方式查看资源的解释
kubectl explain pod 查看pod是什么,有哪些字段
kubectl explain pod.spec 查看pod有什么规范
2.2 理解集群资源
组件是为了支撑k8s平台的运行,安装好软件
资源是如何使用k8s的能力的定义。比如k8s可以使用pod来管理业务应用
那么Pod就是k8s集群中的一类资源,集群中的所有资源
3.如何理解namespace
命令空间,集群的一个虚拟概念,雷诗雨资源池,一个池子里可以有各种资源,绝大多数资源都属于namespace
集群安装好后都会默认如下几个namespace
[root@k8s-master-10 ~]#kubectl get namespaces
NAME STATUS AGE
default Active 27h
kube-flannel Active 23h
kube-node-lease Active 27h
kube-public Active 27h
kube-system Active 27h在不同的ns下的资源,需要用-n参数,主动指定ns环境,才能看到对应资源池下的内容。
- 所有的Namespace资源你,在创建时候都需要指定namespace,若不指定默认会在default的命名空间下
- 相同的namespace下的同类资源不可以重命名,不通类型的资源可以重名
- 不通namespace下的同类资源可以重名
- 通常在项目使用,我们会创建带有业务含义的namespace做逻辑上的整合
3.1kubectl使用
类似于docker,kubectl是命令工具,用于api-server交互,内置丰富的命令功能及其强大
https://kubernetes.io/docs/reference/kubectl/overview/
kubectl -h
kubectl get -h
kubectl create -h
kubectl create namespace -h
3.2pod工作流程
- 一个资源文件,通过调用APIserver 执行创建pod
- APISERVER 收到用户的pod请求,将pod信息写入到etcd中
- 调度人list-watch的方式,发现新的pod数据,但是这个pod还没有绑定到某一个节点上
- 调度器通过算法计算出合适的node节点,并调用APIserver把信息更新到etcd中。
- kubectl 同样通过list-watch发现有新的pod调度到本机器的node节点上时,会根据pod清单描述信息拉取镜像,启动容器,同时生成时间信息
- 同时,把容器信息写入到API-SERVER中的etcd数据库中
架构设计的几个思考点
- 系统各个组件分工明确(APIServer是所有请求入口,CM是控制中枢,Scheduler主管调度,而Kubelet负责运行),配合流畅,整个运行机制一气呵成。
- 除了配置管理和持久化组件ETCD,其他组件并不保存数据。
- 意味
除ETCD外
其他组件都是无状态的。 - 因此从架构设计上对kubernetes系统高可用部署提供了支撑。
- 意味
- 同时因为组件无状态,组件的升级,重启,故障等并不影响集群最终状态,只要组件恢复后就可以从中断处继续运行。
- 各个组件和kube-apiserver之间的数据推送都是通过list-watch机制来实现。
4.使用资源清单创建pod
docker调度的是容器,在k8s集群中,最小的调单位是pod
为什么引入pod
- 与容器引擎解耦
- docoker ,RKT平台设计与引擎的具体的实现解耦
- 多容器共享网络|存储|进程空间,支持的业务场景更加灵活
命令创建pod
kubectl create deplyment nginx --image=nginx:alpinekubectl get pod -o wide [root@k8s-master-10 ~]#kubectl get po -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-565785f75c-jmszl 1/1 Running 0 30s 10.2.2.2 k8s-node-12 <none> <none>
yuchao-nginx 1/1 Running 1 27h 10.2.1.3 k8s-node-11 <none> <none>
[root@k8s-master-10 ~]#
导出pod配置为一个yaml清单
这是一个获取yaml的技巧# 指定导出某个pod的yaml文件
[root@k8s-master-10 ~]#kubectl get pod yuchao-nginx -o yaml > yuchao-nginx-pod.yaml# 查看pod的label信息
[root@k8s-master-10 ~]#kubectl get pod yuchao-nginx --show-labels
查看精简后的pod-yaml
# 查看精简后的yaml
apiVersion: v1
kind: Pod
metadata:labels:run: yuchao-nginx
spec:containers:- image: nginx:1.17.9imagePullPolicy: IfNotPresentname: yuchao-nginx
删除创建的pod
[root@k8s-master-10 ~]#kubectl get po
NAME READY STATUS RESTARTS AGE
nginx-565785f75c-jmszl 1/1 Running 0 18m
yuchao-nginx 1/1 Running 1 27h[root@k8s-master-10 ~]#kubectl delete pod yuchao-nginx
pod "yuchao-nginx" deleted
[root@k8s-master-10 ~]#
[root@k8s-master-10 ~]#kubectl get po
NAME READY STATUS RESTARTS AGE
nginx-565785f75c-jmszl 1/1 Running 0 19m
[root@k8s-master-10 ~]#貌似可以?再删这个nginx试试?[root@k8s-master-10 ~]#kubectl delete po nginx-565785f75c-jmszl
pod "nginx-565785f75c-jmszl" deleted[root@k8s-master-10 ~]#
[root@k8s-master-10 ~]#
[root@k8s-master-10 ~]#kubectl get po
NAME READY STATUS RESTARTS AGE
nginx-565785f75c-48jhc 1/1 Running 0 84s
[root@k8s-master-10 ~]#哎我去?干不掉?为啥?副本控制器啊!!你的nginx pod谁创建的啊?deployment啊!![root@k8s-master-10 ~]#kubectl get deployments.apps -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
nginx 1/1 1 1 24m nginx nginx:alpine app=nginx
[root@k8s-master-10 ~]#
查看deployment和pod
[root@k8s-master-10 ~]#kubectl get deployments.apps -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
nginx 1/1 1 1 24m nginx nginx:alpine app=nginx
[root@k8s-master-10 ~]#
[root@k8s-master-10 ~]#kubectl get po --show-labels -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES LABELS
nginx-565785f75c-48jhc 1/1 Running 0 2m34s 10.2.1.4 k8s-node-11 <none> <none> app=nginx,pod-template-hash=565785f75c
删除deployment
[root@k8s-master-10 ~]#kubectl delete deployments.apps nginx
deployment.apps "nginx" deleted
[root@k8s-master-10 ~]#
[root@k8s-master-10 ~]#kubectl get po
No resources found in default namespace.[root@k8s-master-10 ~]#kubectl get deployments.apps
No resources found in default namespace.
[root@k8s-master-10 ~]#
基于资源清单创建资源
[root@k8s-master-10 ~]#cat nginx-pod.yaml
# 查看精简后的yaml
apiVersion: v1
kind: Pod
metadata:name: yuchao-nginxlabels:run: yuchao-nginx
spec:containers:- image: nginx:1.17.9imagePullPolicy: IfNotPresentname: yuchao-nginx
[root@k8s-master-10 ~]#
[root@k8s-master-10 ~]#
[root@k8s-master-10 ~]#kubectl create -f nginx-pod.yaml
pod/yuchao-nginx created
[root@k8s-master-10 ~]#
对于各个参数的解释
#参看精简后的yaml
apiServer: v1 # api语法的版本
kind: pod # 资源类型
metdata: name: yzk # pod创建者是谁labels: # 标签身份run: nginx
spec: # pod相关参数,基于explain可以看到具体字段container: # pod相关信息- image: nginx:latest imagePullPolicy: IfNotPresent #拉取镜像策略name: yuchao-nginx #容器命名
运行结果
[root@k8s-master-10 ~]#kubectl get po -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
yuchao-nginx 1/1 Running 0 36s 10.2.1.5 k8s-node-11 <none> <none>
查看pod具体字段的详细解释
[root@k8s-master-10 ~]#kubectl explain pod.spec.containers.ports
5.标签玩法
https://support.huaweicloud.com/basics-cce/kubernetes_0011.html
5.1Node标签的设置
Lable是在object上pod的键值对。可以在创建object的时候指定,也可以在object创建后指定,Lables的值对系统本事并没有什么含义,只是对用户才有意义
当资源变得非常多的时候,如何分类管理就显得非常重要,kubernetes提供了一种机制来资源分类,那即是Lables标签,Lable非常简单但是却非常强大,在k8s中几乎所有的资源都可以用Lables来组织
Lable的具体形式是key-value的标记对,可以在创建资源的时候,也可以在后期添加的时候。
以pod为例子,当pod变得多起来,就显得杂乱且难以管理。
图解label作用
使用Label标签后
Label selector
Label不是唯一的,很多object可能有相同的label
通过label selector,客户端、用户可以指定一个object集合,通过label selector对object的集合进行操作
查看Node的标签信息
kubectl get nodes --show-labels
修改pod清单,使用node选择器
默认pod是scheduler自动选择的node
我们也可以指定具体的机器Node
yaml
apiVersion: v1
kind: Pod
metadata:name: yuchao-nginxlabels:run: yuchao-nginx
spec:containers:- name: yuchao-nginximage: nginx:1.14.0imagePullPolicy: IfNotPresentports:- name: httpcontainerPort: 80nodeSelector:#diskType: ssdserviceType: db
基于NodeSelector创建pod
[root@k8s-master-10 ~]#kubectl get po -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
yuchao-nginx 1/1 Running 0 18m 10.2.1.5 k8s-node-11 <none> <none>
[root@k8s-master-10 ~]#[root@k8s-master-10 ~]#kubectl create -f label-nginx-pod.yaml
pod/yuchao-nginx created
[root@k8s-master-10 ~]#kubectl get po -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
yuchao-nginx 0/1 ContainerCreating 0 6s <none> k8s-node-12 <none> <none>
[root@k8s-master-10 ~]## -w参数,检测组件变化
[root@k8s-master-10 ~]#kubectl get po -o wide -w
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
yuchao-nginx 0/1 ContainerCreating 0 17s <none> k8s-node-12 <none> <none>
yuchao-nginx 1/1 Running 0 21s 10.2.2.3 k8s-node-12 <none> <none>
5.2Pod标签
问题
当pod数量增多,并且每一个服务部署不同版本,没有一个方便管理某一类pod的方法是困难的
接下来我们使用label管理pod的方法
一个pod可以有多个标签而且不仅仅是pod,其他类型也有。针对我们设置2个标签分别是app和release版本
yaml
apiVersion: v1 # 遵循v1版本的Kubernetes API
kind: Pod # 这个yaml描述的是一个Pod
metadata:name: yuchao-nginx-v1 # Pod的名称labels: release: devapp: nginxspec:containers:- image: nginx:1.14.0 # 创建容器使用的镜像name: yuchao-nginx #容器的名称ports:- containerPort: 80 # 应用监听的端口, 指定端口是展示性的protocol: TCP
6.写yaml的正确姿势
1.拿来主义,从机器中已有的资源中拿$ kubectl -n kube-system get po,deployment,ds修改所需字段即可。2.学会在官网查找, https://kubernetes.io/docs/home/3.从kubernetes-api文档中查找, https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.16/#pod-v1-core4. kubectl explain 查看具体字段含义。