NIFI-인증

Cloud 2019. 3. 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 '김용환'
,



kubernetes에서 cronjob 실행하기 


$ vi cronjob.yaml

apiVersion: batch/v1beta1

kind: CronJob

metadata:

  name: sleepy

spec:

  schedule: "*/1 * * * *"

  jobTemplate:

    spec:

      template:

        spec:

          containers:

          - name: resting

            image: busybox

            command: ["/bin/sleep"]

            args: ["3"]

          restartPolicy: Never





$ kubectl create -f cronjob.yaml

cronjob.batch/sleepy created





시간에 따라 확인한다.



$ kubectl get cronjobs.batch

NAME      SCHEDULE      SUSPEND   ACTIVE    LAST SCHEDULE   AGE

sleepy    */1 * * * *   False     0         <none>          40s



$ kubectl get cronjobs.batch

NAME      SCHEDULE      SUSPEND   ACTIVE    LAST SCHEDULE   AGE

sleepy    */1 * * * *   False     0         1m              2m




Posted by '김용환'
,


kubernetes에서 proxy 사용 예시이다



$ kubectl proxy --api-prefix=/ &

[1] 9789

Starting to serve on 127.0.0.1:8001





$ curl http://127.0.0.1:8001/api/

{

  "kind": "APIVersions",

  "versions": [

    "v1"

  ],

  "serverAddressByClientCIDRs": [

    {

      "clientCIDR": "0.0.0.0/0",

      "serverAddress": "10.1.1.1:6443"

    }

  ]






$ curl http://127.0.0.1:8001/api/v1/namespaces
{
"kind": "NamespaceList",
"apiVersion": "v1",
"metadata": {
"selfLink": "/api/v1/namespaces",
"resourceVersion": "445783"
"items": [
    {
      "metadata": {
        "name": "default",
        "selfLink": "/api/v1/namespaces/default",
        "uid": "8fd4381e-f15f-11e8-8c69-fa163ec1822d",
        "resourceVersion": "5",
        "creationTimestamp": ",.,,,17Z"
      },
      "spec": {
        "finalizers": [
          "kubernetes"
        ]
      },
      "status": {
        "phase": "Active"
      }
    },
    {
      "metadata": {
        "name": "ingres

...

Posted by '김용환'
,



다음은 kubernetes의 discovery 예시이다.




$ kubectl config view

apiVersion: v1

clusters:

- cluster:

certificate-authority-data: REDACTED

server: https://10.1.1.1:6443

name: kubernetes

...




$ kubectl get secrets

NAME                  TYPE                                  DATA      AGE

default-token-686zl   kubernetes.io/service-account-token   3         3d





$ kubectl describe secret default-token-686zl

Name:         default-token-686zl

Namespace:    default

Labels:       <none>

Annotations:  kubernetes.io/service-account.name=default

              kubernetes.io/service-account.uid=a0b98cf2-f15f-11e8-9449-fa163e9f27a5


Type:  kubernetes.io/service-account-token


Data

====

ca.crt:     1090 bytes

namespace:  7 bytes

token:      xxxx



$ export token=$(kubectl describe secret default-token-686zl |grep ^token |cut -f7 -d ' ')



$ echo $token

xxx



$ curl https://10.1.1.1:6443/apis --header "Authorization: Bearer $token" -k

{

"kind": "APIVersions",

"versions": [

"v1"

],

"serverAddressByClientCIDRs": [

{

"clientCIDR": "0.0.0.0/0",

"serverAddress": "10.1.1.1:6443"

}

]

}

...



이전 결과와 동일하다. 



$ curl https://10.128.0.3:6443/api/v1 --header "Authorization: Bearer $token" -k


{

"kind": "APIVersions",

"versions": [

"v1"

],

"serverAddressByClientCIDRs": [

{

"clientCIDR": "0.0.0.0/0",

"serverAddress": "10.1.1.1:6443"

}

]

}

...




Posted by '김용환'
,



namespace에 자원 제한(reousrce limit) 예시



 low-usage-limit name space를 생성한다.


$ kubectl create namespace low-usage-limit

namespace/low-usage-limit created



$ kubectl get namespace

NAME              STATUS    AGE

default           Active    1h

ingress-nginx     Active    1h

kube-public       Active    1h

kube-system       Active    1h

low-usage-limit   Active    19s



자원 제한 정보를 설정한다.



$ vi low-resource-range.yaml


apiVersion: v1

kind: LimitRange

metadata:

  name: low-resource-range

spec:

  limits:

  - default:

      cpu: 1

      memory: 500Mi

    defaultRequest:

      cpu: 0.5

      memory: 100Mi

    type: Container





아래와 같이 진행하면 실행되지 않는다.


$ kubectl create -f low-resource-range.yaml --namespace=low-usage-limit



$ kubectl get LimitRange --all-namespaces

NAMESPACE         NAME                 AGE

low-usage-limit   low-resource-range   1m



$ kubectl get LimitRange




namespace이름을 넣어주고 새로운 deployment를 생성한다. 


$ kubectl create deployment limited-hog --image vish/stress -n low-usage-limit




참고로 삭제할 때도 namespace를 줘야 삭제된다. 


$ kubectl delete deployment limited-hog -n low-usage-limit

deployment.extensions "limited-hog" deleted


$ kubectl delete deployment limited-hog

Error from server (NotFound): deployments.extensions "limited-hog" not found




제대로 실행되었다면. low-usage-limit   limited-hog  의 available이 0이 되지 않을 것이다. (마침 1이다.)


$ kubectl get deployments --all-namespaces

NAMESPACE         NAME                   DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE

default           hog                    1         1         1            1           15m

kube-system       kube-dns               2         2         2            2           1h

kube-system       kubedns-autoscaler     1         1         1            1           1h

kube-system       kubernetes-dashboard   1         1         1            1           1h

kube-system       tiller-deploy          1         1         1            1           1h

low-usage-limit   limited-hog            1         1         1            1           37s



제대로 실행 중이다. 만약 deployment가 잘못 되었다면 STATUS에 잘 표시될 것이다 .


$ kubectl -n low-usage-limit get pods

NAME                           READY     STATUS    RESTARTS   AGE

limited-hog-757fc847ff-mvm7s   1/1       Running   0          1m




pod 설정을 yaml로 보면 제대로 되어 있다. 


$ kubectl -n low-usage-limit get pod limited-hog-757fc847ff-mvm7s -o yaml





 resources:

      limits:

        cpu: "1"

        memory: 500Mi

      requests:

        cpu: 500m

        memory: 100Mi




deployment를 수정해 namespace를 적용한다.


$ kubectl get deployment hog --export -o yaml > new-hog.yaml



namespace: low-usage-limit를 추가하고 deploy한다.


$ vi new-hog.yaml


  labels:

    app: hog

  name: hog

  namespace: low-usage-limit



$ kubectl create -f new-hog.yaml



$ get deployments --all-namespaces

NAMESPACE         NAME                   DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE

default           hog                    1         1         1            1           23m

kube-system       kube-dns               2         2         2            2           1h

kube-system       kubedns-autoscaler     1         1         1            1           1h

kube-system       kubernetes-dashboard   1         1         1            1           1h

kube-system       tiller-deploy          1         1         1            1           1h

low-usage-limit   hog                    1         1         1            1           40s

low-usage-limit   limited-hog            1         1         1            1           8m




work장비에 들어가서 보면 메모리를 12% 쓰고 있다. 


  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND

30062 root      20   0  960872 954176   3120 S 101.0 11.7  26:52.72 stress

 1126 root      20   0  960104 954108   3180 S 100.3 11.7   3:53.52 stress





정리한다.


$ kubectl -n low-usage-limit delete deployment hog

deployment.extensions "hog" deleted

$ kubectl delete deployment hog

deployment.extensions "hog" deleted







출처 : linux foundation kubernetes 예시







Posted by '김용환'
,