kubernetes--pod安全策略(podSecurityPolicy)

podSecurityPolicy简介:

Kubernetes中pod部署时重要的安全校验手段,能够有效地约束应用运行时行为安全。使用PSP对象定义一组pod在运行时必须遵循的条件及相关字段的默认值,只有Pod满足这些条件才会被K8s接受。

PodSecurityPolicy 在 Kubernetes v1.21 中被弃用, 在 Kubernetes v1.25 中被移除。

pod安全策略限制维度

配置项

描述

privileged

启动特权容器。

hostPID,hostIPC

hostPID,hostIPC

hostNetwork,hostPorts

使用主机网络和端口。

volumes

允许使用的挂载卷类型。

allowedHostPaths

允许hostPath类型挂载卷在主机上挂载的路径,通过pathPrefix字段声 明允许挂载的主机路径前缀组。

allowedFlexVolumes

允许使用的指定FlexVolume驱动。

fsGroup

配置Pod中挂载卷使用的辅组ID。

readOnlyRootFilesystem

约束启动Pod使用只读的root文件系统。

runAsUser,runAsGroup,supplementalGroups

指定Pod中容器启动的用户ID以及主组和辅组ID。

allowPrivilegeEscalation, defaultAllowPrivilegeEscalation

约束Pod中是否允许配置allowPrivilegeEscalation=true,该配置会控 制setuid的使用,同时控制程序是否可以使用额外的特权系统调用。

defaultAddCapabilities, requiredDropCapabilities,allowedCapabilities

控制Pod中使用的Linux Capabilities。

seLinux

控制Pod使用seLinux配置。

allowedProcMountTypes

控制Pod允许使用的ProcMountTypes。

annotations

配置Pod中容器使用的AppArmor或seccomp。

forbiddenSysctls,allowedUnsafeSysctls

控制Pod中容器使用的sysctl配置

PSP的启用

Pod安全策略实现为一个准入控制器,默认没有启用,当启用后会强制实施 Pod安全策略,没有满足的Pod将无法创建。因此,建议在启用PSP之前先添加 策略并对其授权。

启用Pod安全策略:

vi/etc/kubernetes/manifests/kube-apiserver.yaml

...

- --enable-admission-plugins=NodeRestriction,PodSecurityPolicy

...

systemctl restart kubelet

PSP流程

用户使用SA (ServiceAccount)创建了一个Pod,K8s会先验证这个SA是否可以访问PSP资源权限,如果可以进一步验证Pod配置是否满足PSP规则,任 意一步不满足都会拒绝部署。

因此,需要实施需要有这几点:管理员不受限制

• 创建SA服务账号

• 该SA需要具备创建对应资源权限,例如创建Pod、Deployment

• SA使用PSP资源权限:创建Role,使用PSP资源权限,再将SA绑定Role

示例1:禁止创建特权模式的Pod

# 创建SA

kubectl create serviceaccount aliang

# 将SA绑定到系统内置Role

kubectl create rolebinding aliang--clusterrole=edit --serviceaccount=default:aliang

#通过sa创建资源

kubectl--as=system:serviceaccount:default:aliang create deployment web1 --image=nginx

启用psp后即使无策略,默认禁止创建pod,必须配置psp策略

#创建策略

apiVersion: policy/v1beta1 
kind: PodSecurityPolicy
metadata:
  name: psp-example
spec:
  privileged: false  #不允许特权pod,正常pod会允许
#下面是一些必要的字段,都是允许
  seLinux:
    rule: RunAsAny
  supplementalGroups:
    rule: RunAsAny
  runAsUser:
    rule: RunAsAny
  fsGroup:
    rule: RunAsAny
  volumes:
  - '*'

# 创建使用PSP权限的Role

【】kubectl create role psp:unprivileged--verb=use --resource=podsecuritypolicy --resource-name=psp-example

# 将SA绑定到Role

【】kubectl create rolebindingaliang:psp:unprivileged --role=psp:unprivileged --serviceaccount=default:aliang

【】kubectl--as=system:serviceaccount:default:aliang run nginx4 --image=nginx

创建deploy

无法创建,创建deploy成功replicaset无法成功,但replicaset无法成功,因为创建deploy会默认创建replicaset会默认使用default这个sa,需要给这个sa增加psp的授权

2个方案 1deploy创建时指定使用的服务账号sa 2将default这个sa绑定到psp上

kubectl create rolebinding default:psp:unprivileged--role=psp:unprivileged --serviceaccount=default:default

尝试创建特权pod,无法创建。因为psp策略限制了特权容器

【】cat cap.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-psp2
spec:
  containers:
  - name: test
    image: busybox
    command:
    - sleep
    -  24h
    securityContext:
      privileged: true
【】kubectl apply -f cap.yaml

示列2:禁止没指定普通用户运行的容器(runAsUser)

意思是所有创建的pod必须指定普通用户才能运行

apiVersion: policy/v1beta1 
kind: PodSecurityPolicy
metadata:
  name: psp-example
spec:
  privileged: false  #不允许特权pod,正常pod会允许
#下面是一些必要的字段,都是允许
  seLinux:
    rule: RunAsAny
  supplementalGroups:
    rule: RunAsAny
  runAsUser:
    rule: MustRunAsNonRoot
  fsGroup:
    rule: RunAsAny
  volumes:
  - '*'

创建时不指定用户账号则会报

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用kubernetes-client java获取pod容器内存与CPU使用率,可以按照以下步骤进行操作。 首先,你需要在Java项目中添加kubernetes-client的依赖,例如在pom.xml文件中添加以下代码: ```xml <dependencies> <dependency> <groupId>io.kubernetes</groupId> <artifactId>client-java</artifactId> <version>9.0.0</version> </dependency> </dependencies> ``` 接下来,你可以使用以下代码获取pod的相关信息: ```java import io.kubernetes.client.apis.CoreV1Api; import io.kubernetes.client.custom.Quantity; import io.kubernetes.client.models.V1Container; import io.kubernetes.client.models.V1ContainerStatus; import io.kubernetes.client.models.V1NamespaceList; import io.kubernetes.client.models.V1Pod; import io.kubernetes.client.models.V1PodList; import io.kubernetes.client.models.V1PodMetrics; import io.kubernetes.client.models.V1PodMetricsList; import io.kubernetes.client.util.Config; import java.util.Map; public class KubernetesClientExample { public static void main(String[] args) throws Exception { // 创建Kubernetes客户端 io.kubernetes.client.Configuration config = Config.defaultClientConfig(); io.kubernetes.client.apis.CoreV1Api api = new CoreV1Api(); // 获取pod列表 V1PodList podList = api.listPodForAllNamespaces(null, null, null, null, null, null, null, null, null); for (V1Pod pod : podList.getItems()) { // 获取pod所属的命名空间和名称 String namespace = pod.getMetadata().getNamespace(); String name = pod.getMetadata().getName(); // 获取pod容器列表和相关状态信息 for (V1Container container : pod.getSpec().getContainers()) { String containerName = container.getName(); V1ContainerStatus containerStatus = pod.getStatus().getContainerStatuses().stream() .filter(status -> status.getName().equals(containerName)) .findFirst().orElse(null); if (containerStatus != null) { // 获取容器的CPU和内存使用率 Map<String, Quantity> usage = containerStatus.getUsage(); Quantity cpuUsage = usage.get("cpu"); Quantity memoryUsage = usage.get("memory"); System.out.println("Namespace: " + namespace + ", Pod: " + name + ", Container: " + containerName + ", CPU Usage: " + cpuUsage + ", Memory Usage: " + memoryUsage); } } } } } ``` 上述代码中,我们首先创建了Kubernetes的客户端,然后通过CoreV1Api实例来获取pod列表。对于每个pod,我们遍历其容器列表,并获取容器的名称以及相关状态信息。在状态信息中,我们可以找到容器的CPU和内存使用率,以及其他相关指标。 需要注意的是,这里获取的是当前时刻的使用率数据,如果你想要定时获取容器的使用率信息,可以使用定时任务等方法来实现。 这是一个简单的示例,你可以根据实际需求和项目结构进行相应的扩展和修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值