Kubeadm: [였λ₯˜ μŠ€μ™‘]: μŠ€μ™‘μ„ 켜고 μ‹€ν–‰ν•˜λŠ” 것은 μ§€μ›λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μŠ€μ™‘μ„ λΉ„ν™œμ„±ν™”ν•˜μ‹­μ‹œμ˜€

에 λ§Œλ“  2017λ…„ 12μ›” 21일  Β·  11μ½”λ©˜νŠΈ  Β·  좜처: kubernetes/kubeadm

이것은 버그 λ³΄κ³ μ„œμž…λ‹ˆκΉŒ μ•„λ‹ˆλ©΄ κΈ°λŠ₯ μš”μ²­μž…λ‹ˆκΉŒ?

버그 보고

버전

kubeadm 버전 ( kubeadm version ): 1.9.0

ν™˜κ²½ :

  • Kubernetes 버전 ( kubectl version ): 1.9.0
  • ν΄λΌμš°λ“œ 제곡자 λ˜λŠ” ν•˜λ“œμ›¨μ–΄ ꡬ성 : Raspberry Pi
  • OS (예: /etc/os-release): Raspbian GNU/Linux 8(jessie)
  • 컀널 (예: uname -a ): Linux 4.9.35-v7+
  • 기타 :

무슨 μΌμ΄μ—μš”?

kubeadm init ν•˜λ©΄ [ERROR Swap]: running with swap on is not supported. Please disable swap 였λ₯˜κ°€ λœΉλ‹ˆλ‹€. μ œμ•ˆλœ μˆ˜μ • 사항은 기본적으둜 kubelet의 ν”Œλž˜κ·Έλ₯Ό μ‚¬μš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

kubeadm reset 
echo 'Environment="KUBELET_EXTRA_ARGS=--fail-swap-on=false"' >> /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

systemctl daemon-reload
systemctl restart kubelet

kubeadm init

κ·ΈλŸ¬λ‚˜ κ²°κ΅­ 였λ₯˜λŠ” μ—¬μ „νžˆ μ‘΄μž¬ν•©λ‹ˆλ‹€. μ–΄μ©Œλ©΄ 이것은 λŒ€μ‹  Kubelet λ¬Έμ œμ΄κ±°λ‚˜ λ‚΄κ°€ λ­”κ°€λ₯Ό 잘λͺ» κ΅¬μ„±ν•˜κ³  μžˆλŠ” 것일 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€...

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

swapoff -a

λͺ¨λ“  11 λŒ“κΈ€

kubelet ν”Œλž˜κ·Έλ₯Ό μ„€μ •ν–ˆλ‹€λ©΄ kubeadm init --ignore-preflight-errors Swap 이 μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” 것이 μ•ˆμ „ν•˜μ§€λ§Œ μ§€μ›λ˜μ§€ μ•ŠλŠ” μ˜μ—­μœΌλ‘œ μ΄λ™ν•˜κ²Œ λ˜λ―€λ‘œ λŒ€μ‹  μŠ€μ™‘μ„ ν•΄μ œν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

이것을 λ‹€μ‹œ μ—΄ ν•„μš”λŠ” μ—†μ§€λ§Œ μ—¬μ „νžˆ 이것이 λ‹€μ†Œ 직관적이지 μ•Šλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. kubelet ν”Œλž˜κ·Έλ₯Ό μ„€μ •ν•˜λ©΄ μ‹€ν–‰ μ „ 였λ₯˜λ₯Ό λ¬΄μ‹œν•  ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€. --ignore-preflight-errors κ°€ μ „λ‹¬λ˜μ§€ μ•ŠμœΌλ©΄ kubelet ν”Œλž˜κ·Έκ°€ ν™œμ„±ν™”λ˜μ—ˆλŠ”μ§€ 여뢀에 관계없이 였λ₯˜ λ©”μ‹œμ§€κ°€ λ™μΌν•˜κ²Œ μœ μ§€λ˜λ©° μ΄λŠ” μ˜€ν•΄μ˜ μ†Œμ§€κ°€ μžˆμŠ΅λ‹ˆλ‹€.

μŠ€μ™‘μ„ λ„λŠ” λͺ…령은 λ¬΄μ—‡μž…λ‹ˆκΉŒ?

swapoff -a

swapoff -a κ°€ λŒ€λΆ€λΆ„μ˜ 경우 μ€μ΄μ•ŒμΈ 것은 μ‚¬μ‹€μ΄μ§€λ§Œ νŠΉμ • k8 μ„€μ •μ—λŠ” μ‹€μ œλ‘œ μŠ€μ™‘μ΄ ν•„μš”ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, 짧은 CI/CD μž‘μ—…μ„ 거의 μ²˜λ¦¬ν•˜μ§€ μ•ŠλŠ” 개인 GitLab Runner에 μ‚¬μš©ν•˜λŠ” 1GB RAM의 맀우 μž‘κ³  μ €λ ΄ν•œ VM이 μžˆμŠ΅λ‹ˆλ‹€. μ‹œμŠ€ν…œ 크기λ₯Ό 늘리면 99% 유휴 μƒνƒœμΈ λ¦¬μ†ŒμŠ€μ— λŒ€ν•΄ 더 λ§Žμ€ λΉ„μš©μ„ μ§€λΆˆν•˜κ²Œ λ©λ‹ˆλ‹€. μŠ€μ™‘μ„ λΉ„ν™œμ„±ν™”ν•˜λ©΄ buid ν¬λ“œ λ‚΄λΆ€μ˜ npm install 및 기타 μŠ€ν¬λ¦½νŠΈκ°€ 짧은 μ‹œκ°„ λ™μ•ˆμ΄μ§€λ§Œ κ½€ λ§Žμ€ λ©”λͺ¨λ¦¬κ°€ ν•„μš”ν•˜κΈ° λ•Œλ¬Έμ— 쀑단될 수 μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ gitlab 주자 차트 와 μŠ€μ™‘μ΄ μžˆλŠ” 단일 λ…Έλ“œ kubeadm ν΄λŸ¬μŠ€ν„°κ°€ κ°€μž₯ μ ν•©ν•©λ‹ˆλ‹€.

λ―Έλ‹ˆ ν΄λŸ¬μŠ€ν„°λ₯Ό μ‹œμž‘ν•˜κ³  μ‹€ν–‰ν•˜λŠ” 방법은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

UPD: μ•„λž˜ ν•΄κ²° 방법은 k8s 1.10μ—λ§Œ μ μš©λ©λ‹ˆλ‹€. - 1.11+의 경우 https://kubernetes.io/docs/tasks/administer-cluster/kubelet-config-file/을 μ°Έμ‘° kubeletConfiguration:\n failSwapOn: false λ₯Ό 지정할 수 μžˆμŠ΅λ‹ˆλ‹€. kubeadm의 config.yaml λ‹€μŒ kubeadm init --config config.yaml --ignore-preflight-errors Swap ).

kubeadm reset 

## ↓ see explanation below
sed -i '9s/^/Environment="KUBELET_EXTRA_ARGS=--fail-swap-on=false"\n/' /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

systemctl daemon-reload
systemctl restart kubelet

echo "
kind: MasterConfiguration
apiVersion: kubeadm.k8s.io/v1alpha1
api:
  bindPort: ${K8S_API_PORT}
apiServerCertSANs: ${K8S_API_EXTRA_HOSTS}
" > /tmp/config.yaml

kubeadm init --config /tmp/config.yaml --ignore-preflight-errors Swap

## make possible to run workload on master
kubectl taint nodes --all node-role.kubernetes.io/master-

μ•„λž˜ 단락은 k8s 1.10μ—λ§Œ μ μš©λ©λ‹ˆλ‹€.
@cjdcordeiro κ°€ μ–ΈκΈ‰ν•œ echo 'Environment="..."' >> ... sed -i '9s/^/... λŒ€μ‹  10-kubeadm.conf 의 쀄이 잘λͺ»λœ μˆœμ„œλ‘œ μŒ“μ˜€ κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

...
Environment="KUBELET_CERTIFICATE_ARGS=--rotate-certificates=true --cert-dir=/var/lib/kubelet/pki"
ExecStart=
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_SYSTEM_PODS_ARGS $KUBELET_NETWORK_ARGS $KUBELET_DNS_ARGS $KUBELET_AUTHZ$
Environment="KUBELET_EXTRA_ARGS=--fail-swap-on=false"

λ•Œλ¬Έμ— KUBELET_EXTRA_ARGS ν›„ λ‚˜νƒ€λ‚œ ExecStart , 그것이 λ”°κΈ°λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€μ²˜λŸΌ λ³΄μ˜€λ‹€. 와 sed -i '9s/^/... , 파일 /etc/systemd/system/kubelet.service.d/10-kubeadm.conf κ·Έλ ‡κ²Œν•˜κ³  μž‘ν’ˆ 같은 λκΉŒμ§€ :

...
Environment="KUBELET_CERTIFICATE_ARGS=--rotate-certificates=true --cert-dir=/var/lib/kubelet/pki"
Environment="KUBELET_EXTRA_ARGS=--fail-swap-on=false"
ExecStart=
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_SYSTEM_PODS_ARGS $KUBELET_NETWORK_ARGS $KUBELET_DNS_ARGS $KUBELET_AUTHZ$

kubeadmμ—μ„œ μŠ€μ™‘μ„ ν™œμ„±ν™”ν•˜λŠ” 것이 μ§€κΈˆλ³΄λ‹€ 더 μ‰¬μ›Œμ§€λ©΄ 쒋을 κ²ƒμž…λ‹ˆλ‹€. μ΄λ ‡κ²Œ ν•˜λ©΄ μ „ 세계 μ‚¬λžŒλ“€μ΄ λͺ‡ μ‹œκ°„μ„ μ ˆμ•½ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 1.8둜 μ—…κ·Έλ ˆμ΄λ“œν•œ ν›„ λ―Έλ‹ˆ ν΄λŸ¬μŠ€ν„°λ₯Ό μž‘λ™μ‹œν‚€λŠ” 것은 정말 νž˜λ“  μΌμ΄μ—ˆμŠ΅λ‹ˆλ‹€. μ œκ°€ Linux 관리에 λŒ€ν•œ κ²½ν—˜μ΄ 거의 μ—†κ³  λ‹€λ₯Έ μ‚¬λžŒλ“€λ„ 같은 길을 가지 μ•Šμ•„λ„ λœλ‹€λ©΄ 쒋을 거라고 μƒκ°ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. 이상적인 μ†”λ£¨μ…˜μ€ λ‹€μŒ IMO와 κ°™μŠ΅λ‹ˆλ‹€.

echo "
kind: MasterConfiguration
apiVersion: kubeadm.k8s.io/v1alpha1
kubeletConfiguration:
  allowSwap: true
" > /tmp/config.yaml

kubeadm init --config /tmp/config.yaml

λ¬Όλ‘  μŠ€μ™‘μ„ ν™œμ„±ν™”ν•˜λŠ” 것은 λ§Žμ€ μƒν™©μ—μ„œ λ¬Έμ œκ°€ 될 수 있기 λ•Œλ¬Έμ— 극단적인 경우둜 남아 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ kubeadm μ‚¬μš©μžμ—κ²Œ μ„ νƒκΆŒμ΄ μžˆλ‹€λ©΄ 쒋을 κ²ƒμž…λ‹ˆλ‹€. κ·Έλ•ŒκΉŒμ§€λŠ” μŠ€μ™‘ ν™œμ„±ν™”μ— λŒ€ν•œ μ—΄λ¦° λ¬Έμ œκ°€ μžˆμ—ˆλ‹€λ©΄ μ’‹μ•˜μ„ κ²ƒμž…λ‹ˆλ‹€.

kubelet.service.d의 kubeadm λ“œλ‘­μΈμ— μΆ”κ°€ν•˜κ³  λΉ„ν–‰ μ „ 검사λ₯Ό λΉ„ν™œμ„±ν™”ν•˜λŠ” μŠ€μ™‘μ„ ν™œμ„±ν™”ν•˜λŠ” μ‹€ν—˜μ /μ•ŒνŒŒ/기타 "κΈ°λŠ₯" ν”Œλž˜κ·Έμ— λŒ€ν•œ μ˜΅μ…˜μ΄ μžˆλŠ” 경우 +1μž…λ‹ˆλ‹€. λ¬Όλ‘  극단적인 κ²½μš°λŠ” λ™μ˜ν•˜μ§€λ§Œ 더 쉬웠닀면 μ’‹μ•˜μ„ κ²ƒμž…λ‹ˆλ‹€.

(인터넷 κ²€μƒ‰ν•˜μ—¬ 이 문제λ₯Ό λΉ λ₯΄κ²Œ 찾을 수 있으면 λ§Žμ€ 도움이 λ©λ‹ˆλ‹€.)

λ‚΄ μŠ€μ™‘μ„ κ»μ§€λ§Œ μ—¬μ „νžˆ 이 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

기둝을 μœ„ν•΄ 적어도 μš°λΆ„νˆ¬ 기반 μ‹œμŠ€ν…œμ—μ„œλŠ” _--fail-swap-on=false_ ν”Œλž˜κ·Έλ₯Ό μΆ”κ°€ν•  μœ„μΉ˜κ°€ _/etc/default/kubelet_ νŒŒμΌμ— μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. _systemd_ conf 파일 μžμ²΄μ—λŠ” μ—†μŠ΅λ‹ˆλ‹€.

기둝을 μœ„ν•΄ μ΅œμ†Œν•œ μš°λΆ„νˆ¬ 기반 μ‹œμŠ€ν…œμ—μ„œλŠ” --fail-swap-on=false ν”Œλž˜κ·Έλ₯Ό μΆ”κ°€ν•  μœ„μΉ˜κ°€ /etc/default/kubelet νŒŒμΌμ— μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. systemd conf 파일 μžμ²΄μ—λŠ” μ—†μŠ΅λ‹ˆλ‹€.

1.11+의 경우 이것은 μ‚¬μ‹€μž…λ‹ˆλ‹€.

영ꡬ적으둜 λΉ„ν™œμ„±ν™”ν•˜λ €λ©΄ sudo crontab -e 의 끝에 쀄 λ°”κΏˆμ„ μ‚¬μš©ν•˜μ—¬ <strong i="5">@reboot</strong> /sbin/swapoff -a λ₯Ό μ‚½μž…ν•˜μ‹­μ‹œμ˜€.

Ubuntu 16.04 및 18.04μ—μ„œ ν…ŒμŠ€νŠΈλ˜μ—ˆμŠ΅λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰