카테고리 보관물: config

Synology RAID Volume 단일 Volume으로 변경하기

시놀로지는 볼륨 관리를 위해 md라고 불리는 software raid를 사용합니다.
raid를 관리하기 위해 사용하는 명령어가 mdadm 입니다.

보통은, /dev/md0가 OS 파티션, /dev/md1이 swap 파티션, 그리고 사용자가 사용하는 첫번째 볼륨 파티션이 /dev/md2로 생성되는데요..

“cat /proc/mdstat” 명령을 치시면 현재 사용하고 있는 md raid 정보가 출력됩니다.

?? ??2.png

이중 md 구성 별 blocks 수를 대략 비교 해보며 Disk Size 별로 어떤 Volume 인지 확인합니다.

mdadm –grow –raid-devices=1 –force /dev/[md2] <— 분리 하고자 하는 md 번호

상기 명령을 통해 원하는 Volume Raid를 분리 할 수 있습니다.

[Tomcat] 리눅스의 톰캣 로그에서 한글깨지는 문제 해결방법

리눅스의 톰캣 로그에서 한글이 깨져나오네요.

톰캣의 인코딩에 문제가 생겨서 그러겠죠?

[톰캣설치 폴더 > bin] 디렉토리로 가면 catalina.sh 파일이 있습니다.

그 파일을 편집기로 여시구요.

-Djava.io.tmpdir=”$CATALINA_TMPDIR” \
이 부분 찾아서 그 아래에 아래 소스를 모두 추가합니다.

-Djava.io.tmpdir=”$CATALINA_TMPDIR” \
-Dfile.encoding=”utf-8″\

수정한 파일을 저장하고, 톰캣을 재시작하면 아래처럼 로그에 한글이 잘 나옵니다.

Installing Helm on Ubuntu for Kubernetes

Ubuntu에 Helm을 설치하려면:

1. 다음 명령을 사용하여 최신 버전의 Helm을 다운로드합니다.

wget https://get.helm.sh/helm-v3.4.1-linux-amd64.tar.gz

다운로드가 완료되면 단말기에서 확인 메시지를 출력합니다.

터미널에서 Helm을 다운로드합니다.

2. 다음으로 Linux tar 명령 을 사용하여 Helm 파일의 압축을 풉니다 .

tar xvf helm-v3.4.1-linux-amd64.tar.gz

출력에는 압축이 풀린 4개의 파일이 표시됩니다.

3. linux-amd64/helm파일을 /usr/local/bin디렉터리로 이동합니다.

sudo mv linux-amd64/helm /usr/local/bin

명령이 올바르게 실행된 경우 출력이 없습니다.

투구 풀기.

4. 다음 명령을 사용하여 다운로드한 파일을 제거합니다.

rm helm-v3.4.1-linux-amd64.tar.gz

5. linux-amd64다음을 실행하여 공간을 정리할 디렉터리를 제거합니다.

rm -rf linux-amd64

프로세스가 성공적으로 완료되면 출력이 없습니다.

필요하지 않은 파일을 제거합니다.

6. 마지막으로 소프트웨어 버전을 확인하여 Helm을 성공적으로 설치했는지 확인합니다.

helm version

터미널은 소프트웨어의 버전 번호와 GitCommit, GitTreeState 및 GoVersion의 릴리스 번호를 인쇄합니다.

Helm 설치 완료를 확인합니다.

 

수동으로 최신 버젼의 chart 정보를 레파지토리에 갱신 할 수 있습니다.

$ helm repo add stable https://charts.helm.sh/stable
$ helm repo update  

[kubernetes] kubeadm 사용 고 가용성(HA) 클러스터 설정

kubernetes에서 HA를 구성하는 방법으로 stacked etcd, external etcd 두가지 방법이 있다. 그림 1의 stacked etcd는 control plane node에서 etcd가  작동하는 반면, 그림 2의 external etcd는 control plane node와 etcd가 다른 노드에서 작동한다. HA를 구성하기 위해서는 쿼럼이 과반수를 초과해야만 하기 때문에 최소 3대 이상(3,5,7,…)의 노드를 필요로 한다. 이번 시간에는 stacked etcd 를 구성하는 방법에 대해 알아보고자 한다.

 

[그림 1] HA 토폴로지 – stacked etcd
[그림 1] HA 토폴로지 – external etcd

 

구성환경

Ubuntu 18.04.1, Docker 19.03.8, Kubernet v1.17.4

사전 준비

Docker, Kubernet이 미리 설치 되어 있어야한다.

로드 발란서(Load Balancer)

– dns 로드 발란서 사용, apisvr 라운드로빈(round-robin) 활용, 참고로 도메인은 hoya.com

apisvr    IN      A       192.168.0.160
IN      A       192.168.0.161
IN      A       192.168.0.162

 

첫번째 Control plane node

1. Control plane 초기화

shell> sudo kubeadm init –control-plane-endpoint apisvr.hoya.com:6443 –upload-certs

** apisvr.hoya.com:6443 은 자기 환경에 맞게 설정한다.

–upload-certs : control plane 인스턴스에서 공유해야 하는 인증서를 업로드(자동배포), 수동으로 인증서를 복사할 경우는 이 옵션 생략

control plane 초기화(kubeadm init)를 진행하면 아래와 같은 내용이 출력될 것이다. 아래 내용을 복사해 놓도록 한다. 이 명령어를 이용하여 클러스터에 조인(join) 할수 있다. 파란색글씨(위쪽)는 control plane 노드에서 실행, 주황색 글씨(아래)는 worker node에서 실행

You can now join any number of control-plane node by running the following command on each as a root:
kubeadm join apisvr.hoya.com:6443 –token 9vr73a.a8uxyaju799qwdjv –discovery-token-ca-cert-hash sha256:7c2e69131a36ae2a042a339b33381c6d0d43887e2de83720eff5359e26aec866 –control-plane –certificate-key f8902e114ef118304e561c3ecd4d0b543adc226b7a07f675f56564185ffe0c07Please note that the certificate-key gives access to cluster sensitive data, keep it secret!
As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use kubeadm init phase upload-certs to reload certs afterward.

Then you can join any number of worker nodes by running the following on each as root:
kubeadm join apisvr.hoya.com:6443 –token 9vr73a.a8uxyaju799qwdjv –discovery-token-ca-cert-hash sha256:7c2e69131a36ae2a042a339b33381c6d0d43887e2de83720eff5359e26aec866

참고: certificate-key를 지정하여 나중에 조인에서 사용할 수 있습니다.

shell> sudo kubeadm alpha certs certificate-key
f8902e114ef118304e561c3ecd4d0b543adc226b7a07f675f56564185ffe0c07

참고: worker node에서 토큰을 사용하여 클러스터에 가입하는 데 필요한 전체 ‘kubeadm join’ 플래그를 출력

shell> sudo kubeadm token create –print-join-command

참고: 인증서를 다시 업로드하고 새 암호 해독 키를 생성하려면 이미 클러스터에 연결된 control plane 노드에서 다음 명령을 사용하십시오.

shell> sudo kubeadm init phase upload-certs –upload-certs
W0322 16:20:40.631234  101997 validation.go:28] Cannot validate kube-proxy config – no validator is available
W0322 16:20:40.631413  101997 validation.go:28] Cannot validate kubelet config – no validator is available
[upload-certs] Storing the certificates in Secret “kubeadm-certs” in the “kube-system” Namespace
[upload-certs] Using certificate key:
7f97aaa65bfec1f039c4dbdf3a2073de853c708bd4d9ff9d72b776b0f9874c9d

참고 :  클러스터를 control plane 조인(join)하는 데 필요한 전체 ‘kubeadm join’ 플래그를 출력

shell> sudo kubeadm token create –print-join-command –certificate-key \  7f97aaa65bfec1f039c4dbdf3a2073de853c708bd4d9ff9d72b776b0f9874c9d

2. CNI(Container Network Interface) 플러그인 설치

– 여기서는 weave CNI 플러그인 설치(그외 flannel, Calico, ….)

shell> kubectl apply -f “https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d ‘\n’)”

 

나머지 Control plane 노드

1. 첫번째 Control plane 노드에서 kubeadm init 결과(파란색 글씨)를 실행한다.

shell> kubeadm join apisvr.hoya.com:6443 –token 9vr73a.a8uxyaju799qwdjv –discovery-token-ca-cert-hash sha256:7c2e69131a36ae2a042a339b33381c6d0d43887e2de83720eff5359e26aec866 –control-plane –certificate-key f8902e114ef118304e561c3ecd4d0b543adc226b7a07f675f56564185ffe0c07

2. 확인

– 노드 상태가 Ready인지 확인

shell> kubectl get nodes
NAME        STATUS   ROLES    AGE     VERSION
master1    Ready    master   41s     v1.17.4
master2    Ready    master   3m59s   v1.17.4
master3    Ready    master   92s     v1.17.4
shell>

– pods의 상태(Status)가 모두 Running 상태인지 확인

shell> kubectl get pods –all-namespaces
NAMESPACE     NAME                                READY   STATUS    RESTARTS   AGE
kube-system   coredns-6955765f44-7jk6m            1/1     Running   0          3m42s
kube-system   coredns-6955765f44-vgw2j            1/1     Running   0          3m42s
kube-system   etcd-master3                       1/1     Running   0          31s
kube-system   etcd-master1                       1/1     Running   0          3m44s
kube-system   etcd-master2                      1/1     Running   0          83s
kube-system   kube-apiserver-master3             1/1     Running   0          33s
kube-system   kube-apiserver-master1             1/1     Running   0          3m44s
kube-system   kube-apiserver-master2            1/1     Running   0          84s
kube-system   kube-controller-manager-master3    1/1     Running   0          33s
kube-system   kube-controller-manager-master1    1/1     Running   1          3m44s
kube-system   kube-controller-manager-master2   1/1     Running   0          84s
kube-system   kube-proxy-hd8vq                    1/1     Running   0          84s
kube-system   kube-proxy-v9s8h                    1/1     Running   0          3m42s
kube-system   kube-proxy-z76td                    1/1     Running   0          33s
kube-system   kube-scheduler-master3             1/1     Running   0          33s
kube-system   kube-scheduler-master1             1/1     Running   1          3m44s
kube-system   kube-scheduler-master2            1/1     Running   0          84s
kube-system   weave-net-6dkt6                     2/2     Running   3          84s
kube-system   weave-net-9zswx                     2/2     Running   0          3m3s
kube-system   weave-net-fvf9q                     2/2     Running   0          33s

woker node

1. 첫번째 Control plane 노드에서 kubeadm init 결과(주황색 글씨)를 실행한다.

kubeadm join apisvr.hoya.com:6443 –token 9vr73a.a8uxyaju799qwdjv –discovery-token-ca-cert-hash sha256:7c2e69131a36ae2a042a339b33381c6d0d43887e2de83720eff5359e26aec866

 

HA에서 control plane 노드 제거

 방법 1) 제거 할 노드에서 아래 명령어(kubeadm reset) 실행

shell> sudo kubeadm reset

** kubectl delete node로 control plane노드 를 제거하지 않도록 한다. 만약 kubectl delete node로 삭제하는 경우 이후 추가 되는 control plane 노드들은 HA에 추가 될수 없다. 그 이유는 kubeadm reset은 HA내 다른  control plane 노드의 etcd에서 etcd endpoint 정보를 지우지만 kubectl delete node는 HA 내의 다른 controle plane 노드에서 etcd endpoint 정보를 지우지 못하기 때문이다. 이로 인해 이후 HA에 추가되는 control plane 노드는 삭제된 노드의 etcd endpoint 접속이 되지 않기 때문에 etcd 유효성 검사 과정에서 오류가 발생하게 된다.

– control plane 노드를 kubectl delete node 로 삭제후 control plane 노드 추가시 오류 메시지

shell> kubeadm join ….. –control-plane –certyficate-key
… 생략 …
[check-etcd] Checking that the etcd cluster is healthy
error execution phase check-etcd: etcd cluster is not healthy: failed to dial endpoint https://192.168.0.159:2379 with maintenance client: context deadline exceeded
To see the stack trace of this error execute with –v=5 or higher

 방법 2) etcd member 삭제 진행 절차

  step 1. 유효한 control plane 노드에서 etcd member id 확인

shell> etcdctl –cacert=/etc/kubernetes/pki/etcd/ca.crt \ 
 –cert=/etc/kubernetes/pki/etcd/peer.crt \ 
 –key=/etc/kubernetes/pki/etcd/peer.key  member list 81ce68f24db8ced, started, master1, https://192.168.0.159:2380, https://192.168.0.159:2379, false
5364415ff53d0975, started, master3, https://192.168.0.158:2380, https://192.168.0.158:2379, false
b27f6573a770c244, started, master2, https://192.168.0.149:2380, https://192.168.0.149:2379, false
shell>

  step 2. 멤버 제거

shell> etcdctl -cacert=/etc/kubernetes/pki/etcd/ca.crt  \ 
–cert=/etc/kubernetes/pki/etcd/peer.crt \  
–key=/etc/kubernetes/pki/etcd/peer.key member remove 81ce68f24db8cedMember  81ce68f24db8ced removed from cluster  88707d65fd36eb2
shell>

 

TroubleShooting

참고 : 아래 환경에서 etcdctl 을 이용하여 접속하면 오류가 발생하여 etcd 버전을 업그레이드(v3.4.5)하여 진행, 아마 etcd, etcdctl 은 마이너 버전까지 일치해야만 정상 작동하는듯 하다.

– kubernetes etcd 버전 : 3.4.3-0

– etcdctl 버전

shell> etcdctl –version
etcdctl version: 3.2.10
API version: 2

 

증상 1) etcdctl version 3.2.10 으로 실행 오류 #1 – 404 오류 발생

shell> etcdctl -C https://192.168.0.149:2379 –ca-file=/tmp/pki/ca.crt  \
–cert-file=/tmp/pki/peer.crt  \
–key-file=/tmp/pki/peer.key member list
unexpected status code 404
shell>

증상 2) etcdctl version 3.2.10 으로 실행시 오류 #2( /etc/kubernetes/pki/etcd 디폴트 위치한 인증서 사용시)

shell> etcdctl -C https://192.168.0.149:2379 –ca-file=/etc/kubernetes/pki/etcd/ca.crt  \
–cert-file=/etc/kubernetes/pki/etcd/peer.crt  \
–key-file=/etc/kubernetes/pki/etcd/peer.key member list
open /etc/kubernetes/pki/etcd/peer.crt: permission denied
shell>

[Docker SWARM] Configuring a cluster environment using SWARM

manager : docker swarm 클러스터의 manager 노드

worker01, worker02, worker03 : docker swarm의 worker노드들 (3개)

registry : docker private registry 서비스

registry-web : docker private registry에 어떤 이미지가 올라가 있는지 web UI로 확인하는 서비스

dashboard : docker swarm 클러스터의 노드들을 web UI로 확인할 수 있는 서비스

 

대충 최종 모습(?)

 

준비사항

$ docker -v
Docker version 20.10.5, build 55c4c88

docker가 설치되어 있어야 한다.

$ docker-compose -v
docker-compose version 1.28.5, build c4eb3a1f

docker-compose도 설치되어 있어야 한다.

서비스 파일 작성

– docker-compose.yml

$ cat docker-compose.yml
version: "3"
services:
  registry-web:
    container_name: registry-web
    image: hyper/docker-registry-web
    ports:
      - 8080:8080
    volumes:
      - "./config.yml:/conf/config.yml:ro"

  registry:
    container_name: registry
    image: registry:2.6
    ports:
      - 5000:5000
    volumes:
      - "./registry-data:/var/lib/registry"

  manager:
    container_name: manager
    image: docker:18.05.0-ce-dind
    privileged: true
    tty: true
    ports:
      - 8000:80
      - 9000:9000
      - 8081:8081
      - 4567:4567
    depends_on:
      - registry
    expose:
      - 3375
    command: "--insecure-registry registry:5000"
    volumes:
      - "./stack:/stack"
      - "./dashboard:/dashboard"

  worker01:
    container_name: worker01
    image: docker:18.05.0-ce-dind
    privileged: true
    tty: true
    depends_on:
      - manager
      - registry
    expose:
      - 7946
      - 7946/udp
      - 4789/udp
    command: "--insecure-registry registry:5000"

  worker02:
    container_name: worker02
    image: docker:18.05.0-ce-dind
    privileged: true
    tty: true
    depends_on:
      - manager
      - registry
    expose:
      - 7946
      - 7946/udp
      - 4789/udp
    command: "--insecure-registry registry:5000"

  worker03:
    container_name: worker03
    image: docker:18.05.0-ce-dind
    privileged: true
    tty: true
    depends_on:
      - manager
      - registry
    expose:
      - 7946
      - 7946/udp
      - 4789/udp
    command: "--insecure-registry registry:5000"

manager와 worker 노드들은 dind(docker in docker) 이미지로 생성한다. dind는 간단히 말하자면 docker 컨테이너 안에서 docker cli를 사용하는 것이다.

registry와 registry를 web UI로 보여주는 서비스들을 추가한다. registry-web은 8080 포트로 접속할 것이다.

– config.yml

$ cat config.yml
registry:
  # 기존에 설치한 docker private registry
  url: http://registry:5000/v2
  # Docker registry name
  name: localhost:5000
  # docker 권한 부여
  readonly: false
  auth:
  eabled: false

registry-web에 사용될 yml 파일이다. private registry가 사용하는 5000번 포트로 url을 설정한다.

– dashbaord.yml

$ cat dashboard/dashboard.yml
version: "3"

services:
  dashboard:
    image: charypar/swarm-dashboard
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    ports:
      - 8081:8081
    environment:
      PORT: 8081
    deploy:
      replicas: 1
      placement:
        constraints:
          - node.role == manager

docker-compose.yml 파일을 보면 manager 노드에 /dashboard 디렉토리를 마운트 해주었는데 즉, docker-compose.yml이 있는 곳에 dashboard라는 디렉토리를 만들고, 그 안에 dashboard.yml을 작성하였다.

dashboard 서비스는 manager 노드에만 생성되고, 브라우저에서 8081포트로 접속한다.

swarm-dashboard에 대한 github 주소는 아래와 같다. 개발자 분에게 감사합니다.

github.com/charypar/swarm-dashboard

– 디렉토리 상태

$ ls
config.yml  dashboard  docker-compose.yml

dashboard만 디렉토리이고, dashboard 디렉토리 안에 dashboard.yml 파일이 있다.

docker compose 실행

– docker-compose up -d

$ docker-compose up -d
Creating network "swarm_default" with the default driver
Creating registry     ... done
Creating registry-web ... done
Creating manager      ... done
Creating worker01     ... done
Creating worker03     ... done
Creating worker02     ... done

-d 옵션은 백그라운드로 시작하는 뜻이다.

– 디렉토리 재확인

$ ls
config.yml  dashboard  docker-compose.yml  registry-data  stack

docker-compose up을 실행하면 위처럼 registry-data와 stack 디렉토리가 생기는걸 확인할 수 있다. registry-data 디렉토리를 registry 서비스의 /var/lib/registry 디렉토리와 마운트 시켜놓으면, registry 서비스가 중지되어도 데이터가 그대로 유지된다.

– localhost:8080 접속

 

registry-web 접속

 

registry-web에 접속하면, 현재 registry 상태를 web UI를 통해 확인할 수 있다.

private registry에 이미지 업로드

docker swarm service에 사용할 이미지를 다운로드 받고, 직접 private registry에 이미지를 업로드 해본다.

– docker pull

$ docker image pull subicura/whoami:1

위의 이미지를 받는다. 브라우저로 접속하면 hostname을 출력해주는 docker 이미지이다.

– docker tag

$ docker image tag subicura/whoami:1 localhost:5000/example/whoami:latest

private registry의 포트가 5000이므로, 위와같이 docker image tag 명령어를 통해 이미지 이름과 tag 정보를 변경한다. 이미지의 첫 항목이 image pull 진행 시, 이미지가 올라가는 도메인 정보이다.

– docker image push

$ docker image push localhost:5000/example/whoami:latest
The push refers to repository [localhost:5000/example/whoami]
6304fb0017b0: Pushed
bcd68c905028: Pushed
5f4ed2a4afd7: Pushed
1fad3fef68ba: Pushed
42e63b663df9: Pushed
71d7318763a9: Pushed
7d7e183520a5: Pushed
7cbcbac42c44: Pushed
latest: digest: sha256:6239cd2462f9dd7a0317db107724a101deca600d30e39465515ba632e0982f4a size: 1989

이미지가 푸쉬되는걸 확인할 수 있다.

– registry web 확인

 

registry-web

 

이미지가 올라간것을 확인할 수 있다. 이제 docker swarm 노드에서 이미지를 다운받아 사용할 수 있다.

docker swarm 구성하기

– docker swarm init

$ docker exec -it manager docker swarm init
Swarm initialized: current node (5ywj85cw3tdz8ioe71v1xlyzn) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-1gxj86agzmecefcd6mwjproa96hw7e3gu0plsdhuw9110fuc1r-7q4434lsegri8la2n9qgggsrd 172.22.0.4:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

manager 컨테이너에서 docker swarm init 명령어를 입력한다. 위처럼 docker swarm join 부분 전체를 복사한다. worker 노드들에서 전부 입력하면 된다.

– docker swarm join

$ docker exec -it worker01 docker swarm join --token SWMTKN-1-1gxj86agzmecefcd6mwjproa96hw7e3gu0plsdhuw9110fuc1r-7q4434lsegri8la2n9qgggsrd 172.22.0.4:2377
This node joined a swarm as a worker.

$ docker exec -it worker02 docker swarm join --token SWMTKN-1-1gxj86agzmecefcd6mwjproa96hw7e3gu0plsdhuw9110fuc1r-7q4434lsegri8la2n9qgggsrd 172.22.0.4:2377
This node joined a swarm as a worker.

$ docker exec -it worker03 docker swarm join --token SWMTKN-1-1gxj86agzmecefcd6mwjproa96hw7e3gu0plsdhuw9110fuc1r-7q4434lsegri8la2n9qgggsrd 172.22.0.4:2377
This node joined a swarm as a worker.

Swarm dashboard 서비스 실행

– swarm dashboard stack deploy

$ docker exec -it manager docker stack deploy -c /dashboard/dashboard.yml dashboard
Creating network dashboard_default
Creating service dashboard_dashboard

컨테이너에 마운트해둔 /dashboard/dashboard.yml을 사용해 dashboard서비스를 실행한다.

– dashboard 접속

 

dashboard 접속

 

localhost:8081로 접속하면, 위처럼 현재 Swarm cluster의 상태를 확인할 수 있다. 현재 manager 노드에 dashboard 서비스 한개만 올라가 있는 상태이다.

Swarm 클러스터에 서비스 등록

private registry에 올려놨던 image를 manager 노드에서 pull 받아서 swarm 클러스에서 서비스로 등록해본다.

– docker pull image

$ docker exec -it manager docker pull registry:5000/example/whoami:latest
latest: Pulling from example/whoami
d1426d011624: Pull complete
1659ef4c811e: Pull complete
47bd5f3578fc: Pull complete
5e03057c6ddf: Pull complete
d58f420d5777: Pull complete
d65d30e11c7f: Pull complete
c9d3f35ab05f: Pull complete
fb24e6aeba3f: Pull complete
Digest: sha256:6239cd2462f9dd7a0317db107724a101deca600d30e39465515ba632e0982f4a
Status: Downloaded newer image for registry:5000/example/whoami:latest

– docker service create

$ docker exec -it manager docker service create --name whoami -p 4567:4567 registry:5000/example/whoami:latest
wkkg33d93qity2dustm8dkxvf
overall progress: 1 out of 1 tasks
1/1: running   [==================================================>]
verify: Service converged

– docker service 확인

$ docker exec -it manager docker service ls
ID                  NAME                  MODE                REPLICAS            IMAGE                                 PORTS
isro3osqfsn5        dashboard_dashboard   replicated          1/1                 charypar/swarm-dashboard:latest       *:8081->8081/tcp
wkkg33d93qit        whoami                replicated          1/1                 registry:5000/example/whoami:latest   *:4567->4567/tcp

dashboard 서비스와 whoami 서비스를 확인할 수 있다.

 

 

dashboard에서도 whoami 서비스 하나가 추가된 것을 확인할 수 있다.

– service scale 조절

$ docker exec -it manager docker service scale whoami=6
whoami scaled to 6
overall progress: 6 out of 6 tasks
1/6: running   [==================================================>]
2/6: running   [==================================================>]
3/6: running   [==================================================>]
4/6: running   [==================================================>]
5/6: running   [==================================================>]
6/6: running   [==================================================>]
verify: Service converged

docker service scale 명령어로 서비스의 스케일링을 간단하게 진행할 수 있다. whoami 서비스가 원래 1개였는데, 6개로 늘렸다.

 

 

dashboard에서도 whoami 서비스가 6개로 증가한 것을 확인할 수 있다.

curl test

$ curl localhost:4567
444593584a03
$ curl localhost:4567
fb1e399ac4ed
$ curl localhost:4567
a8948b879833
$ curl localhost:4567
f565b65a22ab
$ curl localhost:4567
7160d9d9e250
$ curl localhost:4567
d7c6861c57e0
$ curl localhost:4567
444593584a03
$ curl localhost:4567
fb1e399ac4ed
$ curl localhost:4567
a8948b879833
$ curl localhost:4567
f565b65a22ab
$ curl localhost:4567
7160d9d9e250
$ curl localhost:4567
d7c6861c57e0

노드들의 hostname이 적절히 분배되어 출력되는걸 확인할 수 있다. docker swarm의 경우 ingress 네트워크가 트래픽 분산을 자동으로 해준다.

VM Workstation로 Xpenology DSM7 설치

사전준비물

ESXi용 7.0.1-42218 image
OSFMount
Starwind V2V Converter
IP Scanner

시리얼 생성

群晖系列产品序列号计算器

 

위에서 받은 sn과 mac을 이미지로 변경해주세요.

osfmount로 이미지 수정

반드시 Read-Only 체크해제

마운트 되면 아래경로에서 grub.cfg 파일 수정

 

위에서 받은 sn과 mac으로 수정

저장 후 언마운트 해주고 Starwind V2V Converter 실행
이미지 파일을 넣고 vmdk로 변경

준비 끝

VM Workstation으로 VM 생성하기

VMware 실행 후 Create a New Virtual Machine 선택

처음 ISO는 Noimage로 맨 아래꺼 선택하고 넘어가주세요.
OS는 Linux – Linux 4.x kernel 64-bit 입니다.

가상머신 이름입니다.

디스크는 어차피 한번날리고 다시만들꺼라 대충만들고 next

아래처럼 되면 일단 Finish해줍니다.

이제 생성한 VM을 바로 실행시키지는 마시고 VM을 선택 후 설정으로 갑니다.

그리고 기존 Disk와 불필요한 CD 드라이브도 모두 Remove해주고 메모리 CPU설정을 하신뒤에 아래처럼 새로 Hard Disk를 추가해줍니다.

Disk Type은 SATA 디스크로

부트로더를 넣어줘야하기때문에 기존 디스크를 넣어준다고합니다.

만든 부트로더 디스크를 넣어주세요.

Keep Existing Format을 선택해줍니다.

이제 데이터저장을 위한 HDD를 만들어줍니다.

동일하게 SATA 타입으로 만들어주세요

이제 네트워크 설정입니다. 아래처럼 NAT -> Bridged로 변경해주고
Configure Adapters에서 사용하고계신 LAN 어댑터를 선택 후 OK눌러주세요.

그리고 Advanced…를 눌러서 아까 생성한 MAC주소를 넣어줍니다.

그리고 OK를 누르고 저장해주신뒤 VM의 설정파일이 있는곳으로 이동해서 파일을 아래처럼 수정해주세요.

문서->Virtual Machines -> VM이름 -> VM이름.vmx 파일을 메모장으로 열어주시고 e1000을 검색해서 e1000e로 변경 아래 firmware = “efi” 항목이 있다면 삭제해주세요.

이제 저장을 하고 VM을 실행시켜줍니다.

아래 SATA 부팅

위 화면이 뜨면 IP Scanner로 사용하고 계신 네트워크 대역을 스캔해주세요.

변경한 MAC주소의 이름으로 기기가 검색됩니다.

ip로 접속하면 아래처럼 잘 뜨는것을 확인할 수 있습니다.

설치도 공홈에서 받은 pat파일을 통해 바로 됩니다.

kubeadm 이용 Ubuntu 20.04에 Kubernetes 클러스터 설치

Kubernetes는 온프레미스 서버 또는 하이브리드 클라우드 환경에서 대규모로 컨테이너화된 애플리케이션을 오케스트레이션 및 관리하기 위한 도구입니다. Kubeadm은 사용자가 모범 사례 시행을 통해 프로덕션 준비 Kubernetes 클러스터를 설치할 수 있도록 Kubernetes와 함께 제공되는 도구입니다. 이 튜토리얼은 kubeadm을 사용하여 Ubuntu 20.04에 Kubernetes 클러스터를 설치하는 방법을 보여줍니다.

Kubernetes 클러스터 배포에는 두 가지 서버 유형이 사용됩니다.

  • 마스터 : Kubernetes 마스터는 Kubernetes 클러스터의 포드, 복제 컨트롤러, 서비스, 노드 및 기타 구성 요소에 대한 제어 API 호출이 실행되는 곳입니다.
  • Node : Node는 컨테이너에 런타임 환경을 제공하는 시스템입니다. 컨테이너 포드 세트는 여러 노드에 걸쳐 있을 수 있습니다.

실행 가능한 설정을 위한 최소 요구 사항은 다음과 같습니다.

  • 메모리: 컴퓨터당 2GiB 이상의 RAM
  • CPU: 컨트롤 플레인 머신에 최소 2개의 CPU 가 있습니다.
  • 컨테이너 풀링을 위한 인터넷 연결 필요(개인 레지스트리도 사용할 수 있음)
  • 클러스터의 머신 간 전체 네트워크 연결 – 개인 또는 공용입니다.

Ubuntu 20.04에 Kubernetes 클러스터 설치

My Lab 설정에는 3개의 서버가 있습니다. 컨테이너화된 워크로드를 실행하는 데 사용할 하나의 컨트롤 플레인 머신과 두 개의 노드. 예를 들어 HA용 제어 평면 노드 3개 를 사용하여 원하는 사용 사례 및 부하에 맞게 노드를 더 추가할 수 있습니다 .

서버 유형 서버 호스트 이름 명세서
주인 k8s-master01.computingforgeeks.com 4GB 램, 2vcpus
노동자 k8s-worker01.computingforgeeks.com 4GB 램, 2vcpus
노동자 k8s-worker02.computingforgeeks.com 4GB 램, 2vcpus

1단계: Kubernetes 서버 설치

Ubuntu 20.04에서 Kubernetes 배포에 사용할 서버를 프로비저닝합니다. 설정 프로세스는 사용 중인 가상화 또는 클라우드 환경에 따라 다릅니다.

서버가 준비되면 업데이트하십시오.

sudo apt update
sudo apt -y upgrade && sudo systemctl reboot

2단계: kubelet, beadm 및 kubectl 설치

서버가 재부팅되면 Ubuntu 20.04용 Kubernetes 저장소를 모든 서버에 추가하십시오.

sudo apt update
sudo apt -y install curl apt-transport-https
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list

그런 다음 필요한 패키지를 설치합니다.

sudo apt update
sudo apt -y install vim git curl wget kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

kubectl 버전을 확인하여 설치를 확인합니다.

$ kubectl version --client && kubeadm version
Client Version: version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.2", GitCommit:"8b5a19147530eaac9476b0ab82980b4088bbc1b2", GitTreeState:"clean", BuildDate:"2021-09-15T21:38:50Z", GoVersion:"go1.16.8", Compiler:"gc", Platform:"linux/amd64"}
kubeadm version: &version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.2", GitCommit:"8b5a19147530eaac9476b0ab82980b4088bbc1b2", GitTreeState:"clean", BuildDate:"2021-09-15T21:37:34Z", GoVersion:"go1.16.8", Compiler:"gc", Platform:"linux/amd64"}

3단계: 스왑 비활성화

스왑과 방화벽을 끕니다.

sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
sudo swapoff -a
sudo ufw disable

crontab -e
@reboot sudo swapoff -a 

커널 모듈을 활성화하고 sysctl을 구성합니다.

# Enable kernel modules
sudo modprobe overlay
sudo modprobe br_netfilter

# Add some settings to sysctl
sudo tee /etc/sysctl.d/kubernetes.conf<<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

# Reload sysctl
sudo sysctl --system

4단계: 컨테이너 런타임 설치

Pod에서 컨테이너를 실행하기 위해 Kubernetes는 컨테이너 런타임을 사용합니다. 지원되는 컨테이너 런타임은 다음과 같습니다.

  • 도커
  • CRI-O
  • 컨테이너

참고 : 한 번에 하나의 런타임을 선택해야 합니다 .

도커 런타임 설치:

# Add repo and Install packages
sudo apt update
sudo apt install -y curl gnupg2 software-properties-common apt-transport-https ca-certificates

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

sudo apt update
sudo apt install -y containerd.io docker-ce docker-ce-cli

# Create required directories
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo mkdir -p /etc/docker

# Create daemon json config file
sudo tee /etc/docker/daemon.json <<EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF

# Start and enable Services
sudo systemctl daemon-reload 
sudo systemctl restart docker
sudo systemctl enable docker

CRI-O 설치:

# Ensure you load modules
sudo modprobe overlay
sudo modprobe br_netfilter

# Set up required sysctl params
sudo tee /etc/sysctl.d/kubernetes.conf<<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

# Reload sysctl
sudo sysctl --system

# Add Cri-o repo
sudo su -
OS="xUbuntu_20.04"
VERSION=1.22
echo "deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/$OS/ /" > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list
echo "deb http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/$VERSION/$OS/ /" > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable:cri-o:$VERSION.list
curl -L https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable:cri-o:$VERSION/$OS/Release.key | apt-key add -
curl -L https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/$OS/Release.key | apt-key add -

# Update CRI-O CIDR subnet
sudo sed -i 's/10.85.0.0/192.168.0.0/g' /etc/cni/net.d/100-crio-bridge.conf

# Install CRI-O
sudo apt update
sudo apt install cri-o cri-o-runc

# Start and enable Service
sudo systemctl daemon-reload
sudo systemctl restart crio
sudo systemctl enable crio
sudo systemctl status crio

컨테이너 설치:

# Configure persistent loading of modules
sudo tee /etc/modules-load.d/containerd.conf <<EOF
overlay
br_netfilter
EOF

# Load at runtime
sudo modprobe overlay
sudo modprobe br_netfilter

# Ensure sysctl params are set
sudo tee /etc/sysctl.d/kubernetes.conf<<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

# Reload configs
sudo sysctl --system

# Install required packages
sudo apt install -y curl gnupg2 software-properties-common apt-transport-https ca-certificates

# Add Docker repo
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

# Install containerd
sudo apt update
sudo apt install -y containerd.io

# Configure containerd and start service
sudo su -
mkdir -p /etc/containerd
containerd config default>/etc/containerd/config.toml

# restart containerd
sudo systemctl restart containerd
sudo systemctl enable containerd
systemctl status  containerd

 cgroup 드라이버 설치

systemd cgroup 드라이버를 사용하려면 에서 plugins.cri.systemd_cgroup = true 를 설정 /etc/containerd/config.toml하십시오. kubeadm을 사용할 때 kubelet 용 cgroup 드라이버를 수동으로 구성하십시오.

5단계: 마스터 노드 초기화

마스터로 사용할 서버에 로그인하고 br_netfilter 모듈이 로드되었는지 확인합니다.

$ lsmod | grep br_netfilter
br_netfilter           22256  0 
bridge                151336  2 br_netfilter,ebtable_broute

컨테이너 이미지 가져오기:

$ sudo kubeadm config images pull
[config/images] Pulled k8s.gcr.io/kube-apiserver:v1.22.2
[config/images] Pulled k8s.gcr.io/kube-controller-manager:v1.22.2
[config/images] Pulled k8s.gcr.io/kube-scheduler:v1.22.2
[config/images] Pulled k8s.gcr.io/kube-proxy:v1.22.2
[config/images] Pulled k8s.gcr.io/pause:3.5
[config/images] Pulled k8s.gcr.io/etcd:3.5.0-0
[config/images] Pulled k8s.gcr.io/coredns/coredns:v1.8.4

kubelet 서비스를 활성화합니다.

sudo systemctl enable kubelet

이제 etcd (클러스터 데이터베이스)와 API 서버를 포함하는 컨트롤 플레인 구성 요소를 실행할 시스템을 초기화하려고 합니다.

 

CRI 소켓이 여러 개인 경우 다음 --cri-socket중 하나를 선택 하는 데 사용하십시오.

# CRI-O
sudo kubeadm config images pull --cri-socket /var/run/crio/crio.sock

# Containerd
sudo kubeadm config images pull --cri-socket /run/containerd/containerd.sock

# Docker
sudo kubeadm config images pull --cri-socket /var/run/dockershim.sock

kubeadm init클러스터를 부트스트랩하는 데 사용되는 기본 옵션입니다.

--control-plane-endpoint : 모든 제어 평면 노드에 대한 공유 끝점을 설정합니다. DNS/IP일 수 있음
 --pod-network-cidr : 포드 네트워크 추가 기능을 설정하는 데 사용됨 CIDR
 --cri-socket : 런타임 소켓 경로를 설정하기 위해 컨테이너 런타임이 둘 이상인 경우 사용
 --apiserver-advertise-address : 이 특정 제어 평면 노드의 API 서버에 대한 광고 주소 설정

공유 엔드포인트가 없는 부트스트랩 (Worker 초기 설정 시 진행)

DNS 엔드포인트를 사용하지 않고 클러스터를 부트스트랩하려면 다음을 실행합니다.

sudo kubeadm init \
  --pod-network-cidr=192.168.0.0/16

공유 엔드포인트가 있는 부트스트랩(제어 평면 API의 DNS 이름)

클러스터 엔드포인트 DNS 이름을 설정하거나 /etc/hosts 파일에 레코드를 추가합니다.

$ sudo vim /etc/hosts
172.29.20.5 k8s-cluster.computingforgeeks.com

클러스터 생성: (Master Node 경우)

sudo kubeadm init \
  --pod-network-cidr=192.168.0.0/16 \
  --upload-certs \
  --control-plane-endpoint=k8s-cluster.computingforgeeks.com

참고 : 192.168.0.0/16 이 이미 네트워크 내에서 사용 중인 경우 위 명령에서 192.168.0.0/16을 대체하여 다른 포드 네트워크 CIDR을 선택해야 합니다.

컨테이너 런타임 소켓:

실행 시간 Unix 도메인 소켓 경로
도커 /var/run/docker.sock
용기에 담긴 /run/containerd/containerd.sock
만들기 /var/run/crio/crio.sock

선택적으로 런타임용 소켓 파일을 전달하고 설정에 따라 주소를 알릴 수 있습니다.

# CRI-O
sudo kubeadm init \
  --pod-network-cidr=192.168.0.0/16 \
  --cri-socket /var/run/crio/crio.sock \
  --upload-certs \
  --control-plane-endpoint=k8s-cluster.computingforgeeks.com

# Containerd
sudo kubeadm init \
  --pod-network-cidr=192.168.0.0/16 \
  --cri-socket /run/containerd/containerd.sock \
  --upload-certs \
  --control-plane-endpoint=k8s-cluster.computingforgeeks.com

# Docker
sudo kubeadm init \
  --pod-network-cidr=192.168.0.0/16 \
  --cri-socket /var/run/docker.sock \
  --upload-certs \
  --control-plane-endpoint=k8s-cluster.computingforgeeks.com

다음은 초기화 명령의 출력입니다.

....
[init] Using Kubernetes version: v1.22.2
[preflight] Running pre-flight checks
	[WARNING Firewalld]: firewalld is active, please ensure ports [6443 10250] are open or your cluster may not function correctly
[preflight] Pulling images required for setting up a Kubernetes cluster
[preflight] This might take a minute or two, depending on the speed of your internet connection
[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Starting the kubelet
[certs] Using certificateDir folder "/etc/kubernetes/pki"
[certs] Using existing ca certificate authority
[certs] Using existing apiserver certificate and key on disk
[certs] Using existing apiserver-kubelet-client certificate and key on disk
[certs] Using existing front-proxy-ca certificate authority
[certs] Using existing front-proxy-client certificate and key on disk
[certs] Using existing etcd/ca certificate authority
[certs] Using existing etcd/server certificate and key on disk
[certs] Using existing etcd/peer certificate and key on disk
[certs] Using existing etcd/healthcheck-client certificate and key on disk
[certs] Using existing apiserver-etcd-client certificate and key on disk
[certs] Using the existing "sa" key
[kubeconfig] Using kubeconfig folder "/etc/kubernetes"
[kubeconfig] Using existing kubeconfig file: "/etc/kubernetes/admin.conf"
[kubeconfig] Using existing kubeconfig file: "/etc/kubernetes/kubelet.conf"
[kubeconfig] Using existing kubeconfig file: "/etc/kubernetes/controller-manager.conf"
[kubeconfig] Using existing kubeconfig file: "/etc/kubernetes/scheduler.conf"
[control-plane] Using manifest folder "/etc/kubernetes/manifests"
[control-plane] Creating static Pod manifest for "kube-apiserver"
[control-plane] Creating static Pod manifest for "kube-controller-manager"
W0611 22:34:23.276374    4726 manifests.go:225] the default kube-apiserver authorization-mode is "Node,RBAC"; using "Node,RBAC"
[control-plane] Creating static Pod manifest for "kube-scheduler"
W0611 22:34:23.278380    4726 manifests.go:225] the default kube-apiserver authorization-mode is "Node,RBAC"; using "Node,RBAC"
[etcd] Creating static Pod manifest for local etcd in "/etc/kubernetes/manifests"
[wait-control-plane] Waiting for the kubelet to boot up the control plane as static Pods from directory "/etc/kubernetes/manifests". This can take up to 4m0s
[apiclient] All control plane components are healthy after 8.008181 seconds
[upload-config] Storing the configuration used in ConfigMap "kubeadm-config" in the "kube-system" Namespace
[kubelet] Creating a ConfigMap "kubelet-config-1.21" in namespace kube-system with the configuration for the kubelets in the cluster
[upload-certs] Skipping phase. Please see --upload-certs
[mark-control-plane] Marking the node k8s-master01.computingforgeeks.com as control-plane by adding the label "node-role.kubernetes.io/master=''"
[mark-control-plane] Marking the node k8s-master01.computingforgeeks.com as control-plane by adding the taints [node-role.kubernetes.io/master:NoSchedule]
[bootstrap-token] Using token: zoy8cq.6v349sx9ass8dzyj
[bootstrap-token] Configuring bootstrap tokens, cluster-info ConfigMap, RBAC Roles
[bootstrap-token] configured RBAC rules to allow Node Bootstrap tokens to get nodes
[bootstrap-token] configured RBAC rules to allow Node Bootstrap tokens to post CSRs in order for nodes to get long term certificate credentials
[bootstrap-token] configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token
[bootstrap-token] configured RBAC rules to allow certificate rotation for all node client certificates in the cluster
[bootstrap-token] Creating the "cluster-info" ConfigMap in the "kube-public" namespace
[kubelet-finalize] Updating "/etc/kubernetes/kubelet.conf" to point to a rotatable kubelet client certificate and key
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy

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

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/

You can now join any number of control-plane nodes by copying certificate authorities
and service account keys on each node and then running the following as root:

  kubeadm join k8s-cluster.computingforgeeks.com:6443 --token sr4l2l.2kvot0pfalh5o4ik \
    --discovery-token-ca-cert-hash sha256:c692fb047e15883b575bd6710779dc2c5af8073f7cab460abd181fd3ddb29a18 \
    --control-plane 

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join k8s-cluster.computingforgeeks.com:6443 --token sr4l2l.2kvot0pfalh5o4ik \
    --discovery-token-ca-cert-hash sha256:c692fb047e15883b575bd6710779dc2c5af8073f7cab460abd181fd3ddb29a18

출력의 명령을 사용하여 kubectl을 구성합니다.

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

echo 'export KUBECONFIG=$HOME/.kube/config' >> $HOME/.bashrc

클러스터 상태 확인:

$ kubectl cluster-info
Kubernetes master is running at https://k8s-cluster.computingforgeeks.com:6443
KubeDNS is running at https://k8s-cluster.computingforgeeks.com:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

설치 출력의 명령을 사용하여 마스터 노드를 추가할 수 있습니다.

kubeadm join k8s-cluster.computingforgeeks.com:6443 --token sr4l2l.2kvot0pfalh5o4ik \
    --discovery-token-ca-cert-hash sha256:c692fb047e15883b575bd6710779dc2c5af8073f7cab460abd181fd3ddb29a18 \
    --control-plane 

6단계: 마스터에 네트워크 플러그인 설치

이 가이드에서는 Calico 를 사용 합니다. 지원되는 다른 네트워크 플러그인 을 선택할 수 있습니다 .

kubectl create -f https://docs.projectcalico.org/manifests/tigera-operator.yaml 
kubectl create -f https://docs.projectcalico.org/manifests/custom-resources.yaml

다음 출력이 표시되어야 합니다.

customresourcedefinition.apiextensions.k8s.io/bgpconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/bgppeers.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/blockaffinities.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/clusterinformations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/felixconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworksets.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/hostendpoints.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamblocks.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamconfigs.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamhandles.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ippools.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/kubecontrollersconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networksets.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/apiservers.operator.tigera.io created
customresourcedefinition.apiextensions.k8s.io/imagesets.operator.tigera.io created
customresourcedefinition.apiextensions.k8s.io/installations.operator.tigera.io created
customresourcedefinition.apiextensions.k8s.io/tigerastatuses.operator.tigera.io created
namespace/tigera-operator created
Warning: policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+
podsecuritypolicy.policy/tigera-operator created
serviceaccount/tigera-operator created
clusterrole.rbac.authorization.k8s.io/tigera-operator created
clusterrolebinding.rbac.authorization.k8s.io/tigera-operator created
deployment.apps/tigera-operator created
.....
installation.operator.tigera.io/default created
apiserver.operator.tigera.io/default created

모든 포드가 실행 중인지 확인합니다.

$ watch kubectl get pods --all-namespaces
NAMESPACE     NAME                                                         READY   STATUS    RESTARTS   AGE
kube-system   calico-kube-controllers-76d4774d89-nfqrr                     1/1     Running   0          2m52s
kube-system   calico-node-kpprr                                            1/1     Running   0          2m52s
kube-system   coredns-66bff467f8-9bxgm                                     1/1     Running   0          7m43s
kube-system   coredns-66bff467f8-jgwln                                     1/1     Running   0          7m43s
kube-system   etcd-k8s-master01.computingforgeeks.com                      1/1     Running   0          7m58s
kube-system   kube-apiserver-k8s-master01.computingforgeeks.com            1/1     Running   0          7m58s
kube-system   kube-controller-manager-k8s-master01.computingforgeeks.com   1/1     Running   0          7m58s
kube-system   kube-proxy-bt7ff                                             1/1     Running   0          7m43s
kube-system   kube-scheduler-k8s-master01.computingforgeeks.com            1/1     Running   0          7m58s

마스터 노드가 준비되었는지 확인합니다.

# CRI-O
$ kubectl get nodes -o wide
NAME     STATUS   ROLES                  AGE   VERSION   INTERNAL-IP      EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION     CONTAINER-RUNTIME
ubuntu   Ready    control-plane,master   38s   v1.22.2   143.198.114.46   <none>        Ubuntu 20.04.3 LTS   5.4.0-88-generic   cri-o://1.22.0

# Containerd
$ kubectl get nodes -o wide
NAME     STATUS   ROLES                  AGE   VERSION   INTERNAL-IP      EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION     CONTAINER-RUNTIME
ubuntu   Ready    control-plane,master   15m   v1.22.2   143.198.114.46   <none>        Ubuntu 20.04.3 LTS   5.4.0-88-generic   containerd://1.4.11

# Docker
$ kubectl get nodes -o wide
NAME           STATUS   ROLES    AGE   VERSION   INTERNAL-IP      EXTERNAL-IP   OS-IMAGE           KERNEL-VERSION     CONTAINER-RUNTIME
k8s-master01   Ready    master   64m   v1.22.2   135.181.28.113   <none>        Ubuntu 20.04 LTS   5.4.0-37-generic   docker://20.10.8

7단계: 작업자 노드 추가

제어 플레인이 준비되면 예약된 워크로드를 실행하기 위해 클러스터에 작업자 노드를 추가할 수 있습니다.

엔드포인트 주소가 DNS에 없으면 /etc/hosts 에 레코드를 추가 합니다 .

$ sudo vim /etc/hosts
172.29.20.5 k8s-cluster.computingforgeeks.com

주어진 조인 명령은 클러스터에 작업자 노드를 추가하는 데 사용됩니다.

kubeadm join k8s-cluster.computingforgeeks.com:6443 \
  --token sr4l2l.2kvot0pfalh5o4ik \
  --discovery-token-ca-cert-hash sha256:c692fb047e15883b575bd6710779dc2c5af8073f7cab460abd181fd3ddb29a18

산출:

[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -oyaml'
[kubelet-start] Downloading configuration for the kubelet from the "kubelet-config-1.21" ConfigMap in the kube-system namespace
[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.

제어 플레인에서 아래 명령을 실행하여 노드가 클러스터에 합류했는지 확인합니다.

$ kubectl get nodes
NAME                                 STATUS   ROLES    AGE   VERSION
k8s-master01.computingforgeeks.com   Ready    master   10m   v1.22.2
k8s-worker01.computingforgeeks.com   Ready    <none>   50s   v1.22.2
k8s-worker02.computingforgeeks.com   Ready    <none>   12s   v1.22.2

$ kubectl get nodes -o wide

조인 토큰이 만료된 경우 작업자 노드에 조인하는 방법에 대한 가이드를 참조하십시오.

8단계: 클러스터에 애플리케이션 배포

단일 노드 클러스터만 있는 경우 마스터 노드에서 컨테이너 포드를 실행하는 방법에 대한 가이드를 확인하세요.

애플리케이션을 배포하여 클러스터가 작동하는지 확인해야 합니다.

kubectl apply -f https://k8s.io/examples/pods/commands.yaml

포드가 시작되었는지 확인

$ kubectl get pods
NAME           READY   STATUS      RESTARTS   AGE
command-demo   0/1     Completed   0          16s

9단계: Kubernetes 대시보드 설치(선택 사항)

Kubernetes 대시보드는 컨테이너화된 애플리케이션을 Kubernetes 클러스터에 배포하고, 컨테이너화된 애플리케이션의 문제를 해결하고, 클러스터 리소스를 관리하는 데 사용할 수 있습니다.

설치 가이드를 참조하십시오: NodePort로 Kubernetes 대시보드를 설치하는 방법

10단계: Metrics Server 설치(Pod 및 노드 리소스 사용량 확인용)

Metrics Server  는 리소스 사용량 데이터의 클러스터 전체 집계 도구입니다.  각 노드에서 Kubelet 에 의해 노출된  요약 API 에서 메트릭을 수집  합니다. 아래 가이드를 사용하여 배포하세요.

11단계: Prometheus/Grafana 모니터링 배포

Prometheus는 Kubernetes 클러스터의 고급 메트릭 기능에 액세스할 수 있는 완전한 솔루션입니다. Grafana는 Prometheus 데이터베이스에 수집 및 저장되는 메트릭의 분석 및 대화형 시각화에 사용됩니다. Kubernetes 클러스터에서 전체 모니터링 스택을 설정하는 방법에 대한 완전한 가이드가 있습니다.

12단계: 영구 저장소 구성 아이디어(선택 사항)

Kubernetes용 영구 스토리지 솔루션도 찾고 있다면 다음을 확인하십시오.

13. Nginx 인그레스 컨트롤러 설치

Nginx가 Kubernetes 워크로드용으로 선호하는 Ingress 컨트롤러인 경우 설치 프로세스에 대한 가이드를 사용할 수 있습니다.

더 많은 가이드:

유사한 Kubernetes 배포 가이드:

Docker Registry V2 Installation

소개

이 글에서는 기본적인 Docker Registry 설치법에 대해 다룰 것이다. 정말 자세한 내용은 공식 홈페이지를 참조하면 된다. Docker Registry란 Docker Image를 관리하는 Docker Hub 같은 Respository를 말한다. 개별적으로 Docker Image를 관리 할 일이 생기면 필수라고 생각된다. Docker Registry를 설치하기 위해서, docker와 docker-compose가 필요하다. 설치는 아래 글을 참고하자.

간단한 설치

공식홈페이지에 보면 아래처럼 단 한 줄로 Registry를 설치 할 수 있다고 나와있다.
$ docker run -d -p 5000:5000 registry:2.6
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
860c11dc6921        registry:2.6        "/entrypoint.sh /e..."   48 seconds ago      Up 47 seconds       0.0.0.0:5000->5000/tcp   brave_ptolemy
위 명령어로 설치된 Registry 기본 설정은 아래 명령어로 확인 할 수 있다.
$ docker exec 860c11dc6921 cat /etc/docker/registry/config.yml
version: 0.1
log:
  fields:
    service: registry
storage:
  cache:
    blobdescriptor: inmemory
  filesystem:
    rootdirectory: /var/lib/registry
http:
  addr: :5000
  headers:
    X-Content-Type-Options: [nosniff]
health:
  storagedriver:
    enabled: true
    interval: 10s
    threshold: 3
기본 설정대로 사용하면 제약사항이 너무 많다. 꼭 필요하다고 생각되는 부분만 변경해보도록 하겠다.

log

로그는 공식 홈페이지를 보고 입맛에 맞게 설정하면 된다. 지금 단계에서 크게 중요하지 않다.

storage

기본 설정대로면 container안에 디스크에 Docker Image가 저장된다. 이렇게되면 docker registry가 삭제되면 데이터가 같이 날아가게되므로, 설정은 그대로 두고 host에 있는 디렉토리를 mount 해줄 필요가 있다. 혹은 cloud storage를 사용하면 좋은데 대표적인 예로 AWS S3가 있다. 다른 옵션을 더 보고싶으면 공식 홈페이지 문서를 참고하자.
기본 설정대로면 캐쉬를 메모리에 하도록 되어있다. 이는 쓸데 없이 메모리를 사용하게 된다고 생각이 되는데, 다른 옵션으로 redis를 사용 할 수 있다. 캐쉬를 redis로 사용하기 위해서는 redis를 실행하고 설정을 따로 해줘야하는데, redis image를 사용하도록하자.
storage 부분이 redis 설정까지 추가해 이렇게 변경된다. redis addr에 redis:6379를 쓴 것은 redis를 docker container로 실행하고 link로 연결해 줄 것이기 때문이다.
storage:
  cache:
    blobdescriptor: redis
  filesystem:
    rootdirectory: /var/lib/registry
redis:
  addr: redis:6379

auth

기본 설정대로면 Docker Registry에 접근하기 위해서 그 어떤 인증도 필요하지 않다. Docker Registry V2부터 3rd party 인증시스템을 도입 할 수 있도록 JWT Token Base 인증 서버를 별도로 구현 할 수 있다. 이 부분은 여기서 함께 다루기엔 너무 복잡하므로 상대적으로 간단한 Basic Authorization을 이용하여 인증 시스템을 설정해보도록 하자.
설정을 살펴보면 realm, path를 지정하도록 되어있다. realm은 원하는 값을 넣어주고 path에는 .htpasswd 파일 경로를 넣어준다. docker registry에서 사용 할 .htpasswd 파일은 아래 명령어를 이용해 만들 수 있다. 아이디가 admin, 비밀번호가 1234인 경우이다.
$ docker run --rm --entrypoint htpasswd registry:2.6 -Bbn admin 1234 > .htpasswd
$ cat .htpasswd
admin:$2y$05$WmcysuiS7ZW7jyXMuZS9W.evGsOsnF3yz4o38Xy1KDMLkJbomZEm2

최종적으로 인증 정보가 들어간 설정이 아래와 같이 추가된다.
auth:
  realm: dgoh-registry
  path: /etc/docker/registry/.htpasswd

최종적인 config.yml

version: 0.1
log:
  fields:
    service: registry
storage:
  cache:
    blobdescriptor: redis
  filesystem:
    rootdirectory: /var/lib/registry
redis:
  addr: redis:6379
http:
  addr: :5000
  headers:
    X-Content-Type-Options: [nosniff]
auth:
  htpasswd:
    realm: dgoh-registry
    path: /etc/docker/registry/.htpasswd 
health:
  storagedriver:
    enabled: true
    interval: 10s
    threshold: 3

docker-compose.yml 작성

자세히 하려면 봐야 할 설정이 더 있겠지만, 정말 기본적인 설정은 끝났다. 이제 docker-compose.yml을 작성하고 디플로이를 하자.
version: 3
services:
  registry:
    image: registry:2.6
    volumes:
      - /var/lib/registry:/var/lib/registry # host filesystem을 mount
      - ./config.yml:/etc/docker/registry/config.yml:ro # 설정 파일 변경
      - ./.htpasswd:/etc/docker/registry/.htpasswd:ro # htpasswd mount
    links:
      - redis:redis # cache에 사용 할 redis container 연결
    ports:
      - 5000:5000 # 5000번을 이용해 통신
    depends_on:
      - redis # redis가 실행된 후, registry가 실행된다.

  redis:
    image: redis:3.0.7
docker-compose를 이용하여 실행한다.
$ docker-compose up
Starting registry_redis_1 ...
Starting registry_redis_1 ... done
Starting registry_registry_1 ...
Starting registry_registry_1 ... done
Attaching to registry_redis_1, registry_registry_1
마지막으로 registry에 제대로 접속 되는지 docker cli를 통해 확인한다.
$ docker login 127.0.0.1:5000
Username: admin
Password:
Login Succeeded

linux LVM(PV, VG, LV) (Create, delete, query, add) method

Linux에서 파티션 중 우리가 가장 흔히 사용하는 것이 바로 File System이다. File System에 워낙 익숙
해지기도 했고 디스크 추가 후 사용이 간편하여 가장 널리사용한다는게 필자 생각이다.
Linux File System은 흔히 우리가 알고 있는 ext1부터시작하여 현재 ext4까지 사용중이며 그 기능과
성능이 버전이 업그레이드되면서 함께 발전해왔다.
하지만 이런 ext file system을 사용할 경우 공간이 꽉 찼을 경우 더 큰 file system으로 교체하거나 심
지어는 새로운 파티션 조정을 위한 Linux 재설치까지 가는 경우가 있을 수 있다.
LVM 이런 수고를 덜 수 있는 강력한 기능을 덜 수 있는 녀석이다. 즉, LVM을 사용하면 유동적인 공간
할당을 통하여 Mount Point 관리를 더 효율적으로 할 수 있다고 하겠다.
 Oracle에서 ASM Disk를 생성할 때에도 이 LVM을 사용하여 Disk를 던져줄 수 있다. 오늘은 LVM 관리
방법에 대하여 이야기해본다.
 Step 1. LVM에 사용될 Disk 추가
일단 이번 테스트에 사용될 디스크는
20G * 2 = 40G
40G * 1 = 40G
총 80G Disk를 사용할 예정이다.
 Step 2. Disk Format & PV / VG / LV 생성
[root@localhost ~]# fdisk -l

추가된 3개의 Disk를 확인할 수 있다. 위에 언급한데로 20G * 2, 40G 하나를 추가하여 총 80G 용량의 하디드스크를 추가하였다. fdisk 명령을 통해 확인이 가능하다.

[root@localhost ~]# fdisk /dev/sdb       // sdc, sdd 까지 진행
 

여기서 주의 할 것은 Hex code는 Linux에서 사용되는 Linux LVM file system으로 사용하기 위한 코드명은 8e가 된다.

[root@localhost ~]# fdisk -l /dev/sdb     // sdc, sdd도 확인가능

위와 같이 사용 가능한 포멧으로 생성됐읗며 System이 Linux LVM인 것을 확인할 수 있다.

 

* LVM을 통한 Disk 생성
 – PV(Physical Volume)을 생성한다.
[root@localhost ~]# pvcreate /dev/sdb1 /dev/sdc1 /dev/sdd1
  Physical volume “/dev/sdb1” successfully created.
  Physical volume “/dev/sdc1” successfully created.
  Physical volume “/dev/sdd1” successfully created.
 – VG(Volume Group)을 생성한다.
[root@localhost ~]# vgcreate ASMDISK /dev/sdb1 /dev/sdc1 /dev/sdd1
  Volume group “ASMDISK” successfully created

 

 – LV(Logical Volume)을 생성한다.
[root@localhost ~]# lvcreate -L 40g -n DATA01 ASMDISK
  Logical volume “DATA01” created.
[root@localhost ~]# lvcreate -L 39.5g -n DATA02 ASMDISK
  Logical volume “DATA02” created.
 Step 3. PV / VG / LV 조회
 생성구문의 create 대신 display 명령을 붙여주면 조회가 가능하다.
[root@localhost ~]# pvdisplay
  — Physical volume —
  PV Name               /dev/sdb1
  VG Name               ASMDISK
  PV Size               <20.00 GiB / not usable 3.00 MiB
  Allocatable           yes
  PE Size               4.00 MiB
  Total PE              5119
  Free PE               125
  Allocated PE          4994
  PV UUID               Y16fLb-fmBl-Qga0-Vt0Q-xYGm-0YfF-L2HRz2
  — Physical volume —
  PV Name               /dev/sdc1
  VG Name               ASMDISK
  PV Size               <20.00 GiB / not usable 3.00 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              5119
  Free PE               0
  Allocated PE          5119
  PV UUID               eyCU5C-Bzuj-DXBg-qVZX-uhM2-y7Hc-5AxKlZ
  — Physical volume —
  PV Name               /dev/sdd1
  VG Name               ASMDISK
  PV Size               <40.00 GiB / not usable 3.00 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              10239
  Free PE               0
  Allocated PE          10239
  PV UUID               ODoaFo-qV2G-T2EE-28mT-S1Sh-DGou-2IZcZz
[root@localhost ~]# vgdisplay
  — Volume group —
  VG Name               ASMDISK
  System ID
  Format                lvm2
  Metadata Areas        3
  Metadata Sequence No  3
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               0
  Max PV                0
  Cur PV                3
  Act PV                3
  VG Size               <79.99 GiB
  PE Size               4.00 MiB
  Total PE              20477
  Alloc PE / Size       20352 / 79.50 GiB
  Free  PE / Size       125 / 500.00 MiB
  VG UUID               LzMB5j-IChS-RByT-pFNR-OJZk-opt8-hz6rdf
[root@localhost ~]# lvdisplay
  — Logical volume —
  LV Path                /dev/VG01/oracle
  LV Name                oracle
  VG Name                VG01
  LV UUID                02j5sM-lYwm-jOWj-Koc3-nprv-Y4TT-S1HGE0
  LV Write Access        read/write
  LV Creation host, time localhost, 2017-12-11 12:15:01 -0500
  LV Status              available
  # open                 1
  LV Size                <79.98 GiB
  Current LE             20474
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  – currently set to     8192
  Block device           249:0
  — Logical volume —
  LV Path                /dev/ASMDISK/DATA01
  LV Name                DATA01
  VG Name                ASMDISK
  LV UUID                HBQT0M-VEzf-XjPm-ZH05-MrRT-AK8V-NaMNwq
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2017-12-11 16:09:06 -0500
  LV Status              available
  # open                 0
  LV Size                40.00 GiB
  Current LE             10240
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  – currently set to     8192
  Block device           249:1
  — Logical volume —
  LV Path                /dev/ASMDISK/DATA02
  LV Name                DATA02
  VG Name                ASMDISK
  LV UUID                S7eJc5-nQQ0-6vn7-yVis-zC7J-AK8r-AlcbQB
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2017-12-11 16:09:33 -0500
  LV Status              available
  # open                 0
  LV Size                39.50 GiB
  Current LE             10112
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  – currently set to     8192
  Block device           249:2
 Step 4. PV / VG / LV 삭제
create, display 명령 대신 remove를 붙여 사용가능하다.
[root@localhost sbin]# pvremove /dev/sdb1
  Labels on physical volume “/dev/sdb1” successfully wiped.
[root@localhost sbin]# pvremove /dev/sdc1
  Labels on physical volume “/dev/sdc1” successfully wiped.
[root@localhost sbin]# pvremove /dev/sdd1
  Labels on physical volume “/dev/sdd1” successfully wiped.
[root@localhost sbin]# vgremove ASMDISK
Do you really want to remove volume group “ASMDISK” containing 1 logical volumes? [y/n]: y
Do you really want to remove active logical volume ASMDISK/DATA1? [y/n]: y
  Logical volume “DATA1” successfully removed
  Volume group “ASMDISK” successfully removed
 vg 삭제시에는 삭제하겠느냐는 물음과 함께 vg에 포함된 lv도 삭제되니 유의하도록 하자.
 Step 5. 기존 VG에 PV 추가
 기존에 사용하던 Volume Group이 공간이 부족해 추가를 원할때 사용이 가능하다. 일단 해당 Virture Machine에 Disk를 추가하고 포멧을 진행한다. 포멧은 Step 2의 절차를 따라하면 된다.
[root@localhost ~]# fdisk -l /dev/sde1
Disk /dev/sde: 128.8 GB, 128849018880 bytes, 251658240 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x625d1896
   Device Boot      Start         End      Blocks   Id  System
/dev/sde1            2048   251658239   125828096   8e  Linux LVM
 – VG에 추가 될 해당 Disk를 PV를 생성해준다.
[root@localhost ~]# pvcreate /dev/sde1
  Physical volume “/dev/sde1” successfully created.
 
 – 생성된 PV를 VG에 추가 할당 해준다.
[root@localhost sbin]# vgextend ASMDISK /dev/sde1
  Volume group “ASMDISK” successfully extended
 – 추가할당 해준 VG을 확인한다.
[root@localhost sbin]# vgdisplay
VG Name               ASMDISK
  System ID
  Format                lvm2
  Metadata Areas        4
  Metadata Sequence No  10
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                8
  Open LV               4
  Max PV                0
  Cur PV                4
  Act PV                4
  VG Size               199.98 GiB
  PE Size               4.00 MiB
  Total PE              51196
  Alloc PE / Size       20352 / 79.50 GiB
  Free  PE / Size       30844 / 120.48 GiB
  VG UUID               1M7FrH-e23z-216o-Hf5n-Ad8g-nJXk-WRF1Uf
 VG의 Size가 기존 80G에서 200G가 됐음을 확인할 수 있다.

VirtualBox에 VMware ESXi 설치 방법

중요:  IntelCPU를 소유하고 있는 경우VirtualBox에서실행되는 VM ESXi 호스트에서 새 VM 시스템을 시작할 수 없다는점에 유의하십시오. 

이것은 VirtualBox가 Intel CPU에 대한 중첩 가상화를 지원하지 않기 때문에 발생합니다. 

(VM 머신을 시작하려고 하면 “이 호스트는 Intel VT-x를 지원하지 않습니다.”라는 오류가 표시됩니다.) 따라서 Intel CPU를 소유하고 있다면VMware 플레이어에 ESXi설치하는것이 좋습니다.

VirtualBox에 ESXi vSphere Hypervisor를 설치하기 위한 하드웨어 요구 사항:

CPU: 호스트 시스템에는 최소 2개의 CPU 코어가 있어야 하고 CPU는 하드웨어 가상화 기능(Intel VT-x 또는 AMD RVI)을 지원해야 합니다. 시스템이 가상화를 지원하는지 확인하려면 CPUID CPU-Z 유틸리티를사용하십시오. *

* 참고:
1. 가상화 지원을 활성화하려면 BIOS 설정으로 이동 하여 Intel-VD(Intel VT-x) 또는 AMD VT 기술/기능을 활성화 합니다 .

RAM: ESXi에는 최소 2GB의 물리적 RAM이 필요합니다. VirtualBox에 ESXi를 설치하려면 최소 4GB(4096MB)의 RAM을 할당해야 합니다.

VirtualBox에 ESXi vSphere Hypervisor 6.7을 설치하기 위한 소프트웨어 요구 사항.

1. 이동 링크 및 작성 VM웨어 계정을 (당신이 이미 하나를 가지고 있지 않은 경우).
2. VMware vSphere Hypervisor(ESXi ISO) 이미지(VMware 도구 포함) 이미지를 다운로드 합니다 .

3. 평가판 라이센스(60일)를 무료(만료되지 않음)로 변환하려면 평가판 기간이 끝날 때 필요하므로 VMware vSphere Hypervisor 6 라이센스 키를 기록해 둡니다 . (기사의 끝을 참조하십시오).

4. VirtualBox에 ESXi VSphere Hypervisor를 설치하려면 여기 에서 Windows 호스트용 Virtualbox의 최신 릴리스를 다운로드하여 설치해야 합니다 .

영상

VirtualBox 호스트에 VMware vSphere Hypervisor(ESXi 서버)를 설치하는 방법.

1단계. ESXI용 가상 머신 생성 및 구성 *

1.   Oracle VM Virtual Box Manager를 시작하고 새로 만들기 를 클릭 합니다 .

vmware esxi 설치 virtualbox

2. 가상 머신의 이름(예: “eSXI vSphere”)을 지정하고 다음을 선택합니다.

유형: 리눅스

버전: Linux 2.6/3.x/4.x(64비트)

메모리 크기: 4096MB

하드 디스크: 지금 가상 디스크 만들기

3. 완료되면 만들기를 클릭 합니다.

VirtualBox에 VMware ESXi 6.7을 설치하는 방법.

4. 다음 화면에서 원하는 디스크 크기(예: 30GB)를 지정하고 ‘하드 디스크 파일 유형’: VDI(VirtualBox 디스크 이미지) 및 ‘실제 하드 디스크에 저장’: 동적 할당 의 기본 옵션을 그대로 두고 클릭합니다. 생성 .

VirtualBox에 ESXi 설치

5. 이제 새 가상 머신을 강조 표시하고 설정 을 클릭 합니다 .

영상

6a. 왼쪽에서 시스템 을 선택 하고 마더보드 탭에서 다음을 선택합니다.

  • 칩셋: ICH9
  • 포인팅 장치: PS/2 마우스

영상

6b. 그런 다음 프로세서 탭을 선택 하고…

  • 2개의   CPU를 할당합니다 .
  • PAE/NX 활성화 확인

영상

7. 그런 다음 스토리지를 선택 하고 광학 드라이브 추가  기호 를 클릭합니다 .

영상

8. 디스크 선택 을 선택한 다음 다운로드한 ‘vSphere Hypervisor(ESXi ISO)’ 파일을 선택합니다.

영상

9a. 마지막으로 네트워크 를 선택하고 호스트 전용 어댑터 를 선택한 다음 확인 을 클릭 합니다.

영상

9b. 마법사 기반 생성 프로세스 후에 가상화 기술을 실행할 수 있도록 생성된 VM을 수정해야 합니다.

이는 CLI(PowerShell/CMD)를 통해서만 가능합니다.

cd 'C:\Program Files\Oracle\VirtualBox\'
.\VBoxManage.exe modifyvm "VMwareESXi" --nested-hw-virt on

 

10. 시작 버튼을 클릭하고 아래로 진행하여 가상 머신에 ESXi vSphere Hypervisor를 설치합니다.

영상

2단계. VIRTUALBOX VM 머신에 VMWARE ESXI VSPHERE HYPERVISOR 6.7을 설치합니다.

* 참고: 물리적 시스템에 ESXi vSphere Hypervisor를 설치하는 경우 ESXi vSphere Hypervisor 설치 CD 미디어에서 시스템을 부팅하십시오.

1. 첫 화면에서 Enter 를 눌러 설치를 시작합니다.

VirtualBox 호스트에 ESXi vSphere Hypervisor를 설치하는 방법

2. VMware ESXI 설치 프로그램이 시작되어야 합니다…

영상

3. 시작 화면에서 Enter 키 를 누릅니다 .

영상

4. F11 키 를 눌러 사용권 계약에 동의합니다.

영상

5. 스토리지 옵션에서 Enter 키를 누릅니다 .

영상

6. 원하는 키보드 레이아웃을 선택하거나 기본값(미국)을 그대로 두고 Enter 키를 누릅니다 .

영상

7. 이제 원하는 비밀번호*를 두 번 입력 하고 Enter 키를 누릅니다 .

* 참고: 비밀번호는 최소 7자 이상이어야 하며 일반 및 대문자, 기호 및 숫자의 조합이어야 합니다.

영상

8. 마지막으로 F11 키 를 눌러 설치를 중단합니다. *

* VirtualBox 설치 참고 사항: ESXi 설치 시점에서 Intel 프로세서를 소유하고 있는 경우 화면에 다음 경고 메시지가 표시됩니다. “하드웨어 가상화 경고: 하드웨어 가상화는 이 CPU의 기능이 아니거나 BIOS에서 활성화되지 않았습니다.” 이 메시지를 무시하고 Enter 키를 눌러 계속하십시오. (이 기사의 시작 부분에서 말했듯이 VirtualBox는 Intel 프로세서에 대한 중첩 가상화를 지원하지 않기 때문에 이 메시지가 나타납니다.)

영상

9. 설치가 완료되면 설치 미디어를 제거하고 Enter 키 를 눌러 시스템을 재부팅합니다. *

영상

* 참고: VirtualBox에서 ESXi 설치 미디어(.ISO 파일)를 제거하려면 

  A.재부팅 후 VM 창을 닫고컴퓨터의 전원을 끕니다 .

영상

B. 그런 다음 VM 머신 스토리지 설정을 열고 ISO 파일을 제거한 다음 확인을 클릭 합니다.
C. 마지막으로 시작 버튼을 클릭하여 VMware ESXi 머신을 시작합니다.

영상

10. VMware ESXi 서버가 시작되면 DHCP에서 할당된 IP 주소를 “가져옵니다”. 아래 지침에 따라 ESXi 서버에 이 IP 주소를 사용하거나 새 고정 IP 주소를 설정할 수 있습니다.

영상

11. ESXi에서 IP 주소를 변경하려면 위 화면에서 F2 를 누른다 .
12. 루트 암호를 입력하고 Enter 키를 누릅니다.
13. 화살표 키를 사용하여 관리 네트워크 구성으로 이동 하고 Enter 키 를 누릅니다 .

image_thumb[1]_thumb[2]

14. IPv4 구성으로 이동 하고 Enter 키를 누릅니다 .

 image_thumb[3]_thumb[3]

(15) 로 이동 한 세트 정적 IPv4 주소 및 네트워크 구성 및 히트 공간 을 선택할 수 있습니다.
16. 고정 IP 주소, 서브넷 마스크 및 게이트웨이를 입력 하고 Enter 키를 누릅니다 .

image_thumb[5]_thumb[3]

17. 그런 다음 선택 DNS 구성 및 히트 입력합니다 .

image_thumb[7]_thumb[3]

18. 이동 정보는 다음의 제품에 다음 DNS 서버 주소 및 호스트 이름을 사용 하고 공격 공간 을 선택할 수 있습니다.
19. 유형 DNS 서버 주소 및 선택적으로 다른 호스트 이름을 지정합니다. 완료되면 Enter 키를 누릅니다 .

image_thumb[9]_thumb[1]

20. ESC 를 눌러 종료한 다음 Y 를 눌러 변경 사항을 적용하고 관리 네트워크를 다시 시작합니다.

image_thumb[11]_thumb[1]

(21) 이어서 프레스 ESC 로그 아웃 한 후 프레스 F12 및 종료 ESXi 서버.
22. VirtualBox Manager에서 새 가상 머신을 강조 표시하고 설정 을 클릭 합니다 .

영상

(23) 에서 네트워크 : 옵션에 첨부를 선택 브리지 어댑터를 클릭하고 OK

영상

24. VM ESXi 머신을 시작합니다.
25. ESXi 서버가 시작되면 웹 브라우저(호스트 컴퓨터에서)를 열고 ESXi 서버의 IP 주소로 이동하여 VMWare ESXi vShere 서버 관리를 시작합니다.

영상

추가 도움말: VMware ESXi Hypervisor 평가 라이센스를 무료로 변환하려면.

* 참고: 60일 동안(평가 기간 종료 시까지) ESXi의 모든 기능을 탐색하고 테스트할 수 있습니다. 따라서 평가 기간이 종료되기 전에 평가 라이센스를 무료로 변환하지 마십시오.

1. 관리 -> 라이선스로 이동 한 다음 라이선스 할당 을 클릭 합니다 .

image_thumb17_thumb[2]

2. vSphere Hypervisor 6 라이센스 키를 복사하여 붙여넣은 다음 라이센스 확인 을 클릭합니다.

image_thumb15_thumb

3. 마지막으로 라이선스 할당을 클릭 합니다.

image_thumb16_thumb[1]

4. 이제 ‘만료 날짜’ 상태가 “Never”인 화면이 표시되어야 합니다.

image_thumb18_thumb[2]

그게 다야!