별집사의 IT세상

Kubernetes 핵심개념 및 운영 실무(1일차) 본문

IT/Kubernetes

Kubernetes 핵심개념 및 운영 실무(1일차)

별집사 2024. 7. 7. 23:15
반응형
kubectl apply -f yam.yaml #yaml 파일 등록, 수정
kubectl delete -f yam.yaml #yaml 파일로 등록한 파드, 서비스 등 삭제

kubectl run  파드명  --image  nginx  --labels "app=web-svc"  --port  80 #파드 등록

kubectl get po,svc,deploy # 파드, 서비스, 디플로이 조회
kubectl get all -n 이름 #(이름과 관련된 모든 정보 조회)

 kubectl   exec   -it  파드명 -c 컨테이너명  --   bash #해당 파드로 접속

kubectl  describe   deploy   디플로이명 #상세보기
kubectl  set  image deploy  디플로이명 nginx=nginx:1.17.1  --record# 디플로이 이미지 변경
#record 변경사항 기록
kubectl  describe  po  recreate-747c5df7bb-nb585 | grep  Image #변경된 이미지 보기
kubectl  scale  deploy  디플로이명  --replicas  7 # 디폴로이 파드 수 변경

kubectl  rollout  history  deploy  디플로이명 #디플로이 버전 확인
kubectl  rollout  history  deploy  디플로이명  --revision  1 #디플로이 버전 상세확인
kubectl  rollout  undo  deploy  디플로이명  --to-revision 1 #디플로이 버전 돌아가기

kubectl  create  deploy  nginx-main  --image=nginx #오브젝트 생성
kubectl  expose deploy  nginx-main  --name  nginx-main-svc  --port  80 #오브젝트 서비스 매핑 및 배포

hostnamectl   set-hostname  node1.test.com #호스트네임 변경
vi /etc/netplan/00-installer-config.yaml
6행  		- 192.168.137.20/24    # if 수정

netplan  apply  # ip addr 로 수정된 ip 확인 

chmod  1777   /nfsdata #소유권한 변경
chown   nobody:nogroup  /nfsdata #소유자 변경

주요 명령어

1일차

  • 볼륨 - 5장
  • 컨테이너가 삭제되어도 데이터 유지 할 경우 볼륨으로 - 영구적
  • 프로그램 > 프로세스기존 프로그램은 운영체제의 버전에 따라 문제가 생기는 경우가 많음이를 실행하기 위해 여러 파일들이 모여 있는 게 컨테이너 이미지컨테이너 이미지를 만들기 위해 설계도(파일:Dockerfile)이 필요하다이 브릿지가 공용 ip를 컨테이너와 연결해준다. 도커로 컨테이너를 연결하면 쉽게 연결되지만, 문제가 생긴다.
    1. 장애에 대한 대비가 안된다.
    2. 부하 분산이 안된다.
    해결 방법은 여러 개의 물리적 호스트를 띄워야한다. 근데 여러 개의 호스트를 띄우기도 힘들고, 관리하기가 쉽지 않다. 이런 여러 개의 호스트를 관리하기 쉽게 해주는 것이 쿠버네티스(관리 도구)
  • 장애를 대비하고 버전관리 등을 할 수 있는 도구 - 이러한 기능들을 자동으로 처리해주는 도구이다.
  • ip addr에 추가된 docker0(172.17.xx)가 192.168.137.10과 새로 만들어주는 ‘www1’을 연결해주는 브릿지, 공용 포트 8080과 www1(80)을 연결한다. (-p 8080:80)
  • 이미지를 제공하는 것이 레지스트리
  • 컨테이너는 이를 예방할 수 있음(외부와 격리되어 다른 애플리케이션의 영향을 받지 않는다)
  • 컨테이너 이미지 > 컨테이너 (차이점은 격리)

도커 running > stop > remove

컨테이너 삭제 시 stop 이후 삭제를 하거나 docker rm -f 컨테이너명 처럼 force 옵션을 주면 된다.

docker rm -f www1

삭제 이후 같은 이름으로 만들면 기존데이터가 다 날아가는데 이를 유지하려면 볼륨이 필요함

docker run -d --name www3 -p 8383:80 -v webpage:/usr/share/nginx/html nginx

이후 저 볼륨안에 있는 html 값을 수정시키면, 삭제 이후 새로 컨테이너를 생성할때 해당 볼륨을 불러오면 내용이 유지된다.

 

RUN set -x \
&& groupadd --system --gid 101 nginx \\
&& useradd --system --gid nginx --no-create-home --home /nonexistent --comment "nginx user" --shell /bin/false --uid 101 nginx \\
&& apt-get update \\
&& apt-get install --no-install-recommends --no-install-suggests -y gnupg1 ca-certificates \\
&& \\

위 처럼 && 으로 붙이는 이유는 명령어 실행시 레이어가 계속 쌓이는데 레이어가 많아지면 용량이 많아져서 최대한 적게 하려고 사용한다.

 

FROM  ubuntu
LABEL maintainer="이름 <이메일@주소>"
RUN  mkdir /mywebpage \
 &&   useradd  webuser \
 &&   groupadd   was \
 &&  apt-get  update \
 &&  apt-get  -y install  nginx  \
 &&  rm -rf   /var/lib/apt/lists/*
COPY  index.html   /usr/share/nginx/html/
CMD ["nginx", "-g", "daemon off;"]

 

docker   build  -t   myweb:3.0   -f  1.txt    .
#Dockerfile 이름으로 만들 경우 -f 1.txt는 생략 가능, 이름을 지정하면 -f 명령어 사용

 

docker   rm  -f   $(docker  ps  -aq)
docker   system  prune  -a
	→  docker  image  ls
	→  docker  ps  -a
	→  docker  volume  ls  

docker  volume  rm  webpage

 

도커 내용을 날릴때(삭제할 때) volume는 유지되어서 volume는 따로 삭제해줘야한다!

 

Kubernetes

https://kubernetes.io/docs/home/

https://kubernetes.io/docs/tasks/tools/install-kubectl-linux/

1. docker(containerd.io 설치)

2. swapon 활성화 여부

swapon -s >> 활성화 되어있으면 닫아야한다.

swapoff -a 시 비활성화 되지만, 재부팅 시 다시 돌아간다. >> vi /etc/fstab → :set nu

12행 #/swap.img~ 을 주석처리하면 default 처리 된다.

3. 기본 파일 세팅

net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
br_netfilter

4. 쿠버네티스 설치

https://kubernetes.io/docs/tasks/tools/install-kubectl-linux/

에서 두번째 옵션 선택

Install using native package management

https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

목차에 따라 명령어 입력하면 된다.

sudo apt-get update
# apt-transport-https may be a dummy package; if so, you can skip that package
sudo apt-get install -y apt-transport-https ca-certificates curl gpg

1. Download the public signing key for the Kubernetes package repositories. The same signing key is used for all repositories so you can disregard the version in the URL:

# If the directory `/etc/apt/keyrings` does not exist, it should be created before the curl command, read the note below.
# sudo mkdir -p -m 755 /etc/apt/keyrings
curl -fsSL <https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key> | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

2. Add the appropriate Kubernetes apt repository. Please note that this repository have packages only for Kubernetes 1.29; for other Kubernetes minor versions, you need to change the Kubernetes minor version in the URL to match your desired minor version (you should also check that you are reading the documentation for the version of Kubernetes that you plan to install).

# This overwrites any existing configuration in /etc/apt/sources.list.d/kubernetes.list
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] <https://pkgs.k8s.io/core:/stable:/v1.29/deb/> /' | sudo tee /etc/apt/sources.list.d/kubernetes.list

3. Update the apt package index, install kubelet, kubeadm and kubectl, and pin their version:

sudo apt-get update
apt-get install -y kubelet=1.29.2-1.1 kubeadm=1.29.2-1.1 kubectl=1.29.2-1.1
sudo apt-mark hold kubelet kubeadm kubectl

최신버전 아닐땐 버전명 명시

4. (Optional) Enable the kubelet service before running kubeadm:

sudo systemctl enable --now kubelet

{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}

마무리 후 재부팅

systemctl daemon-reload
systemctl restart docker
systemctl enable docker

이후 오류? 를 예방하기 위해 파일을 옮겨준다(mv /etc/containerd/config.toml /tmp)

  1. Update the apt package index and install packages needed to use the Kubernetes apt repository:

이후 호스트 추가한다.

vi   /etc/hosts  ← 맨 밑에 추가
…생략…
192.168.137.10	master.test.com
192.168.137.11	node1.test.com
192.168.137.12	node2.test.com
192.168.137.13	node3.test.com

hostnamectl   set-hostname  master.test.com

5. master 컴 복제

vm에서 기분 마스터를 복제한다.

머신 메뉴 - 복제 - 이름: node1 - MAC 주소정책: 모든 네트워크 어댑터의 새 MAC 주소 생성 - 완전한 복제 선택

머신 메뉴 - 복제 - 이름: node2 - MAC 주소정책: 모든 네트워크 어댑터의 새 MAC 주소 생성 - 완전한 복제 선택

머신 메뉴 - 복제 - 이름: node3 - MAC 주소정책: 모든 네트워크 어댑터의 새 MAC 주소 생성 - 완전한 복제 선택

kubeadm join 192.168.137.10:6443 --token j09ggf.rvznqzzxyrfvvt2b \ --discovery-token-ca-cert-hash sha256:84e3ee6957ffa3a1869bf920a123e0700b693efccfbefefb0ff93fde1b1c5282

각자 머신으로 접속 > hostnamectl set-hostname node1.test.com 각 호스트명 변경

vi /etc/netplan/00-installer-config.yaml

..생략..

6행  - 192.168.137.11/24    ←  기존의 10을 11로 수정

netplan  apply

접속을 쉽게 하기 위해 ssh 생성 >> ssh-keygen

ssh-copy-id   node1.test.com  →  yes → root 유저의 암호 입력

ssh-copy-id   node2.test.com  →  yes → root 유저의 암호 입력

ssh-copy-id   node3.test.com  →  yes → root 유저의 암호 입력

ssh  node1.test.com

kubeadm join 192.168.137.10:6443 --token j9yyxr.oz5681dphlgai5f3 --discovery-token-ca-cert-hash sha256:cfea5960c16fd9e37c05ab5bfe6ea7f4d6278bc82abcf1404219f32efdc4901e

@@ 시간이 지난 시점에 추가로 node 를 join 해야하는 경우

기존 token 값을 확인
kubeadm token list

kubeadm  token  delete  기존의token값  
→ kubeadm token list  로 삭제 확인

kubeadm  token  create
→ kubeadm token list  로 생성 확인

해쉬값을 알아내기 위해 아래의 명령 실행
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'

token 값과 해쉬값을 이용해  join 구문 완성
kubeadm join 192.168.137.10:6443 --token  새로생성한 token값  --discovery-token-ca-cert-hash sha256:확인한해쉬값

위의 완성된 구문을 추가 할 node 에서 실행

kubeadm join 192.168.137.10:6443 --token  6cbiyg.xni0cffn1wuukh4f  --discovery-token-ca-cert-hash sha256:84e3ee6957ffa3a1869bf920a123e0700b693efccfbefefb0ff93fde1b1c5282

해당 값은 시간제한이 있음(24시간)

각 노드에 접속해서 조인 연결

30초가량 지나고 ready인지 확인

kubectl run web1 --image nginx:1.12 pod 생성 이후 kubectl get pod로 pod 확인

자세한 pod 설명 >> kubectl describe pod

 

 

ubuntu - root유저가 default 비활성

활성화 sudo passwd root >> 암호 초기화 >> exit >> root로 재로그인

 

설치 편하게 하기 위해 putty 사용 >> root로 로그인 시 deny

 

vi /etc/ssh/sshd_config > :set nu(행번호 표시)

34번째 행에 주석처리 해제 후 yes로 변경

 

vm - 스냅샷 > 현재상태 저장 : 문제가 생기면 복원할 수 있음

 

 

@@ Docker 설치

apt-get update

apt-get install ca-certificates curl

install -m 0755 -d /etc/apt/keyrings

curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc

chmod a+r /etc/apt/keyrings/docker.asc

echo \

"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \

$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \

sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

apt-get update

apt-cache madison docker-ce | awk '{ print $3 }'

VERSION_STRING=5:20.10.24~3-0~ubuntu-focal

apt-get install docker-ce=$VERSION_STRING docker-ce-cli=$VERSION_STRING containerd.io

docker  info

https://hub.docker.com/

docker pull nginx #도커 다운

docker  image   ls

docker  ps #도커 프로세스

docker   run   -d #도커실행(-d :backgroud로 실행 -p:port지정)

 

 

반응형
Comments