1 - 컨테이너를 위한 커맨드와 인자 정의하기
본 페이지는 파드 안에서 컨테이너를 실행할 때 커맨드와 인자를 정의하는 방법에 대해 설명한다.
시작하기 전에
쿠버네티스 클러스터가 필요하고, kubectl 커맨드-라인 툴이 클러스터와 통신할 수 있도록 설정되어 있어야 한다. 이 튜토리얼은 컨트롤 플레인 호스트가 아닌 노드가 적어도 2개 포함된 클러스터에서 실행하는 것을 추천한다. 만약, 아직 클러스터를 가지고 있지 않다면, minikube를 사용해서 생성하거나 다음의 쿠버네티스 플레이그라운드 중 하나를 사용할 수 있다.
버전 확인을 위해서, 다음 커맨드를 실행kubectl version
.
파드를 생성할 때 커맨드와 인자를 정의하기
파드를 생성할 때, 파드 안에서 동작하는 컨테이너를 위한 커맨드와 인자를
정의할 수 있다. 커맨드를 정의하기 위해서는, 파드 안에서 실행되는 컨테이너에
command
필드를 포함시킨다. 커맨드에 대한 인자를 정의하기 위해서는, 구성
파일에 args
필드를 포함시킨다. 정의한 커맨드와 인자들은 파드가 생성되고
난 이후에는 변경될 수 없다.
구성 파일 안에서 정의하는 커맨드와 인자들은 컨테이너 이미지가 제공하는 기본 커맨드와 인자들보다 우선시 된다. 만약 인자들을 정의하고 커맨드를 정의하지 않는다면, 기본 커맨드가 새로운 인자와 함께 사용된다.
이 예제에서는 한 개의 컨테이너를 실행하는 파드를 생성한다. 파드를 위한 구성 파일에서 커맨드와 두 개의 인자를 정의한다.
apiVersion: v1
kind: Pod
metadata:
name: command-demo
labels:
purpose: demonstrate-command
spec:
containers:
- name: command-demo-container
image: debian
command: ["printenv"]
args: ["HOSTNAME", "KUBERNETES_PORT"]
restartPolicy: OnFailure
-
YAML 구성 파일을 활용해 파드를 생성한다.
kubectl apply -f https://k8s.io/examples/pods/commands.yaml
-
실행 중인 파드들의 목록을 조회한다.
kubectl get pods
출력은 command-demo라는 파드 안에서 실행된 컨테이너가 완료되었다고 표시할 것이다.
-
컨테이너 안에서 실행된 커맨드의 출력을 보기 위해, 파드의 로그를 확인한다.
kubectl logs command-demo
출력은 HOSTNAME과 KUBERNETES_PORT 환경 변수들의 값들을 표시할 것이다.
command-demo tcp://10.3.240.1:443
인자를 정의하기 위해 환경 변수를 사용하기
이전 예제에서는, 문자열을 제공하면서 직접 인자를 정의해보았다. 문자열을 직접 제공하는 것에 대한 대안으로, 환경 변수들을 사용하여 인자들을 정의할 수 있다.
env:
- name: MESSAGE
value: "hello world"
command: ["/bin/echo"]
args: ["$(MESSAGE)"]
이것은 컨피그 맵과 시크릿을 포함해, 환경 변수를 정의하는데 활용할 수 있는 모든 방법들을 활용해서 파드를 위한 인자를 정의할 수 있다는 것을 의미한다.
참고: 환경 변수는"$(VAR)"
와 같이 괄호 안에 나타난다. 이는 변수가command
나args
필드 안에서 전개되기 위해 필요한 것이다.
셸 안에서 커맨드 실행하기
일부 경우들에서는 커맨드를 셸 안에서 실행해야할 필요가 있다. 예를 들어, 실행할 커맨드가 서로 연결되어 있는 여러 개의 커맨드들로 구성되어 있거나, 셸 스크립트일 수도 있다. 셸 안에서 커맨드를 실행하려고 한다면, 이런 방식으로 감싸주면 된다.
command: ["/bin/sh"]
args: ["-c", "while true; do echo hello; sleep 10;done"]
참고사항
이 테이블은 도커와 쿠버네티스에서 사용되는 필드 이름들을 정리한 것이다.
설명 | 도커 필드 이름 | 쿠버네티스 필드 이름 |
---|---|---|
컨테이너에서 실행되는 커맨드 | Entrypoint | command |
커맨드에 전달되는 인자들 | Cmd | arg |
기본 Entrypoint와 Cmd 값을 덮어쓰려고 한다면, 아래의 규칙들이 적용된다.
-
만약 컨테이너를 위한
command
값이나args
값을 제공하지 않는다면, 도커 이미지 안에 제공되는 기본 값들이 사용된다. -
만약 컨테이너를 위한
command
값을 제공하고,args
값을 제공하지 않는다면, 제공된command
값만이 사용된다. 도커 이미지 안에 정의된 기본 EntryPoint 값과 기본 Cmd 값은 덮어쓰여진다. -
만약 컨테이너를 위한
args
값만 제공한다면, 도커 이미지 안에 정의된 기본 EntryPoint 값이 정의한args
값들과 함께 실행된다. -
command
값과args
값을 동시에 정의한다면, 도커 이미지 안에 정의된 기본 EntryPoint 값과 기본 Cmd 값이 덮어쓰여진다.command
가args
값과 함께 실행된다.
여기 몇 가지 예시들이 있다.
이미지 Entrypoint | 이미지 Cmd | 컨테이너 command | 컨테이너 args | 실행되는 커맨드 |
---|---|---|---|---|
[/ep-1] |
[foo bar] |
<설정되지 않음> | <설정되지 않음> | [ep-1 foo bar] |
[/ep-1] |
[foo bar] |
[/ep-2] |
<설정되지 않음> | [ep-2] |
[/ep-1] |
[foo bar] |
<설정되지 않음> | [zoo boo] |
[ep-1 zoo boo] |
[/ep-1] |
[foo bar] |
[/ep-2] |
[zoo boo] |
[ep-2 zoo boo] |
다음 내용
- 파드와 컨테이너를 구성하는 방법에 대해 더 알아본다.
- 컨테이너 안에서 커맨드를 실행하는 방법에 대해 더 알아본다.
- 컨테이너를 확인한다.
2 - 종속 환경 변수 정의하기
본 페이지는 쿠버네티스 파드의 컨테이너를 위한 종속 환경 변수를 정의하는 방법에 대해 설명한다.
시작하기 전에
쿠버네티스 클러스터가 필요하고, kubectl 커맨드-라인 툴이 클러스터와 통신할 수 있도록 설정되어 있어야 한다. 이 튜토리얼은 컨트롤 플레인 호스트가 아닌 노드가 적어도 2개 포함된 클러스터에서 실행하는 것을 추천한다. 만약, 아직 클러스터를 가지고 있지 않다면, minikube를 사용해서 생성하거나 다음의 쿠버네티스 플레이그라운드 중 하나를 사용할 수 있다.
컨테이너를 위한 종속 환경 변수 정의하기
파드를 생성할 때, 파드 안에서 동작하는 컨테이너를 위한 종속 환경 변수를 설정할 수 있다.
종속 환경 변수를 설정하려면, 구성 파일에서 env
의 value
에 $(VAR_NAME)을 사용한다.
이 예제에서, 한 개의 컨테이너를 실행하는 파드를 생성한다. 파드를 위한 구성 파일은 일반적인 방식으로 정의된 종속 환경 변수를 정의한다. 다음은 파드를 위한 구성 매니페스트 예시이다.
apiVersion: v1
kind: Pod
metadata:
name: dependent-envars-demo
spec:
containers:
- name: dependent-envars-demo
args:
- while true; do echo -en '\n'; printf UNCHANGED_REFERENCE=$UNCHANGED_REFERENCE'\n'; printf SERVICE_ADDRESS=$SERVICE_ADDRESS'\n';printf ESCAPED_REFERENCE=$ESCAPED_REFERENCE'\n'; sleep 30; done;
command:
- sh
- -c
image: busybox
env:
- name: SERVICE_PORT
value: "80"
- name: SERVICE_IP
value: "172.17.0.1"
- name: UNCHANGED_REFERENCE
value: "$(PROTOCOL)://$(SERVICE_IP):$(SERVICE_PORT)"
- name: PROTOCOL
value: "https"
- name: SERVICE_ADDRESS
value: "$(PROTOCOL)://$(SERVICE_IP):$(SERVICE_PORT)"
- name: ESCAPED_REFERENCE
value: "$$(PROTOCOL)://$(SERVICE_IP):$(SERVICE_PORT)"
-
YAML 구성 파일을 활용해 파드를 생성한다.
kubectl apply -f https://k8s.io/examples/pods/inject/dependent-envars.yaml
pod/dependent-envars-demo created
-
실행 중인 파드의 목록을 조회한다.
kubectl get pods dependent-envars-demo
NAME READY STATUS RESTARTS AGE dependent-envars-demo 1/1 Running 0 9s
-
파드 안에서 동작 중인 컨테이너의 로그를 확인한다.
kubectl logs pod/dependent-envars-demo
UNCHANGED_REFERENCE=$(PROTOCOL)://172.17.0.1:80 SERVICE_ADDRESS=https://172.17.0.1:80 ESCAPED_REFERENCE=$(PROTOCOL)://172.17.0.1:80
위에서 보듯이, SERVICE_ADDRESS
는 올바른 종속성 참조, UNCHANGED_REFERENCE
는 잘못된 종속성 참조를 정의했으며 ESCAPED_REFERENCE
는 종속성 참조를 건너뛴다.
환경 변수가 참조될 때 해당 환경 변수가 미리 정의되어 있으면 SERVICE_ADDRESS
의 경우와 같이 참조를 올바르게 해석할 수 있다.
환경 변수가 정의되지 않았거나 일부 변수만 포함된 경우, 정의되지 않은 환경 변수는 UNCHANGED_REFERENCE
의 경우와 같이 일반 문자열로 처리된다.
일반적으로 환경 변수 해석에 실패하더라도 컨테이너의 시작을 막지는 않는다.
$(VAR_NAME)
구문은 이중 $로 이스케이프될 수 있다. (예: $$(VAR_NAME)
)
이스케이프된 참조는 참조된 변수가 정의되었는지 여부에 관계없이 해석을 수행하지 않는다.
이는 위의 ESCAPED_REFERENCE
를 통해 확인할 수 있다.
다음 내용
- 환경 변수에 대해 알아본다.
- EnvVarSource를 확인한다.
3 - 컨테이너를 위한 환경 변수 정의하기
본 페이지는 쿠버네티스 파드의 컨테이너를 위한 환경 변수를 정의하는 방법에 대해 설명한다.
시작하기 전에
쿠버네티스 클러스터가 필요하고, kubectl 커맨드-라인 툴이 클러스터와 통신할 수 있도록 설정되어 있어야 한다. 이 튜토리얼은 컨트롤 플레인 호스트가 아닌 노드가 적어도 2개 포함된 클러스터에서 실행하는 것을 추천한다. 만약, 아직 클러스터를 가지고 있지 않다면, minikube를 사용해서 생성하거나 다음의 쿠버네티스 플레이그라운드 중 하나를 사용할 수 있다.
버전 확인을 위해서, 다음 커맨드를 실행kubectl version
.
컨테이너를 위한 환경 변수 정의하기
파드를 생성할 때, 파드 안에서 동작하는 컨테이너를 위한 환경 변수를 설정할
수 있다. 환경 변수를 설정하려면, 구성 파일에 env
나 envFrom
필드를
포함시켜야 한다.
이 예제에서, 한 개의 컨테이너를 실행하는 파드를 생성한다. 파드를 위한 구성
파일은 DEMO_GREETING
이라는 이름과 "Hello from the environment"
이라는
값을 가지는 환경 변수를 정의한다. 다음은 파드를 위한 구성 매니페스트
예시이다.
apiVersion: v1
kind: Pod
metadata:
name: envar-demo
labels:
purpose: demonstrate-envars
spec:
containers:
- name: envar-demo-container
image: gcr.io/google-samples/node-hello:1.0
env:
- name: DEMO_GREETING
value: "Hello from the environment"
- name: DEMO_FAREWELL
value: "Such a sweet sorrow"
-
YAML 구성 파일을 활용해 파드를 생성한다.
kubectl apply -f https://k8s.io/examples/pods/inject/envars.yaml
-
실행 중인 파드들의 목록을 조회한다.
kubectl get pods -l purpose=demonstrate-envars
출력은 아래와 비슷할 것이다.
NAME READY STATUS RESTARTS AGE envar-demo 1/1 Running 0 9s
-
파드의 컨테이너 환경 변수를 나열한다.
kubectl exec envar-demo -- printenv
출력은 아래와 비슷할 것이다.
NODE_VERSION=4.4.2 EXAMPLE_SERVICE_PORT_8080_TCP_ADDR=10.3.245.237 HOSTNAME=envar-demo ... DEMO_GREETING=Hello from the environment DEMO_FAREWELL=Such a sweet sorrow
참고:env
나envFrom
필드를 이용해 설정된 환경 변수들은 컨테이너 이미지 안에서 명시된 모든 환경 변수들을 오버라이딩한다.
참고: 환경 변수는 서로를 참조할 수 있는데, 이 때 순서에 주의해야 한다. 동일한 컨텍스트에서 정의된 다른 변수를 참조하는 변수는 목록의 뒤쪽에 나와야 한다. 또한, 순환 참조는 피해야 한다.
설정 안에서 환경 변수 사용하기
파드의 구성 파일 안에서 정의한 환경 변수는
파드의 컨테이너를 위해 설정하는 커맨드와 인자들과 같이,
구성 파일 안의 다른 곳에서 사용할 수 있다.
아래의 구성 파일 예시에서, GREETING
, HONORIFIC
, 그리고
NAME
환경 변수들이 각각 Warm greetings to
, The Most honorable
,
그리고 Kubernetes
로 설정되어 있다. 이 환경 변수들은
이후 env-print-demo
컨테이너에 전달되어 CLI 인자에서
사용된다.
apiVersion: v1
kind: Pod
metadata:
name: print-greeting
spec:
containers:
- name: env-print-demo
image: bash
env:
- name: GREETING
value: "Warm greetings to"
- name: HONORIFIC
value: "The Most Honorable"
- name: NAME
value: "Kubernetes"
command: ["echo"]
args: ["$(GREETING) $(HONORIFIC) $(NAME)"]
컨테이너가 생성되면, echo Warm greetings to The Most Honorable Kubernetes
커맨드가 컨테이너에서 실행된다.
다음 내용
- 환경 변수에 대해 알아본다.
- 시크릿을 환경 변수로 사용하기에 대해 알아본다.
- EnvVarSource를 확인한다.
4 - 환경 변수로 컨테이너에 파드 정보 노출하기
본 페이지는 파드에서 실행 중인 컨테이너에게 파드가 환경 변수를 사용해서 자신의 정보를 노출하는 방법에 대해 설명한다. 환경 변수는 파드 필드와 컨테이너 필드를 노출할 수 있다.
시작하기 전에
쿠버네티스 클러스터가 필요하고, kubectl 커맨드-라인 툴이 클러스터와 통신할 수 있도록 설정되어 있어야 한다. 이 튜토리얼은 컨트롤 플레인 호스트가 아닌 노드가 적어도 2개 포함된 클러스터에서 실행하는 것을 추천한다. 만약, 아직 클러스터를 가지고 있지 않다면, minikube를 사용해서 생성하거나 다음의 쿠버네티스 플레이그라운드 중 하나를 사용할 수 있다.
버전 확인을 위해서, 다음 커맨드를 실행kubectl version
.
다운워드(Downward) API
파드 및 컨테이너 필드를 실행 중인 컨테이너에 노출하는 두 가지 방법이 있다.
- 환경 변수
- 볼륨 파일
파드 및 컨테이너 필드를 노출하는 이 두 가지 방법을 다운워드 API라고 한다.
파드 필드를 환경 변수의 값으로 사용하자
이 연습에서는 하나의 컨테이너를 가진 파드를 생성한다. 다음은 파드에 대한 구성 파일이다.
apiVersion: v1
kind: Pod
metadata:
name: dapi-envars-fieldref
spec:
containers:
- name: test-container
image: k8s.gcr.io/busybox
command: [ "sh", "-c"]
args:
- while true; do
echo -en '\n';
printenv MY_NODE_NAME MY_POD_NAME MY_POD_NAMESPACE;
printenv MY_POD_IP MY_POD_SERVICE_ACCOUNT;
sleep 10;
done;
env:
- name: MY_NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
- name: MY_POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: MY_POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: MY_POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
- name: MY_POD_SERVICE_ACCOUNT
valueFrom:
fieldRef:
fieldPath: spec.serviceAccountName
restartPolicy: Never
구성 파일에서 5개의 환경 변수를 확인할 수 있다. env
필드는
EnvVars의 배열이다. 배열의 첫 번째 요소는 MY_NODE_NAME
환경 변수가 파드의 spec.nodeName
필드에서 값을 가져오도록 지정한다. 마찬가지로 다른 환경 변수도 파드 필드에서 이름을 가져온다.
참고: 이 예제의 필드는 파드에 있는 컨테이너의 필드가 아니라 파드 필드이다.
파드를 생성한다.
kubectl apply -f https://k8s.io/examples/pods/inject/dapi-envars-pod.yaml
파드의 컨테이너가 실행중인지 확인한다.
kubectl get pods
컨테이너의 로그를 본다.
kubectl logs dapi-envars-fieldref
출력은 선택된 환경 변수의 값을 보여준다.
minikube
dapi-envars-fieldref
default
172.17.0.4
default
이러한 값이 로그에 출력된 이유를 보려면 구성 파일의 command
및 args
필드를 확인하자.
컨테이너가 시작되면 5개의 환경 변수 값을 stdout에 쓰며 10초마다 이를 반복한다.
다음으로 파드에서 실행 중인 컨테이너의 셸을 가져오자.
kubectl exec -it dapi-envars-fieldref -- sh
셸에서 환경 변수를 보자.
/# printenv
출력은 특정 환경 변수에 파드 필드 값이 할당되었음을 보여준다.
MY_POD_SERVICE_ACCOUNT=default
...
MY_POD_NAMESPACE=default
MY_POD_IP=172.17.0.4
...
MY_NODE_NAME=minikube
...
MY_POD_NAME=dapi-envars-fieldref
컨테이너 필드를 환경 변수의 값으로 사용하기
이전 연습에서는 파드 필드를 환경 변수의 값으로 사용했다. 이 다음 연습에서는 컨테이너 필드를 환경 변수의 값으로 사용한다. 다음은 하나의 컨테이너가 있는 파드의 구성 파일이다.
apiVersion: v1
kind: Pod
metadata:
name: dapi-envars-resourcefieldref
spec:
containers:
- name: test-container
image: k8s.gcr.io/busybox:1.24
command: [ "sh", "-c"]
args:
- while true; do
echo -en '\n';
printenv MY_CPU_REQUEST MY_CPU_LIMIT;
printenv MY_MEM_REQUEST MY_MEM_LIMIT;
sleep 10;
done;
resources:
requests:
memory: "32Mi"
cpu: "125m"
limits:
memory: "64Mi"
cpu: "250m"
env:
- name: MY_CPU_REQUEST
valueFrom:
resourceFieldRef:
containerName: test-container
resource: requests.cpu
- name: MY_CPU_LIMIT
valueFrom:
resourceFieldRef:
containerName: test-container
resource: limits.cpu
- name: MY_MEM_REQUEST
valueFrom:
resourceFieldRef:
containerName: test-container
resource: requests.memory
- name: MY_MEM_LIMIT
valueFrom:
resourceFieldRef:
containerName: test-container
resource: limits.memory
restartPolicy: Never
구성 파일에서 4개의 환경 변수를 확인할 수 있다. env
필드는
EnvVars의 배열이다. 배열의 첫 번째 요소는 MY_CPU_REQUEST
환경 변수가 test-container
라는 컨테이너의
requests.cpu
필드에서 값을 가져오도록 지정한다. 마찬가지로 다른 환경 변수도 컨테이너 필드에서
값을 가져온다.
파드를 생성한다.
kubectl apply -f https://k8s.io/examples/pods/inject/dapi-envars-container.yaml
파드의 컨테이너가 실행중인지 확인한다.
kubectl get pods
컨테이너의 로그를 본다.
kubectl logs dapi-envars-resourcefieldref
출력은 선택된 환경 변수의 값을 보여준다.
1
1
33554432
67108864