Amazon Linux 2에 Kubernetes 1.26 설치 (2) - 노드 조인
앞선 Amazon Linux 2에 Kubernetes 1.26 설치 (1) 문서 에서는 Control Plane에서 kubectl 명령어가 동작하는 것 까지를 목표로 두었었다면, 이번 문서에서는 클러스터에 노드들을 조인시켜 실질적으로 k8s의 리소스들을 생성할 수 있도록 할 것입니다.
설치의 마무리
- 파드 네트워크 애드온 설치
파드간의 통신 기능을 활성화하기 위해 CNI(Container Network Interface) 기반의 파드 네트워크 애드온이 설치되어 있어야합니다.
[root@minhangk8s-01 ~]# kubectl get all --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system pod/coredns-787d4945fb-795w5 0/1 Pending 0 8h
kube-system pod/coredns-787d4945fb-rdbgd 0/1 Pending 0 8h
kube-system pod/etcd-minhangk8s-01 1/1 Running 0 8h
kube-system pod/kube-apiserver-minhangk8s-01 1/1 Running 0 8h
kube-system pod/kube-controller-manager-minhangk8s-01 1/1 Running 0 8h
kube-system pod/kube-proxy-9g26b 1/1 Running 0 8h
kube-system pod/kube-scheduler-minhangk8s-01 1/1 Running 0 8h
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 8h
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 8h
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
kube-system daemonset.apps/kube-proxy 1 1 1 1 1 kubernetes.io/os=linux 8h
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE
kube-system deployment.apps/coredns 0/2 2 0 8h
NAMESPACE NAME DESIRED CURRENT READY AGE
kube-system replicaset.apps/coredns-787d4945fb 2 2 0 8h
-> 기본 설치만 마무리된 상태에서는 아직 네트워크가 제대로 활성화 되지 않아 coredns가 기동되지 못하고 0/2 상태인 것을 확인할 수 있습니다.
CNI 플러그인은 종류가 다양하긴한데, 여기서는 Flannel이라는 프로그램을 이용할 것입니다.
[root@minhangk8s-01 ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
namespace/kube-flannel created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created
-> Flannel 설치. 명령어도 간단하고 설치도 금새 끝납니다.
- Flannel 설치 완료 확인
[root@minhangk8s-01 ~]# kubectl get all --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-flannel pod/kube-flannel-ds-5twqd 1/1 Running 0 59s
kube-system pod/coredns-787d4945fb-795w5 1/1 Running 0 8h
kube-system pod/coredns-787d4945fb-rdbgd 1/1 Running 0 8h
kube-system pod/etcd-minhangk8s-01 1/1 Running 0 8h
kube-system pod/kube-apiserver-minhangk8s-01 1/1 Running 0 8h
kube-system pod/kube-controller-manager-minhangk8s-01 1/1 Running 0 8h
kube-system pod/kube-proxy-9g26b 1/1 Running 0 8h
kube-system pod/kube-scheduler-minhangk8s-01 1/1 Running 0 8h
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 8h
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 8h
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
kube-flannel daemonset.apps/kube-flannel-ds 1 1 1 1 1 <none> 59s
kube-system daemonset.apps/kube-proxy 1 1 1 1 1 kubernetes.io/os=linux 8h
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE
kube-system deployment.apps/coredns 2/2 2 2 8h
NAMESPACE NAME DESIRED CURRENT READY AGE
kube-system replicaset.apps/coredns-787d4945fb 2 2 2 8h
- 새로이 kube-flannel이라는 리소스가 확인 됩니다.
- coredns도
kube-system deployment.apps/coredns 2/2
로 정상적으로 떠있는 것으로 확인 됩니다.
- 각 노드들에 kubelet, kubeadm, kubectl 설치 클러스터에 참여할 노드들에도 kubeadm 명령을 사용해야 됩니다. 일단 Amazon Linux 2에 Kubernetes 1.26 설치 (1) 문서 참고하여 설치 진행합니다.
- 단,
kubeadm init
은 하지 않습니다. ControlPlane에서는 init을 하지만, 개별 노드들은 ControlPlane에 join합니다. - 따라서 사용되는 설치 명령어는 아래 만큼입니다.
cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.26/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.26/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
systemctl enable --now kubelet
yum install -y tc
modprobe br_netfilter
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
echo 1 > /proc/sys/net/ipv4/ip_forward
yum install -y containerd
containerd config default | tee /etc/containerd/config.toml
vi /etc/containerd/config.toml
/SystemdCgroup
SystemdCgroup = true
systemctl enable --now containerd
echo "export KUBECONFIG=/etc/kubernetes/kubelet.conf" >> ~/.bash_profile
source ~/.bash_profile
-> 한번 설치 진행해본 뒤라 확인하는 명령어들은 제거하고, 설치 변경하는 명령어만 넣었습니다.
-> 그 외에, 딱 하나 달라진 명령어가 있는데, export KUBECONFIG=/etc/kubernetes/admin.conf
를 export KUBECONFIG=/etc/kubernetes/kubelet.conf
으로 변경했습니다. 개별 노드들은 admin 권한이 아니기 때문에 일반 계정용 conf파일에 연결했습니다.
-> 하지만 아직 join 전이라 명령어 수행 결과가 떨어지지는 않습니다.
[root@minhangk8s-02 ~]# kubectl get all
W1025 06:06:12.173910 41065 loader.go:222] Config not found: /etc/kubernetes/kubelet.conf
E1025 06:06:12.174380 41065 memcache.go:265] couldn't get current server API group list: Get "http://localhost:8080/api?timeout=32s": dial tcp 127.0.0.1:8080: connect: connection refused
E1025 06:06:12.174554 41065 memcache.go:265] couldn't get current server API group list: Get "http://localhost:8080/api?timeout=32s": dial tcp 127.0.0.1:8080: connect: connection refused
E1025 06:06:12.175920 41065 memcache.go:265] couldn't get current server API group list: Get "http://localhost:8080/api?timeout=32s": dial tcp 127.0.0.1:8080: connect: connection refused
E1025 06:06:12.176070 41065 memcache.go:265] couldn't get current server API group list: Get "http://localhost:8080/api?timeout=32s": dial tcp 127.0.0.1:8080: connect: connection refused
E1025 06:06:12.177711 41065 memcache.go:265] couldn't get current server API group list: Get "http://localhost:8080/api?timeout=32s": dial tcp 127.0.0.1:8080: connect: connection refused
The connection to the server localhost:8080 was refused - did you specify the right host or port?
-> 아직은 kubectl 명령어 에러 발생
클러스터 Join
현재 단계에서는 2,3번 노드에 설치만 진행했을 뿐 아직 클러스터에 참여된 것은 아닙니다. 따라서 1번 노드(=ControlPlane)에서 아래와 같이 노드 정보를 조회해보면 1개 노드만 확인됩니다.
[root@minhangk8s-01 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
minhangk8s-01 Ready control-plane 8h v1.26.10
-
Join 명령어 확인 이제 2,3번 노드에서 kubeadm join 명령을 수행해줘야 하는데, 해당 명령어는 1번 노드에서 kubeadm init 했을 때에 화면에 출력되었던 결과입니다.
discovery-token-ca-cert-hash 값은 다른 노드 가입시 사용해야 하므로 잘 저장해두어야 합니다.
라며 언급했던 부분입니다. -
2번 노드에서 Join 수행
[root@minhangk8s-02 ~]# kubeadm join 192.168.100.61:6443 --token g2veat.u59md2i64tn12f71 \
> --discovery-token-ca-cert-hash sha256:0c16e7ea8aa0142a482744df184d9f2282ed6070239af64b2e460dbf889108cd
[preflight] Running pre-flight checks
[WARNING Hostname]: hostname "minhangk8s-02" could not be reached
[WARNING Hostname]: hostname "minhangk8s-02": lookup minhangk8s-02 on 168.126.63.1:53: no such host
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Starting the kubelet
[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...
This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.
Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
-> 기존에 저장해두었던 토큰값을 이용하여 join 명령을 수행합니다.
[root@minhangk8s-01 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
minhangk8s-01 Ready control-plane 8h v1.26.10
minhangk8s-02 Ready <none> 49s v1.26.10
-> 1번 노드에서 다시 확인해 봤습니다. 2번노드가 클러스터에 참여된 것을 확인할 수 있습니다.
- 3번 노드에서 Join 수행 마찬가지로 3번 노드도 join 진행합니다.
[root@minhangk8s-03 ~]# kubeadm join 192.168.100.61:6443 --token g2veat.u59md2i64tn12f71 \
> --discovery-token-ca-cert-hash sha256:0c16e7ea8aa0142a482744df184d9f2282ed6070239af64b2e460dbf889108cd
[preflight] Running pre-flight checks
[WARNING Hostname]: hostname "minhangk8s-03" could not be reached
[WARNING Hostname]: hostname "minhangk8s-03": lookup minhangk8s-03 on 168.126.63.1:53: no such host
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Starting the kubelet
[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...
This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.
Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
-> 3번노드 join 완료.
[root@minhangk8s-03 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
minhangk8s-01 Ready control-plane 9h v1.26.10
minhangk8s-02 Ready <none> 18m v1.26.10
minhangk8s-03 Ready <none> 16m v1.26.10
-> 또한 설정이 다 완료 되었으므로, 굳이 1번 노드에서 확인할 필요 없이 2,3번 노드에서 바로 kubectl 명령어로 확인도 가능합니다. join하기 전에는 에러 났었던 명령어입니다.
No Comments