在根目录创建 ApplicationSet
在 Git 仓库根目录下创建 argo-apps.yaml 的文件,定义 ArgoCD 的 ApplicationSet:
|
|
在 Git 仓库根目录下创建 argo-apps.yaml 的文件,定义 ArgoCD 的 ApplicationSet:
|
|
推荐每个集群使用一个 Git 仓库来存储该集群所要部署的所有应用的 YAML 与配置。
如果多个集群要部署相同或相似的应用,可抽取成单独的 Git 仓库,作为 submodule 引用进来。
这样做的好处是既可以减少冗余配置,又可以控制爆炸半径。submodule 可能被多个 Git 仓库共享(即多个集群部署相同应用),
但如果不执行git submodule update --remote
的话,引用的 commit id 是不会变的,
所以也不会因为上游应用更新而使所有使用了该应用的集群一下子全部都更新。
官方提供了安装 ArgoCD 的 YAML,可以使用 kubectl 一键安装,但我建议使用 kustomize 来安装,因为这样一来可以将自定义配置声明并持久化到文件中,避免直接集群中改配置,也利于后续 ArgoCD 的自举,即用 ArgoCD 自身来用 GitOps 管理自身。
准备一个目录:
|
|
下载 argocd 部署 YAML:
|
|
后续升级 argocd 时,可以用上面相同命令更新下 YAML 文件。
创建kustomization.yaml
:
|
|
本文会探讨Kubernetes另一个核心网络组件Kube-Proxy,它承担着Service及其后端Pod对宿主机配置的影响。
这三个API在不同版本下的Kube-Proxy发挥着主要作用,尤其是后两者。先上几个三个资源的常用配置一步步展开。
Service
作用核心其实就是提供一个ClusterIP和域名的配置容器以及EP/EPS组织,并没有一个单独的controller进行管理,而是被endpointslice-controller所控制。
|
|
EndpointSlice
是在k8s 1.19版本开始默认支持的,相较于Endpoints
能支持更大规模部署,受限于etcd的value值大小,ep即一个Service只能部署6000个节点,
而eps理论上可以无上限,并且eps支持网络拓扑,它可以根据集群节点的资源信息,按需部署Pod数量。具体文档在这K8s文档-EndpointSlice
|
|
首先我们还是需要先认识一下Kube-Proxy的整体架构:
下面是kube-proxy的代码主流程,没有太复杂的内容
这是公司大佬的一次内部分享,我尝试简短总结一下
某服务的其中两个副本异常,CPU 飙高。
查看container_cpu_usage_seconds_total
监控,CPU 飙升,逼近 limit。
查看container_cpu_cfs_throttled_periods_total
监控,CPU 飙升伴随 CPU Throttle 飙升,所以服务异常应该是 CPU 被限流导致。
查看container_cpu_system_seconds_total
监控,发现 CPU 飙升主要是 CPU system 占用导致,容器内pidstat -u -t 5 1
可以看到进程%system
占用分布情况。
perf top
看 system 占用高主要是 vfs_write 写数据导致。
在 containerd 运行时的 kubernetes 线上环境中,出现了镜像无法下载的情况,具体报错如下:
|
|
containerd 的日志中也有相关日志:
|
|
分析环境信息:
然后根据以上版本信息构造相同环境,通过如下命令拉取镜像:
|
|
问题复现,基本确认跟 containerd 版本与打包镜像的 docker 版本有关。
Kubernetes 环境中遇到网络问题需要抓包排查怎么办? 传统做法是登录 Pod 所在节点,然后 进入容器 netns,最后使用节点上 tcpdump 工具进行抓包。 整个过程比较繁琐,好在社区出现了 ksniff 这个小工具, 它是一个 kubectl 插件,可以让我们在 Kubernetes 中抓包变得更简单快捷。
本文将介绍如何使用 ksniff 这个工具来对 Pod 进行抓包。
新建一个名为crontab
的配置文件,写定时任务规则:
|
|
/proc/1/fd/1
表示输出到容器主进程的标准输出,这样我们可以利用 kubectl logs 来查看到执行日志。
|
|