PKI = '공개키 기반구조(Public Key Infrastructure)'라는 뜻 PKI 는 비대칭 암호화 기술을 이용한 공개키 기반의 인증 체계입니다.
X.509는 PKI 기술 중에서 가장 널리 알려진 표준 포맷입니다. 공개키가 뭘까? Public 키 반댓말은 개인키= 비밀키= Private키
X.509 기술의 근간이 되는 암호화 기술입니다. 여기에는 Public 키와 Private 키가 존재합니다. Public 키는 누구나 가질 수 있으며 Private 키는 오직 Public, Private 키페어 소유자만 가지고 있습니다. Public 키를 이용하여 메세지를 암호화하게 되면 해당 Public키에 매핑되는 Private 키로만 복호화가 가능합니다. 반대로 Priate 키를 이용하여 메세지를 암호화할 수 있는데, 이때 누구나 해당 Private 키에 매핑되는 Public 키를 이용하여 암호화된 메세지에 대해서 정말 Private 키의 소유자가 작성한 메세지인지를 검증할 수 있습니다. Private 키로 메세지를 암호화하는 것을 디지털 서명(digital signature)이라고 합니다. X.509에서 디지털 서명을 이용하여 사용자의 신원을 확인합니다.
공개키는 어떻게 전달할까? - 공개키는 SSL 인증 과정에서 핸드쉐이킹 과정에 대해서 이해해야 합니다. 핸드쉐이킹 과정중 서버의 인증서를 보낼때 함께 공개키를 전달합니다. (= 서버 헬로우 )
공개키는 Handshaking 과정에서 클라이언트 서버에 전달 되어 클라이언트와 서버가 서로를 신뢰할수 있는지 신원확인을 위해 존재합니다. 하지만 공개키는 사용하는데 있어서 불필요한 리소스 사용이 크기 때문에 다수의 상대와 통신할때 사용하는 방식이 바로, 대칭키 교환 방식 입니다. 따라서 처음 세션을 맺는데 핸드쉐이킹 과정에서만 비대칭키 인증방식이 활용되고 그 이후에는 대칭키를 활용하여 암호화 통신을 진행 합니다.
이러한 그림을 이해하기 위해서 각 서버에는 crt - key 구조로 서버의 개인키와 공유키를 가지고 있습니다.
kind 클러스터 설치
클러스터 설치는 docker in docker 로 쿠버네티스 클러스터 환경을 구성 - 테스트환경 만들때 macos 기준으로 편리하게 설치할수 있습니다.
# 클러스터 배포 전 확인
docker ps
# kind 는 별도 도커 네트워크 생성 후 사용 : 기본값 172.18.0.0/16
docker network ls
docker inspect kind | jq
# Create a cluster with kind
cat << EOT > kind-2node.yaml
# two node (one workers) cluster config
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
EOT
kind create cluster --config kind-2node.yaml --name myk8s
# 확인
kind get nodes --name myk8s
# k8s api 주소 확인 : 어떻게 로컬에서 접속이 되는 걸까?
kubectl cluster-info
docker ps # 포트 포워딩 정보 확인
docker exec -it myk8s-control-plane ss -tnlp | grep 6443
kubectl get pod -n kube-system -l component=kube-apiserver -owide # 파드 IP 확인
kubectl describe pod -n kube-system -l component=kube-apiserver
docker exec -it myk8s-control-plane curl -k https://localhost:6443/livez ;echo
docker exec -it myk8s-control-plane curl -k https://localhost:6443/readyz ;echo
# 노드 정보 확인 : CRI 는 containerd 사용
kubectl get node -o wide
# 파드 정보 확인 : CNI 는 kindnet 사용
kubectl get pod -A -owide
# 네임스페이스 확인 >> 도커 컨테이너에서 배운 네임스페이스와 다릅니다!
kubectl get namespaces
# 컨트롤플레인, 워커 컨테이너 각각 1대씩 실행 : 도커 컨테이너 이름은 myk8s-control-plane , myk8s-worker 임을 확인
docker ps
docker images
# 디버그용 내용 출력에 ~/.kube/config 권한 인증 로드
kubectl get pod -v6
# kube config 파일 확인
cat ~/.kube/config
혹은
cat $KUBECONFIG
# local-path 라는 StorageClass 가 설치, local-path 는 노드의 로컬 저장소를 활용함
# 로컬 호스트의 path 를 지정할 필요 없이 local-path provisioner 이 볼륨을 관리
kubectl get sc
kubectl get deploy -n local-path-storage
# 툴 설치
docker exec -it myk8s-control-plane sh -c 'apt update && apt install tree jq psmisc lsof wget bridge-utils tcpdump htop git nano -y'
docker exec -it myk8s-worker sh -c 'apt update && apt install tree jq psmisc lsof wget bridge-utils tcpdump htop git nano -y'