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 김용환 '김용환'



https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/#customresourcedefinitions


ThirdPartyResource 가 1.8부터 custom resource definition으로 대체되었다.


관련 예시이다.


 


$ vi crd.yaml

apiVersion: apiextensions.k8s.io/v1beta1

kind: CustomResourceDefinition

metadata:

  name: crontabs.training.lfs458.com

    # This name must match names below.

    # <plural>.<group> syntax

spec:

  scope: Cluster #Could also be Namespaced

  group: training.lfs458.com

  version: v1

  names:

    kind: CronTab #Typically CamelCased for resource manifest

    plural: crontabs #Shown in URL

    singular: crontab #Short name for CLI alias

    shortNames:

    - ct #CLI short name




$ kubectl create -f crd.yaml



$  kubectl get crd

NAME                           AGE

crontabs.training.lfs458.com   4m



$ kubectl describe crd crontab

Name:         crontabs.training.lfs458.com

Namespace:

Labels:       <none>

Annotations:  <none>

API Version:  apiextensions.k8s.io/v1beta1

Kind:         CustomResourceDefinition

Metadata:

  Creation Timestamp:  2018-12-18T05:49:45Z

  Generation:          1

  Resource Version:    3992526

  Self Link:           /apis/apiextensions.k8s.io/v1beta1/customresourcedefinitions/crontabs.training.lfs458.com

  UID:                 b92d0073-0288-11e9-9a46-fa163e964181

Spec:

  Group:  training.lfs458.com

  Names:

    Kind:       CronTab

    List Kind:  CronTabList

    Plural:     crontabs

    Short Names:

      ct

    Singular:  crontab

  Scope:       Cluster

  Version:     v1

Status:

  Accepted Names:

    Kind:       CronTab

    List Kind:  CronTabList

    Plural:     crontabs

    Short Names:

      ct

    Singular:  crontab

  Conditions:

    Last Transition Time:  2018-12-18T10:49:45Z

    Message:               no conflicts found

    Reason:                NoConflicts

    Status:                True

    Type:                  NamesAccepted

    Last Transition Time:  2018-12-18T10:49:45Z

    Message:               the initial names have been accepted

    Reason:                InitialNamesAccepted

    Status:                True

    Type:                  Established

Events:                    <none>


$ vi  new-crontab.yaml

apiVersion: "training.lfs458.com/v1"

  # This is from the group and version of new CRD

kind: CronTab

  # The kind from the new CRD

metadata:

  name: new-cron-object

spec:

  cronSpec: "*/5 * * * *"

  image: some-cron-image

    #Does not exist



$ kubectl create -f new-crontab.yaml



$ kubectl get CronTab

NAME              AGE

new-cron-object   4m


$ kubectl get ct

NAME              AGE

new-cron-object   4m


$ kubectl describe ct


Name:         new-cron-object

Namespace:

Labels:       <none>

Annotations:  <none>

API Version:  training.lfs458.com/v1

Kind:         CronTab

Metadata:

  Cluster Name:

  Creation Timestamp:  2018-12-18T10:52:21Z

  Resource Version:    3992891

  Self Link:           /apis/training.lfs458.com/v1/new-cron-object

  UID:                 16295359-0289-11e9-9a46-fa163e964181

Spec:

  Cron Spec:  */5 * * * *

  Image:      some-cron-image

Events:       <none>



$ kubectl delete -f crd.yaml

$ kubectl get CronTab
No resources found.

$ kubectl get ct

No resources found.


Posted by 김용환 '김용환'



<로그 파일 위치>



kubernetes의 마스터(master) 노드에서 로그 위치는 다음과 같다.


1. API : /var/log/kube-apiserver.log

2. 스케줄 : /var/log/kube-scheduler.log

3. 복제 관리 : /var/log/kube-controller-manager.log

4. 컨테이너 로그 : /var/log/containers/

5. pod : /var/log/pods/



워커(worker) 노드의 로그는 다음과 같다.


1. 노드에서 실행 중인 컨테이너 : /var/log/kubelet.log

2. 서비스 로드 밸런싱 : /var/log/kube-proxy.log





<pod bash 연결>

$ kubectl exec <POD-NAME> -c <CONTAINER-NAME> -- <COMMAND>
$ kubectl run -it --rm --restart=Never busybox --image=busybox /bin/bash





<pod 로그 보기>


$ kubectl get po --all-namespaces

...

kube-apiserver-k8s-master1

...

$ kubectl -n kube-system logs kube-apiserver-k8s-master1

..



이외 디버깅 방법


https://kubernetes.io/docs/tasks/debug-application-cluster/debug-service/


https://kubernetes.io/docs/tasks/debug-application-cluster/determine-reason-pod-failure/


Posted by 김용환 '김용환'




Label

- 개체의 메타 데이터를 설정 : Kubernetes 클러스터에서 개체를 그룹화/목록/작업 용

- Pod과 ReplicaSet 등의 Kubernetes 개체에 부여하는 키-값 쌍.



Annotation

- Label과 마찬가지로 키-값, 개체의 메타 데이터를 저장 : 자동화 툴 또는 클라이언트 라이브러리에서 사용하는 메타 데이터를 저장하는 키-값 스토어.객체에 대한 임의의 정보를 저장

- 식별 정보는 아니다. 따라서 히스토리, 스케줄 정책, 부가 정보 등등을 저장한다

Posted by 김용환 '김용환'



쿠버네티스에서 데몬셋에 대한 히스토리(history)를 확인할 수 있고, 롤백도 가능한다.




아래는 데몬셋 ds-one에 nginx 이미지를 1.7.9로 했다가 1.8.1-alpine으로 변경했고 이를 변경 전 버전으로 롤백하는 예시이다.



$ kubectl rollout history ds ds-one

daemonsets "ds-one"

REVISION CHANGE-CAUSE

1 <none>

2 <none>      



$ kubectl rollout history ds ds-one --revision=1

daemonsets "ds-one" with revision #1

Pod Template:

Labels: system=DaemonSetOne

Containers:

nginx:

Image: nginx:1.7.9

Port: 80/TCP

Environment: <none>

Volumes: <none>



$ kubectl rollout history ds ds-one --revision=2

....

Image: nginx:1.8.1-alpine



$ kubectl rollout undo ds ds-one --to-revision=1

daemonset.extensions/ds-one rolled back


Posted by 김용환 '김용환'