Skip to content

Latest commit

 

History

History
570 lines (443 loc) · 11.4 KB

容器服务.md

File metadata and controls

570 lines (443 loc) · 11.4 KB

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>

工作负载

无状态负载-deployment

基本信息

  • 名称

  • 命名空间

  • 实例数量

  • 标签

  • 注解

容器信息 - []

  • 容器名称

  • 容器镜像

  • 镜像秘钥

  • 特权级容器:特权级容器(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

有状态负载 - StatefulSet

  • 稳定的、唯一的网络标识符。
  • 稳定的、持久的存储。
  • 有序的、优雅的部署和扩缩。
  • 有序的、自动的滚动更新。

参考无状态负载,多了一个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

任务 - job

运行策略

  • 成功运行次数
  • 可并行数
  • 最大超时时间
  • 重试次数
  • 重启策略: 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  # 失败重试次数

定时任务- cronjob

定时重复

  • Cron 语句
  • 成功任务保留数
  • 失败任务保留数
  • 并发策略:Allow、Forbid、Replace

参考Job,多了定时策略

守护进程 -DaemonSet

*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

pod

服务和路由

service

  • 集群内访问(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

Ingress

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

egress

存储管理

存储类 -StorageClass

ceph、openlocal

存储卷 - PV

存储卷声明 - PVC

配置管理

配置项 - confimap

保密字典 - secret

弹性伸缩

HPA