분산 시스템의 가장 중요한 데이터를 위한 신뢰할 수 있는 분산 키-값 저장소

 

etcd는 분산 시스템 또는 시스템 클러스터에서 액세스해야 하는 데이터를 안정적으로 저장하는 방법을 제공하는 강력하고 일관된 분산 키-값 저장소입니다. 네트워크 파티션 중에 리더 선택을 정상적으로 처리하고 리더 노드에서도 시스템 오류를 허용할 수 있습니다.

 

Simple interface

Read and write values using standard HTTP tools, such as curl

Key-value storage

Store data in hierarchically organized directories, as in a standard filesystem

Watch for changes

Watch specific keys or directories for changes and react to changes in values

 

For details, see Install.

설치

binary 파일로 설치하는 방법과 source를 build하는방법 그리고 패키지로 설치하는 3가지 방법이 있다. 여기서는 binary 파일로 설치하는 방법과 패키지로 설치하는 방법을 설명한다.

1) install binaries

- 파일 다운로드 : Releases

- 압축해제

tar -xf etcd-v3.5.0-linux-amd64.tar

- 환경설정

경로 추가 : 기존 PATH 에 압축해제한 경로추가 또는 압축해제한 파일을 /usr/local/bin 으로 이동

(예제 : mv etcd etcdctl etcdutl /usr/local/bin, 단 /usr/local 에 사용권한이 있어야 함) 

  

- 설치확인

$ etcd --version
etcd Version: 3.5.0
Git SHA: 946a5a6f2
Go Version: go1.16.3
Go OS/Arch: linux/amd64

 

2) 패키지 설치 : 

패키지 설치 version

- etcd server 설치 : etcd

sudo apt install etcd-server

- etcd client 설치 : etcdctl

sudo apt install etcd-client

- 설치확인

$ etcd --version
etcd Version: 3.2.26
Git SHA: Not provided (use ./build instead of go build)
Go Version: go1.13.8
Go OS/Arch: linux/amd64

 

시작하기

etcd 실행하기(참고 etcd version 에 따라 결과값이나 명령어가 상이할 수 있음)

 

패키지로 설치한 etcdctl version은 3.2.26 인데 이 버전에서 etctl put 은 실행이 안됨. 대신 set 을 사용해야 한다. version 에 따라 명령어가 차이가 있음을 알아야 한다. 아래 명령어는 etcd version 3.5 에서 수행한 내용이다.
  1. etcd 실행: foreground 로 etcd가 실행된다. 백그라운드로 실행하려면 etcd &  명령어로 수행한다.
    Note: 화면에 나오는 내용은 log 내용임
$ etcd
{"level":"info","ts":"2021-09-17T09:19:32.783-0400","caller":"etcdmain/etcd.go:72","msg":... }
⋮

 

  1. 다른 터미털에서 etcdctl 명령어로 key-value를 입력
$ etcdctl put greeting "Hello, etcd"
OK

 

  1. key에 대한 value값을 조회
$ etcdctl get greeting
greeting
Hello, etcd

 

etcd 툴

etcd manager 라는 UI 관리 툴로 관리 할 수 있다. 아래 사이트에서 다운로드 하고 설치한다.

http://etcdmanager.io/ 

 

1. 

'쿠버네티스' 카테고리의 다른 글

쿠버네티스 설치 - unbutu 22.04  (0) 2022.06.27
CKA 자격증 취득하기 - 시험예상 문제  (0) 2022.06.09
쿠버네티스 보충  (0) 2022.06.08
CKA 자격증 취득하기 #2  (0) 2022.05.23
CKA 자격증 취득하기 #1  (0) 2022.05.18

Install Kubernetes Cluster on Ubuntu 22.04 with kubeadm

[ 설치환경 ]

- OS : Ubuntu 22.04 LTS(2 CPU, 4GB Memory, 20GB Disk 이상)

- master node : 1대(hostname : master)

- worker node : 2대(hostname : worker-1, worker-2)

 

설치순서

✔  공통 설치(master node, worker node 에 설치)

1) CRI 설치

2) kubeadm, kubectl, kubelet 설치

3) CNI 설치

 

 master node

- kubeadm init 실행

 

 worker node

- kubeadm join 실행

 

 

1. 공통 설치(master node, worker node 에 설치)

1) CRI  설치(Container Runtime Interface)

도커 이미지를 관리해주는 CRI를 설치합니다. CRI는 많은 종류가 있는데 본 문서에서는 containerd 를 설치합니다.

sudo apt-get update
sudo apt-get install containerd

 

2) kubernetes 설치 전 환경설정

- br_netfilter 모듈을 로드합니다.  br_netfilter 모듈이 로드되었는지 확인하려면

lsmod | grep br_netfilter 를 실행하면 됩니다.(kubernetes documents 에서 "container runtimes"로 검색)

sudo modprobe br_netfilter

- iptables가 브리지된 트래픽을 보게 하기

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo sysctl --system

- ip_forward 설정

echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward

 

- swap off

$ sudo swapoff -a

- port 확인

master node에 6443, 8080 port 가 사용중인지 확인합니다. 사용 중인 서비스가 없어야 합니다.

쿠버네티스 API 서버는 2개의 포트에서 HTTP를 서비스합니다.

- 8080 port : 스트 및 부트스트랩을 하기 위한 것이며 마스터 노드의 다른 구성요소 (스케줄러, 컨트롤러 매니저)가 API와 통신

- 6443 port : TLS를 사용

telnet 10.10.1.15(예시, master node IP Address) 6443

 

- 방화벽 open(서버 방화벽 disable)

방화벽이 설정을 확인한 다음 방화벽이 enable되어 있으면 방화벽을 disable 합니다. 

## 방화벽 설정 확인
sudo ufw status

## 방화벽 disable
sudo ufw disable

 

 

3) kubectl, kubeadm, kubelet 설치

sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl

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 kubelet kubeadm kubectl

 

2. master node  설치

1) control plane 구성

control plane은 master node에만 구성합니다.(multi master 구성시에는 multi master 에 구성)

contron plane을 구성한다는 것은 kube-apiserver, kube-controller-manager, kube-scheduler, etcd, coreDns 를 설치하는 것입니다. 사용자가 kubeadm init 명령어만 수행하면 kubeadm 이 알아서 구성을 해줍니다.

kubeadm init 명령어로 control plane 을 구성합니다. 명령어 수행 제일 하단에 아래와 같이 kubeadm join 으로 시작하는 정보가 표시됩니다. 이 명령어는 나중에 worker node 에서 수행하여 cluster를 구성하는 명령어입니다. 별도로 저장해 놓습니다.

$ kubeadm init

## 수행결과
...
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/
...
kubeadm join 10.10.1.20:6443 --token x8g6zc.1yb94eh1u1940rrj \
	--discovery-token-ca-cert-hash sha256:996f5ea00339533897cd991fb005349eeb366af000b13c8458f9743d5ada230c

 

root와 일반 user가 쿠버네티스 명령어를 사용할 수 있도록 환경 설정(master node에 설정)을 합니다.

 

root 유저로 kubectl 명령어를 수행하려면 root 유저로 아래를 설정합니다.

export KUBECONFIG=/etc/kubernetes/admin.conf

 

일반 유저로 kubectl 명령어를 수행하기 위해 일반 유저로 아래를 설정합니다.

mkdir -p $HOME/.kube

## admin.conf 파일은 kubelet 설치 시 생성
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

참고) 쿠버네티스 클러스터 구성 시 pod 의 네트워크 대역을 설정할 수 있습니다.

kubeadm init --pod-network-cidr=10.244.0.0/16;

 

2) CNI 설치(master node에 설정)

CNI(Container Network Interface)를 설치하여 Pod 간 통신을 할 수 있도록 합니다.

pod 네트워크 애드온 종류는 많습니다(calico, canal, flannel, romana, weave net 등).

원하는 네트워크 애드온을 마스터 노드에 설치합니다.

본 문서에서는 weave network add on 을 설치합니다. 

Weave Net을 설치하기 전에 TCP 6783 및 UDP 6783/6784 포트가 방화벽에 의해 차단되지 않았는지 확인해야 합니다.

아래 명령어로 weave network add-on을 설치합니다.

<weabenet 설치>

kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"

## 실행결과
serviceaccount/weave-net created
clusterrole.rbac.authorization.k8s.io/weave-net created
clusterrolebinding.rbac.authorization.k8s.io/weave-net created
role.rbac.authorization.k8s.io/weave-net created
rolebinding.rbac.authorization.k8s.io/weave-net created
daemonset.apps/weave-net created

2022.10.20 일 기준으로 kubectl 버전에 따라 위의 명령어가 수행되지 않을 경우, 아래 명령어를 수행한다

kubectl apply -f https://github.com/weaveworks/weave/releases/download/v2.8.1/weave-daemonset-k8s.yaml

<calico 설치>

1. operator 설치

kubectl apply -f https://github.com/coreos/flannel/raw/master/Documentation/kube-flannel.yml

2. calico 설정 파일 다운로드

curl https://raw.githubusercontent.com/projectcalico/calico/v3.24.3/manifests/custom-resources.yaml -O

3. calico 설치

kubectl create -f custom-resources.yaml

 

<flannel 설치>

주의할 점 : master node에서 컨트롤 플레인 설정 시 반드시 --pod-network-cidr=10.244.0.0/16 옵션으로 수행해야 한다

sudo kubeadm init --pod-network-cidr=10.244.0.0/16

아래 명령어로 flannel CNS를 설치한다.

kubectl apply -f https://github.com/coreos/flannel/raw/master/Documentation/kube-flannel.yml

 

3. worker node  Join

worker node를 master node에  join 시킵니다.

master node 에서 수행한 kubeadm init 명령어의 실행 결과창에서 보여진 kubeadm join으로 시작되는 부분을 실행해 줍니다.

kubeadm join 10.10.1.15:6443 --token 2gcmlw.zfvrc2b42j3q30zk \
	--discovery-token-ca-cert-hash sha256:aeb530a1ee53667a603d53d9d9abe12a32009b9f432b0fbca40fa1116c1fcc46

 

4. 쿠버네티스 구성 확인

마스터 노드(control-plane 노드)에서 kubectl get nodes 로 node 정보를 확인합니다. 아래와 같이 조회되면 정상입니다.

STATUS 가 모두 Ready 상태여야 합니다.

$ kubectl get nodes
NAME       STATUS   ROLES                  AGE     VERSION
master     Ready    control-plane,master   10h     v1.23.6
worker-1   Ready    <none>                 9h      v1.23.6
worker-2   Ready    <none>                 2m40s   v1.23.6

 

5.  kubectl 예제

kubectl get 명령어로 클러스터를 구성하고 있는 node 정보를 볼 수 있습니다.

## node 정보조회
$ kubectl get nodes

## node 정보 상세조회
$ kubectl get nodes -o wide

컨테이너를 실행하면서 kubectl 명령어 사용하기

아래 명령어는 nginx 최신 버전의 이미지로 webserver 라는 이름의 pod를 생성하고 실행하라는 내용입니다.

$ kubectl run webserver --image=nginx:latest --port 80
pod/webserver created

생성된 pod를 확인합니다. 아래 내용을 보면 현재 상태가 container creating 인 것을 확인할 수 있습니다. pod가 정상적으로 생성완료되면 running으로  상태가 변경됩니다. 현재 진행되는 상태를 보려면 kubectl describe pods 명령어를 수행합니다.

$ kubectl get pods
NAME        READY   STATUS              RESTARTS   AGE
webserver   0/1     ContainerCreating   0          23s

## pods 정보 확인
$ kubectl get pods webserver -o wide
NAME        READY   STATUS    RESTARTS   AGE   IP          NODE     NOMINATED NODE   READINESS GATES
webserver   1/1     Running   0          49m   10.44.0.1   node-1   <none>           <none>

## pods 상태 상세확인
$ kubectl describe pods webserver
## 실행결과
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  57s   default-scheduler  Successfully assigned default/webserver to node-1
  Normal  Pulling    56s   kubelet            Pulling image "nginx:latest"
  Normal  Pulled     48s   kubelet            Successfully pulled image "nginx:latest" in 8.496066344s
  Normal  Created    48s   kubelet            Created container webserver
  Normal  Started    48s   kubelet            Started container webserver

node-1에서 10.44.0.1 IP로 nginx 웹서버가 작동하고 있는 것을 확인할 수 있습니다.

 

 

컨테이너 확인하기

curl 명령어로 위에서 생성한 nginx pod 가 정상 동작하는지 확인해 봅니다.(참고. elinks(이링크스)라는 유닉스 기반 운영 체제를 위한 텍스트 기반 콘솔 웹 브라우저로 웹 페이지를 확인할 수 있습니다.)

curl 10.44.0.1

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
....

 

kubectl create 명령어

파일 또는 표준 입력에서 리소스를 생성합니다. JSON and YAML 형식의 파일을 사용할 수 있습니다.

 

usage:
  kubectl create deployment NAME --image=image -- [COMMAND] [args...] [options]

 

kubectl create deployment mainui --image=httpd:latest --replicas=3

생성된 pod를 확인합니다.

1) kubectl get deployment.apps 명령어로 확인

kubectl get deployments.apps 
NAME     READY   UP-TO-DATE   AVAILABLE   AGE
mainui   3/3     3            3           46s

2) kubectl get pods 명령어로 확인

$ kubectl get pods
NAME                      READY   STATUS    RESTARTS   AGE
mainui-7bdb5f79fb-4qvhc   1/1     Running   0          3m29s
mainui-7bdb5f79fb-btblc   1/1     Running   0          3m29s
mainui-7bdb5f79fb-nrdv5   1/1     Running   0          3m29s
webserver                 1/1     Running   0          128m

 

배포한 웹서버의 웹페이지 변경하기

kubectl exec  명령어로 위에서 생성한 webserver pod의 웹페이지를 변경해 봅니다.

kubectl exec  명령어는 동작중인 컨테이너의 셸에 접근할 수 있도록 해주는 명령어입니다.

kubectl exec --stdin --tty webserver -- /bin/bash
또는
kubectl exec -it webserver -- /bin/bash

## 실행결과(컨테이너에 접속됨)
root@webserver:/#

 

nginx 웹페이지는 /usr/share/nginx/html 디렉토리에 있습니다. index.html 파일이 웹서버의 첫 웹페이지입니다.이 웹페이지를 원하는 내용으로 변경하고 curl이나 elinks 로 변경된 내용을 확인합니다.

# cat > index.html
NGINX 웹서버입니다.
ctrl + D 를 클릭하여 저장합니다.
# exit

$ curl 10.44.0.1
NGINX 웹서버입니다.

 

nginx log도 확인해 봅니다. nginx log는 컨테이너의 /var/log/nginx 밑에 access.log, error.log 파일입니다.

$ kubectl logs webserver

...
10.32.0.1 - - [05/May/2022:16:27:14 +0000] "GET / HTTP/1.1" 200 615 "-" "ELinks/0.13.1 (textmode; Linux 5.13.0-1024-gcp x86_64; 153x16-2)" "-"
10.44.0.0 - - [05/May/2022:18:15:45 +0000] "GET / HTTP/1.1" 200 29 "-" "curl/7.68.0" "-"
10.44.0.1 - - [05/May/2022:18:16:20 +0000] "GET / HTTP/1.1" 200 29 "-" "curl/7.74.0" "-"

이제 외부에서 pod에 접속할 수 있도록 port-forward 명령어를 사용합니다.

아래 명령어는 외부에서 8080으로 접속하면 pod의 80 port로 forwarding 하는 예시입니다.

$ kubectl port-forward --address=0.0.0.0 webserver 8080:80

다른 서버에서 curl 명령어를 사용하여 웹서버 페이지를 호출해 봅니다.

$ curl http://10.10.1.35:8080

NGINX 웹서버입니다

위에서 생성한 mainui pod의 개수를 3개에서 kubectl edit 명령어로 변경해 봅니다.

아래 명령어를 수행하면 mainui pod에 대한 설정값을 vi 에디터로 불러옵니다. 여기서 변경하고자 하는 값을 변경하면 됩니다. 본 문서에서는 replicas를 3개에서 5개로 변경해 보겠습니다. 변경 후 :wq 로 저장하고 vi 에디터를 빠져나옵니다.

kubectl edit deployments.app mainui

....
spec:
  progressDeadlineSeconds: 600
  replicas: 5
...

pod 갯수가 변경되었는지 확인합니다. 아래와 같이 mainui pod가 5개로 변경된 것을 볼 수 있습니다.

kubectl get pods

## 실행결과
$ kubectl get pods
NAME                      READY   STATUS    RESTARTS   AGE
mainui-7bdb5f79fb-4qvhc   1/1     Running   0          76m
mainui-7bdb5f79fb-8t9r9   1/1     Running   0          2m23s
mainui-7bdb5f79fb-btblc   1/1     Running   0          76m
mainui-7bdb5f79fb-nrdv5   1/1     Running   0          76m
mainui-7bdb5f79fb-q6nlg   1/1     Running   0          61s
webserver                 1/1     Running   0          3h20m

 

pod 생성할 내용을 파일로 생성해 봅니다.

--dry-run 플래그를 사용하여 실제로 제출하지 않고 클러스터로 보낼 오브젝트를 미리 볼 수 있습니다.

리다이텍션으로 파일로 저장할 수도 있습니다.

kubectl run webserver --image=nginx --port 80 --dry-run=client -o yaml > webser.yaml

yaml 파일로 pod를 생성합니다. 기존에 생성한 이름과 동일한 pod를 생성하므로 기존 pod를 삭제한 후 실행합니다.

## 기존 webserver pod 삭제
$ kubectl delete pod webserver

## yaml 파일로 pod 생성
$ kubectl create -f webserver.yaml

## 생성된 pod 확인
$ kubectl get pods

 

[참고] kubectl create vs apply 

 

kubectl create
kubectl create는 명령형 관리를 위한 것입니다. 이 접근 방식에서는 생성, 교체 또는 삭제하려는 항목을 Kubernetes API에 알립니다. 간단히 말해서 create는 새 객체를 생성합니다. 리소스가 이미 있는 경우 오류가 발생합니다.

 

kubectl apply

kubectl apply는 다른 변경 사항을 개체에 적용하더라도 라이브 개체에 적용했을 수 있는 변경 사항(즉, 규모를 통해)이 "유지 관리"되는 선언적 관리 접근 방식의 일부입니다.
apply는 우리가 필요로 하는 것을 정의함으로써 기존 객체를 점진적으로 변경합니다. 리소스가 이미 있는 경우 오류가 발생하지 않습니다.

 

pod 삭제

예제) kubectl delete pods <pod> : <pod> 부분에 삭제할 pod 이름을 입력합니다.

kubectl delete pods webserver

 

 

 

 

'쿠버네티스' 카테고리의 다른 글

쿠버네티스 - play with k8s  (0) 2022.10.20
CKA 자격증 취득하기 - 시험예상 문제  (0) 2022.06.09
쿠버네티스 보충  (0) 2022.06.08
CKA 자격증 취득하기 #2  (0) 2022.05.23
CKA 자격증 취득하기 #1  (0) 2022.05.18

How to Set or Change the Time Zone in Linux

 

현재 TimeZone 확인

timedatectl은 시스템의 시간과 날짜를 보고 변경할 수 있는 명령어입니다. 모든 최신 시스템 기반 Linux 시스템에서 사용할 수 있습니다.

현재 시간대를 보려면 옵션이나 인수 없이 timedatectl 명령을 실행합니다.

 

timedatectl
               Local time: Fri 2022-06-24 05:50:38 UTC
           Universal time: Fri 2022-06-24 05:50:38 UTC
                 RTC time: Fri 2022-06-24 05:50:38
                Time zone: Etc/UTC (UTC, +0000)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

 

위의 출력은 시스템의 시간대가 UTC로 설정되었음을 보여줍니다.
시스템 시간대는 /etc/localtime 파일을 /usr/share/zoneinfo 디렉토리의 바이너리 timezone 에 심볼릭 링크로 구성됩니다.

 

시간대를 확인하는 또 다른 방법은 ls 명령을 사용하여 심볼릭 링크가 가리키는 경로를 보는 것입니다.

ls -l /etc/localtime
lrwxrwxrwx 1 root root 27 Dec  3 16:29 /etc/localtime -> /usr/share/zoneinfo/Etc/UTC

Time Zone 변경

시간대를 변경하기 전에 사용하려는 시간대 이름을 찾아야 합니다. 표준 시간대 명명 규칙은 일반적으로 "지역/도시" 형식을 사용합니다.
사용 가능한 모든 시간대를 보려면 timedatectl 명령을 사용하거나 /usr/share/zoneinfo 디렉토리에 있는 파일을 나열합니다.

timedatectl list-timezones

...
America/Montserrat
America/Nassau
America/New_York
America/Nipigon
America/Nome
America/Noronha
...

현재 위치에 맞는 시간대를 확인한 후 루트 또는 sudo 로 다음 명령을 실행합니다.

sudo timedatectl set-timezone <your_time_zone>

예를 들어 시스템의 시간대를 Asia/Seoul 로 변경하려면 다음을 입력합니다.

sudo timedatectl set-timezone Asia/Seoul

변경 사항을 확인하려면 timedatectl 명령을 다시 호출합니다.

timedatectl

               Local time: Fri 2022-06-24 15:00:17 KST
           Universal time: Fri 2022-06-24 06:00:17 UTC
                 RTC time: Fri 2022-06-24 06:00:17
                Time zone: Asia/Seoul (KST, +0900)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

 

이전 Linux 배포판을 실행 중이고 시스템에 timedatectl 유틸리티가 없는 경우 /etc/localtime을 /usr/share/zoneinfo 디렉토리의 시간대에 심볼릭 링크하여 시간대를 변경할 수 있습니다.
현재 심볼릭 링크 또는 파일을 제거합니다.

sudo rm -rf /etc/localtime

구성하려는 시간대를 식별하고 symlink를 생성합니다.

sudo ln -s /usr/share/zoneinfo/Asia/Seoul /etc/localtime

 

/etc/localtime 파일을 나열하거나 date 명령어로 변경된 시간을 확인합니다.

date

 

 

chromedriver가 포함된 파이썬으로 개발한 프로그램을 실행파일로 만드는 방법입니다. 

 

 

1. pyintaller 설치

파이썬으로 개발한 프로그램을 실행파일로 만들기 위한 도구인 pyinstaller 를 설치합니다.

pip install pyinstaller

 

2. chromedriver 추가

chromedriver를 사용하여 자동 스크롤링이나 웹화면을 호출하는 경우에 chromedriver가 필요한데, 아래는 chromedriver를 추가한 프로그램입니다.

아래처럼하면 현재 OS에 설치된 크롬브라우저의 버전에 맞는 chromedriver를 다운로드하여 사용합니다.

chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option('excludeSwitches', ['enable-logging'])
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options)
driver.maximize_window()

chrome_options.add_experimental_option('excludeSwitches', ['enable-logging'])

## 실행시 아래 오류 발생 방지 : 실행 시 아래 오류가 발생하는데 이를 방지하기 위한 부분
## USB: usb_device_handle_win.cc:1048 Failed to read descriptor from node connection: 시스템에 부착된 장치가 작동하지 않습니다. (0x1F)

## C:\Users\[사용자]\.wdm\drivers\chromedriver\win32\[크롬버전]110.0.5481 디렉토리 경로에 chromedriver.exe 파일이 다운로드됩니다.

예) 사용자가 admin이고 크롬버전이 110.0.5481인 경우 C:\Users\admin\.wdm\drivers\chromedriver\win32\110.0.5481 디렉토리 경로에 chromedriver.exe 파일이 다운로드됨

 

3. 실행파일 생성

sysntax : pyinstaller <python-file> --onefile --noconsole --add-binary  "<chromedriver.exe>;."

<python-file> : 실행파일을 만들고자 하는 python 파일명(파일 위치를 지정할 수 있음)

<chromedriver.exe> : chromedriver.exe 파일의 위치와 chromedriver.exe 파일명(파일 위치를 지정할 수 있음)

pyinstaller daum_login.py --onefile --noconsole --add-binary  "chromedriver.exe;."

[optioins]

--onefile : 하나의 실행파일을 생성

--noconsole : 실행파일을 실행 시 콘솔에 메시지를 출력하지 않습니다.

--add-binary : 소스위치:포함위치(chromedriver.exe;. -> chromedriver.exe 파일을 현재 디렉토리에 포함하라는 의미). linux/linux인 경우에는 세미콜론(;) 대신 콜론 문자(:)를 사용

--add-file : 소스위치:포함위치(README;. -> README 파일을 현재 디렉토리에 포함)

 

기타 옵션은 아래 URL 참조

https://pyinstaller.org/en/stable/usage.html

pyinstaller로 컴파일하면 아래와 같은 구조의 디렉토리가 생성됩니다.

dist 디렉토리에 실행파일이 생성됩니다.

C:.
├─build
│  └─daum_login
├─dist
└─__pycache__

 

4. 예제 프로그램

아래 예제는 daum에 자동 로그인하는 프로그램 예제입니다. daum 계정이 있으면 아래 내용 중 <daum 계정ID>, <계정 패스워드> 부분을 본인의 계정/패스워드로 수정하면 자동 로그인할 수 있습니다.

- 파일명 : daum_login.py

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
import time

chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option('excludeSwitches', ['enable-logging'])
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options)
driver.maximize_window()

driver.get("https://logins.daum.net/accounts/signinform.do?url=https%3A%2F%2Fwww.daum.net")

## ID/Password 입력
elem = driver.find_element(By.NAME, "id")
elem.send_keys("<daum 계정ID")
elem = driver.find_element(By.NAME, "pw")
elem.send_keys("<계정 패스워드>")

## login 버튼클릭
login_btn=driver.find_element(By.ID, "loginBtn");
login_btn.click();

# 프로그램 실행 후 화면을 10초가 유지
time.sleep(10)

아래와 같이 2가지 방법 중 하나로 컴파일합니다.

## 현재 디렉토리에서 컴파일하는 방법(단, chromedriver.exe는 py 파일과 같은 폴더에 있어야 함)
## 위의 chromedriver.exe 다운로드 경로에서 복사하여 붙여넣기한다.
pyinstaller daum_login.py --onefile --noconsole --add-binary  "chromedriver.exe;."

## 전체 경로를 지정한 컴파일 방법
## py 파일이 C:\python_project\에 있고 chromedriver.exe 파일이 C:\python_project 에 있을 때
## py 파일과 chromedriver.exe 파일 위치는 각자의 위치로 지정
pyinstaller C:\python_project\daum_login.py --onefile --add-binary  "C:\python_project\chromedriver.exe;."

 

컴파일한 디렉토리 하위에 dist 폴더가 생성됩니다. 이 폴더에 실행파일이 생성됩니다.

예제에서는 C:\python_project\dist 폴더에 daum_login.exe 실행 파일이 생성됩니다.

 

<참고> 

실행파일을 실행한 후 실행이 종료되면 브라우저가 종료되는데 이를 방지하기 위한 방법으로 아래 내용을 추가했으나, 작동하지 않고 프로그램이 종료됨. 

chrome_options.add_experimental_option('detach', True) 

 

from seleniumwire import webdriver
seleniumwire 로 webdriver를 설정했으나, 역시 프로그램이 종료됨.

리눅스 서버 재부팅 시 Linux 서비스 자동 기동 설정 방법

많은 방식이 있지만 주로 사용되는 2가지 방식 중 최신에 많이 사용되는 설정 방법을 설명합니다.

 

자동기동 방법

1) init 데몬 및 런레벨로 설정

2) systemd의 서비스로 설정

최신 Linux init 데몬은 systemd입니다. systemd는 현대 Linux 시스템의 많은 구성 요소를 포함하는 프레임워크입니다.
그 기능 중 하나는 Linux용 시스템 및 서비스 관리자로 작동하는 것입니다.
systemd는 System V 명령 및 초기화 스크립트와 역호환됩니다. 이는 모든 System V 서비스가 systemd에서도 실행됨을 의미합니다. 이는 대부분의 Upstart 및 System V 관리 명령이 systemd에서 작동하도록 수정되었기 때문에 가능합니다.

 

systemd Configuration Files: Unit Files

systemd의 핵심은 단위 파일입니다. 각 단위 파일은 특정 시스템 리소스를 나타냅니다. 리소스에 대한 정보는 단위 파일에서 추적됩니다. 서비스 단위 파일은 선언적 구문이 있는 단순한 텍스트 파일(Upstart .conf 파일과 같은)입니다.
systemd와 init 방법의 주요 차이점은 systemd는 서비스 데몬 및 장치 운영 체제 경로, 마운트 지점, 소켓 등과 같은 다른 유형의 리소스 초기화를 담당한다는 것입니다. 단위 파일의 이름 지정은 service_name.unit_type 형식입니다.

dbus.service, sshd.socket 또는 home.mount와 같은 형식의 파일입니다.

 

Directory Structure

CentOS와 같은 Red Hat 기반 시스템에는 단위 파일은 두 위치에 있습니다. 기본 위치는 /lib/systemd/system/입니다. 시스템 관리자가 수정한 사용자 지정 단위 파일 또는 기존 단위 파일은 /etc/systemd/system 아래에 있습니다.

동일한 이름의 단위 파일이 두 위치에 모두 존재하는 경우 systemd는 /etc 아래에 있는 파일을 사용합니다. 서비스가 부팅 시 또는 다른 대상/런레벨에서 시작되도록 활성화되어 있다고 가정합니다. 이 경우 /etc/systemd/system의 해당 디렉토리 아래에 해당 서비스 단위 파일에 대한 심볼릭 링크가 생성됩니다. /etc/systemd/system 아래에 있는 단위 파일은 실제로 /lib/systemd/system 아래에 같은 이름을 가진 파일에 대한 심볼릭 링크입니다.

 

systemd init Sequence: Target Units

단위 파일의 특별 유형은 target unit입니다.
대상 단위 파일 이름에는 .target이 접미사로 붙습니다. 대상 단위는 하나의 특정 리소스를 나타내지 않기 때문에 다른 단위 파일과 다릅니다. 대상 단위는 특정 시정의 시스템 상태를 나타냅니다. 

 

각 대상에는 번호 대신 이름이 있습니다. 예를 들어, runlevel 3 대신 multi-user.target이 있거나 runlevel 6 대신 reboot.target이 있습니다. Linux 서버가 multi-user.target으로 부팅할 때 본질적으로 서버를 실행 수준 2, 3 또는 4로 가져옵니다. 네트워킹이 활성화된 다중 사용자 텍스트 모드입니다.

 

Runlevel (System V init)Target Units (Systemd)

runlevel 0 poweroff.target
runlevel 1 resuce.target
runlevel 2, 3, 4 multi-user.target
runlevel 5 graphical.target
runlevel 6 reboot.target

systemd default.target

systemd default.target은 System V 기본 실행 수준과 동일합니다.

System V에는 inittab이라는 파일에 정의된 기본 실행 수준이 있습니다. systemd에서 해당 파일은 default.target으로 대체됩니다. 기본 대상 단위 파일은 /etc/systemd/system 디렉토리에 있습니다. /lib/systemd/system 아래의 대상 단위 파일 중 하나에 대한 심볼릭 링크입니다.

 

systemd Dependencies: Wants and Requires

systemd Wants and Requires는 서비스 데몬 간의 종속성을 제어합니다.

System V에서 서비스는 특정 실행 수준에서 시작될 수 있지만 다른 서비스나 리소스를 사용할 수 있을 때까지 기다리도록 만들 수도 있습니다. 비슷한 방식으로 systemd 서비스는 하나 이상의 대상에 로드하거나 다른 서비스나 리소스가 활성화될 때까지 기다릴 수 있습니다.

 

systemd에서 다른 장치가 필요한 장치는 필요한 장치가 로드되고 활성화될 때까지 시작되지 않습니다. 첫 번째 장치가 활성화된 동안 필요한 장치가 어떤 이유로 실패하면 첫 번째 장치도 중지됩니다.

이것은 시스템 안정성을 보장합니다. 따라서 특정 디렉토리가 있어야 하는 서비스는 해당 디렉토리에 대한 마운트 지점이 활성화될 때까지 대기하도록 만들 수 있습니다. 

 

Practical Example: Understanding the systemd Startup Sequence

아래 명령을 실행하여 기본 대상 단위 파일을 나열합니다.

sudo ls -l /etc/systemd/system/default.target

기본 대상은 /lib/systemd/system/ 아래의 다중 사용자 대상 파일에 대한 심볼릭 링크입니다. 따라서 시스템은 System V init의 런레벨 3과 유사한 multi-user.target에서 부팅됩니다.

multi-user.target.wants

Next, let’s run the following command to check all the services the multi-user.target file wants:

모든 서비스의 multi-user.target wants를 확인하기 위해 다음 명령을 실행합니다.

sudo ls -l /etc/systemd/system/multi-user.target.wants/*.service

/usr/lib/systemd/system/ 아래의 실제 유닛 파일을 가리키는 심볼릭 링크 파일 목록을 보여줍니다.

multi-user.target 외에도 system-update.target 또는 basic.target과 같은 다양한 유형의 대상이 있습니다.

다중 사용자 대상이 의존하는 대상을 보려면 다음 명령을 실행합니다.

sudo systemctl show --property "Requires" multi-user.target | fmt -10

basic.target

다음 명령을 실행하여 basic.target에 필요한 단위가 있는지 확인할 수 있습니다.

sudo systemctl show --property "Requires" basic.target | fmt -10

그리고 몇 가지 targets 을 필요로 합니다.

sudo systemctl show --property "Wants" basic.target | fmt -10

 

재귀적으로 진행하면 sysinit.target이 다른 대상도 실행해야 하는지 확인할 수 있습니다.

sudo systemctl show --property "Requires" sysinit.target | fmt -10

sysinit.target이 원하는 다른 타겟이 있을 수 있습니다.

systemctl show --property "Wants" sysinit.target | fmt -10

Examining a systemd Unit File

sshd용 서비스 단위 파일을 살펴보겠습니다.

sudo vi /etc/systemd/system/multi-user.target.wants/sshd.service

## sshd.service 파일 내용
[Unit]
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.service
Wants=sshd-keygen.service

[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target

첫 번째 부분은 [Unit] 섹션의 After 절입니다. 이것은 network.target 및 sshd-keygen.target이 로드된 후 sshd 서비스를 로드해야 한다는 것을 의미합니다.

[Install] 섹션은 multi-user.target이 원하는 서비스를 보여줍니다. 이것은 multi-user.target이 sshd 데몬을 로드하지만 로드하는 동안 sshd가 실패하면 종료되거나 충돌하지 않는다는 것을 의미합니다.

multi-user.target이 기본 대상이므로 sshd 데몬은 부팅 시 시작되어야 합니다. [Service] 섹션에서 Restart 매개변수에는 on-failure 값이 있는데 이 설정을 사용하면 sshd 데몬이 충돌하거나 비정상 종료가 있는 경우 다시 시작할 수 있습니다.

 

서비스 자동기동 설정 예제

특정 작업을 하는 쉘 프로그램을 서비스로 등록하여 자동 기동되도록 설정해 보겠습니다.

  1. 실행가는한 쉘 프로그램(예: myservice.sh)
  2. 스크립트를 실행하는 명령이 포함된 644 권한이 있는 /etc/systemd/system의 ".service" 확장자가 있는 단위 파일(예: myservice.service)

: myservice.sh

echo "Service starting time is : " `date` >> myservice_start.log

 

 

: myservice.service

[Unit]
Description=Example systemd service.

[Service]
Type=simple
ExecStart=/bin/bash /home/user/myscript.sh

[Install]
WantedBy=multi-user.target
  1. Run the command sudo systemctl enable myservice to enable it to start on boot.

 

sudo systemctl daemon-reload

sudo systemctl enable myservice
sudo systemctl start myservice
cs

 

  서비스가 제대로 실행이 되었는지 상태를 확인하기 위해선 아래처럼 실행한다.

1
sudo systemctl status myservice

 

 

 

Docker 엔진은 어떻습니까?

"containerd로 전환하면 더 이상 Docker 엔진을 사용할 수 없습니까?" 우리는 이 질문을 많이 듣습니다. 짧은 대답은 NO입니다.

Docker 엔진은 containerd 위에 구축됩니다. Docker Community Edition(Docker CE) 의 다음 릴리스는 containerd 버전 1.1을 사용합니다. 물론 CRI 플러그인이 내장되어 있고 기본적으로 활성화되어 있습니다. 즉, 사용자는 Docker 사용자에게 일반적인 다른 용도로 Docker 엔진을 계속 사용할 수 있으며, 동일한 노드에서 Docker 엔진과 함께 제공되고 동시에 사용되고 있는 기본 컨테이너를 사용하도록 Kubernetes를 구성할 수도 있습니다. Docker Engine 및 Kubelet에서 사용되는 동일한 containerd를 보여주는 아래 아키텍처 그림을 참조하십시오.

Containerd는 Kubelet과 Docker Engine 모두에서 사용되기 때문에 containerd 통합을 선택하는 사용자는 새로운 Kubernetes 기능, 성능 및 안정성 향상을 얻을 뿐만 아니라 다른 사용 사례를 위해 Docker Engine을 유지하는 옵션도 갖게 됩니다.

 

Containerd 네임스페이스 메커니즘은 Kubelet과 Docker Engine이 서로 생성한 컨테이너와 이미지를 보거나 액세스할 수 없도록 보장하기 위해 사용됩니다. 이렇게 하면 서로 간섭하지 않습니다. 이것은 또한 다음을 의미합니다.

  • 사용자는 docker ps 명령 을 사용하여 Kubernetes에서 만든 컨테이너를 볼 수 없습니다 . 대신 crictl ps 를 사용하십시오 . 그 반대의 경우도 마찬가지입니다. 사용자는 Kubernetes에서 또는 crictl ps 명령을 사용하여 Docker CLI가 생성한 컨테이너를 볼 수 없습니다. crictl create 및 crictl runp 명령은 문제 해결용입니다. 프로덕션 노드 에서 crictl 을 사용하여 포드 또는 컨테이너를 수동으로 시작하는 것은 권장되지 않습니다.
  • 사용자는 docker images 명령 을 사용하여 Kubernetes에서 가져온 이미지를 볼 수 없습니다 . 대신 crictl 이미지 명령을 사용 하십시오 . 그 반대의 경우도 마찬가지입니다. Kubernetes는 docker pull , docker load 또는 docker build 명령으로 생성된 이미지를 볼 수 없습니다. 대신 crictl pull 명령을 사용 하고 이미지를 로드해야 하는 경우 ctr cri load 를 사용하십시오.

 

최신 Docker 설치는 컨테이너 관리를 담당하는 containerd와 나머지 모든 작업을 담당하는 dockerd의 두 가지 서비스로 나뉩니다 .

 

OCI 표준은 다양한 컨테이너 솔루션 간의 상호 운용성을 가져왔습니다. 결과적으로 한 시스템에 구축된 이미지는 다른 호환 스택에서 실행할 수 있습니다.

여러 호스트를 이용하는 도커가 swarm을 이룰경우 서로 통신을 하려면 네트웍이 필요하다. 이때 각각 다른 호스트에서 생성된 컨테이너 사이에 네트워크를 생성해주는 것이 바로 overlay 네트워크 이다.

 

각각의 호스트에서 쓰고있는 네트워크와 상관없이 컨테이너 끼리의 사설망을 따로 만들어줌.

 

 

Docker Swarm 을 구성해놓은 상태에서 새로

 

overlay 네트워크 생성하고 테스트해보기.

Docker Swarm 을 구성

Docker Swarm은 여러가지 컨테이너 오케스트레이션 툴(가장 대표적인 것이 kubernetes임) 중 하나이다.

Docker Swarm에서 제어하는 단위는 컨테이너가 아닌 "service" 이다. (쿠버네티스의 pod와 같다고 생각하면 됨)

1. Swarm manager 설정

Swarm 클러스터에서 manager 역할을 할 노드를 선정한다. 여기서는 "swarm-manager" 로 선택했다. 아래 init 명령을 swarm-manager에서 수행한다. --advertise-addr은 manager 역할을 하는 IP를 입력한다. 즉 swarm-manager의 IP를 입력한다. 

docker swarm init --advertise-addr 10.10.1.39

To add a worker to this swarm, run the following command:
    docker swarm join --token SWMTKN-1-1e2cs4etdsl1yo7yclq5rdngheo6f3yecy0gc1wnt03fyrt1yd-1taof5n1m6zmbtenuysd5q60a 10.10.1.39:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

결과 중 docker swarm join --token 부분은 연결을 위한 비밀키가 생성된 것이다. 복사하여 각 노드들이 docker swarm 클러스터에 조인하도록 사용한다. 

 docker swarm join --token SWMTKN-1-1e2cs4etdsl1yo7yclq5rdngheo6f3yecy0gc1wnt03fyrt1yd-1taof5n1m6zmbtenuysd5q60a 10.10.1.39:2377
 
 This node joined a swarm as a worker.

 

docker swarm init과 join을 수행하면 docker network 에 ingress와 docker_gwbridge 네트워크가 추가된다.

 

 

 

2. 노드 조인 및 확인

위에서 manager node에서 아래 명령어를 수행하면 도커 스웜 클러스터에 참여한 node를 확인할 수 있다.

docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
q9d7qflcsd1nvoy9291v7vhcz *   swarm-manager     Ready     Active         Leader           20.10.17
mllks5805fyeoake38u6d2nfa     swarm-node-1      Ready     Active                          20.10.17

 

1.network 생성

overlay 네트워크 생성 및 확인

 

$ docker network create --driver=overlay --subnet=192.168.0.0/24 my-overlay

$ docker network ls
NETWORK ID     NAME              DRIVER    SCOPE
c09c209df657   bridge            bridge    local
bf717637be38   docker_gwbridge   bridge    local
156d020c1e52   host              host      local
knzfg8g8u065   ingress           overlay   swarm
fadlzyj565he   my-overlay        overlay   swarm
d3cd7692e4cb   none              null      local

도커 스웜 서비스 생성

$ docker service create --name overlaysvc --network my-overlay --replicas 3 hello-world 

**3.네트워크 테스트** 

master노드에서 ps 실행 및 ip 확인

+ Recent posts