K8S 清单文件帮助命令和编写规则
超级好用的工具命令
命令示例
查看编写一个pod需要什么字段
# kubectl explain pod
查看pod资源清单里的某个字段如何编写
# # kubectl explain pod.spec
字段类型
<string>
: 字符串类型<integer>
: 整数类型<boolean>
: 布尔类型, True, False<Object>
: 对象类型,类似K:V[]string
: 字符串列表<[]Object>
: 对象列表类型,类似[{},{}...]<map[string]string>
: 映射类型,K:V,区别于对象,map的KV只能是字符串类型,无法再次嵌套-required-
: 标识该字段是必须填写的
第一个清单文件
first-mainitest.yaml
文件内容
# cat first-mainitest.yaml
apiVersion: v1
kind: Pod
metadata:
name: test
namespace: default
spec:
containers:
- name: test
image: ikubernetes/myapp:v1
ports:
- containerPort: 80
name: http
protocol: TCP
配置解读
- apiVersion:
apiVersion
的规则是<group>/<version>
默认为core核心组,apiVersion:v1
核心组v1版本,可以通过kubectl api-versions
查看Api群组 - kind: 资源类别,可以为
Pod
、Deployment
,Service
等等 - metadata:嵌套字段
- name: 资源的名词,体现在
kubectl get
获取资源时显示的名称 - namespace: 资源所处的命名空间, 可以使用
kubectl get ns
获取所有的命名空间,也可以在获取资源时根据命名空间过滤,kubectl get pods -n kube-system
- name: 资源的名词,体现在
- spec:嵌套字段,期望状态,规格、资源特性和规范,不同类别的资源spec不尽相同
- containers: Pods内容器相关定义
- name: 容器的名称,体现在
docker ps
所看到的容器的名称上 - image: 容器使用的镜像
- ports: 容器暴露的端口,可以是多个,所以是对象列表
- containerPort: 容器暴露端口
- name: 端口名称,后续可以在其他地方引用
- protocol: 协议类型
- name: 容器的名称,体现在
- containers: Pods内容器相关定义
其实资源清单还有一个字段,不过这个字段有些特殊
- status: 嵌套字段,当前状态,该字段有Kubernetes集群维护该字段不需要定义,而是由K8S集群自动根据当前状态生成
根据配置清单创建资源
# kubectl apply -f first-mainitest.yaml
pod/test created
apply
和create
都可以创建资源,去区别在于,apply可以适用于文件修改后更新资源,但是create不可以,只能用作创建
获取创建的资源
# kubectl get pods
NAME READY STATUS RESTARTS AGE
client-bbf58867f-tzxhf 1/1 Running 1 41m
nginx-65759d8bcb-c2q5z 1/1 Running 0 50m
nginx-65759d8bcb-gswns 1/1 Running 1 2d
nginx-65759d8bcb-qzzm5 1/1 Unknown 0 2d
test 1/1 Running 0 5s
PS: 虽然这里定义清单文件时使用的是yaml格式,但是APIServer接收到创建资源的请求时,会将yaml数据转为json格式,然后创建对应的资源
常用字段
metadata.labels
metadata:
name: test
namespace: default
labels:
app: test
environment: develop
获取资源时显示标签,更多标签方便的操作会记录在后续的笔记中
# kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
test 1/1 Running 0 1h app=test,environment=develop
spec.containers.imagePullPolicy
spec:
containers:
- name: test-app
image: ikubernetes/myapp:v1
imagePullPolicy: Always
ports:
- containerPort: 80
name: http
protocol: TCP
imagePullPolicy可以接受3种值
- Always: 从镜像仓库拉取最新的镜像,如果镜像TAG为latest时则每次都会拉取
- Never: 永远不去镜像仓库拉取镜像
- IfNotPresent: 优先使用本地,如果本地没有则拉取仓库中镜像使用