Taints / Tolerations

Taints는 노드가 파드 set을 제외하는 기능

노드에 Taints 추가하기

kubectl tain nodes node1 key1=value1:NoSchedule

node1 노드에 테인트를 배치한다. 테인트에는 키 key1, 값 value1 및 이펙트(effect) NoSchedule 이 있다. NoScheudle은 일치한는 톨러레이션이 없으면 파드를 node1 에 스케줄할 수 없다는 의미이다.

노드에 추가한 Taints 제거하기

kubectl taint nodes node1 key1=value1:Noschedule-
PodSpec에서 파드에 대한 톨러레이션을 지정한다. spec.tolerations

spec: 
    tolerations:
    - key: "key1"
      operator: "Equal"
      value: "value1"
      effect: "NoSchedule"

or

spec: 
    tolerations:
    - key: "key1"
      operator: "Exists"
      effect: "NoSchedule"

operator의 기본값은 Equal 이다.

  • Exists 인 경우 value를 지정하지 않아야 한다. key가 테인트와 일치한 경우 할당
  • Equal 인 경우 value가 값이 같아야 한다.

테인츠/ 톨러레이션은 여러개 값을 가질 수 있다. 이를 effect를 통해 관리할 수 있다.

NoSchedule인 경우 노드에서 이미 파드가 실행 중인 경우 노드에 새로운 테인츠가 생겼다 하여도 파드는 축출되지 않는다. NoExecute를 가지는 경우 파드는 즉시 추출된다. tolerationSeconds 필드를 지정해서 바인딩된 최소시간을 지정하여 그 뒤에 추출

spec:
    tolerations:
    - key: "key1"
      operator: "Equal"
      value: "value1"
      effect: "NoExecute"
      tolerationSeconds: 3600

 

반응형

affinity

노드의 레이블을 기반으로 파드를 스케줄할 수 있는 노드를 제한하는 기능으로 파드가 노드를 선택해서 들어가는것

affinity를 사용해 노드 스케줄링하기

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: <nam 보통 type이라는 말을 많이 씀 nodetype disktype 등..>
            operator: In
            values:
            - <value 값,, request, gateway, ssd 등...>            
  containers:
  - name: hi

노드에 Role 추가하기.

Before label:

eneral@master-node:~$ kubectl get nodes
NAME          STATUS   ROLES    AGE   VERSION
master-node   Ready    master   23m   v1.18.2
slave-node    Ready    <none>   19m   v1.18.2

kubectl label nodes <your_node> kubernetes.io/role=<your_label>

[kubernetes.io/role](http://kubernetes.io/role) 없이 바로 label이름을 가면 롤은 none 그대로

In my case slave-node e.g.

kubectl label nodes slave-node kubernetes.io/role=worker

After label:

general@master-node:~$ kubectl label nodes slave-node kubernetes.io/role=worker
node/slave-node labeled
general@master-node:~$ kubectl get nodes
NAME          STATUS   ROLES    AGE   VERSION
master-node   Ready    master   24m   v1.18.2
slave-node    Ready    worker   21m   v1.18.2

You can also change the label. Just put --overwrite

kubectl label --overwrite nodes kubernetes.io/role=e.g.kubectl label --overwrite nodes slave-node kubernetes.io/role=worker1

After overwriting the label:

general@master-node:~$ kubectl label --overwrite nodes slave-node kubernetes.io/role=worker1
node/slave-node labeled
general@master-node:~$ kubectl get nodes
NAME          STATUS   ROLES     AGE   VERSION
master-node   Ready    master    36m   v1.18.2
slave-node    Ready    worker1   32m   v1.18.2

Add Role

kubectl label node <node name> node-role.kubernetes.io/<role name>=<key - (any name)>

Remove Role

kubectl label node <node name> node-role.kubernetes.io/<role name>-

 

반응형

file 로 컨피그맵 생성

테스트 파일 생성

vagrant@ubuntu:~$ echo Hello, world! >> index.html
vagrant@ubuntu:~$ cat index.html
Hello, world!

테스트 파일(index.html)을 이용해서 index-file이라는 컨피그맵을 생성

vagrant@ubuntu:~$ kubectl create configmap index-file --from-file ./index.html
configmap/index-file created

생성한 index-file 컨피그맵을 확인

vagrant@ubuntu:~$ kubectl describe configmap index-file
Name:         index-file
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
index.html:        ⇐ 파일명이 키(key)로 사용
----
Hello, world!        ⇐ 파일의 내용이 값(value)로 사용

Events:  <none>

키이름을 직접 지정해서 컨피그맵을 생성

vagrant@ubuntu:~$ kubectl create configmap index-file-customkey --from-file myindex=./index.html
configmap/index-file-customkey created

vagrant@ubuntu:~$ kubectl describe configmap index-file-customkey
Name:         index-file-customkey
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
myindex:        ⇐ 컨피그맵 생성 시 지정한 키 이름을 사용
----
Hello, world!

Events:  <none>

여러 개의 키-값 형태의 내용으로 구성된 설정 파일을 한번에 컨피그맵으로 설정

키-값 형태의 내용으로 구성된 설정 파일을 생성

vagrant@ubuntu:~$ vi ./multiple-keyvalue.env

mykey1=myvalue1
mykey2=myvalue2
mykey3=myvalue3

설정 파일에 정의된 키-값 형태를 컨피그맵의 키-값 항목으로 일괄 전환

kubectl create configmap abcd --from-literal mykey1=myvalue1 --from-literal mykey2=myvalue2 --from-literal mykey3=myvalue3 … 형식의 명령어를 파일을 이용해서 구현

vagrant@ubuntu:~$ kubectl create configmap from-envfile --from-env-file ./multiple-keyvalue.env
configmap/from-envfile created
vagrant@ubuntu:~$ kubectl describe configmap from-envfile
Name:         from-envfile
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
mykey1:
----
myvalue1
mykey2:
----
myvalue2
mykey3:
----
myvalue3
Events:  <none>

YAML 파일로 컨피그맵을 정의

컨피그맵을 실제로 생성하지 않고 YAML 형식으로 출력

vagrant@ubuntu:~$ kubectl create configmap my-configmap --from-literal mykey=myvalue --dry-run -o yaml
W0922 04:34:05.917495  358937 helpers.go:553] --dry-run is deprecated and can be replaced with --dry-run=client.
apiVersion: v1
data:
  mykey: myvalue
kind: ConfigMap
metadata:
  creationTimestamp: null
  name: my-configmap

vagrant@ubuntu:~$ kubectl get configmap
NAME                   DATA   AGE        ⇒ my-configmap 이름의 컨피그맵이 존재하지 않음
from-envfile           3      4m2s           → --dry-run 옵션: 실제로 컨피그맵 오브젝트를 생성하지는 않음
index-file             1      16m               
index-file-customkey   1      12m
log-level-configmap    1      3h21m
start-k8s              2      3h20m

YAML 형식의 출력을 YAML 파일로 저장

vagrant@ubuntu:~$ kubectl create configmap my-configmap --from-literal mykey=myvalue --dry-run -o yaml > my-config.yml
W0922 04:42:17.088587  360577 helpers.go:553] --dry-run is deprecated and can be replaced with --dry-run=client.
vagrant@ubuntu:~$

vagrant@ubuntu:~$ cat my-config.yml
apiVersion: v1
data:
  mykey: myvalue
kind: ConfigMap
metadata:
  creationTimestamp: null
  name: my-configmap

YAML 파일로 컨피그맵을 생성

vagrant@ubuntu:~$ kubectl apply -f my-config.yml
configmap/my-configmap created

vagrant@ubuntu:~$ kubectl get configmaps
NAME                   DATA   AGE
from-envfile           3      13m
index-file             1      26m
index-file-customkey   1      22m
log-level-configmap    1      3h31m
my-configmap           1      9s
start-k8s              2      3h30m

 

반응형

컨피그맵의 값을 pod 내부 파일로 마운트해서 사용

컨피그맵의 모든 키-쌍 데이터를 파드에 마운트

vagrant@ubuntu:~$ vi volume-mount-configmap.yml
`YAML
apiVersion: v1
kind: Pod
metadata:
  name: configmap-volume-pod
spec:
  containers:
    - name: my-container
      image: busybox
      args: ["tail", "-f", "/dev/null"]
      volumeMounts:                  ⇐ #1에서 정의한 볼륨을 컨테이너 내부의 어떤 디렉터리에 마운트할 것인지 명시
        - name: configmap-volume     ⇐ 컨피그맵 볼룸의 이름 (#1에서 정의한 이름)
          mountPath: /etc/config     ⇐ 컨피그맵 파일이 위치할 경로

  volumes:                           ⇐ #1 사용할 볼륨 목록 
    - name: configmap-volume           
      configMap:
        name: start-k8s              ⇐ 컨피그맵 이름
`

pod 생성

vagrant@ubuntu:~$ kubectl apply -f volume-mount-configmap.yml
pod/configmap-volume-pod created

pod 생성 확인

vagrant@ubuntu:~$ kubectl get pods
NAME                                   READY   STATUS    RESTARTS   AGE
configmap-volume-pod                   1/1     Running   0          27s
container-env-example                  1/1     Running   0          53m
hostname-deployment-7dfd748479-7zdv7   1/1     Running   0          20h
hostname-deployment-7dfd748479-pp8x4   1/1     Running   0          20h
hostname-deployment-7dfd748479-rtgzv   1/1     Running   0          20h

pod의 /etc/config 확인

vagrant@ubuntu:~$ kubectl exec configmap-volume-pod -- ls -l /etc/config
total 0
lrwxrwxrwx    1 root     root            16 Sep 22 02:33 container -> ..data/container
lrwxrwxrwx    1 root     root            10 Sep 22 02:33 k8s -> ..data/k8s

file 내용 확인

vagrant@ubuntu:~$ kubectl exec configmap-volume-pod -- cat /etc/config/container
docker                        

vagrant@ubuntu:~$ kubectl exec configmap-volume-pod -- cat /etc/config/k8s
kubernetes

컨피그맵에 키는 파일명으로, 값은 파일의 내용으로 변경되어서 전달

원하는 키-값 쌍의 데이터만 선택해서 pod로 마운트

vagrant@ubuntu:~$ cp volume-mount-configmap.yml selective-volume-configmap.yml
vagrant@ubuntu:~$ vi selective-volume-configmap.yml

`YAML
apiVersion: v1
kind: Pod
metadata:
  name: configmap-volume-pod
spec:
  containers:
    - name: my-container
      image: busybox
      args: ["tail", "-f", "/dev/null"]
      volumeMounts:
        - name: configmap-volume
          mountPath: /etc/config
  volumes:
    - name: configmap-volume
      configMap:
        name: start-k8s
        items:
        - key: k8s                ⇐ 가져올 키를 명시
          path: k8s_fullname      ⇐ 키 값을 저장할 파일명
`

앞에서 생성한 pod를 삭제

vagrant@ubuntu:~$ kubectl delete -f volume-mount-configmap.yml
pod "configmap-volume-pod" deleted

파드 생성 및 확인

vagrant@ubuntu:~$ kubectl apply -f selective-volume-configmap.yml
pod/configmap-volume-pod created
vagrant@ubuntu:~$ kubectl get pods
NAME                                   READY   STATUS    RESTARTS   AGE
configmap-volume-pod                   1/1     Running   0          8s
container-env-example                  1/1     Running   0          63m
hostname-deployment-7dfd748479-7zdv7   1/1     Running   0          20h
hostname-deployment-7dfd748479-pp8x4   1/1     Running   0          20h
hostname-deployment-7dfd748479-rtgzv   1/1     Running   0          20h

파드(컨테이너) 내부의 파일 생성 여부 확인

vagrant@ubuntu:~$ kubectl exec configmap-volume-pod -- ls /etc/config
k8s_fullname

vagrant@ubuntu:~$ kubectl exec configmap-volume-pod -- cat /etc/config/k8s_fullname
kubernetes

 

반응형

시크릿(Secret)

민감한 정보를 저장하기 위한 용도, 네임스페이스에 종속

시크릿 생성 방법

password=1q2w3e4r 라는 키-값을 저장하는 my-password 이름의 시크릿을 생성

vagrant@ubuntu:~$ kubectl create secret generic my-password --from-literal password=1q2w3e4r
secret/my-password created

vagrant@ubuntu:~$ kubectl get secrets
NAME                  TYPE                                  DATA   AGE
default-token-sh8hv   kubernetes.io/service-account-token   3      3d22h ⇐ ServiceAccount에 의해 네임스페이스별로 자동으로 생성된 시크릿
my-password           Opaque                                1      9s

파일로부터 시크릿을 생성

vagrant@ubuntu:~$ echo mypassword > pw1 && echo yourpassword > pw2
vagrant@ubuntu:~$ cat pw1
mypassword
vagrant@ubuntu:~$ cat pw2
yourpassword

vagrant@ubuntu:~$ kubectl create secret generic out-password --from-file pw1 --from-file pw2
secret/out-password created
vagrant@ubuntu:~$ kubectl get secrets
NAME                  TYPE                                  DATA   AGE
default-token-sh8hv   kubernetes.io/service-account-token   3      3d22h
my-password           Opaque                                1      5m29s
out-password          Opaque                                2      51s

시크릿 내용을 확인

vagrant@ubuntu:~$ kubectl describe secret my-password
Name:         my-password
Namespace:    default
Labels:       <none>
Annotations:  <none>

Type:  Opaque

Data
====
password:  8 bytes        ⇐ password 키에 해당하는 값을 확인할 수 없음 (값의 크기(길이)만 출력)

vagrant@ubuntu:~$ kubectl get secret my-password -o yaml
apiVersion: v1
data:
  password: MXEydzNlNHI=    ⇐ BASE64로 인코딩
kind: Secret
metadata:
  creationTimestamp: "2020-09-22T04:49:44Z"
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:data:
        .: {}
        f:password: {}
      f:type: {}
    manager: kubectl-create
    operation: Update
    time: "2020-09-22T04:49:44Z"
  name: my-password
  namespace: default
  resourceVersion: "81153"
  selfLink: /api/v1/namespaces/default/secrets/my-password
  uid: e597d8d2-479e-464f-934d-5d2ae7f232c8
type: Opaque

vagrant@ubuntu:~$ echo MXEydzNlNHI= | base64 -d
1q2w3e4r

시크릿에 저장된 키-값 쌍을 파드로 가져오기

시크릿에 저장된 모든 키-값 쌍을 파드의 환경변수로 가져오기

vagrant@ubuntu:~$ vi env-from-secret.yml
apiVersion: v1
kind: Pod
metadata:
  name: secret-env-example
spec:
  containers:
    - name: my-container
      image: busybox
      args: ["tail", "-f", "/dev/null"]
      envFrom:
        - secretRef:
            name: my-password

vagrant@ubuntu:~$ kubectl apply -f env-from-secret.yml
pod/secret-env-example created

vagrant@ubuntu:~$ kubectl exec secret-env-example -- env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=secret-env-example
password=1q2w3e4r
HOSTNAME_SVC_NODEPORT_SERVICE_PORT_WEB_PORT=8080
HOSTNAME_SVC_NODEPORT_PORT=tcp://10.111.29.91:8080
HOSTNAME_SVC_NODEPORT_PORT_8080_TCP_PORT=8080
KUBERNETES_SERVICE_PORT=443
HOSTNAME_SVC_NODEPORT_SERVICE_PORT=8080
KUBERNETES_PORT_443_TCP_PROTO=tcp
HOSTNAME_SVC_NODEPORT_PORT_8080_TCP_ADDR=10.111.29.91
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
HOSTNAME_SVC_NODEPORT_SERVICE_HOST=10.111.29.91
HOSTNAME_SVC_NODEPORT_PORT_8080_TCP=tcp://10.111.29.91:8080
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_SERVICE_HOST=10.96.0.1
HOSTNAME_SVC_NODEPORT_PORT_8080_TCP_PROTO=tcp
HOME=/root

 

반응형

컨피그맵의 값을 환경변수로 사용

1. pod 정의 - YAML 파일 생성

vagrant@ubuntu:~$ vi all-env-from-configmap.yml

`YAML
apiVersion: v1
kind: Pod
metadata:
  name: container-env-example
spec:
  containers:
    - name: my-container
      image: busybox
      args: ['tail', '-f', '/dev/null']
      envFrom:
        - configMapRef:
            name: log-level-configmap
        - configMapRef:
            name: start-k8s
`
# envFrom : 컨피그맵에 정의된 모든 키-값 쌍을 가져와서 환경변수로 설정
# configMapRef - name : my-container의 환경변수로 설정 위에선 두개 생성

pod 생성

vagrant@ubuntu:~$ kubectl apply -f all-env-from-configmap.yml
pod/container-env-example created

vagrant@ubuntu:~$ kubectl get pods
NAME                                   READY   STATUS    RESTARTS   AGE
container-env-example                  1/1     Running   0          30s
hostname-deployment-7dfd748479-7zdv7   1/1     Running   0          19h
hostname-deployment-7dfd748479-pp8x4   1/1     Running   0          19h
hostname-deployment-7dfd748479-rtgzv   1/1     Running   0          19h

컨테이너의 환경변수를 확인

k8s=kubernetes , LOG_LEVEL=DEBUG , container=docker 을 확인할 수 있다.

vagrant@ubuntu:~$ kubectl exec container-env-example -- env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=container-env-example
k8s=kubernetes
LOG_LEVEL=DEBUG
container=docker
KUBERNETES_SERVICE_HOST=10.96.0.1
KUBERNETES_PORT_443_TCP_PROTO=tcp
HOSTNAME_SVC_NODEPORT_PORT=tcp://10.111.29.91:8080
KUBERNETES_SERVICE_PORT=443
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
HOSTNAME_SVC_NODEPORT_SERVICE_HOST=10.111.29.91
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
HOSTNAME_SVC_NODEPORT_SERVICE_PORT_WEB_PORT=8080
HOSTNAME_SVC_NODEPORT_PORT_8080_TCP_PROTO=tcp
HOSTNAME_SVC_NODEPORT_PORT_8080_TCP_PORT=8080
HOSTNAME_SVC_NODEPORT_PORT_8080_TCP_ADDR=10.111.29.91
KUBERNETES_PORT_443_TCP_PORT=443
HOSTNAME_SVC_NODEPORT_SERVICE_PORT=8080
HOSTNAME_SVC_NODEPORT_PORT_8080_TCP=tcp://10.111.29.91:8080
HOME=/root

컨피그맵에 존재하는 키-값 쌍 중에서 원하는 데이터만 환경변수로 설정

vagrant@ubuntu:~$ cp all-env-from-configmap.yml selective-env-from-configmap.yml
vagrant@ubuntu:~$ vi selective-env-from-configmap.yml

`YAML
apiVersion: v1
kind: Pod
metadata:
  name: container-env-example
spec:
  containers:
    - name: my-container
      image: busybox
      args: ['tail', '-f', '/dev/null']
      env:
        - name: ENV_KEYNAME_1               ⇐ 새롭게 설정될 환경변수 이름 -------------+ ENV_KEYNAME_1=LOG_LEVEL값
          valueFrom:                                                                    | 
            configMapKeyRef:                                                               | 
              name: log-level-configmap     ⇐ 참조할 컨피그맵 이름                     |
              key: LOG_LEVEL                ⇐ 참조할 컨피그맵에서 가져올 데이터의 키 --+
        - name: ENV_KEYNAME_2
          valueFrom:
            configMapKeyRef:
              name: start-k8s
              key: k8s
`

pod 중복시 삭제

vagrant@ubuntu:~$ kubectl delete -f all-env-from-configmap.yml
pod "container-env-example" deleted

pod 생성

vagrant@ubuntu:~$ kubectl apply -f selective-env-from-configmap.yml
pod/container-env-example created

pod 생성 확인

vagrant@ubuntu:~$ kubectl get pods
NAME                                   READY   STATUS    RESTARTS   AGE
container-env-example                  1/1     Running   0          28s
hostname-deployment-7dfd748479-7zdv7   1/1     Running   0          19h
hostname-deployment-7dfd748479-pp8x4   1/1     Running   0          19h
hostname-deployment-7dfd748479-rtgzv   1/1     Running   0          19h

컨테이너 내부의 환경변수를 확인

ENV_KEYNAME_1=DEBUG 와 ENV_KEYNAME_2=kubernetes 를 확인 할 수 있다.

vagrant@ubuntu:~$ kubectl exec container-env-example -- env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=container-env-example
ENV_KEYNAME_1=DEBUG
ENV_KEYNAME_2=kubernetes
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP_PROTO=tcp
HOSTNAME_SVC_NODEPORT_SERVICE_PORT=8080
HOSTNAME_SVC_NODEPORT_SERVICE_PORT_WEB_PORT=8080
HOSTNAME_SVC_NODEPORT_PORT_8080_TCP=tcp://10.111.29.91:8080
HOSTNAME_SVC_NODEPORT_PORT_8080_TCP_PORT=8080
KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_SERVICE_HOST=10.96.0.1
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
HOSTNAME_SVC_NODEPORT_SERVICE_HOST=10.111.29.91
HOSTNAME_SVC_NODEPORT_PORT=tcp://10.111.29.91:8080
HOSTNAME_SVC_NODEPORT_PORT_8080_TCP_PROTO=tcp
HOSTNAME_SVC_NODEPORT_PORT_8080_TCP_ADDR=10.111.29.91
KUBERNETES_SERVICE_PORT_HTTPS=443
HOME=/root

 

반응형

컨피그맵(Configmap)

설정값을 pod로 전달하는 방법

컨피그맵

일반적인 설정 정보(값)을 저장할 수 있는 쿠버네티스 오브젝트로 네임스페이스 별 존재한다.

컨피그맵 설정

vagrant@ubuntu:~$ kubectl create configmap log-level-configmap --from-literal LOG_LEVEL=DEBUG
configmap/log-level-configmap created

vagrant@ubuntu:~$ kubectl create configmap start-k8s --from-literal k8s=kubernetes --from-literal container=docker
configmap/start-k8s created

컨피그맵 확인

vagrant@ubuntu:~$ kubectl get configmap
NAME                  DATA   AGE
log-level-configmap   1      3m41s
start-k8s             2      2m27s

vagrant@ubuntu:~$ kubectl describe configmap log-level-configmap
Name:         log-level-configmap
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
LOG_LEVEL:
----
DEBUG
Events:  <none>

컨피그맵을 YAML 로 출력

vagrant@ubuntu:~$ kubectl get configmap log-level-configmap -o yaml
apiVersion: v1
data:
  LOG_LEVEL: DEBUG
kind: ConfigMap
metadata:
  creationTimestamp: "2020-09-22T01:13:06Z"
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:data:
        .: {}
        f:LOG_LEVEL: {}
    manager: kubectl-create
    operation: Update
    time: "2020-09-22T01:13:06Z"
  name: log-level-configmap
  namespace: default
  resourceVersion: "68473"
  selfLink: /api/v1/namespaces/default/configmaps/log-level-configmap
  uid: 6ddcde79-4ff9-4403-87ac-00335744bb7a

 

반응형

네임스페이스(namespace)

리소스(pod, replicaset, deployment, service, node, …)를 논리적으로 구분하는 기준

YAML 파일의 메타데이터 아래 namespace 속성으로 지정

네임스페이스 조회

vagrant@ubuntu:~/kub01$ kubectl get namespaces
NAME              STATUS   AGE
default           Active   3d1h
kube-node-lease   Active   3d1h
kube-public       Active   3d1h
kube-system       Active   3d1h

기본적으로 kube-* 네임스페이스를 가진다.

default : 쿠버네티스를 설치하면 자동으로 사용하도록 설정되는 네임스페이스

특정 네임스페이스에 생성된 pod 확인

vagrant@ubuntu:~/kub01$ kubectl get pods --namespace default
NAME                                   READY   STATUS    RESTARTS   AGE
hostname-deployment-7dfd748479-7zdv7   1/1     Running   0          106m
hostname-deployment-7dfd748479-pp8x4   1/1     Running   0          106m
hostname-deployment-7dfd748479-rtgzv   1/1     Running   0          106m

vagrant@ubuntu:~/kub01$ kubectl get pods --namespace kube-system
NAME                               READY   STATUS    RESTARTS   AGE
coredns-f9fd979d6-lsnmk            1/1     Running   2          3d1h
etcd-minikube                      1/1     Running   1          3d1h
kube-apiserver-minikube            1/1     Running   1          3d1h
kube-controller-manager-minikube   1/1     Running   2          3d1h
kube-proxy-sbghs                   1/1     Running   2          3d1h
kube-scheduler-minikube            1/1     Running   2          3d1h
storage-provisioner                1/1     Running   4          3d1h

특정 네임스페이스에 생성된 service 확인

vagrant@ubuntu:~/kub01$ kubectl get service --namespace kube-system
NAME       TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
kube-dns   ClusterIP   10.96.0.10   <none>        53/UDP,53/TCP,9153/TCP   3d1h

네임스페이스 사용

  1. YAML 파일 생성
vagrant@ubuntu:~/kub01$ vi production-namespace.yml
`YAML
apiVersion: v1
kind: Namespace
metadata:
  name: production
`
  1. 다른방법. 명령어로 생성
kubectl create namespace mynamespace

1.1 네임스페이스 조회

vagrant@ubuntu:~/kub01$ kubectl get namespaces
NAME              STATUS   AGE
default           Active   3d1h
kube-node-lease   Active   3d1h
kube-public       Active   3d1h
kube-system       Active   3d1h
mynamespace       Active   8s
production        Active   2m4s

특정 네임스페이스에 리소스를 생성하는 방법

vagrant@ubuntu:~/kub01$ cp deployment-hostname.yml hostname-deploy-svc-ns.yml
vagrant@ubuntu:~/kub01$ vi hostname-deploy-svc-ns.yml

`YAML
apiVersion: apps/v1
kind: Deployment
metadata:
  name: hostname-deployment-ns
  namespace: production
spec:
  replicas: 3
  selector:
    matchLabels:
      app: webserver
  template:
    metadata:
      name: my-webserver
      labels:
        app: webserver
    spec:
      containers:
      - name: my-webserver
        image: alicek106/rr-test:echo-hostname
        ports:
        - containerPort: 80

---
apiVersion: v1
kind: Service
metadata:
  name: hostname-svc-clusterip-ns
  namespace: production
spec:
  ports:
    - name: web-port
      port: 8080
      targetPort: 80
  selector:
    app: webserver
  type: ClusterIP
`
vagrant@ubuntu:~/kub01$ kubectl apply -f hostname-deploy-svc-ns.yml
deployment.apps/hostname-deployment-ns created
service/hostname-svc-clusterip-ns created

vagrant@ubuntu:~/kub01$ kubectl get pods,services --namespace production
NAME                                          READY   STATUS    RESTARTS   AGE
pod/hostname-deployment-ns-7dfd748479-4mg2b   1/1     Running   0          50s
pod/hostname-deployment-ns-7dfd748479-jgzg6   1/1     Running   0          50s
pod/hostname-deployment-ns-7dfd748479-rg8lw   1/1     Running   0          50s

NAME                                TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)    AGE
service/hostname-svc-clusterip-ns   ClusterIP   10.97.13.64   <none>        8080/TCP   50s

서로 다른 네임스페이스에서 이름으로 접근하려면 .NAMESPACE.svc 붙여 명시해줘야한다.

vagrant@ubuntu:~/kub01$ kubectl run -it --rm debug --image=alicek106/ubuntu:curl --restart=Never -- bash
If you don't see a command prompt, try pressing enter.
root@debug:/#
root@debug:/# curl http://hostname-svc-clusterip-ns:8080
curl: (6) Could not resolve host: hostname-svc-clusterip-ns
# default 네임스페이스에서는 접근 못함

root@debug:/# curl http://hostname-svc-clusterip-ns.production.svc:8080
<!DOCTYPE html>
<meta charset="utf-8" />
# <이하생략>

네임스페이스 삭제

vagrant@ubuntu:~/kub01$ kubectl delete namespace production
namespace "production" deleted

네임스페이스에 속하는 오브젝트 종류

vagrant@ubuntu:~/kub01$ kubectl api-resources --namespaced=true

네임스페이스에 속하지 않는 오브젝트 종류

vagrant@ubuntu:~/kub01$ kubectl api-resources --namespaced=false

 

반응형

+ Recent posts