Kubeadm: 1.10으둜 Kubeadm μ—…λ°μ΄νŠΈκ°€ ha k8s / etcd ν΄λŸ¬μŠ€ν„°μ—μ„œ μ‹€νŒ¨ 함

에 λ§Œλ“  2018λ…„ 05μ›” 20일  Β·  13μ½”λ©˜νŠΈ  Β·  좜처: kubernetes/kubeadm

버그 λ³΄κ³ μ„œ

버전

kubeadm 버전 : 1.10.2

ν™˜κ²½ :

  • Kubernetes 버전 : 1.9.3
  • ν΄λΌμš°λ“œ κ³΅κΈ‰μž λ˜λŠ” ν•˜λ“œμ›¨μ–΄ ꡬ성 : 3 x k8s λ§ˆμŠ€ν„° HA
  • 운영체제 : RHEL7
  • 컀널 : 3.10.0-693.11.6.el7.x86_64

μ–΄λ–»κ²Œ 된 κ±°μ˜ˆμš”?

λͺ‡ 달 전에 μ €λŠ” '곡식'λ¬Έμ„œ https://kubernetes.io/docs/setup/independent/high-availability/에 따라 kubeadm 1.9.3 μ‚¬μš©ν•˜μ—¬ kubernetes 1.9.3 HA ν΄λŸ¬μŠ€ν„°λ₯Ό λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€. etcd 정적 ν¬λ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ λ§ˆμŠ€ν„° λ…Έλ“œμ—μ„œ ν˜ΈμŠ€νŒ…ν•˜λŠ” HA ν΄λŸ¬μŠ€ν„°

μ΅œμ‹  kubeadm μ‚¬μš©ν•˜μ—¬ ν΄λŸ¬μŠ€ν„°λ₯Ό k8s 1.10.2 둜 μ—…κ·Έλ ˆμ΄λ“œν•˜κ³  μ‹Άμ—ˆμŠ΅λ‹ˆλ‹€. kubeadm 을 μ—…λ°μ΄νŠΈ ν•œ ν›„ kubeadm upgrade plan μ‹€ν–‰ν•  λ•Œ λ‹€μŒ 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.

[root@shared-cob-01 tmp]# kubeadm upgrade plan
[preflight] Running pre-flight checks.
[upgrade] Making sure the cluster is healthy:
[upgrade/config] Making sure the configuration is correct:
[upgrade/config] Reading configuration from the cluster...
[upgrade/config] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -oyaml'
[upgrade/plan] computing upgrade possibilities
[upgrade] Fetching available versions to upgrade to
[upgrade/versions] Cluster version: v1.9.3
[upgrade/versions] kubeadm version: v1.10.2
[upgrade/versions] Latest stable version: v1.10.2
[upgrade/versions] FATAL: context deadline exceeded

문제λ₯Ό μ‘°μ‚¬ν•œ κ²°κ³Ό 두 가지 κ·Όλ³Έ 원인을 μ°Ύμ•˜μŠ΅λ‹ˆλ‹€.

1) kubeadm λŠ” etcd ν΄λŸ¬μŠ€ν„°λ₯Ό TLS ν™œμ„±ν™”λ‘œ μ‹λ³„ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

κ°€μ΄λ“œλŠ” etcd 정적 ν¬λ“œμ—μ„œ λ‹€μŒ λͺ…령을 μ‚¬μš©ν•˜λ„λ‘ μ§€μ‹œν•©λ‹ˆλ‹€.

- etcd --name <name> \
  - --data-dir /var/lib/etcd \
  - --listen-client-urls http://localhost:2379 \
  - --advertise-client-urls http://localhost:2379 \
  - --listen-peer-urls http://localhost:2380 \
  - --initial-advertise-peer-urls http://localhost:2380 \
  - --cert-file=/certs/server.pem \
  - --key-file=/certs/server-key.pem \
  - --client-cert-auth \
  - --trusted-ca-file=/certs/ca.pem \
  - --peer-cert-file=/certs/peer.pem \
  - --peer-key-file=/certs/peer-key.pem \
  - --peer-client-cert-auth \
  - --peer-trusted-ca-file=/certs/ca.pem \
  - --initial-cluster etcd0=https://<etcd0-ip-address>:2380,etcd1=https://<etcd1-ip-address>:2380,etcd2=https://<etcd2-ip-address>:2380 \
  - --initial-cluster-token my-etcd-token \
  - --initial-cluster-state new

kubeadm >= 1.10 검사 (μ—¬κΈ° : https://github.com/kubernetes/kubernetes/blob/release-1.10/cmd/kubeadm/app/util/etcd/etcd.go#L56) if etcd λŠ” 정적 pod λͺ…령어에 λ‹€μŒ ν”Œλž˜κ·Έκ°€ μžˆλŠ”μ§€ ν™•μΈν•˜μ—¬ TLSλ₯Ό ν™œμ„±ν™”ν•©λ‹ˆλ‹€.

"--cert-file=",
"--key-file=",
"--trusted-ca-file=",
"--client-cert-auth=",
"--peer-cert-file=",
"--peer-key-file=",
"--peer-trusted-ca-file=",
"--peer-client-cert-auth=",

κ·ΈλŸ¬λ‚˜ --client-cert-auth 및 --peer-client-cert-auth ν”Œλž˜κ·Έκ°€ 맀개 λ³€μˆ˜μ—†μ΄ 지침에 μ‚¬μš©λ˜μ—ˆμœΌλ―€λ‘œ (λΆ€μšΈ) kubeadm λŠ” etcd ν΄λŸ¬μŠ€ν„°κ°€ TLSλ₯Ό κ°–λŠ” 것을 μΈμ‹ν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€. ν™œμ„±ν™”λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

개인 μˆ˜μ • :
- --client-cert-auth=true 및 - --peer-client-cert-auth=true λ₯Ό μ‚¬μš©ν•˜λ„λ‘ etcd static pod λͺ…령을 μ—…λ°μ΄νŠΈν–ˆμŠ΅λ‹ˆλ‹€.

일반 μˆ˜μ • :
--client-cert-auth=true 및 --peer-client-cert-auth=true λ₯Ό μ‚¬μš©ν•˜λ„λ‘ 지침을 μ—…λ°μ΄νŠΈν•˜κ³  "--peer-cert-file" 및 "--peer-key-file" (λ“±ν˜Έ μ œμ™Έ)λ₯Ό μ‚¬μš©ν•˜μ—¬ kubeadm 검사λ₯Ό μ™„ν™”ν•©λ‹ˆλ‹€.

2) kubeadm μ—μ„œ μ˜¬λ°”λ₯Έ μΈμ¦μ„œλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

포인트 1을 μˆ˜μ • ν•œ 후에도 kubeadm μ—μ„œ μ˜¬λ°”λ₯Έ μΈμ¦μ„œλ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— λ¬Έμ œκ°€ 계속 λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.
kubeadm HA κ°€μ΄λ“œλ₯Ό λ”°λ₯΄λ©΄ μ‹€μ œλ‘œ 생성 된 μΈμ¦μ„œλŠ” ca.pem ca-key.pem peer.pem peer-key.pem client.pem client-key.pem ν•˜μ§€λ§Œ μ΅œμ‹  kubeadm ca.crt ca.key``peer.crt peer.key``healthcheck-client.crt healthcheck-client.key ν•©λ‹ˆλ‹€.
kubeadm-config MasterConfiguration ν‚€ etcd.caFile , etcd.certFile 및 etcd.keyFile 은 λ¬΄μ‹œλ©λ‹ˆλ‹€.

개인 μˆ˜μ • :
.pem μΈμ¦μ„œμ˜ 이름을 .crt 및 .key μƒμ‘ν•˜λŠ” κ²ƒμœΌλ‘œ λ³€κ²½ν•˜κ³ μ΄λ₯Ό μ‚¬μš©ν•˜λ„λ‘ etcd 정적 ν¬λ“œ ꡬ성을 μ—…λ°μ΄νŠΈν–ˆμŠ΅λ‹ˆλ‹€.

일반 μˆ˜μ • :
kubeadm-config data.caFile , data.certFile 및 data.keyFile 값을 μ‚¬μš©ν•˜κ³  etcd 정적 ν¬λ“œ μ •μ˜ (ν¬λ“œ 경둜 + λ³Όλ₯¨ hostPath)μ—μ„œ μ˜¬λ°”λ₯Έ μΈμ¦μ„œλ₯Ό μœ μΆ”ν•˜κ±°λ‚˜ μƒμ„±ν•©λ‹ˆλ‹€. μ—…κ·Έλ ˆμ΄λ“œ 쀑에 μ‚¬μš©ν•  μƒˆ μž„μ‹œ ν΄λΌμ΄μ–ΈνŠΈ μΈμ¦μ„œ.

무슨 일이 μΌμ–΄λ‚˜κΈ°λ₯Ό κΈ°λŒ€ ν–ˆμŠ΅λ‹ˆκΉŒ?

μ—…κ·Έλ ˆμ΄λ“œ κ³„νšμ΄ μ˜¬λ°”λ₯΄κ²Œ μ‹€ν–‰λ˜μ–΄μ•Όν•©λ‹ˆλ‹€.

그것을 μž¬ν˜„ν•˜λŠ” 방법 (κ°€λŠ₯ν•œ ν•œ μ΅œμ†Œν•œμœΌλ‘œ μ •ν™•ν•˜κ²Œ)?

https://kubernetes.io/docs/setup/independent/high-availability/에 따라 kubeadm 1.9.3 μ‚¬μš©ν•˜μ—¬ k8s ha ν΄λŸ¬μŠ€ν„°λ₯Ό λ§Œλ“€κ³  μ΅œμ‹  kubeadm μ‚¬μš©ν•˜μ—¬ k8s >= 1.10 둜 μ—…λ°μ΄νŠΈ ν•΄λ³΄μ‹­μ‹œμ˜€. kubeadm

areHA areUX areupgrades documentatioimprovement kinbug prioritimportant-soon

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

이 λ¬Έμ œλŠ” kubeadm 1.10.3 μ—μ„œ μˆ˜μ • 된 κ²ƒμœΌλ‘œ λ³΄μ΄μ§€λ§Œ 정적 etcd ν¬λ“œκ°€ 'μ™ΈλΆ€'둜 μΈμ‹λ˜κΈ° λ•Œλ¬Έμ— μžλ™μœΌλ‘œ μ—…λ°μ΄νŠΈλ˜μ§€λŠ” μ•ŠμŠ΅λ‹ˆλ‹€.

kubeadm 1.10.3 ν•˜κ³  있으며 λ™μΌν•œ λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. λ‚΄ ν΄λŸ¬μŠ€ν„°λŠ” μ™ΈλΆ€ λ³΄μ•ˆ etcdκ°€μžˆλŠ” 1.10.2μž…λ‹ˆλ‹€.

@brokenmass 두 번째 원인에 λŒ€ν•œ 보 μž…λ‹ˆκΉŒ?

  caFile: /etc/kubernetes/pki/etcd/ca.crt
  certFile: /etc/kubernetes/pki/etcd/healthcheck-client.crt
  keyFile: /etc/kubernetes/pki/etcd/healthcheck-client.key

@detiber 제발 도와 μ£Όμ‹œκ² μŠ΅λ‹ˆκΉŒ?

λΏ‘λΏ‘
제 κ²½μš°μ—λŠ” 값이 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  caFile: /etc/kubernetes/pki/etcd/ca.pem
  certFile: /etc/kubernetes/pki/etcd/client.pem
  keyFile: /etc/kubernetes/pki/etcd/client-key.pem

1.10.3이 μ˜¬λ°”λ₯΄κ²Œ μž‘λ™ν•©λ‹ˆλ‹€.

@brokenmass λ”°λΌμ„œ kubeadm 1.10.3을 μ‚¬μš©ν•˜λ©΄ 개인 정보λ₯Ό μˆ˜μ •ν•  ν•„μš”μ—†μ΄ λͺ¨λ“  것이 μž‘λ™ν•©λ‹ˆλ‹€. 이 경우 λ‚˜λŠ” μ•½κ°„ ν˜Όλž€ μŠ€λŸ½μŠ΅λ‹ˆλ‹€. kubeadm 1.10.3이 μžˆμ§€λ§Œμ΄ 버그 λ³΄κ³ μ„œμ—μ„œ μ–ΈκΈ‰ ν•œ 것과 λ™μΌν•œ 였λ₯˜ λ©”μ‹œμ§€κ°€ μžˆμŠ΅λ‹ˆλ‹€. λ‚΄ ꡬ성을 λ‹€μ‹œ ν™•μΈν•˜κ² μŠ΅λ‹ˆλ‹€. λ‹€λ₯Έ κ³³μ—μ„œ μ‹€μˆ˜λ₯Ό ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

kubeadm-config, etcd static pods yml 및 kubeadm upgrade plan 의 전체 좜λ ₯을 여기에 μΆ”κ°€ (λ˜λŠ” kubernetes slack에 κ°€μž…ν•˜κ³  직접 λ©”μ‹œμ§€ 보내기)

μ£„μ†‘ν•©λ‹ˆλ‹€. 방금 이걸보고 μžˆμŠ΅λ‹ˆλ‹€. @chuckha λŠ” static-pod HA etcd λ¬Έμ„œμ— λŒ€ν•œ μ›λž˜ μž‘μ—…μ„ μˆ˜ν–‰ν–ˆμŠ΅λ‹ˆλ‹€. μ•žμœΌλ‘œ λ©°μΉ  λ™μ•ˆ 그와 ν•¨κ»˜ μž‘μ—…ν•˜μ—¬ HA μ—…κ·Έλ ˆμ΄λ“œλ₯Ό λ°”λ‘œ μž‘μ„ 수 μžˆλŠ”μ§€ ν™•μΈν•˜κ² μŠ΅λ‹ˆλ‹€.

@detiber κ°μ‚¬ν•©λ‹ˆλ‹€. μ—…κ·Έλ ˆμ΄λ“œ κ³„νšμ΄ λ§ˆμΉ¨λ‚΄ μž‘λ™ν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ ν΄λŸ¬μŠ€ν„°λ₯Ό μ—…κ·Έλ ˆμ΄λ“œν•˜λ €κ³  ν•  λ•Œ 일뢀 경쟁 쑰건 λ¬Έμ œμ— μ§λ©΄ν•©λ‹ˆλ‹€. λ•Œλ•Œλ‘œ 그것은 λ•Œλ•Œλ‘œ μž‘λ™ν•©λ‹ˆλ‹€. kubernetes / kubeadm / issues / 850 κ³Ό 같은 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€. ν•œ λ…Έλ“œμ—μ„œ ν¬λ“œλ₯Ό λ‹€μ‹œ μ‹œμž‘ν•˜λ €κ³ ν•˜λ©΄ kubeadm이 κ²½ν•© μƒνƒœλ‘œ μ‹€ν–‰λ©λ‹ˆλ‹€.

였늘 이것에 λŒ€ν•œ ν…ŒμŠ€νŠΈ ν™˜κ²½ 섀정을 μ–»λŠ” 데 μ•½κ°„μ˜ 걸림돌이 생겼고 주말이 μ‹œμž‘λ˜κΈ° 전에 μ‹œκ°„μ΄ λΆ€μ‘±ν•©λ‹ˆλ‹€. λ‹€μŒ μ£Ό μ΄ˆμ— λ‹€μ‹œ 연락 λ“œλ¦¬κ² μŠ΅λ‹ˆλ‹€.

/ ν• λ‹Ή @chuckha @detiber

@chuckha @detiber @stealthybox 이것에 λŒ€ν•œ μ—…λ°μ΄νŠΈκ°€ μžˆμŠ΅λ‹ˆκΉŒ?

λ”°λΌμ„œ 1.9-> 1.10 HA μ—…κ·Έλ ˆμ΄λ“œλŠ” μ§€μ›λ˜κ±°λ‚˜ 검증 된 κ²½λ‘œκ°€ μ•„λ‹™λ‹ˆλ‹€.

μš°λ¦¬λŠ” ν˜„μž¬ 1.11-> 1.12에 λŒ€ν•œ μœ μ§€ 관리 λ¬Έμ„œλ₯Ό μ—…λ°μ΄νŠΈν•˜λŠ” 쀑이며 μ•žμœΌλ‘œλ„ 계속 μœ μ§€ν•  κ³„νšμž…λ‹ˆλ‹€.

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