환경구성
- Docker 설치
- K8s 설치
- CNI 설치
kubectl create secret docker-registry registry-name \
--docker-server=REGISTRY-URL \
--docker-username= \
--docker-password= \
--docker-email=example@example.com # 이메일은 아무거나 넣어도 상관없다

kubectl create secret docker-registry registry-name \
--docker-server=REGISTRY-URL \
--docker-username= \
--docker-password= \
--docker-email=example@example.com # 이메일은 아무거나 넣어도 상관없다

먼저, docker를 먼저 설치하고, k8s 설치 바람.
쿠버네티스 버전 1.24.0 이전이면, 도커와 쿠버네티스가 연동되는 dockershim이 있었지만, 1.24.0 버전 이후에는 따로 설정을 해줘야 함.
docker를 설치한 후,
#/etc/docker 디렉토리 없을 경우 생성
sudo mkdir /etc/docker
#daemon.json 파일 추가
sudo cat <<EOF | sudo tee /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
#containerd 구성 파일 생성
sudo mkdir -p /etc/containerd
#containerd 기본 설정값으로 config.toml 생성
sudo containerd config default | sudo tee /etc/containerd/config.toml
#config.toml 파일 수정
vi /etc/containerd/config.toml
# cgroup driver(runc) 사용하기 설정
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true
#수정사항 적용 및 재실행
sudo systemctl restart containerd
#도커 재시작
sudo service docker restart
#도커 상태 조회
sudo service docker status
1) Swap disabled
swapoff -a && sed -i '/swap/s/^/#/' /etc/fstab
2) Letting iptables see bridged traffic
# cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
# sysctl --system
3) Disable firewall
# systemctl stop firewalld
# systemctl disable firewalld
4) Set SELinux in permissive mode (effectively disabling it)
# setenforce 0
# sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
5) kubeadm, kubelet, kubectl 설치.
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.27/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.27/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF
6) install.
sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
sudo systemctl enable --now kubelet
kubeadm init
여기서 error동작 없으면, 정상임.
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
입력 후, kubectl get nodes 실행
$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config


컨테이너 간의 네트워크를 제어할 수 있는 플러그인으로 컨테이너 런타임에서 컨테이너의 네트워크를 사용하게 해주는 인터페이스이다.
쿠버네티스에서 사용되는 Pod들은 기본적으로 오버레이 네트워크 방식을 적용하여 엔드포인트 간의 네트워크 구조를 추상화하여 네트워크 통신 경로를 단순화한다. 이때 사용되는 플러그인 마다 설정 방법이 다르다.
master-node 에만,
curl https://calico-v3-25.netlify.app/archive/v3.25/manifests/calico.yaml -O
yaml 파일 다운 받은 후, 적용
kubectl apply -f calico.yaml

마스터 노드에서 kubeadm init 을 통해 생성한 join 명령어를 이용하여 워커 노드 등록
sudo kubeadm join [ip]:6443 --token [토큰명] --discovery-token-ca-cert-hash [hashkey]

ufw : ubuntu 방화벽 서비스.
# ufw 서비스 중지.
sudo systemctl stop ufw
# ufw 서비스 자동 실행 중지.
sudo systemctl disable ufw
# Swap 끄기.
sudo swapoff -a
# swap 자동 마운트 끄기.
sudo vi /etc/fstab
# /swap ... 주석처리
vi /etc/hosts
# 마스터 및 워커 노드 노드 정보 추가.
# 0.0.0.0에 해당한 IP 넣기.
0.0.0.0 k8s-master-node
0.0.0.0 k8s-worker-node-01
0.0.0.0 k8s-worker-node-02
# 필수 패키지 설치
sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release
# docker 공식 GPG 키 추가
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# docker 저장소 추가
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# docker 설치
sudo apt update -y
sudo apt upgrade -y
sudo apt install docker-ce -y
# 시스템 기본 설정.
sudo apt update && sudo apt upgrade -y
sudo apt install -y curl apt-transport-https gnupg ca-certificates
# 컨테이너 런타임 설치.
sudo apt install -y containerd
# 설정파일 생성.
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
# systemdcgroup 활성화.
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
# 재시작
sudo systemctl restart containerd
sudo systemctl enable containerd
# k8s 설치.
sudo mkdir -p /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
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 > /dev/null
# 설치.
sudo apt update
sudo apt install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
# IP 포워딩 활성
echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
# 변경 사항 적용
sudo sysctl -p
# br_netfilter 모듈 로드 (Kubernetes 및 기타 컨테이너 런타임이 브리지된 네트워크 트래픽을 올바르게 처리할 수 있도록 함)
sudo modprobe br_netfilter
# container.d 초기 설정 파일 생성
sudo bash -c "containerd config default > /etc/containerd/config.toml"
# systemd를 Cgroup 드라이버로 사용하는 설정
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
# crictl 설정 파일
cat <<EOF | sudo tee -a /etc/crictl.yml
runtime-endpoint: unix:///var/run/containerd/containerd.sock
image-endpoint: unix:///var/run/containerd/containerd.sock
timeout: 10
debug: true
EOF
# container.d 재시작
sudo systemctl restart containerd
# 시스템 부팅시 자동으로 시작하도록 설정
sudo systemctl enable containerd
sudo kubeadm init \
--pod-network-cidr=10.244.0.0/16 \
--apiserver-advertise-address=$(hostname -I | awk '{print $1}') \
--cri-socket=unix:///var/run/containerd/containerd.sock
# --pod-network-cidr는 생성될 pod들의 네트워크 주소(subnet Mask 255.255.0.0)
# --apiserver-advertise-address는 마스터노드의 IP 주소
sudo kubeadm init --pod-network-cidr=10.10.0.0/16 --apiserver-advertise-address=192.168.0.0 --cri-socket=unix:///var/run/containerd/containerd.sock
[생략]
Your Kubernetes control-plane has initialized successfully!
>
To start using your cluster, you need to run the following as a regular user:
>
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
>
Alternatively, if you are the root user, you can run:
>
export KUBECONFIG=/etc/kubernetes/admin.conf
>
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
>
Then you can join any number of worker nodes by running the following on each as root:
>
kubeadm join 192.168.0.0:6443 --token 123456.1234567890123456 \
--discovery-token-ca-cert-hash sha256:d7a9fc38cd353b4803c63873bbad3fc1bbf5cfab44e678363e7699e930c99bc7
# kubernetes 인증 정보 복사
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 설치 확인
kubectl get pods --all-namespaces
# CRD번들 크기가 크기 때문에 kubectl apply , replace 대신 create 사용해야 에러가 발생하지 않음
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.28.1/manifests/tigera-operator.yaml
# custom-resources.yaml 파일 다운로드
curl -O https://raw.githubusercontent.com/projectcalico/calico/v3.28.1/manifests/custom-resources.yaml
# cidr 정보 변경 (--pod-network-cidr 인 10.10.0.0/16로 변경)
vi custom-resources.yaml
# 변경한 내용으로 생성
kubectl create -f custom-resources.yaml
# 설치 확인하기 (coredNS의 상태가 Pending에서 Running으로 변경됨)
kubectl get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
calico-apiserver calico-apiserver-68467b4b9d-lr6lg 1/1 Running 0 3m32s
calico-apiserver calico-apiserver-68467b4b9d-ltlgn 1/1 Running 0 3m32s
calico-system calico-kube-controllers-5c85f7b95-8kgtb 1/1 Running 0 4m37s
calico-system calico-node-9lxpl 1/1 Running 0 4m38s
calico-system calico-typha-b9b589dc7-9b64q 1/1 Running 0 4m38s
calico-system csi-node-driver-ztrgm 2/2 Running 0 4m37s
kube-system coredns-7db6d8ff4d-8n6xt 1/1 Running 0 25m
kube-system coredns-7db6d8ff4d-rdlwq 1/1 Running 0 25m
kube-system etcd-k8s-master 1/1 Running 0 25m
kube-system kube-apiserver-k8s-master 1/1 Running 0 25m
kube-system kube-controller-manager-k8s-master 1/1 Running 0 25m
kube-system kube-proxy-pdcsj 1/1 Running 0 25m
kube-system kube-scheduler-k8s-master 1/1 Running 0 25m
tigera-operator tigera-operator-77f994b5bb-72lnv 1/1 Running 0 5m40s
# 기존 token 확인
kubeadm token list
# 토큰 생성 (유효기간 : 24H)
kubeadm token create
# 토큰 유효기간 설정하여 생성
kubeadm token create --ttl 48h
# --discovery-token-ca-cert-hash 값 추출하기
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
# 워커 노드 추가하기
sudo kubeadm join 192.168.91.100:6443 --token 123456.1234567890123456 --discovery-token-ca-cert-hash sha256:d7a9fc38cd353b4803c63873bbad3fc1bbf5cfab44e678363e7699e930c99bc7
# master 노드의 인증 정보 파일(~/.kube/config) 복사
mkdir -p $HOME/.kube
scp sppolo@192.168.91.100:/home/sppolo/.kube/config /home/sppolo/.kube
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# dashboard manifests 다운로드
curl -O https://raw.githubusercontent.com/kubernetes/dashboard/v2.6.1/aio/deploy/recommended.yaml
# dashboard manifests 수정 (Service타입을 ClusterIP -> NodePort로 변경)
vi recommended.yaml
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
ports:
- port: 443
targetPort: 8443
nodePort: 32000 # 외부 접근 포트 설정
selector:
k8s-app: kubernetes-dashboard
type: NodePort # 외부 접근 가능하도록 NodePort로 변경
# 마스터 노드에 파드 설치하도록 설정 변경 (taint 제거)
kubectl taint nodes k8s-master node-role.kubernetes.io/control-plane:NoSchedule-
# dashboard 설치
kubectl create -f recommended.yaml
# 원복 (마스터노드에 파드 설치X)
kubectl taint nodes k8s-master node-role.kubernetes.io/control-plane:NoSchedule
# dashboard admin 계정 생성
kubectl create serviceaccount admin -n kubernetes-dashboard
# admin 계정에 클러스터 관리자 권한 부여
kubectl create clusterrolebinding admin-binding --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:admin
# dashboard admin토큰 생성
kubectl -n kubernetes-dashboard create token admin
# dashboard 접속하기
https://192.168.91.100:32000

# postgresql
kubectl exec -it postgresql-0 -n db -- psql -U postgres
# K8s 포트포워딩
kubectl port-forward svc/postgresql 5432:5432 -n db

root 계정으로 접속 후, 다음을 실행.
sudo mkdir -p /home/ubuntu/.kube
sudo cp -i /etc/kubernetes/admin.conf /home/ubuntu/.kube/config
sudo chown ubuntu:ubuntu /home/ubuntu/.kube/config

ufw : ubuntu 방화벽 서비스.
# ufw 서비스 중지.
sudo systemctl stop ufw
# ufw 서비스 자동 실행 중지.
sudo systemctl disable ufw
# Swap 끄기.
sudo swapoff -a
# swap 자동 마운트 끄기.
sudo vi /etc/fstab
# /swap ... 주석처리
# docker install
apt update
apt install docker.io
# 시스템 기본 설정.
sudo apt update && sudo apt upgrade -y
sudo apt install -y curl apt-transport-https gnupg ca-certificates
# 컨테이너 런타임 설치.
sudo apt install -y containerd
# 설정파일 생성.
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
# systemdcgroup 활성화.
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
# 재시작
sudo systemctl restart containerd
sudo systemctl enable containerd
# k8s 설치.
sudo mkdir -p /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
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 > /dev/null
# 설치.
sudo apt update
sudo apt install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
# IP 포워딩 활성
echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
# 변경 사항 적용
sudo sysctl -p
# br_netfilter 모듈 로드 (Kubernetes 및 기타 컨테이너 런타임이 브리지된 네트워크 트래픽을 올바르게 처리할 수 있도록 함)
sudo modprobe br_netfilter
# container.d 초기 설정 파일 생성
sudo bash -c "containerd config default > /etc/containerd/config.toml"
# systemd를 Cgroup 드라이버로 사용하는 설정
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
# crictl 설정 파일
cat <<EOF | sudo tee -a /etc/crictl.yml
runtime-endpoint: unix:///var/run/containerd/containerd.sock
image-endpoint: unix:///var/run/containerd/containerd.sock
timeout: 10
debug: true
EOF
# container.d 재시작
sudo systemctl restart containerd
# 시스템 부팅시 자동으로 시작하도록 설정
sudo systemctl enable containerd
Reference
# --pod-network-cidr는 생성될 pod들의 네트워크 주소(subnet Mask 255.255.0.0)
# --apiserver-advertise-address는 마스터노드의 IP 주소
sudo kubeadm init --pod-network-cidr=10.10.0.0/16 --apiserver-advertise-address=192.168.0.0 --cri-socket=unix:///var/run/containerd/containerd.sock
[생략]
Your Kubernetes control-plane has initialized successfully!
>
To start using your cluster, you need to run the following as a regular user:
>
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
>
Alternatively, if you are the root user, you can run:
>
export KUBECONFIG=/etc/kubernetes/admin.conf
>
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
>
Then you can join any number of worker nodes by running the following on each as root:
>
kubeadm join 192.168.0.0:6443 --token 123456.1234567890123456 \
--discovery-token-ca-cert-hash sha256:d7a9fc38cd353b4803c63873bbad3fc1bbf5cfab44e678363e7699e930c99bc7
# kubernetes 인증 정보 복사 (User에서 실행)
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 설치 확인
kubectl get pods --all-namespaces
# CRD번들 크기가 크기 때문에 kubectl apply , replace 대신 create 사용해야 에러가 발생하지 않음
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.28.1/manifests/tigera-operator.yaml
# custom-resources.yaml 파일 다운로드
curl -O https://raw.githubusercontent.com/projectcalico/calico/v3.28.1/manifests/custom-resources.yaml
# cidr 정보 변경 (--pod-network-cidr 인 10.10.0.0/16로 변경)
vi custom-resources.yaml
# 변경한 내용으로 생성
kubectl create -f custom-resources.yaml