Kubernetes 可观测性、监控与安全指南
1. 准备工作
在开始操作之前,需要一个部署在 AWS 或 GCP 上的可用 Kubernetes 集群,目前不支持其他云提供商。同时,需要安装
kubectl
和
helm
。
2. 安装 Kubecost
Kubecost 可以创建当前和历史 Kubernetes 支出的资源粒度模型,用于监控资源分配和提供成本透明度。安装步骤如下:
1. 将 Kubecost 图表仓库添加到本地 Helm 仓库列表:
$ helm repo add kubecost https://kubecost.github.io/cost-analyzer/
-
使用 Helm 安装命令将 Kubecost 安装到
kubecost命名空间:
$ helm install kubecost/cost-analyzer --namespace kubecost --name kubecost --set kubecostToken="dGVzdEB0ZXN0LmNvbQ==xm343yadf98"
- 验证所有 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 查看默认角色
- 查看默认集群角色和角色绑定:
$ kubectl get clusterroles
$ kubectl get clusterrolebindings
- 查看 Kubernetes 拥有的系统角色之一,以了解其用途和限制:
$ kubectl get clusterroles system:node -oyaml
- 查看默认面向用户的角色:
$ 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 创建用户账户
- 为示例用户创建私钥:
$ openssl genrsa -out user3445.key 2048
- 使用私钥创建证书签名请求(CSR):
$ openssl req -new -key user3445.key \
-out user3445.csr \
-subj "/CN=john.geek/O=development"
- 定位集群签名证书并生成最终签名证书:
$ openssl x509 -req -in user3445.csr \
-CA CERT_LOCATION/ca.crt \
-CAkey CERT_LOCATION/ca.key \
-CAcreateserial -out user3445.crt \
-days 500
- 存储签名密钥,并使用新用户凭据创建新上下文:
$ 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
- 列出现有上下文:
$ kubectl config get-contexts
- 尝试使用新用户上下文列出 Pod,会得到访问被拒绝的错误:
$ kubectl --context=user3445-context get pods
-
可选地,使用
openssl base64 -in <infile> -out <outfile>命令对三个文件(user3445.crt、user3445.csr和user3445.key)进行 base64 编码,并将填充好的config-user3445.yml文件分发给开发人员。
5.4 创建角色和角色绑定
- 创建一个命名空间:
$ kubectl create ns secureapp
- 创建一个角色:
$ 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
- 创建一个角色绑定:
$ 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 规则
-
在用户有权限访问的
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
- 使用新用户上下文列出 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 | 安全管理凭证 | 安装、初始化、存储和检索凭证 |
超级会员免费看
791

被折叠的 条评论
为什么被折叠?



