iT邦幫忙

2023 iThome 鐵人賽

DAY 9
0
DevOps

SRE/K8S 碎碎念系列 第 9

[2023-09][Upgrade] 升級 1.25 時的 PSP 與 KSM

  • 分享至 

  • xImage
  •  

維運 EKS 最常遇到的就是每年的更版,尤其這幾年更版速度更是加快,可以看到光2024 就有四個版本要 end of support,改版要注意的事項我們可以在 AWS 官方 看到提醒事項,

Screenshot 2023-09-22 at 6.33.25 PM.png

這次來分享一些升級到 1.25 的經驗,這次最大的改版是PodSecurityPolicy (PSP) 要被移除了。 PSP 會被 Pod Security Admission (PSA) 和 Pod Security Standards (PSS) 取代。PSA 和 PSS 在 Amazon EKS 1.25 中默認啟用

什麼是 PSP

PSP 是對集群内 Pods 實行安全策略

什麼是 PSS

PSA 所實現的具體安全控制標準

什麼是 PSA

一個 Built-in admission controller,實現 PSS 中描述的安全控制

如果現階段有使用 PSP,官方建議兩種方法

  • Kubernetes PSS.
  • Policy-as-code solutions from the Kubernetes environment.

查看 PSP

查看目前環境的 PSP,看看有沒有需要 migrate 的 policy

$ kubectl get psp
NAME                                     PRIV    CAPS   SELINUX    RUNASUSER   FSGROUP     SUPGROUP    READONLYROOTFS   VOLUMES
aws-cloudwatch-logs-aws-for-fluent-bit   false          RunAsAny   RunAsAny    MustRunAs   MustRunAs   false            configMap,secret,hostPath,projected
eks.privileged                           true    *      RunAsAny   RunAsAny    RunAsAny    RunAsAny    false            *
kube-state-metrics                       false          RunAsAny   MustRunAs   MustRunAs   MustRunAs   false            secret
  1. 根據官方描述eks.privileged 這個是1.13 - 1.24 default 的 PSP,不需要處理它,會在 1.25 自動改掉。
    2.Kube-state-metrics 跟 aws-cloudwatch-logs-aws-for-fluent-bit 都是我們額外用 helm release 建立的

我們先從 Kube-state-metrics 開始研究

什麼是 Kube-state-metrics

KSM 是 Kubernetes 的工具,可以用來提供 cluster 狀態指標。

依照 cluster 中的預設 PSP 與文檔中的預設規則所對應,檢視是否具有差異

  1. 首先我們先判斷現有架構部署的文件,會發現並沒有額外進行多餘的設定。

    resource "helm_release" "kube_state_metrics" {
      name       = "kube-state-metrics"
      repository = "https://charts.bitnami.com/bitnami"
      chart      = "kube-state-metrics"
      version    = "1.2.4"
      namespace  = "kube-system"
    }
    

Screenshot 2023-09-23 at 3.51.09 PM.png

我們來看一下現有的設定跟官方預設設定是否一樣,再次確保我們的設定在前人的手中並無調整過

$ k describe psp kube-state-metrics
Warning: policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+
Name:         kube-state-metrics
Namespace:
Labels:       app.kubernetes.io/instance=kube-state-metrics
              app.kubernetes.io/managed-by=Helm
              app.kubernetes.io/name=kube-state-metrics
              helm.sh/chart=kube-state-metrics-1.2.4
Annotations:  meta.helm.sh/release-name: kube-state-metrics
              meta.helm.sh/release-namespace: kube-system
API Version:  policy/v1beta1
Kind:         PodSecurityPolicy
Metadata:
  Creation Timestamp:  2021-04-29T04:16:16Z
  Resource Version:    26373459
  UID:                 bbd5eb31-4222-4110-88d4-44e03d9216ff
Spec:
  Allow Privilege Escalation:  true
  Fs Group:
    Ranges:
      Max:  1001
      Min:  1001
    Rule:   MustRunAs
  Run As User:
    Ranges:
      Max:  1001
      Min:  1001
    Rule:   MustRunAs
  Se Linux:
    Rule:  RunAsAny
  Supplemental Groups:
    Ranges:
      Max:  1001
      Min:  1001
    Rule:   MustRunAs
  Volumes:
    secret
Events:  <none>
# https://artifacthub.io/packages/helm/bitnami/kube-state-metrics?modal=template&template=psp.yaml
{{- /*
Copyright VMware, Inc.
SPDX-License-Identifier: APACHE-2.0
*/}}

{{- $pspAvailable := (semverCompare "<1.25-0" (include "common.capabilities.kubeVersion" .)) -}}
{{- if and $pspAvailable .Values.rbac.create .Values.rbac.pspEnabled }}
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
  name: {{ template "common.names.fullname.namespace" . }}
  namespace: {{ include "common.names.namespace" . | quote }}
  labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }}
  {{- if .Values.commonAnnotations }}
  annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
  {{- end }}
spec:
  privileged: false
  volumes:
    - 'secret'
  hostNetwork: {{ .Values.hostNetwork }}
  hostIPC: false
  hostPID: false
  runAsUser:
    rule: 'MustRunAs'
    ranges:
      - min: 1001
        max: 1001
  seLinux:
    rule: 'RunAsAny'
  supplementalGroups:
    rule: 'MustRunAs'
    ranges:
      - min: 1001
        max: 1001
  fsGroup:
    rule: 'MustRunAs'
    ranges:
      - min: 1001
        max: 1001
  readOnlyRootFilesystem: false
{{- end }}

基本上是一樣的。而在官方設定上也會發現如果版本 <1.25 他才會啟用psp create 這個動作,所以可以判斷我們將直接將此版本升級到官方最新支援版本

至於要升到哪個版本呢,雖然 Bitnami 官方提到

Prerequisites

  • Kubernetes 1.19+
  • Helm 3.2.0+

但我前往 kube-state-metrics 官方查看,發現他們有建議不同的 K8s version,選擇相對應的版本,而我們要升級的1.25 為 KSM v2.7.0,所以我們要來找 bitnami相對安裝版本,也就是3.2.8

https://ithelp.ithome.com.tw/upload/images/20230924/201185250litAw6KjA.png

https://ithelp.ithome.com.tw/upload/images/20230924/20118525qJALOGaFeA.png


上一篇
[2023-08][Cost Down] 在不必要的時間關閉 Node
下一篇
Day 10 升級 1.25 時的 PSP 與cloudwatch-logs-aws-for-fluent-bit
系列文
SRE/K8S 碎碎念30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言