内容提要
本文汇总Kubernetes运维实操,涵盖大小集群与节点配置取舍、证书续期、imagePullSecrets配置、Istio Sidecar注入方式、集群升级步骤、KubeSpray安装IP报错解决、Dragonfly部署、代理配置、国内Helm镜像源、批量删除Pod命令及Thanos二进制部署。
延伸解读
集群规划:规模与节点配置的权衡
文章从节点数和节点配置两个维度对比了集群规划方案。少量大集群资源利用率高、管理开销低、调度范围大,但爆炸半径大;多个小集群则相反。节点层面,少量高配节点资源利用率高、应用内存上限高、拉取镜像效率高,但Kubelet压力大、Pod密度高、爆炸半径大。读者需根据业务对隔离性、管理成本和故障影响范围的要求进行取舍。
证书续期与集群升级的关键操作
证书默认一年需续期,文章记录了使用kubeadm certs check-expiration和renew all的流程,并强调备份/etc/kubernetes、更新kubeconfig及重启kubelet和集群组件。升级方面,kubeadm不允许跨版本升级,需逐版本进行,且应先升级控制节点再升级工作节点。提前拉取依赖镜像可发现无法拉取的镜像并加速升级。
镜像拉取凭证与Sidecar注入的实用技巧
添加imagePullSecrets时,通过~/.docker/config.json生成Secret需注意base64编码使用-w 0参数,否则可能因换行导致拉取镜像报错。Istio Sidecar注入有三种方式:命名空间标签全局生效、Pod标签单个负载生效、istioctl kube-inject指定负载生效。其中Pod标签设为false表示拒绝注入,清理时需设为空而非false。
代理配置与国内镜像源注意事项
主机上的代理设置不会自动传递到容器,文章提供了两种配置方式:Docker的Node级代理(通过systemd配置文件)和Container级代理(通过环境变量)。国内Helm镜像源方面,官方源可能无法访问,Git Pages镜像可用,阿里云镜像版本较旧,Azure镜像已不可用。读者应优先选择可用且较新的镜像源。
Q&A
Kubernetes 证书默认多久需要续期一次?如何查看证书过期时间?
默认情况下,Kubernetes 证书每隔一年需要 renew 一次。在 Master 节点上执行 `kubeadm certs check-expiration` 可以查看证书过期时间;低版本集群若报错,可改用 `kubeadm alpha certs check-expiration`。
如何给 Kubernetes 添加 imagePullSecrets 以拉取私有镜像?
有两种方式:1) 通过 `kubectl create secret docker-registry mypullsecret --docker-server=... --docker-username=... --docker-password=...` 直接创建;2) 使用 `~/.docker/config.json` 进行 base64 编码(注意使用 `-w 0` 避免换行),然后创建 Secret 类型为 `kubernetes.io/dockerconfigjson`。最后在 Pod 的 `imagePullSecrets` 中引用该 Secret。
Istio 注入 Sidecar 有哪几种方式?分别如何操作?
有三种方式:1) 给命名空间添加标签 `istio-injection=enabled`,整个命名空间生效;2) 给 Pod 模板添加标签 `sidecar.istio.io/inject: "true"`,单个负载生效;3) 使用 `istioctl kube-inject` 命令对指定负载注入,可结合 `kubectl apply` 使用。
Kubernetes 集群升级的主要步骤是什么?
升级思路:驱逐负载、摘除流量后,先升级控制节点,再升级工作节点。具体步骤包括:查看集群版本、添加 Kubernetes 安装源、查找并升级 kubeadm、查看升级计划、拉取依赖镜像、执行 `kubeadm upgrade apply` 升级控制平面、最后升级 kubectl 和 kubelet。
使用 KubeSpray 安装 Kubernetes 时出现 "ip in ansible_all_ipv4_addresses" 报错如何解决?
该报错是因为 Ansible 检测的 IP 与节点 INTERNAL-IP 不一致。需修改 inventory.ini 中的 `ip` 变量,使其与节点默认网卡的内网 IP 一致(如将 `ansible_host` 和 `ip` 都改为 192.168.12.4)。如果是多网卡,可通过 kubelet 的 `--node-ip` 参数指定 Node IP。
如何在国内环境为 Helm 配置可用的镜像源?
可用的国内 Helm 镜像源包括:Git Pages 镜像 `https://burdenbear.github.io/kube-charts-mirror/`;Aliyun 镜像 `https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts/`(但版本较旧);Azure 镜像已不可用。官方源 `https://charts.helm.sh/stable` 可能无法访问。
如何批量删除 Kubernetes 中 Evicted 状态的 Pod?
可以使用命令:`kubectl get pods --all-namespaces -o wide | grep Evicted | awk '{print $1,$2}' | xargs -L1 kubectl delete pod -n`。另外,也可根据 field-selectors 删除指定空间指定状态的 Pod,例如 `kubectl get pods --field-selector=status.phase!=Running -n default | cut -d' ' -f 1 | xargs kubectl delete pod -n default`。