1. Pods - gomamon/k8s_study GitHub Wiki
Pods
podsλ¨μλ‘ μ»¨ν μ΄λλ€μ λ¬Άμ΄μ κ΄λ¦¬
컨ν μ΄λλ§λ€ μν λΆμ¬ κ°λ₯
νλ λ΄ μ»¨ν μ΄λλ€μ΄ κ°μ λͺ©μ μΌλ‘ μμ곡μ
νλμμ 컨ν μ΄λλ λͺ¨λ νλμ λ Έλμμ μ€ν
νλμμ μλ 컨ν μ΄λλ€μ΄ ipνλλ₯Ό 곡μ
νλμ 컨ν μ΄λμ μν΅ν λλ 컨ν μ΄λλ§λ€ λ€λ₯΄κ² μ€μ ν ν¬νΈ μ¬μ©
sample pod λ§λ€κΈ° pod-sample.yaml
apiVersion: v1
kind: Pod
metadata:
name: kubernetes-simple-pod
labels:
app: kubernetes-simple-pod
spec:
containers:
- name: kubernetes-simple-pod
image: arisu1000/simple-container-app:latest
ports:
- containerPort: 8080
kubectl apply -f pod-sample.yaml
kubectl get pods
pod life cycle
- pending
- νλ μμ μ 체 컨ν μ΄λκ° μ€νλ λκΉμ§ μκ°μΌ κ±Έλ¦°λ€
- running
- νλ μμ λͺ¨λ 컨ν μ΄λκ° μ€νμ€!
- succeeded
- νλμμ 무λ 컨ν μ΄λκ° μ μ μ€νμ’ λ£λ μνλ‘ μ¬μμ γ΄γ΄
- failed
- νλ μ 컨ν μ΄λ μ€ μ μμ μΌλ‘ μ€ν μ’ λ£ μλμκ° μλ€λ‘
- unknown
- μννμΈ λΆκ°.. ( νλκ° μλ λ Έλμ ν΅μ λΆκ°λ₯ν μν)
νλ statusνμΈνκΈ°
kubectl describe pods νλμ΄λ¦
kubelet 컨ν μ΄λ μ§λ¨
kubeletμ΄ μ»¨ν μ΄λλ₯Ό μ£ΌκΈ°μ μΌλ‘ νμΈ
- livenessProbe: 컨ν μ΄λκ° μ€νλλμ§ νμΈ, μ§λ¨μ μ€ν¨μ μ’ λ£μν€κ³ μ¬μμ!
- readinessProbe: μ€μ λ‘ μλΉμ€ μμ²μ μλ΅ν μ μλμ§ μ§λ¨. μ§λ¨ μ€ν¨μ ν΄λΉ νλμ μ°κ²°λμ΄μλ λͺ¨λ μλΉμ€μ μλ μλν¬μΈνΈ μ κ±°
컨ν μ΄λκ° κ΅¬νν handlerμ kubeleteμ΄ νΈμΆν΄ 컨ν μ΄λλ₯Ό μ§λ¨νλ€.
- container handler
- ExecAction : μ§μ λ λͺ λ Ή μ€ν, μ’ λ£μ½λ 0 β success
- TCPSocketAction: 컨ν μ΄λ μμ μ°κ²°λ IPμ ν¬νΈλ‘ TCPμν νμΈ, ν¬νΈ open β Success
- HTTPGetAction: 컨ν μ΄λ μ IP, port, pathλ‘ http get requestλ₯Ό 보λ. HTTP response status 200~400 β Success
Init Container
app continerκ° μ€νλκΈ°μ podsλ₯Ό μ΄κΈ°ν
app continerμ΄λ―Έμ§μ κ°μ΄ λλ©΄ μλλ μ±μ μμ€μ½λ κ΄λ¦¬ μμ μμλλ€μ
- νλ ν νλ¦Ώμ λͺ μν μμλλ‘ init continer μ€νλ¨
apiVersion: v1
kind: Pod
metadata:
name: kubernetes-simple-pod
labels:
app: kubernetes-simple-pod
spec:
initContainers:
- name: init-myservice
image: arisu1000/simple-container-app:latest
command: ['sh', '-c', 'sleep 2; echo helloworld01;']
- name: init-mydb
image: arisu1000/simple-container-app:latest
command: ['sh', '-c', 'sleep 2; echo helloworld02;']
containers:
- name: kubernetes-simple-pod
image: arisu1000/simple-container-app:latest
command: ['sh', '-c', 'echo The app is running! && sleep 3600']
λ©μΈμ§μ λμ μ€μ κ°μκ±° μΆκ°ν΄μ μ°λ©΄ λ©λλ€!
μ μ©νκ³ λ‘그보기!
kubectl apply -f .\pod-init.yaml
kubectl get -f .\pod-init.yaml
kubectl describe -f .\pod-init.yaml
> kubectl logs kubernetes-simple-pod -c init-myservice
helloworld01
kubectl logs kubernetes-simple-pod -c init-mydb
>helloworld02
Static Pod
:kube-apiserverμ μν΅νκ³ kubeletμ΄ μ§μ μ€ννλ νλ
- kubeletμ€μ μ βpod-manifest-pathμ μ€μ ν λλ ν°λ¦¬μ μ€ν ν± νλλ€μ λ£μ΄λλ©΄ λλ€!
- kubeletμ΄ μ§μ κ΄λ¦¬, λ¬Έμ κ° μκΈ°λ©΄ restart
- kube-apiserverλΌλκ° etcdκ°μ μμ€ν νλλ₯Ό μ€νν λ μ΄λΉ!
CPUμ λ©λͺ¨λ¦¬ μμ ν λΉνκΈ°
msaμμλ λ Έλνλμ μ¬λ¬κ°μ νλλ₯Ό μ€ννλ μΌμ΄ λ§μ, μ΄λ μ¬μ©λμ΄ λ§μ νλ νλκ° μμΌλ©΄ ν΄λΉ νλ μμ λ Έλλ€μ μ±λ₯ Down β κ° μ»¨ν μ΄λμ CPUλ λ©λͺ¨λ¦¬ μ¬μ©μ μ ννλ€!
pod-resource.yaml
apiVersion: v1
kind: Pod
metadata:
name: kubernetes-simple-pod
labels:
app: kubernetes-simple-pod
spec:
containers:
- name: kubernetes-simple-pod
image: arisu1000/simple-container-app:latest
resources:
requests:
cpu: 0.1
memory: 200M
limits:
cpu: 0.5
memory: 1G
ports:
- containerPort: 8080
- memory
- .spec.conteiners[].resource.requests.request : μ΅μ, μ΄λ§νΌ μ¬μ resuorceκ° μμΌλ©΄ pending
- .spec.conteiners[].resource.requests.limits μ΅λ
- μΏ λ²λ€ν°μ€κ° νλλ₯Ό μ€μΌμ₯΄λ§ν λ μλ€ μμ μΈν μνꡬ ".memoryλ§ μ€μ νλ©΄ λ Έλμμ λ©λͺ¨λ¦¬λ₯Ό μ λΆ μ¬μ©ν μμμ
- CPU
- .spec.conteiners[].resource.requests.cpu
- μ₯ μ μμ? μ½μ΄μ μλμΌ? : νΌμΌν μ΄μ§μ λλ ! ex) 0.5 μ½μ΄ νλμ 50νλ‘!
νλ νκ²½λ³μ μ€μ
apiVersion: v1
kind: Pod
metadata:
name: kubernetes-simple-pod
labels:
app: kubernetes-simple-pod
spec:
containers:
- name: kubernetes-simple-pod
image: arisu1000/simple-container-app:latest
ports:
- containerPort: 8080
env:
- name: TESTENV01
value: "testvalue01"
- name: HOSTNAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
- name: CPU_REQUEST
valueFrom:
resourceFieldRef:
containerName: kubernetes-simple-pod
resource: requests.cpu
- name: CPU_LIMIT
valueFrom:
resourceFieldRef:
containerName: kubernetes-simple-pod
resource: limits.cpu
μ μ©ν΄λ³΄κΈ°
apiVersion: v1
kind: Pod
metadata:
name: kubernetes-simple-pod
labels:
app: kubernetes-simple-pod
spec:
initContainers:
- name: init-myservice
image: arisu1000/simple-container-app:latest
command: ['sh', '-c', 'sleep 2; echo helloworld01;']
- name: init-mydb
image: arisu1000/simple-container-app:latest
command: ['sh', '-c', 'sleep 2; echo helloworld02;']
containers:
- name: kubernetes-simple-pod
image: arisu1000/simple-container-app:latest
resources:
requests:
cpu: 0.1
memory: 200M
limits:
cpu: 0.5
memory: 1G
ports:
- containerPort: 8080
command: ['sh', '-c', 'echo The app is running! && sleep 3600']
env:
- name: TESTENV01
value: "testvalue01" # 첫 λ²μ§Έ νκ²½ λ³μ
- name: HOSTNAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName # λ λ²μ§Έ νκ²½ λ³μ
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name # μΈ λ²μ§Έ νκ²½ λ³μ
- name: POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP # λ€ λ²μ§Έ νκ²½ λ³μ
- name: CPU_REQUEST
valueFrom:
resourceFieldRef:
containerName: kubernetes-simple-pod
resource: requests.cpu # λ€μ― λ²μ§Έ νκ²½ λ³μ
- name: CPU_LIMIT
valueFrom:
resourceFieldRef:
containerName: kubernetes-simple-pod
resource: limits.cpu # μ¬μ― λ²μ§Έ νκ²½ λ³μ
> kubectl apply -f pod-all.yaml
pod/kubernetes-simple-pod created
>kubectl exec -it kubernetes-simple-pod sh
~ # env
POD_IP=10.1.0.22
KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT=tcp://10.96.0.1:443
CPU_REQUEST=1
HOSTNAME=docker-desktop
TESTENV01=testvalue01
SHLVL=1
HOME=/root
TERM=xterm
POD_NAME=kubernetes-simple-pod
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_PROTO=tcp
CPU_LIMIT=1
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_SERVICE_HOST=10.96.0.1
PWD=/root
~ # exit