|
| 1 | +--- |
| 2 | +title: 쿠버네티스 클러스터에서 sysctl 사용하기 |
| 3 | + |
| 4 | + |
| 5 | +content_type: task |
| 6 | +--- |
| 7 | + |
| 8 | +<!-- overview --> |
| 9 | + |
| 10 | +{{< feature-state for_k8s_version="v1.21" state="stable" >}} |
| 11 | + |
| 12 | +이 문서는 쿠버네티스 클러스터에서 {{< glossary_tooltip term_id="sysctl" >}} 인터페이스를 사용하여 |
| 13 | +커널 파라미터를 어떻게 구성하고, 사용하는지를 설명한다. |
| 14 | + |
| 15 | +## {{% heading "prerequisites" %}} |
| 16 | + |
| 17 | + |
| 18 | +{{< include "task-tutorial-prereqs.md" >}} |
| 19 | + |
| 20 | +일부 단계에서는 실행 중인 클러스터의 kubelet에서 |
| 21 | +커맨드 라인 옵션을 재구성할 필요가 있다. |
| 22 | + |
| 23 | +<!-- steps --> |
| 24 | + |
| 25 | +## 모든 sysctl 파라미터 나열 |
| 26 | + |
| 27 | +리눅스에서 sysctl 인터페이스는 관리자들이 런타임에 커널 파라미터를 수정할 수 있도록 |
| 28 | +허용한다. 파라미터는 `/proc/sys` 가상 파일 시스템을 통해 이용할 수 있다. 파라미터는 |
| 29 | +다음과 같은 다양한 서브 시스템을 포함한다. |
| 30 | + |
| 31 | +- 커널 (공통 접두사: `kernel.`) |
| 32 | +- 네트워크 (공통 접두사: `net.`) |
| 33 | +- 가상 메모리 (공통 접두사: `vm.`) |
| 34 | +- MDADM (공통 접두사: `dev.`) |
| 35 | +- 더 많은 서브 시스템은 [커널 문서](https://www.kernel.org/doc/Documentation/sysctl/README)에 설명되어 있다. |
| 36 | + |
| 37 | +모든 파라미터 리스트를 가져오려면 다음 명령을 실행한다. |
| 38 | + |
| 39 | +```shell |
| 40 | +sudo sysctl -a |
| 41 | +``` |
| 42 | + |
| 43 | +## unsafe sysctl 활성화하기 |
| 44 | + |
| 45 | +sysctl은 _safe_ sysctl과 _unsafe_ sysctl로 구성되어 있다. _safe_ sysctl은 |
| 46 | +적절한 네임스페이스 뿐만 아니라 동일한 노드의 파드 사이에 _고립_ 되어야 한다. 즉, 하나의 |
| 47 | +파드에 _safe_ sysctl을 설정한다는 것은 다음을 의미한다. |
| 48 | + |
| 49 | +- 노드의 다른 파드에 영향을 미치지 않아야 한다 |
| 50 | +- 노드의 상태를 손상시키지 않아야 한다 |
| 51 | +- CPU 또는 메모리 리소스가 파드의 리소스 제한에 벗어나는 것을 |
| 52 | + 허용하지 않아야 한다 |
| 53 | + |
| 54 | +아직까지 대부분 _네임스페이스된_ sysctl은 _safe_ sysctl로 고려되지 않았다. |
| 55 | +>>> 다음 sysctl은 _safe_ 명령을 지원한다. |
| 56 | +
|
| 57 | +- `kernel.shm_rmid_forced`, |
| 58 | +- `net.ipv4.ip_local_port_range`, |
| 59 | +- `net.ipv4.tcp_syncookies`, |
| 60 | +- `net.ipv4.ping_group_range` (Kubernetes 1.18 이후). |
| 61 | + |
| 62 | +{{< note >}} |
| 63 | +`net.ipv4.tcp_syncookies` 예시는 리눅스 커널 버전 4.4 또는 이하에서 네임스페이스되지 않는다. |
| 64 | +{{< /note >}} |
| 65 | + |
| 66 | +kubelet이 더 고립된 방법을 지원하면 추후 쿠버네티스 버전에서 |
| 67 | +확장될 것이다. |
| 68 | + |
| 69 | +모든 _safe_ sysctl은 기본적으로 활성화된다. |
| 70 | + |
| 71 | +모든 _unsafe_ sysctl은 기본적으로 비활성화되고, 노드별 기본 클러스터 관리자에 |
| 72 | +의해 수동으로 메뉴얼로 허용되어야 한다. |
| 73 | +unsafe sysctl이 비활성화된 파드는 스케줄링되지만, 시작에 실패한다. |
| 74 | + |
| 75 | +위의 경고를 염두에 두고 클러스터 관리자는 |
| 76 | +고성능 또는 실시간 애플리케이션 조정과 같은 |
| 77 | +매우 특수한 상황에 대해 특정 _unsafe_ sysctl을 허용할 수 있다. _unsafe_ sysctl은 |
| 78 | +kubelet 플래그를 사용하여 노드별로 활성화된다. 예를 들면, 다음과 같다. |
| 79 | + |
| 80 | +```shell |
| 81 | +kubelet --allowed-unsafe-sysctls \ |
| 82 | + 'kernel.msg*,net.core.somaxconn' ... |
| 83 | +``` |
| 84 | + |
| 85 | +{{< glossary_tooltip term_id="minikube" >}}의 경우, `extra-config` 플래그를 통해 이 작업을 수행할 수 있다. |
| 86 | + |
| 87 | +```shell |
| 88 | +minikube start --extra-config="kubelet.allowed-unsafe-sysctls=kernel.msg*,net.core.somaxconn"... |
| 89 | +``` |
| 90 | + |
| 91 | +_네임스페이스_ sysctl만 이 방법을 사용할 수 있다. |
| 92 | + |
| 93 | +## 파드에 대한 sysctl 설정 |
| 94 | + |
| 95 | +수많은 sysctl은 최근 리눅스 커널에서 _네임스페이스_ 되어 있다. 이는 노드의 각 파드에 |
| 96 | +대해 개별적으로 설정할 수 있다는 것이다. 쿠버네티스의 파드 securityContext를 통해 |
| 97 | +네임스페이스 sysctl만 구성할 수 있다. |
| 98 | + |
| 99 | +다음 sysctls는 네임스페이스로 알려져 있다. |
| 100 | +이 목록은 이후 버전의 Linux 커널에서 변경될 수 있다. |
| 101 | + |
| 102 | +- `kernel.shm*`, |
| 103 | +- `kernel.msg*`, |
| 104 | +- `kernel.sem`, |
| 105 | +- `fs.mqueue.*`, |
| 106 | +- `net.*` 아래의 파라미터는 컨테이너 네트워킹 네임스페이스에서 설정할 수 있다. |
| 107 | + 그러나 예외가 존재한다. (예, `net.netfilter.nf_conntrack_max`와 `net.netfilter.nf_conntrack_expect_max`는 |
| 108 | + 컨테이너 네트워킹 네임스페이스에서 설정되지만, |
| 109 | + 네임스페이스가 없다.) |
| 110 | + |
| 111 | +네임스페이스가 없는 sysctl은 _node-level_ sysctl이라고 부른다. |
| 112 | +이를 설정해야 한다면, 각 노드의 OS에서 수동으로 구성하거나 |
| 113 | +특권있는 컨테이너의 데몬셋을 사용하여야 한다. |
| 114 | + |
| 115 | +네임스페이스 sysctl을 구성하기 위해서 파드 securityContext를 사용한다. securityContext는 동일한 파드의 모든 컨테이너에 적용된다. |
| 116 | + |
| 117 | +이 예시는 safe sysctl `kernel.shm_rmid_forced`와 두 개의 unsafe sysctl인 |
| 118 | +`net.core.somaxconn` 과 `kernel.msgmax` 를 설정하기 위해 파드 securityContext를 사용한다. |
| 119 | + |
| 120 | +{{< warning >}} |
| 121 | +파라미터의 영향을 파악한 후에만 운영체제가 |
| 122 | +불안정해지지 않도록 sysctl 파라미터를 수정한다. |
| 123 | +{{< /warning >}} |
| 124 | + |
| 125 | +```yaml |
| 126 | +apiVersion: v1 |
| 127 | +kind: Pod |
| 128 | +metadata: |
| 129 | + name: sysctl-example |
| 130 | +spec: |
| 131 | + securityContext: |
| 132 | + sysctls: |
| 133 | + - name: kernel.shm_rmid_forced |
| 134 | + value: "0" |
| 135 | + - name: net.core.somaxconn |
| 136 | + value: "1024" |
| 137 | + - name: kernel.msgmax |
| 138 | + value: "65536" |
| 139 | + ... |
| 140 | +``` |
| 141 | + |
| 142 | + |
| 143 | +<!-- discussion --> |
| 144 | + |
| 145 | +{{< warning >}} |
| 146 | +_unsafe_의 특성으로 인해 _unsafe_sysctl는 위험 부담이 있으며 |
| 147 | +컨테이너의 잘못된 동작, 리소스 부족 혹은 노드 완전 파손과 같은 |
| 148 | +심각한 문제를 초래할 수 있다. |
| 149 | +{{< /warning >}} |
| 150 | + |
| 151 | +특별한 sysctl 설정이 있는 노드를 클러스터 내에서 _tainted_로 간주하고 |
| 152 | +sysctl 설정이 필요한 노드에만 파드를 예약하는 것이 좋다. |
| 153 | +이를 구현하려면 쿠버네티스 [_테인트(taint)와 톨러레이션(toleration)_ 기능](/docs/reference/generated/kubectl/kubectl-commands/#taint) 을 |
| 154 | +사용하는 것이 좋다. |
| 155 | + |
| 156 | +두 _unsafe_ sysctl을 명시적으로 활성화하지 않은 노드에서 _unsafe_ sysctl을 사용하는 |
| 157 | +파드가 시작되지 않는다. _node-level_ sysctl과 마찬가지로 |
| 158 | +[_테인트와 톨러레이션_ 특징](/docs/reference/generated/kubectl/kubectl-commands/#taint) 또는 |
| 159 | +[노드 테인트](/docs/concepts/scheduling-eviction/taint-and-toleration/)를 |
| 160 | +사용하여 해당 파드를 오른쪽 노드에 |
| 161 | +스케줄하는 것을 추천한다. |
| 162 | + |
| 163 | +## 파드시큐리티폴리시(PodSecurityPolicy) |
| 164 | + |
| 165 | +{{< feature-state for_k8s_version="v1.21" state="deprecated" >}} |
| 166 | + |
| 167 | +또한 파드시큐리티폴리시의 `forbiddenSysctls` 및/또는 `allowedUnsafeSysctls` 필드에 |
| 168 | +sysctl 또는 sysctl 패턴 목록을 지정하여 파드에서 설정할 |
| 169 | +수 있는 sysctl를 제어할 수 있다. sysctl 패턴은 `kernel.*`과 같은 `*` |
| 170 | +문자로 끝난다. `*` 문자 자체는 |
| 171 | +모든 sysctl와 일치한다. |
| 172 | + |
| 173 | +기본적으로 모든 safe sysctl은 허용된다. |
| 174 | + |
| 175 | +`forbiddenSysctls`와 `allowedUnsafeSysctls`는 모두 단순한 sysctl 이름 또는 |
| 176 | +sysctl 패턴 목록이다(`*`로 끝남). `*` 문자는 모든 sysctl과 일치한다. |
| 177 | + |
| 178 | +`forbiddenSysctls` 필드에는 특정 sysctl이 제외된다. |
| 179 | +목록에서 safe sysctl과 unsafe sysctl의 조합을 금지할 수 있다. |
| 180 | +sysctl 설정을 금지하기 위해서는 `*`를 사용한다. |
| 181 | + |
| 182 | +`allowedUnsafeSysctls` 필드에 unsafe sysctl을 지정하고 `forbiddenSysctls` 필드가 |
| 183 | +존재하지 않는 경우, 파드시큐리티폴리시를 사용하여 |
| 184 | +sysctl을 파드에서 사용할 수 있다. |
| 185 | +파드시큐리티폴리시의 모든 unsafe sysctl을 설정하려면 `*`를 사용한다. |
| 186 | + |
| 187 | +이 두 필드를 겹치도록 구성하지 않는다. |
| 188 | +이는 지정된 sysctl이 허용 및 금지됨을 의미한다. |
| 189 | + |
| 190 | +{{< warning >}} |
| 191 | +파드시큐리티폴리시의 'allowedUnsafeSysctls' 필드를 통해 unsafe sysctl을 |
| 192 | +허용하는 경우, 해당 노드에서 sysctl이 |
| 193 | +'--allowed-unsafe-sysctls' kubelet 플래그를 통해 허용되지 않으면, |
| 194 | +sysctl을 사용하는 모든 파드가 시작에 실패한다. |
| 195 | +{{< /warning >}} |
| 196 | + |
| 197 | +이 예에서는 `kernel.msg` 접두사가 붙은 unsafe sysctl을 설정할 수 있으며, |
| 198 | +`kernel.shm_rmid_forced` sysctl의 설정을 허용하지 않는다. |
| 199 | + |
| 200 | +```yaml |
| 201 | +apiVersion: policy/v1beta1 |
| 202 | +kind: PodSecurityPolicy |
| 203 | +metadata: |
| 204 | + name: sysctl-psp |
| 205 | +spec: |
| 206 | + allowedUnsafeSysctls: |
| 207 | + - kernel.msg* |
| 208 | + forbiddenSysctls: |
| 209 | + - kernel.shm_rmid_forced |
| 210 | + ... |
| 211 | +``` |
| 212 | + |
| 213 | + |
0 commit comments