Run The Bridge

k8s 3일차 본문

Cloud/k8s

k8s 3일차

anfrhrl5555 2021. 8. 10. 13:11
728x90

0. 네임스페이스(Namespace) : 리소스를 논리적으로 구분하는 장벽

Master가 동작중에 멈추면 안되기 때문에 k8s에서는 3대로 동작한다.(k8s에는 이중화 개념이 없다)

 

Master를 다중화하기 위해 k8s를 다중화한다.

 

worker node의 권장 수 = 1000개가 넘는다.

 

  • 용도에 따라 컨테이너와 관련된 리소스들을 구분 지어 관리할 수 있는 논리적인 오브젝트
  • 네임스페이스가 다르면 포드, 레플리카셋, 서비스 등의 오브젝트 이름이 같아도 된다
  • 모니터링, 개발, 테스트, 운영, 여러 조직이 하나의 클러스터를 나누어 사용할 경우에 구분 등

default 네임스페이스

  1. 네임스페이스를 명시하지 않으면 기본적으로 사용되는 네임스페이스

 

kube-system 네임스페이스

  • 쿠버네티스 클러스터 구성에 필수적인 컴포넌트와 설정값이 존재

 

리눅스 자체의 네임스페이스와는 의미가 다르므로 헷갈리지 말아야한다.

 

kubectl get pod -n kube-system  # -n 옵션으로 namespace 정의가능

 

kubectl get namespaces  # namespace 확인

 

namespace 생성하기

kubectl create namespace production  # 운영용

kubectl create namespace developer  # 개발용

 

내가 지정한 namespace에 deployment를 생성해보자

# vi hostname-deploy-svc-ns.yaml, yaml 과 service가 '---'으로 하나로 선언했다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hostname-deployment-ns
  namespace: production
spec:
  replicas: 1
  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

 

실행시켜준다.

kubectl delete -f mysql-pod-service.yaml

 

호출하기 위해선 namespace를 명시해줘야 한다.

kgp -n production  # namespace를 가지는 pod 확인

kgs -n production  # namespace를 가지는 service 확인

 

만약 -A 명령으로 너무 많이 출력되었을 때 해결법

 kgs -A | grep production  # grep 명령으로 namespace를 명시해준다.

 

서비스의 DNS 이름에 대한 FQDN(Fully Qualified Domain Name)은 일반적으로 다음과 같은 형식

                  <서비스 이름>.<네임스페이스 이름>.svc.cluster.local

kubectl run -i --tty --rm debug --image=alicek106/ubuntu:curl --restart=Never -- bash  # namespace는 default로 기본 namespace가 잡혀있다

 

kubectl run -i --tty --rm debug --image=alicek106/ubuntu:curl --restart=Never -n production -- bash  # namespace를 production으로 재정의

 

namespace 삭제
- namespace에 종속된 모든 object가 함께 삭제된다.

kubectl get all -n production  # namespace 모든 검색

kubectl delete ns production  # production이 namespace이다.

 

namespace에 종속된 object 확인

kubectl api-resources --namespaced=true

 

namespace에 종속되지 않은 object 확인

kubectl api-resources --namespaced=false

1. Configmap 사용하기

- 도커 스웜 모드의 config, secret와 유사

- deployment YAML 파일을 수정하지 않고 application 설정값을 별도로 분리해 관리할 수 있다.

 

(실습)

kubectl create configmap log-level-configmap --from-literal LOG_LEVEL=DEBUG

kubectl create configmap start-k8s --from-literal k8s=kubernetes --from-literal container=docker

kubectl get configmap || k get cm

 

 k get cm log-level-configmap -o yaml  # configmap을 yaml형태로 정보 보는법

 

 

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

  1. envFrom: 컨피그맵에 존재하는 모든 키-값 쌍을 가져온다
  2. valueFrom: 컨피그맵에 존재하는 키-값 쌍 중에서 원하는 데이터만 가져온다

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

 

(실습) envFrom

# vi all-env-from-configmap.yaml

apiVersion: v1
kind: Pod
metadata:
  name: container-env-example
spec:
  containers:
    - name: my-container
      image: busybox  # 명령어들을 하나로 모아둔 box
      args: ['tail', '-f', '/dev/null']  # command를 대신한다.
      envFrom:
      - configMapRef:
          name: log-level-configmap  # 키-값 쌍이 1개가 존재하는 configmap
      - configMapRef:
          name: start-k8s  # 키-값 쌍이 2개가 존재하는 configmap
kubectl apply -f all-env-from-configmap.yaml
k exec container-env-example -- printenv

 

(실습) valueFrom

# vi selective-env-from-configmap.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
          valueFrom:
            configMapKeyRef:
              name: log-level-configmap
              key: LOG_LEVEL
        - name: ENV_KEYNAME_2
          valueFrom:
            configMapKeyRef:
              name: start-k82
              key: k8s
      envFrom:
      - configMapRef:
          name: log-level-configmap
      - configMapRef:
          name: start-k8s
k apply -f selective-env-from-configmap.yaml
# container-selective-env-example은 위에 정의된 metadata 아래의 name을 적어주어야 한다.
kubectl exec container-env-example -- env | grep ENV

키 값이 바뀐것을 볼 수 있다. 

 

 

컨피그맵의 내용을 파일로 포드 내부에 마운트하기(Projection 투사)

  • 컨피그맵의 키-값 쌍의 모든 값을 컨테이너 내부에 '파일'-파일내용'으로 생성
  • 컨피그맵의 키-값 쌍의 일부 값을 컨테이너 내부에 '파일'-파일내용'으로 생성

 

컨피그맵의 키-값 쌍의 모든 값을 컨테이너 내부에 '파일'-파일내용'으로 생성

# vi volume-mount-configmap.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  # 같은 yaml 안에서 정의한 volume에 있는 내용을 갖다쓴다.
        mountPath: /etc/config

  volumes:
  - name: configmap-volume  # configmap volume 이름
    configMap:
      name: start-k8s  # key-value 쌍을 가져올 configmap 이름
kubectl apply -f volume-mount-configmap.yaml  # 실행
kubectl exec -it configmap-volume-pod -- sh  # 접속

 

 

컨피그맵의 키-값 쌍의 일부를 컨테이너 내부에 '파일'-파일내용'으로 생성

# vi selective-volume-configmap.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
kubectl apply -f selective-volume-configmap.yaml  # 실행

 

 

(실습)파일로부터 컨피그맵 생성하기 - index.html, nginx.conf

echo Hello, world! >> index.html

kubectl create configmap index-file --from-file index.html

kubectl describe cm index-file

cp /root/practice/start-docker-kubernetes/chapter2/nginx/nginx.conf .

kubectl create configmap nginx-file --from-file nginx.conf

kubectl describe cm nginx-file

configmap으로 변환되면 들여쓰기 규칙이 적용되어 있다.

 

(실습)파일로부터 configmap 생성하기 2 - 여러 환경 변수가 정의된 파일을 한 번에 전달(안했음)

cp /root/practice/start-docker-kubernetes/chapter7/multiple-keyvalue.env .

kubectl create configmap from-envfile --from-env-file multiple-keyvalue.env

kubectl describe cm from-envfile

 

(실습)YAML 파일로 configmap 정의하기

kubectl create cm nginx-conf --from-file nginx.conf --dry-run=client -o yaml > nginx.conf.yaml  # --dry-run는 실제로 실행하지않고, 실행하는 것 처럼 보인다.

nginx.conf.yaml 파일을 수정 후

kubectl apply -f nginx-conf.yaml  # 실행시켜준다.

 

Configmap 삭제방법

kubectl delete configmaps [이름]

2. Secret

kubectl create secret generic my-password --from-literal password=password  # secret 생성하기
kubectl get secret  # 확인

 echo cGFzc3dvcmQ= | base64 -d  # 다음 명령을 통해 decording 가능하다.....

 

command line 이외에 다른 방법으로 생성해보자.

echo mypassword > pw1 && echo yourpassword > pw2

k create secret generic our-password --from-file pw1 --from-file pw2  # secret 생성

 

이제 Pod를 올려서 확인해본다.

# vi env-from-secret.yaml

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
k apply -f env-from-secret.yaml  # 실행
 kubectl exec secret-env-example -- env  # metadata에 정의한 이름으로 env를 가져올 수 있다.

 

이번엔 our-password를 가져와본다.

# vi selective-env-from-secret.yaml

apiVersion: v1
kind: Pod
metadata:
  name: selective-env-from-secret
spec:
  containers:
  - name: my-container
    image: busybox
    args: ['tail', '-f', '/dev/null']
    env:
    - name: YOUR_PASSWORD
      valueFrom:
         secretKeyRef:
           name: our-password
           key: pw2

 

(실습) Secret 사용하기

# vi volume-mount-secret.yaml

apiVersion: v1
kind: Pod
metadata:
  name: volume-mount-secret.yaml
spec:
  containers:
    - name: my-container
      image: busybox
      args: ['tail', '-f', '/dev/null']
      volumeMounts:
      - name: secret-volume
        mountPath: /etc/secret

  volumes:
  - name: secret-volume
    secret:
      secretName: our-password

파일이 존재한다.

value를 선택해서 가져오기

# vi selective-mount-secret.yaml

apiVersion: v1
kind: Pod
metadata:
  name: selective-mount-secret.yaml
spec:
  containers:
    - name: my-container
      image: busybox
      args: ['tail', '-f', '/dev/null']
      volumeMounts:
      - name: secret-volume
        mountPath: /etc/config

  volumes:
  - name: secret-volume
    secret:
      secretName: our-password
      items:
      - key: pw1
        path: password1

 

이미지 레지스트리 접근을 위한 docker-registry 타입으로 시크릿 사용하기

  • 도커 허브에 공개되어 있는 이미지라면 별도의 레지스트리 인증은 필요 없다
  • 하지만 사설 레지스트리나 구글, AWS 등의 퍼블릭 클라우드의 레지스트리를 사용한다면 로그인과 같은 인증 절차가 필요
  • 생성한 시크릿은 디플로이먼트 또는 포드 등에서 이미지를 받아올 때 사용(imagePullSecrets 설정)

 

인증서

  • TLS 키를 저장할 수 있는 TLS 타입의 시크릿 사용하기
  • 파드 내부의 애플리케이션이 TLS인증서를 사용할 때 사용
  • 애플리케이션에서 사용하는 인증서는 일반적으로 외부에서 제공되는 경우가 많다
  • 예를 들어, 한국전자인증, 한국인터넷진흥원 등에서 받은 인증서를 쿠버네티스에 시크릿으로 저장한 뒤 필요한 애플리케이션에서 사용할 수 있게 한다

 

 

 

728x90
Comments