[카테고리:] K8s

  • K8s 에서 Container Registry 접근하기 위한 설정 가이드

    K8s 에서 Container Registry 접근하기 위한 설정 가이드

    환경구성

    • Docker 설치
    • K8s 설치
      • CNI 설치
    kubectl create secret docker-registry registry-name \
      --docker-server=REGISTRY-URL \
      --docker-username= \
      --docker-password= \
      --docker-email=example@example.com # 이메일은 아무거나 넣어도 상관없다

  • K8s Rocky Linux 8 설치가이드

    K8s Rocky Linux 8 설치가이드

    설치

    먼저, docker를 먼저 설치하고, k8s 설치 바람.

    쿠버네티스 버전 1.24.0 이전이면, 도커와 쿠버네티스가 연동되는 dockershim이 있었지만, 1.24.0 버전 이후에는 따로 설정을 해줘야 함.

    docker를 설치한 후,

    도커 데몬 설정

    #/etc/docker 디렉토리 없을 경우 생성
    sudo mkdir /etc/docker
    
    #daemon.json 파일 추가
    sudo 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

    cgroup(runc) 옵션 설정

    #containerd 구성 파일 생성
    sudo mkdir -p /etc/containerd
    
    #containerd 기본 설정값으로 config.toml 생성
    sudo containerd config default | sudo tee /etc/containerd/config.toml
    
    #config.toml 파일 수정
    vi /etc/containerd/config.toml
    
    # cgroup driver(runc) 사용하기 설정
    [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
      SystemdCgroup = true
    
    #수정사항 적용 및 재실행
    sudo systemctl restart containerd

    docker 재시작

    #도커 재시작
    sudo service docker restart
    
    #도커 상태 조회
    sudo service docker status

    CentOS

    1) Swap disabled
    swapoff -a && sed -i '/swap/s/^/#/' /etc/fstab
    
    2) Letting iptables see bridged traffic
    # cat <<EOF > /etc/sysctl.d/k8s.conf
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    EOF
    # sysctl --system
    
    3) Disable firewall
    # systemctl stop firewalld 
    # systemctl disable firewalld
    
    4) Set SELinux in permissive mode (effectively disabling it)
    # setenforce 0
    # sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
    
    5) kubeadm, kubelet, kubectl 설치.
    cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
    [kubernetes]
    name=Kubernetes
    baseurl=https://pkgs.k8s.io/core:/stable:/v1.27/rpm/
    enabled=1
    gpgcheck=1
    gpgkey=https://pkgs.k8s.io/core:/stable:/v1.27/rpm/repodata/repomd.xml.key
    exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
    EOF
    
    6) install.
    sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
    sudo systemctl enable --now kubelet

    master node에서만 실행

    kubeadm init

    여기서 error동작 없으면, 정상임.

    mkdir -p $HOME/.kube
      sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
      sudo chown $(id -u):$(id -g) $HOME/.kube/config

    입력 후, kubectl get nodes 실행


    관리자 계정으로 실행하려면..

    $ mkdir -p $HOME/.kube
    $ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    $ sudo chown $(id -u):$(id -g) $HOME/.kube/config
  • K8s CNI(Container Network Interface) 설정

    K8s CNI(Container Network Interface) 설정

    CNI(Container Network Interface) 설정

    컨테이너 간의 네트워크를 제어할 수 있는 플러그인으로 컨테이너 런타임에서 컨테이너의 네트워크를 사용하게 해주는 인터페이스이다.

    쿠버네티스에서 사용되는 Pod들은 기본적으로 오버레이 네트워크 방식을 적용하여 엔드포인트 간의 네트워크 구조를 추상화하여 네트워크 통신 경로를 단순화한다. 이때 사용되는 플러그인 마다 설정 방법이 다르다.

    master-node 에만,

    curl https://calico-v3-25.netlify.app/archive/v3.25/manifests/calico.yaml -O

    yaml 파일 다운 받은 후, 적용

    kubectl apply -f calico.yaml
  • Kubernetes 워커 노드 설정

    Kubernetes 워커 노드 설정

    🧱 worker node 구성

    마스터 노드에서 kubeadm init 을 통해 생성한 join 명령어를 이용하여 워커 노드 등록

    sudo kubeadm join [ip]:6443 --token [토큰명] --discovery-token-ca-cert-hash [hashkey]

  • Kubernetes 마스터 및 워커 노드 설정 가이드 – ubuntu 22.04

    Kubernetes 마스터 및 워커 노드 설정 가이드 – ubuntu 22.04

    🫆 [공통] Master Node, Worker Node

    📌 ufw 서비스 중지

    ufw : ubuntu 방화벽 서비스.

    # ufw 서비스 중지.
    sudo systemctl stop ufw
    
    # ufw 서비스 자동 실행 중지.
    sudo systemctl disable ufw

    📌 swap 기능 비활성화

    • swap 기능을 비활성화 하는 이유.
    1. 노드 리소스 예측 : 노드의 CPU, 메모리 등의 자원을 효율적으로 사용하도록 설계. SWAP 메모리 사용 시 메모리 사용량 예측하기 어려움.
    2. Qos 보장 : 메모리 제한에 도달한 Pod가 Swap을 사용하게 되면, Swap 공간이 부족할 경우 프로세스가 종료될 수 있음.
    3. 성능저하 : 디스크 I/O가 증가하여 성능 저하 가능.

    # Swap 끄기.
    sudo swapoff -a
    
    # swap 자동 마운트 끄기.
    sudo vi /etc/fstab
    # /swap ...   주석처리

    📌 hosts 에 노드 정보 추가

    vi /etc/hosts
    
    # 마스터 및 워커 노드 노드 정보 추가.
    # 0.0.0.0에 해당한 IP 넣기.
    
    0.0.0.0 k8s-master-node
    0.0.0.0 k8s-worker-node-01
    0.0.0.0 k8s-worker-node-02

    🐳 Docker 설치

    # 필수 패키지 설치
    sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release
    
    # docker 공식 GPG 키 추가
    sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
    
    # docker 저장소 추가
    echo "deb [arch=amd64 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 update -y
    sudo apt upgrade -y
    sudo apt install docker-ce -y

    🛟 K8s 설치

    # 시스템 기본 설정.
    sudo apt update && sudo apt upgrade -y
    sudo apt install -y curl apt-transport-https gnupg ca-certificates
    
    # 컨테이너 런타임 설치.
    sudo apt install -y containerd
    # 설정파일 생성.
    sudo mkdir -p /etc/containerd
    containerd config default | sudo tee /etc/containerd/config.toml
    # systemdcgroup 활성화.
    sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
    
    # 재시작
    sudo systemctl restart containerd
    sudo systemctl enable containerd
    
    # k8s 설치.
    sudo mkdir -p /etc/apt/keyrings
    
    curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | \
      sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
    
    echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] \
      https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /" | \
      sudo tee /etc/apt/sources.list.d/kubernetes.list > /dev/null
    
    # 설치.
    sudo apt update
    sudo apt install -y kubelet kubeadm kubectl
    sudo apt-mark hold kubelet kubeadm kubectl

    🧱 K8s 추가설정

    # IP 포워딩 활성
    echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
      
    # 변경 사항 적용
    sudo sysctl -p
    
    # br_netfilter 모듈 로드 (Kubernetes 및 기타 컨테이너 런타임이 브리지된 네트워크 트래픽을 올바르게 처리할 수 있도록 함)
    sudo modprobe br_netfilter
    
    # container.d 초기 설정 파일 생성
    sudo bash -c "containerd config default > /etc/containerd/config.toml"
    
    # systemd를 Cgroup 드라이버로 사용하는 설정
    sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
    
    # crictl 설정 파일
    cat <<EOF | sudo tee -a /etc/crictl.yml
    runtime-endpoint: unix:///var/run/containerd/containerd.sock
    image-endpoint: unix:///var/run/containerd/containerd.sock
    timeout: 10
    debug: true
    EOF
    
    # container.d 재시작
    sudo systemctl restart containerd 
    
    # 시스템 부팅시 자동으로 시작하도록 설정
    sudo systemctl enable containerd

    🫆 Master Node 초기화

    TIP: IP 자동 설정 명령어

    sudo kubeadm init \
      --pod-network-cidr=10.244.0.0/16 \
      --apiserver-advertise-address=$(hostname -I | awk '{print $1}') \
      --cri-socket=unix:///var/run/containerd/containerd.sock
    # --pod-network-cidr는 생성될 pod들의 네트워크 주소(subnet Mask 255.255.0.0)
    # --apiserver-advertise-address는 마스터노드의 IP 주소
    
    sudo kubeadm init --pod-network-cidr=10.10.0.0/16 --apiserver-advertise-address=192.168.0.0 --cri-socket=unix:///var/run/containerd/containerd.sock
    
    [생략]
    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 192.168.0.0:6443 --token 123456.1234567890123456 \
     --discovery-token-ca-cert-hash sha256:d7a9fc38cd353b4803c63873bbad3fc1bbf5cfab44e678363e7699e930c99bc7
    
    # kubernetes 인증 정보 복사
    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
    
    # 설치 확인
    kubectl get pods --all-namespaces

    📦 Calico 설치 — Master Node

    • Calico : Network CNI 플러그인 중 하나
    # CRD번들 크기가 크기 때문에 kubectl apply , replace 대신 create 사용해야 에러가 발생하지 않음
    kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.28.1/manifests/tigera-operator.yaml
    
    # custom-resources.yaml 파일 다운로드
    curl -O https://raw.githubusercontent.com/projectcalico/calico/v3.28.1/manifests/custom-resources.yaml
    
    # cidr 정보 변경 (--pod-network-cidr 인 10.10.0.0/16로 변경)
    vi custom-resources.yaml
    
    # 변경한 내용으로 생성
    kubectl create -f custom-resources.yaml
    
    
    # 설치 확인하기 (coredNS의 상태가 Pending에서 Running으로 변경됨)
    kubectl get pod -A
    NAMESPACE          NAME                                      READY   STATUS    RESTARTS   AGE
    calico-apiserver   calico-apiserver-68467b4b9d-lr6lg         1/1     Running   0          3m32s
    calico-apiserver   calico-apiserver-68467b4b9d-ltlgn         1/1     Running   0          3m32s
    calico-system      calico-kube-controllers-5c85f7b95-8kgtb   1/1     Running   0          4m37s
    calico-system      calico-node-9lxpl                         1/1     Running   0          4m38s
    calico-system      calico-typha-b9b589dc7-9b64q              1/1     Running   0          4m38s
    calico-system      csi-node-driver-ztrgm                     2/2     Running   0          4m37s
    kube-system        coredns-7db6d8ff4d-8n6xt                  1/1     Running   0          25m
    kube-system        coredns-7db6d8ff4d-rdlwq                  1/1     Running   0          25m
    kube-system        etcd-k8s-master                           1/1     Running   0          25m
    kube-system        kube-apiserver-k8s-master                 1/1     Running   0          25m
    kube-system        kube-controller-manager-k8s-master        1/1     Running   0          25m
    kube-system        kube-proxy-pdcsj                          1/1     Running   0          25m
    kube-system        kube-scheduler-k8s-master                 1/1     Running   0          25m
    tigera-operator    tigera-operator-77f994b5bb-72lnv          1/1     Running   0          5m40s

    📦 Worker Node 추가

    # 기존 token 확인 
    kubeadm token list
    
    # 토큰 생성 (유효기간 : 24H)
    kubeadm token create 
    
    # 토큰 유효기간 설정하여 생성
    kubeadm token create --ttl 48h
    
    #  --discovery-token-ca-cert-hash 값 추출하기
    openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
    
    # 워커 노드 추가하기
    sudo kubeadm join 192.168.91.100:6443 --token 123456.1234567890123456 --discovery-token-ca-cert-hash sha256:d7a9fc38cd353b4803c63873bbad3fc1bbf5cfab44e678363e7699e930c99bc7
    
    # master 노드의 인증 정보 파일(~/.kube/config) 복사
    mkdir -p $HOME/.kube
    scp sppolo@192.168.91.100:/home/sppolo/.kube/config /home/sppolo/.kube
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
    

    🧱 선택사항 ➡️ Dashboard 설치

    # dashboard  manifests 다운로드
    curl -O https://raw.githubusercontent.com/kubernetes/dashboard/v2.6.1/aio/deploy/recommended.yaml
    
    # dashboard manifests 수정 (Service타입을 ClusterIP -> NodePort로 변경)
    vi recommended.yaml
    
    kind: Service
    apiVersion: v1
    metadata:
      labels:
        k8s-app: kubernetes-dashboard
      name: kubernetes-dashboard
      namespace: kubernetes-dashboard
    spec:
      ports:
        - port: 443
          targetPort: 8443
          nodePort: 32000           # 외부 접근 포트 설정
      selector:
        k8s-app: kubernetes-dashboard
      type: NodePort                # 외부 접근 가능하도록 NodePort로 변경
    
    # 마스터 노드에 파드 설치하도록 설정 변경 (taint 제거)
    kubectl taint nodes k8s-master node-role.kubernetes.io/control-plane:NoSchedule-
    
    # dashboard 설치
    kubectl create -f recommended.yaml
    
    # 원복 (마스터노드에 파드 설치X)
    kubectl taint nodes k8s-master node-role.kubernetes.io/control-plane:NoSchedule
    
    # dashboard admin 계정 생성
    kubectl create serviceaccount admin -n kubernetes-dashboard
    
    # admin 계정에 클러스터 관리자 권한 부여
    kubectl create clusterrolebinding admin-binding --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:admin
    
    # dashboard admin토큰 생성
    kubectl -n kubernetes-dashboard create token admin
    
    # dashboard 접속하기
    https://192.168.91.100:32000
  • K8s openreplay 명령어

    K8s openreplay 명령어

    # postgresql
    
    kubectl exec -it postgresql-0 -n db -- psql -U postgres
    
    # K8s 포트포워딩
    kubectl port-forward svc/postgresql 5432:5432 -n db

  • 일반 사용자 계정에서 Kubectl 설정하기

    일반 사용자 계정에서 Kubectl 설정하기

    🧱 일반 사용자 계정에서도 Kubectl 명령어 사용하기

    root 계정으로 접속 후, 다음을 실행.

    sudo mkdir -p /home/ubuntu/.kube
    sudo cp -i /etc/kubernetes/admin.conf /home/ubuntu/.kube/config
    sudo chown ubuntu:ubuntu /home/ubuntu/.kube/config

  • Kubernetes 설치 및 설정 가이드 – Ubuntu 22.04

    Kubernetes 설치 및 설정 가이드 – Ubuntu 22.04

    📌 ufw 서비스 중지

    • ufw : ubuntu 방화벽 서비스.
    ufw : ubuntu 방화벽 서비스.
    # ufw 서비스 중지.
    sudo systemctl stop ufw
    
    # ufw 서비스 자동 실행 중지.
    sudo systemctl disable ufw

    📌 swap 기능 비활성화

    • swap 기능을 비활성화 하는 이유.
    1. 노드 리소스 예측 : 노드의 CPU, 메모리 등의 자원을 효율적으로 사용하도록 설계. SWAP 메모리 사용 시 메모리 사용량 예측하기 어려움.
    2. Qos 보장 : 메모리 제한에 도달한 Pod가 Swap을 사용하게 되면, Swap 공간이 부족할 경우 프로세스가 종료될 수 있음.
    3. 성능저하 : 디스크 I/O가 증가하여 성능 저하 가능.
    # Swap 끄기.
    sudo swapoff -a
    
    # swap 자동 마운트 끄기.
    sudo vi /etc/fstab
    # /swap ...   주석처리

    🐳 Docker 설치

    # docker install
    
    
    apt update
    
    apt install docker.io

    🛟 K8s 설치

    # 시스템 기본 설정.
    sudo apt update && sudo apt upgrade -y
    sudo apt install -y curl apt-transport-https gnupg ca-certificates
    
    # 컨테이너 런타임 설치.
    sudo apt install -y containerd
    # 설정파일 생성.
    sudo mkdir -p /etc/containerd
    containerd config default | sudo tee /etc/containerd/config.toml
    # systemdcgroup 활성화.
    sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
    
    # 재시작
    sudo systemctl restart containerd
    sudo systemctl enable containerd
    
    # k8s 설치.
    sudo mkdir -p /etc/apt/keyrings
    
    curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | \
      sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
    
    echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] \
      https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /" | \
      sudo tee /etc/apt/sources.list.d/kubernetes.list > /dev/null
    
    # 설치.
    sudo apt update
    sudo apt install -y kubelet kubeadm kubectl
    sudo apt-mark hold kubelet kubeadm kubectl
    

    K8s 추가 설정

    # IP 포워딩 활성
    echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
      
    # 변경 사항 적용
    sudo sysctl -p
    
    # br_netfilter 모듈 로드 (Kubernetes 및 기타 컨테이너 런타임이 브리지된 네트워크 트래픽을 올바르게 처리할 수 있도록 함)
    sudo modprobe br_netfilter
    
    # container.d 초기 설정 파일 생성
    sudo bash -c "containerd config default > /etc/containerd/config.toml"
    
    # systemd를 Cgroup 드라이버로 사용하는 설정
    sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
    
    # crictl 설정 파일
    cat <<EOF | sudo tee -a /etc/crictl.yml
    runtime-endpoint: unix:///var/run/containerd/containerd.sock
    image-endpoint: unix:///var/run/containerd/containerd.sock
    timeout: 10
    debug: true
    EOF
    
    # container.d 재시작
    sudo systemctl restart containerd 
    
    # 시스템 부팅시 자동으로 시작하도록 설정
    sudo systemctl enable containerd

    Reference

    Crictl에 대한 K8s 공식 문서


    🧱 Node 초기화

    # --pod-network-cidr는 생성될 pod들의 네트워크 주소(subnet Mask 255.255.0.0)
    # --apiserver-advertise-address는 마스터노드의 IP 주소
    
    sudo kubeadm init --pod-network-cidr=10.10.0.0/16 --apiserver-advertise-address=192.168.0.0 --cri-socket=unix:///var/run/containerd/containerd.sock
    
    [생략]
    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 192.168.0.0:6443 --token 123456.1234567890123456 \
     --discovery-token-ca-cert-hash sha256:d7a9fc38cd353b4803c63873bbad3fc1bbf5cfab44e678363e7699e930c99bc7
    
    # kubernetes 인증 정보 복사 (User에서 실행)
    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
    
    # 설치 확인
    kubectl get pods --all-namespaces

    🧱 Calico CNI 설치

    # CRD번들 크기가 크기 때문에 kubectl apply , replace 대신 create 사용해야 에러가 발생하지 않음
    kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.28.1/manifests/tigera-operator.yaml
    
    # custom-resources.yaml 파일 다운로드
    curl -O https://raw.githubusercontent.com/projectcalico/calico/v3.28.1/manifests/custom-resources.yaml
    
    # cidr 정보 변경 (--pod-network-cidr 인 10.10.0.0/16로 변경)
    vi custom-resources.yaml
    
    # 변경한 내용으로 생성
    kubectl create -f custom-resources.yaml