티스토리 뷰

 

kubernetes-1.pdf
1.20MB

* kubernetes 1.31
아래는 쿠버네티스 1.31 버전이며 centos9s 운영체제 기반의 설치 파일입니다.
vagrant 이미지를 사용합니다.

wget http://containerlab24.com/k8s_install/k8s-1.31.tar -Outfile k8s-1.31.tar

ms windows 에 적당한 디렉토리를 하나 생성후 그 디렉토리에서 다운로드 받고
powershell 에서 tar -xf k8s-1.31.tar --->  Vagrant up 하면 설치완료가 됩니다
* kubernetes 버전은 항상 최신버전을 설치하도록 되어있습니다.
(대략 설치완료까지 10 ~ 15 분정도 시간소요됩니다)

*. 기존에 vagrant image 로 설치된 kubernetes 를 삭제하고 다시 설치하는 경우에는
아래처럼 vagrant 명령어를 사용하여 vm 을 깨끗이 삭제후 설치해야 새로 설치시  이름충돌이나 
ip 충돌을 방지할수 있습니다.

*. 기존에 vagrant image 로 설치된 kubernetes 를 삭제하고 다시 설치하는 경우에는
아래처럼 vagrant 명령어를 사용하여 vm 을 깨끗이 삭제후 설치해야 새로 설치시  이름충돌이나 
ip 충돌을 방지할수 있습니다.
--------------------------------------------------------------------
* 설치된 Vagrant vm image 삭제

Vagrantfile 이 있는 디렉토리안에서
vagrant halt  ; vagrant 가상머신 종료
vagrant status ; vagrant vm 상태 확인
vagrant destroy ; vagrant vm image 삭제
rm .vagrant  ; vm 생성될때 만들어진 .vagrant 디렉토리 삭제
--------------------------------------------------------------------

--- kubespray 설치를 위한 가상머신 준비 ---

mkdir kubespray ; cd kubespray
wget http://containerlab24.com/kubespray/Vagrantfile -Outfile Vagrantfile
wget http://containerlab24.com/kubespray/add_hosts.sh -Outfile add_hosts.sh

k8s install with kubespray (아래 kubespray 참고)

--- minikube v1.31(kubernetes v1.27) install based ubuntu 22.04 ---
minikube 참고사항 (아래 minikube 참고)

powershell 에서 임의의 디렉토리를 하나 생성후 그 디렉토리로 이동해서
wget http://containerlab24.com/minikube/Vagrantfile -Outfile Vagrantfile
* 아래는 리눅스로 login 해서 파일을 다운로드 받고 실행해야 합니다.
wget http://containerlab24.com/minikube/minikube_install.sh  (minikube start --driver=docker 로 실행됩니다)
chmod u+x minikube_install.sh
./minikube_install.sh  ; 5분정도의 시간이 소요됩니다.

아래는 minikube start --driver=none 으로 실행하기 위한 스크립트 파일입니다.

(참고로 아래의 스크립는  minikube start --driver=docker 로도 실행가능)
wget http://containerlab24.com/minikube/minikube_install_driver_none.sh

 

nfs storage volume 테스트를 위한 vm 생성
powershell 에서 mkdir nfs , cd nfs  그리고 아래의 파일을 다운로드
wget http://containerlab24.com/nfs_vm/nfs_vm.tar -Outfile nfs_vm.tar
tar -xf nfs_vm.tar  파일을 풀고 Vagrant 파일에서 ip address 를 kubernetes cluster ip 대역과
같은 대역으로 수정 한다음 Vagrant up

--------------------

- reclaim 정책

Retain : pvc 삭제 => pv 상태 released, 데이터는 보존됨
         pvc 실행을 하면 pv 가 binding 되지 않는다.
         pv 를 다시 사용하려면 수동으로 다시 시작해야 한다.

Recycle : pvc 삭제 => pv는 그대로 있으며 available 상태가 된다.
                      데이터는 삭제됨.
Delete : pvc 삭제 => pv가 삭제된다. 데이터는 그대로 있음

* host_path 인경우 reclaim 정책이 delete 인경우 /tmp 디렉토리에서만
적용된다.

아래와 같은 메시지가 출력되면
Oct 26 09:41:23 control-n1 kernel: watchdog: BUG: soft lockup - CPU#0 stuck for 30s! [containerd-shim:1497]
Oct 26 09:41:23 control-n1 kernel: watchdog: BUG: soft lockup - CPU#1 stuck for 30s! [containerd-shim:1916]

cat /proc/sys/kernel/watchdog_thresh => 이값이 default 로 10으로 되어 있음.
이 값을 아래처럼 올려주면 cpu stuck 현상이 해결되는것 같습니다.
echo "kernel.watchdog_thresh = 30" >> /etc/sysctl.conf
sysctl -p  ; 고친파일내용 적용

 

 

 

 

kubespray

Vagrantfile 로 쿠버네티스 클러스트 설치를 위한 ansible control-node 와
master, worker1, worker2 가 생성되고 나면 

설치를 위해서 ansible control-node 에서 아래의 작업을 실행하면 됩니다.


kubespray 설치안내 및 소스파일(github) =>
https://github.com/kubernetes-sigs/kubespray

설정은 ansible control node 에서 화살표가 가리키는 manage-node 에
설치를 하기 위한 설정입니다.

                                  k8s cluster(ansible managed-nodes)
ansible control-node  ------------> master
                      ------------> worker1
                      ------------>  worker2
                     
* worker 수는 얼마든지 10대 이상으로도 구성할수 있습니다.
* master node 도 여러대로  구성할수 있습니다.

* ansible control-node는 ssh 프로토콜을 통해서 ansible-playbook 에 작성되어 있는
  play 를 ansible managed-node 에 전달해서 명령어를 실행합니다.
  mnaged-node 에서는 ansible play 가 vagrant 계정의  sudo 권한으로  실행됩니다.
  이때 vagrant 계정의 인증암호를 요구받지 않도록 하기위해서 managed-node 의 vagrant 계정으로
  공개키 업로드는 필수입니다.


k8s_install(kubespray) 을 위한 클러스트 노드 최소사양
--- check needed
Minimum system requirements for kubespray
Master Nodes: 1500 MB RAM, 2 CPU and 20 GB free disk space
Worker Nodes: 1024 MB, 2 CPU, 20 GB free disk space
Ansible Node: 1024 MB, 1CPU and 20 GB disk space
Internet connectivity on each node
Regular with sudo admin rights

Ansible Node 에서 아래의명령어 실행
vagrant@control:~$ sudo apt update
vagrant@control:~$ sudo apt install git python3 python3-pip -y



vagrant@control:~$ git clone https://github.com/kubernetes-incubator/kubespray.git
cd kubespray/
vagrant@control:~/kubespray$ pip install -r requirements.txt
=> ansible 과 jinja2 템플릿등이 설치됩니다.

아래처럼 ansible 이 설치되어 있는 경로를 찾고 PATH 에 포함되어 있는지 확인.
$ sudo find / -name ansible

* 명령어 앞에 프롬프트가 '$' 만 표시되어 있는 경우 현재 디렉토리 위치는 어떤디렉토리라도  상관없습니다.

$ echo $PATH ; ansible 파일의 경로가 PATH 변수에 포함되어 있지 않으면
  아래처럼 ansible 파일 경로를 PATH 환경뼌수에 추가
$ export PATH=$PATH:/home/vagrant/.local/bin (source ~/.profile 명령을 실행해도 된다)

ansible manage node(ansible로 관리할 관리대상장비)를 ansible server가 암호를 요구하지 않는 비대화식으로 
명령을 전달하기 위해서는공개키를 생성후  ansible managed-node 에 업로드 하여여 한다.

ansible control-server에 /etc/hosts 파일에 아래 내용추가(managed-node 주소를 등로)

vagrant@control:~/kubespray$ cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
# -- 이 라인 아래부터 추가한 내용
192.168.11.10   master
192.168.11.20   worker1
192.168.11.30   worker2


$ ssh-kegen  ; ssh 공개키-개인키 생성(RSA 기반)
$ ssh-copy-id ip address(master node) ; ex) ssh-copy-id 192.168.11.10
$ ssh-copy-id ip address(worker1)  ; ex) ssh-copy-id 192.168.11.20 
$ ssh-copy-id ip address(worker2)  ; ex) ssh-copy-id 192.168.11.30 

* managed-node 에서 방화벽 서비스(ubuntu는 ufw)를 중단하고 해야  방화벽 서비스를 중단하는것은
(* ufw 나  firewalld 를 중단해도 iptables 는 계속 사용됩니다.)
ansible playbook 에 설정되어 있으므로 직접 처리할 필요는 없습니다.

vagrant@control:~/kubespray$ cat contrib/os-services/roles/prepare/tasks/main.yml  ; 이파일에 방화벽서비스 해제가 설정되어 있음.

ansible-playbook 으로 managed-node 를 제어하기위해서는 inventory 파일이 필수입니다.
inventory 는 managed-node 의 주소이며(ip address 나 domain name, hostname 이 가능합니다)
아래처럼 inventory sample 파일이 있는 디렉토리를  이름을 변경하여 복사합니다.
 
vagrant@control:~/kubespray$ cp -rfp inventory/sample/ inventory/mycluster/

inventory/ 안에 있는 inventory.ini 파일을 수정해서 사용해도 되지만 
공식 github 주소에에 아래처럼 inventory 파일을 yaml 파일로 생성하여 실행을 하는것으로 
설명이 되어있습니다.

inventory playbook 파일 생성방법
*. ansible playbook 이란 한개이상의 ansible play 가 저장되어 있는 파일을 말합니다.
   ansible play는 managed-node 에서 실행이 되어야 할 하나의 task(작업)를 의미합니다.

vagrant@control:~/kubespray$ pip3 install -r contrib/inventory_builder/requirements.txt
$ declare -a IPS=(192.168.11.10 192.168.11.20 192.168.11.30)
  => IPS 를 배열변수로 선언하고 managed-node의 ip 주소로 초기화 합니다.
* 각각 master node, worker node 들의 ip address 를 확인후에 사용하고 있는 실제 주소를 괄호안에 적어야 합니다.
(Vagrantfile 로 vm 을  생성했으면 Vagrantfile을 보면 알수 있습니다. 리눅스안에서는 두번째 랜카드(eth1) 의 
ip address 입니다)
 
vagrant@control:~/kubespray$ CONFIG_FILE=inventory/mycluster/hosts.yml python3 contrib/inventory_builder/inventory.py ${IPS[@]}
=> CONFIG_FILE 변수를 생성이 될 inventory 경로로 초기화한다음 python3 으로 IPS 배열의 원소값으로 
CONFIG_FILE 변수의 경로를  생성합니다.

명령어 실행결과로서  아래처럼 파일이 생성됩니다.

vagrant@control:~/kubespray$ cat inventory/mycluster/hosts.yml
all:
  hosts:
    node1:
      ansible_host: 192.168.11.10
      ip: 192.168.11.10
      access_ip: 192.168.11.10
    node2:
      ansible_host: 192.168.11.20
      ip: 192.168.11.20
      access_ip: 192.168.11.20
    node3:
      ansible_host: 192.168.11.30
      ip: 192.168.11.30
      access_ip: 192.168.11.30
  children:
    kube_control_plane:
      hosts:
        node1:
        node2:
    kube_node:
      hosts:
        node1:
        node2:
        node3:
    etcd:
      hosts:
        node1:
        node2:
        node3:
    k8s_cluster:
      children:
        kube_control_plane:
        kube_node:
    calico_rr:
      hosts: {}


이렇게 생성된것을 그대로 사용해도 되지만 vagrant 설치할때 사용했던 이름으로 변경하는것이
호스트 식별을 위해서 좋을것 같습니다.

아래는 수정된 내용
* 파일 편집시 들여쓰기할때 tab 을 사용하면 에러가 발생합니다.
tab키 대신에 스페이스바로 띄어쓰기를 사용해야 합니다.

all:
  hosts:
    master:
      ansible_host: 192.168.11.10
      ip: 192.168.11.10
      access_ip: 192.168.11.10
    worker1:
      ansible_host: 192.168.11.20
      ip: 192.168.11.20
      access_ip: 192.168.11.20
    worker2:
      ansible_host: 192.168.11.30
      ip: 192.168.11.30
      access_ip: 192.168.11.30
  children:
    kube_control_plane:
      hosts:
        master:
    kube_node:
      hosts:
        master:
        worker1:
        worker2:
    etcd:
      hosts:
        master:
    k8s_cluster:
      children:
        kube_control_plane:
        kube_node:
    calico_rr:
      hosts: {}


*. children 에 설정되 있는 각 title은 한개이상의 host 가 포함되어 있는 host 그룹을 의미합니다.
위에 설정은 kube_control_plane 은 master 이며 kubernetes node 는 master, worker1, worker2 세대로
구성하며 etcd 는 master 에 설치 
k8s_cluster 는kube_contrl_plane 그룹과 kube_node 그룹으로 구성
* kubernetes CNI 는 현재버전에서는  기본이 calico 로 설정되어 있는데 flannel 등 다른것으로 변경도  가능합니다.

*. master, worker1 등 node name 은 원하는 이름으로  변경해도 됩니다.



그리고  아래처럼 playbook 파일을 수정해야 합니다.
아래는 main.yml 파일에 설정되어 있는 nf_conntrack_ipv4 를  nf_conntrack 으로 수정하는 내용.

vagrant@control:~/kubespray$ sed -i 's/nf_conntrack_ipv4/nf_conntrack/' extra_playbooks/roles/kubernetes/node/tasks/main.yml
vagrant@control:~/kubespray$ sed -i 's/nf_conntrack_ipv4/nf_conntrack/' roles/kubernetes/node/tasks/main.yml

vagrant@control:~/kubespray$ ansible-playbook -i inventory/mycluster/hosts.yml --become --become-user=root cluster.yml

* 설치완료까지 20분에서 ~ 30분정도 소요되는것 같습니다.
설치 완료되면 kubernetes master node  로 접속한다음
vagrant@control:~/kubespray$ ssh 192.168.11.10
Last login: Mon Sep 25 07:28:41 2023 from 192.168.11.1
vagrant@master:~$ sudo kubectl get nodes
NAME     STATUS   ROLES           AGE     VERSION
master   Ready    control-plane   8m15s   v1.28.2
worker1    Ready              7m25s   v1.28.2
worker2    Ready              7m30s   v1.28.2
vagrant@worker1:~$

vagrant@master:~$ sudo kubectl get pods -n kube-system
vagrant@master:~$ sudo kubectl get pods -n kube-system
NAME                                       READY   STATUS    RESTARTS   AGE
calico-kube-controllers-5fb8ccdcd6-qbn6p   1/1     Running   0          3m46s
calico-node-7jkvt                          1/1     Running   0          4m3s
calico-node-bs5gt                          1/1     Running   0          4m3s
calico-node-w8dj6                          1/1     Running   0          4m3s
coredns-67cb94d654-bdkx7                   1/1     Running   0          3m38s
coredns-67cb94d654-mntzm                   1/1     Running   0          3m35s
dns-autoscaler-7b6c6d8b5b-6vqzp            1/1     Running   0          3m36s
kube-apiserver-master                      1/1     Running   1          5m12s
kube-controller-manager-master             1/1     Running   2          5m12s
kube-proxy-gsjtm                           1/1     Running   0          4m24s
kube-proxy-kgv8b                           1/1     Running   0          4m23s
kube-proxy-pt4dk                           1/1     Running   0          4m23s
kube-scheduler-master                      1/1     Running   1          5m12s
nginx-proxy-worker1                          1/1     Running   0          4m19s
nginx-proxy-worker2                          1/1     Running   0          4m30s
nodelocaldns-ckkjk                         1/1     Running   0          3m36s
nodelocaldns-fmbsx                         1/1     Running   0          3m36s
nodelocaldns-xj6qc                         1/1     Running   0          3m36s

* 명령어 실행결과의 상태가 정상인것을 알수있습니다.
* 설치후 kubernetes 리소스가 올바르게 실행되기까지 약간 시간이 걸릴수도 있으므로
Running 상태가 아니면 조금 기다렸다가 다시 확인해보기 바랍니다.

* k8s cluster 를 깨긋하게 삭제하고 새로 설치할때는 
powershell 에서
-  vagrant destroy -f k8s-master k8s-worker1 k8s-worker2
-  vagrant up k8s-master k8s-worker1 k8s-worker2
- 그 다음 ansible-control node 에서 rm /home/vagrant/.ssh/known_hosts 를 삭제하고 
  ssh-copy-id 명령어로 공개키를 다시 업로드 해야 합니다.
- 그리고 다시 kubernetes cluster 설치

------------------------------------------------------------------------------------

 * vagrant image 를 삭제하지 않고 kubernetes cluster 를 새로  설치하려면
   vagrant@control:~/kubespray$ $ ansible-playbook -i inventory/mycluster/hosts.yml reset.yml
 이렇게 삭제후 새로 설치해도 됩니다. 
* 삭제할때 조금 진행이 되다가 아래처럼 대화식으로 진행되는 부분에서 'yes' 를 입력하라고 합니다.
 PLAY [Reset cluster] *****************************************************************************************************
Monday 25 September 2023  10:09:52 +0000 (0:00:00.637)       0:00:11.547 ******
[Reset Confirmation]
Are you sure you want to reset cluster state? Type 'yes' to reset your cluster.:

playbook 으로 설치된것만 제거되기 때문에 공개키는 새로 업로드할 필요가 없습니다.
삭제후 ansible-control node 에서 수정해야 하거나 추가해야될 작업이 있으면 그 작업을 완료한다음

vagrant@control:~/kubespray$ ansible-playbook -i inventory/mycluster/hosts.yml --become --become-user=root cluster.yml

reset.yml 파일로 삭제후 다시 설치한다음 확인해보니 잘 동작합니다

vagrant@worker1:~$ sudo kubectl get nodes
NAME    STATUS   ROLES           AGE    VERSION
master   Ready    control-plane   3h6m   v1.28.2
worker1   Ready    		      3h5m   v1.28.2
worker2   Ready              3h5m   v1.28.2

* 간혹 설치시 disk 가 100% full 이 되어서 설치안될수도 있으니 설치안되면 컴퓨터 리소스를
확인해보세요.

*. Vagrantfile 로 클러스트설치를 위한 가상머신을 생성할때 add_hosts.sh 파일은 ansible-control-node 에만
필요합니다. 그래서 Vagrantfile에서 ansible-control-node 에만 add_hosts.sh 가 배포되게 Vagrant 설정에서
필요없는 부분을 삭제하였습니다.
하지만 기존의  Vagrantfile을  그대로 사용해도 문제는 없습니다.

* sudo 를 사용하지 않고 일반계정으로 kubectl 명령어를 사용하려면
아래와 같이 쿠버네티스 인증서 파일을 복사해서 사용하면 됩니다.
인증서 파일은 root 만 access 할수 있으므로 sudo 를 사용해서 복사하고
복사가 완료되면 소유주를 자신의 것으로 변경해야 합니다.

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

kubernetes manifest 파일을 작성할때 nano 편집기를 사용한다면
cd $HOME  
wget http://twoseven.kr/docker/docker/.nanorc 를 받으면 편리하게
파일을 작성할수 있습니다.

vim 편집기를 사용한다면
$HOME/.vimrc 파일을 아래처럼 작성하면 됩니다.
echo "autocmd FileType yaml setlocal ts=2 sts=2 sw=2 expandtab autoindent" > $HOME/.vimrc

 

 

minikube

minikube start --driver=docker 로 실행하는 경우

minikube 가 docker container 로 실행되게 됩니다.
kubernetes container runtime 도 minikube 안에서 실행됩니다.
minikube 안에 cri-dockerd,crictl 등kubernetes 에 필요한 패키지들이
포함되어 있습니다.
그래서 host 에는 kuberntees contaier runtime 을 설치할필요가 없습니다.
* CNI 는 calico, flannel 등 다른것으로 변경할수 있으며  minikube 실행할때
CNI 를 생략하면 default CNI(docker bridge nework)를 사용하게 됩니다.

설치후 확인
vagrant@minikube:~$ kubectl get nodes
NAME       STATUS   ROLES           AGE     VERSION
minikube   Ready    control-plane   5h57m   v1.27.4
vagrant@minikube:~$ kubectl get pods -n kube-system
NAME                               READY   STATUS    RESTARTS        AGE
coredns-5d78c9869d-lm652           1/1     Running   0               5h57m
etcd-minikube                      1/1     Running   0               5h57m
kube-apiserver-minikube            1/1     Running   0               5h57m
kube-controller-manager-minikube   1/1     Running   0               5h57m
kube-proxy-qp42v                   1/1     Running   0               5h57m
kube-scheduler-minikube            1/1     Running   0               5h57m
storage-provisioner                1/1     Running   1 (5h57m ago)   5h57m
vagrant@minikube:~$ docker ps
CONTAINER ID   IMAGE                                 COMMAND                  CREATED       STATUS       PORTS                                                                                                                                  NAMES
5c17c6d84ffd   gcr.io/k8s-minikube/kicbase:v0.0.40   "/usr/local/bin/entr…"   6 hours ago   Up 6 hours   127.0.0.1:32777->22/tcp, 127.0.0.1:32776->2376/tcp, 127.0.0.1:32775->5000/tcp, 127.0.0.1:32774->8443/tcp, 127.0.0.1:32773->32443/tcp   minikube
vagrant@minikube:~$

vagrant@minikube:~$ docker network ls
NETWORK ID     NAME       DRIVER    SCOPE
b0c9f7e348dc   bridge     bridge    local
71d6df7903e3   host       host      local
3069a035fc76   minikube   bridge    local
79bfb4d9166d   none       null      local
vagrant@minikube:~$

docker ps 로 확인하면
vagrant@minikube:~$ docker ps
CONTAINER ID   IMAGE                                 COMMAND                  CREATED       STATUS       PORTS                                                                                                                                  NAMES
5c17c6d84ffd   gcr.io/k8s-minikube/kicbase:v0.0.40   "/usr/local/bin/entr…"   3 hours ago   Up 3 hours   127.0.0.1:32777->22/tcp, 127.0.0.1:32776->2376/tcp, 127.0.0.1:32775->5000/tcp, 127.0.0.1:32774->8443/tcp, 127.0.0.1:32773->32443/tcp   minikube
vagrant@minikube:~$

* minikube ssh -n minikube 명령어로  minikube container 로 접속할수 있습니다.
접속은 minikube ssh -n minikube 로 접속할수 있습니다.
(또는 minikube 가 docker container 로 실행 되고 있으므로
docker exec -it minikube /bin/bash 로 접속해도 됩니다)
접속해서 docker ps 로 확인해보면 쿠버네티스 관련 컨테이너가 실행중인것을 
확인할 수 있습니다.
iptables 설정도 minikube container 안에 설정됩니다.
(sudo iptables -t nat -L -n 으로 확인)


minikube container 가 외부와 격리된 환경으로 실행이 되므로
아래와 같이 접속할 수 없습니다.
*. 아래처럼 테스트할 mainfest 파일은 http://containerlab24.com/docker/example/apache.tar 파일에 포함되어 있습니다.
wget 으로 내려받아서 실행하면 아래처럼 출력됩니다.
vagrant@minikube:~$ kubectl get svc
NAME            TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
kubernetes      ClusterIP   10.96.0.1              443/TCP          3h15m
myweb-service   NodePort    10.96.178.57           8001:30358/TCP   3h9m
vagrant@minikube:~$ curl http://10.244.0.3
curl: (28) Failed to connect to 10.244.0.3 port 80 after 129480 ms: Connection timed out
vagrant@minikube:~$ curl http://10.96.178.57:8001
curl: (28) Failed to connect to 10.96.178.57 port 8001 after 129887 ms: Connection timed out
vagrant@minikube:~$
vagrant@minikube:~$ docker network ls
NETWORK ID     NAME       DRIVER    SCOPE
b0c9f7e348dc   bridge     bridge    local
71d6df7903e3   host       host      local
3069a035fc76   minikube   bridge    local
79bfb4d9166d   none       null      local
vagrant@minikube:~$
vagrant@minikube:~$ docker container inspect minikube |grep -i "ipaddress"
            "SecondaryIPAddresses": null,
            "IPAddress": "",
                    "IPAddress": "192.168.49.2",

vagrant@minikube:~$ 
아래처럼 접속하면 됩니다.
vagrant@minikube:~$ curl http://192.168.49.2:30358 (위에 출력을보면 nodeport 번호입니다)

It works!

vagrant@minikube:~$

* nodeport 로 설정하더라도  호스트밖에서는 접속을 할수 없습니다.

* 호스트밖에서 nodeport 로 접속을 할려면 --driver=dockr 대신 다른 driver type 을 사용해야 합니다.

* minikube tunnel 명령을 사용하면 host 에서 service object의  cluster ip 주소로 접속가능합니다.
(ex. curl http://192.96.178.57:8001)

#########################################################################################################

minkube start --driver=none 으로 실행하는 경우

현재의호스트에서 kubernetes 가 설치됩니다.
그러므로 호스트에서  pod ip 및 cluster ip address 로 컨테이너에 접속할수 있습니다.
nodePort 를 사용하면 외부에서 접속가능합니다.

설치후 확인
vagrant@minikube:~$ kubectl get nodes
NAME       STATUS   ROLES           AGE     VERSION
minikube   Ready    control-plane   5m11s   v1.27.4
vagrant@minikube:~$ kubectl get ns
NAME              STATUS   AGE
default           Active   5m30s
kube-node-lease   Active   5m30s
kube-public       Active   5m30s
kube-system       Active   5m30s
vagrant@minikube:~$ kubectl get pods -n kube-system
NAME                               READY   STATUS    RESTARTS   AGE
coredns-5d78c9869d-84ghg           1/1     Running   0          5m29s
etcd-minikube                      1/1     Running   0          5m41s
kube-apiserver-minikube            1/1     Running   0          5m43s
kube-controller-manager-minikube   1/1     Running   0          5m41s
kube-proxy-5ncxm                   1/1     Running   0          5m29s
kube-scheduler-minikube            1/1     Running   0          5m43s
storage-provisioner                1/1     Running   0          5m41s
vagrant@minikube:~$

vagrant@minikube:~$ docker ps
CONTAINER ID   IMAGE                                     COMMAND                  CREATED         STATUS         PORTS     NAMES
888a2faafedb   gcr.io/k8s-minikube/storage-provisioner   "/storage-provisioner"   6 minutes ago   Up 6 minutes             k8s_storage-provisioner_storage-provisioner_kube-system_8434f034-ee3e-4463-ac84-635b45a6b2f5_0
2f7f2d91d881   ead0a4a53df8                              "/coredns -conf /etc…"   6 minutes ago   Up 6 minutes             k8s_coredns_coredns-5d78c9869d-84ghg_kube-system_d27f1c7b-4db4-42ba-b956-8cd92b7ee524_0
9d7bf15d29e6   registry.k8s.io/pause:3.9                 "/pause"                 6 minutes ago   Up 6 minutes             k8s_POD_coredns-5d78c9869d-84ghg_kube-system_d27f1c7b-4db4-42ba-b956-8cd92b7ee524_0
... 이하생략

$ vagrant@minikube:~$ kubectl run apache --image=httpd:2.4
pod/apache created
vagrant@minikube:~$ kubectl get pods -o wide
NAME     READY   STATUS    RESTARTS   AGE   IP           NODE       NOMINATED NODE   READINESS GATES
apache   1/1     Running   0          28s   10.244.0.3   minikube              
vagrant@minikube:~$
vagrant@minikube:~$ curl http://10.244.0.3

It works!

vagrant@minikube:~$

* service type 을 NodePort 로 설정해서 pod 로 접속하면 호스트 외부에서도 접속가능합니다.
  (minikube start --driver=none 이면 호스트 외부에서 nodeport 로 접속불가)

=========================================================================================================

minikube 를 새로 실행할때는 minikube delete 후 다시 실행하면 됩니다.
minikube delete 는 실행중인 pod 까지 삭제합니다.
다시 실행할때 minikube start --driver=docker 로도  실행가능합니다.
* (minikube_install.sh 파일은 --driver=none 으로만 실행해야 하고, 
  --driver=none 을 생략해도 --driver=docker 입니다.)

* host 를 rebooting 하면 minikube 를 다시 실행해야 합니다.

 


 

kubectl get pod -n kube-system
kubectl get pod -n kube-flannel
(둘 다 러닝이 되어야함 (-A 옵션))

 

방화벽 관리를 위하여  노드마다 프록시가 올라와 있다 (패킷을 어디로 보낼지)

 

 

파드를 올리면 worker node 에서 실행 된다 (worker node 접속 후 crictl 명령어로 컨테이너 확인 가능)

 

디폴트로 마스터는 파드가 안올라가게끔 스케쥴 되어있다
(마스터는 관리용이여야하기 때문, 부하 방지)

 

kubectl 명령어를 입력했을 때 kube-apiserver 로 전달 후 처리

kube-scheduler
etcd-master 정보를 참고해서 파드를 어디에 배치할지 정한다

etcd-master
모든 정보(노드 정보) 가 포함(DB역할)

kube-proxy 
네트워크 및 방화벽을 관리 

 

kube-controller-manager
클러스터의 실제 상태를 원하는 사양으로 조정

 

 


namespaces (ns) (기본 : default)
리소스를 격리
리눅스 디렉토리 개념
중복방지

 

app 이라는 네임스페이스에서는 user1~3 만 수정 가능
newapp 이라는 네임스페이스에서는 user4~5 만 수정 가능 
각각 리소스를 분리, 사용자 권한 분리, quota(cpu usage limit , ram usage limit) 설정 해서 사용가능

 

yaml 파일

apiVersion ---> camelcase 형식, v1 는 코어 버전(중요), app/v1 는 그냥 버전
kind ---> api-resources 에서 확인 (어떤 종류의 객체인지)
metadata ---> 객체를 유니크하게 식별할수 있는 데이터이름.  uid,  네임스페이스를 포함

 

kubectl config set-context --current --namespace testns
(기본 네임스페이스를 testns 로 변경)

 

---
kind: Pod         # 필수
apiVersion: v1     # 필수
metadata:          # 필수
  name: apache-pod  # 띄어쓰기 2칸
spec:
  containers:
  - name: myweb-container
    image: httpd:2.4
    ports:
    - containerPort: 80

---

 

 

 

 

쿠버네티스 관리자 권한 얻기

사용자가 root 일 때
export KUBECONFIG=/etc/kubernetes/admin.conf

일반 사용자 일 때

vagrant 가 허락해야지 사용 가능

[admin@master ~]$ mkdir -p $HOME/.kube
[admin@master ~]$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[admin@master ~]$ sudo chown admin:admin /home/admin/.kube/config
[admin@master ~]$ echo "source <(kubectl completion bash)" >> ~/.bashrc
[admin@master ~]$  source .bashrc
[admin@master ~]$ kubectl get pod

 

 

kubectl 약어 설정 (kubernetes 치트 시트)

alias k=kubectl
complete -o default -F __start_kubectl k

 

 

service

[vagrant@master work]$ more myweb-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: myweb-service
spec:
  ports:
  - port: 8001
    targetPort: 80
  selector:
    myapp: myweb
[vagrant@master work]$

 

selector 로 파드 매칭

apache-pod 라벨 추가

nginx 파드도 라벨 변경하여 라운드 로빈(RR)

 

k edit service myweb-service
에서 type 을 NodePort 로 변경

 

 

 

replicaset

[vagrant@master work]$ more replica.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: apache-replica
spec:
  replicas: 3
  selector:
    matchLabels:      #일치하는 라벨을 가진 파드를 만들어라 3개를
      app: apache-replica
  template:
    metadata:
      labels:
        app: apache-replica     #matchLabels 과 똑같이 맞춰야한다
    spec:
      containers:
      - name: myweb-container2
        image: httpd:2.4
        ports:
        - containerPort: 80
[vagrant@master work]$

apply 후 

각 파드는 노드(VM OS) 에 분배됨

 

 

deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 10
  selector:
    matchLabels:      #일치하는 라벨을 가진 파드를 만들어라 3개를
      app: nginx
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1    # 배포 중 10개 중 최소 9개 운영
      maxSurge: 5        # 10개에서 최대 5개 더 운영
  template:
    metadata:
      labels:
        app: nginx     #matchLabels 과 똑같이 맞춰야한다
    spec:
      containers:
      - name: nginx-container2
        image: nginx:1.22
        ports:
        - containerPort: 80

 

k apply -f deploy.yaml

 image: nginx:1.22 -> 1.24 버전으로 수정 후 apply

 

docker login 

* docker hub 에서 다운로드 받을수 있는 리미트에 도달하게 되면 더이상 다운로드가 되지 않으므로
도커허브에 자신의 아이디로 인증을 한후 도커 이미지를 다운로드 받아야 합니다.

kubernetes 에서 도커허브 인증방벙븐 아래와 같이
secret object 를 자신의 아이디 및 암호, 이메일로 생성해서 사용하면 됩니다.

kubectl create secret docker-registry mysecret --docker-username=kildong --docker-password='mypass'

* 암호에 특수문자가 포함되어 있는경우 따옴표를 붙여주는것을 권장합니다.
* yaml 파일에는 맨 아래에 생성한 secret 을 추가하여야 합니다.

--------------------

---
apiVersion: v1
kind: Pod
metadata:
  name: apache-pod
  labels:
    myapp: myweb
spec:
  containers:
  - name: apache-container
    image: nginx:1.21
    ports:
    - containerPort: 80
  imagePullSecrets:
  - name: mysecret

 

 

댓글