실습
해당 실습은 AWS 환경에서 t3.small 타입의 EC2 인스턴스에 Ubuntu Server 20.04 LTS 에서 실습을 진행하다고 가정하고 작성되었습니다.
Minikube
EC2 인스턴스 1개를 생성하세요.
Docker 설치
sudo apt update && sudo apt install -y docker.io
Docker 권한 설정
sudo usermod -aG docker $USER sudo su - $USER
Minikube 설치
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 sudo install minikube-linux-amd64 /usr/local/bin/minikube
Minikube 실행
minikube start
실행중인 Pod 확인
minikube kubectl -- get pod --all-namespaces
데모 애플리케이션 배포
minikube kubectl -- run nginx --image=nginx
서비스 엔드포인트 생성
minikube kubectl -- expose pod nginx --port=80 --type=NodePort
서비스 엔드포인트 및 포트 확인
minikube service nginx
서비스 엔드포인트로 접속되는지 확인
curl $(minikube service nginx --url)
EC2 인스턴스 삭제
Single Master Cluster
EC2 인스턴스 2개를 생성하세요.
마스터 노드 구성
마스터 노드로 사용할 EC2 인스턴스에 접속
Root 유저로 전환
sudo -i
시스템 구동에 필요한 라이브러리 설치
apt update && apt install -y jq apt-transport-https ca-certificates libseccomp2
CRI-O 구동에 필요한 overlay와 br_netfilter 커널 모듈 불러오기
modprobe overlay modprobe br_netfilter
CRI-O 구동에 필요한 커널 파라미터 설정파일 생성
cat <<EOF> /etc/sysctl.d/99-kubernetes-cri.conf net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 net.bridge.bridge-nf-call-ip6tables = 1 EOF
위에서 생성한 설정파일 반영
sysctl --system
CRI-O 설치
{ echo "deb http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/1.22/xUbuntu_18.04/ /" | sudo tee -a /etc/apt/sources.list.d/cri-0.list curl -L http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/1.22/xUbuntu_18.04/Release.key | sudo apt-key add - echo "deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_18.04/ /" | sudo tee -a /etc/apt/sources.list.d/libcontainers.list apt update && apt install -y cri-o cri-o-runc }
CRI-O CNI 설정 확인
cat /etc/cni/net.d/100-crio-bridge.conf
CRI-O CNI 설정 삭제
rm -rf /etc/cni/net.d
CRI-O 서비스 재기동
{ systemctl daemon-reload systemctl enable crio systemctl restart crio }
쿠버네티스 설치 및 구동에 필요한 바이너리 설치
{ curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list apt update && apt install -y kubelet kubeadm kubectl }
리눅스 호스트네임 설정
hostnamectl set-hostname master-1 && su
컨트롤 플레인(마스터 노드) 구성
kubeadm init
kubeconfig 설정
mkdir -p $HOME/.kube cp -i /etc/kubernetes/admin.conf $HOME/.kube/config chown $(id -u):$(id -g) $HOME/.kube/config
kubeconfig 파일 확인
cat ~/.kube/config
마스터 노드의 사설 IP 확인
hostname -i
노드 목록 확인
kubectl get node
마스터 노드 상태 확인
kubectl describe node master
배포된 Pod 확인
kubectl get pod -A
Pending 상태의 Pod가 있다면 아래의 명령어를 통해서 그 이유를 확인
kubectl -n kube-system describe pod \ $(kubectl get pod -n kube-system -o=jsonpath='{.items[?(@.status.phase=="Pending")].metadata.name}')
CNI 플러그인 설치
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
마스터 노드 상태 확인
kubectl get node -w
배포된 Pod 확인
kubectl get pod -A
정적 Pod 생성 경로에 있는 파일 확인
ls /etc/kubernetes/manifests/
Manifest 파일 생성
kubectl run nginx --image=nginx --dry-run=client -oyaml > nginx.yaml
위에서 생성한 Manifest 파일을 정적 Pod 생성 경로로 복사
mv nginx.yaml /etc/kubernetes/manifests/
새로운 Pod가 생성되었는지 확인
kubectl get po
kubectl 명령어로 위에서 생성한 Pod 삭제
kubectl delete pod nginx-master-1
Pod가 삭제되었는지 확인
kubectl get pod
정적 Pod 생성 경로에 있는 파일 삭제
rm /etc/kubernetes/manifests/nginx.yaml
Pod가 삭제되었는지 확인
kubectl get pod
kubectl 명령어로 새로운 Pod 생성
kubectl run nginx --image=nginx
새로운 Pod가 생성되었는지 확인
kubectl get pod
Pod가 Pending 상태인 이유 확인
kubectl describe pod \ $(kubectl get pod -o=jsonpath='{.items[?(@.status.phase=="Pending")].metadata.name}')
마스터 노드에 부여된 Taint 확인
kubectl get node master-1 -o yaml -o=jsonpath='{.spec.taints}' | jq
워커 노드 구성
워커 노드로 사용할 EC2 인스턴스에 접속
Root 유저로 전환
sudo -i
시스템 구동에 필요한 라이브러리 설치
apt update && apt install -y apt-transport-https ca-certificates libseccomp2
CRI-O 구동에 필요한 overlay와 br_netfilter 커널 모듈 불러오기
modprobe overlay modprobe br_netfilter
CRI-O 구동에 필요한 커널 파라미터 설정파일 생성
cat <<EOF> /etc/sysctl.d/99-kubernetes-cri.conf net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 net.bridge.bridge-nf-call-ip6tables = 1 EOF
위에서 생성한 설정파일 반영
sysctl --system
CRI-O 설치
{ echo "deb http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/1.22/xUbuntu_18.04/ /" | sudo tee -a /etc/apt/sources.list.d/cri-0.list curl -L http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/1.22/xUbuntu_18.04/Release.key | sudo apt-key add - echo "deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_18.04/ /" | sudo tee -a /etc/apt/sources.list.d/libcontainers.list apt update && apt install -y cri-o cri-o-runc }
CRI-O CNI 설정 삭제
rm -rf /etc/cni/net.d
CRI-O 서비스 재기동
{ systemctl daemon-reload systemctl enable crio systemctl restart crio }
쿠버네티스 설치 및 구동에 필요한 바이너리 설치
{ curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list apt update && apt install -y kubelet kubeadm }
리눅스 호스트네임 설정
hostnamectl set-hostname worker-1 && su
마스터 노드에 연결된 터미널로 이동해서 워커 노드 조인 명령어 생성
kubeadm token create --print-join-command --ttl 0
워커 노드에서 위의 명령어를 실행하고 나온 명령어를 실행
클러스터 구성 확인
마스터 노드 SSH 세션으로 이동
노드 상태 확인
kubectl get no
Pending 상태였던 Pod가 배포됐는지 확인
kubectl get po -o wide
Service 생성
kubectl expose pod nginx --port=80 --type=NodePort
서비스 엔드포인트 및 포트 확인
kubectl get svc nginx
웹브라우저에서
ANY_NODE_IP:SERVICE_NODE_PORT
로 접속되는지 확인 - 아래 명령어로 주소 확인 가능echo "$(curl -s ifconfig.io):$(kubectl get svc nginx -o=jsonpath='{.spec.ports[0].nodePort}')"
실습에 사용한 인스턴스들을 삭제하세요.
Multi Master Cluster
EC2 인스턴스 5개를 생성하세요.
HAProxy 구성
로드밸런서로 사용할 EC2 인스턴스에 SSH 접속
리눅스 호스트네임 설정
sudo hostnamectl set-hostname ha-proxy && sudo su $USER
HAProxy 설치
sudo apt-get update && sudo apt-get install -y haproxy
HAProxy 설정파일을
/etc/haproxy/haproxy.cfg
아래와 같이 수정... # 23번라인 근처를 아래와 같이 수정 defaults log global mode tcp option tcplog ... ... # 아래의 라인들을 추가 frontend proxynode bind *:80 bind *:6443 stats uri /proxystats default_backend k8sServers backend k8sServers balance roundrobin server master1 MASTER1_IP_ADDRESS:6443 check server master2 MASTER2_IP_ADDRESS:6443 check server master3 MASTER3_IP_ADDRESS:6443 check listen stats bind :9999 mode http stats enable stats hide-version stats uri /stats
HAProxy 데몬을 재시작하고 상태 확인
sudo systemctl restart haproxy sudo systemctl is-active haproxy
웹 브라우저를 열고
HAPROXY_IP:9999/stats
주소로 접속 - 아래 명령어로 주소 확인 가능echo "$(curl -s ifconfig.io):9999/stats"
마스터 노드 구성
첫번째 마스터 노드 구성
마스터 노드로 사용한 인스턴스중에 하나로 SSH 접속
Root 유저로 전환
sudo -i
시스템 구동에 필요한 라이브러리 설치
apt update && apt install -y jq apt-transport-https ca-certificates libseccomp2
CRI-O 구동에 필요한 overlay와 br_netfilter 커널 모듈 불러오기
modprobe overlay modprobe br_netfilter
CRI-O 구동에 필요한 커널 파라미터 설정파일 생성
cat <<EOF> /etc/sysctl.d/99-kubernetes-cri.conf net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 net.bridge.bridge-nf-call-ip6tables = 1 EOF
위에서 생성한 설정파일 반영
sysctl --system
CRI-O 설치
{ echo "deb http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/1.22/xUbuntu_18.04/ /" | sudo tee -a /etc/apt/sources.list.d/cri-0.list curl -L http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/1.22/xUbuntu_18.04/Release.key | sudo apt-key add - echo "deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_18.04/ /" | sudo tee -a /etc/apt/sources.list.d/libcontainers.list apt update && apt install -y cri-o cri-o-runc }
CRI-O CNI 설정 삭제
rm -rf /etc/cni/net.d
CRI-O 서비스 재기동
{ systemctl daemon-reload systemctl enable crio systemctl restart crio }
쿠버네티스 설치 및 구동에 필요한 바이너리 설치
{ curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list apt update && apt install -y kubelet kubeadm kubectl }
리눅스 호스트네임 설정
hostnamectl set-hostname master-1 && su
첫번째 컨트롤 플레인(마스터 노드) 구성
kubeadm init --control-plane-endpoint "HA_PROXY_IP:6443" --upload-certs
위의 명령어를 실행하고 나온 Outputs에서 컨트롤 플레인 노드 조인 명령어를 메모장에 복사
e.g. You can now join any number of the control-plane node running the following command on each as root: kubeadm join 123.123.123.123:6443 --token xu0c4j.vd0fi1yk4j95de30 \ --discovery-token-ca-cert-hash sha256:1cfdaaa76a9316ac6e7fce7eb9577039857b565c14956c0f4b108108c02da6cb \ --control-plane --certificate-key 09a6dba1b07280f75d121068a6feece19e0b6721baa555f418e55c783083177f
kubeconfig 설정
mkdir -p $HOME/.kube cp -i /etc/kubernetes/admin.conf $HOME/.kube/config chown $(id -u):$(id -g) $HOME/.kube/config
마스터 노드 상태 확인
kubectl get node
CNI 플러그인 설치
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
마스터 노드 상태 확인
kubectl get node
두번째 마스터 노드 구성
마스터 노드로 사용한 인스턴스중에 하나로 SSH 접속
Root 유저로 전환
sudo -i
시스템 구동에 필요한 라이브러리 설치
apt update && apt install -y apt-transport-https ca-certificates libseccomp2
CRI-O 구동에 필요한 overlay와 br_netfilter 커널 모듈 불러오기
modprobe overlay modprobe br_netfilter
CRI-O 구동에 필요한 커널 파라미터 설정파일 생성
cat <<EOF> /etc/sysctl.d/99-kubernetes-cri.conf net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 net.bridge.bridge-nf-call-ip6tables = 1 EOF
위에서 생성한 설정파일 반영
sysctl --system
CRI-O 설치
{ echo "deb http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/1.22/xUbuntu_18.04/ /" | sudo tee -a /etc/apt/sources.list.d/cri-0.list curl -L http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/1.22/xUbuntu_18.04/Release.key | sudo apt-key add - echo "deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_18.04/ /" | sudo tee -a /etc/apt/sources.list.d/libcontainers.list apt update && apt install -y cri-o cri-o-runc }
CRI-O CNI 설정 삭제
rm -rf /etc/cni/net.d
CRI-O 서비스 재기동
{ systemctl daemon-reload systemctl enable crio systemctl restart crio }
쿠버네티스 설치 및 구동에 필요한 바이너리 설치
{ curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list apt update && apt install -y kubelet kubeadm kubectl }
리눅스 호스트네임 설정
hostnamectl set-hostname master-2 && su
[첫번째 마스터 노드 구성] 13번 단계에서 메모한 명령어를 실행
세번째 마스터 노드 구성
마스터 노드로 사용한 인스턴스중에 하나로 SSH 접속
Root 유저로 전환
sudo -i
시스템 구동에 필요한 라이브러리 설치
apt update && apt install -y apt-transport-https ca-certificates libseccomp2
CRI-O 구동에 필요한 overlay와 br_netfilter 커널 모듈 불러오기
modprobe overlay modprobe br_netfilter
CRI-O 구동에 필요한 커널 파라미터 설정파일 생성
cat <<EOF> /etc/sysctl.d/99-kubernetes-cri.conf net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 net.bridge.bridge-nf-call-ip6tables = 1 EOF
위에서 생성한 설정파일 반영
sysctl --system
CRI-O 설치
{ echo "deb http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/1.22/xUbuntu_18.04/ /" | sudo tee -a /etc/apt/sources.list.d/cri-0.list curl -L http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/1.22/xUbuntu_18.04/Release.key | sudo apt-key add - echo "deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_18.04/ /" | sudo tee -a /etc/apt/sources.list.d/libcontainers.list apt update && apt install -y cri-o cri-o-runc }
CRI-O CNI 설정 삭제
rm -rf /etc/cni/net.d
CRI-O 서비스 재기동
{ systemctl daemon-reload systemctl enable crio systemctl restart crio }
쿠버네티스 설치 및 구동에 필요한 바이너리 설치
{ curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list apt update && apt install -y kubelet kubeadm kubectl }
리눅스 호스트네임 설정
hostnamectl set-hostname master-3 && su
[첫번째 마스터 노드 구성] 13번 단계에서 메모한 명령어를 실행
워커 노드 구성
워커 노드로 사용할 EC2 인스턴스에 접속
Root 유저로 전환
sudo -i
시스템 구동에 필요한 라이브러리 설치
apt update && apt install -y apt-transport-https ca-certificates libseccomp2
CRI-O 구동에 필요한 overlay와 br_netfilter 커널 모듈 불러오기
modprobe overlay modprobe br_netfilter
CRI-O 구동에 필요한 커널 파라미터 설정파일 생성
cat <<EOF> /etc/sysctl.d/99-kubernetes-cri.conf net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 net.bridge.bridge-nf-call-ip6tables = 1 EOF
위에서 생성한 설정파일 반영
sysctl --system
CRI-O 설치
{ echo "deb http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/1.22/xUbuntu_18.04/ /" | sudo tee -a /etc/apt/sources.list.d/cri-0.list curl -L http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/1.22/xUbuntu_18.04/Release.key | sudo apt-key add - echo "deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_18.04/ /" | sudo tee -a /etc/apt/sources.list.d/libcontainers.list apt update && apt install -y cri-o cri-o-runc }
CRI-O CNI 설정 삭제
rm -rf /etc/cni/net.d
CRI-O 서비스 재기동
{ systemctl daemon-reload systemctl enable crio systemctl restart crio }
쿠버네티스 설치 및 구동에 필요한 바이너리 설치
{ curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list apt update && apt install -y kubelet kubeadm }
리눅스 호스트네임 설정
hostnamectl set-hostname worker-1 && su
첫번째 마스터 노드에 연결된 터미널로 이동해서 워커 노드 조인 명령어 생성
kubeadm token create --print-join-command --ttl 0
워커 노드에서 위의 명령어를 실행하고 나온 명령어를 실행
클러스터 구성 확인
첫번째 마스터 노드에 연결된 터미널로 이동
노드 상태 확인
kubectl get node
배포된 Pod 확인
kubectl get po -A
HAProxy에 연결된 터미널로 이동
웹 브라우저를 열고
HAPROXY_IP:9999/stats
주소로 접속 - 아래 명령어로 주소 확인 가능echo "$(curl -s ifconfig.io):9999/stats"
컨트롤 플레인 고가용성 테스트
첫번째 마스터 노드에 연결된 터미널로 이동
실행중인 ETCD Pod 확인
kubectl get pod -n kube-system -l component=etcd
ETCD Pod 로그 확인
kubectl -n kube-system logs etcd-master-2 | grep leader -A 5 -B 5
실행중인 ETCD Pod의 IP 주소 확인
kubectl get pod -n kube-system -l component=etcd -o wide
ETCD 클러스터 상태 확인
kubectl -n kube-system exec -it etcd-master-1 -- \ etcdctl -w table \ --endpoints \ $(kubectl get pod etcd-master-1 -n kube-system -o=jsonpath='{.status.podIP}'):2379,\ $(kubectl get pod etcd-master-2 -n kube-system -o=jsonpath='{.status.podIP}'):2379,\ $(kubectl get pod etcd-master-3 -n kube-system -o=jsonpath='{.status.podIP}'):2379 \ --cacert /etc/kubernetes/pki/etcd/ca.crt \ --cert /etc/kubernetes/pki/etcd/server.crt \ --key /etc/kubernetes/pki/etcd/server.key \ endpoint status
ETCD 클러스터의 리더 Pod가 배포된 노드에 가서 컨테이너 런타임 정지 - 첫번째 마스터 노드의 ETCD가 가장 먼저 구성되었기 때문에 일반적으로 첫번째 마스터 노드에 배포된 ETCD가 리더
{ sudo systemctl stop kubelet sudo crictl stop $(sudo crictl ps -q) sudo systemctl stop crio.service sudo systemctl start kubelet }
첫번째 마스터 노드에 연결된 터미널로 이동해서 ETCD Pod 로그 확인
kubectl -n kube-system logs etcd-master-2 | grep leader -A 5 -B 5
웹 브라우저를 열고
HAPROXY_IP_ADDRESS:9999/stats
주소로 접속해서 위에서 노드들의 연결 상태 확인ETCD 클러스터 상태 확인 - 리더가 변경된 것을 확인
kubectl -n kube-system exec -it etcd-master-2 -- \ etcdctl -w table \ --endpoints \ $(kubectl get pod etcd-master-1 -n kube-system -o=jsonpath='{.status.podIP}'):2379,\ $(kubectl get pod etcd-master-2 -n kube-system -o=jsonpath='{.status.podIP}'):2379,\ $(kubectl get pod etcd-master-3 -n kube-system -o=jsonpath='{.status.podIP}'):2379 \ --cacert /etc/kubernetes/pki/etcd/ca.crt \ --cert /etc/kubernetes/pki/etcd/server.crt \ --key /etc/kubernetes/pki/etcd/server.key \ endpoint status
실행중인 ETCD Pod의 IP 주소 확인
kubectl get pod -n kube-system -l component=etcd -o wide
ETCD 클러스터의 리더가 아닌 Pod가 배포된 노드에 가서 컨테이너 런타임 정지
{ sudo systemctl stop kubelet sudo crictl stop $(sudo crictl ps -q) sudo systemctl stop crio.service sudo systemctl start kubelet }
HAProxy 상태 페이지에 들어가서 노드들의 연결 상태 확인
첫번째 마스터 노드에 연결된 터미널로 이동해서 노드 상태 확인
kubectl get node
컨테이너 런타임을 정지한 노드들에서 컨테이너 런타임 실행
sudo systemctl start crio.service
HAProxy 상태 페이지에 들어가서 노드들의 연결 상태 확인
첫번째 마스터 노드에 연결된 터미널로 이동해서 노드 상태 확인
kubectl get node
모든 Pod가 정상적으로 실행되고 있는지 확인
kubectl get pod -A
ETCD 클러스터 상태 확인
kubectl -n kube-system exec -it etcd-master-2 -- \ etcdctl -w table \ --endpoints \ $(kubectl get pod etcd-master-1 -n kube-system -o=jsonpath='{.status.podIP}'):2379,\ $(kubectl get pod etcd-master-2 -n kube-system -o=jsonpath='{.status.podIP}'):2379,\ $(kubectl get pod etcd-master-3 -n kube-system -o=jsonpath='{.status.podIP}'):2379 \ --cacert /etc/kubernetes/pki/etcd/ca.crt \ --cert /etc/kubernetes/pki/etcd/server.crt \ --key /etc/kubernetes/pki/etcd/server.key \ endpoint status

ETCD
ETCD에 저장된 데이터 확인
kubectl exec -it etcd-master-1 -n kube-system -- \ etcdctl --key /etc/kubernetes/pki/etcd/server.key --cert /etc/kubernetes/pki/etcd/server.crt --cacert /etc/kubernetes/pki/etcd/ca.crt get / --prefix --keys-only
Deployment 생성
kubectl create deployment nginx --image=nginx:latest --replicas=2
ETCD에 업데이트된 데이터 확인
kubectl exec -it etcd-master-1 -n kube-system -- \ etcdctl --key /etc/kubernetes/pki/etcd/server.key --cert /etc/kubernetes/pki/etcd/server.crt --cacert /etc/kubernetes/pki/etcd/ca.crt get / --prefix --keys-only | grep deployment
위에서 생성한 Deployment 객체의 데이터 확인
kubectl exec -it etcd-master-1 -n kube-system -- \ etcdctl --key /etc/kubernetes/pki/etcd/server.key --cert /etc/kubernetes/pki/etcd/server.crt --cacert /etc/kubernetes/pki/etcd/ca.crt get /registry/deployments/default/nginx
컨테이너 이미지 변경
kubectl set image deployment/nginx nginx=nginx:alpine
위에서 생성한 Deployment 객체 정보를 YAML 형식으로 확인
kubectl get deployment nginx -o yaml
ETCD에 업데이트된 데이터 확인
kubectl exec -it etcd-master-1 -n kube-system -- \ etcdctl --key /etc/kubernetes/pki/etcd/server.key --cert /etc/kubernetes/pki/etcd/server.crt --cacert /etc/kubernetes/pki/etcd/ca.crt get /registry/deployments/default/nginx
새로 생성된 ReplicaSet 확인
kubectl get rs
EKS Cluster
eksctl 설치
curl --silent --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp sudo mv /tmp/eksctl /usr/local/bin
eksctl 버전 확인
eksctl version
ClusterConfig 생성
cat <<EOF > mycluster.yaml apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: mycluster region: ap-northeast-2 version: "1.29" availabilityZones: - ap-northeast-2a - ap-northeast-2b - ap-northeast-2c - ap-northeast-2d managedNodeGroups: - name: nodegroup instanceType: t3.small minSize: 2 desiredCapacity: 2 maxSize: 5 volumeSize: 20 iam: attachPolicyARNs: - arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy - arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy - arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly - arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore iam: withOIDC: true EOF
kubeconfig 삭제
rm -rf ~/.kube/config
현재 로그인된 IAM 자격증명 확인
aws sts get-caller-identity
EKS 클러스터 생성
eksctl create cluster --config-file=mycluster.yaml
Deployment 생성
kubectl create deployment nginx --image=nginx --replicas=3
생성된 Pod 확인
kubectl get po -o wide
Service 생성
kubectl expose deployment nginx --port 80 --type LoadBalancer
생성된 Service 확인
kubectl get svc nginx -l
생성된 ELB 주소 확인
kubectl get svc nginx \ -o=jsonpath='{.status.loadBalancer.ingress[0].hostname}{"\n"}'
웹브라우저에서 위에서 확인한 URL로 접속
EKS 콘솔에서 Control Plane Logging 활성화
CloudWatch에서 로그 확인
리소스 삭제
kubectl delete deploy nginx kubectl delete svc nginx
EKS 클러스터 삭제 (다른 실습을 계속 진행할 경우에는 클러스터를 삭제하지 않습니다)
eksctl delete cluster --config-file=mycluster.yaml
Last updated