You are just a beta version.

CKS-2-习题版

01/24/2024

3. 默认网络策略

Context
一个默认拒绝(default-deny)的 NetworkPolicy 可避免在未定义任何其他 NetworkPolicy 的 namespace 中意外公开 Pod。
Task
为所有类型为 Ingress+Egress 的流量在 namespace testing 中创建一个名为 denypolicy 的新默认拒绝 NetworkPolicy。
此新的 NetworkPolicy 必须拒绝 namespace testing 中的所有的 Ingress + Egress 流量。
将新创建的默认拒绝 NetworkPolicy 应用与在 namespace testing 中运行的所有 Pod。
你可以在 /cks/net/p1.yaml 找到一个模板清单文件。

Sorry,忘记放参考了,都是官网的文档,但需要熟练记住位置,考试的时候才能快速定位
参考:网络策略

解答:
(1)创建名为denyploicy的NetworkPolicy,拒绝testing命名空间内所有Ingress+Engress流量
如下:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: denypolicy # 题目给的名字
  namespace: testing  # 注意namespace名字,看考试具体
spec:
podSelector: {}
  policyTypes:
  - Ingress   # 看考试具体要求是都禁,还是只是拒绝一个
  - Egress

apply&check一下:

kubectl apply -f  /cks/net/p1.yaml
kubectl describe networkpolicy denypolicy -n testing


4.RBAC-RoleBinding

好像与CKA有点重复了,类型是一样的题

参考:使用RBAC鉴权

Context
绑定到 Pod 的 ServiceAccount 的 Role 授予过度宽松的权限。完成以下项目以减少权限集。
Task
一个名为 web-pod 的现有 Pod 已在 namespace db 中运行。
编辑绑定到 Pod 的 ServiceAccount service-account-web 的现有 Role,仅允许只对 services 类型的资源执行 get 操作。
在 namespace db 中创建一个名为 role-2 ,并仅允许只对 namespaces 类型的资源执行 delete 操作的新 Role。
创建一个名为 role-2-binding 的新 RoleBinding,将新创建的 Role 绑定到 Pod 的 ServiceAccount。
注意:请勿删除现有的 RoleBinding。

解答:

(1)查看ServiceAccount service-account-web对应的rolebindings role-1-binding,查看rolebindings role-1-binding对应的role为role-1。

kubectl describe rolebindings -n db

编辑role-1权限

kubectl edit role role-1 -n db

修改如下:

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"rbac.authorization.k8s.io/v1","kind":"Role","metadata":{"annotations":{},"name":"role-1","namespace":"db"}}
  creationTimestamp: "2023-05-21T14:55:47Z"
  name: role-1
  namespace: db
  resourceVersion: "52550"
  uid: 54f5b6aa-aab3-469d-bfbe-818ab90794d4
rules:  #对rule进行修改
- apiGroups:
  - ""
  resources:   # 修改资源类型,还可能是对endpoints资源的list操作,对namespace的update操作,根据题目所要求的灵活变动
  - service
  verbs: # 所需要的操作,看题目要求,是watch就改get为watch
  - get

rule还有另外一种写法,官网给的是这种写法:

我edit进去写的是这种,保存重新打开变成上面那种了,我????
rules:
- apiGroups: [""] # "" 标明 core API 组
  resources: ["pods"]
  verbs: ["get", "watch", "list"]

(2)在db命名空间,创建名为role-2的role,并且通过rolebinding绑定service-account-web,只允许对namespace做delete操作。

--verb是权限,可能考delete或者update等;--resource是对象,可能考namespace或者persistentvolumeclaims等,看题目要求。
kubectl create role role-2 --verb=delete --resource=namespace -n db
kubectl create rolebinding role-2-binding --role=role-2 --serviceaccount=db:service-account-web -n db

检查


5.日志审计 log audit

Task
在 cluster 中启用审计日志。为此,请启用日志后端,并确保:

  • 日志存储在 /var/log/kubernetes/audit-logs.txt
  • 日志文件能保留 10 天
  • 最多保留 2 个旧审计日志文件

/etc/kubernetes/logpolicy/sample-policy.yaml 提供了基本策略。它仅指定不记录的内容。
注意:基本策略位于 cluster 的 master 节点上。
编辑和扩展基本策略以记录:

  • RequestResponse 级别的 persistentvolumes 更改
  • namespace front-apps 中 configmaps 更改的请求体
  • Metadata 级别的所有 namespace 中的 ConfigMap 和 Secret 的更改

此外,添加一个全方位的规则以在 Metadata 级别记录所有其他请求。
注意:不要忘记应用修改后的策略。

参考:审计

据说开启审计日志会增加内存的消耗,增加了API server的内存消耗,也跟配置有关系;

了解一下审计级别:

  • None:符合这条规则的日志将不会被记录;
  • Metadata:记录请求的元数据(请求的用户、时间戳、资源、动词等),但对请求或者响应体的消息体不做记录;
  • Request:记录事件的元数据和请求的消息体,但不对响应的消息体。也就是记录请求包,不记录回包;
  • RequestRespone:记录事件的元数据,请求和响应的消息体。

可以使用--audit-policy-file标志性包含策略的文件传递到kube-apiserver,不设此标记则不记录事件,而且rule字段必须在审计策略文件中提供。


解答:

(1)修改yaml文件,先备份文件

cp /etc/kubernetes/logpolicy/sample-policy.yaml /tmp
vim /etc/kubernetes/logpolicy/sample-policy.yaml

在参考连接里面找到 Audit policy的yaml文件,然后我们找/etc/kubernetes/logpolicy/sample-policy.yaml这个文件下的这一行:


意思是我们的修改要在这行下面进行,不能动上面的,我们需要的就是根据题目要求写level,可以局部复制官网的yaml文件,取我们需要的部分就好,写进/etc/kubernetes/logpolicy/sample-policy.yaml里面。

修改参考:

官网直接复制,按照题目要求修改

(2)配置master节点的kube-apiserver.yaml
先备份

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

在对应的位置下面添加如下内容:

解释一下就是:

# 定义审计策略yaml文件位置,通过hostpath挂载
- --audit-policy-file=/etc/kubernetes/logpolicy/sample-policy.yaml
# 定义审计日志位置,通过hostpath挂载
- --audit-log-path=/var/log/kubernetes/audit-logs.txt
# 定义保留旧审计日志文件的最大天数为10天
- --audit-log-maxage=10
# 定义要保留的审计日志文件的最大数量为2个
- --audit-log-maxbackup=2

以上内容,考试的时候注意,若已经存在莫要重复添加;

(3)等待apiserver自动重启,且恢复正常

当kube-apiserver.yaml文件内容有变化时,kube-apiserver会自动重启
kubectl get pod -A
tail /var/log/kubernetes/audit-logs.txt

apiserver的pod起来之后,tail一下日志文件内容,出现如下:


就为成功;若pod报错起不来,可以describe看看pod的event事件,或者pod的log日志是上面原因没起来;
再者就是重启一下kubelet服务试试:

systemctl daemon-reload
systemctl restart kubelet

做题最后,退出root,退出master01,回到node01状态。

本页的评论功能已关闭