기본적인 네트워크 명령어
# 호스트에서 스위치로 연결, 그림 1(하나의 네트워크)
# 존재하는 이더넷
ip link
# 스위치에 IP정보값 등록
ip addr add 192.168.1.10/24 dev eth0
# 여러개의 네트워크를 연결하기 위해서는 라우터가 필요해짐, 그림 2
# 존재하는 라우터
route
# B > C로가는걸 등록
ip route add 192.168.2.0/24 via 192.168.1.1
# C > B로 가는걸 등록
ip route add 192.168.1.0/24 via 192.168.2.1
# C > 모든 접속, default는 0.0.0.0으로 대체가능
ip route add default via 192.168.2.1
DNS
원래 모든 인터넷 주소는 ip로 이뤄져있지만, 기억하기가 어려워서 이를 이름형식으로 대체하는방식. 기존에는 매 호스트마다 이러한 정보를 하나하나씩 저장해야헀지만, 하나의 IP주소가 바뀌게되면 모든 호스트에 들어있는 정보를 바꿔줘야해서 매우 번거로웠음.
따라서, IP주소와 명칭을 대응 해놓는 곳을 DNS라고한다. 이렇게 DNS가 존재하면, 기존에 호스트는 이 DNS에만 연결해놓으면 되는것이다. 그리고 특정 사이트 IP주소가 바뀌었을때도 DNS에 들어있는 정보값만 업데이트 시켜주면된다.
단, DNS에도 존재하고 호스트에도 존재할경우에는 호스트에 적힌 정보를 우선보게된다.
Network Namespace
# namespace생성
ip netns add red
ip netns add blue
# namespace 조회
ip netns
# 특정 namespace에서의 ip관련 명령어 실행. 두개 모두 같은 명령어
- ip netns exec [red] [ip link]
- ip -n [red] [link]
두개의 namespace를 연결하고싶을떄는
# 먼저 연결고리 생성
ip link add veth-red type veth peer name veth-blue
# 연결고리를 namespace에 장착
ip link set veth-red netns red
ip link set veth-blue netns blue
# 연결고리에 대한 ip설정
ip -n red addr add 192.168.15.1 dev veth-red
ip -n blue addr add 192.168.15.2 dev veth-blue
# namespace와 연결고리 link up
ip -n red link set veth-red up
ip -n blue link set veth-blue up
이렇게하면 이제 red라는 namespace에서 blue namespace에 ping을 날릴수있게된다.
# red namespace에서 blue(192.168.15.2)로 핑보내기
ip -n red ping 192.168.15.2
하지만, 만약에 두개의 namespace가 아닌 여러개의 namespace가 있을땐 이 과정을 반복하기가 매우 번거롭다. 이때 사용되는 개념이 Virtual Network개념이다(강의에서는 Linux Bridge로 예시)
# virtual network 생성
ip link add v-net-0 type bridge
# virtual network 활성화
ip link set dev v-net-0 up
# 위에서 생성한 연결고리는 삭제해도됨. 이제 virtual network에 연결할것이니
# 연결고리 삭제 -> 하나만 삭제해도 연결된 나머지 하나도 삭제됨
ip -n red link del veth-red
# 새로운 연결고리 생성
ip link add veth-red type veth peer name veth-red-br
ip link add veth-blue type veth peer name veth-blue-br
# 연결고리와 virtual network 연결
## RED
ip link set veth-red netns red
ip link set veth-red-br master v-net-0
## BLUE
ip link set veth-blue netns blue
ip link set veth-blue-br master v-net-0
CNI (Container Network Interface)
기본적으로 네트워크를 구성할때 다음과같은 과정을 처리해야한다. 1번을 제외하고는 2번부터~8번은 다른 플랫폼에서 작업하는건 거의 유사하다고한다. 따라서 2번부터8번에 대해서 작업하기 쉽게끔 만들어진게 CNI라고한다.
CNI의 필요한 부분은 아래이미지에서 위에부분이고, 아래부분은 사용하는 플랫폼의 필요한부분이다.
In the CKA exam, for a question that requires you to deploy a network addon, unless specifically directed, you may use any of the solutions described in the link above.
대충 강의에서 얘기한걸보면, 실제 CKA시험에서 직접 CNI 외부 솔루션을 설치하라는 항목이있는데, kubernetes.io에서는 단순히 github링크만 있고 별도로 설치방법을 알려주는 내용은없다고한다. 그나마 밑의 링크에서 방법을 알려준다고한다.
연습문제에 사용된 명령어들
# 이더넷 조회
ip link
# 특정 이더넷 MAC Address 조회
ip link show [eth0]
ifconfig << 얘도가능할듯?
# 다른 노드(node01)의 Mac Address확인
arp [node01]
# 기본 gateway 확인
route
# 쿠버네티스 api들이 어떤 포트가 열려있는지 확인
## scheduler
netstat -anp | grep scheduler
## etcd
netstat -anp | grep etcd
CNI Weavework
# view kubelet options -> cni관련 옵션 확인가능
ps -aux | grep kubelet
# cni 관련 실행파일 목록
ls /opt/cni/bin
# cni 관련 bridge 정보
ls /etc/cni/net.d
# 특정 Pod 명령어 실행방법
kubectl exec busybox [ip route]
# Deploy Weave
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
# Weave 로그 검색
kubectl logs [weave관련 pod] weave -n kube-system
# Deploy Weave with another ip address
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')&env.IPALLOC_RANGE=10.50.0.0/16"
위에서 마지막 명령어는 좀 생소할수도있는데 아래 사이트에서 볼수있다
https://www.weave.works/docs/net/latest/kubernetes/kube-addon/#-installation
IPAM(IP Address Management)
# 특정 bridge ip대역 조사
ip addr show [bridge 이름]
Service Networks
서비스들의 IP대역을 알아보기(추정)
Node의 IP 대역은
- ip addr 에서 eth0 의 ip정보 확인
Pod의 IP대역은 weave를 통해서 확인
- 먼저 kube-system namespace에 떠있는 weave 관련 Pod을 본이후
- kubectl logs [weave-net-cc966] weave -n kube-system 명령어 실행
- ipalloc-init:consensus=1 ipalloc-range:(10.50.0.0/16) 괄호안에 있는정보가 Pod이 할당되는 IP대역
Service의 IP대역은
- cat /etc/kubernetes/manifests/kube-apiserver.yaml 을 실행한 이후
- service-cluster-ip-range에 대응하는 정보값 확인
kube-proxy가 사용하는 proxy정보 확인
- kubectl logs [kube-proxy관련 Pod이름] -n kube-system
# 서비스 ip구간 정해주기
kube-api-server --service-cluster-ip-range [ipNet] (defalut 10.0.0.0/24)
# 특정 서비스의 ip대역 알아보기
ps aux | grep kube-api-server
# service 에서 pod으로 가는 ip정보 - service name은 kubeclt get svc로 얻은거
iptables -L -t nat | grep [service name]
# 특정 Pod로그 보기
cat /var/log/kube-proxy.log
DNS in Kubernetes
특정 kubernetes api들의 접속 dns는 다음과같다
[API 이름, pod은 ip주소에서 . 을 - 로 변환] - [Namespace] - [API Type] - [Root] = IP Address
EX. Web-service라는 service가 apps라는 namespace안에 있을경우, root는 cluster.local로 정의. 이때 해당 service의 dns는
=> web-service.apps.cluster.local
CoreDNS in Kubernetes
이전에도 공부했듯이, 로컬에서의 DNS정보는 /etc/hosts 파일에 저장되어있었다. 하지만 매 로컬 머신에다가 dns정보를 저장하는건 비효율적이니, Kubernetes도 특정 서버에 이 DNS정보를 담아둬야한다.
Kubernetes에는 CoreDNS라는것이 존재한다.
CoreDNS의 정보는 /etc/coredns/Corefile에 저장되어있다.
coredns는 configmap 형식으로 kube-system에 저장을 해야하고, pod이나 service가 생성될때 해당 파일안에 정보를 추가한다.
그다음 생성된 pod이 해당 CoreDNS정보가 저장되어야하니.
kubectl get service -n kube-system에서 kube-dns의 ip정보를 가져와, host 머신의 /etc/resolv.conf파일에 CoreDNS로 향하는 DNS정보를 넣어준다.
문제 오답노트
# coredns 정보 및 저장위치 확인법
kubectl describe deployments coredns -n kube-system
# coredns root domain확인법
kubectl describe configmap coredns -n kube-system
# service와 대응하는 pod알아보는법
## 먼저 service의 라벨확인
kubectl describe svc [service name]
## Pod의 라벨확인
kubectl get pod [pod name] --show-labels
Ingress (추가 작성 필요함) - 제일 중요한 부분
'Develop > DevOps' 카테고리의 다른 글
[MLOps] 시험 전 도움이 되는 정보, 명령어 정리 (0) | 2021.12.16 |
---|---|
[MLOps] Kubernetes CKA자격증 공부 - Troubleshooting (0) | 2021.12.13 |
[MLOps] Kubernetes CKA자격증 공부 - Storage (0) | 2021.12.06 |
[MLOps] Kubernetes CKA자격증 공부 - Security (0) | 2021.12.05 |
[MLOps] Kubernetes CKA자격증 공부 - Maintenance (0) | 2021.12.04 |