다음은 쿠버네티스 스터디 자료를 참고해 정리한 내용입니다.
환경변수를 관리하자 Configmap,Secret
<1> init 초기 실행 컨테이너 (선택)
<2> ConfigMap 환경변수 관리
<3> Secret - 정보 저장용
<4> ConfigMap 개념 잡기 동영상
<5> 정리
<1> init 초기 실행 컨테이너 (선택)
master node의 api 서버 접속
ssh -i ~/.ssh/id_rsa ubuntu@api.k8s.serverchk.com
kubectl delete pod --all
1
init은 pod내에서 어플리케이션이 시작하지 전에 초기에 실행되는 컨테이너이다.
init 컨테이너 실행 > 어플리케이션 컨테이너 시작 순이 되겠다.
아래 내용은
init초기 실행 컨데이너가 실패하는 환경이다.
컨테이너가 실패하는거를 조치하여 동작하도록 하는 설정이다.
2
init.yaml
cat << EOF > init.yaml
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: busybox:1.28
command: ['sh', '-c', 'echo The app is running! && sleep 3600']
initContainers:
- name: init-myservice
image: busybox:1.28
command: ['sh', '-c', "until nslookup myservice.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for myservice; sleep 2; done"]
- name: init-mydb
image: busybox:1.28
command: ['sh', '-c', "until nslookup mydb.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for mydb; sleep 2; done"]
EOF
3
kubectl apply -f init.yaml && kubectl get pod -w
pod/myapp-pod created
NAME READY STATUS RESTARTS AGE
myapp-pod 0/1 Init:0/2 0 0s
myapp-pod 0/1 Init:0/2 0 0s
myapp-pod 0/1 Init:1/2 0 1s
myapp-pod 0/1 PodInitializing 0 2s
myapp-pod 1/1 Running 0 3s
// 컨테이너중 1개가 제대로 안된다고 STATUS에 나옴
4
kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
myapp-pod 1/1 Running 0 112s 100.98.158.143 ip-172-20-38-144.ap-northeast-1.compute.internal <none> <none>
// pod는 1개로 뜸
4
kubectl describe pod myapp-pod | grep 'Init Containers' -A 34
myapp-pod 는 성공
// aws pod 성공, 컨터이너는 termicated , Completed로 표시됨
// 원래는 myapp-container는 init을 성공하지 못해 wait 상태이어여 한다?
5
명령어가 왜 실패 하는지 확인
컨테이너 netshoot로 로그인
kubectl run tmp-shell --rm -i --tty --image nicolaka/netshoot -- /bin/bash
bash-5.1#
6
cat /var/run/secrets/kubernetes.io/serviceaccount/namespace ; echo default
bash-5.1# cat /var/run/secrets/kubernetes.io/serviceaccount/namespace ; echo default
defaultdefault
7
bash-5.1#
nslookup www.google.com
성공
bash-5.1# nslookup www.google.com
Server: 100.64.0.10
Address: 100.64.0.10#53
Non-authoritative answer:
Name: www.google.com
Address: 172.217.31.164
Name: www.google.com
Address: 2404:6800:4004:80d::2004
8
cmd에 설정된 도메인은 실패
> myservice.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local
Server: 100.64.0.10
Address: 100.64.0.10#53
** server can't find myservice.\$\(cat: NXDOMAIN
9
exit
// 서비스 생성후 확인
10
myservice 생성
cat << EOF | kubectl apply -f - && watch -d "kubectl describe pod myapp-pod | grep Events -A 12"
apiVersion: v1
kind: Service
metadata:
name: myservice
spec:
ports:
- protocol: TCP
port: 80
targetPort: 9376
EOF
11
kubectl get pod
ubuntu@ip-172-20-41-255:~$ kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 1/1 Running 0 5m41s
12
kubectl describe pod myapp-pod
11
mydb 생성
cat << EOF | kubectl apply -f - && watch -d "kubectl describe pod myapp-pod | grep Events -A 12"
apiVersion: v1
kind: Service
metadata:
name: mydb
spec:
ports:
- protocol: TCP
port: 80
targetPort: 9377
EOF
service/mydb created
12
kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 1/1 Running 0 7m32s
13
kubectl delete pod --all
<2> ConfigMap 환경변수 사용
설명 동영상
문서
https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/
clear
ConfigMap 환경변수 사용하면 ,컨테이너 이미지는 1개만 사용하고 , 각각의 환경 변수를 가져와서 서비스 하면 된다.
아니면, 개발환경 컨테이너 이미지, 상용환경 컨테이너 이미지를 각각 관리해야 한다.
1
kubectl create configmap log-level --from-literal LOG_LEVEL=DEBUG
configmap/log-level created
// log lovel이 debug인 configmap 생성한다.
2
확인
kubectl get configmap
NAME DATA AGE
kube-root-ca.crt 1 46h
log-level 1 8s
// 이름이 log-level
3
kubectl describe configmaps log-level
Name: log-level
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
LOG_LEVEL:
----
DEBUG
Events: <none>
4
pod를 만들어 config map에서 정보를 가져와 사용하도록 해보자
cat << EOF > configmap-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: configmap-pod
spec:
containers:
- name: configmap-pod
image: busybox
args: ['tail', '-f', '/dev/null']
envFrom:
- configMapRef:
name: log-level
EOF
5
Pod 생성
kubectl apply -f configmap-pod.yaml
pod/configmap-pod created
5
pod 확인
exec로 pod에 명령어 실행한다. env에 어떤값이 있는가 확인 ?
kubectl exec configmap-pod -- env
// LOG_LEVEL=DEBUG 값을 불러온 것이다.
// 평문으로 저장 된것이다.
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=configmap-pod
LOG_LEVEL=DEBUG
KUBERNETES_PORT_443_TCP=tcp://100.64.0.1:443
KUBERNETES_PORT_443_TCP_PORT=443
MYSERVICE_PORT_80_TCP_PORT=80
MYSERVICE_PORT_80_TCP_ADDR=100.65.11.126
MYDB_SERVICE_HOST=100.65.166.169
MYDB_SERVICE_PORT=80
MYDB_PORT=tcp://100.65.166.169:80
KUBERNETES_PORT=tcp://100.64.0.1:443
MYDB_PORT_80_TCP_PROTO=tcp
MYSERVICE_SERVICE_HOST=100.65.11.126
MYSERVICE_SERVICE_PORT=80
KUBERNETES_SERVICE_PORT_HTTPS=443
MYSERVICE_PORT=tcp://100.65.11.126:80
MYDB_PORT_80_TCP_PORT=80
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT_443_TCP_ADDR=100.64.0.1
MYSERVICE_PORT_80_TCP=tcp://100.65.11.126:80
MYSERVICE_PORT_80_TCP_PROTO=tcp
MYDB_PORT_80_TCP=tcp://100.65.166.169:80
MYDB_PORT_80_TCP_ADDR=100.65.166.169
KUBERNETES_SERVICE_HOST=100.64.0.1
HOME=/root
5
삭제
kubectl delete pod --all && kubectl delete configmaps log-level
<3> secret - 정보 저장용
configmap 과 유사하게 불러오는 것임.
base 64로 암호화 됨
하지만 취약한 암호화로 사용은 힘들다.
1
kubectl get secrets
NAME TYPE DATA AGE
default-token-fpltq kubernetes.io/service-account-token 3 46h
2
password=1q2w3e4r 저장
kubectl create secret generic my-password --from-literal password=1q2w3e4r
secret/my-password created
3
확인
kubectl get secrets
NAME TYPE DATA AGE
default-token-fpltq kubernetes.io/service-account-token 3 46h
my-password Opaque 1 58s
4
kubectl describe secrets my-password
Name: my-password
Namespace: default
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
password: 8 bytes
5
kubectl get secrets my-password -o jsonpath='{.data.password}' ; echo
MXEydzNlNHI=
6
// base 64로 암호화 한거라 약한 암호화 이다.
echo MXEydzNlNHI= |base64 -d ;echo
1q2w3e4r
7
시크릿이 안전하지 않다~
kubectl get secrets my-password -o jsonpath='{.data.password}' | base64 -d ; echo
1q2w3e4r
<4> Configmap 개념 잡기 동영상
1
변수값이 조금 틀리다고 이미지를 여러개 관리할 필요가 없다.
변경될수 있는 변수는 Configmap 사용하여 이미지는 하나로 관리가 가능하다.
2
개념 잡기 동영상
<5> 정리
1
init 초기 실행 컨테이너가 있다!
init은 pod내에서 어플리케이션이 시작하지 전에 초기에 실행되는 컨테이너이다.
init 컨테이너 실행 > 어플리케이션 컨테이너 시작 순이 되겠다.
2
configmap 환경변수 관리를 관리가 가능하다.
이미지를 여러개 만들 필요 없이 1개 이미지 쓰고 나머지는 configmap 환경변수로 관리하자
3
secret - 정보 저장용 으로 사용 한다.
보안은 되지 않는다.
사용하지 말자.
다음 과정
https://brunch.co.kr/@topasvga/1674
감사합니다.