๐ฅธ ๋ค์ด๊ฐ๊ธฐ ์ ์
๋ชจ๋ ๋ฌธ์ ๋ฅผ ์๋ฒฝํ ๋ณต๊ธฐํ ์ ์์ผ๋ฏ๋ก ๋๋ต์ ์ธ ๋ด์ฉ์ ์ ๋ฆฌํฉ๋๋ค.
์๋ง ๋ฌธ์ ๋ฅผ ์ฝ๊ณ ๋๋ต์ ์ผ๋ก ์ด๋ป๊ฒ ์ ๊ทผํ๋ฉด ํ ์ ์๊ฒ ๋ค ์ถ์ผ๋ฉด ํ ์ ์๋ ๊ฒ๋๋ค.
์ํ ์ ์ฑ ์ด ํฌ๊ฒ ๋ฐ๋์ง ์๋ ํ ์ด๋ ต๊ฒ ๊ผฌ์๋ฒ๋ฆฌ๋ ๋ฌธ์ ๋ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋ฌธ์ ํ ๋น์ ์ ์ ์ ๊ทผ๋ฒ๋ ํจ๊ป ์ ๋ฆฌํด ๋์์ผ๋ ์ฐธ๊ณ ํ๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.(์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ์ด ์๋ ์ ์์ต๋๋ค.)
๋ฌธ์ ์์์๋ ๊ด๊ณ ์์ผ๋ฉฐ ๊ธฐ์ต์ ๋จ์ ๋ฌธ์ ๋ง ์ ๋ฆฌํ์์ต๋๋ค.
17๋ฌธ์ ์ค์ ์ ๋ฐ ์ ๋๋ kodekloud์ ๋ฌธ์ ๋ฅผ ๋ค ํ ์ ์๋ค๋ฉด ์ฝ๋ค๊ณ ๋๋ ์์ค์ ๋ฌธ์ ์ ๋๋ค.
1. Ingress ๋ง๋ค๊ธฐ
1. ping์ด๋ผ๋ ingress๋ฅผ ๋ง๋๋๋ฐ namespace๋ Ing-intenal์ด๋ฉฐ
/hello ์๋ํฌ์ธํธ๋ก ์์ฒญ์ด ๋ค์ด์ค๋ฉด hello ์๋น์ค 5678 ํฌํธ๋ก ๋ผ์ฐํ ํด๋ผ.
curl -kL {internal-ip}/hello๋ก ํ ์คํธ ๊ฐ๋ฅํ๋ฉฐ ์ฑ๊ณต ์ hello๊ฐ ์ถ๋ ฅ๋๋ค.
๊ด๋ จ ๊ณต์ ๋ฌธ์
https://kubernetes.io/docs/concepts/services-networking/ingress/#the-ingress-resource
๋๋ต์ ์ธ ํ์ด
# yaml ํ์ผ ์์ฑ
vi xx.yaml
# ๊ฐ ์
๋ ฅ
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ping <- ์ด๋ฆ
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- http:
paths:
- path: /hello <- ์๋ํฌ์ธํธ
pathType: Prefix
backend:
service:
name: hello <- ์๋น์ค๋ช
port:
number: 5678 <- ํฌํธ
# yaml ์คํ
k apply -f xx.yaml
# curl ๋ช
๋ น์ด๋ฅผ ์ํ ๋
ธ๋ internal-ip ์กฐํ
k get node -o wide
# ๋์จ ๋
ธ๋์ <internal-ip>๋ก ๋ช
๋ น์ด ์
๋ ฅ
curl -kL <internal-ip>/hello
- curl -kL์ ๋ณด์ ์ธ์ฆ์ ๊ฒ์ฆ์ ๋ฌด์ํ๋ฉด์ ๋ฆฌ๋๋ ์ ์ ๋ฐ๋ผ ์ต์ข ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ช ๋ น์ ๋๋ค
- ์ ์ ๊ฒฝ์ฐ node๊ฐ 3๊ฐ ์์์ต๋๋ค.
- ์๋ฌด ์๊ฐ ์์ด ์์ปค ๋ ธ๋ ๋ ๊ฐ์ internal ip๋ฅผ ๋์ ํ์ฌ ํ ์คํธํ๋ค๊ฐ ํ ๊ณณ์์ hello ์ถ๋ ฅ์ด ๋์์ ๋๊ฒผ์ผ๋, ์ง๊ธ ์๊ฐํด ๋ณด๋ฉด ingress controller pod๊ฐ ์คํ๋๊ณ ์๋ ๋ ธ๋์ internal-ip๋ก ํ๋ ๊ฒ์ด ๋ง์ง ์๋ ์๊ฐ์ด ๋ญ๋๋ค.
2. etcd Backup & Restore
1. master-node์ ๋ค์ด๊ฐ์ sudo -i ๊ถํ์ผ๋ก etcdctl ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค๋ ์ท์ saveํด๋ผ.
2. ๋ฏธ๋ฆฌ ์ง์ ๋ ๊ฒฝ๋ก์ previous-snapshot.db๊ฐ ์๋๋ฐ ์ด๊ฑธ๋ก etcd๋ฅผ restore ํด๋ผ.
๊ด๋ จ ๊ณต์ ๋ฌธ์
๋๋ต์ ์ธ ํ์ด
# ๋ง์คํฐ ๋
ธ๋ ์ ์
ssh master-node(์์)
# ๋ฃจํธ ๊ถํ ํ๋
sudo -i
# ๋ช
๋ น์ด๋ก ์ต์
ํ์ธ
ETCDCTL_API=3 etcdctl -h
# snapshot save(ํด๋น ๊ฒฝ๋ก๋ ๋ฌธ์ ์์ ์ฃผ์ด์ง)
ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \
--cacert=<trusted-ca-file> --cert=<cert-file> --key=<key-file> \
snapshot save <backup-file-location>
# snapshot restore(--data-dir ๊ฒฝ๋ก๋ ์๋ก ๋ง๋ฌ, previous-snapshot.db ๊ฒฝ๋ก๋ ๋ฌธ์ ์์ ์ฃผ์ด์ง)
ETCDCTL_API=3 etcdctl --data-dir /var/lib/etcd-backup snapshot restore <previous-snapshot.db>
# etcd.yaml ํธ์ง ๋ค์ด๊ฐ๊ธฐ
vi /etc/kubernetes/manifests/etcd.yaml
# etcd.yaml ์์
spec:
containers:
- command:
- etcd
- --data-dir=/var/lib/etcd-backup <- ์์
...
volumeMounts:
- mountPath: /var/lib/etcd-backup <- ์์
name: etcd-data
- mountPath: /etc/kubernetes/pki/etcd
name: etcd-certs
readOnly: true
hostNetwork: true
priorityClassName: system-cluster-critical
volumes:
- hostPath:
path: /var/lib/etcd-backup <- ์์
type: DirectoryOrCreate
name: etcd-data
...
- ์ฃผ์ด์ง ๊ฒฝ๋ก์ snapshot save๋ฅผ ํฉ๋๋ค.
- ๊ทธ๋ฆฌ๊ณ ๋ฏธ๋ฆฌ ์ ์ฅ๋์ด ์๋ Previous-snapshot์ restore ํฉ๋๋ค.
- /etc/kubernetes/manifests ๊ฒฝ๋ก์ etcd.yaml ํ์ผ์ ๋ค์ด๊ฐ ํ์ผ์ ์์ ํ์๋๋ฐ Pending์ด ๋ด๊ณ ํด๊ฒฐํ์ง ๋ชปํ ์ฑ ์ํ์ด ๋๋ฌ์ต๋๋ค.(์ ์ผํ๊ฒ ๋ชป ํผ ๋ฌธ์ ใ )
- kodeloud์์๋ ์์ ๊ฐ์ด ํ์์ ๋ ํญ์ ๋ง์๋๋ฐ ์ Pending์ธ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.(ํน์ ์์๋ฉด ๋๊ธ๋ก ์๋ ค์ฃผ์ธ์ ใ )
3. TroubleShooting
worker node๊ฐ NotReady ์ํ์ด๋ค. ์ด๋ฅผ Ready ์ํ๋ก ๋ง๋ค์ด๋ผ.
๋๋ต์ ์ธ ํ์ด
# ๋ฌธ์ ๊ฐ ์๋ ๋
ธ๋ ํ์ธ
k get node
# ํด๋น ๋
ธ๋๋ก ssh ์ ์
ssh worker-node
# ๋ฃจํธ ๊ถํ ์ค์
sudo -i
# kubelet ์ํ ํ์ธ(์ ์ ๊ฒฝ์ฐ incative์์ต๋๋ค.)
systemctl status kubelet
(inactive)
# kubelet restart
systemctl restart kubelet
# kubelet ์ํ ์ฌํ์ธ
systemctl status kubelet
(active)
# ๋ง์คํฐ๋
ธ๋๋ก ๋์์ค๊ธฐ
exit
# ๋
ธ๋ ์ฌํ์ธ(Ready๋ก ๋ณ๊ฒฝ)
k get node
- ์ฌ์ด ๋ฌธ์ ์ ๋๋ค. ๋ง์ฝ active ์ํ์ธ๋ฐ NotReady์ธ ๊ฒฝ์ฐ kodekloud์์ ๋์จ ๋ค๋ฅธ ์ ํ ์ ๋ ์์ค ์๋๊น ์ถ๋ค์. ์ฌ๋ฌ ๋ฒ ๋ฐ๋ณตํ๋ฉด ๋ฌธ์ ์์ด ํ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค.
- journal -u kubelet | grep -i error <- ์ด ๋ช ๋ น์ด๋ก kubelet ๋์ ์์ ๋ก๊ทธ ์ค error๋ง ์ถ์ถํ์ฌ ์ด๋ค ๋ฌธ์ ์ธ์ง ํ์ธํ ์ ์์ต๋๋ค.
4. ๋ง์คํฐ ๋ ธ๋ kubeadm, kubelet, kubectl ์ ๊ทธ๋ ์ด๋
๋ง์คํฐ ๋ ธ๋๋ฅผ 1.30.0์์ 1.30.1๋ก ์ ๊ทธ๋ ์ด๋ํ๋ผ.
์์ปค๋ ธ๋๋ ์ ๊ทธ๋ ์ด๋ํ์ง ๋ง๊ณ ๋ง์คํฐ ๋ ธ๋๋ง ์ ๊ทธ๋ ์ด๋ํ๋ผ.
๊ด๋ จ ๊ณต์ ๋ฌธ์
https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/
๋๋ต์ ์ธ ํ์ด
- ์ ๊ณต์๋ฌธ์๋ฅผ ๋ณด๋ฉฐ ๊ทธ๋๋ก ๋ง์คํฐ ๋ ธ๋๋ง ์ ๊ทธ๋ ์ด๋ํ๋ฉด ๋ฉ๋๋ค.
- linux ํ๊ฒฝ์์ ๊ณต์๋ฌธ์์ ๋์จ ๋ช ๋ น์ด๋ฅผ ๋ณต์ฌํ์ฌ ๋ถ์ฌ ๋ฃ๊ณ ์คํํ ๋ 3์ค ์ ๋์ '&&'๋ก ๊ฒฐํฉ๋ ๋ช ๋ น์ด๋ ์ ๋๋ก ์ ๋จน๋ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค.
- ๊ทธ๋์ ๋ช ๋ น์ด๋ฅผ ์ ๋ถ ๋๋ ์ ์ฒ๋ฆฌํ์ต๋๋ค. ์ด ๋ถ๋ถ๋ง ์ ๊ฒฝ ์ฐ๋ฉด ๋ ๋ฏํ๋ค์.
- kodekloud์ ๋ฌธ์ ์ ํ๊ณผ ๋๊ฐ์ผ๋ฏ๋ก ์ด๋ ต์ง ์๊ฒ ํ ์ ์์์ต๋๋ค.
5. Pod Log
ํน์ ํ๋ log์์ Error ๋ฉ์์ง๋ง ์ฃผ์ด์ง ๊ฒฝ๋ก์ ํ์ผ์ ์ ์ฅํ๋ผ.
# logs๋ ํน์ ํ๋์ ๋ก๊ทธ๋ฅผ ์กฐํํ๋ ๋ช
๋ น์ด์ด๋ฉฐ, -i๋ ๋์๋ฌธ์ ๊ตฌ๋ถ์ ํ์ง ์๋ ์ต์
k logs <pod-name> | grep -i error > /๋ฌธ์ ์์/์ฃผ์ด์ง/๊ฒฝ๋ก
6. side car multi container
๊ธฐ์กด ํ๋๊ฐ ๊ธฐ๋กํ๋ log ํ์ผ์ ์ ๊ทผ ๊ฐ๋ฅํ sidecar container๋ฅผ ์ถ๊ฐํ์ฌ sidecar๋ก ๋ก๊ทธ๋ฅผ ํ์ธํ๊ณ ์ฃผ์ด์ง ๊ฒฝ๋ก์ ๋ก๊ทธ๋ฅผ ์ ์ฅํ๋ผ.(์ ์ฅํ๋ผ๊ณ ๊น์ง ํ๋์ง ์ ํํ ๊ธฐ์ต์ด ์ ๋จ)
๊ด๋ จ ๊ณต์ ๋ฌธ์
๋๋ต์ ์ธ ํ์ด
# ๊ณต์ ๋ฌธ์์ ์์
apiVersion: v1
kind: Pod
metadata:
name: counter
spec:
containers:
- name: count
image: busybox:1.28
args:
- /bin/sh
- -c
- >
i=0;
while true;
do
echo "$i: $(date)" >> /var/log/1.log;
echo "$(date) INFO $i" >> /var/log/2.log;
i=$((i+1));
sleep 1;
done
volumeMounts:
- name: varlog
mountPath: /var/log
volumes:
- name: varlog
emptyDir: {}
# ๊ณต์ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์ฌ sidecar container ์ถ๊ฐ
apiVersion: v1
kind: Pod
metadata:
name: counter
spec:
containers:
- name: count
image: busybox:1.28
args:
- /bin/sh
- -c
- >
i=0;
while true;
do
echo "$i: $(date)" >> /var/log/1.log;
echo "$(date) INFO $i" >> /var/log/2.log;
i=$((i+1));
sleep 1;
done
volumeMounts:
- name: varlog
mountPath: /var/log
####################################################### ์ถ๊ฐ, ๋ฌธ์ ์ ์ฃผ์ด์ง ์กฐ๊ฑด์ผ๋ก ๋ณ๊ฒฝ
- name: count-log-1
image: busybox:1.28
args: [/bin/sh, -c, 'tail -n+1 -F /var/log/1.log']
volumeMounts:
- name: varlog
mountPath: /var/log
#######################################################
volumes:
- name: varlog
emptyDir: {}
# ๊ธฐ์กด ํ๋ ์ญ์
k delete po <pod-name> --force
# sidecar ์ถ๊ฐํ yamlํ์ผ๋ก ํ๋ ์์ฑ
k apply -f /๊ฒฝ๋ก/sidecar.yaml
# sidecar ์ปจํ
์ด๋๋ก ์ ๊ทผํ์ฌ /var/log์ ๊ธฐ์กด ์ปจํ
์ด๋์ ๋ก๊ทธ๊ฐ ์ ์ฅ๋์ด์๋์ง ํ์ธ
k exec -it <pod-name> -c <container-name> -- /bin/bash
# ์ปจํ
์ด๋ ๋ด์์ ๋ก๊ทธ ๋ณต์ฌ
tail -f /var/log/xxx.log # ๋ก๊ทธ ํ์ผ ๋ค์ด๊ฐ ๋ก๊ทธ ๋ณต์ฌ ํ
# ํ๋์์ ๋น ์ ธ ๋์ ์ฃผ์ด์ง ๊ฒฝ๋ก์ vi ์์ ๋ชจ๋๋ก ๋ณต์ฌ ๋ถ์ฌ๋ฃ๊ธฐ
- ์ํ์ด ๋๋๊ณ ์๊ฐํด ๋ณด๋ k log <pod-name> <container-name>์ ์ ๋ ฅํ๋ฉด ๋๋ ๋ฌธ์ ์๋ค์.
- k log <pod-name> <container-name> > /๋ฌธ์ ์์/์ฃผ์ด์ง/๊ฒฝ๋ก <- ์ด๋ ๊ฒ ํ๋ฉด ๋ ๊ฒ ๊ฐ์ต๋๋ค.
7. ์ฃผ์ด์ง ์กฐ๊ฑด์ Node ๊ฐ์ ์ฐพ๊ธฐ
ready ์ํ์ธ node ์ค์ taint๊ฐ ์๋ node์ ๊ฐ์๋ฅผ ๊ตฌํ์ฌ ์ฃผ์ด์ง ๊ฒฝ๋ก์ ํ์ผ์ ์ ์ฅํ๋ผ
๊ด๋ จ ๊ณต์ ๋ฌธ์
https://kubernetes.io/docs/reference/kubectl/quick-reference/#viewing-and-finding-resources
๋๋ต์ ์ธ ํ์ด
# kubectl Quick Reference ์ฐธ๊ณ , Ready ์ํ์ ๋
ธ๋ ๊ฐ์ ํ์ธ -> ๋ชจ๋ ๋
ธ๋ Ready์์
# Check which nodes are ready with custom-columns
kubectl get node -o custom-columns='NODE_NAME:.metadata.name,STATUS:.status.conditions[?(@.type=="Ready")].status'
# Ready๋ฉด์ taint๊ฐ ์๋ ๋
ธ๋ ๊ฐ์ ํ์ธ
k describe node | grep -i taint
# ๋ชจ๋ ๋
ธ๋ ๊ฐ์์์ taint : <None>์ธ ๋
ธ๋ ๊ฐ์ ์ฐพ๊ธฐ -> 2๊ฐ ์์
# ์ฃผ์ด์ง ๊ฒฝ๋ก ์ ์ฅ
echo "2" > /๋ฌธ์ ์์/์ฃผ์ด์ง/๊ฒฝ๋ก
- quick-reference๋ ๋์ธ ๋ฒ ํ๊ณ ์ด๋ค ๋ด์ฉ์ด ์๋์ง ์์งํ๋ ๊ฒ์ ๊ถ์ฅ๋๋ฆฝ๋๋ค.
8. ์ฃผ์ด์ง ์กฐ๊ฑด์ Pod ์ด๋ฆ ์ฐพ๊ธฐ
ํน์ namespace์์ <key>:<value> label์ ๊ฐ์ง Pod ์ค CPU ์ฌ์ฉ๋ฅ ์ด ๊ฐ์ฅ ๋์ pod์ ์ด๋ฆ์ ์ฃผ์ด์ง ๊ฒฝ๋ก์ ํ์ผ์ ์ ์ฅํ๋ผ
๊ด๋ จ ๊ณต์ ๋ฌธ์
https://kubernetes.io/docs/reference/kubectl/quick-reference/#interacting-with-running-pods
๋๋ต์ ์ธ ํ์ด
// top ๋ช
๋ น์ด์ --sort-by ์ต์
ํ์ฉ
k top po -n <name-space> -l <key>:<value> --sort-by=cpu
// echo "<pod-name>" > /๋ฌธ์ ์์/์ฃผ์ด์ง/๊ฒฝ๋ก/
- ์ด ๋ฌธ์ ์ญ์ quick-reference์์ ๋ดค๋ค๋ฉด ์ฝ๊ฒ ํ ์ ์๋ ๋ฌธ์ ์์ต๋๋ค.
9. NetworkPolicy
NetworkPolicy๋ฅผ ์์ฑํ์ฌ ํน์ namspace์ Pod์ ์์ฒญ๋ง ์ ํด์ง ํฌํธ๋ฅผ ํตํด ๋ค์ด์ฌ ์ ์๋๋ก ํ๋ผ.(ingress)
๊ด๋ จ ๊ณต์ ๋ฌธ์
https://kubernetes.io/docs/concepts/services-networking/network-policies/#networkpolicy-resource
๋๋ต์ ์ธ ํ์ด
# ๊ณต์๋ฌธ์์์ ๊ฐ์ ธ์จ ์์
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy -> ๋ฌธ์ ์์ ์ฃผ์ด์ง๋๋ก ์์
namespace: default -> ๋ฌธ์ ์์ ์ฃผ์ด์ง๋๋ก ์์
spec:
podSelector:
matchLabels:
role: db -> ๋ฌธ์ ์์ ์ฃผ์ด์ง๋๋ก ์์
policyTypes:
- Ingress
- Egress
ingress:
- from:
- namespaceSelector:
matchLabels:
project: myproject -> ๋ฌธ์ ์์ ์ฃผ์ด์ง๋๋ก ์์
- podSelector:
matchLabels:
role: frontend -> ๋ฌธ์ ์์ ์ฃผ์ด์ง๋๋ก ์์
ports:
- protocol: TCP
port: 6379 -> ๋ฌธ์ ์์ ์ฃผ์ด์ง๋๋ก ์์
- networkpolicy ๋ฆฌ์์ค์ ๋ํด ์ ์ดํดํ๊ณ ์๋ค๋ฉด ์ด๋ ต์ง ์๊ฒ ํ ์ ์๋ ๋ฌธ์ ์์ต๋๋ค.