摘要:今天优化了 k8s 生产集群的部署,为系统(linux 与 k8s系统pod)保留最低资源,以免应用 pod 负载高拖垮整个节点。配置方法是手动给每个节点的 kubelet 添加配置文件 `/etc/default/kubelet` ,并在其中通过 UBELET_EXTRA_ARGS 环境变量,添加了 `kube-reserved`, `system-reserved`, `eviction-hard` 这3个配置 阅读全文
posted @ 2020-03-28 14:26 dudu 阅读 (58) 评论 (0) 编辑
摘要:由于使用 nginxinc/kubernetes-ingress 后遭遇“K8s 中 ASP.NET Core 应用获取不到客户端真实 IP 地址”的问题(X-Forwarded-For转发问题),于是被迫见异思迁试试换成 kubernetes/ingress-nginx 作为 nginx ingress controller 。 阅读全文
posted @ 2020-02-21 12:23 dudu 阅读 (353) 评论 (2) 编辑
摘要:开始天真地以为只要写一个 ingress 配置文件并部署好就行了。但部署后发现所有 node 服务器上没有任何进程监听 80 端口,显然不对。原来 k8s 没有内置 ingress controller ,需要安装第三方的 ingress controller ,比如 nginx ingress controller ,上面通过 cnblogs-ingress.yaml 只是创建了 ingress 资源 阅读全文
posted @ 2020-01-29 17:56 dudu 阅读 (187) 评论 (2) 编辑
摘要:k8s 集群搭建好了,准备将 docker swarm 上的应用都迁移到 k8s 上,但需要一个一个应用写 yaml 配置文件,不仅要编写 deployment.yaml 还要编写 service.yaml ,而很多应用的配置是差不多的,这个繁琐工作让人有些望而却步。k8s 有没有针对这个问题的解救之道呢?发现了救星 Helm —— k8s 应用程序包管理器,实际操作体验一下。 阅读全文
posted @ 2020-01-22 17:25 dudu 阅读 (441) 评论 (1) 编辑
摘要:昨天晚上通过压测验证了 HPA 部署成功了。所使用的 HPA 配置文件如下。最小 pod 副本数是 2 ,最大 pod 副本数是 8 ,基于 `http_requests_received` 指标(对应的就是 QPS )进行伸缩,当指标平均值高于 10 时,自动进行扩容。使用下面的压测命令发起了 100 个并发请求。随后 HPA 自动将对应的 pod 副本由 2 个扩容至 8 个 阅读全文
posted @ 2020-01-20 15:31 dudu 阅读 (420) 评论 (0) 编辑
摘要:部署好了 kube-prometheus 与 k8s-prometheus-adapter ,使用下面的配置文件部署 HPA(Horizontal Pod Autoscaling) 却失败。通过下面的命令查看 custom.metrics.k8s.io api 支持的 http_requests(每秒请求数QPS)监控指标,发现只有 prometheus_http_requests 指标 ,没有所需的 http_requests 开头的指标。 阅读全文
posted @ 2020-01-18 22:49 dudu 阅读 (312) 评论 (0) 编辑
摘要:部署 k8s-prometheus-adapter 的 custom-metrics-apiserver 时,pod 总是启动失败。用 `kubectl edit secret cm-adapter-serving-certs -n monitoring` 查看 secret 中的配置数据,发现配置名称是 tls.crt 与 tls.key ,而 custom-metrics-apiserver pod 用到的是 serving.crt 与 serving.key 。当时创建 secret 的命令用的是 tls 参数。 阅读全文
posted @ 2020-01-13 23:33 dudu 阅读 (125) 评论 (0) 编辑
摘要:自从开始在 kubernetes 集群中部署 nodelocaldns 以提高 dns 解析性能以来,一直被一个问题困扰,只要一部署 nodelocaldns ,在 coredns 中添加的 rewrite 与 hosts 配置(如下)就失效,很是郁闷。部署使用的是下面的命令,在部署时将 nodelocaldns.yaml 中的几个变量进行如下的替换。 阅读全文
posted @ 2020-01-11 21:03 dudu 阅读 (548) 评论 (2) 编辑
摘要:背景:1 台 master 加入集群后发现忘了修改主机名,而在 k8s 集群中修改节点主机名非常麻烦,不如将 master 退出集群改名并重新加入集群(前提是用的是高可用集群);操作步骤:ssh 登录另外一台 master 节点将要改名的 master 节点移出集群 阅读全文
posted @ 2020-01-10 19:09 dudu 阅读 (494) 评论 (0) 编辑
摘要:使用 3 台阿里云服务器(k8s-master0, k8s-master1, k8s-master2)作为 master 节点搭建高可用集群,负载均衡用的是阿里云 SLB ,需要注意的是由于阿里云负载均衡不支持后端服务器自己转发给自己,所以 master 节点的 control-plane-endpoint 不能走负载均衡。先在 k8s-master0 上安装好 k8s ,安装步骤见 Ubuntu 安装 k8s 三驾马车 kubelet kubeadm kubectl ,然后打快照创建阿里云 ecs 镜像。 阅读全文
posted @ 2020-01-09 22:36 dudu 阅读 (327) 评论 (0) 编辑
摘要:搭建的是 k8s 高可用集群,用了 3 台 master 节点,2 台 master 节点宕机后,仅剩的 1 台无法正常工作。运行 netstat -lntp 命令发现 kube-apiserver 根本没有运行,同时发现 etcd 与 kube-proxy 也没运行。通过 docker ps 命令发现 etcd , kube-apiserver, kube-proxy 这 3 个容器都没有运行,etcd 容器在不停地启动->失败->重启->又失败...... 阅读全文
posted @ 2020-01-07 22:15 dudu 阅读 (322) 评论 (0) 编辑
摘要:安装 docker :安装所需的软件,添加阿里云安装源的密钥,添加阿里云安装源,安装最新版 docker engine ;安装 k8s :添加阿里云安装源,添加安装源密钥,安装 k8s。apt update && apt install -y kubelet kubeadm kubectl && apt-mark hold kubelet kubeadm kubectl 阅读全文
posted @ 2020-01-07 10:24 dudu 阅读 (296) 评论 (0) 编辑
摘要:参考官方文档在 ubuntu 18.04 上完成了升级,记录一下升级步骤。升级第一个 master 节点:放空当前节点,升级前检查,正式进行升级操作,升级成功;升级其他 master 节点的 kubeadm,升级 worker 节点的 kubeadm 以及 kubelet 与 kubectl 阅读全文
posted @ 2020-01-05 14:37 dudu 阅读 (343) 评论 (0) 编辑
摘要:这是昨天晚上阅读园子里的2篇 k8s 博文时产生的想法,在随笔中记录一下。如果我们把 node 当作女方,pod 当作南方,scheduler 当作媒人,从相亲的角度理解这3个概念,不仅豁然开朗,而且很容易记住。`node affinity` 就是女方告诉媒人自己喜欢什么类型的男生,介绍这些类型的男生给她。`taints` 就是女方告诉媒人自己有哪些缺点,不能容忍这些缺点的男生请走开 阅读全文
posted @ 2020-01-04 13:19 dudu 阅读 (93) 评论 (0) 编辑
摘要:开始以为只要安装 prometheus-operator 就行了。安装后发现只有一个 prometheus-operator pod 。这时才发现真正要安装的是 kube-prometheus 。kube-prometheus 中包含了 prometheus 监控所用到的所有组件,当然也包含 prometheus-operator 。安装好 prometheus 之后通过 kubectl port-forward 命令暴露端口,可以通过浏览器分别访问 Prometheus, Grafana, AlertManager 控制台了 阅读全文
posted @ 2020-01-03 20:59 dudu 阅读 (592) 评论 (3) 编辑
摘要:在 ASP.NET Core 中通过 `Request.Host.Host` 获取主机名(hostname)时,如果主机名中包含非 ASCII 字符(比如 puny code),就会引发下面的异常。改用 `Request.Headers[HeaderNames.Host].ToString()` 可以避开这个问题,但需要注意一个地方,用这个方法获取时,如果 url 中包含端口号(比如 https://localhost:5000),得到的主机名中也会包含端口号 阅读全文
posted @ 2019-11-16 22:06 dudu 阅读 (305) 评论 (0) 编辑
摘要:不管哪种用户验证方式,最终都是在验证成功后设置 HttpContext.User ,后续处理环节通过 HttpContext.User 获取用户信息。如果能直接修改 HttpContext.User ,就能达到模拟登录的目的,而 ASP.NET Core 的中间件(middleware)天生具备的可以任意修改 HttpContext 的能力,让实现这个想法不费吹灰之力。 阅读全文
posted @ 2019-11-13 15:31 dudu 阅读 (232) 评论 (0) 编辑
摘要:一直不喜欢 Startup 中这两个可读性很比较差的命名 ConfigureServices 与 Configure。ConfigureServices 用于配置依赖注入以在运行时根据依赖关系创建对象,Configure 用于配置中间件(middleware)以构建请求处理流水线。 阅读全文
posted @ 2019-11-09 20:51 dudu 阅读 (760) 评论 (1) 编辑
摘要:这两天遇到一个应用场景,需要对内网调用的部分 web api 进行安全保护,只允许请求头账户包含指定 key 的客户端进行调用。在网上找到一篇英文博文 ,该文中的代码完美基于 ASP.NET Core 内置的鉴权(Authentication) 与授权(Authorization)机制解决了这个问题,于是站在巨人的肩上自己实现了一遍,在这篇随笔中做个记录。 阅读全文
posted @ 2019-10-19 16:05 dudu 阅读 (529) 评论 (2) 编辑
摘要:Request.Headers 的类型是 IHeaderDictionary 接口,对应的实现类是 HeaderDictionary 。HeaderDictionary 实际就是一个用于 保存 StringValues 的 KeyValuePair 。通过索引器访问时,如果对应的值不存在,会返回 StringValues.Empty ,所以不需要进行 null 引用检查。索引器访问实际就是 TryGetValue + StringValues.Empty 。 阅读全文
posted @ 2019-10-19 09:45 dudu 阅读 (965) 评论 (1) 编辑