kubectl api-versions
kind指定这个资源对象的类型,如pod、deployment、statefulset、job、cronjob、Endpoints service
metadata常用的配置项有name:显示的名字,namespace:归属的命名空间。
一个嵌套字典与列表的配置项,也是主要的配置项,支持的子项非常多,根据资源对象的不同,子项会有不同的配置。
如一个pod的spec配置:
apiVersion: v1 #必选 版本号
kind: Pod #必选
metadata: #必选 元数据
name: nginx #必选 Pod名称
labels: #自定义标签
app: nginx #自定义标签名称
spec: #必选 Pod中容器的详细定义
containers: #必选 Pod中容器列表,一个pod里会有多个容器
- name:nginx #必选 容器名称
image:nginx #必选 容器的镜像名称
imagePullPolicy:IfNotPresent # [Always | Never | IfNotPresent] 获取镜像的策略 Alawys表示下载镜像 IfnotPresent表示优先使用本地镜像,否则下载镜像,Nerver表示仅使用本地镜像
ports: #需要暴露的端口库号列表
- containerPort:80 # 容器需要监听的端口号
restartPolicy: Always # [Always | Never | OnFailure]#Pod的重启策略,Always表示一旦不管以何种方式终止运行,kubelet都将重启,OnFailure表示只有Pod以非0退出码退出才重启,Nerver表示不再重启该Pod
如一个service的spec配置:
apiVersion: v1 #必选 版本号
kind: Service #必选
metadata: #必选 元数据
name: service-hello #必选 Pod名称
labels: #自定义标签
name: service-hello #自定义标签名称
spec: #必选 Pod中容器的详细定义
type: NodePort #这里代表是NodePort类型的,另外还有ingress,LoadBalancer
ports:
- port:80 #这里的端口和clusterIP(kubectl describe service service-hello中的IP的port)对应,即在集群中所有机器上curl clusterIP:80可访问发布的应用服务
targetPort:8080 #端口一定要和contrainer暴露出来的端口对应,nodejs暴露出来的端口是8080
protocol: TCP
nodePort: 31111 #所有的节点都会开发此端口30000~32767,此端口供外部调用
selector:
run:hello #这里选择器一定要选择容器的标签
nodeName用于将Pod调度到指定的Node名称上。
# SchedulePolicy-nodeName.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
run: busybox
name: busyboxnn
namespace: default
spec:
nodeName: k8s-node1
containers:
- image: busybox
name: bs
command:
- "ping"
- "baidu.com"
nodeSelector用于将Pod调度到匹配Label的Node上,先给规划node用途,然后打标签,例如将两台node划分给不同的团队使用:
$ kubectl label nodes k8s-node1 team=a
$ kubectl label nodes k8s-node2 team=b
#添加 尽量不调度 PreferNoSchedule
kubectl taint nodes k8s-master node-role.kubernetes.io/master:PreferNoSchedule
#去除污点NoSchedule,最后一个"-"代表删除
kubectl taint nodes k8s-master node-role.kubernetes.io/master:NoSchedule-
# SchedulePolicy-tolerations.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
run: busybox
name: busybox3
namespace: default
spec:
tolerations:
- key: "abc"
operator: "Equal"
value: "123"
effect: "NoSchedule"
containers:
- image: busybox
name: bs
command:
- "ping"
- "baidu.com"
1)Label是k8s系列中另外一个核心概念。是一组绑定到k8s资源对象上的key/value对。同一个对象的labels属性的key必须唯一,label可以附加到各种资源对象上,如Node,Pod,Service,RC等。通过给指定的资源对象捆绑一个或多个不同的label来实现对维度的资源分组管理功能,以便于灵活,方便地进行资源分配、调度、配置、部署等管理工作
2)Selector
label selector是k8s核心分组机制,通过label selector客户端/用户能够识别一组有共同特征或属性的资源对象。符合这个标签的pod会做为这个service的backend。
apiVersion: v1
kind: Service
metadata:
name: hello
labels:
app: hello
spec:
ports:
- port: 80
targetPort: 80
selector:
app: hello
状态 | 描述 |
---|---|
ContainerCreating | 容器创建中 |
PodInitializing pod | 初始化中 |
CrashLoopBackOff | 容器曾经启动了,但可能又异常退出了,kubelet正在将它重启 |
InvalidImageName | 无法解析镜像名称 |
ImageInspectError | 无法校验镜像 |
ErrImageNeverPull | 策略禁止拉取镜像 |
ImagePullBackOff | 正在重试拉取 |
RegistryUnavailable | 连接不到镜像中心 |
ErrImagePull | 通用的拉取镜像出错 |
CreateContainerConfigError | 不能创建kubelet使用的容器配置 |
CreateContainerError | 创建容器失败 |
m.internalLifecycle.PreStartContainer | 执行hook报错 |
RunContainerError | 启动容器失败 |
PostStartHookError | 执行hook报错 |
ContainersNotInitialized | 容器没有初始化完毕 |
ContainersNotRead | 容器没有准备完毕 |
DockerDaemonNotReady | docker还没有完全启动 |
NetworkPluginNotReady | 网络插件还没有完全启动 |
1、创建命名空间
kubectl create namespace test #创建一个名叫test的命名空间
2、编辑nginx-deployment.yaml文件
yaml转json的网站,用于验证yaml文件格式是否正确
https://www.json2yaml.com/convert-yaml-to-json
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
namespace: test
labels:
app: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
imagePullPolicy: IfNotPresent
ports:
- name: http
protocol: TCP
containerPort: 80
resources:
limits:
cpu: "1.0"
memory: 512Mi
requests:
cpu: "0.5"
memory: 128Mi
---
apiVersion: v1
kind: Service
metadata:
annotations:
name: nginx-test-service
namespace: test
spec:
ports:
- port: 80
targetPort: 80
nodePort: 32001
protocol: TCP
selector:
app: nginx
sessionAffinity: None
type: NodePort
3、发布nginx的应用
kubectl create -f nginx-deployment.yaml
4、查看发布的pods
kubectl get pods -n test # -n :指定命名空间 -A:不指定,即所有的命名空间
kubectl get pods -n test -owide # 部署节点的node详细信息
kubectl get pods,svc -n test -o wide
如上图:nginx的端口是32001,访问页面