디지털 양피지/Docker2017. 6. 30. 12:26

Kubenetes 리소스 관리


kubectl 소개


kubectl run --image=nginx <name> <port> <env>

kubectl run --image=nginx nginx-test --port=80 --env="DOMAIN=cluster"


- deployment가 create 되면서 배포를 한다. 

- deployment는 pod controller의 역활로 replica 관리 등을 한다.

- 현재 default 1개로 하나의 pod만 배포한다.


kubectl get deploy 

- describe를 통해 deployment를 확인

kubectl describe deploy nginx-test 

- deploy에 묶여 있는 pod는 삭제되면 다시 생긴다. replica에 따라 지속적으로 pod를 관리한다.

- run으로 실행 한것은 자동으로 run=이름 바벨이 생긴다.



- pod 확인

kubectl get po 


- kube get po -o wide

- kube describe po <name>


- kubectl exec <pod> ...


- kubectl logs


- kubectl delete

  . po를 지워도 지워지지 않느다.


- delpoy를 지워야 한다.


- 간단한 pod는 cli 로 할 수있지만 복잡한 구성은 yaml 파일로 작성해서 해야 한다.


kubectl create -f multi-deployment.yml 




- 삭제



- 단일 pod 구성

apiVersion: v1

kind: Pod

metadata:

  name: multi

  labels:

    app: wordpress

spec:

  containers:

    - name: wordpress

      image: wordpress

      ports:

        - containerPort: 80

        - containerPort: 443

      env:

        - name: WORDPRESS_DB_HOST

          value: 127.0.0.1

        - name: WORDPRESS_DB_USER

          value: wordpress

        - name: WORDPRESS_DB_PASSWORD

          value: password

    - name: db

      image: mysql

      env:

        - name: MYSQL_ROOT_PASSWORD

          value: password

        - name: MYSQL_DATABASE

          value: wordpress

        - name: MYSQL_USER

          value: wordpress

        - name: MYSQL_PASSWORD

          value: password




- container는 pod와 같은 ip를 가지고 있다.



- secrets

 . 64bits 인코딩 스트링으로 사용한다.

 . 1M 이하 사용 가능

 . volume 처럼, 환경 변수 처럼 사용 가능하다.


 apiVersion: v1

kind: Secret

metadata:

  name: mysql-passwords

type: Opaque

data:

  root: cm9vdC1wYXNzd29yZA==

  wordpress: d29yZHByZXNzLXBhc3N3b3Jk


- describe로 봐도 안보인다.

1. 환경변수 처럼 사용하기

piVersion: v1

kind: Pod

metadata:

  name: multi-secrets

  labels:

    app: wordpress

spec:

  containers:

    - name: wordpress

      image: wordpress

      ports:

        - containerPort: 80

        - containerPort: 443

      env:

        - name: WORDPRESS_DB_HOST

          value: 127.0.0.1

        - name: WORDPRESS_DB_USER

          value: wordpress

        - name: WORDPRESS_DB_PASSWORD

          valueFrom:

            secretKeyRef:

              name: mysql-passwords

              key: wordpress

    - name: db

      image: mysql

      env:

        - name: MYSQL_ROOT_PASSWORD

          valueFrom:

            secretKeyRef:

              name: mysql-passwords

              key: root

        - name: MYSQL_DATABASE

          value: wordpress

        - name: MYSQL_USER

          value: wordpress

        - name: MYSQL_PASSWORD

          valueFrom:

            secretKeyRef:

              name: mysql-passwords

              key: wordpress


2. volume 매핑해서 사용하기

 - 해당 폴더에 파일로 올라온다.

apiVersion: v1

kind: Pod

metadata:

  name: nginx-secrets

spec:

  containers:

    - name: nginx

      image: nginx

      volumeMounts:

        - name: secrets

          mountPath: "/etc/secrets"

          readOnly: true

  volumes:

    - name: secrets

      secret:

          secretName: mysql-passwords

 



* Service

- selector와 label 정보로 맵핑한다.




 


- 3가지 다른 유형의 서비스가 있다.

 1. Cluster IP: 내부 통신만 가능

 2. NodePort: host를 통해서 나갈 수 있다. (모든 host가 80이 되어 문제가 된다.)

 3. LoadBalancer: LB를 두어 분산 서비스를 할 수 있다.


- 서비스이름.namespace.svc.cluster.local 


apiVersion: extensions/v1beta1

kind: Deployment

metadata:

  name: wp

spec:

  replicas: 1

  template:

    metadata:

      labels:

        app: wordpress

    spec:

      containers:

        - name: wordpress

          image: wordpress

          ports:

            - containerPort: 80

            - containerPort: 443

~

~

 


root@host03-01:~/k8stest# vi wp-service.yml

apiVersion: v1

kind: Service

metadata:

  name: wp-service

  labels:

    app: wordpress

spec:

  type: LoadBalancer

  ports:

    - port: 80

      name: http

    - port: 443

      name: https

  selector:

    app: wordpress



* Volume



* Namespace

- kubectl get ns



apiVersion: v1

kind: Namespace

metadata:

  name: production

 


- namespace에 대한 context를 만들어서 해당 namespace에 대해 po 등을 볼 수 있다.


kubectl config set-context production --namespace=production 

kubectl config use-context production


- namespace 삭제시 안에 있는 서비스 모두 지워진다. 주의하자.


* Deployment

 - pod의 set으로 여러개의 replica를 관리한다.

apiVersion: extensions/v1beta1

kind: Deployment

metadata:

  name: multi-deploy

spec:

  replicas: 2

  template:

    metadata:

      labels:

        app: web-deploy

    spec:

      containers:

        - name: nginx

          image: nginx

        - name: mysql

          image: mysql

          env:

            - name: MYSQL_ROOT_PASSWORD

              value: password

 


- 확장

kubectl scale --replicas=3 deployment/multi-deploy


- update

 kubectl set image deploy/multi-deploy nginx=nginx:1.11.4


- update에 대한 rollup 을 볼 수 있다.

kubectl rollout history deployment/multi-deploy 



- rollback이 가능하다.


* DaemonSets

- swarm의 global 옵션과 같은 것으로 모든 node에 한 pod씩 배포된다.

- mgt나 agent등에 활용.


* Rolling update 가능




'디지털 양피지 > Docker' 카테고리의 다른 글

8. Open Shift  (0) 2017.07.04
7.Kubernetes - Advanced  (0) 2017.07.03
6. Kubernetes 설치  (0) 2017.06.30
6. Kubernetes  (0) 2017.06.30
5. Docker Swarm  (0) 2017.06.29
Posted by 빨간 양말