도커가 미리 설치되어 있어야합니다
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
### 설치 패키지 추가
sudo apt-get update
### 추가한 패키지 목록 업데이트
apt-cache madison kubeadm | grep 1.22.8
apt-cache madison kubelet | grep 1.22.8
apt-cache madison kubectl | grep 1.22.8
### 반드시 버전이 같아야함
sudo apt-get install kubeadm=1.22.8-00 kubelet=1.22.8-00 kubectl=1.22.8-00 -y
sudo apt-mark hold kubelet kubeadm kubectl
### 혹시나 나중에 apt upgrade 했을 경우 버전이 업데이트 되지 않도록 버전을 고정해줌
https://github.com/kubernetes/kubeadm/issues/2605
docker info | grep 'Cgroup Driver'
### Cgroup Driver: cgroupfs
sudo vi /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
sudo systemctl restart docker
docker info | grep 'Cgroup Driver'
### Cgroup Driver: systemd
sudo systemctl daemon-reload && sudo systemctl restart kubelet
### kubeadm init 도중에 실패하면 아래 명령어로 리셋 시켜주고 다시 시작해야한다.
sudo kubeadm reset
sudo kubeadm init --control-plane-endpoint 192.168.100.100 --pod-network-cidr 172.16.0.0/16 --apiserver-advertise-address 192.168.100.100
init
에 성공했다면출력결과
를 꼭 메모장이나 note기능이 있는 프로그램에 잘저장
해두자. 나중에 쓰이는 내용들이다.
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
### root권한으로 만든 파일은 소유자와 그룹이 root이므로 변경시켜준다.
kubectl get nodes
### 결과
NAME STATUS ROLES AGE VERSION
docker NotReady control-plane,master 14m v1.22.8
### CNI가 준비되지 않아서 NotReady라고 뜬다.
kubectl create -f https://projectcalico.docs.tigera.io/manifests/tigera-operator.yaml
curl https://projectcalico.docs.tigera.io/manifests/custom-resources.yaml -O
vi custom-resources.yaml
...
cidr: 172.16.0.0/16
...
### custom파일은 우리가 설정한 값에 맞춰서 수정해주어야한다.
kubectl create -f custom-resources.yaml
kubectl get pods -A
### 결과값
### 모두 성공하게 되면 control-plane이 Ready상태가 된다.
NAMESPACE NAME ...
calico-apiserver calico-apiserver-c9565f67b-2p29k ...
calico-apiserver calico-apiserver-c9565f67b-slthl ...
calico-system calico-kube-controllers-5d74cd74bc-sg7dn ...
calico-system calico-node-tgxks ...
calico-system calico-typha-7447fdc844-txrdb ...
kube-system coredns-78fcd69978-4ztkq ...
kube-system coredns-78fcd69978-jpwxx ...
kube-system etcd-docker ...
kube-system kube-apiserver-docker ...
kube-system kube-controller-manager-docker ...
kube-system kube-proxy-5st98 ...
kube-system kube-scheduler-docker ...
tigera-operator tigera-operator-7cf4df8fc7-kx87z ...
### 여기에 NAMESPACE와 도커의 네임스페이스는 전혀 상관이 없음
### kubelet이 없는 이유는 패키지로 설치했기 때문
### 왜 kubelet만 서비스일까? 왜 컨테이너가 아닐까에 대한 고민을 해볼 필요가 있다.
이 영역들이 존재하는 것을 알 수 있다.
kubectl get nodes
###결과값
NAME STATUS ROLES AGE VERSION
docker Ready control-plane,master 30m v1.22.8
kubectl taint node docker node-role.kubernetes.io/master-
### master node 에 untaint를 함으로써 Pod를 master node에도 생성할 수 있다.
taint 된 노드에는 Pod가 생기지 않음