TLS Everywhere - 解密kubernetes集群的安全认证

本文是关于Kubernetes 4A解析的第5章 深入理解Kubernetes 4A - Authentication源码解析 深入理解Kubernetes 4A - Authorization源码解析 深入理解Kubernetes 4A - Admission Control源码解析 深入理解Kubernetes 4A - Audit源码解析 TLS Everywhere - 解密kubernetes集群的安全认证 所有关于Kubernetes 4A部分代码上传至仓库 github.com/cylonchau/hello-k8s-4A 在 kubernetes 集群中,所有的通讯都是用 TLS 进行加密和认证,本文使用一次老集群(二进制部署集群)证书更换作为记录,通过这种方式深入对 kubernetes 的认证方式来了解更换证书的步骤,以及一次模拟老集群的更换步骤。 本文使用证书生成工具为 “kubernetes-generator” [1] 专用于 k8s 二进制部署生成证书和安装包的工具。 note 本文中的引用文档使用 web.archive 进行保存,避免官方版本更新,其概念与文档中的概念有变动导致,资料引用失败。 Kubernetes认证方式 为了了解证书更换需要做那些步骤,所以必须了解 k8s 的认证方式,这样才能更好的在更换证书时对集群上部署的业务系统的影响降低到最低。 X509 证书 kube-apiserver 的启动参数 --client-ca-file,可以使用客户端办法机构,英文代号就是熟悉的 “CA” (Certificate authority),当这个证书传递后,可以验证 kube-apiserver 用于验证向 kube-apiserver 提供的客户端证书,这里包含 k8s 中提供的用户种类的两种: 用户名:对应证书的 CN (Common Name) 用户组:对应证书的O (organization),用于对一个用户组进行授权,例如 “system:masters” 表示一个组 [1],允许不受限制地访问 kube-apiserver 静态token kube-apiserver 的启动参数 --token-auth-file,是以文件提供给 kube-apiserver,该 Token 会长期有效,并且如果不重启服务 Token 是不会更新。...

debian12 - 高版本系统安装旧版本k8s异常处理

今日在部署旧版本 k8s 集群 (1.16.10) 时出现错误,主要是在新版本操作系统上部署老版本 k8s,kubelet会出现如下错误 bash 1 2 W1123 22:31:47.383423 3686 server.go:605] failed to get the kubelet's cgroup: mountpoint for cpu not found. Kubelet system container metrics may be missing. W1123 22:31:47.383572 3686 server.go:612] failed to get the container runtime's cgroup: failed to get container name for docker process: mountpoint for cpu not found. Runtime system container metrics may be missing. 错误原因 上面的报错是 Kubelet 无法正确访问 Docker 容器运行时的 cgroup 信息,特别是关于 CPU 使用的 cgroup 信息...

openssl.cnf详解

下面是一个完整 openssl.cnf 配置文件 ini 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 BASE_DOMAIN= CLUSTER_NAME= CERT_DIR= APISERVER_CLUSTER_IP= MASTER_NAME= [ ca ] # man ca default_ca = CA_default [ CA_default ] # Directory and file locations....

zookeeper版本升级 - from 3.4 to 3.8

最近,我不得不将 Zookeeper 3.4.18 集群升级到 3.6+。要求是:无感升级,不丢失数据,并且尽量不向任何用户发出通知。在调研zookeeper 版本后,发现 3.6+ 支持了 metrics 模块,比较符合需求,所以需要从 3.4.18 升级至 3.6.4 3.5 + 支持动态配置 3.6.0+ 支持内置 metrics 模块 现有集群配置 集群IP 当前目录 新版本目录 192.240.16.18 /usr/local/zookeeper-3.4.14/ /usr/local/apache-zookeeper-3.6.4-bin/ 192.240.16.21 /usr/local/zookeeper-3.4.14/ /usr/local/apache-zookeeper-3.6.4-bin/ 192.240.16.28 /usr/local/zookeeper-3.4.14/ /usr/local/apache-zookeeper-3.6.4-bin/ 192.240.16.147 /usr/local/zookeeper-3.4.14/ /usr/local/apache-zookeeper-3.6.4-bin/ 192.240.16.202 /usr/local/zookeeper-3.4.14/ /usr/local/apache-zookeeper-3.6.4-bin/ 下载安装包 在官方 archive 找到对应安装包 从 zk 3.5 起安装包分为带 “bin” 和不带 “bin” 的 带 “bin” 的包含所需jar包 不带 “bin” 的需要自行编译 bash 1 wget https://archive.apache.org/dist/zookeeper/zookeeper-3.6.4/ 解压 bash 1 tar Czxf /usr/local/ apache-zookeeper-3.6.4-bin.tar.gz && cd /usr/local 升级版本 注意以下步骤需要对每个 zk 服务器都执行一边...

CentOS7&Rocky9更新xz

centos&rocky 升级 xz,需要和目前系统对比每个xz包,和每个xz包内的文件有哪些;然后,根据不同类型的包(base, devel, lib),三个进行打包操作。 下载curl源码包 升级至少需要更新至 xz 5.4.6 ,首先从官网下载源码包 [1] 将xz作为rpm 下面是 rpm 的规格文件 spec 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 Name: xz Version: 5....

使用terraform利用已有资源创建GKE集群

近日创建GKE集群,需要使用现有的VPC进行创建,所以需要掌握两个步骤,导入资源,创建集群 terraform 导入命令 GCP中的资源地址和 ID。资源地址是指向配置中的资源实例的标识符。ID 是标识 Google Cloud 中要导入的资源的标识符 资源地址通常为 terraform在定义这类资源时配置的(对应提供商支持),以 GCP 为例 Cloud Storage 存储桶, google_storage_bucket.sample,sample 为 id,定义如下 yaml 1 2 3 4 5 6 resource "google_storage_bucket" "sample" { name = "my-bucket" project = "sample-project" location = "US" force_destroy = true } 示例 - 导入现有GKE集群 语法 bash 1 terraform import <resource_name>.<name> <project>/<locations>/<real_resource_name> 实例 bash 1 terraform import google_container_cluster.gke project20231124/asia-east2/gke-prd-cluster-02 输出结果如下 bash 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 $ terraform import google_container_cluster....

使用rclone工具完成bucket数据同步

rclone工具的特点 支持增量,配置简单,支持参数调节吞吐量(不同吞吐量使用内存不同,传输差异也不同) copy是复制 source 到 dst sync是根据 src 的内容对比 dst,删除dst不存在的内容 下面是写了一同步的脚本 bash 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 #!...

Goswagger - Skipping '', recursion detected

问题:当使用的结构体为嵌套格式,会提示 recursion detected 或 cannot find type definition go 1 2 3 4 5 6 7 8 9 10 11 type Instance struct { metav1.TypeMeta Instances []InstanceItem `json:"instances" yaml:"instances" form:"instances" binding:"required"` ServiceSelector map[string]string `json:"serivce_selector" yaml:"serivce_selector" form:"serivce_selector"` } type InstanceItem struct { Name string `json:"name" yaml:"name" form:"name" binding:"required"` PromEndpoint string `json:"prom_endpoint" yaml:"prom_endpoint" form:"prom_endpoint" binding:"required"` Labels map[string]string `json:"labels" yaml:"labels" form:"labels"` } go swagger 注释为 text 1 2 3 4 5 6 7 8 9 10 // deleteInstance godoc // @Summary Remove prometheus instance....

Kubernetes公有云集群中部署Nacos集群

nacos-k8s nacos-k8s 是Nacos官方维护的项目,可以使用 helm 直接在 k8s 集群中部署 nacos 集群(包含公有云) 部署步骤 找到数据库表结构 在你要安装的版本号的配置中找到 SQL 文件进行创建库操作,例如 github.com/alibaba/nacos/tree/2.4.1/distribution/conf 自定义 helm 资源和配置 在公有云上部署,还需要修改下对应资源的类型,例如建立 LB service 增加了自动获取 gcp 预留的 IP,和service改为LB类型 yaml 1 2 3 4 5 6 7 8 9 10 11 12 service: #type: ClusterIP #type: NodePort type: LoadBalancer port: 8848 nodePort: 30000 # 这样可以使用静态IP loadBalancerIP: 192.168.0.1 annotations: # 这个annotation 原自官方创建 load-balancer的方式 cloud.google.com/load-balancer-type: Internal labels: {} cloud.google.com/load-balancer-type GKE 的 service LB 类型的参数 [1] service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: “intranet” ACK 的 service LB 类型的参数 [2]...

Gorm - BeforeDelete无法获取正确条目

遇到问题:BeforeDelete 在删除时获取 SQL 不正确 BeforeDelete 代码如下 go 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 func (t *Target) BeforeDelete(tx *gorm.DB) (err error) { // 找到与此 Target 相关的所有 Labels var labels []Label if err := tx.Model(t).Association("Labels").Find(&labels); err != nil { klog.V(4).Infof("Error fetching labels: %v", err) return err } for _, label := range labels { if err := tx.Delete(&label).Error; err != nil { klog....

Gin - 参数默认值问题

遇到问题:gin 使用 Bind 时无法填充,改成下面代码可以获取到 go 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 type User struct { Name string `form:"name,default=user1" json:"name,default=user2"` Age int `form:"age,default=10" json:"age,default=20"` } r := gin.Default() // way1 curl 127.0.0.1:8900/bind?name=aa // way2 curl -X POST 127.0.0.1:8900/bind -d "name=aa&age=30" // way3 curl -X POST 127.0.0.1:8900/bind -H "Content-Type: application/json" -d "{\"name\": \"aa\"}" r....

Ceph OSD内存优化与建议

本文记录了在使用 ceph 集群时遭遇到的内存问题,以及引用和参考一些资料用于对在 ceph 集群使用时的内存预估。 OSD的内存需求 如何评估 Ceph OSD 所需的硬件也是对于集群选型,集群优化的一个必要条件,这里主要找到两个可靠的参考资料用于评估 OSD 内存配置大小 IBM Storage Ceph IBM Storage Ceph 提供了一个运行 Ceph 用于预估系统配置的一个最小推荐列表 [1],个人感觉可以参考这些信息用于自己集群的优化。主要用于容器化的 Ceph 集群 Process Criteria Minimum Recommended ceph-osd-container Processor 1x AMD64 or Intel 64 CPU CORE per OSD container RAM Minimum of 5 GB of RAM per OSD container OS Disk 1x OS disk per host OSD Storage 1x storage drive per OSD container. Cannot be shared with OS Disk....

记录一次失败的radosgw问题排查记录

本文是Ceph集群部署系列第4章 使用cephadm纯离线安装Ceph集群 使用cephadm纯离线安装Ceph集群 2 Ceph集群安装 - ceph-deploy Ceph集群安装 - ceph-deploy下线rgw 记录一次因着急没有检查原因而直接下线 ceph 对象存储的的失败记录 操作流程 ceph 节点内存持续超过90%,因为本身有三个 OSD,检查内存使用情况发现 radosgw bash 1 2 3 4 5 6 7 8 9 10 11 $ ps aux --sort=-%mem | head -10 USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND ceph 1702 0.4 32.9 10128296 4550760 ? Ssl May03 919:18 /usr/bin/radosgw -f --cluster ceph --name client.rgw.node01 --setuser ceph --setgroup ceph ceph 1721 0....

GKE强制升级后JAVA Pod无法识别limit限制

今日 GKE EOL,kubelet 自动升级至1.28后,Java程序在启动后无法识别资源清单中的限制,被大量OOMKill Deployment清单中已经配置了资源限制,例如下面的参数 yaml 1 2 3 4 5 resources: limits: memory: "1Gi" requests: memory: "600Mi" JAVA_OPS参数配置是使用百分比 bash 1 -XX:+UseContainerSupport -XX:InitialRAMPercentage=70.0 -XX:MaxRAMPercentage=70.0 但是启动后无法识别参数,使用 gcloud 登录到主机内查看 jvm 运行状态(因为容器使用 distroless) bash 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 project-20220325-asia-east-2-pool-221ab289-hgnf ~ # nsenter -t 274655 --mount --uts --ipc --net --pid /opt/java/openjdk/bin/java -XX:+UnlockDiagnosticVMOptions -XX:+PrintContainerInfo -version OSContainer::init: Initializing Container Support Detected cgroups v2 unified hierarchy Path to /cpu....

Uranus installation

What is an Uranus? Uranus is a Linux firewalld central controller. In Greek mythology, Uranus king of gods. The firewall gateway is the Uranus for iptables. Prerequisites Hardware requirements We recommend these hardware requirements for production systems or for development systems that are designed to demonstrate production use cases: Item Description Minimum requirements Recommended Per instance You can install on one node but many features require at least one node. 1 instance > 1 instances RAM per instance Defining your RAM size must be part of the capacity planning for your Uranus usage....

Spinnaker 自定义Pipeline模板思路

流水线模板组合思路 官方流水线示例中没有给出完整的流水线模板和完整的字段,只给出了一个大致的 schema [1],如下所示 json 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 { "schema": "v2", "variables": [ { "type": "<type>", "defaultValue": <value>, "description": "<description>", "name": "<varName>" } ], "id": "<templateName>", # The pipeline instance references the template using this "protect": <true | false>, "metadata": { "name": "displayName", # The display name shown in Deck "description": "<description>", "owner": "example@example....

Spinnaker 基于判断的条件分支流水线

Manual Judgment Stage “Manual Judgment Stage” 是 Spinnaker Pipeline 中的一种阶段 (“Stage”) 类型,该类型可以作为流水线的门户,作为带外 (Out-of-Bound) 流水线检查,等待手动检查,并且判断结果会终止或继续流水线的执行。 创建一个基于Manual Judgment的流水线 创建一个流水线,添加一个新的 Stage,选择 “Manual Judgment” 图:Manual Judgment创建页面 Jugement Inputs 部分添加对应的选项,选项可以带入变量 $judgment 中 图:Manual Judgment 在执行时 Jugement Inputs Option 的展示 或者是不添加任何选项,那么这个时候就会只有 Stop 和 Continue 两个按钮 图:当 Manual Judgment 没有配置Jugement Inputs Option 的展示 如果添加了选项,可以根据 “选项” 来判断执行的分支 判断可以使用每个阶段内的条件表达式 ”Conditional on Expression“,或者 Check Precondition 类型的阶段 图:根据 “Stage Conditional on Expression” 来定义的选项 “Check Precondition” 是 Spinnaker 流水线中的一个阶段,它可以先前条件并且判断是否继续,这里主要检查该流水线之前所有的流水线你定义要检查的内容,并继续执行接下分支或者阶段 图:“Check Precondition” 的三种类型 图:“Check Precondition” 选择添加表达式的页面 这里选择使用 表达式 (Expression) 来判断前置条件,例如我判断前置 Stage 的选择是否为 “aaaa”...

PromQL复杂使用示例

查询结果删除某些指标 without without 属于聚合查询的子句,必须在聚合查询中使用 语法: bash 1 <aggr-op> [without|by (<label list>)] ([parameter,] <vector expression>) 可以看到属于 <aggr-op> 例如 text 1 sum without(instance) (http_requests_total) ignoring ignoring 属于 “向量匹配” (Vector matching) 关键词,可以在 一对多,和多对多查询中使用 语法 bash 1 <vector expr> <bin-op> ignoring(<label list>) <vector expr> 例如 bash 1 method_code:http_errors:rate5m{code="500"} / ignoring(code) method:http_requests:rate5m 与查询 可以查询满足多个条件的指标,例如下列是查询 jvm 内存 $\frac{used}{committed} > 80%$ 并且 Pod WSS 使用大于 80% 的指标 promql 1 2 3 4 5 6 sum by(pod) (jvm_memory_used_bytes{}) / sum by(pod) (jvm_memory_committed_bytes{}) > ....

Hugo - 为文章页面增加相关阅读区域

需求 在页面底部增加相关阅读区域: 简单实现与文章相同 tag 的文章列出到文章底部 实验步骤 新增 related 模板 在 layouts/partials/related.html 新创建一个模板,增加如下内容,本文主题为 PaperModX ,不同的主题,文件在不同目录下 html 1 2 3 4 5 6 7 8 9 {{ $related := .Site.RegularPages.Related . | first 3 }} {{ with $related }} <h3>Related Posts</h3> <ul> {{ range . }} <li><a href="{{ .RelPermalink }}">{{ .Title }}</a></li> {{ end }} </ul> {{ end }} 将模板加载到文章列表模板内 然后需要在文章列表页底部包含这个 “模板” _default/single.html 不同主题在不同的目录下 html 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ....

Hugo - 去除Sitemap中的tags search等页面

需求 在不禁用分类的情况下,关闭对应 sitemap.xml 中的条目以优化 SEO 去除所有tag 去除所有分类 去除 search about me 这类页面 实验步骤 sitemap 是通过 go-template 目标进行的,只要可以使用对应语法过滤了相关路径即可以排除对应的页面 首先在配置文件增加 taxonomiesExcludedFromSitemap 选项,这个选项排除了 “hugo中分类法” 中的所有子类;其次使用 if not 来排除所有对应首页面。如下列所示 本文已 PaperModX 为例,修改文件 layouts\sitemap.xml xml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 {{ printf "<?...