2020년 4월 16일 목요일

[k8s/쿠버네티스] NFS Provisioner

- 0 개의 댓글

음..식상하지 않은 인사가 뭐가 있을까 고민해 봤는데 딱히 없네요 ㅠㅠ
여~~~하튼 k8s의 Dynamic volume을 구현하고 싶은데, 번거로운건 좀 싫구
이래저래 계속 알아보다 보니 NFS로 어느정도 구현할수 있는 프로젝트들이 있더라고요

대표적으로 NFS-Provisioner 그리고 NFS-Client가 있습니다.
이름이 ....-_- 인간적으로 거의 같아서..엄청 헷깔리고 뭐...아시다시피 영어로 된 설명도 고만고만하고 그래서 이럴때는 제일 좋은게 테스트죠!!!
사실 해봐야 쓸만한지도 알고....그래서 해봤습니다.
(영상은..고민 중이에요 / 영상이 글 쓰는 것보다 사실 요즘은 더 쉽긴 한데 말이죵)
0. 실행 전에 편리를 위해서 bash-completion.sh 를 설치합니당

bash <(curl -s https://raw.githubusercontent.com/sysnet4admin/IaC/master/manifests/bash-completion.sh)

1. NFS-Provisioner


1-1. 우선 serviceaccount랑 rbac이랑 svc랑 이것저것 설치해야 됩니다. 그래서 다 뭉쳐뒀죠 하하하하 :)

[root@m-k8s ~]# kubectl apply -f https://raw.githubusercontent.com/sysnet4admin/IaC/master/manifests/vol/nfs-provisioner/1.nfs-provisioner+.yaml
serviceaccount/nfs-provisioner created
role.rbac.authorization.k8s.io/leader-locking-nfs-provisioner created
rolebinding.rbac.authorization.k8s.io/leader-locking-nfs-provisioner created
clusterrole.rbac.authorization.k8s.io/nfs-provisioner-runner created
clusterrolebinding.rbac.authorization.k8s.io/run-nfs-provisioner created
storageclass.storage.k8s.io/nfs-svr-sc created
service/nfs-provisioner created
deployment.apps/nfs-provisioner created


[root@m-k8s ~]# k get pod -o wide
NAME                             READY   STATUS    RESTARTS   AGE   IP               NODE     NOMINATED NODE   READINESS GATES
nfs-provisioner-9fdb5b47-djg55   1/1     Running   0          24m   172.16.221.129   w1-k8s   <none>           <none>


1-2. 그리고 pvc 1Gi를 claim 해 봅니다아 그리고 확인해 보면 좀 있다가 pv가 생성된걸 확인할수 있죠

[root@m-k8s ~]# kubectl apply -f https://raw.githubusercontent.com/sysnet4admin/IaC/master/manifests/vol/nfs-provisioner/2.claim-pvc1Gi.yaml
persistentvolumeclaim/claim-svr-pvc created

[root@m-k8s ~]# k get pv,pvc
NAME                                                        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                   STORAGECLASS   REASON   AGE
persistentvolume/pvc-c8d98b5b-86b1-4b58-ae77-05d9233227ee   1Gi        RWX            Delete           Bound    default/claim-svr-pvc   nfs-svr-sc              14s

NAME                                  STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistentvolumeclaim/claim-svr-pvc   Bound    pvc-c8d98b5b-86b1-4b58-ae77-05d9233227ee   1Gi        RWX            nfs-svr-sc     14s
[root@m-k8s ~]# kubectl apply -f https://raw.githubusercontent.com/sysnet4admin/IaC/master/manifests/vol/nfs-provisioner/3.sts-claim-vct1Gi.yaml
statefulset.apps/add-svr-pvc created

이게 w1-k8s 노드에 생성되도록 지정했고 /srv 위치에 했으니 해당 위치에 가면 생성규칙에 따라 디렉터리가 생성되어 있습니다아.

[root@w1-k8s ~]# ls /srv/
ganesha.log  nfs-provisioner.identity  pvc-c8d98b5b-86b1-4b58-ae77-05d9233227ee  v4old  v4recov  vfs.conf


1-3 이번에 sts로 생성해 볼까요?

[root@m-k8s ~]# kubectl apply -f https://raw.githubusercontent.com/sysnet4admin/IaC/master/manifests/vol/nfs-provisioner/3.sts-claim-vct1Gi.yaml
statefulset.apps/add-svr-pvc created

[root@m-k8s ~]# k get pv,pvc
NAME                                                        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                               STORAGECLASS   REASON   AGE
persistentvolume/pvc-22f09ae8-8813-40e1-ba82-c63f2049e200   1Gi        RWX            Delete           Bound    default/vct-svr-vol-add-svr-pvc-0   nfs-svr-sc              4s
persistentvolume/pvc-c8d98b5b-86b1-4b58-ae77-05d9233227ee   1Gi        RWX            Delete           Bound    default/claim-svr-pvc               nfs-svr-sc              4m2s

NAME                                              STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistentvolumeclaim/claim-svr-pvc               Bound    pvc-c8d98b5b-86b1-4b58-ae77-05d9233227ee   1Gi        RWX            nfs-svr-sc     4m2s
persistentvolumeclaim/vct-svr-vol-add-svr-pvc-0   Bound    pvc-22f09ae8-8813-40e1-ba82-c63f2049e200   1Gi        RWX            nfs-svr-sc     4s

잘 되는군요!!

2. NFS-Client


2-0. 이걸 위해서는 NFS-Server가 있어야 하므로 우선 서버를 설치합니다.

[root@m-k8s ~]# bash <(curl -s https://raw.githubusercontent.com/sysnet4admin/IaC/master/manifests/vol/nfs-client-provisioner/0.Builder_nfs_server.sh)
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.

[root@m-k8s ~]# exportfs
/nfs_shared     192.168.1.0/24

2-1. 그리고 나서 일전과 같이 serviceaccount와 이것저것을 설치합니다. rbac은 공통이라 unchanged 랍니다아~

[root@m-k8s ~]# kubectl apply -f https://raw.githubusercontent.com/sysnet4admin/IaC/master/manifests/vol/nfs-client-provisioner/1.nfs-client+.yaml
serviceaccount/nfs-client-provisioner created
role.rbac.authorization.k8s.io/leader-locking-nfs-provisioner unchanged
rolebinding.rbac.authorization.k8s.io/leader-locking-nfs-provisioner configured
clusterrole.rbac.authorization.k8s.io/nfs-provisioner-runner unchanged
clusterrolebinding.rbac.authorization.k8s.io/run-nfs-provisioner configured
storageclass.storage.k8s.io/nfs-sc created
deployment.apps/nfs-client created

nfs-client라는 pod가가 NFS-Provisioner의 역할을 합니다. (sc의 provisioner가 아니라 claim을 받아주는 역할이요)

[root@m-k8s ~]# k get pod
NAME                             READY   STATUS    RESTARTS   AGE
add-svr-pvc-0                    1/1     Running   0          18m
nfs-client-54fdb4c5bc-z6bdc      1/1     Running   0          81s <<<<<<
nfs-provisioner-9fdb5b47-djg55   1/1     Running   1          31m


2-2-1. 그러면 pvc를 claim해 볼까요? 새로 생성된건 claim-pvc 입니당 (헷깔리실까)

[root@m-k8s ~]# kubectl apply -f https://raw.githubusercontent.com/sysnet4admin/IaC/master/manifests/vol/nfs-client-provisioner/2-1.claim-pvc1Gi.yaml
persistentvolumeclaim/claim-pvc created
[root@m-k8s ~]# k get pv,pvc
NAME                                                        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                               STORAGECLASS   REASON   AGE
persistentvolume/pvc-22f09ae8-8813-40e1-ba82-c63f2049e200   1Gi        RWX            Delete           Bound    default/vct-svr-vol-add-svr-pvc-0   nfs-svr-sc              18m
persistentvolume/pvc-55c80adc-55ec-4db9-9768-bda13099f1f3   1Gi        RWX            Delete           Bound    default/claim-pvc                   nfs-sc                  4s
persistentvolume/pvc-c8d98b5b-86b1-4b58-ae77-05d9233227ee   1Gi        RWX            Delete           Bound    default/claim-svr-pvc               nfs-svr-sc              22m

NAME                                              STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistentvolumeclaim/claim-pvc                   Bound    pvc-55c80adc-55ec-4db9-9768-bda13099f1f3   1Gi        RWX            nfs-sc         4s
persistentvolumeclaim/claim-svr-pvc               Bound    pvc-c8d98b5b-86b1-4b58-ae77-05d9233227ee   1Gi        RWX            nfs-svr-sc     22m
persistentvolumeclaim/vct-svr-vol-add-svr-pvc-0   Bound    pvc-22f09ae8-8813-40e1-ba82-c63f2049e200   1Gi        RWX            nfs-svr-sc     18m

2-2-2. pvc가 생성되었으니 생성된 pvc를 이용해서 pod에 volume을 마운트해서 올려봐야 겠죠오?

[root@m-k8s ~]# kubectl apply -f https://raw.githubusercontent.com/sysnet4admin/IaC/master/manifests/vol/nfs-client-provisioner/2-2.use-pvc.yaml
deployment.apps/use-pvc created


생성된 pod 내부 좀 볼까요?

[root@m-k8s ~]# k get pod
NAME                             READY   STATUS    RESTARTS   AGE
add-svr-pvc-0                    1/1     Running   0          19m
nfs-client-54fdb4c5bc-z6bdc      1/1     Running   0          2m15s
nfs-provisioner-9fdb5b47-djg55   1/1     Running   1          31m
use-pvc-64679676d7-cb7hx         1/1     Running   0          17s <<<<<<<<
[root@m-k8s ~]# k exec use-pvc-64679676d7-cb7hx -it -- /bin/bash

root@use-pvc-64679676d7-cb7hx:/# df -h
Filesystem                                                                           Size  Used Avail Use% Mounted on
overlay                                                                               37G  2.5G   35G   7% /
tmpfs                                                                                496M     0  496M   0% /dev
tmpfs                                                                                496M     0  496M   0% /sys/fs/cgroup
192.168.1.10:/nfs_shared/default-claim-pvc-pvc-55c80adc-55ec-4db9-9768-bda13099f1f3   37G  3.1G   34G   9% /pvc-vol
/dev/mapper/centos_k8s-root                                                           37G  2.5G   35G   7% /etc/hosts
shm                                                                                   64M     0   64M   0% /dev/shm
tmpfs                                                                                496M   12K  496M   1% /run/secrets/kubernetes.io/serviceaccount
tmpfs                                                                                496M     0  496M   0% /proc/acpi
tmpfs                                                                                496M     0  496M   0% /proc/scsi
tmpfs   

재미나게 마운트 되어 있고 디렉터리도 생성했네요 :)

2-3. sts로도 잘 되겠지만 pvc 생성 없이 바로 되는거 확인해 보도록 하죠

[root@m-k8s ~]# kubectl apply -f https://raw.githubusercontent.com/sysnet4admin/IaC/master/manifests/vol/nfs-client-provisioner/3.sts-claim-vct1Gi.yaml
statefulset.apps/add-pvc created
[root@m-k8s ~]# k get pod
NAME                             READY   STATUS    RESTARTS   AGE
add-pvc-0                        1/1     Running   0          39s
add-svr-pvc-0                    1/1     Running   0          20m
nfs-client-54fdb4c5bc-z6bdc      1/1     Running   0          3m33s
nfs-provisioner-9fdb5b47-djg55   1/1     Running   1          33m
use-pvc-64679676d7-cb7hx         1/1     Running   0          95s
[root@m-k8s ~]# k exec add-pvc-0 -it -- /bin/bash
root@add-pvc-0:/# df -h
Filesystem                                                                                   Size  Used Avail Use% Mounted on
overlay                                                                                       37G  2.8G   35G   8% /
tmpfs                                                                                        496M     0  496M   0% /dev
tmpfs                                                                                        496M     0  496M   0% /sys/fs/cgroup
192.168.1.10:/nfs_shared/default-vct-vol-add-pvc-0-pvc-10cc8eca-34f5-4679-a12e-e0c26841bc63   37G  3.1G   34G   9% /pvc-vol
/dev/mapper/centos_k8s-root                                                                   37G  2.8G   35G   8% /etc/hosts
shm                                                                                           64M     0   64M   0% /dev/shm
tmpfs                                                                                        496M   12K  496M   1% /run/secrets/kubernetes.io/serviceaccount
tmpfs                                                                                        496M     0  496M   0% /proc/acpi
tmpfs                                                                                        496M     0  496M   0% /proc/scsi
tmpfs                                                                                        496M     0  496M   0% /sys/firmware
root@add-pvc-0:/# exit
exit
[root@m-k8s ~]# ls /nfs_shared/
default-claim-pvc-pvc-55c80adc-55ec-4db9-9768-bda13099f1f3  default-vct-vol-add-pvc-0-pvc-10cc8eca-34f5-4679-a12e-e0c26841bc63
[root@m-k8s ~]#

2개의 디렉터리가 NFS_Server(/nfs_shared)에 만들어졌네요
NFS-Provisioner(와 client)를 이용하면 smb 마켓에서 k8s의 volume을 Dynamic에 가깝게 쓸수 있을꺼 같아요

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

3줄 요약 (요즘 유행인거 같아서?)
1. NFS-Provisioner는 따로 NFS 설정 없이 hostPath를 바인딩해서 넘겨준다
   NFS-Client는 NFS 서버의 shared dir(예: /nfs_shared)를 바인딩해서 넘겨준다
2. 둘다 용량을 Dynamic하게 써주는 건 여전히 안된다 (용량 제한관리가 안됨)
3. pvc를 claim해서 pv가 자동생성 및 StatefulSet에 volumeClaimTemplates 으로 volume 마운트가 둘다 되니 골라서 쓰면 된다. (비슷비슷함)

빠잉~!
[Continue reading...]

2020년 3월 15일 일요일

[k8s/쿠버네티스] kubespray의 요구사항 중에 메모리 용량

- 0 개의 댓글


오랜만입니다.

이번에 다룰 주제는?

kubespray의 최소 메모리 양은? 입니다.
짝짝짝....

이걸 굳이 왜 다루게 되었냐면...
홈페이지에 요래요래 나와 있는데요..(https://github.com/kubernetes-sigs/kubespray#requirements)

Hardware: These limits are safe guarded by Kubespray. Actual requirements for your workload can differ. For a sizing guide go to the Building Large Clusters guide.
  • Master
    • Memory: 1500 MB
  • Node
    • Memory: 1024 MB

막상 해 보면 에러를 맞게 되니....-_- 그것도 테스트도 엄청 오래걸립니다.

결과부터 얘기하면,

안전한 사정권은
Master에 2048MB 그리고 Worker Node에는 1280MB 정도입니다.

>>>추가

소스를 그래서 좀 열어서 봤는데요 (앤서블 소스는 쉬우니까요..-_-)

일단 에러는 이쪽에서 체크해서 넘기고요
[root@m11-k8s ~]# grep -r "Stop if memory is too small for masters" /kubespray/./kubespray/roles/kubernetes/preinstall/tasks/0020-verify-settings.yml:- name: Stop if memory is too small for masters

그리고 체크는 여기서 ansible_memtotal_mb를 이용해서 하더라고요
[root@m11-k8s ~]# grep -r ansible_memtotal_mb ./kubespray/
./kubespray/roles/etcd/defaults/main.yml:etcd_memory_limit: "{% if ansible_memtotal_mb < 4096 %}512M{% else %}0{% endif %}"./kubespray/roles/kubernetes/preinstall/tasks/0020-verify-settings.yml: that: ansible_memtotal_mb >= minimal_master_memory_mb./kubespray/roles/kubernetes/preinstall/tasks/0020-verify-settings.yml: that: ansible_memtotal_mb >= minimal_node_memory_mb


그러면 느낌이... ansible_memtotal_mb 이 넘이 범인?
왜냐면 이렇게 체크하고 있거든요

[root@m11-k8s ~]# grep -r minimal_node_memory_mb ./kubespray/
./kubespray/roles/kubernetes/preinstall/defaults/main.yml:minimal_node_memory_mb: 1024./kubespray/roles/kubernetes/preinstall/tasks/0020-verify-settings.yml: that: ansible_memtotal_mb >= minimal_node_memory_mb

[root@m11-k8s ~]# grep -r minimal_master_memory_mb ./kubespray/
./kubespray/roles/kubernetes/preinstall/defaults/main.yml:minimal_master_memory_mb: 1500./kubespray/roles/kubernetes/preinstall/tasks/0020-verify-settings.yml: that: ansible_memtotal_mb >= minimal_master_memory_mb

그래서 실제로 얼마 정도로 체크하나 봤죠.
대충 local에 가 ansible_memtotal_mb 얼마나 용량으로 인자 값을 가지고 오나 보려고요

[root@m11-k8s ~]# ansible-playbook test.yaml
 [WARNING]: Unable to parse /etc/ansible/hosts as an inventory source

 [WARNING]: No inventory was parsed, only implicit localhost is available

 [WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'


PLAY [localhost] **************************************************************************************************************

TASK [Gathering Facts] ********************************************************************************************************
ok: [localhost]

TASK [debug] ******************************************************************************************************************
ok: [localhost] => {
    "msg": 1998
}

PLAY RECAP ********************************************************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0


찾았네요 문제? 라고 해야하나....
VM에서는 2048로 줬는데...1998로 인자 값을 물고 오네요...버그인가...고로 문제의 원인은...
ansible_memtotal_mb  입니다!!!

컨디션 마다 실행되는 에러는 다음과 같아요~!
시간을 아낄수 있으면 좋겠네요 :)


[ Master 1500MB, Worker 1024MB ]

TASK [kubernetes/preinstall : Stop if memory is too small for masters] **************************************************************************
skipping: [w101-k8s]
skipping: [w102-k8s]
fatal: [m11-k8s]: FAILED! => {
    "assertion": "ansible_memtotal_mb >= minimal_master_memory_mb",
    "changed": false,
    "evaluated_to": false,
    "msg": "Assertion failed"
}
skipping: [w103-k8s]
fatal: [m12-k8s]: FAILED! => {
    "assertion": "ansible_memtotal_mb >= minimal_master_memory_mb",
    "changed": false,
    "evaluated_to": false,
    "msg": "Assertion failed"
}
fatal: [m13-k8s]: FAILED! => {
    "assertion": "ansible_memtotal_mb >= minimal_master_memory_mb",
    "changed": false,
    "evaluated_to": false,
    "msg": "Assertion failed"
}
skipping: [w104-k8s]
skipping: [w105-k8s]
skipping: [w106-k8s]



[ Master 1536MB, Worker 1024MB  ]


TASK [kubernetes/preinstall : Stop if memory is too small for masters] **************************************************************************
skipping: [w101-k8s]
skipping: [w102-k8s]
skipping: [w103-k8s]
skipping: [w104-k8s]
skipping: [w105-k8s]
skipping: [w106-k8s]
fatal: [m11-k8s]: FAILED! => {
    "assertion": "ansible_memtotal_mb >= minimal_master_memory_mb",
    "changed": false,
    "evaluated_to": false,
    "msg": "Assertion failed"
}
fatal: [m12-k8s]: FAILED! => {
    "assertion": "ansible_memtotal_mb >= minimal_master_memory_mb",
    "changed": false,
    "evaluated_to": false,
    "msg": "Assertion failed"
}
fatal: [m13-k8s]: FAILED! => {
    "assertion": "ansible_memtotal_mb >= minimal_master_memory_mb",
    "changed": false,
    "evaluated_to": false,
    "msg": "Assertion failed"
}


[ Master 2048MB, Worker 1024MB ]

TASK [kubernetes/preinstall : Stop if memory is too small for nodes] **************************************************************************
fatal: [w101-k8s]: FAILED! => {
    "assertion": "ansible_memtotal_mb >= minimal_node_memory_mb",
    "changed": false,
    "evaluated_to": false,
    "msg": "Assertion failed"
}
fatal: [w102-k8s]: FAILED! => {
    "assertion": "ansible_memtotal_mb >= minimal_node_memory_mb",
    "changed": false,
    "evaluated_to": false,
    "msg": "Assertion failed"
}
skipping: [m11-k8s]
fatal: [w103-k8s]: FAILED! => {
    "assertion": "ansible_memtotal_mb >= minimal_node_memory_mb",
    "changed": false,
    "evaluated_to": false,
    "msg": "Assertion failed"
}
skipping: [m12-k8s]
fatal: [w104-k8s]: FAILED! => {
    "assertion": "ansible_memtotal_mb >= minimal_node_memory_mb",
    "changed": false,
    "evaluated_to": false,
    "msg": "Assertion failed"
}
fatal: [w105-k8s]: FAILED! => {
    "assertion": "ansible_memtotal_mb >= minimal_node_memory_mb",
    "changed": false,
    "evaluated_to": false,
    "msg": "Assertion failed"
}
skipping: [m13-k8s]
fatal: [w106-k8s]: FAILED! => {
    "assertion": "ansible_memtotal_mb >= minimal_node_memory_mb",
    "changed": false,
    "evaluated_to": false,
    "msg": "Assertion failed"
}



[Continue reading...]

2020년 2월 7일 금요일

[k8s/쿠버네티스] bash-completion

- 0 개의 댓글


안녕하시렵니까?
(우앙 엄청 오래된 재미없는....)

하하하;;;

바로 본론으로 들어갈께요 ㅠㅠ
쿠버네티스를 쓰다보면 하루종일 정말 종일 (내가 API를 따로 짜지 않는 이상) kubectl kubectl kubectl...아 세번쳤는데 손가락 아프네.....
지겹도록 치거든요..또 cka 셤을 보다보면 하루종일 쳐야 하고..

또 인간적으로 그렇잖나요 우리가 뭐 신도 아니고...오타도 나고 응 실수도 하고 응..뭐...
내가 느그 서장이랑 이미지 검색결과

그럴때는 말이죠 쿠버네티스 홈페이지에도 bash-completion 기능을 써
그럼 우앙 굿할꺼라고 써 있는데요...
이걸 보다 보면..왜? 라는 의문이 들어요

뭐 사실 대부분의 코드는 그러려니 하겠는데....
complete -F __start_kubectl k 이 부분 말이죠!

이건 말이죠 k라는 alias를 사용할때 (물론 제가 짜는건 kc를 주로 쓰긴 하지만...) 도 __start_kubectl 함수를 사용하라는거죠..



# install bash-completion for kubectl yum install bash-completion # kubectl completion on bash-completion dir kubectl completion bash >/etc/bash_completion.d/kubectl # alias kubectl to k echo 'alias k=kubectl' >> ~/.bashrc echo 'complete -F __start_kubectl k' >> ~/.bashrc












이게 생각보다 쉬운데 자료가 없더라고요...그래서 kubectl 자체를 보니까..
(/etc/bash_completion.d/kubectl <<< 이건 kubectl completion bash로 만들어진거에요)
요래요래 구현되어 있더라고요 꼭 구조체? 같이 생겼죠 뭐..bash의 구조체라고 해야 하려나...




참고오오오 하시구..꼭 쓰세요 두번 쓰세요~!


참고 사이트:
http://dogfeet.github.io/articles/2012/bash-completion.html
https://www.cyberciti.biz/faq/add-bash-auto-completion-in-ubuntu-linux/
https://kubernetes.io/docs/tasks/tools/install-kubectl/
[Continue reading...]

2020년 1월 2일 목요일

[k8s/쿠버네티스] kubetail 소개

- 0 개의 댓글













metallb의 speaker들을 모니터링 할 일이 생겨서..
뭐가 있나 찾아봤는데...
kubetail이라는게 있더라!
https://github.com/johanhaleby/kubetail

대략 내용을 읽어보니 이런 점이 눈에 띈다.
log랑 같은 기능이긴 한데 그게 많으면 어떻게 할껀데?

Bash script that enables you to aggregate (tail/follow) logs from multiple pods into one stream. This is the same as running "kubectl logs -f " but for multiple pods.

인정!!
그리고 써보니 highlight 비슷한 기능을 제공해서 어느노드에서 어떤 일들이 생기는지를 실시간으로 알수 있어서 편했다..

근데 개발자가 맥 유저인가..(북미는 맥이 많긴 하지..)
brew로 하더라...

그래서 보통 리눅스의 bash에서 쉽게 받을수 있도록 아주아주 약간만 변형해서 다음과 같이 올린다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#! /usr/bin/env bash
# usage: 
# 1. bash <(curl -s https://raw.githubusercontent.com/sysnet4admin/IaC/master/manifests/install_kubetail.sh) 

curl -O https://raw.githubusercontent.com/johanhaleby/kubetail/master/kubetail
chmod 744 kubetail
mv kubetail /sbin

echo ""
echo "Example: "
echo "1. kubetail -l component=speaker -n metallb-system"
echo "2. kubetail -l k8s-app=calico-node -n kube-system"
echo "3 kubetail <pod_name_as_default>"

pod 내에 멀티 컨테이너를 분석할때 유용해 보인다 특히 speaker나 calico 같은것들!! 실시간 네트워크 flow 볼때라든가...물론 tcpdump로 찍어서 봐도 되긴 하지만...
[Continue reading...]

2019년 12월 2일 월요일

[k8s/쿠버네티스] alias _v0.3

- 0 개의 댓글


안녕하세요~~오~

요즘 교육의 목적으로 k8s를 보고 있는데요.
알다시피 k8s를 하다보면 kubectl get 어쩌구 저쩌구 kubectl apply -f 어쩌구 저쩌구 kubectl exec 어쩌구....-_-;;;

내 얼굴 같구만..(답이 없네...)
어쩌란 말이오 짤에 대한 이미지 검색결과

그래서 앤서블에서 anp(ansible-playbook), ans(ansible) 만든 것처럼, alias를 하려고 좀 알아봤는데..딱 맘에 드는게 없더라고요.

그래서 뭐...맘에 드는 도구가 없다면? 직접 만들어 쓰는게 도리

로켓단 짤에 대한 이미지 검색결과

이렇게 만들었습니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#! /usr/bin/env bash

if grep -q sysnet4admin ~/.bashrc; then
  echo "k8s_rc already installed"
  exit 0
fi

echo -e "\n#custome rc provide @sysnet4admin " >> ~/.bashrc
echo "source ~/.k8s_rc " >> ~/.bashrc

cat > ~/.k8s_rc <<'EOF'
#! /usr/bin/env bash
# HoonJo ver0.1
# https://github.com/sysnet4admin/IaC
alias kc='kubectl'
alias kcg='kubectl get'
alias kca='kubectl apply -f'
alias kcd='kubectl describe'
alias kcc='kubectl create'
alias kcs='kubectl scale'
alias kce='kubectl export'
alias kcl='kubectl logs'
alias kcgw='kubectl get $1 -o wide'
kcee(){
  if [ $# -eq 1 ]; then
    kubectl exec -it $(kubectl get pods | tail --lines=+2 | awk '{print $1}' | awk NR==$1) -- /bin/bash;
  else
    echo "usage: kcee <pod number>"
  fi
}
kceq(){
  echo -e ""
  kubectl get pods | tail --lines=+2 | awk '{print NR " " $1}'
  echo -en "\nPlease select pod in: "
  read select
  kubectl exec -it $(kubectl get pods | tail --lines=+2 | awk '{print $1}' | awk NR==$select) -- /bin/bash;
}
EOF
https://github.com/sysnet4admin/IaC/blob/master/manifests/k8s_rc.sh

다른건 아마 그냥 쓰면 아실텐데..약간 특이한건 kcee, kceq인데요.
컨테이너를 접속하려면 exe -it을 주로 쓰는데요 그리고  -- /bin/bash를 붙여서요. 이건 넘겨받으려다 보니까 alias로 구현하기가 어렵더라고요.
(변: 보통 kubectl을 k로 alias하는데요, 추후에 kubeflow나 다른 kube들 확장을 고려해서 kubectl을 kc로 alias했어요)

그래서 위와 같이 함수로 구현했어요.

사용예제는 요래요래 합니다.

1. 설치 + 설정 다시 로드(su -) 
[root@m-k8s ~]# bash <(curl -s https://raw.githubusercontent.com/sysnet4admin/IaC/master/manifests/k8s_rc.sh)
[root@m-k8s ~]# su -

2. 도커 컨테이너 설치 
[root@m-k8s ~]# kubectl apply -f https://raw.githubusercontent.com/sysnet4admin/Iac/master/misc/echo-nginx.yaml

3. 설치된 애들 확인 
[root@m-k8s ~]# kcg pods
NAME                          READY   STATUS    RESTARTS   AGE
echo-nginx-5cc884d64c-4kjdh   1/1     Running   0          80s
echo-nginx-5cc884d64c-g2hgb   1/1     Running   0          80s
echo-nginx-5cc884d64c-rkg2x   1/1     Running   0          80s

4. kcee 테스트
[root@m-k8s ~]# kcee 1
root@echo-nginx-5cc884d64c-4kjdh:/#

5. kceq 테스트
[root@m-k8s ~]# kceq
1 echo-nginx-5cc884d64c-4kjdh
2 echo-nginx-5cc884d64c-g2hgb
3 echo-nginx-5cc884d64c-rkg2x
Please select pod in: 3
root@echo-nginx-5cc884d64c-rkg2x:/#

재미나게 쓰세요 :)
빠잉요

+v1 오리댕이님이 소스를 수정해 주셔서 아래와 같이 다시 업데이트 합니다아~

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#! /usr/bin/env bash
# kceq revision by 오리댕이
 
if grep -q sysnet4admin ~/.bashrc; then
  echo "k8s_rc already installed"
  exit 0
fi

echo -e "\n#custome rc provide @sysnet4admin " >> ~/.bashrc
echo "source ~/.k8s_rc " >> ~/.bashrc

cat > ~/.k8s_rc <<'EOF'
#! /usr/bin/env bash
# HoonJo ver0.1
# https://github.com/sysnet4admin/IaC
alias kc='kubectl'
alias kcg='kubectl get'
alias kca='kubectl apply -f'
alias kcd='kubectl describe'
alias kcc='kubectl create'
alias kcs='kubectl scale'
alias kce='kubectl export'
alias kcl='kubectl logs'
alias kcgw='kubectl get $1 -o wide'
kcee(){
  if [ $# -eq 1 ]; then
    kubectl exec -it $(kubectl get pods | tail --lines=+2 | awk '{print $1}' | awk NR==$1) -- /bin/bash;
  else
    echo "usage: kcee <pod number>"
  fi
}
kceq(){
  if [ $# -eq 1 ]; then
    NAMESPACE=$1
    exi_chk=($(kubectl get namespaces | tail --lines=+2 | awk '{print $1}'))
    if [[ ! "${exi_chk[@]}" =~ "$NAMESPACE" ]]; then
      echo -e "$NAMESPACE isn't a namespace. Try other as below again:\n"
      kubectl get namespaces
      exit 1
    else
      kubectl get pods -n $NAMESPACE | tail --lines=+2 | awk '{print NR " " $1}'
      echo -en "\nPlease select pod in $NAMESPACE: "
      read select
      kubectl exec -it -n $NAMESPACE $(kubectl get pods -n $NAMESPACE | tail --lines=+2 | awk '{print $1}' | awk NR==$select) -- /bin/bash;
    fi
  elif [ $1 -z ]; then
    echo ""
    kubectl get pods | tail --lines=+2 | awk '{print NR " " $1}'
    echo -en "\nPlease select pod in default: "
    read select
    kubectl exec -it $(kubectl get pods | tail --lines=+2 | awk '{print $1}' | awk NR==$select) -- /bin/bash;
  else
    echo ""
    kubectl get namespace
    echo -e "\nusage: kceq or kceq <namespace>\n"
  fi
}
EOF



사용방법은 동일합니다.

1. 이건 설정
[root@m-k8s ~]# bash <(curl -s https://raw.githubusercontent.com/sysnet4admin/IaC/master/manifests/k8s_rc.sh)
[root@m-k8s ~]# su -

2. kceq
[root@m-k8s ~]# kceq
1 echo-nginx-5cc884d64c-8qc8d
2 echo-nginx-5cc884d64c-9bvxx
3 echo-nginx-5cc884d64c-blg6j
Please select pod in default: 2
root@echo-nginx-5cc884d64c-9bvxx:/#


3. kceq 틀린 네임스페이스 

[root@m-k8s ~]# kceq hoonjo
hoonjo isn't a namespace. Try other as below again:
NAME              STATUS   AGE
default           Active   24h
istio-system      Active   22h
kafka             Active   18h
kube-node-lease   Active   24h
kube-public       Active   24h
kube-system       Active   24h

4. kceq kafka
logout[root@m-k8s ~]# kceq kafka
1 kafka-0
2 pzoo-0
Please select pod in kafka: 1
root@kafka-0:/opt/kafka#

그럼 또 빠잉요

===

흔한 일이 아닌데 업데이트를 또 하네요..
pod 안에 컨테이너가 여러개 있을 경우가 있다고 오리님이 소스를 주셔서 수정합니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
NAMESPACE=$1
exi_chk=($(kubectl get namespaces | tail --lines=+2 | awk '{print $1}'))
  #check to exist namespace but it is not perfect due to /^word$/ is not work
  if [[ ! "${exi_chk[@]}" =~ "$NAMESPACE" ]]; then
    echo -e "$NAMESPACE isn't a namespace. Try other as below again:\n"
    kubectl get namespaces
    echo -e "\nusage: kceq or kceq <namespace> [-c]\n"
    exit 1
  elif [ $# -eq 1 ]; then
    kubectl get pods -n $NAMESPACE | tail --lines=+2 | awk '{print NR " " $1}'
    echo -en "\nPlease select pod in $NAMESPACE: "
    read select
    kubectl exec -it -n $NAMESPACE $(kubectl get pods -n $NAMESPACE | tail --lines=+2 | awk '{print $1}' | awk NR==$select) -- /bin/bash;
  elif [ $# -eq 2 ]; then
    if [ ! $2 == "-c" ]; then
      echo -e "only -c option is available"
      exit 1
    fi
    echo -e ""
    kubectl get pods -n $NAMESPACE | tail --lines=+2 | awk '{print NR " " $1}'
    echo -en "\nPlease select pod in $NAMESPACE: "
    read select
    POD_SELECT=$select
    POD=$(kubectl get pods -n $NAMESPACE | tail --lines=+2 | awk '{print $1}' | awk NR==$select)
    echo -e ""
    kubectl describe pod -n $NAMESPACE $POD | grep -B 1 "Container ID" | egrep -v "Container|--" | awk -F":" '{print NR $1}'
    echo -en "\nPlease select container in: "
    read select
    CONTAINER=$(kubectl describe pod -n $NAMESPACE $POD | grep -B 1 "Container ID" | egrep -v "Container|--" | awk -F":" '{print $1}' | awk NR==$select)
    kubectl exec -it -n $NAMESPACE $(kubectl get pods -n $NAMESPACE | tail --lines=+2 | awk '{print $1}' | awk NR==$POD_SELECT) -c $CONTAINER -- /bin/bash;
  #default pod run
  elif [ $1 -z ]; then
    echo ""
    kubectl get pods | tail --lines=+2 | awk '{print NR " " $1}'
    echo -en "\nPlease select pod in default: "
    read select
    kubectl exec -it $(kubectl get pods | tail --lines=+2 | awk '{print $1}' | awk NR==$select) -- /bin/bash;
  else
    echo ""
    kubectl get namespace
    echo -e "\nusage: kceq or kceq <namespace> [-c]\n"
  fi

이제 이거만 봐도 아마 다들 아시겠죠? 고로 설명은 생략 :)

[root@m-k8s ~]# kceq

1 echo-nginx-5cc884d64c-djk4k
2 echo-nginx-5cc884d64c-l8hsj
3 echo-nginx-5cc884d64c-nljnn
4 elder-yak-mariadb-master-0
5 elder-yak-mariadb-slave-0
6 wiggly-fox-redis-master-0
7 wiggly-fox-redis-slave-0

Please select pod in default: 2
root@echo-nginx-5cc884d64c-l8hsj:/# exit
exit

[root@m-k8s ~]# kceq 1
1 isn't a namespace. Try other as below again:

NAME              STATUS   AGE
default           Active   108m
istio-system      Active   15m
kafka             Active   40m
kube-node-lease   Active   108m
kube-public       Active   108m
kube-system       Active   108m

usage: kceq or kceq <namespace> [-c]

logout

[root@m-k8s ~]# kceq
-bash: kceq: command not found
[root@m-k8s ~]# su -
[root@m-k8s ~]# kceq istio-system
1 grafana-6b65874977-4vs4r
2 istio-citadel-86d9c5dc-877pq
3 istio-egressgateway-7cb7fdff55-qf7t5
4 istio-galley-6ff4cbc457-bnc55
5 istio-ingressgateway-68884574c5-gjkbx
6 istio-pilot-5646cc96d4-66j9x
7 istio-policy-7c76fb7fdb-xnw7j
8 istio-sidecar-injector-5464f6dff-wcfhb
9 istio-telemetry-557d4bf784-sspmw
10 istio-tracing-c66d67cd9-qts9r
11 kiali-8559969566-5zsxg
12 prometheus-66c5887c86-qc6c2

Please select pod in istio-system: 5
root@istio-ingressgateway-68884574c5-gjkbx:/# exit
exit

[root@m-k8s ~]# kceq kafka -c

1 kafka-0
2 pzoo-0

Please select pod in: 2

1  init-config
2  zookeeper

Please select container in: 2
root@pzoo-0:/opt/kafka#


[Continue reading...]
 
Copyright © . 시스템/네트워크 자동화 전문가 블로그 - Posts · Comments
Theme Template by BTDesigner · Powered by Blogger