https://kubernetes.io/ko/docs/concepts/configuration/configmap/
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/
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 |