Table of Contents generated with DocToc
可以更好的学习k8s
powerby 火山引擎
-
集群名称
-
Kubernetes 版本
-
本地域名:
cluster.local
-
资源用量:可能需要安装prometheus
可能需要用到的命令
kubectl config view
kubectl top node
kubectl -n ${namespace} get events
kubectl get events -A
kubectl cluster-info
kubectl cluster-info dump
- 添加节点:使用kubeadmin、或者kubespary
- 删除节点
- 设置不可调度
- 恢复可调度
- 安全清空节点
节点污点
key=value
效果
- NoSchedule :一定不能被调度。
- PreferNoSchedule:尽量不要调度。
- NoExecute:不仅不会调度,还会驱逐 Node 上已有的 Pod。
# kubectl taint nodes <node-name> <taint-key>=<taint-value>:<taint-effect>
kubectl taint nodes node-1 gpu=true:NoSchedule
可能需要用到的命令
kubectl cordon ${node_name} # 节点设置为不可调度
kubectl drain --ignore-daemonsets ${node_name} # 安全清空节点,执行后节点回自动设置为不可调度
kubectk delete nodes ${node_name}
kubectl describe nodes ${node_name}
kubectl top node
kubectl get events --field-selector type=Node
kubectl get events --field-selector involvedObject.name=<node-name>
kubectl get pod
kubectl label nodes <node-name> <label-key>=<label-value>
kubectl label nodes <node-name> <label-key>=<new-label-value> --overwrite
kubectl label nodes <node-name> <label-key>-
kubectl taint nodes <node-name> <taint-key>=<taint-value>:<taint-effect>
kubectl taint nodes <node-name> <taint-key>-
节点设备资源池、用于添加node。
资源配额:
apiVersion: v1
kind: ResourceQuota
metadata:
name: mem-cpu-demo
spec:
hard:
requests.cpu: "1"
requests.memory: 1Gi
limits.cpu: "2"
limits.memory: 2Gi
资源限制:
可以使用资源限制(Resource Limits)来定义每个Pod或容器的资源使用上限
apiVersion: v1
kind: LimitRange
metadata:
name: cpu-resource-constraint
spec:
limits:
- default: # 此处定义默认限制值
cpu: 500m
defaultRequest: # 此处定义默认请求值
cpu: 500m
max: # max 和 min 定义限制范围
cpu: "1"
min:
cpu: 100m
type: Container
可能需要用到的命令
kubectl create ns <namespace_name>
kubectl delete ns <namespace_name>
基本信息
-
名称
-
命名空间
-
实例数量
-
标签
-
注解
容器信息 - []
-
容器名称
-
容器镜像
-
镜像秘钥
-
特权级容器:特权级容器(Privileged Containers)是指拥有访问主机系统特权的容器。这意味着特权级容器可以执行主机上的任何操作,包括修改主机文件系统、访问设备、修改内核参数等。使用特权级容器需要非常谨慎,因为它们可能导致安全风险和意外影响主机系统。
apiVersion: v1 kind: Pod metadata: name: my-pod namespace: my-namespace spec: containers: - name: privileged-container image: ubuntu securityContext: privileged: true
-
init容器:init 容器是一种特殊容器,在 Pod 内的应用容器启动之前运行。
apiVersion: v1 kind: Pod metadata: name: myapp-pod labels: app.kubernetes.io/name: MyApp spec: containers: - name: myapp-container image: busybox:1.28 command: ['sh', '-c', 'echo The app is running! && sleep 3600'] initContainers: - name: init-myservice image: busybox:1.28 command: ['sh', '-c', "until nslookup myservice.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for myservice; sleep 2; done"] - name: init-mydb image: busybox:1.28 command: ['sh', '-c', "until nslookup mydb.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for mydb; sleep 2; done"]
输出
NAME READY STATUS RESTARTS AGE myapp-pod 0/1 Init:0/2 0 6m
-
容器端口 -
[]
ports: - containerPort: 8888 protocol: TCP - containerPort: 2345 protocol: UDP
-
环境变量:
-
自定义
env: - name: MY_CUSTOM_VAR # 自定义环境变量名称 value: custom-value # 自定义环境变量值
-
configmap
全部引用
envFrom: - configMapRef: name: my-configmap
部分引用
env: - name: ENV_VARIABLE_1 valueFrom: configMapKeyRef: name: my-configmap key: ENV_VARIABLE_1
-
secret
全部引用
envFrom: - secretRef: name: my-secret
部分引用
env: - name: MY_SECRET_USERNAME valueFrom: secretKeyRef: name: my-secret key: USERNAME
-
实例字段
env: - name: INSTANCE_ENV valueFrom: fieldRef: fieldPath: metadata.labels['instance'] # 引用实例字段的值作为环境变量
-
容器资源
env: - name: MEMORY_LIMIT valueFrom: resourceFieldRef: resource: limits.memory # 引用内存限制作为环境变量 - name: CPU_LIMIT valueFrom: resourceFieldRef: resource: limits.cpu # 引用CPU限制作为环境变量
-
-
存储配置
- 添加卷
- configmap
- secret
- 存储卷申明
- 主机目录
- 临时目录
- 挂载卷
- 添加卷
-
生命周期
-
启动命令
- 启动参数
-
启动后处理
-
停止前处理
-
-
健康检查
- 存活检查:http、tcp、执行命令
- 就绪检查:http、tcp、执行命令
- 启动检查:http、tcp、执行命令
实例配置
- 优雅退出
- 更新策略:滚动更新、重新创建
- 最大不可用
- 最大超量
- 实例标签
- 实例注解
- dns策略
调度策略
- 节点亲和调度
- 节点污点调度
- 实例亲和调度
- 实例反亲和调度
其他
-
安全: 指定容器必须以非 root 权限运行。开启后,如果以 root 权限运行,容器将会启动失败
apiVersion: apps/v1 kind: Deployment metadata: name: my-deployment spec: replicas: 3 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: securityContext: runAsNonRoot: true # 设置容器以非 root 用户权限运行 containers: - name: my-container image: nginx
- 稳定的、唯一的网络标识符。
- 稳定的、持久的存储。
- 有序的、优雅的部署和扩缩。
- 有序的、自动的滚动更新。
参考无状态负载,多了一个handlerless服务、有状态服务必须有挂载、可以直接对接sc
Headless 服务
- 名称
- 端口
StatefulSet.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
selector:
matchLabels:
app: nginx # 必须匹配 .spec.template.metadata.labels
serviceName: "nginx"
replicas: 3 # 默认值是 1
minReadySeconds: 10 # 默认值是 0
template:
metadata:
labels:
app: nginx # 必须匹配 .spec.selector.matchLabels
spec:
terminationGracePeriodSeconds: 10
containers:
- name: nginx
image: registry.k8s.io/nginx-slim:0.8
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "my-storage-class"
resources:
requests:
storage: 1Gi
运行策略
- 成功运行次数
- 可并行数
- 最大超时时间
- 重试次数
- 重启策略: never 、OnFailure
参考无状态负载,少了实例配置、多了运行策略
job.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: my-job
spec:
template:
metadata:
name: my-job-pod
spec:
containers:
- name: my-container
image: busybox
command: ["echo", "Hello from the Job"]
restartPolicy: Never # 一次性任务,不会重启
backoffLimit: 4 # 失败重试次数
定时重复
- Cron 语句
- 成功任务保留数
- 失败任务保留数
- 并发策略:Allow、Forbid、Replace
参考Job,多了定时策略
*DaemonSet*.yaml
参考无状态负载
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: my-daemonset
spec:
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-container
image: nginx
-
集群内访问(ClusterIP)
-
节点端口访问(NodePort)
-
负载均衡(LoadBalancer)
service.yaml
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 8080
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-service
port:
number: 80
ceph、openlocal
配置项 - confimap
保密字典 - secret