Kubernetes

23.9.6(수) 쿠버네티스 8일차

사실 나도 모름 2023. 9. 6. 17:46

https://kubernetes.io/ko/docs/concepts/configuration/configmap/

 

컨피그맵(ConfigMap)

컨피그맵은 키-값 쌍으로 기밀이 아닌 데이터를 저장하는 데 사용하는 API 오브젝트이다. 파드는 볼륨에서 환경 변수, 커맨드-라인 인수 또는 구성 파일로 컨피그맵을 사용할 수 있다. 컨피그맵

kubernetes.io

 

1. ConfigMap


환경변수와 같은 설정값을 파드에 전달하여 적용시키기 위한 오브젝트


1. 환경변수를 deployment안에 다 포함하여 넣는 방법

cat << EOF > t1_mysql_configmap.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      name: mysql
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mariadb:10.7
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: dkagh1.
        - name: MYSQL_DATABASE
          value: kubernetes
        ports:
        - name: mysql
          containerPort: 3306
          protocol: TCP
EOF

위 코드는 deployment를 생성하며 mysql 컨테이너를 하나 만들건데 그 컨테이너의 환경변수에

MYSQL_ROOT_PASSWORD=dkagh1.

MYSQL_DATABASE=kubernetes

의 값을 넣어서 생성한다.

 

위 yaml코드는 configmap을 사용하지 않고 pod 생성 시 한번에 적용하는 방법이다.

kubectl get pods

kubectl exec -it [파드명] -- /bin/bash


# 컨테이너 접속 후

echo $MYSQL_ROOT_PASSWORD
echo $MYSQL_DATABASE

mysql -u root -p # 패스워드로 dkagh1.을 입력

# mysql 접속 후
show databases;

정확하게 적용되었는지 확인한다.

 


2. configmap을 이용하여 파드에 설정을 적용하는 방법 (1)

cat << EOF > t2-mysql-configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-config
data:
  MYSQL_ROOT_PASSWORD: dkagh1.
  MYSQL_DATABASE: kubernetes
EOF

mysql환경변수를 정의한 yaml파일

cat << EOF > t2-mysql.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      name: mysql
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mariadb:10.7
        envFrom:
        - configMapRef:
            name: mysql-config
EOF

 

 


3. configmap을 이용하여 파드에 설정을 적용하는 방법 (2)

cat << EOF >t3-mysql-configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-config
data:
  MYSQL_ROOT_PASSWORD: dkagh1.
  MYSQL_DATABASE: kubernetes
EOF

 

cat << EOF > t3-mysql.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      name: mysql
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mariadb:10.7
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            configMapKeyRef:
              name: mysql-config
              key: MYSQL_ROOT_PASSWORD
        - name: MYSQL_DATABASE
          valueFrom:
            configMapKeyRef:
              name: mysql-config
              key: MYSQL_DATABASE
EOF

4. configmap을 통해 볼륨에 마운트하여 파드에 설정을 적용하는 방법

cat << EOF > t4-mysql-configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-config
data:
  MYSQL_ROOT_PASSWORD: dkagh1.
  MYSQL_DATABASE: kubernetes
EOF
cat << EOF > t4-mysql.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      name: mysql
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mariadb:10.7
        envFrom:
        - configMapRef:
            name: mysql-config
        volumeMounts:
        - mountPath: /tmp/config
          name: mysql-config
      volumes:
      - name: mysql-config
        configMap:
          name: mysql-config
EOF

etc. 커맨드라인으로 configmap을 생성하는 방법

k create configmap mysql-config \
--from-literal  MYSQL_ROOT_PASSWORD=dkagh1. \
--from-literal  MYSQL_DATABASE=kubernetes

 

 


2. Secret


configmap과 동작하는 것은 같지만 함부로 노출되면 안되는 설정에 대해서 암호화시켜서 저장하는 오브젝트


echo -n dkagh1. | base64 # dkagh1.을 base64 알고리즘으로 암호화시키는 명령
cat<<EOF>kd_mysql_secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: mysql-secret
type: Opaque
data:
  password: ZGthZ2gxLg==
  root_password: ZGthZ2gxLg==
EOF
cat<<EOF>kd_mysql_config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-config
data:
  host: "localhost"
  port: "3306"
  database: "kdigital"
  user: "kevin"
EOF
cat<<EOF>kd_mysql_pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-pv-volume
  labels:
    type: local
spec:
  storageClassName: nfs-client
  capacity:
    storage: 20Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/nfs_share"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pv-claim
spec:
  storageClassName: nfs-client
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi
EOF
cat<<EOF>kd_mysql.yaml
apiVersion: v1
kind: Service
metadata:
  name: mysql-service
spec:
  selector:
    app: mysql
  type: NodePort
  ports:
  - protocol: TCP
    port: 3306
    nodePort: 31002
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql-deployment
spec:
  selector:
    matchLabels:
      app: mysql
  strategy:
    type: Recreate
  replicas: 1
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:8.0.28
        ports:
        - containerPort: 3306
        env:
          - name: MYSQL_HOST
            valueFrom:
              configMapKeyRef:
                name: mysql-config
                key: host
          - name: MYSQL_PORT
            valueFrom:
              configMapKeyRef: 
                name: mysql-config
                key: port
          - name: MYSQL_DATABASE
            valueFrom:
              configMapKeyRef:
                name: mysql-config
                key: database
          - name: MYSQL_USER
            valueFrom:
              configMapKeyRef:
                name: mysql-config
                key: user
          - name: MYSQL_ROOT_PASSWORD
            valueFrom:
              secretKeyRef:
                name: mysql-secret
                key: root_password
          - name: MYSQL_PASSWORD
            valueFrom:
              secretKeyRef:
                name: mysql-secret
                key: password
        volumeMounts:
        - name: mysql-config
          mountPath: "/config"
          readOnly: true
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
      volumes:
        - name: mysql-config
          configMap:
            name: mysql-config
            items:
              - key: "host"
                path: "host"
              - key: "port"
                path: "port"
              - key: "database"
                path: "database" 
              - key: "user"
                path: "user"
        - name: mysql-persistent-storage
          persistentVolumeClaim:
            claimName: mysql-pv-claim
EOF
# 가끔씩 mysql에서 적용이 안되는 경우가 있다.
# 이럴 때는 아래 명령을 입력하면 mysql의 보안 및 패스워드 설정을 다시 할 수 있다.
mysql_secure_installation

 

 


https://kubernetes.io/ko/docs/concepts/scheduling-eviction/taint-and-toleration/

 

테인트(Taints)와 톨러레이션(Tolerations)

노드 어피니티는 노드 셋을 (기본 설정 또는 어려운 요구 사항으로) 끌어들이는 파드의 속성이다. 테인트 는 그 반대로, 노드가 파드 셋을 제외시킬 수 있다. 톨러레이션 은 파드에 적용된다. 톨

kubernetes.io

 

3. Taint와 Tolerations

노드 어피니티 노드 셋을 (기본 설정 또는 어려운 요구 사항으로) 끌어들이는 파드의 속성이다. 테인트 는 그 반대로, 노드가 파드 셋을 제외시킬 수 있다.


Taint : 뜻으로는 오염, 부패의 의미를 가지며 부적절한 노드에 스케줄링하지 못하게 하는 오브젝트

Tolerations : 톨러레이션은 스케줄을 허용하지만 보장하지는 않는다. 스케줄러는 그 기능의 일부로서 다른 매개변수를 고려한다.

 

테인트와 톨러레이션은 함께 작동하여 파드가 부적절한 노드에 스케줄되지 않게 한다. 하나 이상의 테인트가 노드에 적용되는데, 이것은 노드가 테인트를 용인하지 않는 파드를 수용해서는 안 된다는 것을 나타낸다.


 

# 노드에 테인트를 추가
kubectl taint nodes node1 key1=value1:NoSchedule

# 추가했던 테인트를 제거
kubectl taint nodes node1 key1=value1:NoSchedule-

node1 노드에 테인트을 배치한다.

테인트에는 키 key1, 값 value1 및 테인트 이펙트(effect) NoSchedule 이 있다.

이는 일치하는 톨러레이션이 없으면 파드를 node1 에 스케줄할 수 없음을 의미한다.

kubectl taint nodes node1.k8s.local taintskey=value1:NoSchedule

# kubectl taint nodes node1.k8s.local taintskey=value1:NoSchedule-
cat <<EOF > dep-taints.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-nginx
  labels:
    app: nginx
    environment: stage
spec:
  replicas: 6
  selector:
    matchLabels:
      app: pod-nginx
  template:
    metadata:
      labels:
        app: pod-nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
# 아래 두줄을 붙이면 노드1에 만들도록 강요할 수 있음
#     nodeSelector:
#       kubernetes.io/hostname: node1
EOF

nodeSelector를 사용한다 할지라도 taint가 더 우선적으로 적용되기 때문에 taint로 node1에 pod를 만들지 못하도록 설정해놓으면 위 코드로 pod가 생성되지 못하고 모두 pending 상태로 머물게 된다.

위 코드를 실행했을 때 taint로 인해 node1에서는 컨테이너가 생성되지 않음을 볼 수 있다.

 

cat <<EOF > dep-taints-toleration.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-nginx-2
  labels:
    app: nginx
    environment: stage
spec:
  replicas: 6
  selector:
    matchLabels:
      app: pod-nginx
  template:
    metadata:
      labels:
        app: pod-nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
      tolerations:
      - key: taintskey
        operator: Equal
        value: value1
        effect: NoSchedule
EOF

'Kubernetes' 카테고리의 다른 글

Kubernetes 기초 - 동작 원리  (0) 2023.12.06
23.9.7(목) 쿠버네티스 9일차  (0) 2023.09.07
23.9.4(월) 쿠버네티스 7일차  (0) 2023.09.04
23.9.1(금) 쿠버네티스 6일차  (0) 2023.09.01
23.8.25(금) 쿠버네티스 1일차  (0) 2023.09.01