현재 상태
각 노드에서 가상메모리를 사용하지 않는다.
모든 노드의 일관성을 유지하기위해 k8s에서는 가상 메모리 사용을 하지 못하도록 한다.
노드 실행시마다 자동으로 가상메모리 사용을 못하도록 하고싶다면? /etc/fstab의 마지막줄 /swap 관련 내용을 주석처리
#/swapfile none swap sw 0 0
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF > /etc/apt/sources.list.d/kubernetes.list
deb http://apt.kubernetes.io/ kubernetes-xenial main
EOF
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
systemctl daemon-reload
systemctl restart kubelet
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
master에서 토큰 발행 - 클러스터 실행
root에서 작업하기 위해 모든 노드에서
su
# test123
cd
[master]
kubeadm init --apiserver-advertise-address 211.183.3.100
또는
kubeadm init
master에 apiserver가 들어가고, apiserver는 스케쥴러, 컨트롤러, etcd와 연결되어 있으며 api는 각 노드(worker)의 kubelet과 연결을 한다.
init까지만 써도 지금은 인터페이스가 하나기때문에 입력하지 않아도 되긴함(default로)
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
admin.conf : 관리자를 위한 설정값 들어있음
export KUBECONFIG=/etc/kubernetes/admin.conf # export 전역변수
현재 사용자가 쿠버네티스의 어드민 계정에 대한 설정 내용이 포함된 파일을 관리할 수 있다. → 현재 사용자가 쿠버네티스 관리자로 등록된다
*내일 오전에 재부팅한 뒤 kubectl 이용해 클러스터에 대한 명령을 실행하는데 오류가 발생한다면 export~를 다시 입력해주어야 한다.
또는 KUBECONFIG=/etc/kubernetes/admin.conf를 처음 실행 시 자동으로 실행될 수 있도록 .bashrc에 등록해둔다.
KUBECONFIG는 service의 정보를 누구로 할 것인지 파일을 지정하는 변수
/etc/kubernetes/admin.conf → 쿠버네티스 전체 관리자 admin
kubeadm join 211.183.3.100:6443 --token gko962.mkl1pj8vn8dw5vgy \
--discovery-token-ca-cert-hash sha256:9eefa379e1e9c2032199910f4f8fe7e58b926467f5dd11ba666190b7e1bc5677
나온 토큰값을 worker1,2,3에 붙여넣기
root@manager:/home/user1# kubectl get node
NAME STATUS ROLES AGE VERSION
manager NotReady control-plane,master 9m8s v1.21.0
worker1 NotReady <none> 21s v1.21.0
worker2 NotReady <none> 20s v1.21.0
worker3 NotReady <none> 19s v1.21.0
docker login
오버레이를 위한 애드온 중 calico를 설치
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
calico 가 아닌 weave net을 사용하고자 하는 경우에는 아래와 같이 설치한다.
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version
| base64 | tr -d '\n')"
root@manager:/home/user1# kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-867d8d6bd8-78m76 0/1 Pending 0 88s
calico-node-fj4nh 0/1 Init:0/3 0 88s
calico-node-fr246 0/1 Init:0/3 0 88s
calico-node-jf5s8 0/1 Init:0/3 0 88s
calico-node-qgghs 0/1 Init:0/3 0 88s
coredns-558bd4d5db-g7k27 0/1 Pending 0 12m
coredns-558bd4d5db-kt4p2 0/1 Pending 0 12m
etcd-manager 1/1 Running 0
...
kube-proxy-6wbj5 1/1 Running 0 18m
kube-proxy-9w5th 1/1 Running 0 27m
kube-proxy-p4hwr 1/1 Running 0 18m
kube-proxy-qbxq7 1/1 Running 0 18m
kube-scheduler-manager 1/1 Running 0 27m
시간이 지나 설치되면 0→1로 바뀌게 되는데 설치 후 kubectl get node를 실행하면 상태가 바뀐다.
pod가 예를들어 nfs로 나가고싶다면 직접 나갈 수없고 kube-proxy를 통해 나갈 수 있다.
pod간 통신을 위해서는 네트워크 플러그인이 필요하다. 일반적으로 CNI로 구성. 여기서 사용한 것이 Calico
manager에 있는 api, 스케쥴러, 컨트롤러 등은 모두 pod형태로 생성되어 서비스를 제공한다. 또한 coreDNS, calico도 pod형태로 서비스가 제공된다. 따라서 이미지 다운로드 → Pod 생성 의 단계를 거쳐야한다.
만약, 리셋하고 다시 시작하고 싶다면 kubeadm reset → kubeadm init
노드에 생성된 각각의 포드는 별도의 독립적인 주소와 이에 해당하는 도메인 이름이 할당된다. 우리는 이 정보가 저장된 coreDNS를 통해 통신시킬 수 있다.