第五章 Kubernetes资源清单定义入门
常用Kubernetes对象及其分组
深入理解Kubernetes对象的通用设计:
- TypeMeta:
- G(roup)
- K(ind)
- V(ersion)
大部分资源清单配置:
- apiVersion:group/version
- 可以通过 kubectl api-versions查看
- kind:资源类别
metadata:元数据
- name
- namespace
- labels&annotations
- Finalizers
- ResourceVersion
- SelftLink
- spec: 期望的状态,disired state
- status:当前状态,current state,本字段由k8s维护
以上定义格式都可以通过如下命令获取帮助
# kubectl explain pod.metadata....
Pod资源:
Pod运行在节点(Node)上,每个Pod里运行一个特殊的被称为Pause的容器,其他容器则为业务容器,这些业务容器共享Pause容器的网络栈和Volume挂载卷,因为他们之间的通信和数据交换更为高效,在设计时我们可以充分利用这一特性将一组密切相关的服务进程放入同一个Pod中。
Label(标签):
一个资源可以定义任意数量的Label,同一个Label也可以被添加到任意数量的资源对象上去。
一些常用的Label标签示例如下:
- 版本标签:"release":"stable","release":"canary"
- 环境标签:"environment":"dev","environment":"qa","environment":"production"
- 架构标签:“tier”:“frontend”,“tier”:"backend","tier":"middleware"
- 分区标签:"partition":"customerA","partition":"customerB"
- 质量管控标签:"track":"daily","track":"weekly"
Label Selector的表达式分为两种:一种基于等式的和一种基于集合的,具体例子如下:
等式标签
- name=redis-slave:匹配所有具有标签name=redis-slave的资源对象。
- env!=production:匹配所有不具有标签env=production的资源对象,
集合标签
- name in (redis-master,redis-slave):匹配所有具有标签name=redis-master或者name=redis-slave的资源对象
- name not in (php-frontend):匹配所有不具有标签name=php-frontend的资源对象。
selector:
matchLabels : app: myweb
matchExpressions: - {key: tier,operator : In, values: [frontend)} - {key: environment , operator : Notin , values: [dev)}
matchLabels用于定义一组Label,与直接写在Selector中作用相同:matchExpressions用于定义一组基于集合的筛选条件,可用的条件运算符包括:In、NotIn、Exists和DoesNotExist。
kubectl操作示例
-
创建资源对象
根据yaml配置文件一次性创建service和rc;
# kubectl create -f my-service.yaml -f my-rc.yaml
根据<directory>目录下所有.yaml、.yml、.json文件的定义进行创建操作;
# kubectl create -f <directory>
-
查看资源对象
查看所有Pod列表
# kubectl get pods
查看rc和service列表
# kubectl get rc,service
-
描述资源对象
显示Node的详细信息
# kubectl describe nodes <node-name>
显示Pod的详细信息
# kubectl describe pods <pod-name>
-
删除资源对象
基于pod.yaml定义的名称删除Pod
# kubectl delete -f pod.yaml
删除所有包含某个label的Pod和service
# kubectl delete pods,services -l name=<label-name>
删除所有pod
# kubectl delete pods --all
-
执行容器的命令
执行pod的date命令,默认使用Pod中的第1个容器执行
# kubectl exec <pod-name> date
指定Pod中某个容器执行date命令
# kubectl exec <pod-name> -c <container-name> date
通过bash获得Pod中某个容器的TTY,相当于登陆容器
# kubectl exec -it <pod-name> -c <container-name> /bin/bash
-
查看容器的日志
查看容器输出到stdout的日志
# kubectl logs <pod-name>
跟踪查看容器的日志,相当于tail -f命令的结果
# kubectl logs -f <pod-name> -c <container-name>
Pod定义详解
yaml 格式的 Pod 定义文件的完整内容如下: apiV ersion : vl kind: Pod metadata : name: string namespace: string labels: - name: string annotations: - name: string spec: containers : - name: string image: string imagePullPolicy: [Always I Never I IfNotPresent] command : [string] args: [string] workingDir: string volumeMounts: - name: string mountPath: string readOnly: boolean ports: - name: string containerPort: int hostPort : int protocol : string env: - name: string value : string resources : limits: cpu: string memory: string requests : cpu: string memory: string livenessProbe: exec: command: [string] httpGet: path: string port : number host: string scheme: string httpHeaders: - name: string value: string tcpSocket: port : number initialDelaySeconds: 0 timeoutSeconds: 0 periodSeconds: 0 successThreshold: 0 failureThreshold: 0 securityContext : privileged: false restartPolicy: [Always I Never I OnFailure] nodeSelector: object imagePullSecrets : - name: string hostNetwork: false volumes: - name: string emptyDir: {} hostPath: path: string secret: secretName: string items: - key: string path: string configMap: name: string items: - key: string path: string