26、Kubernetes 可观测性、监控与安全指南

Kubernetes 可观测性、监控与安全指南

1. 准备工作

在开始操作之前,需要一个部署在 AWS 或 GCP 上的可用 Kubernetes 集群,目前不支持其他云提供商。同时,需要安装 kubectl helm

2. 安装 Kubecost

Kubecost 可以创建当前和历史 Kubernetes 支出的资源粒度模型,用于监控资源分配和提供成本透明度。安装步骤如下:
1. 将 Kubecost 图表仓库添加到本地 Helm 仓库列表:

$ helm repo add kubecost https://kubecost.github.io/cost-analyzer/
  1. 使用 Helm 安装命令将 Kubecost 安装到 kubecost 命名空间:
$ helm install kubecost/cost-analyzer --namespace kubecost --name kubecost --set kubecostToken="dGVzdEB0ZXN0LmNvbQ==xm343yadf98"
  1. 验证所有 Pod 是否正在运行:
$ kubectl get pods -nkubecost

如果已经有现有的 Prometheus 部署, node-exporter Pod 可能会卡在 Pending 模式,此时需要为 Kubecost 使用不同的端口进行部署。

3. 访问 Kubecost 仪表板

按照以下步骤访问 Kubecost 仪表板以实时监控 Kubernetes 资源及其成本:
1. 获取 kubecost 命名空间中的服务列表:

$ kubectl get svc -nkubecost
名称 类型 集群 IP 外部 IP 端口 年龄
kubecost-cost-analyzer ClusterIP 100.65.53.41 9001/TCP,9003/TCP,9090/TCP 13m
kubecost-grafana ClusterIP 100.69.52.23 80/TCP 13m
kubecost-prometheus-alertmanager ClusterIP 100.71.217.248 80/TCP 13m
kubecost-prometheus-kube-state-metrics ClusterIP None 80/TCP 13m
kubecost-prometheus-node-exporter ClusterIP None 9100/TCP 13m
kubecost-prometheus-pushgateway ClusterIP 100.69.137.163 9091/TCP 13m
kubecost-prometheus-server ClusterIP 100.64.7.82 80/TCP 13m
2. 使用 kubectl port-forward 命令创建端口转发,将本地端口 9090 转发到 Kubecost 成本分析器 Pod:
$ kubectl port-forward --namespace kubecost deployment/kubecost-cost-analyzer 9090

也可以使用 kubectl edit svc kubecost-cost-analyzer -nkubecost 命令将 kubecost-cost-analyzer 服务类型从 ClusterIP 更改为 LoadBalancer ,以使用云负载均衡器从外部暴露服务。
3. 在 Web 浏览器中打开 http://localhost:9090 (如果使用 LoadBalancer ,则打开外部 IP),应该会看到 Kubecost 登录页面。
4. 可以通过添加额外的 Kubecost 端点来扩展仪表板,以从单个仪表板监控多个集群。如果有多个集群,点击“添加新集群”图标并添加其他集群的端点 URL。

4. 监控 Kubernetes 资源成本分配

按照以下步骤监控与 Kubernetes 相关的云支出并找到可能的节省建议:
1. 访问 Kubecost 仪表板,点击仪表板上的集群名称以访问详细摘要,此视图将显示每月成本和集群在空闲资源方面的效率。
2. 点击“实时资产”按钮,此视图显示与当前云提供商相关的实时成本。
3. 点击“分配”菜单,此视图显示当前命名空间中的累积成本,可以应用范围过滤器以获取所选命名空间中资源的每日、每周、每月或自定义范围成本。
4. 点击“节省”菜单,此菜单中的信息非常重要,指出了可以采取的可能优化步骤。例如,如果有两个未充分利用的节点(利用率低于 60%),可以通过缩减集群规模来节省成本。点击每个节省类别以了解更多可以采取的行动。
5. 点击“健康”菜单,此视图显示可靠性和集群健康风险评估。
6. 禁用“显示所有”选项以列出需要关注的问题。
7. 点击“通知”菜单,从此菜单可以指定如何处理通知。如果有 Slack 频道,可以点击“添加”按钮将通知转发到该频道,否则可以选择电子邮件通知。

5. 使用 RBAC 强化集群安全

在 Kubernetes 这样的复杂系统中,基于角色的访问控制(RBAC)是一种高度集成的机制,用于授予用户和应用对 Kubernetes API 的细粒度访问权限。

5.1 准备工作

确保有一个启用 RBAC 的 Kubernetes 集群(从 Kubernetes 1.6 开始,RBAC 默认启用),并且已经配置了 kubectl helm 。创建私钥需要 openssl 工具。克隆 k8sdevopscookbook/src 仓库以使用清单文件:

$ git clone https://github.com/k8sdevopscookbook/src.git
$ cd src/chapter9/rbac

如果 RBAC 因任何原因被禁用,使用 --authorization-mode=RBAC 启动 API 服务器以启用 RBAC。

5.2 查看默认角色
  1. 查看默认集群角色和角色绑定:
$ kubectl get clusterroles
$ kubectl get clusterrolebindings
  1. 查看 Kubernetes 拥有的系统角色之一,以了解其用途和限制:
$ kubectl get clusterroles system:node -oyaml
  1. 查看默认面向用户的角色:
$ kubectl get clusterroles | grep -v '^system'
名称 年龄 描述
admin 8d 对所有资源具有读写访问权限
cluster-admin 8d 超级用户,对所有资源具有读写访问权限
edit 8d 允许对资源进行创建/更新/删除操作,但不包括 RBAC 权限
kops:dns-controller 8d -
kube-dns-autoscaler 8d -
view 8d 对资源具有只读访问权限
4. 查看默认集群绑定 cluster-admin
$ kubectl get clusterrolebindings/cluster-admin -o yaml
5.3 创建用户账户
  1. 为示例用户创建私钥:
$ openssl genrsa -out user3445.key 2048
  1. 使用私钥创建证书签名请求(CSR):
$ openssl req -new -key user3445.key \
-out user3445.csr \
-subj "/CN=john.geek/O=development"
  1. 定位集群签名证书并生成最终签名证书:
$ openssl x509 -req -in user3445.csr \
-CA CERT_LOCATION/ca.crt \
-CAkey CERT_LOCATION/ca.key \
-CAcreateserial -out user3445.crt \
-days 500
  1. 存储签名密钥,并使用新用户凭据创建新上下文:
$ kubectl config set-credentials user3445 --client-certificate=user3445.crt --client-key=user3445.key
$ kubectl config set-context user3445-context --cluster=local --namespace=secureapp --user=user3445
  1. 列出现有上下文:
$ kubectl config get-contexts
  1. 尝试使用新用户上下文列出 Pod,会得到访问被拒绝的错误:
$ kubectl --context=user3445-context get pods
  1. 可选地,使用 openssl base64 -in <infile> -out <outfile> 命令对三个文件( user3445.crt user3445.csr user3445.key )进行 base64 编码,并将填充好的 config-user3445.yml 文件分发给开发人员。
5.4 创建角色和角色绑定
  1. 创建一个命名空间:
$ kubectl create ns secureapp
  1. 创建一个角色:
$ cat <<EOF | kubectl apply -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: secureapp
  name: deployer
rules:
- apiGroups: ["", "extensions", "apps"]
  resources: ["deployments", "replicasets", "pods"]
  verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
EOF
  1. 创建一个角色绑定:
$ cat <<EOF | kubectl apply -f -
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: deployer-binding
  namespace: secureapp
subjects:
- kind: User
  name: john.geek
  apiGroup: ""
roleRef:
  kind: Role
  name: deployer
  apiGroup: ""
EOF
5.5 测试 RBAC 规则
  1. 在用户有权限访问的 secureapp 命名空间中部署一个测试 Pod:
$ cat <<EOF | kubectl --context=user3445-context apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: busybox
  namespace: secureapp
spec:
  containers:
  - image: busybox
    command:
      - sleep
      - "3600"
    imagePullPolicy: IfNotPresent
    name: busybox
  restartPolicy: Always
EOF
  1. 使用新用户上下文列出 Pod,之前失败的命令现在应该可以成功执行:
$ kubectl --context=user3445-context get pods

如果尝试在不同的命名空间中创建相同的 Pod,命令将失败。

Kubernetes 集群有两种类型的用户:
- 用户账户:由外部管理的普通用户。
- 服务账户:与 Kubernetes 服务关联的用户,由 Kubernetes API 管理。

通过以上步骤,我们可以在 Kubernetes 中实现资源成本监控和集群安全强化,提高 DevOps 环境的投资回报率。

6. 配置 Pod 安全策略

Pod 安全策略(PSP)是 Kubernetes 中的一种资源,用于控制 Pod 的安全相关属性,如特权容器、主机命名空间的使用等。

6.1 准备工作

确保有一个可用的 Kubernetes 集群,并且 kubectl 已经配置好可以与集群通信。

6.2 创建 Pod 安全策略

以下是一个简单的 Pod 安全策略示例:

$ cat <<EOF | kubectl apply -f -
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
  name: restricted-psp
spec:
  privileged: false  # 不允许特权容器
  seLinux:
    rule: RunAsAny
  supplementalGroups:
    rule: RunAsAny
  runAsUser:
    rule: MustRunAsNonRoot
  fsGroup:
    rule: RunAsAny
  volumes:
  - 'configMap'
  - 'emptyDir'
  - 'projected'
  - 'secret'
  - 'downwardAPI'
  - 'persistentVolumeClaim'
EOF

这个策略禁止使用特权容器,要求容器以非根用户身份运行,并限制了可以使用的卷类型。

6.3 创建角色和角色绑定以使用 Pod 安全策略

为了让用户或服务账户能够使用这个 Pod 安全策略,需要创建相应的角色和角色绑定:

# 创建角色
$ cat <<EOF | kubectl apply -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: psp-user-role
  namespace: default
rules:
- apiGroups:
  - policy
  resources:
  - podsecuritypolicies
  resourceNames:
  - restricted-psp
  verbs:
  - use
EOF

# 创建角色绑定
$ cat <<EOF | kubectl apply -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: psp-user-binding
  namespace: default
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: psp-user-role
subjects:
- kind: User
  name: john.geek
  apiGroup: ""
EOF
6.4 测试 Pod 安全策略

尝试创建一个符合策略的 Pod 和一个不符合策略的 Pod 来测试策略是否生效:

# 创建符合策略的 Pod
$ cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: compliant-pod
spec:
  containers:
  - name: nginx
    image: nginx
    securityContext:
      runAsNonRoot: true
EOF

# 创建不符合策略的 Pod(特权容器)
$ cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: non-compliant-pod
spec:
  containers:
  - name: nginx
    image: nginx
    securityContext:
      privileged: true
EOF

符合策略的 Pod 应该能够成功创建,而不符合策略的 Pod 会被拒绝。

7. 使用 Kubernetes CIS 基准进行安全审计

Kubernetes CIS 基准是一组最佳实践,用于确保 Kubernetes 集群的安全性。可以使用工具如 kube-bench 来进行审计。

7.1 安装 kube-bench

可以通过以下命令安装 kube-bench

$ wget https://github.com/aquasecurity/kube-bench/releases/download/v0.6.5/kube-bench_0.6.5_linux_amd64.deb
$ sudo dpkg -i kube-bench_0.6.5_linux_amd64.deb
7.2 运行 kube-bench

运行 kube-bench 对集群进行审计:

$ sudo kube-bench

kube-bench 会根据 CIS 基准对集群进行检查,并输出检查结果,指出哪些配置符合基准,哪些不符合。

7.3 解决审计发现的问题

根据 kube-bench 的输出,对不符合基准的配置进行修改。例如,如果发现 API 服务器的某些参数配置不安全,可以修改 API 服务器的启动参数。

8. 使用 Aqua Security 构建 DevSecOps 到管道中

Aqua Security 是一个容器安全平台,可以帮助在 CI/CD 管道中集成安全检查。

8.1 安装 Aqua Security 控制台

按照 Aqua Security 的文档进行控制台的安装,通常需要创建一些 Kubernetes 资源,如 Deployment、Service 等。

8.2 配置 CI/CD 管道集成

在 CI/CD 管道中添加 Aqua Security 的扫描步骤。例如,在使用 Jenkins 时,可以通过以下步骤集成:
1. 安装 Aqua Security 的 Jenkins 插件。
2. 配置插件与 Aqua Security 控制台的连接。
3. 在管道脚本中添加扫描步骤:

pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                // 构建容器镜像
                sh 'docker build -t my-image:latest .'
            }
        }
        stage('Scan') {
            steps {
                // 使用 Aqua Security 扫描镜像
                aquaScan(image: 'my-image:latest')
            }
        }
    }
}
8.3 处理扫描结果

根据扫描结果决定是否继续管道。如果发现严重的安全漏洞,可以选择停止管道并通知相关人员。

9. 使用 Falco 监控可疑应用活动

Falco 是一个开源的运行时安全监控工具,可以实时监控 Kubernetes 集群中的容器活动。

9.1 安装 Falco

可以使用 Helm 来安装 Falco:

$ helm repo add falcosecurity https://falcosecurity.github.io/charts
$ helm install falco falcosecurity/falco
9.2 配置 Falco 规则

Falco 有默认的规则集,但也可以根据需要自定义规则。例如,以下规则用于检测容器是否尝试访问敏感文件:

- rule: Access Sensitive Files
  desc: Detect access to sensitive files
  condition: >
    open_write and (fd.name endswith "/etc/passwd" or fd.name endswith "/etc/shadow")
  output: "Sensitive file access detected: %fd.name (user=%user.name container_id=%container.id)"
  priority: CRITICAL

将自定义规则添加到 Falco 的配置文件中,然后重启 Falco 服务使规则生效。

9.3 查看 Falco 警报

Falco 会将检测到的可疑活动作为警报输出。可以通过查看 Falco 的日志或配置警报转发到其他系统(如 Slack、电子邮件)来获取警报信息。

10. 使用 HashiCorp Vault 安全管理凭证

HashiCorp Vault 是一个用于安全存储和管理敏感信息(如密码、API 密钥等)的工具。

10.1 安装 Vault

可以使用 Helm 来安装 Vault:

$ helm repo add hashicorp https://helm.releases.hashicorp.com
$ helm install vault hashicorp/vault
10.2 初始化和 unseal Vault

安装完成后,需要初始化 Vault 并解除密封:

$ kubectl exec -it vault-0 -- vault operator init -key-shares=1 -key-threshold=1
# 记录生成的根令牌和 unseal 密钥

$ kubectl exec -it vault-0 -- vault operator unseal <unseal-key>
10.3 存储和检索凭证

以下是一个简单的示例,演示如何在 Vault 中存储和检索凭证:

# 登录到 Vault
$ kubectl exec -it vault-0 -- vault login <root-token>

# 存储凭证
$ kubectl exec -it vault-0 -- vault kv put secret/myapp username=admin password=secret

# 检索凭证
$ kubectl exec -it vault-0 -- vault kv get secret/myapp

在 Kubernetes 中,可以使用 Vault 的 Kubernetes 认证方法,让 Pod 自动获取凭证,提高安全性。

通过以上一系列的操作,我们可以全面提升 Kubernetes 集群的可观测性、监控能力和安全性,确保集群稳定、安全地运行,为业务提供可靠的支持。

mermaid 流程图展示使用 Kubecost 监控资源成本分配的流程:

graph LR
    A[访问 Kubecost 仪表板] --> B[点击集群名称获取详细摘要]
    B --> C[点击实时资产按钮查看实时成本]
    B --> D[点击分配菜单查看累积成本]
    B --> E[点击节省菜单查看优化建议]
    B --> F[点击健康菜单查看健康评估]
    B --> G[点击通知菜单设置通知方式]

表格总结各工具的作用和关键操作:
| 工具 | 作用 | 关键操作 |
| — | — | — |
| Kubecost | 监控 Kubernetes 资源成本 | 安装、访问仪表板、查看成本分配 |
| RBAC | 强化集群安全 | 创建用户、角色和角色绑定 |
| Pod 安全策略 | 控制 Pod 安全属性 | 创建策略、角色和角色绑定并测试 |
| kube-bench | 安全审计 | 安装、运行审计、解决问题 |
| Aqua Security | 集成安全到 CI/CD 管道 | 安装控制台、配置集成、处理扫描结果 |
| Falco | 监控可疑应用活动 | 安装、配置规则、查看警报 |
| HashiCorp Vault | 安全管理凭证 | 安装、初始化、存储和检索凭证 |

【SCI复现】基于纳什博弈的多微网主体电热双层共享策略研究(Matlab代码实现)内容概要:本文围绕“基于纳什博弈的多微网主体电热双层共享策略研究”展开,结合Matlab代码实现,复现了SCI级别的科研成果。研究聚焦于多个微网主体之间的能源共享问题,引入纳什博弈理论构建双层优化模型,上层为各微网间的非合作博弈策略,下层为各微网内部电热联合优化调度,实现能源高效利用经济性目标的平衡。文中详细阐述了模型构建、博弈均衡求解、约束处理及算法实现过程,并通过Matlab编程进行仿真验证,展示了多微网在电热耦合条件下的运行特性和共享效益。; 适合人群:具备一定电力系统、优化理论和博弈论基础知识的研究生、科研人员及从事能源互联网、微电网优化等相关领域的工程师。; 使用场景及目标:① 学习如何将纳什博弈应用于多主体能源系统优化;② 掌握双层优化模型的建模求解方法;③ 复现SCI论文中的仿真案例,提升科研实践能力;④ 为微电网集群协同调度、能源共享机制设计提供技术参考。; 阅读建议:建议读者结合Matlab代码逐行理解模型实现细节,重点关注博弈均衡的求解过程双层结构的迭代逻辑,同时可尝试修改参数或扩展模型以适应不同应用场景,深化对多主体协同优化机制的理解。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值