nginx를 ingress로 사용하는 kubernetes에서 body 크기(jpeg같은 image)때문에 ingress를 통과 못할 수 있다. 413 에러가 나타나는 이유이다.

이럴 때는 client_max_body_size를 설정한다.


ingress.kubernetes.io/proxy-body-size: 10m



참고

https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/nginx-configuration/annotations.md#custom-max-body-size

Posted by 김용환 '김용환'

쿠버네티스 노드의 docker 버전 정보를 알고 싶다면 어떻게 해야 할까?



kubectl describe nodes를 호출하면 다양한 정보가 나오는데. 이때 docker를 grep하면  버전 정보를 확인할 수 있다. 


$ kubectl describe nodes | grep docker

 Container Runtime Version:  docker://17.3.2

 Container Runtime Version:  docker://17.3.2

 Container Runtime Version:  docker://17.3.2

 Container Runtime Version:  docker://17.3.2

 Container Runtime Version:  docker://17.3.2

 Container Runtime Version:  docker://18.6.3

Posted by 김용환 '김용환'


# docker 새 버전 업그레이드하기


kubectl 실행할 수 있는 장비


$ kubectl drain 장비명

$ kubectl get nodes


장비명에서 docker를 업그레이드한다.


$ sudo systemctl stop docker

$ sudo apt remove docker-ce -y

$ apt list docker-ce -a


$ sudo apt install docker-ce="18.06.2~ce~3-0~ubuntu" -y

$ sudo systemctl restart kubelet




kubectl 실행하는 장비에서 장비를 스케쥴링하도록 한다. 

$ kubectl uncordon 장비명


Posted by 김용환 '김용환'


도커 환경을 정리하는 커맨드는 다음과 같다.


docker container prune은 중지된 모든 컨테이너를 삭제한다.

docker image prune은 이름 없는 모든 이미지를 삭제한다.

docker network prune은 사용되지 않는 도커 네트워크를 모두 삭제한다.


docker volume prune은 도커 컨테이너에서 사용하지 않는 모든 도커 볼륨을 삭제한다.

docker system prune -a는 중지된 모든 컨테이너, 사용되지 않은 모든 네트워크, 하나 이상의 컨테이너에서 사용되지 않는 모든 이미지를 삭제한다. 따라서 남아 있는 컨테이너 또는 이미지는 현재 실행 중인 컨테이너에서 필요한 것이다.


Posted by 김용환 '김용환'

kubernetes에 sidecar proxy라는 개념이 있다.

pod에는 일반적으로 하나의 container(image)를 띄우는데

함께 부가적으로 도커 이미지를 띄우는 경우를 말한다.



일반적으로 사용하는 tomcat app 앞에 apache나 nginx를 두고 싶을 때,

kibana 앞에 ldap 인증 부분(go, python)을 두는 앱서버를 두고 싶을때 사용되는 개념이다.


https://medium.com/@lukas.eichler/securing-pods-with-sidecar-proxies-d84f8d34be3e

Posted by 김용환 '김용환'

보통 kubernetes pod을 재시작하려면 deployment 파일을 이용하는 경우가 많지만..


설정 파일 없이 확인하는 방법도 있다.



먼저 도커 이미지 이름을 얻는다.


아래 커맨ㄷ는 실제 컨테이너의 데타 데이터 이름과 컨테이너의 도커 이미지 이름을 얻는 커맨드이다.


$ kubectl get pods --all-namespaces -o=jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{range .spec.containers[*]}{.image}{", "}{end}{end}' |\ sort


ingress-nginx-controller-szb9s: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.19.0,

ingress-nginx-controller-ttq2h: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.19.0,

jenkins-8498fcb9b5-6n2vm: jenkins/jenkins:lts,

kube-apiserver-dkosv3-jenkins-master-1: gcr.io/google-containers/hyperkube-amd64:v1.11.5,

kube-apiserver-dkosv3-jenkins-master-2: gcr.io/google-containers/hyperkube-amd64:v1.11.5,

kube-apiserver-dkosv3-jenkins-master-3: gcr.io/google-containers/hyperkube-amd64:v1.11.5,




원하는 것은 바로 아래 커맨드이다. 메타데이터와 컨테이너 이름을 얻을 수 있다.


$ kubectl get pods -o=custom-columns=NAME:.metadata.name,CONTAINERS:.spec.containers[*].name

NAME                                                           CONTAINERS

jenkins-job-8f24e681-5b83-4f87-b713-69c86deedb22-25gsh-vjh9r   jnlp

jenkins-job-914tx-fthwt                                        jnlp

jenkins-8498fcb9b5-6n2vm                                    jenkins

my-release-mysql-65d89bd9c4-txkvn                              my-release-mysql








재시작을 진행한다. reboot 커맨드가 도커 안에 포함되어 있으면 다음처럼 실행한다.


$ kubectl exec jenkins-8498fcb9b5-6n2vm -c jenkins reboot



만약 다음 에러가 난다면, kill 커맨드를 사용해야 한다.


rpc error: code = 2 desc = oci runtime error: exec failed: container_linux.go:247: starting container process caused "exec: \"reboot\": executable file not found in $PATH"




kubectl exec jenkins-8498fcb9b5-6n2vm -c jenkins  -- /bin/sh -c "kill 1"



Posted by 김용환 '김용환'


pod의 ip를 알려면 다음과 같은 커맨드를 사용한다.


$ bkubectl get pods

pod의 이름을 얻는다.


$ kubectl get pod <포트-이름> --template={{.status.podIP}}

10.10.10.10

Posted by 김용환 '김용환'



쿠버네티스에서 

볼륨을 포함하는 statefulset이 종료되지 않으면,  (사실 deployment도 영향 줄 수 있도)

볼륨을 삭제(delete pvc) 커맨드를 실행하더라도 종료되지 않는다.



$ kubectl get pod -w

NAME       READY   STATUS    RESTARTS   AGE

consul-0   1/1     Running   0          28d

consul-1   1/1     Running   0          28d

consul-2   1/1     Running   0          28d

consul-3   1/1     Running   0          28d

consul-4   1/1     Running   0          28d



pv를 확인한다. 


$ kubectl get pv

NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                      STORAGECLASS   REASON   AGE

pvc-46e015f0-3041-11e9-a0e7-fa163ecffc2b   1Gi        RWO            Delete           Bound    default/datadir-consul-3   standard                26d

pvc-535563b9-3041-11e9-a0e7-fa163ecffc2b   1Gi        RWO            Delete           Bound    default/datadir-consul-4   standard                26d

pvc-b07a2c23-303d-11e9-a0e7-fa163ecffc2b   1Gi        RWO            Delete           Bound    default/datadir-consul-0   standard                26d

pvc-c32c35d9-303d-11e9-a0e7-fa163ecffc2b   1Gi        RWO            Delete           Bound    default/datadir-consul-1   standard                26d

pvc-d420797e-303d-11e9-a0e7-fa163ecffc2b   1Gi        RWO            Delete           Bound    default/datadir-consul-2   standard                26




$ kubectl get pvc

NAME               STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE

consul-0   Bound    pvc-b07a2c23-303d-11e9-a0e7-fa163ecffc2b   1Gi        RWO            standard       26d

consul-1   Bound    pvc-c32c35d9-303d-11e9-a0e7-fa163ecffc2b   1Gi        RWO            standard       26d

consul-2   Bound    pvc-d420797e-303d-11e9-a0e7-fa163ecffc2b   1Gi        RWO            standard       26d

consul-3   Bound    pvc-46e015f0-3041-11e9-a0e7-fa163ecffc2b   1Gi        RWO            standard       26d

consul-4   Bound    pvc-535563b9-3041-11e9-a0e7-fa163ecffc2b   1Gi        RWO            standard       26d




$ kubectl delete pvc consul-0 consul-1  consul-2  consul-3 consul-4

persistentvolumeclaim "consul-0" deleted

persistentvolumeclaim "consul-1" deleted

persistentvolumeclaim "consul-2" deleted

persistentvolumeclaim "consul-3" deleted

persistentvolumeclaim "consul-4" deleted




$ kubectl get pvc

NAME               STATUS        VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE

consul-0   Terminating   pvc-b07a2c23-303d-11e9-a0e7-fa163ecffc2b   1Gi        RWO            standard       28d

consul-1   Terminating   pvc-c32c35d9-303d-11e9-a0e7-fa163ecffc2b   1Gi        RWO            standard       28d

consul-2   Terminating   pvc-d420797e-303d-11e9-a0e7-fa163ecffc2b   1Gi        RWO            standard       28d

consul-3   Terminating   pvc-46e015f0-3041-11e9-a0e7-fa163ecffc2b   1Gi        RWO            standard       28d

consul-4   Terminating   pvc-535563b9-3041-11e9-a0e7-fa163ecffc2b   1Gi        RWO            standard       28d




Terminating 상태로 변경되었지만


volume이 지워지지 않는다. 계속 Terminating 상태이다.






statefulset을 삭제하자 마자 모두 삭제된다.



$ kubectl delete statefulsets consul

statefulset.apps "consul" deleted




$ kubectl get pod

No resources found.


$ kubectl get pvc

No resources found.


$  kubectl get pv

No resources found.


Posted by 김용환 '김용환'

NIFI-인증

Cloud 2019.03.14 17:25




nifi에 인증을 추가할 수 있다. 디폴트로 인증 방법을 제공하지 않는다.


3가지 인증 방식은 다음과 같고, 링크를 참고한다.



간단하게 파일,
Apache Ambari의 Ranger를 이용,

사용자 정의 플러그인



아래 자료 참고.

https://medium.com/@jayprakash.bilgaye/understanding-ssl-and-ldap-in-hdf-504844bea8b9




https://community.hortonworks.com/articles/60842/hdf-20-defining-nifi-policies-in-ranger.html



Posted by 김용환 '김용환'



Jenkins 에서 GitHub 저장소 소스를 읽어올 때. ssh 가 아닌  https로 접근하고 싶을 때. 

credentials를 사용할 수 있다.


(kubernetes 환경에서는 ssh보다는 https가 훨씬 적합한 것 같다)





 


아래 화면에서 Read 권한을 가진 토큰을 생성한다.


https://github.com/settings/tokens



그리고 credential 화면에서 username with password 를 선택하고..

username에는 깃허브 사용자 id,

password에는 사용자의 토큰 값을 저장한다.



그리고 jenkins job 내부에서 credential을 잘 사용하면 된다. 

Posted by 김용환 '김용환'