kubernetes 시리즈 06 - kubernetes 자원 목록 정의 입문

15484 단어
본문 은 용기 기술 학습 시리즈 의 문장 총목록 에 수록되어 있다
1. kubernetes 자원 인식
1.1 공통 리소스/객체
workload 작업 부하형 자원:pod,ReplicaSet,Deployment,StatefulSet,daemonset,job...
서버 검색 및 균형: 서비스, Lngress...
구성 및 저장:volume, CSI
 configmap,secret
 downwardAPI

클러스터 수준 리소스
 namespace,node,role,clusterrole,rolebinding,clusterrolebinding

메타데이터 리소스
 HPA,podtemplate,limitrange

 
1.2 리소스를 만드는 방법
apiserver는 JSON 형식의 자원 정의만 수락합니다.
yaml 포맷은 설정 목록을 제공합니다.apiserver는 자동으로 JSON 포맷으로 변환한 다음 제출할 수 있습니다.
 
1.3 대부분(메인스트림) 리소스의 구성 목록: 5개의 1단계 필드로 구성
 apiserver:group/version
현재 지원하는 apiserver 조회: $kubectl api-versions
kind: 리소스 범주metadata:메타데이터
name: 이름namespace: 명칭 공간 labels: 레이블annotation: 자원 주석selfLink: 자원별 인용 PATH,/api/GROUP/VERSION/namespaces/NAMESPACE/TYPE/NAME
spec: 기대 상태(disired state), 기대 자원은 어떤 특성에 사용해야 하는지status: 현재 상태 (current state), 이 필드는kubernetes 그룹에서 유지보수되며 사용자가 직접 정의할 수 없습니다  
1.4 kubectl explain을 사용하여 각 리소스의 구성 방법 조회
(1) 예를 들어pod자원을 어떻게 정의하는지 조회
[root@master ~]# kubectl explain pod
KIND:     Pod
VERSION:  v1

DESCRIPTION:
     Pod is a collection of containers that can run on a host. This resource is
     created by clients and scheduled onto hosts.

FIELDS:
   apiVersion	
... ...
   kind	
... ...

   metadata	
... ...
   spec	
... ...
   status	
... ...

  
(2) 조회에 1급 1급으로 들어갈 수 있다.쿼리 정의pod의metadata 필드
[root@master ~]# kubectl explain pod.spec
KIND:     Pod
VERSION:  v1

RESOURCE: spec 

DESCRIPTION:
... ...

FIELDS:
... ..
   affinity	
... ...
[root@master ~]# kubectl explain pod.spec.containers
KIND:     Pod
VERSION:  v1

RESOURCE: containers 

DESCRIPTION:
... ...
FIELDS:
   args	
... ...
   command	
... ...   

자원을 스스로 정의할 때 어떻게 정의하는지 모르면 빠른 조회를 할 수 있습니다
 
1.5 예
(1) 쿼리 그룹의pod (전편에서 만든pod)
[root@master ~]# kubectl get pods
NAME                          READY     STATUS    RESTARTS   AGE
client                        1/1       Running   0          4h
myapp-848b5b879b-9slqg        1/1       Running   0          46m
myapp-848b5b879b-wtrjr        1/1       Running   0          46m
myapp-848b5b879b-z2sqc        1/1       Running   0          46m

  
(2)-o yaml을 yaml 형식으로 출력하고pod가 만든 동작을 보기
[root@master ~]# kubectl get pod myapp-848b5b879b-9slqg -o yaml
apiVersion: v1  #api  
kind: Pod  #    
metadata:  #   
  annotations:
    cni.projectcalico.org/podIP: 10.244.1.60/32
  labels:
    pod-template-hash: "4046164356"
    run: myapp
  name: myapp-848b5b879b-9slqg
  namespace: default
... ...
  selfLink: /api/v1/namespaces/default/pods/myapp-848b5b879b-9slqg
spec:  #  、  ;            ;      
... ...
status:  #    
... ...

  
1.6 프레젠테이션:yaml 형식 파일 기반pod 만들기
[root@master ~]# mkdir manifests
[root@master ~]# cd manifests/

 
(1)pod-demo 작성yaml 파일
2개의 용기를 만들고 1개는nginx를 실행합니다.busybox에서sleep 명령 실행하기
[root@master manifests]# vim pod-demo.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-demo
  namespace: default
  #labels: {app:myapp, tier:frontend} #      {}  ;
  labels: #         
    app: myapp
    tier: frontend
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
  - name: busybox
    image: busybox:latest
    #command: ["/bin/sh","-c","sleep 3600"]  #      []  ;
    command: #         ,  -
    - "/bin/sh"
    - "-c"
    - "sleep 3600"

  
(2)pod-demo 기반yaml 파일create pod 만들기
[root@master manifests]# kubectl create -f pod-demo.yaml 
pod/pod-demo created

  
(3) 검증
①pod 생성 정보 조회
[root@master manifests]# kubectl create -f pod-demo.yaml
pod/pod-demo created
[root@master manifests]# kubectl get pods -o wide
NAME       READY     STATUS    RESTARTS   AGE       IP            NODE
pod-demo   2/2       Running   0          1m        10.244.1.61   node1
---      
[root@master manifests]# kubectl describe pods pod-demo
Name:               pod-demo
Namespace:          default
... ...

②pod의 서비스 액세스
[root@master manifests]# curl 10.244.1.61
Hello MyApp | Version: v1 | Pod Name
---  pod     
[root@master manifests]# kubectl logs pod-demo myapp
192.168.130.104 - - [23/Jan/2019:05:35:35 +0000] "GET / HTTP/1.1" 200 65 "-" "curl/7.29.0" "-"

③yaml 파일 기반pod 삭제
[root@master manifests]# kubectl delete -f pod-demo.yaml 
pod "pod-demo" deleted
[root@master manifests]# kubectl get pods
No resources found.

  
2. Pod 리소스
2.1 Pod 리소스 공통 옵션
 metadata.label: 태그
 key=value
키:문자,숫자,,-,.
value: 공백일 수 있으며 알파벳이나 숫자의 시작과 끝만 사용할 수 있으며 중간에 알파벳, 숫자,,-,를 사용할 수 있습니다.


 metadata.annotations: 리소스 메모 spec.containers
- name: 컨테이너 이름image: 대칭복사imagePullPolicy: 거울을 볼 때 latest 탭을 다운로드하면 기본적으로 Always입니다.그렇지 않으면 기본 IfNotPresen
Always는 항상 미러링되며, Never는 미러링을 다운로드하지 않으며, IfNotPresent 로컬에 있는 경우 다운로드하지 않음
ports: 용기에서 공개된 포트 목록
containerPort: Pod의 서비스 포트 번호hostIP: 호스트에 바인딩된 IP 노출hostPort: 호스트에 노출된 포트 번호name: 이 포트의 이름을 노출합니다
args: 매개 변수command: 명령 실행
spec.nodeSelector: 노드 태그 선택기 
2.2 데모
(1)pod-demo 수정yaml 파일
[root@master manifests]# vim pod-demo.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-demo
  namespace: default
  #labels: {app:myapp, tier:frontend} #      {}  ;
  labels: #         
    app: myapp
    tier: frontend
  annotations:
    along.com/created-by: "cluster admin"
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    ports:
    - name: http
      containerPort: 80
    - name: https
      containerPort: 443
  - name: busybox
    image: busybox:latest
    imagePullPolicy: IfNotPresent
    #command: ["/bin/sh","-c","sleep 3600"]  #      []  ;
    command: #         ,  -
    - "/bin/sh"
    - "-c"
    - "sleep 3600"
  nodeSelector:
    disktype: ssd

  
(2) node1 노드에 disktype=ssd 라벨을 붙인다
[root@master manifests]# kubectl label node node1 disktype=ssd
[root@master manifests]# kubectl get nodes node1 --show-labels
NAME      STATUS    ROLES     AGE       VERSION   LABELS
node1     Ready         140d      v1.11.2   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,disktype=ssd,kubernetes.io/hostname=node1

  
(3)yaml 파일 기반pod 만들기
[root@master manifests]# kubectl create -f pod-demo.yaml 
pod/pod-demo created

  
(4) 검증
--- pod     node1   ,  node1 disktype=ssd  
[root@master manifests]# kubectl get pod -o wide
NAME       READY     STATUS    RESTARTS   AGE       IP            NODE
pod-demo   2/2       Running   0          11s       10.244.1.68   node1
--- -l     ,      
[root@master manifests]# kubectl get pods --show-labels -l app
NAME       READY     STATUS    RESTARTS   AGE       LABELS
pod-demo   2/2       Running   0          30s       app=myapp,tier=frontend

  
3. Pod 건강 검사
3.1pod 건강 검진 안내
pod 건강 검측은 생존성 탐지, 준비형 탐지로 나뉜다.이것은 생산 환경에서 거의 반드시 배치해야 한다.
준비형 탐지가 없으면;pod가 시작되면 사용자 데이터가 분배됩니다.만약pod의 서비스가tomcat 등과 같으면 시작할 시간이 필요합니다.일정 시간 동안 사용자가 서비스에 접근하지 못하게 할 수 있다.
만약 생존성 탐지가 없다면:pod에서 서비스가 실패하면 탐지가 없으면 용기를 다시 닫지 않습니다.또한 사용자가 서비스에 액세스하지 못할 수도 있습니다.
 
3.2pod 상태 점검 옵션
(1) 스펙 필드 아래,containers 필드 설정,explain으로 자세한 사용 방법 보기
$ kubectl explain pod.spec.containers.
livenessProbe 생존 탐지
exec: 감지 명령 지정failureThreshold: 연속 실패 횟수는 실패로 간주되며 기본값은 3이고 최소값은 1httpGet: 실행할 http 요청 지정initialDelaySeconds: 용기가 시작된 지 몇 초 후에 다시 검사periodSeconds: 몇 초 간격으로 탐지하기;기본값은 10초입니다.최저 한도는 1 successThreshold: 연속 성공 횟수는 서비스가 정상이라고 판단tcpSocket: TCP 포트에 대한 작업 지정timeoutSeconds: 시간 초과를 탐지하는 초, 기본값은 1초
readinessProbe 준비형 탐지 (livenessProbe 생존성 탐지 옵션과 같음) 
(2)pod에서 용기가 끊겼습니다.pod를 다시 시작할지 여부
$ kubectl explain pod.spec.restartPolicy.   
Always: 항상 재부팅(기본값)OnFailure: 컨테이너 상태가 잘못된 경우에만 재부팅Never: 절대 재부팅하지 않음 
3.3 시범: exec 방식으로 생존성 탐지 실현
(1) yaml 파일 작성
/tmp/healthy 파일이 존재하지 않을 때 서비스 고장으로 간주하기;
컨테이너 삭제/tmp/healthy 파일 30초 후 실행
[root@master manifests]# vim liveness-exec.yaml
apiVersion: v1
kind: Pod
metadata:
  name: liveness-exec-pod
  namespace: default
spec:
  containers:
  - name: liveness-exec-container
    image: busybox:latest
    imagePullPolicy: IfNotPresent
    command: ["/bin/sh","-c","touch /tmp/healthy; sleep 30; rm -f /tmp/healthy; sleep 3600"]
    livenessProbe:
      exec:
        command: ["test","-e","/tmp/healthy"]
      initialDelaySeconds: 1  #      1     
      periodSeconds: 3  #  3     
  restartPolicy: Always  #    pod

  
(2) 실행 생성pod
[root@master manifests]# kubectl create -f liveness-exec.yaml 
pod/liveness-exec-pod created
[root@master manifests]# kubectl get pods
NAME                READY     STATUS        RESTARTS   AGE
liveness-exec-pod   1/1       Running       0          6s

  
(3) 등 30s를 기다리면 용기가 검측에 실패하고pod를 다시 시작합니다.describe를 사용하면 상세한 정보를 볼 수 있습니다
[root@master manifests]# kubectl describe pods liveness-exec-pod
... ...
    State:          Running
      Started:      Wed, 23 Jan 2019 16:58:09 +0800
    Last State:     Terminated  #       
      Reason:       Error
      Exit Code:    137
      Started:      Wed, 23 Jan 2019 16:57:01 +0800
      Finished:     Wed, 23 Jan 2019 16:58:09 +0800
    Ready:          True
    Restart Count:  1  #    1 
    Liveness:       exec [test -e /tmp/healthy] delay=1s timeout=1s period=3s #success=1 #failure=3
... ...

  
3.4 시연: httpget 방식으로 생존성 탐지 실현
(1)yaml 파일을 작성하고pod를 만들고 실행합니다
용기 내 80 포트와 80 포트를 제공하는/index를 탐지하지 못하면.html 파일 시 서비스 고장으로 판단됨;
[root@master manifests]# vim liveness-httpget.yaml
apiVersion: v1
kind: Pod
metadata:
  name: liveness-httpget-pod
  namespace: default
spec:
  containers:
  - name: liveness-exec-container
    image: ikubernetes/myapp:v1
    ports:
    - name: http
      containerPort: 80
    livenessProbe:
      httpget:
        port: http
        path: /index.html
      initialDelaySeconds: 1
      periodSeconds: 3
  restartPolicy: Always
[root@master manifests]# kubectl create -f liveness-httpget.yaml
pod/liveness-httpget-pod created

  
(2) 용기에 수동으로 연결하여 index를 삭제합니다.html 파일
[root@master manifests]# kubectl exec -it liveness-httpget-pod -- /bin/sh
/ # rm -f /usr/share/nginx/html/index.html

  
(3) 용기는 검측에 실패하고pod를 다시 시작합니다.describe를 사용하면 상세한 정보를 볼 수 있습니다
[root@master manifests]# kubectl describe pods liveness-httpget-pod
... ...
    Port:           80/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Wed, 23 Jan 2019 17:10:03 +0800
    Last State:     Terminated  #       
      Reason:       Completed
      Exit Code:    0
      Started:      Wed, 23 Jan 2019 17:08:22 +0800
      Finished:     Wed, 23 Jan 2019 17:10:03 +0800
    Ready:          True
    Restart Count:  1  #    1 
    Liveness:       http-get http://:http/index.html delay=1s timeout=1s period=3s #success=1 #failure=3
... ...

  
3.5 프레젠테이션: exec 방식으로 준비 상태 탐지
(1)yaml 파일을 작성하고 시작 용기 만들기
/tmp/healthy 파일이 존재하지 않을 때 서비스가 완료되지 않았다고 판단합니다.pod 시작 실패;
[root@master manifests]# vim readiness-exec.yaml
apiVersion: v1
kind: Pod
metadata:
  name: readiness-exec-pod
  namespace: default
spec:
  containers:
  - name: readiness-exec-container
    image: busybox:latest
    imagePullPolicy: IfNotPresent
    #command: ["/bin/sh","-c","touch /tmp/healthy; sleep 30; rm -f /tmp/healthy; sleep 3600"]
    command: ["sleep 3600"]
    readinessProbe:
      exec:
        command: ["test","-e","/tmp/healthy"]
      periodSeconds: 3
  restartPolicy: Always
[root@master manifests]# kubectl create -f readiness-exec.yaml
pod/readiness-exec-pod created

  
(2) 보기,pod 시작 준비 실패
[root@master ~]# kubectl get pods
NAME                 READY     STATUS              RESTARTS   AGE
readiness-exec-pod   0/1       RunContainerError   1          12s

  
4、Pod 부팅 전/후면 갈고리
4.1 소개
pod는 시작 전후에 갈고리 훅을 설정할 수 있다.spec.containers에서lifecycle 필드에서 설정하기;
postStart: 컨테이너를 만든 후 바로 PostStart 작업을 호출합니다.실패하면 재시작 정책에 따라 종료합니다.
preStop: 프로세서가 완료되면 컨테이너가 종료되는 즉시 PreStop 작업을 호출합니다.
 
4.2 문법
$ kubectl explain pod.spec.containers.lifecycle
 postStart
exec: 실행할 명령을 지정했습니다.
httpGet: 실행할 http 요청을 지정합니다.
tcpSocket: TCP 포트에 대한 작업 지정
preStop(postStart 명령과 동일) 
4.3 설명: exec 설정pod 시작 전 갈고리 사용하기
(1)yaml 파일을 작성하고 시작 용기 만들기
용기를 시작하기 전에 httpd 서비스를 준비하는 메인 파일/tmp/index를 만듭니다.html
[root@master manifests]# vim poststart-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: poststart-pod
  namespace: default
spec:
  containers:
  - name:  poststart-container
    image: busybox:latest
    imagePullPolicy: IfNotPresent
    lifecycle:
      postStart:
        exec:
          command: ['/bin/sh','-c','echo hello > /tmp/index.html']
    command: ['/bin/sh','-c','/bin/httpd -f -h /tmp']
[root@master manifests]# kubectl create -f poststart-pod.yaml 
pod/poststart-pod created

  
(2) 검증, 액세스 서비스
[root@master ~]# kubectl get pods -o wide
NAME            READY     STATUS    RESTARTS   AGE       IP            NODE
poststart-pod   1/1       Running   0          26s       10.244.2.69   node2
[root@master ~]# curl 10.244.2.69
hello

  

좋은 웹페이지 즐겨찾기