K8S -- 相关操作

命令行工具 -- kubectl

在任意节点使用kubectl

  1. 将 master 节点中 /etc/kubernetes/admin.conf 拷贝到需要运行的服务器的 /etc/kubernetes 目录中

    [root@hcss-ecs-9883 /]# scp /etc/kubernetes/admin.conf root@k8s-node:/etc/kubernetes
  2. 在对应的服务器上配置环境变量

    [root@hcss-ecs-9883 /]# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
    [root@hcss-ecs-9883 /]# source ~/.bash_profile

资源操作

创建对象
  • 创建资源

    [root@hcss-ecs-9883 /]# kubectl create -f ./my-manifest.yaml 
  • 使用多个文件创建资源

    [root@hcss-ecs-9883 /]# kubectl create -f ./my1.yaml -f ./my2.yaml
  • 使用目录下的所有清单文件来创建资源

    [root@hcss-ecs-9883 /]# kubectl create -f ./dir
  • 使用url来创建资源

    [root@hcss-ecs-9883 /]# kubectl create -f https://git.io/vPieo
  • 启动一个nginx实例

    [root@hcss-ecs-9883 /]# kubectl run nginx --image=nginx
  • 获取pod和svc文档

    [root@hcss-ecs-9883 /]# kubectl explain pods
    [root@hcss-ecs-9883 /]# kubectl explain svc
显示和查找资源
  • 列出所有namespace中的service

    [root@hcss-ecs-9883 /]# kubectl get services 
  • 列出所有namespace中的pod

    [root@hcss-ecs-9883 /]# kubectl get pods --all-namespaces
  • 列表所有pod并显示详细信息

    [root@hcss-ecs-9883 /]# kubectl get pods -o wide
  • 列出指定deployment

    [root@hcss-ecs-9883 /]# kubectl get deployment my-dep
  • 列出该namespace中所有pod(包括未初始化的)

    [root@hcss-ecs-9883 /]# kubectl get pods --include-uninitialized
  • 使用详细输出来描述命令

    [root@hcss-ecs-9883 /]# kubectl describe nodes my-node
    [root@hcss-ecs-9883 /]# kubectl describe pods my-pod
更新资源
  • 滚动更新pod frontend-v1

    [root@hcss-ecs-9883 /]# kubectl rolling-update frontend-v1 -f frontend-v2.json  
  • 更新资源名称并更新镜像

    [root@hcss-ecs-9883 /]# kubectl rolling-update frontend-v1 frontend-v2 --image=image:v2
  • 更新frontend pod中的镜像

    [root@hcss-ecs-9883 /]# kubectl rolling-update frontend --image=image:v2
  • 退出已存在的进行中的滚动更新

    [root@hcss-ecs-9883 /]# kubectl rolling-update frontend-v1 frontend-v2 --rollback 
修补资源
  • 部分更新节点

    [root@hcss-ecs-9883 /]# kubectl patch node k8s-node-1 -p '{"spec":{"unschedulable":true}}'
编辑资源
  • 编辑名为docker-registry的service

    [root@hcss-ecs-9883 /]# kubectl edit svc/docker-registry
scale -- 扩容与缩容
  • 扩充nginx的数量

    [root@hcss-ecs-9883 /]# kubectl get deployment
    NAME           READY   UP-TO-DATE   AVAILABLE   AGE
    nginx-deploy   1/1     1            1           8m43s
    [root@hcss-ecs-9883 /]# kubectl scale deploy --replicas=3 nginx-deploy
    [root@hcss-ecs-9883 /]# kubectl get deployment
    NAME           READY   UP-TO-DATE   AVAILABLE   AGE
    nginx-deploy   3/3     3            3           8m43s
删除资源
  • 删除pod.json文件中定义的类型和名称的pod

    [root@hcss-ecs-9883 /]# kubectl delete -f ./pod.json 
  • 删除名为“baz”的pod和名为“foo”的service

    [root@hcss-ecs-9883 /]# kubectl delete pod,service baz foo
  • 删除具有name=myLabel标签的pod和service

    [root@hcss-ecs-9883 /]# kubectl delete pods,services -l name=myLabel
  • 删除具有 name=myLabel 标签的 pod 和 service(包括尚未初始化的)

    [root@hcss-ecs-9883 /]# kubectl delete pods,services -l name=myLabel --include-uninitialized
  • 删除 my-ns namespace 下的所有 pod 和 serivce(包括尚未初始化的)

    [root@hcss-ecs-9883 /]# kubectl -n my-ns delete po,svc --all
pod相关命令
  • 输出 pod 的日志(stdout)

    [root@hcss-ecs-9883 /]# kubectl logs my-pod
  • 连接到运行中的容器

    [root@hcss-ecs-9883 /]# kubectl attach my-pod -i 
格式化输出
  • -o json:输出json格式

  • -o name:仅打印资源名称

  • -o wide:以纯文本格式输出所有信息

  • -o yaml:输出yaml格式

pod

pod生命周期

image-20240401224437641

配置文件

apiVersion: v1 # api 文档版本
kind: Pod  # 资源对象类型,也可以配置为像Deployment、StatefulSet这一类的对象
metadata: # Pod 相关的元数据,用于描述 Pod 的数据
  name: nginx-demo # Pod 的名称
  labels: # 定义 Pod 的标签
    type: app # 自定义 label 标签,名字为 type,值为 app
    test: 1.0.0 # 自定义 label 标签,描述 Pod 版本号
  namespace: 'default' # 命名空间的配置
spec: # 期望 Pod 按照这里面的描述进行创建
  containers: # 对于 Pod 中的容器描述
  - name: nginx # 容器的名称
    image: nginx:1.7.9 # 指定容器的镜像
    imagePullPolicy: IfNotPresent # 镜像拉取策略,指定如果本地有就用本地的,如果没有就拉取远程的
    command: # 指定容器启动时执行的命令
    - nginx
    - -g
    - 'daemon off;' # nginx -g 'daemon off;'
    workingDir: /usr/share/nginx/html # 定义容器启动后的工作目录
    ports:
    - name: http # 端口名称
      containerPort: 80 # 描述容器内要暴露什么端口
      protocol: TCP # 描述该端口是基于哪种协议通信的
    - env: # 环境变量
      name: JVM_OPTS # 环境变量名称
      value: '-Xms128m -Xmx128m' # 环境变量的值
    reousrces:
      requests: # 最少需要多少资源
        cpu: 100m # 限制 cpu 最少使用 0.1 个核心
        memory: 128Mi # 限制内存最少使用 128兆
      limits: # 最多可以用多少资源
        cpu: 200m # 限制 cpu 最多使用 0.2 个核心
        memory: 256Mi # 限制 最多使用 256兆
  restartPolicy: OnFailure # 重启策略,只有失败的情况才会重启

探针

类型
  • startupProbe

    用于判断应用程序是否已经启动了

    当配置了 startupProbe 后,会先禁用其他探针,直到 startupProbe 成功后,其他探针才会继续

    spec: # 期望 Pod 按照这里面的描述进行创建
      containers: # 对于 Pod 中的容器描述
        startupProbe: # 启动探针
          httpGet: # 探测方式
            path: /api/startup
            port: 80
  • LivenessProbe

    用于探测容器中的应用是否运行,如果探测失败,kubelet 会根据配置的重启策略进行重启,若没有配置,默认就认为容器启动成功,不会执行重启策略。

    spec: # 期望 Pod 按照这里面的描述进行创建
      containers: # 对于 Pod 中的容器描述
        livenessProbe: # 存活探针
          failureThreshold: 5 # 失败次数
          httpGet: # 探测方式
            path: /health
            port: 8080
            scheme: HTTP
          initialDelaySeconds: 60 # 初始化时间
          periodSeconds: 10 # 监测间隔时间
  • ReadinessProbe

    用于探测容器内的程序是否健康,它的返回值如果返回 success,那么就认为该容器已经完全启动,并且该容器是可以接收外部流量的。

    spec: # 期望 Pod 按照这里面的描述进行创建
      containers: # 对于 Pod 中的容器描述
        readinessProbe: # 就绪探针
          failureThreshold: 3 # 错误次数
          httpGet: # 探测方式
            path: /ready
            port: 8181
            scheme: HTTP
          periodSeconds: 10 # 间隔时间
          successThreshold: 1 # 成功次数
探测方式
  • ExecAction

    在容器内部执行一个命令,如果返回值为 0,则任务容器时健康的。

    livenessProbe:
      exec:
        command:
          - cat
          - /health
  • TCPSocketAction

    通过 tcp 连接监测容器内端口是否开放,如果开放则证明该容器健康

    livenessProbe:
      tcpSocket:
        port: 80
  • HTTPGetAction

    生产环境用的较多的方式,发送 HTTP 请求到容器内的应用程序,如果接口返回的状态码在 200~400 之间,则认为容器健康。

    livenessProbe:
      failureThreshold: 5
      httpGet:
        path: /health
        port: 8080
        scheme: HTTP
        httpHeaders:
          - name: xxx
参数配置
  • initialDelaySeconds: 60:初始化时间

  • timeoutSeconds: 2:超时时间

  • periodSeconds: 5:监测间隔时间

  • successThreshold: 1:检查 1 次成功就表示成功

  • failureThreshold: 2:监测失败 2 次就表示失败

生命周期配置
spec: # 期望 Pod 按照这里面的描述进行创建
  containers: # 对于 Pod 中的容器描述
    lifecycle: # 生命周期配置
      postStart: # 容创建完成后执行的动作,不能保证该操作一定在容器的 command 之前执行,一般不使用
        exec: # 可以是 exec / httpGet / tcpSocket
          command:
            - sh
            - -c
            - 'mkdir /data'
      preStop: # 在容器停止前执行的动作
        httpGet: # 发送一个 http 请求
          path: /
          port: 80
        exec: # 执行一个命令
          command:
            - sh
            - -c
            - sleep 9
  • preStop

    但是需要注意,由于 k8s 默认给 pod 的停止宽限时间为 30s,如果我们停止操作会超过 30s 时,不要光设置 sleep 50,还要将 terminationGracePeriodSeconds: 30 也更新成更长的时间,否则 k8s 最多只会在这个时间的基础上再宽限几秒,不会真正等待 50s

资源调度

Deployment

image-20240320153650006

配置文件

apiVersion: apps/v1 # deployment api 版本
kind: Deployment # 资源类型为 deployment
metadata: # 元信息
  labels: # 标签
    app: nginx-deploy # 具体的 key: value 配置形式
  name: nginx-deploy # deployment 的名字
  namespace: blog # 所在的命名空间
spec:
  replicas: 1 # 期望副本数
  revisionHistoryLimit: 10 # 进行滚动更新后,保留的历史版本数
  selector: # 选择器,用于找到匹配的 RS
    matchLabels: # 按照标签匹配
      app: nginx-deploy # 匹配的标签key/value
  strategy: # 更新策略
    rollingUpdate: # 滚动更新配置
      maxSurge: 25% # 进行滚动更新时,更新的个数最多可以超过期望副本数的个数/比例
      maxUnavailable: 25% # 进行滚动更新时,最大不可用比例更新比例,表示在所有副本数中,最多可以有多少个不更新成功
    type: RollingUpdate # 更新类型,采用滚动更新
  template: # pod 模板
    metadata: # pod 的元信息
      labels: # pod 的标签
        app: nginx-deploy
    spec: # pod 期望信息
      containers: # pod 的容器
      - image: nginx:1.7.9 # 镜像
        imagePullPolicy: IfNotPresent # 拉取策略
        name: nginx-docker # 容器名称
      restartPolicy: Always # 重启策略
      terminationGracePeriodSeconds: 30 # 删除操作最多宽限多长时间
滚动更新

只有修改了 deployment 配置文件中的 template 中的属性后,才会触发更新操作

  • 查看滚动更新过程

    # 修改deployment文件
    [root@hcss-ecs-9883 /]# kubectl edit deployment <deployment_name>
    # 查看滚动更新过程
    [root@hcss-ecs-9883 /]# kubectl rollout status deploy <deployment_name>
回滚
# 获取 revison 的列表
[root@hcss-ecs-9883 /]# kubectl rollout history deployment/<deployment_name>
deployment.apps/nginx-deploy 
REVISION  CHANGE-CAUSE
1         <none>
# 回退到上一个版本
[root@hcss-ecs-9883 /]# kubectl rollout undo deployment/<deployment_name>
# 回退到指定的 revision
[root@hcss-ecs-9883 /]# kubectl rollout undo deployment/<deployment_name> --to-revision=2
扩容与缩容

通过 kube scale命令可以进行自动扩容/缩容

暂停与恢复
# 暂停更新
[root@hcss-ecs-9883 /]# kubectl rollout pause deployment <name> 
# 恢复更新
[root@hcss-ecs-9883 /]# kubectl rollout deploy <name>

StatefulSet

image-20240320153445812

配置文件

--- # 表示在yaml文件中嵌套另一个yaml文件
apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
---
apiVersion: apps/v1
kind: StatefulSet # 资源类型
metadata:
  name: web # statefulSet的名字
spec:
  serviceName: "nginx" # 使用哪个Service来管理dns
  replicas: 1 # 期望副本数
  template:
    metadata:
      matchLabels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports: # 容器内部要暴露的端口
        - containerPort: 80 # 具体要暴露的端口号
          name: web # 该端口配置的名字
        volumeMounts: # 加载数据卷
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates: # 数据卷模板
  - metadata:
      name: www
      annotations:
        volume.alpha.kubernetes.io/storage-class: anything
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi
扩容与缩容

通过 kube scale命令可以进行自动扩容/缩容

滚动更新

只有修改了 StatefulSet 配置文件中的 template 中的属性后,才会触发更新操作。由于 pod 是有序的,在 StatefulSet 中更新时是基于 pod 的顺序倒序更新的

  • 更新

    # statefulSet版本
    [root@hcss-ecs-9883 /]# kubectl edit statefulSet <statefulSet_name>
    # 查看滚动更新过程
    [root@hcss-ecs-9883 /]# kubectl rollout status sts <statefulSet_name>
  • RollingUpdate

    利用滚动更新中的 partition 属性,可以实现简易的灰度发布(金丝雀发布)的效果

    例如我们有 5 个 pod,如果当前 partition 设置为 3,那么此时滚动更新时,只会更新那些 序号 >= 3 的 pod

    spec:
      updateStrategy: # 更新策略
      	rollingUpdate: # 滚动更新
      		partition: 0
      	type: RollingUpdate # 更新方案
  • OnDelete

    只有在 pod 被删除时会进行更新操作

    spec:
    	updateStrategy: # 更新策略
      		type: OnDelete  # 更新方案
删除
  • 级联删除:删除 statefulset 时会同时删除 pods

    [root@hcss-ecs-9883 /]# kubectl delete statefulset <statefulset_name>
    # 删除 service
    [root@hcss-ecs-9883 /]# kubectl delete service <service_name>
  • 非级联删除:删除 statefulset 时不会删除 pods,删除 sts 后,pods 就没人管了,此时再删除 pod 不会重建的

    [root@hcss-ecs-9883 /]# kubectl deelte sts <statefulset_name> --cascade=false
    # 删除 service
    [root@hcss-ecs-9883 /]# kubectl delete service <service_name>

DaemonSet

示例图

image-20240402013927159

配置文件

apiVersion: apps/v1
kind: DaemonSet # 创建DameonSet资源
metadata:
  name: fluentd # 名字
spec:
  selector: # 选择器,用于创建
  	mathcLabels:
  	  app: logging
  template:
    metadata:
      labels:
        app: logging
        id: fluentd
      name: fluentd
    spec:
      nodeSelector:
        svc_type: microsvc
      containers:
      - name: fluentd-es
        image: agilestacks/fluentd-elasticsearch:v1.3.0
        env: # 环境变量配置
         - name: FLUENTD_ARGS
           value: -qq
        volumeMounts: # 加载数据卷
         - name: containers
           mountPath: /var/lib/docker/containers
         - name: varlog
           mountPath: /varlog
      volumes: # 定义数据卷
         - hostPath:
             path: /var/lib/docker/containers
           name: containers
         - hostPath:
             path: /var/log
           name: varlog
  • 向node添加标签

    [root@hcss-ecs-9883 /]# kubectl label no <nodes_name> [label_key]=[label_value]
  • 滚动更新

    不建议使用 RollingUpdate,建议使用 OnDelete 模式,这样避免频繁更新 ds

HPA自动扩/缩容

开启指标服务

Kubectl top pods需要优先开启指标服务

[root@hcss-ecs-9883 /]# wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml -O metrics-server-components.yaml
[root@hcss-ecs-9883 /]# sed -i 's/k8s.gcr.io\/metrics-server/registry.cn-hangzhou.aliyuncs.com\/google_containers/g' metrics-server-components.yaml
[root@hcss-ecs-9883 /]# vim metrics-server-components.yaml
### spec.template.spec
containers:
- args:
  ...
  - --kubelet-insecure-tls
  ...
###
[root@hcss-ecs-9883 /]# kubectl apply -f metrics-server-components.yaml
# 查看 pod 状态
[root@hcss-ecs-9883 /]# kubectl get pods --all-namespaces | grep metrics
  1. 前提操作

    实现 cpu 或内存的监控,首先有个前提条件是该对象必须配置了 resources.requests.cpu 或 resources.requests.memory 才可以,可以配置当 cpu/memory 达到上述配置的百分比后进行扩容或缩容

    ### spec.template.spec.containers
    resources:
      limits:
      	cpu: 100m
      	memory: 128Mi
      requests:
      	cpu: 100m
      	memory: 128Mi
    ###
  2. 执行命令

    最少创建2个,最多创建5个pod

    [root@hcss-ecs-9883 /]# kubectl autoscale {deploy|sts} {<deploy_name>|<sts_name>} --cpu-percent=20 --min=2 --max=5
  3. 获取HPA信息

    [root@hcss-ecs-9883 /]# kubectl get hpa

服务发布

示例图

image-20240402022529693

image-20240402132218865

配置文件

apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
  labels:
    app: nginx-svc
spec:
  ports:
  - name: http # service 端口配置的名称
    protocol: TCP # 端口绑定的协议,支持 TCP、UDP、SCTP,默认为 TCP
    port: 80 # service 自己的端口,在使用内网ip时使用
    targetPort: 80 # 目标 pod 的端口
  - name: https
    port: 443 # Kubernetes中的服务之间访问的端口
    protocol: TCP
    targetPort: 443 # 容器的端口(最根本的端口入口),与制作容器时暴露的端口一致
    NodePort: 433 # 外部机器可访问的端口
  selector: # 选中当前 service 匹配哪些 pod,对哪些 pod 的东西流量进行代理
    app: nginx
  type: NodePort # 随机启动一个端口

Service定义

  • 创建service

    [root@hcss-ecs-9883 /]# kubectl create -f <service_file>.yaml
  • 查看service信息

    [root@hcss-ecs-9883 /]# kubectl get svc
  • 创建其他 pod 通过 service name 进行访问

    # 例如
    [root@hcss-ecs-9883 /]# kubectl exec -it busybox -- sh
    [root@hcss-ecs-9883 /]# curl http://nginx-svc
    # 默认在当前 namespace 中访问,如果需要跨 namespace 访问 pod,则在 service name 后面加上 .<namespace> 即可
    [root@hcss-ecs-9883 /]# curl http://nginx-svc.default

代理k8s外部服务

配置文件

编写 service 配置文件时,不指定 selector 属性,自己创建 endpoint

  • 各环境访问名称统一

  • 访问k8s集群外的其他服务

  • 项目迁移

apiVersion: v1
kind: Endpoints
metadata:
  labels:
    app: wolfcode-svc-external # 与 service 一致
  name: wolfcode-svc-external # 与 service 一致
  namespace: default # 与 service 一致
subsets:
- addresses:
  	- ip: <target ip> # 目标 ip 地址
  ports: # 与 service 一致
  	- name: http
      port: 80
      protocol: TCP

ingress-nginx

配置文件

apiVersion: networking.k8s.io/v1
kind: Ingress # 资源类型为 Ingress
metadata:
  name: wolfcode-nginx-ingress
  annotations:
    # 指定 Ingress Controller 的类型
    kubernetes.io/ingress.class: "nginx"
    # 指定我们的 rules 的 path 可以使用正则表达式
    nginx.ingress.kubernetes.io/use-regex: "true"
    # 连接超时时间,默认为 5s
    nginx.ingress.kubernetes.io/proxy-connect-timeout: "600"
    # 后端服务器回转数据超时时间,默认为 60s
    nginx.ingress.kubernetes.io/proxy-send-timeout: "600"
    # 后端服务器响应超时时间,默认为 60s
    nginx.ingress.kubernetes.io/proxy-read-timeout: "600"
    # 客户端上传文件,最大大小,默认为 20m
    nginx.ingress.kubernetes.io/proxy-body-size: "10m"
    # URL 重写
    nginx.ingress.kubernetes.io/rewrite-target: /
spec: 
  rules: # ingress 规则配置,可以配置多个
  - host: k8s.wolfcode.cn # 域名配置,可以使用通配符 *
    http:
      paths: # 相当于 nginx 的 location 配置,可以配置多个
      - pathType: Prefix # 路径类型,按照路径类型进行匹配 ImplementationSpecific 需要指定 IngressClass,具体匹配规则以 IngressClass 中的规则为准。Exact:精确匹配,URL需要与path完全匹配上,且区分大小写的。Prefix:以 / 作为分隔符来进行前缀匹配
        backend:
          service: 
            name: nginx-svc # 代理到哪个 service
            port: 
              number: 80 # service 的端口
        path: /api # 等价于 nginx 中的 location 的路径前缀匹配

常用类型

  • ClusterIP:只能在集群内部使用,不配置类型的话默认就是 ClusterIP

  • ExternalName:返回定义的 CNAME 别名,可以配置为域名

  • NodePort:配置指定端口,需要在30000~32767端口范围内,如果不指定会随机指定端口。该端口直接绑定在Node上,且集群中的每一个node都会绑定这个端口

  • LoadBalancer:使用云服务商(阿里云、腾讯云等)提供的负载均衡器服务

配置管理

使用

###spec.containers
volumeMounts: # 加载数据卷
  - name: db-config # 表示加载volumes属性中哪个数据卷
    mountPath: "/usr/local/..." # 想要将数据卷中的文件加载到哪个目录下
    readOnly: true # 是否只读
### spec
volumes: # 数据卷挂载 configmap、secret
  - name: db-config # 数据卷的名字 
    configMap: # 数据卷的类型
      name: test-dir-config # configMap的名字,必须跟想要加载的configmap相同
      items: # 对configmap中的key进行映射,如果不指定,默认会将configmap中的所有key全部转换为一个个同名的文件
      - key: "db.properties" # configMap中的key
        path: "db.properties" # 将该key的值转换为文件

ConfigMap

一般用于去存储 Pod 中应用所需的一些配置信息,或者环境变量,将配置于 Pod 分开,避免应为修改配置导致还需要重新构建 镜像与容器。

使用 ConfigMap 或 Secret 挂载到目录的时候,会将容器中源目录给覆盖掉

命令
  • 查看创建示例

    [root@hcss-ecs-9883 /]# kubectl create configmap -h 
  • 根据指定的文件创建ConfigMap

    [root@hcss-ecs-9883 /]# kubectl create configmap <configMap_name> --from-file=<key>=<file_address.yaml>

SubPath

覆盖目录中的某一个文件,要使用到 SubPath

修改配置使用的文件即可

持久化存储

Volumes

使用

###spec.containers
volumeMounts: # 加载数据卷
  - name: test-volume # 表示加载volumes属性中哪个数据卷
    mountPath: "/usr/local/..." # 想要将数据卷中的文件加载到pod哪个目录下
### spec
volumes: # 数据卷挂载 configmap、secret
  - name: test-volume # 数据卷的名字 
    hostPath: # 与主机共享目录,加载主机中的指定目录到容器中
      path: /data # 节点中的目录
      type: Directory # 检查类型
  • HostPath

    将节点上的文件或目录挂载到 Pod 上,此时该目录会变成持久化存储目录,即使 Pod 被删除后重启,也可以重新加载到该目录,该目录下的文件不会丢失

    • 空字符串:默认类型,不做任何检查

    • DirectoryOrCreate:如果给定的 path 不存在,就创建一个 755 的空目录

    • Directory:这个目录必须存在

    • FileOrCreate:如果给定的文件不存在,则创建一个空文件,权限为 644

    • File:这个文件必须存在

    • Socket:UNIX 套接字,必须存在

    • CharDevice:字符设备,必须存在

    • BlockDevice:块设备,必须存在

  • EmptyDir

    EmptyDir 主要用于一个 Pod 中不同的 Container 共享数据使用的,由于只是在 Pod 内部使用,因此与其他 volume 比较大的区别是,当 Pod 如果被删除了,那么 emptyDir 也会被删除。

    ### spec
    volumes: # 数据卷挂载 configmap、secret
      - name: test-volume # 数据卷的名字 
        emptyDir: {}

NFS

nfs 卷能将 NFS (网络文件系统) 挂载到你的 Pod 中。

安装

# 安装 nfs
[root@hcss-ecs-9883 /]# yum install nfs-utils -y
# 启动 nfs
[root@hcss-ecs-9883 /]# systemctl start nfs-server
# 创建共享目录
[root@hcss-ecs-9883 /]# mkdir -p /data/nfs && cd /data/nfs && mkdir rw && mkdir ro
# 设置共享目录 export
[root@hcss-ecs-9883 /]# vim /etc/exports
###
/data/nfs/rw 192.168.113.0/24(rw,sync,no_subtree_check,no_root_squash)
/data/nfs/ro 192.168.113.0/24(ro,sync,no_subtree_check,no_root_squash)
###
# 重新加载
[root@hcss-ecs-9883 /]# exportfs -f
[root@hcss-ecs-9883 /]# systemctl reload nfs-server
# 到其他测试节点安装 nfs-utils 并加载测试
[root@hcss-ecs-9883 /]# mkdir -p /mnt/nfs/rw
[root@hcss-ecs-9883 /]# mount -t nfs 192.168.113.121:/data/nfs/rw /mnt/nfs/rw

使用

###spec.containers
volumeMounts: # 加载数据卷
  - name: test-nfs # 表示加载volumes属性中哪个数据卷
    mountPath: "/usr/local/..." # 想要将数据卷中的文件加载到pod哪个目录下
### spec
volumes: # 数据卷挂载 configmap、secret
  - name: test-volume
    nfs:
      server: my-nfs-server.example.com # 网络存储服务地址
      path: /my-nfs-volume # 网络存储路径
      readOnly: true # 是否只读

PV

持久卷(PersistentVolume,PV) 是集群中的一块存储,可以由管理员事先制备, 或者使用存储类(Storage Class)来动态制备。 持久卷是集群资源,就像节点也是集群资源一样。PV 持久卷和普通的 Volume 一样, 也是使用卷插件来实现的,只是它们拥有独立于任何使用 PV 的 Pod 的生命周期。 此 API 对象中记述了存储的实现细节,无论其背后是 NFS、iSCSI 还是特定于云平台的存储系统。

配置文件

### spec
capacity: # 容量配置
  storage: 5Gi # pv 的容量
volumeMode: Filesystem # 存储类型为文件系统
accessModes: # 访问模式:ReadWriteOnce、ReadWriteMany、ReadOnlyMany
  - ReadWriteOnce # 可被单节点独写
persistentVolumeReclaimPolicy: Recycle # 回收策略
storageClassName: slow # 创建 PV 的存储类名,需要与 pvc 的相同
mountOptions: # 加载配置
  - hard
  - nfsvers=4.1
nfs: # 连接到 nfs
  path: /data/nfs/rw/test-pv # 存储路径
  server: 192.168.113.121 # nfs 服务地址
  • 创建

    [root@hcss-ecs-9883 /]# kubectl create -f <pv_file>
  • 状态

    • Available:空闲,未被绑定

    • Bound:已被pvc绑定

    • Released:PVC被删除,资源已回收,且PV未被重新使用

    • Failed:自动回收失败

PVC

持久卷申领(PersistentVolumeClaim,PVC) 表达的是用户对存储的请求。概念上与 Pod 类似。 Pod 会耗用节点资源,而 PVC 申领会耗用 PV 资源。Pod 可以请求特定数量的资源(CPU 和内存);同样 PVC 申领也可以请求特定的大小和访问模式 (例如,可以要求 PV 卷能够以 ReadWriteOnce、ReadOnlyMany 或 ReadWriteMany 模式之一来挂载,参见访问模式)。

配置文件

### spec
  accessModes:
    - ReadWriteOnce # 权限需要与对应的 pv 相同
volumeMode: Filesystem
resources:
  requests:
    storage: 8Gi # 资源可以小于 pv 的,但是不能大于,如果大于就会匹配不到 pv
storageClassName: slow # 名字需要与对应的 pv 相同
#  selector: # 使用选择器选择对应的 pv
#    matchLabels:
#      release: "stable"
#    matchExpressions:
#      - {key: environment, operator: In, values: [dev]}
  • 创建

    [root@hcss-ecs-9883 /]# kubectl create -f <pvc_file>
  • 使用

    ###spec.containers
    volumeMounts: # 加载数据卷
      - name: test-nfs # 表示加载volumes属性中哪个数据卷
        mountPath: "/usr/local/..." # 想要将数据卷中的文件加载到pod哪个目录下
    ### spec
    volumes: # 数据卷挂载 configmap、secret
      - name: test-pvc
        persistentVolumeClaim:
          claimName: pvc-name

StroageClass

image-20240402142744238

高级调度

初始化窗口

InitContainer

在真正的容器启动之前,先启动 InitContainer,在初始化容器中完成真实容器所需的初始化操作,完成后再启动真实的容器。

配置文件

spec:
  initContainers:
  - image: nginx
    imagePullPolicy: IfNotPresent
    command: ["sh", "-c", "echo 'inited;' >> ~/.init"]
    name: init-test

污点 Taint

污点:是标注在节点上的,当我们在一个节点上打上污点以后,k8s 会认为尽量不要将 pod 调度到该节点上,除非该 pod 上面表示可以容忍该污点,且一个节点可以打多个污点,此时则需要 pod 容忍所有污点才会被调度该节点。

# 为节点打上污点
[root@hcss-ecs-9883 /]# kubectl taint node k8s-master key=value:NoSchedule
# 移除污点
[root@hcss-ecs-9883 /]# kubectl taint node k8s-master key=value:NoSchedule-
# 查看污点
[root@hcss-ecs-9883 /]# kubectl describe no k8s-master

污点的影响

  • NoSchedule:不能容忍的 pod 不能被调度到该节点,但是已经存在的节点不会被驱逐

  • NoExecute:不能容忍的节点会被立即清除,能容忍且没有配置 tolerationSeconds 属性,则可以一直运行,设置了 tolerationSeconds: 3600 属性,则该 pod 还能继续在该节点运行 3600 秒

容忍 Toleration

容忍:是标注在 pod 上的,当 pod 被调度时,如果没有配置容忍,则该 pod 不会被调度到有污点的节点上,只有该 pod 上标注了满足某个节点的所有污点,则会被调度到这些节点

# pod 的 spec 下面配置容忍
tolerations:
- key: "污点的 key"
  value: "污点的 value"
  offect: "NoSchedule" # 污点产生的影响
  operator: "Equal" # 表是 value 与污点的 value 要相等,也可以设置为 Exists 表示存在 key 即可,此时可以不用配置 value

亲和力 Affinity

NodeAffinity

节点亲和力:进行 pod 调度时,优先调度到符合条件的亲和力节点上

配置模板

apiVersion: v1
kind: Pod
metadata:
  name: with-node-affinity
spec:
  affinity: # 亲和力配置
    nodeAffinity: # 节点亲和力
      requiredDuringSchedulingIgnoredDuringExecution: # 节点必须匹配下方配置
        nodeSelectorTerms: # 选择器
        - matchExpressions: # 匹配表达式
          - key: topology.kubernetes.io/zone # 匹配 label 的 key
            operator: In # 匹配方式,只要匹配成功下方的一个 value 即可
            values:
            - antarctica-east1 # 匹配的 value
            - antarctica-west1 # 匹配的 value
      preferredDuringSchedulingIgnoredDuringExecution: # 节点尽量匹配下方配置
      - weight: 1 # 权重[1,100],按照匹配规则对所有节点累加权重,最终之和会加入优先级评分,优先级越高被调度的可能性越高
        preference:
          matchExpressions: # 匹配表达式
          - key: another-node-label-key # label 的 key
            operator: In # 匹配方式,满足一个即可
            values:
            - another-node-label-value # 匹配的 value
#      - weight: 20
        ......
  containers:
  - name: with-node-affinity
    image: pause:2.0
  • 匹配类型 operator

    • In:部署在满足条件的节点上

    • NotIn:匹配不在条件中的节点,实现节点反亲和性

    • Exists:只要存在 key 名字就可以,不关心值是什么

    • DoesNotExist:匹配指定 key 名不存在的节点,实现节点反亲和性

    • Gt:value 为数值,且节点上的值小于指定的条件

    • Lt:value 为数值,且节点上的值大于指定条件

身份认证与权限

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值