配置清单详解

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预留内存
posted @ 2026-07-07 20:37  cuckooyang  阅读(15)  评论(0)    收藏  举报