集群维护-备份升级排错

ETCD数据库备份和恢复

kubeadm部署方式的etcd的备份和恢复

如果k8s集群使用kubeadm方式部署,则代表etcd数据库是使用静态pod的方式启动的,且一半只有单台。所以静态pod的etcd的安装的yaml位于/etc/kubernetes/manifests/etcd.yaml。该文件内包含了etcd的所有配置信息,包含数据目录等。

apiVersion: v1
kind: Pod
metadata:
  annotations:
    kubeadm.kubernetes.io/etcd.advertise-client-urls: https://192.168.121.10:2379
  creationTimestamp: null
  labels:
    component: etcd
    tier: control-plane
  name: etcd
  namespace: kube-system
spec:
  containers:
  - command:
    - etcd
    - --advertise-client-urls=https://192.168.121.10:2379
    - --cert-file=/etc/kubernetes/pki/etcd/server.crt
    - --client-cert-auth=true
    - --data-dir=/var/lib/etcd    ######888888888 这里是数据目录
    - --initial-advertise-peer-urls=https://192.168.121.10:2380
    - --initial-cluster=k8s-master=https://192.168.121.10:2380
    - --key-file=/etc/kubernetes/pki/etcd/server.key
    - --listen-client-urls=https://127.0.0.1:2379,https://192.168.121.10:2379
    - --listen-metrics-urls=http://127.0.0.1:2381
    - --listen-peer-urls=https://192.168.121.10:2380
    - --name=k8s-master
    - --peer-cert-file=/etc/kubernetes/pki/etcd/peer.crt
    - --peer-client-cert-auth=true
    - --peer-key-file=/etc/kubernetes/pki/etcd/peer.key
    - --peer-trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt
    - --snapshot-count=10000
    - --trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt
    image: registry.aliyuncs.com/google_containers/etcd:3.4.13-0
    imagePullPolicy: IfNotPresent
    livenessProbe:
      failureThreshold: 8
      httpGet:
        host: 127.0.0.1
        path: /health
        port: 2381
        scheme: HTTP
      initialDelaySeconds: 10
      periodSeconds: 10
      timeoutSeconds: 15
    name: etcd
    resources:
      requests:
        cpu: 100m
        ephemeral-storage: 100Mi
        memory: 100Mi
    startupProbe:
      failureThreshold: 24
      httpGet:
        host: 127.0.0.1
        path: /health
        port: 2381
        scheme: HTTP
      initialDelaySeconds: 10
      periodSeconds: 10
      timeoutSeconds: 15
    volumeMounts:
    - mountPath: /var/lib/etcd
      name: etcd-data
    - mountPath: /etc/kubernetes/pki/etcd
      name: etcd-certs
  hostNetwork: true
  priorityClassName: system-node-critical
  volumes:
  ###### 使用hostpath部署
  - hostPath:
      path: /etc/kubernetes/pki/etcd # 证书目录
      type: DirectoryOrCreate
    name: etcd-certs
  - hostPath:
      path: /var/lib/etcd # etcd数据目录
      type: DirectoryOrCreate
    name: etcd-data
status: {}

备份到snap.db文件:

三个参数信息均可在上述yaml中查询到,执行完毕后会将数据备份到snap.db文件。

etcdctl命令安装:

恢复etcd:

二进制部署方式的etcd的备份和恢复

二进制部署方式的etcd一般至少有三个节点

备份到snap.db文件:

endpoints指定任意一个etcd节点的ip即可,执行完毕后会将数据备份到snap.db文件。

恢复:

上述参数具体查看etcd的配置文件。

velero 备份集群

备份你的k8s集群

kubeadm对k8s集群版本升级

Kubernetes每隔3个月发布一个小版本,比如 v1.21v1.22需要三个月。可以在GitHub Release上查看版本。

针对k8s的升级共有三个策略:

  1. 始终保持最新

  2. 每半年升级一次,这样会落后社区1到2个小版本

  3. 一年升级一次,或者更长,(大部分公司选择一年升级一次),落后的版本较多 (推荐)

升级的基本流程:

image-20220208112323534

注意:

  1. 升级之前必须备份所有组件及数据,例如etcd

  2. 不可以跨多个小版本进行升级,最好不要跨多个小版本,比如从1.16升级到1.19,有可能出现不兼容的问题(k8s官方保证两个小版本之间是兼容的)

Centos下

升级管理节点

  1. 升级kubeadm

  2. 准备、验证升级

  3. 执行升级

  4. 升级kubelete 以及 kubectl

  5. 取消不可调度

升级工作节点

注意:生产单台单台升级node,防止资源不可用

  1. 节点上升级kubeadm

  2. 驱逐工作node上的pod,且不可调度(在有kubectl配置的节点上操作)

  3. 工作节点执行升级kubelet配置:

  4. 工作节点执行升级kubelet和kubectl

  5. 节点重启kubelet

  6. 节点取消不可调度,节点重新上线 (在有kubectl配置的节点上操作)

  7. 上述命令在每个工作节点上执行

查看升级结果

Ubuntu下

升级管理节点

下线某个节点的流程

下线node

  1. 获取节点列表

  2. 驱逐节点上的pod并设置不可调度(cordon)

恢复下线的Node

设置可调度或者移除节点

永久下线故障Node

故障排查

应用部署故障排查

  1. 查看部署的资源的详细信息,是否含有异常事件

  2. 查看Pod的日志

  3. 进入容器终端检查

集群故障排查

首先区分部署方式,使用kubectl get pod -n kube-system快速查看是哪儿一种类型,如果是含有etcd、apiserver等静态pod说明是kubeadm安装

  1. Kubeadm: 除了kubeadm外,其他组件均采用静态pod启动

  2. 二进制:所有组件均采用systemd管理

常见问题:

  1. 网络不通

  2. 启动失败,一般配置文件或者依赖服务有问题

  3. 操作系统,平台不兼容,版本性兼容

Service访问异常

image-20220205001331516

Service访问不通,有以下几种情况:

  1. Service是否正确关联Pod?

  2. Service指定的target-port端口是否正常?

  3. Pod是否正常工作?

  4. Service是否通过DNS工作?

  5. kube-proxy是否正常工作?

  6. kube-proxy是否正常写iptables规则?

  7. cni网络插件是否正常工作?

最后更新于

这有帮助吗?