Study

2023-05-02. 도커, 쿠버네티스, YAML, Deployment, Service

86400 2023. 5. 3. 00:05

 

0. 목차

  • 가상머신 만들기
    • 리소스그룹 선택, 만들기> Ubuntu Server 22.04 LTS
    • 이름: labuser12345ubuntu
    • 가용성 옵션 없음
    • 보안 표준
    • 크기: D4s_v3 (운영 중에도 바꿀 수 있긴 함, 바꾸고 나서 분 당 가격으로 바뀜)
    • 인증 형식: 암호
    • 공용 인바운드 포트: 선택한 포트 허용_네트워크 시큐리티 등록) SSH 포트 이용
    • 생성

 

1. 도커

  • 도커 설치 및 업그레이드, 연결

Install Docker Engine on Ubuntu

 

Install Docker Engine on Ubuntu

 

docs.docker.com

  • 도커 권한 갖고 옴, 적용하기 위해 나갔다가 다시 재접속
  • docker —version 버전 확인

 

1.1. 들어가기에 앞서

  • 도커 파일 만들기
  • 현재 디렉토리 위치 확인: pwd
  • 다른 디렉토리로 이동: cd .. 와 cd /usr
  • 개인 홈 디렉토리 이동: cd $home
  • 디렉토리 생성: mkdir docker-practice
  • ls을 통해 디렉토리 확인

 

1.2. 위치 지정

abcde@labuser111ubuntu:/usr$ pwd
/usr
abcde@labuser111ubuntu:/usr$ cd ..
abcde@labuser111ubuntu:/$ cd $HOME # 내 홈 디렉토리로 이동
abcde@labuser111ubuntu:~$ pwd # 현재 디렉토리 확인
/home/abcde
abcde@labuser111ubuntu:~$ mkdir docker-dir
abcde@labuser111ubuntu:~$ ls
docker-dir
abcde@labuser111ubuntu:~$ dir
docker-dir
abcde@labuser111ubuntu:~$ ls -al # 자세한 정보
total 36
drwxr-x--- 5 abcde abcde 4096 May  2 10:23 .
drwxr-xr-x 3 root  root  4096 May  2 09:24 ..
-rw------- 1 abcde abcde 1968 May  2 10:12 .bash_history
-rw-r--r-- 1 abcde abcde  220 Jan  6  2022 .bash_logout
-rw-r--r-- 1 abcde abcde 3771 Jan  6  2022 .bashrc
drwx------ 2 abcde abcde 4096 May  2 09:25 .cache
-rw-r--r-- 1 abcde abcde  807 Jan  6  2022 .profile
drwx------ 2 abcde abcde 4096 May  2 09:24 .ssh
-rw-r--r-- 1 abcde abcde    0 May  2 09:53 .sudo_as_admin_successful
drwxrwxr-x 2 abcde abcde 4096 May  2 10:23 docker-dir
abcde@labuser111ubuntu:~$ ls -l # 숨김 파일 제외하고 보임
total 4

# 권한 drwxrwxr-x
drwxrwxr-x 2 abcde abcde 4096 May  2 10:23 docker-dir
abcde@labuser111ubuntu:~$
abcde@labuser111ubuntu:~$ cd docker-dir/ # 탭키
abcde@labuser111ubuntu:~/docker-dir$ touch Dockerfile # 실행
abcde@labuser111ubuntu:~/docker-dir$ ls
Dockerfile # 도커 파일 생성된 것을 확인
abcde@labuser111ubuntu:~/docker-dir$ cat Dockerfile # 아무 것도 없음, touch는 아무 것도 없는 파일을 생성하게 해줌
abcde@labuser111ubuntu:~/docker-dir$ reboot # 리부팅
abcde@labuser111ubuntu:~/docker-dir$ sudu reboot # 권한 없을 시 사용

 

1.3. 기본 명령어

  • From: 베이스 이미지 지정
  • - nginx(엔진엑스)_ 오픈소스 가장 가벼운 웹서버, 가볍고 배포하기 쉬움
  • Copy: 담아서 하나의 컨테이너 활용
  • Run: 커맨드를 도커 컨테이너에서 실행, 주로 pip 명령문이 있음
  • - ubuntu 18.04 환경의 도커 컨테이너가 있다고 쳤을 때, 배포할 때 도커 환경 세팅(사이킷런, 넘파이, 판다스 넣어서 하지 않고 명령어로 미리 만들 수 있음)
RUN pip install touch # touch 패키지 설치 같이 됨
RUN pip install -r requirement.txt 
  • CMD: 도커 파일을 가지고 실제 이미지를 만들 때 사용. 하나의 명령어만 사용 _ 도커 이미지를 가지고 실제로 컨테이너가 메모리 상에 올라왔을 때 실행될 게 필요한데 그때 사용함, 실행 할 때 한 번만 사용
  • Workdir: 어떤 디렉토리 내에서 수행할 것인지 확인하는 명령어
  • Env: 시스템 환경 변수 지정
키와 환경변수를 통해 설정, language, 지역변수 설정
  • Expose: 시스템 위에 여러 개의 도커가 실행이 되고 있을 때, 대체로 외부에 접속이 안 됨(경비가 있음), 특정 도커는 외부와 연결할 때 사용, 프로토콜 지정하지 않으면 TCP로 지정해줌

 

1.4. VI editer를 통한 도커 이미지 생성

  • 유닛은 대소문자 구별하여 사용
  • VI editer 모드로 들어가기
  • I(인서트 모드)나 A 누르기
# 도커 파일 들어가기
$vi Dockerfile

-- INSERT -- # 키보드의 I 누르기
FROM ubuntu:18.04 # 우분투 18.04
RUN apt-get update # update 눌러서 만들 때 update 같이 진행
# ["첫번째파라미터", "명령에들어가는파라미터"], 리눅스 명령으로 들어감
# 셸에서 echo는 print와 동일
CMD ["echo","Hello Microsoft AI 2"] 

나오기: ESC
하단에 :wq # 쓰고 나가기 (도커 파일 저장)

# 저장확인
cat Dockerfile
FROM ubuntu:18.04
RUN apt-get update
CMD ["echo","Hello Microsoft AI 2"]

$ls -al
total 12
drwxrwxr-x 2 abcde abcde 4096 May  2 10:56 .
drwxr-x--- 5 abcde abcde 4096 May  2 10:56 ..
-rw-rw-r-- 1 abcde abcde   73 May  2 10:56 Dockerfile

# 같은 디렉토리 참조하여 my-image:v1.0.0을 만들어냄, -t: tag, 맨 끝 . 현재 여기에 만들겠다는 의미
$ docker build -t my-image:v1.0.0 .

# 도커 실행
[+] Building 7.9s (6/6) FINISHED
 => [internal] load .dockerignore                                                                                  0.1s
 => => transferring context: 2B                                                                                    0.0s
 => [internal] load build definition from Dockerfile                                                               0.1s
 => => transferring dockerfile: 110B                                                                               0.0s
 => [internal] load metadata for docker.io/library/ubuntu:18.04 
  
# 우분투 명령어로 실행                                                 0.4s
 => [1/2] FROM docker.io/library/ubuntu:18.04@sha256:8aa9c2798215f99544d1ce7439ea9c3a6dfd82de607da1cec3a8a2fae005  1.1s
 => => resolve docker.io/library/ubuntu:18.04@sha256:8aa9c2798215f99544d1ce7439ea9c3a6dfd82de607da1cec3a8a2fae005  0.0s
 => => sha256:3941d3b032a8168d53508410a67baad120a563df67a7959565a30a1cb2114731 2.30kB / 2.30kB                     0.0s
 => => sha256:0c5227665c11379f79e9da3d3e4f1724f9316b87d259ac0131628ca1b923a392 25.69MB / 25.69MB                   0.3s
 => => sha256:8aa9c2798215f99544d1ce7439ea9c3a6dfd82de607da1cec3a8a2fae005931b 1.33kB / 1.33kB                     0.0s
 => => sha256:0779371f96205678dbcaa3ef499be2e5f262c8b09aadc11754bf3daf9f35e03e 424B / 424B                         0.0s
 => => extracting sha256:0c5227665c11379f79e9da3d3e4f1724f9316b87d259ac0131628ca1b923a392                          0.6s
 # 업데이트
=> [2/2] RUN apt-get update                                                                                       5.5s
 => exporting to image                                                                                             0.7s
 => => exporting layers                                                                                            0.7s
 => => writing image sha256:8a935203c7b2f21a9de96da0239bbd21d45083595e98951092bb485461b16d04                       0.0s
 => => naming to docker.io/library/my-image:v1.0.0

$docker build -t my-image:v1.0.0 .

# 어디에 만들었는가 확인
$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED              SIZE
my-image     v1.0.0    8a935203c7b2   About a minute ago   108MB

 

1.5. Dockerfile

# 컨테이너 만들기
$ docker run --name demo1 my-image:v1.0.0
(넣고 싶은 내용)

 

(1) Local Docker Registry

# 외부에서 접속할 수 있게 -p(포트 넘버) 지정해줘야 함

# 포트넘버: 5000, 이름: registry
docker run -d -p 5000:5000 --name registry registry
Unable to find image 'registry:latest' locally
latest: Pulling from library/registry
91d30c5bc195: Pull complete
65d52c8ad3c4: Pull complete
54f80cd081c9: Pull complete
ca8951d7f653: Pull complete
5ee46e9ce9b6: Pull complete
Digest: sha256:8c51be2f669c82da8015017ff1eae5e5155fcf707ba914c5c7b798fbeb03b50c
Status: Downloaded newer image for registry:latest
c45c73ffc7ce83b0ce2261a79a7f86190bc3778aef1b7fd0ac91c89b6af19943

# 레지스트리, 포트 넘버 열림 확인
docker ps
CONTAINER ID   IMAGE      COMMAND                  CREATED          STATUS          PORTS
        NAMES
c45c73ffc7ce   registry   "/entrypoint.sh /etc…"   27 seconds ago   Up 26 seconds   0.0.0.0:5000->5000/tcp, :::5000->5000/tcp   registry

# image 이름 확인
docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
my-image     v1.0.0    8a935203c7b2   28 minutes ago   108MB
registry     latest    8db46f9d7550   4 weeks ago      24.1MB

# 도커 파일 찾기
docker images | grep my-image
my-image     v1.0.0    8a935203c7b2   29 minutes ago   108MB

# 레지스트리에 도커 이미지 넣기, localhost: 아이피 어드레스: 로컬 서비스 5000, 여기에 my-image를 넣기
docker push localhost:5000/my-image:v1.0.0

# 레지스트리 찾아볼 수 있게 localhost:5000의 my-image라고 연결
docker tag my-image:v1.0.0 localhost:5000/my-image:v1.0.0

# 도커 이미지 확인, curl -X GET 카탈로그 요청, 
curl -X GET <http://localhost:5000/v2/_catalog>
{"repositories":["my-image"]}

# curl -X GET <http://localhost:5000/v2/my-image/tags/list>
{"name":"my-image","tags":["v1.0.0"]}

 

(2) Docker Hub

  • https://hub.docker.com/ 회원가입, 로그인
  • 도커 허브에 이미지 올리는 작업 진행
  • docker commands> Run 통해서 이미지 공유가 가능
 

Docker Hub Container Image Library | App Containerization

Deliver your business through Docker Hub Package and publish apps and plugins as containers in Docker Hub for easy download and deployment by millions of Docker users worldwide.

hub.docker.com

도커 설치 파일 중에 CLI: 커맨드 라인 인터페이스_ 명령줄 인터페이스

docker login
Username
password

# docker hub 해당하는 위치로 연결
docker tag my-image:v1.0.0 (아이디)/my-image:v1.0.0
:~$ docker push (아이디)/my-image:v1.0.0
The push refers to repository [docker.io/qb86400/my-image]
bd606e52: Pushed
b7e0fa7f: Pushed
v1.0.0: digest: sha256:fd476467bafc4492b1af0328c04805188f5 size: 741

docker images
REPOSITORY                TAG       IMAGE ID       CREATED             SIZE
abcde/my-image            v1.0.0    8a935203c7b2   About an hour ago   108MB
my-image                  v1.0.0    8a935203c7b2   About an hour ago   108MB
localhost:5000/my-image   v1.0.0    8a935203c7b2   About an hour ago   108MB
registry                  latest    8db46f9d7550   4 weeks ago  
       24.1MB

 

2. 쿠버네티스 (Kubernetes)

 

2.1. minikube, kubectl 설치

# 설치
curl -LO <https://storage.googleapis.com/minikube/releases/v1.22.0/minikube-linux-amd64>
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 66.5M  100 66.5M    0     0  99.7M      0 --:--:-- --:--:-- --:--:-- 99.7M

ls
docker-dir  minikube-linux-amd64

# minikube 설치
sudo install minikube-linux-amd64 /usr/local/bin/minikube

# 버전
minikube --version
minikube provisions and manages local Kubernetes clusters optimized for development workflows.

Basic Commands:
  start          Starts a local Kubernetes cluster
  status         Gets the status of a local Kubernetes cluster
  stop           Stops a running local Kubernetes cluster
  delete         Deletes a local Kubernetes cluster
  dashboard      Access the Kubernetes dashboard running within the minikube cluster
  pause          pause Kubernetes
  unpause        unpause Kubernetes

Images Commands:
  docker-env     Configure environment to use minikube's Docker daemon
  podman-env     Configure environment to use minikube's Podman service
  cache          Add, delete, or push a local image into minikube
  image          Manage images

Configuration and Management Commands:
  addons         Enable or disable a minikube addon
  config         Modify persistent configuration values
  profile        Get or list the current profiles (clusters)
  update-context Update kubeconfig in case of an IP or port change

Networking and Connectivity Commands:
  service        Returns a URL to connect to a service
  tunnel         Connect to LoadBalancer services

Advanced Commands:
  mount          Mounts the specified directory into minikube
  ssh            Log into the minikube environment (for debugging)
  kubectl        Run a kubectl binary matching the cluster version
  node           Add, remove, or list additional nodes
  cp             Copy the specified file into minikube

Troubleshooting Commands:
  ssh-key        Retrieve the ssh identity key path of the specified node
  ssh-host       Retrieve the ssh host key of the specified node
  ip             Retrieves the IP address of the specified node
  logs           Returns logs to debug a local Kubernetes cluster
  update-check   Print current and latest version number
  version        Print the version of minikube

Other Commands:
  completion     Generate command completion for a shell

Use "minikube  --help" for more information about a given command.

# 관리, kubectl 다운
curl -LO <https://dl.k8s.io/release/v1.22.1/bin/linux/amd64/kubectl>

# kubectl 설치 (권한, 위치 주기)
# -o: oner, -g:group, -m 0755:
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl

# 설치 확인
kubectl --help

 

2.2. minikube 실행

# minikube 실행
minikube start --driver=docker
😄  minikube v1.22.0 on Ubuntu 22.04
🎉  minikube 1.30.1 is available! Download it: <https://github.com/kubernetes/minikube/releases/tag/v1.30.1>
💡  To disable this notice, run: 'minikube config set WantUpdateNotification false'

✨  Using the docker driver based on user configuration
👍  Starting control plane node minikube in cluster minikube
🚜  Pulling base image ...
💾  Downloading Kubernetes v1.21.2 preload ...
    > preloaded-images-k8s-v11-v1...: 502.14 MiB / 502.14 MiB  100.00% 196.59 M
    > gcr.io/k8s-minikube/kicbase...: 361.08 MiB / 361.09 MiB  100.00% 42.66 Mi
🔥  Creating docker container (CPUs=2, Memory=4000MB) ...
🐳  Preparing Kubernetes v1.21.2 on Docker 20.10.7 ...
    ▪ Generating certificates and keys ...
    ▪ Booting up control plane ...
    ▪ Configuring RBAC rules ...
🔎  Verifying Kubernetes components...
    ▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5
🌟  Enabled addons: storage-provisioner, default-storageclass
🏄  Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
# 설치 상태 확인
:~$ minikube status
> minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured
kubectl get pod # 파드 확인
> No resources found in default namespace.

kubectl get pod -n kube-system # 이것 자체도 컨테이너, Restarts: 불안정 척도, READY: 새로 생김
NAME                               READY   STATUS    RESTARTS   AGE
coredns-558bd4d5db-hz65s           1/1     Running   0          6m28s
etcd-minikube                      1/1     Running   0          6m40s
kube-apiserver-minikube            1/1     Running   0          6m40s
kube-controller-manager-minikube   1/1     Running   0          6m40s
kube-proxy-l8t6k                   1/1     Running   0          6m28s
kube-scheduler-minikube            1/1     Running   0          6m40s
storage-provisioner                1/1     Running   0          6m39s

# 삭제 (메모리에 남아 있는 것만 삭제 실행)
minikube delete
🔥  Deleting "minikube" in docker ...
🔥  Deleting container "minikube" ...
🔥  Removing /home/abcde/.minikube/machines/minikube ...
💀  Removed all traces of the "minikube" cluster.

# 완전 삭제
minikube uninstall
minikube status
minikube start --driver=docker 

 

3. YAML

네트워크 전송 관련

YAML은 사람이 읽을 수 있는 데이터 직렬화 언어로서, 구성 파일 작성에 자주 사용됩니다. YAML을 yet another markup language로 생각하는 사람도 있고, YAML ain’t markup language(재귀 약어)로 생각하는 사람도 있습니다. 후자는 YAML이 문서가 아닌 데이터용임을 강조하는 말입니다.

YAML은 쉽게 읽고 이해할 수 있도록 설계 됐습니다. 또한 다른 프로그래밍 언어와 함께 사용할 수도 있습니다. 

 

3.1. YAML 구문

YAML 파일은 .yml 또는 .yaml, Perl, C, XML, HTML, YAML은 JSON의 상위 집합이므로 YAML에서 JSON 파일을 사용할 수 있습니다.

YAML 파일은 Python 스타일의 들여쓰기를 사용해 구조를 결정하고 중첩을 표시하므로 더 읽기 쉽습니다.

 

3.2. 문법

  • key-value의 조합
  • 주석: #

 

3.3. 자료형

  • String: ‘’
  • y, yes, true: “y”
  • 특수문자: “”
  • integer: 123
  • float: 소수점, 복소수

 

3.4. List

  • [””, “”], name, image로도 표현 가능

 

3.5. Multi-line strings

  • \n: 다음줄

 

3.6. Multi-document yaml

  • 각 스펙으로 떨어져서 표기도 가능

 

3.7. VI Editor yaml 파일 생성

# VI Editor 진입
vi pod.yaml

# --Insert (들여쓰기 중요)
apiVersion: v1
# 종류
kind: Pod
metadata:
	name: counter
spec: #스펙
	containers:
	- name: count
		image: busybox

		# 셸 프로그램
		args: [/bin/sh, -c, 'i=0; while true; do echo "$i: $(date)"; i=$((i+1)); slepp 1; done']

# 저장 확인
apiVersion: v1
kind: Pod
metadata:
        name: counter
spec:
        containers:
        - name: count
          image: busybox
          args: [/bin/sh, -c, 'i=0; while true; do echo "$i: $(date)"; i=$((i+1)); slepp 1; done']

# 다시확인
kubectrl apply -f pod.yaml
kubectl get pod
kubectl get pod -n kube-system #system 컨테이너 확인
kubectl get pod -A
kubectl get pod counter

# pod 자세한 내용 확인
kubectl describe pod counter

# 더 자세한 내용 확인, ip number
kubectl get pod -o wide

# pod 상태 감시, 모니터링
kubectl get pod -w > ctrl + C

# 로그 찍기
kubectl logs counter

# pod 접속 (counter: pod 이름)
kubectl exec -it counter /bin/sh (커맨드 역할)

# pod 삭제 (-f: 파일지정)
kubectl delete -f pod.yaml

# 위치 지정 ls로 확인하고, cd 위치/ 엔터

# kubectl get pod 
> No resources found in default namespace.

 

4. Deployment

# - 반복적으로 나올 수 있을 때

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchlabels:
      app: nginx
# 템플
  template:
    metadata:
      labels:
        app: nginx
    spec:
    containers:
    - name: nginx
      image: nginx:1.14.2
      ports:
      - containerPort: 80

~$ kubectl apply -f deployment.yaml
deployment.apps/nginx-deployment created
~$ kubectl get pod
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-66b6c48dd5-2ndbc   1/1     Running   0          78s
nginx-deployment-66b6c48dd5-4ltkl   1/1     Running   0          78s
nginx-deployment-66b6c48dd5-r5drs   1/1     Running   0          78s

kubectl get deployment
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           2m39s

# 서비스 pod 늘리고 싶을 때, 스케일 조정
abcde@labuser111ubuntu:~$ kubectl scale deployment/nginx-deployment --replicas=20
deployment.apps/nginx-deployment scaled
abcde@labuser111ubuntu:~$ kubectl get deployment
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/20    20           3           4m2s

# 다시 조정
:~$ kubectl get pod
NAME                                READY   STATUS        RESTARTS   AGE
nginx-deployment-66b6c48dd5-2ndbc   1/1     Running       0          5m45s
nginx-deployment-66b6c48dd5-2qd6v   0/1     Terminating   0          107s
nginx-deployment-66b6c48dd5-4ltkl   1/1     Running       0          5m45s
nginx-deployment-66b6c48dd5-4r4mr   0/1     Terminating   0          107s
nginx-deployment-66b6c48dd5-6p8vs   0/1     Terminating   0          107s
nginx-deployment-66b6c48dd5-9msdk   0/1     Terminating   0          107s
nginx-deployment-66b6c48dd5-cnw92   1/1     Terminating   0          107s
nginx-deployment-66b6c48dd5-d5p4f   1/1     Running       0          107s
nginx-deployment-66b6c48dd5-flvtj   0/1     Terminating   0          107s
nginx-deployment-66b6c48dd5-hd5x6   1/1     Running       0          107s
nginx-deployment-66b6c48dd5-j2bdj   0/1     Terminating   0          107s
nginx-deployment-66b6c48dd5-ngv9p   0/1     Terminating   0          107s
nginx-deployment-66b6c48dd5-pl6dc   0/1     Terminating   0          107s
nginx-deployment-66b6c48dd5-pvt4z   0/1     Terminating   0          107s
nginx-deployment-66b6c48dd5-qptqm   0/1     Terminating   0          107s
nginx-deployment-66b6c48dd5-r5drs   1/1     Running       0          5m45s

# 삭제, 모니터링 확인 필요
:~$ kubectl delete pod nginx-deployment-66d5-4ltkl
pod "nginx-deployment-66b6d5-4ltkl" deleted

# deployment 삭제하면 하위 pod 함께 삭제
kubectl delete deployment nginx-deployment