之前对于 K8S 的操作还停留在命令行操作,本节内容则是把命令行操作转化为 yaml 配置文件。
前面提到,Pod 分为自助式 Pod 和基于控制器管理的 Pod,这里就先从自助式 Pod 开始说起。
K8S 中的资源
在 K8S 中的资源可以这样区分:
名称空间级别:
1. 工作负载型资源:Pod,ReplicationController(RC,1.11 版本后就没用了),ReplicaSet,Deployment,StatefulSet,DaemonSet,Job,CronJob。
2. 服务发现和负载均衡型资源:Service,Ingress 等。
3. 配置和存储型资源:Volume,CSI(容器存储接口)
4. 特殊类型的存储卷资源:ConfigMap,Secret(密码等敏感数据),DownwardAPI(外部环境信息输入给容器)。
集群级资源:
namespace,Node,Role,ClusterNode,RoleBinding,ClusterRoleBinding 等。
元数据型资源:
HPA,PodTemplate,LimitRange(资源限制)
Pod 资源清单
查看资源清单参数:
kubectl explain pod
结果如下:
这样可以看到 Pod 类型资源清单有哪些参数,如果想看某个参数下面得子参数,只需要用点分隔。如:
kubectl explain pod.metadata
结果如下:
一个基本的资源清单应该具备以下内容:
apiVersion:String,K8S 的接口版本,使用:kubectl api-versions 可以看待当前支持的接口版本,常用的是 v1。 kind:String,指定资源清单的类型,如自主式 Pod 的类型就是 Pod。 metadata:Object,其下面主要的参数包含: labels:K / V,给这个资源打标签。 name:String,给这个资源设置一个名称。 namespace:String,指定资源所属的名称空间,默认是 default。 spec:Object,主要配置容器信息,其下面主要的参数包含: containers:List(必要参数),意味着可以定义多个,其下面的主要参数包含: name:String(必要参数),指定容器的名称。 image:String,指定容器镜像。 imagePullPolicy:String,值为 Always(无论本地是否有该镜像都去仓库拉取),Nerver(只用本地,不去仓库拉取),IfNotPresent(如果本地有,则不去仓库拉取,latest 版本除外) command:List,指定容器启动命令,替换容器默认的命令。 args:List,指定容器启动命令的参数。 workingDir:String,指定容器的工作目录。 env:List,用于传递环境变量,其下面主要的参数包含: name:String,变量名称。 value:String,变量的值。 ports:List,其主要的参数包含: name:String,指定容器端口名称。 containerPort:Integer(必要参数),指定容器监听的端口。 protocol:String,协议类型。 restartPolicy:String,指定 Pod 重启策略,Always(停止就重启),OnFailure(错误推出则重启),Never(永不重启)
status:Object,系统生成,不需要用户定义。
以上是作为一个 Pod 常见的有些基础参数,至于更复杂的其他参数,后面会慢慢补充。
注意,List 类型的每项需要在前面添加横线(-),K / V 的则不需要。
下面以一个简单的 Pod 资源清单为例 pod-demo.yaml:
apiVersion: v1 kind: Pod metadata: name: pod-demo namespace: default labels: app: myapp version: v1 spec: containers: - name: app-container image: ikubernetes/myapp:v1 imagePullPolicy: IfNotPresent - name: busybox-container image: busybox:latest imagePullPolicy: Always command: ["/bin/sh", "-c", "sleep 3600"]
1. 执行创建,可以使用 create 也可以使用 apply:
kubectl create -f pod-demo.yaml
2. 查看 Pod:
kubectl get pods -o wide
结果如下:
3. 查看 Pod 详情:
kubectl describe pod pod-demo
结果如下:
4. 查看 Pod 内部指定容器日志:
kubectl logs pod-demo -c app-container
使用 -c 参数指定 Pod 内部的指定容器,但是由于我们这里没访问记录,所以没日志输出。
5. 查看 Pod 的 yaml 配置:
kubectl get pod pod-demo -o yaml
只需要 -o yaml 则可以看到完整的 yaml 配置:
6. 删除 Pod:
kubectl delete pod pod-demo
以上就是 Pod 资源清单的一些简单操作,所有的其它操作其实都是基于 Pod 资源清单的基础上增加的。
更复杂的 Pod 资源清单示例
pod-demo-full.yaml:
apiVersion: v1 kind: Pod metadata: name: pod-demo-full namespace: default labels: app: myapp version: v1 annotations: create_by: "Dylan" create_time: "2020-03-16" create_reason: "Pod demo" spec: containers: - name: app-container-demo image: ikubernetes/myapp:v1 imagePullPolicy: IfNotPresent ports: - name: http containerPort: 80 - name: https containerPort: 443 - name: busybox-container-demo image: busybox imagePullPolicy: Always command: ["/bin/sh", "-c", "sleep 3600"] nodeSelector: serverType: app-server restartPolicy: Never
新增了两个关键配置:
1. annotations:相当于对该配置进行一个说明,有点类似 labels 标签,但是作用不同。
2. nodeSelector:节点标签选择,这个需要试先给节点打标签。
节点打标签的方法如下:
1. 查看节点:
kubectl get nodes
如图所示:
2. 给指定节点打标签:
kubectl label nodes node-03 serverType=app-server --overwrite
比如这里给节点 3 新增一个 serverType 标签。--overwrite 参数可以用于修改标签的值。
3. 查看标签的方法:
# 查看 Pod 标签 kubectl get pods --show-labels # 查看节点标签 kubectl get nodes --show-labels # 显示指定标签的 Pod kubectl get pods -L app # 显示节点,包含指定标签的节点显示值 kubectl get nodes -L serverType # 只显包含指定标签的节点 kubectl get nodes -l serverType --show-labels # 判断关系选择,=,!=,in,not in kubectl get nodes -l "serverType in (app-server,db-server)" --show-labels
结果如下:
标签选择器后面会详细的说明。