Skip to main content

Amazon Linux 2에 Kubernetes 1.26 설치 (2) - 노드 조인

앞선 Amazon Linux 2에 Kubernetes 1.26 설치 (1) 문서 에서는 Control Plane에서 kubectl 명령어가 동작하는 것 까지를 목표로 두었었다면, 이번 문서에서는 클러스터에 노드들을 조인시켜 실질적으로 k8s의 리소스들을 생성할 수 있도록 할 것입니다.

설치의 마무리

(참조 문서: https://v1-26.docs.kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/)

  1. 파드 네트워크 애드온 설치
    파드간의 통신 기능을 활성화하기 위해 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 설치. 명령어도 간단하고 설치도 금새 끝납니다.

 

  1. 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 로 정상적으로 떠있는 것으로 확인 됩니다.
  1. 각 노드들에 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.confexport 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
  1. Join 명령어 확인 이제 2,3번 노드에서 kubeadm join 명령을 수행해줘야 하는데, 해당 명령어는 1번 노드에서 kubeadm init 했을 때에 화면에 출력되었던 결과입니다.
    discovery-token-ca-cert-hash 값은 다른 노드 가입시 사용해야 하므로 잘 저장해두어야 합니다. 라며 언급했던 부분입니다.

  2. 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번노드가 클러스터에 참여된 것을 확인할 수 있습니다.

 

  1. 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하기 전에는 에러 났었던 명령어입니다.