使用 CIS 1.6 Benchmark 的 RKE 强化指南

本文档提供了用于强化 RKE 集群(使用 Rancher 2.6 进行配置)生产安装的说明。此处概述了遵循 CIS 的 Kubernetes Benchmark 管控所需的配置和控制。

使用 CIS 1.6 Benchmark 的 RKE 强化指南 - 图1备注

本强化指南介绍了如何保护集群中的节点。建议你在安装 Kubernetes 之前参考本指南。

本强化指南适用于 RKE 集群,并对应以下 CIS Kubernetes Benchmark、Kubernetes 和 Rancher 版本:

Rancher 版本CIS Benchmark 版本Kubernetes 版本
Rancher v2.6Benchmark v1.6Kubernetes v1.18 到 v1.23

点击此处下载本文档的 PDF 版本

概述

本文档介绍了强化 RKE 集群的说明,该集群使用 Kubernetes 1.18 至 1.23 版本安装 Rancher 2.6,或在 Rancher 2.6 中配置使用 Kubernetes 1.18 至 1.23 版本的 RKE 集群。此处概述了遵循 CIS 的 Kubernetes Benchmark 管控所需的配置。

有关根据官方 CIS Benchmark 评估强化集群的更多详细信息,请参阅 CIS 1.6 Benchmark - 自我评估指南 - Rancher 2.6

已知问题

  • 如果注册自定义节点时仅提供公共 IP,CIS 1.6 强化设置中用于 Pod 的 Rancher exec shellview logs不起作用。此功能要求在注册自定义节点时提供私有 IP。
  • 如果把 default_pod_security_policy_template_id: 设置为 restrictedrestricted-noroot,根据 Rancher 提供的 Pod 安全策略 (PSP),Rancher 会在默认 ServiceAccount 上创建 RoleBindingsClusterRoleBindings。CIS 1.6 检查 5.1.5 时会要求默认 ServiceAccount 除了默认值之外没有绑定到其他角色或集群角色。此外,你还需要配置默认 ServiceAccount,使其不提供 ServiceAccount 令牌并且没有显式分配任何权限。

配置内核运行时参数

建议为集群中所有类型的节点使用以下 sysctl 配置。在 /etc/sysctl.d/90-kubelet.conf 中设置如下参数:

  1. vm.overcommit_memory=1
  2. vm.panic_on_oom=0
  3. kernel.panic=10
  4. kernel.panic_on_oops=1
  5. kernel.keys.root_maxbytes=25000000

运行 sysctl -p /etc/sysctl.d/90-kubelet.conf 以启用设置。

配置 etcd 用户和组

在安装 RKE 之前,你需要设置 etcd 服务的用户账号和组。在安装期间,etcd 用户的 uidgid 将用于在 RKE config.yml 中设置适当的文件和目录权限。

创建 etcd 用户和组

要创建 etcd 用户和组,请运行以下控制台命令。下面的命令使用 52034 作为 uidgid。该值只是一个示例。你可以使用有效且未被使用的 uidgid 来代替 52034

  1. groupadd --gid 52034 etcd
  2. useradd --comment "etcd service account" --uid 52034 --gid 52034 etcd --shell /usr/sbin/nologin

使用 etcd 用户的 uidgid 来更新 RKE config.yml

  1. services:
  2. etcd:
  3. gid: 52034
  4. uid: 52034

配置 default ServiceAccount

default ServiceAccount 的 automountServiceAccountToken 设置为 false

Kubernetes 为集群工作负载提供了一个 default ServiceAccount,但没有为 pod 分配特定 ServiceAccount。如果需要从 pod 访问 Kubernetes API,则需要为该 pod 创建一个特定的 ServiceAccount 并授予权限。你还需要配置 default ServiceAccount,使其不提供 ServiceAccount 令牌并且没有任何显式的权限分配。

对于标准 RKE 中的每个命名空间(包括 defaultkube-system),default ServiceAccount 必须包含以下值:

  1. automountServiceAccountToken: false

将以下配置保存到名为 account_update.yaml 的文件中:

  1. apiVersion: v1
  2. kind: ServiceAccount
  3. metadata:
  4. name: default
  5. automountServiceAccountToken: false

创建一个名为 account_update.sh 的 bash 脚本文件。确保为脚本设置了 chmod +x account_update.sh,使脚本具有执行权限:

  1. #!/bin/bash -e
  2. for namespace in $(kubectl get namespaces -A -o=jsonpath="{.items[*]['metadata.name']}"); do
  3. kubectl patch serviceaccount default -n ${namespace} -p "$(cat account_update.yaml)"
  4. done

配置网络策略

确保所有命名空间都定义了网络策略

如果你在同一个 Kubernetes 集群上运行不同的应用程序,被感染的应用程序可能会攻击相邻的应用程序。要确保容器只进行所需的通信,网络分段非常重要。网络策略指的是如何允许 Pod 与其他 Pod 以及与其他网络端点进行通信。

网络策略是命名空间范围的。为某个命名空间配置网络策略后,该策略不允许的所有其他流量都会被拒绝。但是,如果命名空间没有配置网络策略,则所有流量都会允许进出该命名空间中的 Pod。要执行网络策略,你必须启用 CNI(容器网络接口)插件。本指南使用 Canal 来执行策略。有关 CNI 网络插件的更多信息,请参阅这里

在集群上启用了 CNI 网络插件后,你就可以应用默认网络策略了。以下提供了一个供参考的 permissive 示例。如果要允许所有流量发送到命名空间中的所有 pod(即使添加了导致某些 pod 被“隔离”的策略),你可以显式创建一个策略来允许该命名空间中的所有流量。将以下配置保存为 default-allow-all.yaml。如需查看网络策略相关的其他文档,请前往 Kubernetes 网站。

使用 CIS 1.6 Benchmark 的 RKE 强化指南 - 图2备注

NetworkPolicy 只是一个示例,不建议用于生产环境。

  1. ---
  2. apiVersion: networking.k8s.io/v1
  3. kind: NetworkPolicy
  4. metadata:
  5. name: default-allow-all
  6. spec:
  7. podSelector: {}
  8. ingress:
  9. - {}
  10. egress:
  11. - {}
  12. policyTypes:
  13. - Ingress
  14. - Egress

创建一个名为 apply_networkPolicy_to_all_ns.sh 的 bash 脚本文件。确保为脚本设置了 chmod +x apply_networkPolicy_to_all_ns.sh,使脚本具有执行权限:

  1. #!/bin/bash -e
  2. for namespace in $(kubectl get namespaces -A -o=jsonpath="{.items[*]['metadata.name']}"); do
  3. kubectl apply -f default-allow-all.yaml -n ${namespace}
  4. done

执行此脚本能将具有 permissive NetworkPolicydefault-allow-all.yaml 配置应用于所有命名空间。

强化 RKE cluster.yml 配置参考

RKE CLI 能使用 cluster.yml 配置参考,该文件提供了实现 Rancher Kubernetes Engine (RKE) 的强化安装所需的配置。RKE 的安装文档介绍了有关配置项的其他详细信息。此 cluster.yml 参考不包括所需的 nodes 参数,该参数会因你的环境而异。如需查看 RKE 中节点配置的文档,请参阅此处

使用 CIS 1.6 Benchmark 的 RKE 强化指南 - 图3重要提示:

对于 Kubernetes 1.18 集群,请从 PodSecurityPolicy 中删除 spec.volumes: 'ephemeral' 配置,因为此 Kubernetes 版本不支持它。

  1. # 如果你打算在离线环境中部署 Kubernetes,
  2. # 请查阅配置自定义 RKE 镜像的文档。
  3. # https://rancher.com/docs/rke/latest/en/installation/
  4. # nodes 参数是必需的,并且会根据你的环境而有所不同。
  5. # 节点配置的文档可以在这里找到:
  6. # https://rancher.com/docs/rke/latest/en/config-options/nodes/
  7. nodes: []
  8. services:
  9. etcd:
  10. image: ""
  11. extra_args: {}
  12. extra_binds: []
  13. extra_env: []
  14. win_extra_args: {}
  15. win_extra_binds: []
  16. win_extra_env: []
  17. external_urls: []
  18. ca_cert: ""
  19. cert: ""
  20. key: ""
  21. path: ""
  22. uid: 52034
  23. gid: 52034
  24. snapshot: false
  25. retention: ""
  26. creation: ""
  27. backup_config: null
  28. kube-api:
  29. image: ""
  30. extra_args: {}
  31. extra_binds: []
  32. extra_env: []
  33. win_extra_args: {}
  34. win_extra_binds: []
  35. win_extra_env: []
  36. service_cluster_ip_range: ""
  37. service_node_port_range: ""
  38. pod_security_policy: true
  39. always_pull_images: false
  40. secrets_encryption_config:
  41. enabled: true
  42. custom_config: null
  43. audit_log:
  44. enabled: true
  45. configuration: null
  46. admission_configuration: null
  47. event_rate_limit:
  48. enabled: true
  49. configuration: null
  50. kube-controller:
  51. image: ""
  52. extra_args:
  53. feature-gates: RotateKubeletServerCertificate=true
  54. tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_128_GCM_SHA256
  55. bind-address: 127.0.0.1
  56. extra_binds: []
  57. extra_env: []
  58. win_extra_args: {}
  59. win_extra_binds: []
  60. win_extra_env: []
  61. cluster_cidr: ""
  62. service_cluster_ip_range: ""
  63. scheduler:
  64. image: ""
  65. extra_args:
  66. tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_128_GCM_SHA256
  67. bind-address: 127.0.0.1
  68. extra_binds: []
  69. extra_env: []
  70. win_extra_args: {}
  71. win_extra_binds: []
  72. win_extra_env: []
  73. kubelet:
  74. image: ""
  75. extra_args:
  76. feature-gates: RotateKubeletServerCertificate=true
  77. protect-kernel-defaults: true
  78. tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_128_GCM_SHA256
  79. extra_binds: []
  80. extra_env: []
  81. win_extra_args: {}
  82. win_extra_binds: []
  83. win_extra_env: []
  84. cluster_domain: cluster.local
  85. infra_container_image: ""
  86. cluster_dns_server: ""
  87. fail_swap_on: false
  88. generate_serving_certificate: true
  89. kubeproxy:
  90. image: ""
  91. extra_args: {}
  92. extra_binds: []
  93. extra_env: []
  94. win_extra_args: {}
  95. win_extra_binds: []
  96. win_extra_env: []
  97. network:
  98. plugin: ""
  99. options: {}
  100. mtu: 0
  101. node_selector: {}
  102. update_strategy: null
  103. authentication:
  104. strategy: ""
  105. sans: []
  106. webhook: null
  107. addons: |
  108. # Upstream Kubernetes restricted PSP policy
  109. # https://github.com/kubernetes/website/blob/564baf15c102412522e9c8fc6ef2b5ff5b6e766c/content/en/examples/policy/restricted-psp.yaml
  110. apiVersion: policy/v1beta1
  111. kind: PodSecurityPolicy
  112. metadata:
  113. name: restricted-noroot
  114. spec:
  115. privileged: false
  116. # Required to prevent escalations to root.
  117. allowPrivilegeEscalation: false
  118. requiredDropCapabilities:
  119. - ALL
  120. # Allow core volume types.
  121. volumes:
  122. - 'configMap'
  123. - 'emptyDir'
  124. - 'projected'
  125. - 'secret'
  126. - 'downwardAPI'
  127. # Assume that ephemeral CSI drivers & persistentVolumes set up by the cluster admin are safe to use.
  128. - 'csi'
  129. - 'persistentVolumeClaim'
  130. - 'ephemeral'
  131. hostNetwork: false
  132. hostIPC: false
  133. hostPID: false
  134. runAsUser:
  135. # Require the container to run without root privileges.
  136. rule: 'MustRunAsNonRoot'
  137. seLinux:
  138. # This policy assumes the nodes are using AppArmor rather than SELinux.
  139. rule: 'RunAsAny'
  140. supplementalGroups:
  141. rule: 'MustRunAs'
  142. ranges:
  143. # Forbid adding the root group.
  144. - min: 1
  145. max: 65535
  146. fsGroup:
  147. rule: 'MustRunAs'
  148. ranges:
  149. # Forbid adding the root group.
  150. - min: 1
  151. max: 65535
  152. readOnlyRootFilesystem: false
  153. ---
  154. apiVersion: rbac.authorization.k8s.io/v1
  155. kind: ClusterRole
  156. metadata:
  157. name: psp:restricted-noroot
  158. rules:
  159. - apiGroups:
  160. - extensions
  161. resourceNames:
  162. - restricted-noroot
  163. resources:
  164. - podsecuritypolicies
  165. verbs:
  166. - use
  167. ---
  168. apiVersion: rbac.authorization.k8s.io/v1
  169. kind: ClusterRoleBinding
  170. metadata:
  171. name: psp:restricted-noroot
  172. roleRef:
  173. apiGroup: rbac.authorization.k8s.io
  174. kind: ClusterRole
  175. name: psp:restricted-noroot
  176. subjects:
  177. - apiGroup: rbac.authorization.k8s.io
  178. kind: Group
  179. name: system:serviceaccounts
  180. - apiGroup: rbac.authorization.k8s.io
  181. kind: Group
  182. name: system:authenticated
  183. ---
  184. apiVersion: networking.k8s.io/v1
  185. kind: NetworkPolicy
  186. metadata:
  187. name: default-allow-all
  188. spec:
  189. podSelector: {}
  190. ingress:
  191. - {}
  192. egress:
  193. - {}
  194. policyTypes:
  195. - Ingress
  196. - Egress
  197. ---
  198. apiVersion: v1
  199. kind: ServiceAccount
  200. metadata:
  201. name: default
  202. automountServiceAccountToken: false
  203. addons_include: []
  204. system_images:
  205. etcd: ""
  206. alpine: ""
  207. nginx_proxy: ""
  208. cert_downloader: ""
  209. kubernetes_services_sidecar: ""
  210. kubedns: ""
  211. dnsmasq: ""
  212. kubedns_sidecar: ""
  213. kubedns_autoscaler: ""
  214. coredns: ""
  215. coredns_autoscaler: ""
  216. nodelocal: ""
  217. kubernetes: ""
  218. flannel: ""
  219. flannel_cni: ""
  220. calico_node: ""
  221. calico_cni: ""
  222. calico_controllers: ""
  223. calico_ctl: ""
  224. calico_flexvol: ""
  225. canal_node: ""
  226. canal_cni: ""
  227. canal_controllers: ""
  228. canal_flannel: ""
  229. canal_flexvol: ""
  230. weave_node: ""
  231. weave_cni: ""
  232. pod_infra_container: ""
  233. ingress: ""
  234. ingress_backend: ""
  235. metrics_server: ""
  236. windows_pod_infra_container: ""
  237. ssh_key_path: ""
  238. ssh_cert_path: ""
  239. ssh_agent_auth: false
  240. authorization:
  241. mode: ""
  242. options: {}
  243. ignore_docker_version: false
  244. kubernetes_version: ""
  245. private_registries: []
  246. ingress:
  247. provider: ""
  248. options: {}
  249. node_selector: {}
  250. extra_args: {}
  251. dns_policy: ""
  252. extra_envs: []
  253. extra_volumes: []
  254. extra_volume_mounts: []
  255. update_strategy: null
  256. http_port: 0
  257. https_port: 0
  258. network_mode: ""
  259. cluster_name:
  260. cloud_provider:
  261. name: ""
  262. prefix_path: ""
  263. win_prefix_path: ""
  264. addon_job_timeout: 0
  265. bastion_host:
  266. address: ""
  267. port: ""
  268. user: ""
  269. ssh_key: ""
  270. ssh_key_path: ""
  271. ssh_cert: ""
  272. ssh_cert_path: ""
  273. monitoring:
  274. provider: ""
  275. options: {}
  276. node_selector: {}
  277. update_strategy: null
  278. replicas: null
  279. restore:
  280. restore: false
  281. snapshot_name: ""
  282. dns: null
  283. upgrade_strategy:
  284. max_unavailable_worker: ""
  285. max_unavailable_controlplane: ""
  286. drain: null
  287. node_drain_input: null

强化 RKE 模板配置参考

RKE 模板参考提供了实现 Kubernetes 强化安装所需的配置。RKE 模板用于配置 Kubernetes 和定义 Rancher 设置。如需了解安装以及 RKE 模板的详细信息,请参阅 Rancher 文档

  1. #
  2. # Cluster Config
  3. #
  4. default_pod_security_policy_template_id: restricted-noroot
  5. docker_root_dir: /var/lib/docker
  6. enable_cluster_alerting: false
  7. enable_cluster_monitoring: false
  8. enable_network_policy: true
  9. local_cluster_auth_endpoint:
  10. enabled: true
  11. name: ''
  12. #
  13. # Rancher Config
  14. #
  15. rancher_kubernetes_engine_config:
  16. addon_job_timeout: 45
  17. authentication:
  18. strategy: x509
  19. dns:
  20. nodelocal:
  21. ip_address: ''
  22. node_selector: null
  23. update_strategy: {}
  24. enable_cri_dockerd: false
  25. ignore_docker_version: true
  26. #
  27. # # 目前仅支持 Nginx ingress provider
  28. # # 要禁用 Ingress controller,设置 `provider: none`
  29. # # 要在指定节点上禁用 Ingress,使用 node_selector,例如:
  30. # provider: nginx
  31. # node_selector:
  32. # app: ingress
  33. #
  34. ingress:
  35. default_backend: false
  36. default_ingress_class: true
  37. http_port: 0
  38. https_port: 0
  39. provider: nginx
  40. kubernetes_version: v1.21.8-rancher1-1
  41. monitoring:
  42. provider: metrics-server
  43. replicas: 1
  44. #
  45. # 如果你在 AWS 使用 Calico
  46. #
  47. # network:
  48. # plugin: calico
  49. # calico_network_provider:
  50. # cloud_provider: aws
  51. #
  52. # # 要指定 Flannel 接口
  53. #
  54. # network:
  55. # plugin: flannel
  56. # flannel_network_provider:
  57. # iface: eth1
  58. #
  59. # # 要为 Canal 插件指定 Flannel 接口
  60. #
  61. # network:
  62. # plugin: canal
  63. # canal_network_provider:
  64. # iface: eth1
  65. #
  66. network:
  67. mtu: 0
  68. options:
  69. flannel_backend_type: vxlan
  70. plugin: canal
  71. rotate_encryption_key: false
  72. #
  73. # services:
  74. # kube-api:
  75. # service_cluster_ip_range: 10.43.0.0/16
  76. # kube-controller:
  77. # cluster_cidr: 10.42.0.0/16
  78. # service_cluster_ip_range: 10.43.0.0/16
  79. # kubelet:
  80. # cluster_domain: cluster.local
  81. # cluster_dns_server: 10.43.0.10
  82. #
  83. services:
  84. scheduler:
  85. extra_args:
  86. tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_128_GCM_SHA256
  87. bind-address: 127.0.0.1
  88. etcd:
  89. backup_config:
  90. enabled: true
  91. interval_hours: 12
  92. retention: 6
  93. safe_timestamp: false
  94. timeout: 300
  95. creation: 12h
  96. extra_args:
  97. election-timeout: 5000
  98. heartbeat-interval: 500
  99. retention: 72h
  100. snapshot: false
  101. uid: 52034
  102. gid: 52034
  103. kube_api:
  104. always_pull_images: false
  105. audit_log:
  106. enabled: true
  107. event_rate_limit:
  108. enabled: true
  109. pod_security_policy: true
  110. secrets_encryption_config:
  111. enabled: true
  112. service_node_port_range: 30000-32767
  113. kube-controller:
  114. extra_args:
  115. feature-gates: RotateKubeletServerCertificate=true
  116. tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_128_GCM_SHA256
  117. bind-address: 127.0.0.1
  118. kubelet:
  119. extra_args:
  120. feature-gates: RotateKubeletServerCertificate=true
  121. protect-kernel-defaults: true
  122. tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_128_GCM_SHA256
  123. fail_swap_on: false
  124. generate_serving_certificate: true
  125. ssh_agent_auth: false
  126. upgrade_strategy:
  127. max_unavailable_controlplane: '1'
  128. max_unavailable_worker: 10%
  129. windows_prefered_cluster: false

强化 cloud-config 配置参考

cloud-config 配置文件通常用于云基础设施环境中,能让你管理计算实例的配置。此参考 config 配置了安装 Kubernetes 之前所需的 SUSE Linux Enterprise Server (SLES)、openSUSE Leap、Red Hat Enterprise Linux (RHEL) 和 Ubuntu 操作系统级别的设置。

针对 SUSE Linux Enterprise Server 15 (SLES 15) 和 openSUSE Leap 15 的强化 cloud-config 参考

  1. #cloud-config
  2. system_info:
  3. default_user:
  4. groups:
  5. - docker
  6. write_files:
  7. - path: "/etc/sysctl.d/90-kubelet.conf"
  8. owner: root:root
  9. permissions: '0644'
  10. content: |
  11. vm.overcommit_memory=1
  12. vm.panic_on_oom=0
  13. kernel.panic=10
  14. kernel.panic_on_oops=1
  15. kernel.keys.root_maxbytes=25000000
  16. package_update: true
  17. ssh_pwauth: false
  18. runcmd:
  19. # Docker 应该已在 SLES 15 SP3 中安装
  20. - zypper install docker containerd
  21. - systemctl daemon-reload
  22. - systemctl enable docker.service
  23. - systemctl start --no-block docker.service
  24. - sysctl -p /etc/sysctl.d/90-kubelet.conf
  25. - groupadd --gid 52034 etcd
  26. - useradd --comment "etcd service account" --uid 52034 --gid 52034 etcd --shell /usr/sbin/nologin

针对 Red Hat Enterprise Linux 8 (RHEL 8) 和 Ubuntu 20.04 LTS 的强化 cloud-config 参考

  1. #cloud-config
  2. system_info:
  3. default_user:
  4. groups:
  5. - docker
  6. write_files:
  7. - path: "/etc/sysctl.d/90-kubelet.conf"
  8. owner: root:root
  9. permissions: '0644'
  10. content: |
  11. vm.overcommit_memory=1
  12. vm.panic_on_oom=0
  13. kernel.panic=10
  14. kernel.panic_on_oops=1
  15. kernel.keys.root_maxbytes=25000000
  16. package_update: true
  17. ssh_pwauth: false
  18. runcmd:
  19. # 使用 Rancher 的 Docker 安装脚本来安装 Docker - github.com/rancher/install-docker
  20. - curl https://releases.rancher.com/install-docker/20.10.sh | sh
  21. - sysctl -p /etc/sysctl.d/90-kubelet.conf
  22. - groupadd --gid 52034 etcd
  23. - useradd --comment "etcd service account" --uid 52034 --gid 52034 etcd --shell /usr/sbin/nologin