K8s 参考手册
1 kubectl命令
1.1 Pod
# 查询pods
kubectl get pods -n namespace --show-labels -o wide
# 查询所有命名空间的pod
kubectl get pods --all-namespaces
# 查询pod标签
kubectl get pods -n namespace --show-labels -o wide
# 持续监听
kubectl get pods -n dev -w
# 运行一个pod
kubectl run nginx-pod --image=nginx:1.17.1 --port=80
# 创建pod(yaml方式)
kubectl apply/create -f nginx-pod.yaml
# 删除pod
kubectl delete pod PODNAME -n dev
# 删除yaml文件创建的pod
kubectl delete -f nginx-pod.yaml
# 查看pod详情
kubectl describe pod PODNAME -n dev
# 进入pod
kubectl exec -it podname -n dev /bin/sh
1.2 Node
kubectl get node
1.3 Namespace
kubectl get ns -o wide
1.4 Deployment
# 查询 kubectl get deployment -n namespace --show-labels -o wide
# 创建并记录历史记录
kubectl apply -f deployment-test.yaml --record
# 删除
kubectl delete -f deployment-test.yaml # 扩缩容 kubectl scale deploy NAME --replicas=5 -n dev # 镜像升级 kubectl set image deploy nginx-deployment nginx=nginx:stable-alpine -n dev
# 查看镜像升级是否成功
kubectl rollout status deploy nginx-deployment -n dev
# 查看镜像升级历史记录
kubectl rollout history deploy nginx-deployment -n dev
# 回退版本
kubectl rollout undo deploy nginx-deployment --to-revision=1 -n dev
# 暂停镜像升级
kubectl rollout pause deploy nginx-deployment -n dev
# 继续镜像升级
kubectl rollout resume deploy nginx-deployment -n dev
# 金丝雀发布(又名灰度发布)(旧的Pod正常运行,但同时有新的Pod生成,用于测试新版本是否正常,又不影响旧版本的使用,测试没问题后继续镜像升级,实现新旧版本的平滑过渡)
kubectl set image deploy nginx-deployment nginx=nginx:stable-alpine -n dev && kubectl rollout pause deploy nginx-deployment -n dev
1.5 ReplicaSet
# 查询 kubectl get rs NAME -n dev -o wide # 扩缩容(edit方式) kubectl edit rs NAME -n dev # 扩缩容(scale方式) kubectl scale rs NAME --replicas=2 -n dev
# 镜像升级
kubectl set image rs NAME nginx=nginx:stable-alpine-perl -n dev #nginx为容器的名称
# 删除
kubectl delete rs NAME -n dev
1.x 其他
# 查看资源版本
kubectl api-resources
# 查看集群信息
kubectl cluster-info
# Node节点运行kubectl
scp -r /root/.kube root@nodeip:/root/.kube
# 打印dashboard的token
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
# 查看资源使用情况
kubectl top node
kubectl top pod -n dev
2 控制器
2.1 Namespace
apiVersion: v1 #版本号
kind: Namespace #资源类型
metadata: #元数据
name: dev #命名空间名称
2.2 Pod
apiVersion: v1
kind: Pod
metadata:
name: pod-test #pod名称
namespace: dev #命名空间
labels: #标签
app: test #key-value键值对
spec:
containers: #主容器
- name: nginx #容器名称
image: nginx:1.14-alpine #容器镜像
2.3 ReplicaSet(RS)
ReplicaSet的主要作用是保证一定数量的pod正常运行,它会持续监听这些Pod的运行状态,一旦Pod发生故障,就会重启或重建。同时它还支持对pod数量的扩缩容和镜像版本的升降级。
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: #rs名称
namespace: #命名空间
labels: #标签
controller: rs
spec:
replicas: 3 #副本数量
selector: #选择器
matchLabels: #Labels匹配规则
app: nginx-pod
matchExpressions: #Expressions匹配规则
- {key: app, operator: In, values: [nginx-pod]}
template: #模板,当副本数量不足时,会根据下面的模板创建pod副本
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.71.1
ports:
- containerPort: 80
2.4 Deployment(Deploy)
2.4.1 介绍
为了更好的解决服务编排的问题,kubernetes在V1.2版本开始,引入了Deployment控制器。值得一提的是,这种控制器并不直接管理pod,而是通过管理ReplicaSet来简介管理Pod,即:Deployment管理ReplicaSet,ReplicaSet管理Pod。所以Deployment比ReplicaSet功能更加强大。
2.4.2 配置项
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3 #副本数量
revisionHistoryLimit: 3 #保留历史版本
paused: false #暂停部署,默认值:false
progressDeadlineSeconds: 600 #部署超时时间(s),默认值:600
selector:
matchLabels:
app: nginx
strategy: #镜像更新策略
type: Recreate/RollingUpdate #Recreate:重建更新,创建新pod之前先杀死所有老的pod; RollingUpdate:滚动更新(默认),杀死一部分老的,创建一部分新的,更新过程中存在两个版本的pod
rollingUpdate: #当更新策略为RollingUpdate时,才须配置此项
maxUnavailable: 25% #用来指定在升级过程中不可用Pod的最大数量,默认25%
maxSurge: 25% #用来指定在升级过程中可以超过期望的Pod最大数量,默认25%
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14-alpine
ports:
- containerPort: 80
2.5 HorizontalPodAutoscaler(HPA)
2.5.1 介绍
HPA可以获取每个Pod利用率,然后和HPA中定义的指标进行对比,同时计算出需要伸缩的具体值,最后实现Pod的数量的调整。其实HPA与之前的Deployment一样,也属于一种Kubernetes资源对象,它通过追踪分析RC控制的所有目标Pod的负载变化情况,来确定是否需要针对性地调整目标Pod的副本数,这是HPA的实现原理。
2.5.2 配置项
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: pc-hpa
namespace: dev
spec:
minReplicas: 1 #最小pod数量
maxReplicas: 10 #最大pod数量
targetCPUUtilizationPercentage: 3 #cpu使用率指标,意思是当pod使用率达到3%之后就增加新的pod
scaleTargetRef: #指定要控制的nginx信息
apiVersion: apps/v1
kind: Deployment
name: nginx
2.6 DaemonSet(DS)
2.6.1 介绍
DaemonSet类型的控制器可以保证集群中每一台(或指定)节点上都运行一个副本,一般适用于日志收集、节点监控等场景。也就是说,如果一个Pod提供的功能是节点级别的(每个节点都需要且只需要一个),那么这类Pod就适合使用DaemonSet类型的控制器创建。
2.6.2 yaml示例
apiVersion: apps/v1 kind: DaemonSet metadata: name: daemonset-test
namespace: dev spec: selector: matchLabels: app: nginx-pod template: metadata: labels: app: nginx-pod spec: containers: - name: nginx
2.7 Job
2.7.1 介绍
Job主要负责批量处理(一次要处理指定数量任务)短暂的一次性(每个任务仅运行一次就结束)的任务。
2.7.2 配置项
apiVersion: batch/v1
kind: Job
metadata:
name: #Job名称
namespace: dev #命名空间
labels:
controller: job
spec:
completions: 1 #指定job需要成功运行pods的次数。默认值:1
parallelism: 1 #指定job在任一时刻应该并发运行pods的数量。默认值:1
activeDeadlineSeconds: 30 #指定job可运行的时间期限,超过时间还未结束,系统将尝试终止。
backoffLimit: 6 #指定job失败后进行重试的次数。默认值:6
manualSelector: true #是否可以使用selector选择器选择pod,默认值:false
selector:
matchLabels:
app: counter-pod
matchExpressions: #Expressions匹配规则
- {key: app, operator: In, values: [counter-pod]}
template: #模板,当副本数量不足时,会根据下面的模板创建pod副本
metadata:
labels:
app: counter-pod
spec:
restartPolicy: Never #重启策略只能设置Never或者OnFailure
containers:
- name: counter
image: busybox:1.30
2.7.3 示例
apiVersion: batch/v1
kind: Job
metadata:
name: pc-job
namespace: dev
spec:
manualSelector: true
completions: 9 # 指定job需要成功运行pods 的次数,默认值为1
parallelism: 3 # 指定job在任一时刻应该并发运行pods的数量,默认值为1
selector:
matchLabels:
app: job-pod
template:
metadata:
labels:
app: job-pod
spec:
restartPolicy: Never
containers:
- name: job-test2022
image: busybox:1.30
command: # ["/bin/sh","-c","for i in 10 9 8 7 6 5 4 3 2 1; do echo ${i}; sleep 2; done"]
- "/bin/sh"
- "-c"
- "for i in $(seq 1 10); do echo ${i}; sleep 3; done"
2.8 Cronjob(CJ)
2.8.1 介绍
CronJob控制器以Job控制器资源为其管控对象,并借助它管理pod资源对象,Job控制器定义的作业任务在其控制器资源创建之后便会立即执行,但CronJob可以以类似于Linux操作系统的周期性任务作业计划的方式控制其运行时间点及重复运行的方式。也就是说,CronJob可以在特定的时间点(反复的)去运行job任务。
2.8.2 配置项
apiVersion: batch/v1
kind: CronJob metadata: name: pc-cronjob namespace: dev labels: controller: cronjob spec: schedule: "*/1 * * * *" #cron格式的作业调度运行时间点,用于控制任务在什么时间执行
concurrencyPolicy: #并发执行策略,用于定义前一次作业运行尚未完成时是否以及如何运行后一次的作业;Allow:允许Jobs并发运行(默认),Forbid:禁止并发运行,如果上一次运行尚未完成,则跳过下一次运行,Replace:替换,取消当前正在运行的作业并用新作业替换它
failedJobHistoryLimit: #为失败的任务执行保留的历史记录数,默认值:1
successfulJobHistoryLimit: #为成功的任务执行保留的历史记录数,默认值:3
startingDeadlineSeconds: #启动作业错误的超时时长 jobTemplate: #job控制器模板,用于cronjob控制器生成job对象 metadata: spec: template: spec: restartPolicy: Never containers: - name: cronjob2043 image: centos:7.9.2009 command: # ["/bin/sh","-c","for i in 5 4 3 2 1;do echo ${i};sleep 3;done"] - "/bin/sh" - "-c" - "for i in `seq 1 10`;do echo ${i};sleep 1;done"
2.9 Service
2.9.1 介绍
Service会对提供同一个服务的多个pod进行聚合,并且提供一个统一的入口地址。通过访问Service的入口地址就能访问到后面的pod服务。
2.9.2 配置项
apiVersion: v1 kind: Service metadata: name: service-clusterip namespace: dev spec: sessionAffinity: ClientIP # session亲和性,支持ClientIP、None两个选项 selector: app: nginx-web clusterIP: # service的ip地址,如果不写,默认生成一个 type: ClusterIP # Service类型 ports: # 端口信息 - protocol: TCP
port: 80 # Service端口 targetPort: 80 # pod端口
nodePort: 31122 # 主机端口
type选项:
ClusterIP:默认值,自动分配的虚拟ip用于集群内部访问;
NodePort:将Service通过指定的Node上的端口暴露给外部,可以在集群外部访问;
LoadBalancer:使用负载均衡器完成服务的负载转发,此模式需要外部云环境支持;
ExternalName:把集群外部的服务引入集群内部,直接使用
2.9 Ingress
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-http
namespace: dev
spec:
rules:
- host: nginx.navywang.top
http:
paths:
- path: /
backend:
serviceName: service-nginx
servicePort: 80
- host: tomcat.navywang.top
http:
paths:
- path: /
backend:
serviceName: service-tomcat
servicePort: 8080
https代理需要先生成证书
openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/C=CN/ST=BJ/L=BJ/O=nginx/CN=xxx.top"
kubectl create secret tls tls-secret --key tls.key --cert tls.crt
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-https
namespace: dev
spec:
tls:
- hosts:
- nginx.xxx.top
- tomcat.xxx.top
secretName: tls-secret
rules:
- host: nginx.xxx.top
http:
paths:
- path: /
backend:
serviceName: service-nginx
servicePort: 80
- host: tomcat.xxx.top
http:
paths:
- path: /
backend:
serviceName: service-tomcat
servicePort: 8080
2.10 EmptyDir