配置清单详解
1 储备知识
k8s集群的构成:由一系列组件构成
组件:负责某一功能的应用
资源类型:本质就是组件负责管理维护的数据的种类
资源:resource,资源类型相当于一张表,resource就是表里的数据。
api:负责调用k8s各种功能的接口,请求接口会完成一些操作,并返回相应的数据。
2 资源清单是什么
资源清单:k8s中有特定格式的清单,用来声明期望创建一个什么样子的资源对象。
- 有yaml格式和json格式
3 为什么要用资源清单来部署应用
两种部署应用的方式
- 1、kubectl run 命令运行应用
- 2、资源清单 搭配 kubectl apply -f 来启动应用(最推荐)
执行流程:
- 1、kubectl 将 yaml清单交给apiserver
- 2、apiserver将获取的资源清单存入etcd
- 3、controller
4 如何用资源清单
4.1 生成与查看清单版本
# 生成yaml
kubectl create deployment web --iamge=nginx:1.20 --dry-run=client -o yaml >web.yaml
# 查看yaml的各种参数
kubectl explain deployment
required: 必须的字段
4.2 常用字段
主要就是5个字段。
1、apiVersion: group/version
# kubectl api-version
api资源属于哪个组下的第一个版本
不同版本有不同的功能
2、kind:
资源类别:pod replicaset deployment statefulset daemonset job cronjob
3、metadata:
元数据,主要提供以下字段
name:
namespace
labels:
annotations:
4、spec: 定义目标资源的期望状态
kubectl explain deployment.spec
5、status: 显示资源的当前状态
4.2 yaml文件格式说明
4.2.1 语法格式
yaml非常简洁和强大,远比json更加方便。
基本语法:
- 大小写敏感
- 使用缩进表示层级关系
- 缩进不允许用tab,只允许用空格
- 缩进的空格数目不重要,同一层级对其即可,推荐是4个。
-
表示注释,从#号开始到行尾
结构类型:了解两种即可
- lists:列表
- maps:字典,key:value结构。
containers:
- name: 1 # 列表1
image: xxx
- image: xxx # 列表2
name: 2
env:
- name: xx
value: yy
- name: xxx
value: yyy
4.2.2 完整的yaml清单
spec:
containers:
- name: nginx
image: nginx:v1
imagePullPolicy: Always #Always(default)IfNotPresent Never
workdingDir: /usr/share/nginx/html
volumeMounts:
- name: webroot
mountPath: /usr/share/nginx/html
readOnly: true
volumes:
- name: webroot
emptyDir: {}
- name: hosts
hostPath:
path: /etc/hosts
type: File
- name: secret-volume
secretName:
defaultMode: 420
- name: configmap-volume
configMap:
name: nginx-conf
defaultMode: 420
ports: # 非必要,容器启动会自动暴露port,可以起到提示说明的作用
- name: http
containerPort: 80
protocol: TCP
env:
- name: TZ
value: Asia/Shanghai
- name: LANG
value: en_US.utf-8
resources:
limits:
cpu: 1000m # m代表千分之一核
memory: 1024MiB # 代表1024
requests:
cpu: 100m
memory: 512MiB
readinessProbe:
httpGet:
path: /
port: 80
timeoutSeconds: 2
initialDelaySeconds: 60
livenessProbe:
exec:
command:
- cat
- /health
httpGet:
path: /_health
port: 8080
httpHeaders:
- name: end-user
value: egon
tcpSocket:
port: 80
initialDelaySeconds: 60 # 初始化时间
timeoutSeconds: 2 # 超时时间
periodSeconds: 5 # 检测间隔
successThreshold: 1 # 检查成功为1次,表示就绪
failureThreshold: 3 # 检查失败为3次,表示未就绪
securityContext:
privileged: false #不以特权模式启动
restartPolicy: Always
nodeSelector:
region: subnet7
imagePullSecrets: # 可选,拉取似有镜像时使用secret
- name: default-docker-cfg-85657
hostNetwork: false # 可选,主机模式,会占用主机端口
4.2.3 pod 拉私有仓库镜像
官网有操作流程:https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
1、登陆私有仓库,拿到登陆信息。
nerdctl login --username=xxxx yyyy
cat /root/.docker/config.json
2、将登陆信息封装称secret
kubectl create secret generic regcred \
--from-file=.dockerconfigjson=<path/to/.docker/config.json> \
--type=kubernetes.io/dockerconfigjson
3、yaml中调用secret启动pod
imagePullSecrets:
- name: default-docker-cfg-85657
4.2.4 特权模式(补充)
privileged: false
-
默认值:false,表示不会以特权模式运行
1、不能直接访问宿主机的设备文件 2、不能修改网络设置,或者使用套接字文件 3、不能加载/卸载内核模块 4、不能直接访问宿主机的内存等 -
特权模式:容器可以拥有与宿主机同等全新,除非需要直接访问宿主机的硬件或执行一些底层操作不得不用,否则不建议。
非特权模式的安全性:
1、限制容器的权限,减少了攻击面
2、容器内应用程序被攻击,攻击者很难获取宿主机的控制权
4.2.5 资源单位
cpu单位m:代表千分之一核心,比如:50m= 5%核心
cpu总核数:= 物理cpu个数 * 每颗物理cpu的核数
cpu总逻辑cpu数:= 物理cpu个数 * 每颗物理cpu的核数 * 超线程数
内存单位Mi:1Mi = 1024 x 1024,而平时使用的1M = 1000x1000
kubectl describe node
Allocatable Memory: 该节点上的真正可用内存:= 物理内存-k8s预留内存

浙公网安备 33010602011771号