Skip to content

Latest commit

 

History

History
301 lines (244 loc) · 11.3 KB

File metadata and controls

301 lines (244 loc) · 11.3 KB

kubeadm을 이용한 kubernetes 단일 노드 생성

1. 설치 환경

  • vmware 16 player
  • OS : Ubuntu 16.04.7 LTS
  • CPU : 2core
  • RAM : 4GB

2. kubernetes 마스터 노드 생성

1. 패키지 업데이트

# su -
# apt-get update -y && apt-get upgrade -y 

2. Docker 설치

  • 종속 패키지 설치
# sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
  • gpg 키 등록
# curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# echo \
  "deb [arch=$(dpkg --print-architecture) 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-get update
# sudo apt-get install -y docker-ce docker-ce-cli containerd.io
  • kubelet의 cgroup driver 설정
# cat <<EOF | sudo tee /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF

# sudo systemctl enable docker
# sudo systemctl daemon-reload
# sudo systemctl restart docker
  • docker 설치 확인

    • #docker version 등의 명령어로 동작 확인
  • 참고 : docker 명령어 사용자 추가

    • # sudo usermod -aG docker $USER

3. kubeadm, kubelet, kubectl 설치

  • 패키지 update 및 종속 패키지 설치
# sudo apt-get update
# sudo apt-get install -y apt-transport-https ca-certificates curl
  • gpg 키 추가
# 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
# sudo apt-get install -y kubelet kubeadm kubectl
  • 패키지 업데이트 보류
# sudo apt-mark hold kubeadm kubelet kubectl

4. kubernetes 클러스터 생성(마스터 노드)

  • swap off 하기

    • off 명령어 : swapoff -a
    • swap 상태 확인 : swapon -s
      • 출력 내용이 없으면 off 상태
  • kubeamd init

    • 명령어

      • # sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-cert-extra-sans=kube.example.org
      • pod-network-cidr : 이후 추가할 에드온인 Flannel을 위해 추가. 반드시 ip는 10.244.0.0/16으로 설정
      • apiserver-cert-extra-sans : 이후 원격에서 kubectl을 사용하기 위해서 필요
    • 실행 결과

    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 172.31.26.245:6443 --token cml8w5.aem9su86pztp735y \
     --discovery-token-ca-cert-hash sha256:15bd2983695a078b8c664e2aee482692da171881789682871f8bcd898c83e2d4
    
    
  • Flannel Network 애드온 추가

    • coredns가 동작하기 위해서는 network plugin이 필요
    •   # kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
    - 결과 확인 `kubectl get pods -n kube-system`
    - ```console
    NAMESPACE     NAME                             READY   STATUS    RESTARTS   AGE
    kube-system   coredns-5644d7b6d9-c5mn2         1/1     Running   0          8m8s
    kube-system   coredns-5644d7b6d9-s2rwt         1/1     Running   0          8m8s
    kube-system   etcd-ubuntu                      1/1     Running   0          7m1s
    kube-system   kube-apiserver-ubuntu            1/1     Running   0          7m1s
    kube-system   kube-controller-manager-ubuntu   1/1     Running   0          7m4s
    kube-system   kube-flannel-ds-amd64-hwdfq      1/1     Running   0          93s
    kube-system   kube-proxy-fsgmj                 1/1     Running   0          8m8s
    kube-system   kube-scheduler-ubuntu  kub          1/1     Running   0          7m25s
    
  • kubectl 설정

# mkdir -p $HOME/.kube
# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config ## kubectl을 통해 kubernetes 클러스터 접근하기 위해 필요
# sudo chown $(id -u):$(id -g) $HOME/.kube/config
  • master node에 일반 pod를 띄울 수 있도록 untaint 설정 변경
# kubectl taint nodes --all node-role.kubernetes.io/master-
- 참고 : master node에 다시 taint 설정하기
    - ` # kubectl taint nodes master node-role.kubernetes.io=master:NoSchedule `

3. TroubleShooting

1. kubeadm init 에러

  • 발생 로그
[kubelet-check] it seems like the kubelet isn't running or healthy
[kubelet-check] The HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed with error: Get "http://localhost:10248/healthz": dial tcp 127.0.0.1:10248: connect: connection refused.
  • 해결법
    • kubelet log 확인
      • # journalctl -xeu kubelet
    • /etc/docker/daemon.json 작성이 되어 있는지 확인, 없을 시 아래 명령어 실행
      •   # cat <<EOF | sudo tee /etc/docker/daemon.json
        
          {
        
            "exec-opts": ["native.cgroupdriver=systemd"],
        
            "log-driver": "json-file",
        
            "log-opts": {
        
              "max-size": "100m"
        
            },
        
            "storage-driver": "overlay2"
        
          }
        
          EOF
          # systemctl daemon-reload 
          # systemctl restart kubelet
          # 
    • 생성 후 kubeadm reset 및 init, 작동이 안될 시 리부팅 후 다시 실행
      • init 시 추가 명령어는 위에서 실행했던 명령과 동일하게 실행
      • # kubeadm reset
      • # kubeadm init [init 시 추가한 옵션, pod-network-cidr 등]

2. flannel CrashLoopBackOff 에러

  • 발생 에러
  • 로그 확인 방법
    • pod의 내부 로그 확인
      • pod 이름 확인 : kubectl get pod -n kube-system
      • pod의 로그 확인 ``` kubectl logs [확인한 flannel pod 이름] -n kube-system
  • 해결 방법
    • kubeadm init 시에 --pod-network-cidr=10.244.0.0/16을 옵션으로 사용했는지 확인
    • 안했다면 아래 명령어 실행
    # kubeadm reset
    # kubeadm init --pod-network-cidr=10.244.0.0/16

3. Coredns CrashLoopBackOff 에러

  • 발생 에러
NAMESPACE     NAME                             READY   STATUS                 RESTARTS   AGE
kube-system   coredns-5644d7b6d9-c5mn2         0/1     CrashLoopBackOff       1          1m8s
kube-system   coredns-5644d7b6d9-s2rwt         0/1     CrashLoopBackOff       1          1m8s
  • 원인 파악

    • coredns pod 로그 확인
    # kubectl get pod -n kube-system
    # kbuectl logs [coredns pod 이름 중 하나] -n kube-system
    plugin/loop: Loop (127.0.0.1:55953 -> :1053) detected for zone ".", see 
    https://coredns.io/plugins/loop#troubleshooting. Query: "HINFO 4547991504243258144.3688648895315093531."
    • 일반적으로는 CoreDNS의 Query 요청을 127.0.0.1, :: 1 또는 127.0.0.53과 같은 루프백 주소를 통해 자신에게 직접 전달하는 경우에 발생
    • 덜 일반적으로는 CoreDNS는 업스트림 서버로 전달하고 다시 CoreDNS로 요청을 전달합니다.
  • 해결 방법

    • DNS ip 확인 nmcli device show | grep IP4.DNS

    • vi /etc/resolvconf/resolv.conf.d/head에 내용 추가 nameserver <DNS IP>

    • 수정된 resolve.conf 적용

      # sudo resolvconf -u

    • 수정된 /etc/resolve.conf 확인

      # cat resolv.conf

    • coredns roleback

          # kubectl rollout restart -n kube-system deployment/coredns

4. unknown service runtime.v1alpha2.RuntimeService 에러

  • kubeamd init 실행 시 발생
listing containers: rpc error: code = Unimplemented desc = unknown service runtime.v1alpha2.RuntimeService
  • 원인

    • kubernetes에서 실행될 컨테이너 런타임 인터페이스(CRI)가 정확하게 지정되지 않아서 발생하는 에러
  • 해결 방법

    • CRI를 재시작(docker or containerd) 및 설정 삭제
    • docker 및 containerd 서비스 종료
      • # service docker stop
      • # service containerd stop
    • /etc/containerd/config.toml 삭제
      • rm /etc/containerd/config.toml
    • docker 재시작

5. taint "node-role.kubernetes.io/master:" not found

  • kubectl taint nodes --all node-role.kubernetes.io/master- 명령어 실행 시 발생

  • 원인 : master 노드가 존재 하지 않아 taint 명령어가 실행되지 않음

  • 해결 방법

    • kubectl get node를 통해 node의 이름을 확인

      NAME     STATUS   ROLES           AGE   VERSION
      aiuser   Ready    control-plane   17h   v1.24.0
    • kubectl describe node <nodename> | grep Taints 를 통해 taint 상태를 확인

      Taints:             node-role.kubernetes.io/control-plane:NoSchedule
    • 다음과 같이 taint에 있는 :Noschedule 대신 -를 명령어에 포함하여 taint 명령어 실행. kubectl taint nodes --all node-role.kubernetes.io/control-plane-

참고