cloudNet@ 팀의 가시다 님이 진행하는 쿠버네티스 네트워크 스터디 1주차 정리입니다.
Cloudformation 배포 스크립트를 통해 리눅스 환경을 AWS에 배포
- 키 이름은 자신에 맞게 수정해서 사용함
# YAML 파일 다운로드
curl -O https://s3.ap-northeast-2.amazonaws.com/cloudformation.cloudneta.net/kans/kans-1w.yaml
# CloudFormation 스택 배포
# aws cloudformation deploy --template-file kans-1w.yaml --stack-name mylab --parameter-overrides KeyName=<My SSH Keyname> SgIngressSshCidr=<My Home Public IP Address>/32 --region ap-northeast-2
예시) aws cloudformation deploy --template-file kans-1w.yaml --stack-name mylab --parameter-overrides KeyName=kp-gasida SgIngressSshCidr=$(curl -s ipinfo.io/ip)/32 --region ap-northeast-2
## Tip. 인스턴스 타입 변경 : MyInstanceType=t2.micro
예시) aws cloudformation deploy --template-file kans-1w.yaml --stack-name mylab --parameter-overrides MyInstanceType=t2.micro KeyName=kp-gasida SgIngressSshCidr=$(curl -s ipinfo.io/ip)/32 --region ap-northeast-2
# CloudFormation 스택 배포 완료 후 작업용 EC2 IP 출력
aws cloudformation describe-stacks --stack-name mylab --query 'Stacks[*].Outputs[0].OutputValue' --output text --region ap-northeast-2
# [모니터링] CloudFormation 스택 상태 : 생성 완료 확인
while true; do
date
AWS_PAGER="" aws cloudformation list-stacks \
--stack-status-filter CREATE_IN_PROGRESS CREATE_COMPLETE CREATE_FAILED DELETE_IN_PROGRESS DELETE_FAILED \
--query "StackSummaries[*].{StackName:StackName, StackStatus:StackStatus}" \
--output table
sleep 1
done
# Ansible Server EC2 SSH 접속
ssh -i koo-seoul.pem ubuntu@$(aws cloudformation describe-stacks --stack-name mylab --query 'Stacks[*].Outputs[0].OutputValue' --output text --region ap-northeast-2)
EC2 생성 시 확인할것
Cloudformation 배포 스크립트를 통해 리눅스 환경을 AWS에 배포
# SSH 접속 : ubuntu 계정
ssh -i ~/.ssh/kp-gasida.pem ubuntu@$(aws cloudformation describe-stacks --stack-name mylab --query 'Stacks[*].Outputs[0].OutputValue' --output text --region ap-northeast-2)
------------------------
# 현재 디렉터리 확인
pwd
# 계정 정보 확인
whoami
id
# 버전 확인
lsb_release -a
# CPU, Mem, Disk 등 기본 정보 확인
hostnamectl
lscpu
htop
free -h
df -hT /
mount
findmnt -A
cat /etc/hosts
# iptables 정책 확인
sudo iptables -t filter -L
sudo iptables -t nat -L
# 네트워크 정보 확인 - 리눅스아재력테스트
ip -br -c addr show
ip a(=ip addr) 혹은 ifconfig
ip route 혹은 route -n
# 프로세스 확인 - 셸변수
ps auf
pstree -p
echo $$
kill -9 $$
EC2 생성 후 AWS cli 설치 및 AWS 자격증명 설정
yum install -y aws-cli
aws configure
# AWS Access Key ID [None]:
# AWS Secret Key ID [None]:
✅ 대주제
도커 컨테이너의 격리 요약
- 컨테이너는 독립된 리눅스 환경(pivot-root, namespace, Overlay filesystem, cgroup)을 보장받는 프로세스
- 컨테이너는 OS에서 보면 하나의 (프로세스)일뿐이다.
- Unix Socket이란? Docker는 왜 Root / sudo로만 동작할까?
- 커널이란 무엇인가?
도커 개념
- 도커(Docker)는 가상실행 환경을 제공해주는 오픈소스 플랫폼입니다. 도커에서는 이 가상실행 환경을 '컨테이너(Container)'라고 부릅니다.
- 좀 더 정확히 표현하는 용어는 '컨테이너화된 프로세스(Containerized Process)' 이다
- 도커 플랫폼이 설치된 곳이라면 컨테이너로 묶인 애플리케이션을 어디서든 실행할 수 있는 장점을 가집니다.
프로세스의 이해
프로세스에 대해서 최소한의 이해를 하고 있어야 된다.
- 프로그램과 프로세스의 차이점
- User space와 Kernel space 구분
- system call 이란?
- 프로세스는 실행 중인 프로그램의 인스턴스를 의미. OS에서 프로세스를 관리하며, 각 프로세스는 고유한 ID(PID)를 가짐.
- 프로세스는 CPU와 메모리를 사용하는 기본 단위로, OS 커널(Cgroup)에서 각 프로세스의 자원을 관리함.
# 프로세스 정보 확인
ps
# /sbin/init 1번 프로세스 확인
# 프로세스별 CPU 차지율, Memory 점유율, 실제 메모리 사용량 등 확인 >> 비율로 표현되는 이유는?
ps aux
ps -ef
# 프로세스 트리 확인
pstree --help
pstree
pstree -a
pstree -p
pstree -apn
pstree -apnT
pstree -apnTZ
pstree -apnTZ | grep -v unconfined
# 실시간 프로세스 정보 출력
top -d 1
htop
# 특정 프로세스 정보 찾기
pgrep -h
# [터미널1]
sleep 10000
# [터미널2]
pgrep sleep
pgrep sleep -u root
pgrep sleep -u ubuntu
- 리눅스의 /proc 디렉터리는 커널이 동적으로 생성하는 정보를 실시간 제공 : 시스템 상태, 프로세스(/proc/[PID]), HW 정보
#
mount -t proc
findmnt /proc
TARGET SOURCE FSTYPE OPTIONS
/proc proc proc rw,nosuid,nodev,noexec,relatime
#
ls /proc
tree /proc -L 1
tree /proc -L 1 | more
# 커널이 동적으로 생성하는 정보
cat /proc/cpuinfo
cat /proc/meminfo
cat /proc/uptime
cat /proc/loadavg
cat /proc/version
cat /proc/filesystems
cat /proc/partitions
# 실시간(갱신) 정보
cat /proc/uptime
cat /proc/uptime
cat /proc/uptime
# 프로세스별 정보
ls /proc > 1.txt
# [터미널1]
sleep 10000
# [터미널2]
## 프로세스별 정보
ls /proc > 2.txt
ls /proc
diff 1.txt 2.txt
pstree -p
ps -C sleep
pgrep sleep
## sleep 프로세스 디렉터리 확인
tree /proc/$(pgrep sleep) -L 1
tree /proc/$(pgrep sleep) -L 2 | more
cat /proc/$(pgrep sleep)/cmdline ; echo
###
#root@MyServer:~# cat /proc/$(pgrep sleep)/cmdline ; echo
#sleep10000
###
ls -l /proc/$(pgrep sleep)/cwd
ls -l /proc/$(pgrep sleep)/exe
cat /proc/$(pgrep sleep)/environ ; echo
cat /proc/$(pgrep sleep)/maps
cat /proc/$(pgrep sleep)/stat
cat /proc/$(pgrep sleep)/status
프로세스에 대해 이해 했으니 이제는 도커를 설치해보자
# [터미널1] 관리자 전환
sudo su -
whoami
id
# 도커 설치
curl -fsSL https://get.docker.com | sh
# 도커 정보 확인 : Client 와 Server , Storage Driver(overlay2), Cgroup Version(2), Default Runtime(runc)
docker info
docker version
# 도커 서비스 상태 확인
systemctl status docker -l --no-pager
# 모든 서비스의 상태 표시 - 링크
systemctl list-units --type=service
# 도커 루트 디렉터리 확인 : Docker Root Dir(/var/lib/docker)
tree -L 3 /var/lib/docker
Manage Docker as a non-root user & Socket 소켓
- 도커를 유저로 실행하려고 하면 진행해야되는 부분이 있는데 공식문서에는 이렇게 나와있다.
- 도커 데몬은 기본적으로 Unix Socket을 바인딩 하고 있는데 기본적으로 Unix socket은 Root user로 소유권이 되어있으며 group을 추가하거나 sudo로 실행하여야 한다.
- 유닉스 소켓이 무엇인지 알고싶은 사람은 https://www.youtube.com/watch?v=3jQ2dBpiqPo 해당 영상 짧고 핵심만 소개하기 때문에 추천함
# [터미널2] 일반 유저 ubuntu 로 실습 진행
whoami
# 도커 서버 정보 획득 실패
docker info
...
Server:
ERROR: permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.46/info": dial unix /var/run/docker.sock: connect: permission denied
errors pretty printing info
#
ls -l /run/docker.sock /var/run/docker.sock
file /var/run/docker.sock
# [터미널1] 관리자
sudo su -
#
sudo systemctl status docker -l --no-pager
docker info
# 소켓 정보 확인 : tcp, udp, sctp, Unix Domain
ss -h | grep sockets
ss -tl # 혹은 ss --tcp --listening
ss -xl # 혹은 ss --unix --listening
ss -xl | grep -i docker
u_str LISTEN 0 4096 /run/docker.sock 69239 * 0
u_str LISTEN 0 4096 /var/run/docker/metrics.sock 69882 * 0
u_str LISTEN 0 4096 /var/run/docker/libnetwork/914c2d2f1446.sock 69422 * 0
# 특정 소켓 파일을 사용하는 프로세스 확인
lsof /run/docker.sock
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root 40u unix 0xffff96bd96236a80 0t0 69239 /run/docker.sock type=STREAM
dockerd 5178 root 4u unix 0xffff96bd96236a80 0t0 69239 /run/docker.sock type=STREAM
# unix domain socket 중 docker 필터링
lsof -U | grep -i docker
- 현재 터미널을 실행한 user 에 docker group 권한을 주자.
# [터미널2] 일반 유저 ubuntu 로 실습 진행
whoami
# Create the docker group : 도커 스크립트 생성 시 자동 생성되어 그룹 확인만 진행
sudo groupadd docker
getent group | tail -n 3
# Add your user to the docker group.
echo $USER
sudo usermod -aG docker $USER
# ssh logout
exit
# ssh 재접속 후 확인
#
docker info
# 컨테이너 실행
docker run hello-world
#
docker ps
docker ps -a
docker images
# 중지된 컨테이너 삭제
docker ps -aq
docker rm -f $(docker ps -aq)
docker ps -a
- 도커 설치가 완료되었기 때문에 프로세스, docker0 네트워크 인터페이스 , 브릿지 정보, iptables 정책들이 추가된것을 확인하자
- 유의할점이 iptables는 도커가 설치 된 이후에 여러가지 filter와 정책들이 추가 되는것을 비교해서 보자
# [터미널1] 관리자 권한
# 프로세스 확인 - 셸변수
ps -ef
pstree -p
# 시스템에 (마운트 된) disk free 디스크 여유 공간 확인
df -hT
# 네트워크 정보 확인 >> docker0 네트워크 인터페이스가 추가됨, 현재는 DOWN 상태
ip -br -c addr
ip -c addr
ip -c link
ip -br -c link
ip -c route
# 이더넷 브리지 정보 확인
brctl show
# iptables 정책 확인
iptables -t filter -S
iptables -t nat -S
## filter 에 FORWARD 가 기존 ACCEPT 에서 DROP 로 변경됨
## filter 에 FORWARD 에 docker0 에서 docker0 혹은 외부로 전달 허용 정책이 추가됨
iptables -t filter -S
-P INPUT ACCEPT
-P FORWARD DROP
-P OUTPUT ACCEPT
-N DOCKER
-N DOCKER-ISOLATION-STAGE-1
-N DOCKER-ISOLATION-STAGE-2
-N DOCKER-USER
-A FORWARD -j DOCKER-USER
-A FORWARD -j DOCKER-ISOLATION-STAGE-1
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -j RETURN
-A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -j RETURN
-A DOCKER-USER -j RETURN
## nat POSTROUTING 에 172.17.0.0/16 에서 외부로 전달 시 매스커레이딩(SNAT) 정책이 추가됨
iptables -t nat -S
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-N DOCKER
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
-A DOCKER -i docker0 -j RETURN
목표
도커에 대해 전반적인 이해를 했고
다음 시간에는 컨테이너의 격리 기술에 대해서 알아보도록 하겠다.
다음장에 넘어가기 전에 카카오 기술블로그에 굉장히 좋은 내용이 있어서 꼭 영상을 시청 하면서 따라해보자.
https://www.youtube.com/watch?v=mSD88FuST80
'컨테이너 > 쿠버네티스 네트워크' 카테고리의 다른 글
[KANS] 쿠버네티스 네트워크 (5) PAUSE 컨테이너 (3) | 2024.09.03 |
---|---|
[KANS] 쿠버네티스 네트워크 (4) 쿠버네티스 인증 deep div (0) | 2024.09.02 |
[KANS] 쿠버네티스 네트워크 (3) 컨테이너 네트워크 & IPTABLES (0) | 2024.08.29 |
[KANS] 쿠버네티스 네트워크 (2) 컨테이너 격리 (0) | 2024.08.27 |
API Gateway란 무엇인가? (Spring Cloud Gateway) (0) | 2022.12.12 |