arrow-left

All pages
gitbookPowered by GitBook
1 of 8

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

스토리지 서버 설치

hashtag
고려사항

  • 방화벽 TCP/UDP 2049 포트 InBound/OutBound를 오픈합니다.

hashtag
스토리지 서버 설치

  • cubectl.toml을 수정합니다.

  • cubectl create 를 실행합니다.

$ vi config/cubectl.toml

[shared-storage]
install = true
storage-ip = "192.168.11.7"
private-ip = "172.16.11.7"
#volume-dir = "/data/storage"
#nfs_version = "4.1"
$ sudo bin/cubectl create -p ~/.ssh/id_rsa -u cocktail

IP로 설치된 Private-Registry(harbor) 도메인 수동 적용

hashtag
가정

  • Private Registry, Control plane, Worker nodes는 Ubuntu20.04 환경에서 구성됩니다.

  • 쿠버네티스 버전은 v1.26 입니다.

  • 이미지 레지스트리 주소를 192.168.77.154 에서 regi.acornsoft.io 로 변경합니다.

IP
도메인

hashtag
Private Registry 작업

hashtag
Private Registry IP 변경 및 디렉토리 생성

  • openssl.conf 파일에 도메인을 추가합니다.

  • 도메인 디렉토리를 생성합니다.

hashtag
Private Registry 설정 파일 변경

  • harbor.yml의 hostname을 IP에서 도메인으로 변경합니다.

hashtag
변경사항 반영

  • install.sh 스크립트를 실행하여 변경 사항을 적용합니다.

  • install.sh 스크립트를 실행하는 대신 harbor 환경변수를 수정하고 harbor를 재시작해도 변경사항이 반영됩니다.

hashtag
Node 작업

hashtag
공통 작업(Control plane, Worker nodes)

hashtag
Private Registry IP 변경사항을 node에 반영

  • /etc/containerd/certs.d에 도메인 디렉토리를 생성한 후, /etc/containerd/certs.d/192.168.77.154/hosts.toml 파일을 복사합니다.

  • /etc/containerd/certs.d/regi.acornsoft.io/hosts.toml의 IP를 도메인으로 변경합니다.

  • /etc/containerd/config.toml의 IP를 도메인으로 변경합니다.

  • containerd를 재시작합니다.

  • IP 인증서는 더이상 사용하지 않으므로 hosts.toml 파일에서 ca라인을 삭제합니다.

  • Addon, Coredns, Static Pods 및 기타 yaml파일에 대한 IP 주소를 도메인으로 변경합니다.

  • 패키지 저장소 주소를 도메인으로 변경합니다.

  • /etc/docker/certs.d/ 에 도메인 디렉토리를 생성합니다.

hashtag
Control-plane 추가 작업

  • control-plane 에서는 calico와 metrics server를 업데이트하는 작업을 추가로 해줍니다.

  • kube-proxy daemonset 이미지 주소를 도메인으로 변경합니다.

  • coredns deployment 이미지 주소를 도메인으로 변경합니다.

  • kubelet을 재시작해줍니다.

hashtag
확인

  • 컨테이너 이미지를 확인합니다. 이미지가 모두 올라오기까지 몇 분 소요될 수 있습니다.


참고: Private Registry IP를 새로운 서버의 IP로 변경하는 경우에는 cubectl update 명령서를 사용하십시오.

버전 업그레이드

hashtag
고려사항

  • 네트워크 연결 불안정, 노드 다운, 리소스 부족, 스케줄링 문제 등으로 업그레이드가 실패할 경우가 발생할 수 있으므로 서비스 무중단 운영 중 실시간 업그레이드를 권장하지 않습니다.

192.168.77.154

regi.acornsoft.io

$ sudo vi /var/lib/cubectl/cert/openssl.conf
# 예시
[ alt_names_registry ]
DNS.1 = localhost
DNS.2 = registry
DNS.3 = regi.acornsoft.io
IP.1 = 127.0.0.1
IP.2 = 192.168.77.154
$ sudo mkdir /etc/docker/certs.d/regi.acornsoft.io
$ sudo sed -i 's/192.168.77.154/regi.acornsoft.io/g' /var/lib/cubectl/harbor/harbor.yml
# 예시
hostname: regi.acornsoft.io
$ cd /var/lib/cubectl/harbor/
$ sudo ./install.sh
$ cd /var/lib/cubectl/harbor/common/config/core
$ vi env

# AS-IS
EXT_ENDPOINT=https://10.1.1.50

# TO-BE (접속될 접속주소, 예시:)
EXT_ENDPOINT=https://www.regi.acornsoft.io
$ sudo mkdir -p /etc/containerd/certs.d/regi.acornsoft.io
$ sudo cp -r /etc/containerd/certs.d/192.168.77.154/* /etc/containerd/certs.d/regi.acornsoft.io
$ sudo sed -i 's/192.168.77.154/regi.acornsoft.io/g' /etc/containerd/certs.d/regi.acornsoft.io/hosts.toml
$ sudo sed -i 's/192.168.77.154/regi.acornsoft.io/g' /etc/containerd/config.toml
$ sudo systemctl restart containerd
$ sudo sed -i '/ca =/d' /etc/containerd/certs.d/regi.acornsoft.io/hosts.toml
# 도메인주소로 변경하는 경우 ca 라인 삭제
server = "https://www.regi.acornsoft.io"

[host."https://www.regi.acornsoft.io"]
$ sudo find /etc/kubernetes -type f -exec sed -i 's/192.168.77.154/regi.acornsoft.io/g' {} +
# Control plane에서 IP가 변경되는 파일 목록

# Addon
/etc/kubernetes/addon/calico/calico.yaml
/etc/kubernetes/addon/metrics-server/metrics-server.yaml
# Static Pods
/etc/kubernetes/manifests/kube-apiserver.yaml
/etc/kubernetes/manifests/kube-controller-manager.yaml
/etc/kubernetes/manifests/kube-scheduler.yaml
# Coredns 및 기타 yaml
/etc/kubernetes/addon/test/nginx.yaml
/etc/kubernetes/addon/test/dnsutils.yaml
/etc/kubernetes/kubeadm.yaml
# Worker nodes에서 IP가 변경되는 파일 목록

# Static Pods
/etc/kubernetes/manifests/haproxy.yaml
$ sed -i 's/192.168.77.154/regi.acornsoft.io/g' /etc/apt/sources.list.d/local-repo.list
$ sudo mkdir /etc/docker/certs.d/regi.acornsoft.io
$ kubectl apply -f /etc/kubernetes/addon/calico/calico.yaml
$ kubectl apply -f /etc/kubernetes/addon/metrics-server/metrics-server.yaml
$ kubectl edit daemonset -n kube-system kube-proxy
# 예시
image: regi.acornsoft.io/registry.k8s.io/kube-proxy:v1.26.7
$ kubectl edit deployment -n kube-system coredns
# 예시
image: regi.acornsoft.io/docker.io/coredns/coredns:1.9.3
$ sudo systemctl restart kubelet
$ sudo crictl images
# 예시
ubuntu@master-1:~$ sudo crictl images
IMAGE                                                          TAG                 IMAGE ID            SIZE
regi.acornsoft.io/docker.io/calico/cni                         v3.26.1             9dee260ef7f59       93.4MB
192.168.77.154/docker.io/calico/cni                            v3.26.1             9dee260ef7f59       93.4MB
regi.acornsoft.io/docker.io/calico/node                        v3.26.1             8065b798a4d67       86.6MB
192.168.77.154/docker.io/calico/node                           v3.26.1             8065b798a4d67       86.6MB
regi.acornsoft.io/registry.k8s.io/kube-apiserver               v1.26.7             6ac727c486d08       36.1MB
192.168.77.154/registry.k8s.io/kube-apiserver                  v1.26.7             6ac727c486d08       36.1MB
regi.acornsoft.io/registry.k8s.io/kube-controller-manager      v1.26.7             17314033c0a0b       32.8MB
192.168.77.154/registry.k8s.io/kube-controller-manager         v1.26.7             17314033c0a0b       32.8MB
regi.acornsoft.io/registry.k8s.io/kube-proxy                   v1.26.7             1e7eac3bc5c0b       21.8MB
192.168.77.154/registry.k8s.io/kube-proxy                      v1.26.7             1e7eac3bc5c0b       21.8MB
regi.acornsoft.io/registry.k8s.io/kube-scheduler               v1.26.7             c1902187a39f8       17.8MB
192.168.77.154/registry.k8s.io/kube-scheduler                  v1.26.7             c1902187a39f8       17.8MB
regi.acornsoft.io/registry.k8s.io/pause                        3.9                 e6f1816883972       319kB
192.168.77.154/registry.k8s.io/pause                           3.9                 e6f1816883972       319kB
192.168.77.154/docker.io/coredns/coredns                       1.9.3               5185b96f0becf       14.8MB
192.168.77.154/registry.k8s.io/metrics-server/metrics-server   v0.6.1              e57a417f15d36       28.1MB
업그레이드 전 데이터베이스에 저장된 앱 상태와 같은 중요한 구성 요소를 백업하고 노드들의 스왑을 비활성화 해야 합니다.
  • 여분의 리소스가 충분히 확보 되어야 합니다. 부족한 리소스는 업그레이드 실패의 원인이 될 수 있습니다.

    • 업그레이드 수행 전 사전 작업을 통해 충분한 리소스를 확보합니다.

    • 최소 노드 수는 Control-plane는 3개이상 Worker 노드는 2개 이상 입니다.

  • 버전 업그레이드는 클러스터를 구성하는 Control-Plane , Worker 노드 순으로 단계별 진행됩니다.

    • 이때 업그레이드 대상 노드는 drain을 통해 노드 내의 Pod들은 다른 노드들로 스케줄링 됩니다.

    • ReplicationController, ReplicaSet, Job, Daemonset, StatefulSet과 같은 컨트롤러에 의해 실행된 Pod는 다른 노드로 스케줄링 됩니다.

    • 하지만 이와 같은 컨트롤러를 이용하지 않은 Pod는 축출된 후 다른 노드로 스케줄링되지 않으며 다른 노드로 복제가 불가능한 Pod는 옮겨지지 않습니다.

    • DaemonSet 컨트롤러에 의한 관리되는 Pod는 스케줄링되지 않습니다.

  • 로컬 저장 공간을 사용하는 Pod는 축출되면서 사용하던 데이터를 잃게 되며 PodDisruptionBudgets(PDB) 설정에 의해 축출에 실패하거나 느려질 수 있습니다.

  • 업그레이드가 종료되면 uncordon 을 통해 해당 노드에 대한 스케줄링이 다시 허용 됩니다. 하지만 다른 노드로 배치되었던 Pod가 다시 해당 노드로 스케줄링되지는 않습니다.

  • 컨테이너 해시 값이 변경되기 때문에 업그레이드 후 모든 컨테이너가 다시 시작됩니다.

  • hashtag
    버전 업그레이드

    • cubectl config sync 명령을 통해 클러스터 정보를 동기화 합니다.

    • cubectl update-kubeconfig 명령을 통해 KUBECONFIG 파일을 다운로드 받습니다.

    • cubectl.toml 파일을 수정합니다.

      • [kubernetes] 섹션에서 원하는 쿠버네티스 version을 입력합니다.

      • 폐쇄망 설치 환경에서는 을 확인하세요.

      • 패치버전을 생략하면 latest 버전을 설치합니다.

    • cubectl upgrade 명령을 실행합니다.

    워커 노드 추가 및 삭제

    Control plane 노드와 worker 노드를 추가/삭제 할 수 있습니다. 모든 추가/삭제는 동시에 진행할 수 있습니다.

    hashtag
    주의사항

    • 추가/삭제 작업은 노드 drain 작업이 필수 입니다. drain 작업이 실패하지 않게 사전에 노드 및 pod 설정을 학인해야 합니다.

      • affinity, node selector, statefulset 등은 drain 작업시 실패 원인이 될 수 있으니 사전에 확인 및 설정이 필요 합니다.

    • Control Plane 삭제시 cluster-info 컨피그맵의 server url이 실제 마스터 정보 인지 확인하고 다르면 올바른 마스터 노드 ip로 직접 수정해야 합니다.

    hashtag
    Control plane 노드 추가/삭제

    Control plane 개별 노드를 추가/삭제 또는 모든 노드를 추가/삭제 할 수 있습니다.

    • 아래 표와 같이 기존의 클러스터는 컨트롤 플레인 노드 1대, 워커 노드 2대가 설치되어있다고 가정합니다.

    • 기존의 클러스터에 Control plane 노드 2대를 추가 방법을 설명합니다.

    • 노드 삭제 역시 노드 추가와 동일한 방식으로 삭제하고 싶은 노드 IP를 cubectl.toml에서 제거합니다.

    Node Type
    Public ip
    Private ip
    • cubectl config sync 명령을 통해 클러스터 정보를 동기화 합니다. cubectl.toml 파일이 존재한다면 생략 가능합니다.

    • cubectl update-kubeconfig 명령을 통해 KUBECONFIG 파일을 다운로드 받습니다. acloud-client-kubeconfig 파일이 존재한다면 생략 가능합니다.

    • cubectl.toml 수정 - 추가할 노드의 IP를 추가로 입력합니다.

    • cubectl update 실행합니다.


    hashtag
    Worker 노드 추가/삭제

    • 아래 표와 같이 기존의 클러스터는 컨트롤 플레인 노드 1대, 워커 노드 2대가 설치되어있다고 가정합니다.

    • 기존의 클러스터에 워커 노드 1대를 추가 방법을 설명합니다.

    • 노드 삭제 역시 노드 추가와 동일한 방식으로 삭제하고 싶은 노드 IP를 cubectl.toml에서 제거합니다.

    Node Type
    Public ip
    Private ip
    • cubectl config sync 명령을 통해 클러스터 정보를 동기화 합니다. cubectl.toml 파일이 존재한다면 생략 가능합니다.

    • cubectl update-kubeconfig 명령을 통해 KUBECONFIG 파일을 다운로드 받습니다. acloud-client-kubeconfig 파일이 존재한다면 생략 가능합니다.

    • cubectl.toml 수정 - 추가할 노드의 IP를 추가로 입력합니다.

    • cubectl update 실행합니다.

    $ cubectl config sync -p <ssh key> -u <username>
    $ cubectl update-kubeconfig -p <ssh key> -u <username>
    $ vi config/cubectl.toml
    
    [kubernetes]
    version = "v1.24"
    
    [node-pool.master]
    ip = ["10.30.30.10","10.30.30.11","10.30.30.12"]
    
    [node-pool.node]
    ip = ["10.30.31.11","10.30.31.12"]
    $ bin/cubectl upgrade -p ~/.ssh/id_rsa -u cocktail --kubeconfig config/acloud-client-kubeconfig
    지원되는 패치 버전

    2번 worker node

    192.168.11.3

    172.16.11.3

    control-plane node (기존)

    192.168.11.1

    172.16.11.1

    control-plane node (추가)

    192.168.11.10

    172.16.11.10

    control-plane node (추가)

    192.168.11.11

    172.16.11.11

    1번 worker node

    192.168.11.2

    control-plane node

    192.168.11.1

    172.16.11.1

    1번 worker node

    192.168.11.2

    172.16.11.2

    2번 worker node

    192.168.11.3

    172.16.11.3

    3번 worker node(추가할 노드)

    192.168.11.4

    172.16.11.2

    172.16.11.4

    ## step_1. 마스터 정보 확인
    $ kubectl -n kube-public get cm cluster-info -o yaml | grep server
    $ bin/cubectl config sync -p <ssh key> -u <username>
    $ bin/cubectl update-kubeconfig -p <ssh key> -u <username>
    $ vi config/cubectl.toml
    $ bin/cubectl update -p <ssh key> -u <username> --kubeconfig $(pwd)/config/acloud-client-kubeconfig
    $ bin/cubectl config sync -p <ssh key> -u <username>
    $ bin/cubectl update-kubeconfig -p <ssh key> -u <username>
    $ vi config/cubectl.toml
    $ bin/cubectl update -p <ssh key> -u <username> --kubeconfig $(pwd)/config/acloud-client-kubeconfig

    사용자 이미지 Push

    hashtag
    Cubectl 명령어를 이용하는 방법

    hashtag
    필수 사항

    • archive/push/registry 경로의 디렉토리를 생성해야 합니다.

    • push/registry 디렉토리 내의 파일 네이밍을 맞춰줘야 합니다.

      • 이미지의 전체 경로를 적어줘야 합니다.

      • .tar, .tgz를 적어줘야 합니다.

    hashtag
    명령어 실행

    • cubectl push registry 명령을 실행합니다.


    hashtag
    직접 push 하는 방법

    • Registry node에서 직접 실행

    ex) registry.k8s.io_kube-apiserver:v1.31.3.tgz

    $ tree archive
    
    archive
    ├── cubectl-image-v1.2.2.tgz
    ├── push                                                    # 새로 생성된 디렉토리
    │   └── registry
    └── runtime
        ├── podman-v4.4.2-linux.amd64.tgz
        ├── harbor-offline-installer-v2.7.4-linux-amd64.tgz
        └── regctl-linux-amd64.tgz
    
    ...
    
    $ tree archive/push/registry
    
    archive/push/registry
    ├── docker.io_library_golang:1.22-alpine.tar
    ├── docker.io_library_python:alpine3.19.tgz
    ├── docker.io_library_tomcat:9.0.96.tgz
    └── quay.io_rockylinux_rockylinux:9.3-minimal.tgz
    $ sudo bin/cubectl push registry -p ~/.ssh/id_rsa -u cocktail
    $ docker login {{ registry_domain }} -u {{ id }} -p {{ password }}
    $ regctl image import {{ registry_domain }}/docker.io/library/tomcat:9.0.96 {{ Image file path }}

    Basics

    폐쇄망 설치

    hashtag
    폐쇄망 설치

    • 패키지를 다운로드 받습니다.

    $ curl -sfL https://cube.k3.acornsoft.io/download-cubectl | ACCOUNT=<user> PASSWD=<password> AIRGAP=ubuntu2204 VERSION=v1.0.0 OS=linux ARCH=amd64 sh -
    • cubectl.toml 파일을 수정합니다.

    • cubectl create 명령을 실행합니다.

    • 확인

    $ cat <<EOF> config/cubectl.toml
    [cubectl]
    closed-network = true
    local-repository-install = true
    
    [kubernetes]
    api-sans=["192.168.77.112"]
    
    [node-pool.master]
    ip = ["10.30.30.10"]
    
    [node-pool.node]
    ip = ["10.30.30.11"]
    
    [private-registry]
    install=true
    registry-ip="10.30.30.220"
    EOF
    $ sudo bin/cubectl create -p ~/.ssh/id_rsa -u cocktail
    $ export KUBECONFIG=$(pwd)/config/acloud-client-kubeconfig
    
    # 또는
    
    $ sudo cp -i config/acloud-client-kubeconfig $HOME/.kube/config
    $ sudo chown $(id -u):$(id -g) $HOME/.kube/config
    
    # 노드 확인
    $ kubectl get nodes

    Kubelet log 위치 변경 방법

    hashtag
    Systemd 관련 파일 변경

    • /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf을 수정

    $ vi /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
    • StandardOutput=append:[원하는 경로]/[파일 명], StandardError=append:[원하는 경로]/[파일 명]을 하단 부분에 추가

    $ cat /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
    # Note: This dropin only works with kubeadm and kubelet v1.11+
    [Service]
    Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
    Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"
    # This is a file that "kubeadm init" and "kubeadm join" generates at runtime, populating the KUBELET_KUBEADM_ARGS variable dynamically
    EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env
    # This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably, the user should use
    # the .NodeRegistration.KubeletExtraArgs object in the configuration files instead. KUBELET_EXTRA_ARGS should be sourced from this file.
    EnvironmentFile=-/etc/default/kubelet
    ExecStart=
    ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS
    StandardOutput=append:[원하는 경로]/[파일 명]
    StandardError=append:[원하는 경로]/[파일 명]