k8s有五种工作负载资源控制器:
1. Pod:自主式Pod,不受控制器控制,失败了,不会被自动修复。
2. ReplicaSet:支持扩缩容、自动恢复达到期望的副本数、标签选择器。帮用户管理无状态的服务。
3. Deployment:工作在ReplicaSet之上,还支持滚动更新、声明式定义(动态修改配置),pod数量可以大于node数量,无状态,关注群体稳定。
4. StatefulSet:有状态pod,关注个体稳定。
5. DaemonSet:用于确保集群中的每一个节点(或者只在部分节点)只运行一个pod,如系统级的后台用户,logstash等。
6. Job:执行完任务就退出,不需要一直运行;如果任务没有完成就crash还是会恢复,直到任务完成。
服务发现及服务均衡资源: Service, Ingress
配置与存储: Volume, CSI, configMap(配置), Secret(存储敏感信息)
大部分资源配置清单都由五个关键字组成
apiVersion : 表示属于哪一个群组及其版本,如果没有指定群组(apiVersion: v1)怎表面是core群组(基本组件群组)
kubectl api-versions这个命令可以显示出当前支持的apiVersioin示例
kind: 资源类别,用来标记你打算创建一个怎么样的资源,Pod, ReplicaSet, Deployment..Service, Ingress...
metadata: 元数据
name:
namespace:
labels: 每一个资源的标签
annotations: 资源注解
uid: 唯一标志
每个资源的引用路径: /api/GROUP/VERSION/namespace/NAMESPACE/TYPE/NAME, 可以用curl去获取
spec: 用户预期达到的目标状态描述
status:当前状态,此状态会无限与spec靠近, 此字段k8s维护,用户只能读取,不能修改。
以上每一个关键字都可以通过 kubectl explain xx来获取详细信息,如 kubectl explain pod
当我想知道pod的metadata怎么定义时,可以 kubectl explain pod.metada , 想知道spec下面的container怎么定义时: kubectl explain pod.spec.containers
第一个yaml资源配置清单
vim first-demo.yaml
apiVersion: v1
kind: Pod #Pod类型
metadata:
name: pod-demo
namespace: default
labels: #这个通过kubectl explain pods.metadata.labels得知它是<map[string]string>类型的,则需要写成如下,也可以写成
#{app:myapp, tier: frontend}
app: myapp
tier: frontend
spec: #kubectl explain pods.spec输出中可以看到 containers 后面有一个containers <[]Object> -required- 说明containers是必
#须 有的, <[]Object> 说明它是一个列表的则需要以如下方式定义,- 开头
containers: ## kubectl explain pods.spec.containers可以
- name: myapp
image: ikubernetes/myapp:v1
- name: busybox
image: busybox:latest
command: #["/bin/sh", "-c", "sleep 3600"], 因为 command <[]string>又是列表类型的,所以它有两种定义方式
- "/bin/sh"
- "-c"
- "echo ${date} >> /usr/share/nginx/html/index.html; sleep 5"
写好,保存退出。
[root@master manifests]# pwd
/root/manifests
[root@master manifests]# ls
pod-demo.yaml
然后:
[root@master manifests]# kubectl create -f pod-demo.yaml #根据资源配置清单生成pod
pod/pod-demo created
[root@master manifests]# kubectl get pods #查看pod状态
NAME READY STATUS RESTARTS AGE
pod-demo 2/2 Running 0 19s
[root@master manifests]# kubectl get pods
NAME READY STATUS RESTARTS AGE
pod-demo 1/2 Running 1 32s
[root@master manifests]#
查看生成后的pod描述:详细显示了pod的信息, describe pods,这里先指定pods类型,再指定名称
[root@master manifests]# kubectl describe pods pod-demo
。。。
使用 kubectl logs pod-demo myapp,可查看pod内部容器日志
kubectl delete pods pod-demo 可以删除pod, 也可以通过yaml文件删除: kubectl delete -f pod-demo.yaml
kubectl get pods -w 可以监控pod状态
kubectl exec -it pod-demo -c myapp -- /bin/sh 可以进入到容器里面
注意: 同一个pod中运行多个container时,它们的文件系统也是隔离的,除非我们让它们挂载到同一个数据卷中。
标签:
许多资源支持内嵌字段定义其使用的标签选择器:
matchLabels: 直接给定键值
matchExpressions: 基于给定的表达式来定义使用标签选择器,{key:"KEY", operator:"OPERATOR",values:[V1, V2...]}
操作符:In,NotIn: values字段的值必须为非空列表;
Exists, NotExists: values字段的值必须为空列表
nodeSelector <map[string]string>
节点标签选择器
nodeName <string>
annotations: 与label不同的地方在于, 它不能用于挑选资源对象,仅用于为对象提供“元数据”。