ubuntu 22.04에서 쿠버네티스를 설치하는 절차입니다.
# ufw 서비스 중지
sudo systemctl stop ufw
# ufw 서비스 자동 실행 중지
sudo systemctl disable ufw
# swap 끄기
sudo swapoff -a
# swap 자동 마운트 끄기
sudo vi /etc/fstab
# /swap ... 주석처리
vi /etc/hosts
[중략]
# 마스터 및 워커 노드 정보 추가
192.168.91.100 k8s-master
192.168.91.201 k8s-worker1
192.168.91.202 k8s-worker2
ansible-playbook.yml 내용 추가하기
# 필수 패키지 설치
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 install -y apt-transport-https ca-certificates curl gpg
# Kubernetes GPG 키 추가
sudo curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.31/deb/Release.key | sudo gpg --dearmor -o /usr/share/keyrings/kubernetes-archive-keyring.gpg
# Kubernetes 저장소 추가
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.31/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list
# 패키지 리스트 업데이트
sudo apt update -y
# kubelet , kubeadm , kubectl 설치하기
sudo apt install kubelet kubeadm kubectl -y
# 시스템 부팅시 자동으로 시작하도록 설정
sudo systemctl enable --now kubelet
# 현재 버전으로 고정시키기 (자동 업데이트 X)
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
# --pod-network-cidr는 생성될 pod들의 네트워크 주소(서브넷마스크 255.255.0.0)
# --apiserver-advertise-address는 마스터노드의 IP 주소
sudo kubeadm init --pod-network-cidr=10.10.0.0/16 --apiserver-advertise-address=192.168.91.100 --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.91.100: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
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-7db6d8ff4d-l5sc5 0/1 Pending 0 70s
kube-system coredns-7db6d8ff4d-sqswp 0/1 Pending 0 70s
kube-system etcd-master 1/1 Running 0 94s
kube-system kube-apiserver-master 1/1 Running 0 90s
kube-system kube-controller-manager-master 1/1 Running 0 96s
kube-system kube-proxy-6rtsw 1/1 Running 0 70s
kube-system kube-scheduler-master 1/1 Running 0 85s
# 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