*Python If 사용법


if 조건문1:

  내용

elif  조건문2:

  내용

else:

   내용


*Python For 사용법 

for 변수 in 순서자료 :
  내용


ex) :

list = [1,2,3,4]
for i in list :
  print(i)






*Range로 반복 실행



*While 문 실행 :


*Random 숫자를 입력 받아 맞추는 소스코드 :



*함수 사용법


함수에는 Scope이 있다

- local, global, non-local


Recursion(재귀호출)

Lamda expression(람다 expression)

=> in-line 정의의 익명의 작은 함수

Generator 함수 : 사용자 정의 iterator 정의하는 함수

Decorator 함수 :  함수도 클래스로서 변수에 할당되거나 인자로서 정의될 수 있음


Ex)



*File 입출력 :

f= open('somefile.txt', 'w')

f.write('hello')

f.close()


f=open('somefile.txt', 'r')

f.read()


=> r 읽기

=> w 쓰기

=> a append

=> b binary

=> + read/write





*OOP 개념


- Class와 Object

=> Class = 설계도(사용자 정의 객체의 프로토타입)

=> Object = 기능+데이터


- 특징

=> encapsulation

=> polymorphism

=> inheritance




*Exception 처리 :







*데이터 분석용 주요 package


- iPython (python과 유사)

- numpy(수학분야)

- matplotlib(시각화)

- scipy(과학분야에서 활용)

- pandas(데이터 구조 및 다양한 분석방법 제공)


*Python 특징

-인터프리터 언어(소스코드를 바로 실행하는 환경)

- 객체지향적

- Interaction 한 언어

- Scripting언어 : 일반언어와 성능 /기능 차이가 별로 없음

- 수학적 개념이 녹아들어가 있음

- 비교적 간결, 다양한 알고리즘 적용 가능, 객체 지향개념 적용

- 배우기 쉽고, 가독성이 좋고, 유지보수성이 좋다.


*Python 종류 

- Python, Cpython은 같은것

  => C/C++ 로 작성

  => 2.7버전 : 2010년대 중반

  => 3.7 버전 : 2010년대 초반 이후 계속 발전

  => 2.7과 3.7 버전의 호환성이 깨져있다는 단점이 있다.

- Jython : JVM을 이용한 자바로 작성한 파이썬, 자바환경에서 사용

- IronPython : C#을 이용한 닷넷 환경으로 작성한 파이썬





*Python 활용 영역

- 시스템 유틸리티 작성

- GUI 프로그래밍

- C/C++과 연동 용이

- Web Programming

- 수치여난 프로그래밍

- 데이터베이스 프로그래밍

- 데이터 분석

- 사물 인터넷


*기본환경

- Python Interactive Shell - IDLE(GUI & CUI)

- 확장

=> PyDev with Eclipse

=> Pycharm

=> Komodo

=> Emacs

=> Vim

=> Text Mate

=> Gedit 등

- 웹브라우저 환경

=> IPython(3.0이상은 Jupiter)



*Python 설치 : 

https://www.python.org/downloads/release/python-365/


Windows x86-64 executable installer

로 설치



*Numpy 및 jupyter 설치


>>> pip install numpy

>>> pip install jupyter





*Jupyter Notebook 실행

>>> jupyter notebook




(Shift + Enter) 로 Run 실행 가능




*Python Data type :


- 수치형 (ex: 1, 2, -12)

- 문자형 (ex: "Hello", """long text""")

- List [1,2,3,4,5] , ['a', 'b', 'c', 'd', 'e']

=> x=[1,2,3,4]

     x[0] = 1

     x[-1] = 4

     x[1:-1] = 2, 3

     x[:3] = 처음부터 index 3까지

     x[3:]

- Tuple (1,2,3,4)

=> tuple은 immutable 하다(변경될 수 없다. 사용법은 list와 동일)

=> y=(1,2,3,4)

     y[0]

- Dictionary {kye:value, key2:value}

=>Z={"a": "apple", "b": "banana"}

     z["a"] = "apple"

     z["b"] = "banana"

 




*Python Function & Module 사용예제 :





1. 인공 지능과 인공지능 연구의 역사 :


- Environment =? cybernetics(1920-1950)

- Mind(= computer) => Symbolic AI(1950- 1980)

- Brain => Neural Nets(ML) (1980-2010)

- Body=>embodied mind, mind machine => Autonomous Robots(2010~`)


Symbolic AI vs Machine Learning

(기호.논리)       연결성(Neural Network)

                     ML에서 성능을 내기 위한 Source는 Big Data + 좋은 H/W 성능

                     이 필요하다.


*인공지능의 발전 :

Mind: Symbolic AI 

- 1997년 IBM Chess machine Deep Blue

- chatbots(Cornell Univ)


Body : Physical AI

- Humanoid Robot Nao

- Personal Robot PR2(willow Garage)

- Robot roommate shopping for and preparing bavarian breakfast

- Delivery Robots Bots


Embodied Mind

- Smart Speakers


AI가 왜 갑자기 Hot하게 됐는가?
- Machine Learning 알고리즘들이 학자들에 의해 잘 정립이 되었고

- Big Data와 Computing Power(H/W)가 맞물리면서 급속도로 발전하게됨


CNN 기반 얼굴인식 시스템이 지배적이다(?)




2. Deep Learning

모라벡의 역설(Moravec's Paradox)


- 인공지능. 로봇공학 연구자에 따르면 고등 추론에는 연산 능력이 거의 필요 없는 반면,

- 낮은 수준의 감각운동 기능은 엄청난 연산 자원이 필요.

- "어려운 문제는 쉽고 쉬운 문제는 어렵다"


*Deep Learning 의 활용

- Youtube 자동 음석 번역

- Netflix의 영화추천

- Facebook의 feed 추천

- 알파고

- 구글의 검색 결과


*CNN

- 물체들을 추상화하는 과정을 거친다


*RNN :
관련알고리즘 : LSTM, GRU

Image Narration using LSTM

자연어처리에도 많이 사용한다.



*test라는 이름으로 Kubernetes Namespace 생성 및 리소스 사용 : 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
[root@host01-4 hk]# k create ns test
namespace "test" created
[root@host01-4 hk]# k get ns
NAME          STATUS    AGE
default       Active    6h
kube-public   Active    6h
kube-system   Active    6h
test          Active    4s
[root@host01-4 hk]# ls -l
total 974676
-rw-------1 root root  50727424 May 25 10:21 dns-kube-dns
-rw-------1 root root  42481152 May 25 10:21 dns-sidecar
-rw-r--r--1 root root       158 May 25 16:18 endpoint.yaml
-rw-------1 root root 193461760 May 25 10:21 etcd-amd64
-rw-r--r--1 root root       362 May 25 12:17 hk.yaml
-rw-------1 root root  41239040 May 25 10:21 k8s-dns
-rw-r--r--1 root root       343 May 25 10:21 kubeadm.host08-1.root.log.INFO.20180525-060140.2620
-rw-r--r--1 root root       343 May 25 10:21 kubeadm.INFO
-rw-------1 root root 225319936 May 25 10:21 kube-apiserver
-rw-------1 root root 148110336 May 25 10:21 kube-controller
-rw-------1 root root  98924032 May 25 10:21 kube-proxy
-rw-------1 root root  50635776 May 25 10:21 kube-scheduler
-rw-r--r--1 root root       715 May 25 13:45 multi.yaml
-rw-r--r--1 root root       185 May 25 16:48 nodePort.yaml
-rw-r--r--1 root root       162 May 25 17:03 probe.yaml
-rw-r--r--1 root root       410 May 25 17:06 rc-probe.yaml
-rw-r--r--1 root root       302 May 25 15:51 rc.yaml
-rw-r--r--1 root root         0 May 25 15:53 service.yalm
-rw-r--r--1 root root       162 May 25 15:55 service.yaml
-rw-r--r--1 root root       322 May 25 14:11 temp.yaml
-rw-r--r--1 root root      2336 May 25 12:06 temp.yarm
-rw-r--r--1 root root        88 May 25 16:13 test-svc-h1.yaml
-rw-------1 root root  99517952 May 25 10:21 weave-kube
-rw-------1 root root  47575552 May 25 10:21 weave-npc
[root@host01-4 hk]# k create -f rc.yaml -n test
replicationcontroller "simple-rc" created
[root@host01-4 hk]# k get rc -n test
NAME        DESIRED   CURRENT   READY     AGE
simple-rc   3         3         3         9s
[root@host01-4 hk]#
[root@host01-4 hk]# k describe ns test
 
cs





LB > Node Port > Cluster IP


Node Port를 만들면 Cluster IP가 자동으로 만들어진다


*SVC 지우기

1
2
3
4
5
6
7
8
9
[root@host01-4 hk]# k get service
NAME           TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
headless-svc   ClusterIP   10.96.102.169   <none>        80/TCP    27m
kubernetes     ClusterIP   10.96.0.1       <none>        443/TCP   48m
test-svc       ClusterIP   10.96.25.31     <none>        80/TCP    45m
[root@host01-4 hk]# k delete svc test-svc
service "test-svc" deleted
[root@host01-4 hk]#
 
cs


*NodePort 생성하기(생성뒤에 해당 Port로 curl을 날릴 수 있다) : 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
vi NodePort.yaml
 
apiVersion: v1
kind: Service
metadata:
  name: test-svc
spec:
        type: NodePort
        selector:
          type: test
        ports:
        - port: 80
          targetPort: 8080
 
 
[root@host01-4 hk]# k create -f nodePort.yaml
 
service "test-svc" created
[root@host01-4 hk]#
[root@host01-4 hk]# k get svc
NAME           TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
headless-svc   ClusterIP   10.96.102.169   <none>        80/TCP         31m
kubernetes     ClusterIP   10.96.0.1       <none>        443/TCP        52m
test-svc       NodePort    10.107.213.48   <none>        80:32045/TCP   6s
 
 
#NodePort에서 80포트는 cluster IP port이고 32045는 Node Port
 
 
cs


*Load Balancer 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
k edit svc test-app
 
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: 2018-05-25T07:44:57Z
  name: test-svc
  namespace: default
  resourceVersion: "29844"
  selfLink: /api/v1/namespaces/default/services/test-svc
  uid: 85b2c6ea-5fef-11e8-8e09-005056b28b62
spec:
  clusterIP: 10.107.213.48
  externalTrafficPolicy: Cluster
  ports:
  - nodePort: 32045
    port: 80
    protocol: TCP
    targetPort: 8080
  selector:
    type: test
  sessionAffinity: None
  type: LoadBalancer            #LoadBalancer로 수정해주면...
status:
  loadBalancer: {}
 
 
[root@host01-4 hk]# k get svc
NAME           TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
headless-svc   ClusterIP      10.96.102.169   <none>        80/TCP         38m
kubernetes     ClusterIP      10.96.0.1       <none>        443/TCP        59m
test-svc       LoadBalancer   10.107.213.48   <pending>     80:32045/TCP   7m  #Node Port에 Cluster IP까지 자동 
[root@host01-4 hk]#
 
cs


상위 네트워크 모듈을 생성하면 하위 매핑 정보는 알아서 구성하게 됨




*TargetPort 설정 이유


1
2
3
4
5
6
7
 
  ports:
  - nodePort: 32045
    targetPort: 8080
 
 
 
cs


=> Cluster의 port와 pod Port 정보가 다르기 때문



*비즈니스 관점에서 Probe가 정상적으로 동작하는지 여부를 체크할 수 있어야 한다....


Client가 접속한다!!

Svc > Pod(X)

정상동작 X 다고 생각하게 된다.

이때 readinessProbe를 활용하면 cluster 정상동작 여부를 체크할 수 있다 :

1
2
3
4
5
6
7
8
9
      containers:
      - image: reg.cloud.com/kubia
        name: kubia
        readinessProbe:
          exec:
            command:
            - ls
            - /var/ready
 
cs


*ReadinessProbe 생성 예제 :


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#vi rc-probe.yaml 
# /var/ready가 pod 안에 있으면 probe에서 통과 시킨다(Ready 상태로 만들어줌)
apiVersion: v1
kind: ReplicationController
metadata:
  name: rc-readiness
spec:
  replicas: 3
  template:
    metadata:
      labels:
        type: test
    spec:
      containers:
      - image: reg.cloud.com/kubia
        name: kubia
        readinessProbe:
          exec:
            command:
            - ls
            - /var/ready
        ports:
        - containerPort: 8080
          protocol: TCP
 
 
#vi service.yaml
 
apiVersion: v1
kind: Service
metadata:
  name: test-svc
spec:
        selector:
          type: test
        ports:
        - port: 80
          targetPort: 8080
 
 
 
[root@host01-4 hk]# k create -f rc-probe.yaml
 
replicationcontroller "rc-readiness" created
[root@host01-4 hk]# k get po -o wide
NAME                 READY     STATUS    RESTARTS   AGE       IP          NODE
rc-readiness-22hxs   0/1       Running   0          10s       10.36.0.2   host01-3.cloud.com
rc-readiness-2pt29   0/1       Running   0          10s       10.44.0.1   host01-2.cloud.com
rc-readiness-h74t2   0/1       Running   0          10s       10.36.0.1   host01-3.cloud.com
 
 
#Running 상태이지만 Ready가 아무것도 없다
 
 
 
[root@host01-4 hk]# k create -f service.yaml
service "test-svc" created
[root@host01-4 hk]# k get svc
NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1     <none>        443/TCP   6m
test-svc     ClusterIP   10.98.99.22   <none>        80/TCP    4s
[root@host01-4 hk]# k get ep
NAME         ENDPOINTS          AGE
kubernetes   10.10.12.14:6443   6m
test-svc                        9s
 
 
#Endpoint가 아무것도 안 떠있다.
 
[root@host01-4 hk]# k exec rc-readiness-22hxs -- touch /var/ready
 
#1번 pod에 /var/ready를 만들어준다 (Ready 상태로 만들어주기 위해)
 
[root@host01-4 hk]# k get ep
NAME         ENDPOINTS          AGE
kubernetes   10.10.12.14:6443   8m
test-svc     10.36.0.2:8080     1m
 
#test-svc의 ENDPOINT가 enabled된다
 
[root@host01-4 hk]# k get svc
NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1     <none>        443/TCP   8m
test-svc     ClusterIP   10.98.99.22   <none>        80/TCP    1m
 
[root@host01-4 hk]# k get po -o wide
NAME                 READY     STATUS    RESTARTS   AGE       IP          NODE
rc-readiness-22hxs   1/1       Running   0          4m        10.36.0.2   host01-3.cloud.com
rc-readiness-2pt29   0/1       Running   0          4m        10.44.0.1   host01-2.cloud.com
rc-readiness-h74t2   0/1       Running   0          4m        10.36.0.1   host01-3.cloud.com
 
#1번 Pod가 Ready 상태로 바뀐다
 
 
[root@host01-4 hk]# k exec rc-readiness-2pt29 -- touch /var/ready
[root@host01-4 hk]# k get po -o wide
NAME                 READY     STATUS    RESTARTS   AGE       IP          NODE
rc-readiness-22hxs   1/1       Running   0          5m        10.36.0.2   host01-3.cloud.com
rc-readiness-2pt29   1/1       Running   0          5m        10.44.0.1   host01-2.cloud.com
rc-readiness-h74t2   0/1       Running   0          5m        10.36.0.1   host01-3.cloud.com
 
#2번 Pod Ready 상태로 바뀐다
 
 
 
 
cs






*Pod = 컨테이너 그룹

rc로 제어되는 pod는 삭제하면 다시 생성된다

반면 자체적으로 만든 pod는 삭제하면 재생성되지 않음



*멀티 컨테이너 :

- create pod

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
multi.yaml
 
apiVersion: v1
kind: Pod
metadata:
  name: multi
  labels:
    app: wordpress
spec:
  containers:
    - name: wordpress
      image: reg.cloud.com/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: reg.cloud.com/mysql
      env:
        - name: MYSQL_ROOT_PASSWORD
          value: password
        - name: MYSQL_DATABASE
          value: wordpress
        - name: MYSQL_USER
          value: wordpress
        - name: MYSQL_PASSWORD
          value: password
 
 
[root@host01-4 hk]# k create -f multi.yaml
 
cs



- 멀티 컨테이너에서는 컨테이너를 지정해서 들어갈 수 있다(DB랑 web이 하나의 포드로 묶여있기 때문에 좋은 구성은 아니다).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
[root@host01-4 hk]# k get po -o wide
NAME               READY     STATUS    RESTARTS   AGE       IP          NODE
multi              2/2       Running   1          1m        10.44.0.2   host01-2.cloud.com
nginx-app-7qpbv    1/1       Running   0          1h        10.36.0.1   host01-3.cloud.com
nginx-app2-tgqqf   1/1       Running   0          1h        10.36.0.2   host01-3.cloud.com
nginx-hk-app       1/1       Running   0          1h        10.44.0.1   host01-2.cloud.com
[root@host01-4 hk]# k exec -it multi -c wordpress sh
# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
18: eth0@if19: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1376 qdisc noqueue state UP group default
    link/ether 32:a0:1d:fb:91:b1 brd ff:ff:ff:ff:ff:ff
    inet 10.44.0.2/12 brd 10.47.255.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::30a0:1dff:fefb:91b1/64 scope link tentative dadfailed
       valid_lft forever preferred_lft forever
# ^C
# hostname
multi
# [root@host01-4 hk]# k exec -it multi -c db sh
# mysql
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
# mysql -uroot -p
Enter password:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
#
 
cs





*Label 정보 확인

1
2
3
4
5
6
7
8
9
 
[root@host01-4 hk]# k get po --show-labels
NAME               READY     STATUS    RESTARTS   AGE       LABELS
multi              2/2       Running   1          5m        app=wordpress
nginx-app-7qpbv    1/1       Running   0          1h        run=nginx-app
nginx-app2-tgqqf   1/1       Running   0          1h        type=test
nginx-hk-app       1/1       Running   0          1h        type=web
[root@host01-4 hk]#
 
cs


*Label 조회/생성/Overwrite

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@host01-4 hk]# k get po --show-labels
NAME               READY     STATUS    RESTARTS   AGE       LABELS
multi              2/2       Running   1          5m        app=wordpress
nginx-app-7qpbv    1/1       Running   0          1h        run=nginx-app
nginx-app2-tgqqf   1/1       Running   0          1h        type=test
nginx-hk-app       1/1       Running   0          1h        type=web
[root@host01-4 hk]# ^C
[root@host01-4 hk]# k label po simple-pod loc=seoul
Error from server (NotFound): pods "simple-pod" not found
[root@host01-4 hk]# k label po nginx-app-7qpbv loc=seoul
pod "nginx-app-7qpbv" labeled
[root@host01-4 hk]# k label po nginx-app-7qpbv type=was --overwrite
pod "nginx-app-7qpbv" labeled
[root@host01-4 hk]#
 
cs



*Pod 찾기(-l 옵션으로 key=value 방식으로 가져올 수 있음) :

1
2
3
4
5
6
7
8
9
10
11
[root@host01-4 hk]# k get po -l type=test
NAME               READY     STATUS    RESTARTS   AGE
nginx-app2-tgqqf   1/1       Running   0          1h
[root@host01-4 hk]# ^C
[root@host01-4 hk]# k get po -l type
NAME               READY     STATUS    RESTARTS   AGE
nginx-app-7qpbv    1/1       Running   0          1h
nginx-app2-tgqqf   1/1       Running   0          1h
nginx-hk-app       1/1       Running   0          1h
[root@host01-4 hk]#
 
cs


*Pod 찾기(-L : Label로 찾기)

1
2
3
4
5
6
7
8
[root@host01-4 hk]# k get po -L app,type,loc
NAME               READY     STATUS    RESTARTS   AGE       APP         TYPE      LOC
multi              2/2       Running   1          11m       wordpress
nginx-app-7qpbv    1/1       Running   0          1h                    was       seoul
nginx-app2-tgqqf   1/1       Running   0          1h                    test
nginx-hk-app       1/1       Running   0          1h                    web
[root@host01-4 hk]#
 
cs



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[root@host01-4 hk]# k get po
NAME               READY     STATUS    RESTARTS   AGE
multi              2/2       Running   1          15m
nginx-app-7qpbv    1/1       Running   0          1h
nginx-app2-tgqqf   1/1       Running   0          1h
nginx-hk-app       1/1       Running   0          1h
nginx-hk-app2      0/1       Pending   0          32s
[root@host01-4 hk]# k get no
NAME                 STATUS    ROLES     AGE       VERSION
host01-2.cloud.com   Ready     <none>    3h        v1.10.3
host01-3.cloud.com   Ready     <none>    3h        v1.10.3
host01-4.cloud.com   Ready     master    3h        v1.10.3
 
[root@host01-4 hk]# k label no host01-2.cloud.com gpu=true
node "host01-2.cloud.com" labeled
[root@host01-4 hk]# k get no --show-labels
NAME                 STATUS    ROLES     AGE       VERSION   LABELS
host01-2.cloud.com   Ready     <none>    3h        v1.10.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,gpu=true,kubernetes.io/hostname=host01-2.cloud.com
host01-3.cloud.com   Ready     <none>    3h        v1.10.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=host01-3.cloud.com
host01-4.cloud.com   Ready     master    3h        v1.10.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=host01-4.cloud.com,node-role.kubernetes.io/master=
[root@host01-4 hk]# k get po -o wide
NAME               READY     STATUS    RESTARTS   AGE       IP          NODE
multi              2/2       Running   1          17m       10.44.0.2   host01-2.cloud.com
nginx-app-7qpbv    1/1       Running   0          1h        10.36.0.1   host01-3.cloud.com
nginx-app2-tgqqf   1/1       Running   0          1h        10.36.0.2   host01-3.cloud.com
nginx-hk-app       1/1       Running   0          1h        10.44.0.1   host01-2.cloud.com
nginx-hk-app2      1/1       Running   0          3m        10.44.0.3   host01-2.cloud.com
 
cs





* 전체 삭제

1
2
3
4
5
6
7
[root@host01-4 hk]# k delete all --all
pod "multi" deleted
service "kubernetes" deleted
[root@host01-4 hk]# k get rc
No resources found.
[root@host01-4 hk]#
 
cs


*create rc(2replicas) + describe

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
apiVersion: v1
kind: ReplicationController
metadata:
  labels:
  name: simple-rc
spec:
  replicas: 2
  template:
    metadata:
      labels:
        type: test
    spec:
      containers:
      - image: reg.cloud.com/nginx
        name: nginx-app
        ports:
        - containerPort: 80
          protocol: TCP
 
 
[root@host01-4 hk]# k create -f rc.yaml
replicationcontroller "simple-rc" created
[root@host01-4 hk]# get rc
-bash: get: command not found
[root@host01-4 hk]# k get rc
NAME        DESIRED   CURRENT   READY     AGE
simple-rc   2         2         2         5s
[root@host01-4 hk]# k get po -o wide
NAME              READY     STATUS    RESTARTS   AGE       IP          NODE
simple-rc-26m58   1/1       Running   0          21s       10.44.0.1   host01-2.cloud.com
simple-rc-7htdc   1/1       Running   0          21s       10.36.0.1   host01-3.cloud.com
[root@host01-4 hk]# vi rc.yaml
 
 
[root@host01-4 hk]# k describe rc simple-rc
Name:         simple-rc
Namespace:    default
Selector:     type=test
Labels:       type=test
Annotations:  <none>
Replicas:     2 current / 2 desired
Pods Status:  2 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
  Labels:  type=test
  Containers:
   nginx-app:
    Image:        reg.cloud.com/nginx
    Port:         80/TCP
    Host Port:    0/TCP
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Events:
  Type    Reason            Age   From                    Message
  ----    ------            ----  ----                    -------
  Normal  SuccessfulCreate  1m    replication-controller  Created pod: simple-rc-7htdc
  Normal  SuccessfulCreate  1m    replication-controller  Created pod: simple-rc-26m58
[root@host01-4 hk]#
 
cs



*Label 조회

1
2
3
4
5
6
[root@host01-4 hk]# k get po --show-labels
NAME              READY     STATUS    RESTARTS   AGE       LABELS
simple-rc-26m58   1/1       Running   0          2m        type=test
simple-rc-7htdc   1/1       Running   0          2m        type=test
[root@host01-4 hk]#
 
cs


*Label 값 수정 : 

1
2
3
4
5
6
7
8
root@host01-4 hk]# k label po simple-rc-26m58 loc=se
pod "simple-rc-26m58" labeled
[root@host01-4 hk]# k get po --show-labels
NAME              READY     STATUS    RESTARTS   AGE       LABELS
simple-rc-26m58   1/1       Running   0          3m        loc=se,type=test
simple-rc-7htdc   1/1       Running   0          3m        type=test
[root@host01-4 hk]#
 
cs


*Label overwrite(하나의 pod가 추가 생성된다)

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@host01-4 hk]# k get po --show-labels
NAME              READY     STATUS    RESTARTS   AGE       LABELS
simple-rc-26m58   1/1       Running   0          4m        loc=se,type=test
simple-rc-7htdc   1/1       Running   0          4m        type=test
[root@host01-4 hk]# k label po simple-rc-26m58 type=op --overwrite
pod "simple-rc-26m58" labeled
[root@host01-4 hk]# k get po --show-labels
NAME              READY     STATUS    RESTARTS   AGE       LABELS
simple-rc-26m58   1/1       Running   0          5m        loc=se,type=op
simple-rc-7htdc   1/1       Running   0          5m        type=test
simple-rc-bts7r   1/1       Running   0          3s        type=test
[root@host01-4 hk]#
 
cs


*RC replicas Scale out :

1
2
3
[root@host01-4 hk]# k scale rc simple-rc --replicas=3
replicationcontroller "simple-rc" scaled
 
cs


*RC를 yaml 파일로 띄워서 수정(replicas부분을 2로 변경 시 바로 2개로 수정되어 뜬다- 1가 죽음)

1
2
3
4
5
6
7
8
9
[root@host01-4 hk]# k edit rc simple-rc
replicationcontroller "simple-rc" edited
[root@host01-4 hk]# k get po --show-labels
NAME              READY     STATUS        RESTARTS   AGE       LABELS
simple-rc-26m58   1/1       Running       0          8m        loc=se,type=op
simple-rc-7htdc   1/1       Running       0          8m        type=test
simple-rc-9cmhk   0/1       Terminating   0          51s       type=test
simple-rc-bts7r   1/1       Running       0          3m        type=test
 
cs


*disk를 ssd로 해서 띄우기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
apiVersion: apps/v1beta2
kind: DaemonSet
metadata:
  name: simple-ds
spec:
  selector:
    matchLabels:
      type: app #selector는 template.labels.type과 
  template:
    metadata:
      labels:
        type: app
    spec:
      nodeSelector:
        disk: ssd  # 추가됨
      containers:
      - image: reg.cloud.com/nginx
        name: nginx-app
        ports:
        - containerPort: 80
          protocol: TCP
 
 
[root@host01-4 hk]# vi rc.yaml
[root@host01-4 hk]# k create -f rc.yaml
daemonset.apps "simple-ds" created
[root@host01-4 hk]#
 
cs


*node 조회

1
2
3
4
5
6
[root@host01-4 hk]# k get no
NAME                 STATUS    ROLES     AGE       VERSION
host01-2.cloud.com   Ready     <none>    4h        v1.10.3
host01-3.cloud.com   Ready     <none>    4h        v1.10.3
host01-4.cloud.com   Ready     master    4h        v1.10.3
 
cs


*Labeling 후 pod로 ssd가 생성이 되었는지 확인(disk=ssd)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[root@host01-4 hk]# k get no
NAME                 STATUS    ROLES     AGE       VERSION
host01-2.cloud.com   Ready     <none>    4h        v1.10.3
host01-3.cloud.com   Ready     <none>    4h        v1.10.3
host01-4.cloud.com   Ready     master    4h        v1.10.3
[root@host01-4 hk]# k label no host01-2.cloud.com disk=ssd
node "host01-2.cloud.com" labeled
[root@host01-4 hk]# get no --show-labels
-bash: get: command not found
[root@host01-4 hk]# k get no --show-labels
NAME                 STATUS    ROLES     AGE       VERSION   LABELS
host01-2.cloud.com   Ready     <none>    4h        v1.10.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,disk=ssd,gpu=true,kubernetes.io/hostname=host01-2.cloud.com
host01-3.cloud.com   Ready     <none>    4h        v1.10.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=host01-3.cloud.com
host01-4.cloud.com   Ready     master    4h        v1.10.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=host01-4.cloud.com,node-role.kubernetes.io/master=
[root@host01-4 hk]# k get ds
NAME        DESIRED   CURRENT   READY     UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
simple-ds   1         1         1         1            1           disk=ssd        3m
[root@host01-4 hk]# k get po -o wide
NAME              READY     STATUS    RESTARTS   AGE       IP          NODE
simple-ds-vv5lp   1/1       Running   0          1m        10.44.0.3   host01-2.cloud.com
simple-rc-26m58   1/1       Running   0          22m       10.44.0.1   host01-2.cloud.com
simple-rc-7htdc   1/1       Running   0          22m       10.36.0.1   host01-3.cloud.com
simple-rc-bts7r   1/1       Running   0          17m       10.44.0.2   host01-2.cloud.com
[root@host01-4 hk]#
 
cs



*Labeling을 disk=hhd로 overwrite 할 시 다시 pod 리스트에서 빠져버린다.


1
2
3
4
[root@host01-4 hk]# k get ds
NAME        DESIRED   CURRENT   READY     UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
simple-ds   0         0         0         0            0           disk=ssd        8m
 
cs

1
2
3
4
5
6
7
8
9
[root@host01-4 hk]# k label no host01-2.cloud.com disk=hdd --overwrite
node "host01-2.cloud.com" labeled
 
[root@host01-4 hk]# k get po -o wide
NAME              READY     STATUS    RESTARTS   AGE       IP          NODE
simple-rc-26m58   1/1       Running   0          23m       10.44.0.1   host01-2.cloud.com
simple-rc-7htdc   1/1       Running   0          23m       10.36.0.1   host01-3.cloud.com
simple-rc-bts7r   1/1       Running   0          18m       10.44.0.2   host01-2.cloud.com
 
cs




*내부 연결에 있어서는 Cluster IP가 Core Service!!!

(External LB > Node Port(Kubernetes) > Cluster IP(Kubernetes))


네임으로 날리면 DNS에서 제어해서 

알아서 백단의 VIP로 redirection 시켜준다


1) External LB => Node Port=> DB(NS) => VIP => DB POD

2) External LB => Node Port=> LB(NS) => VIP => WEB POD1, WEB POD2



*kubectl pod Watch 명령어 :

1
2
3
4
5
[root@host01-4 hk]# k get po -o wide --watch
NAME              READY     STATUS    RESTARTS   AGE       IP        NODE
simple-rc-bdvs6   0/1       Pending   0          38s       <none>    <none>
simple-rc-d5h74   0/1       Pending   0          38s       <none>    <none>
simple-rc-fq6hl   0/1       Pending   0          38s       <none>    <none>
cs

 




*Service 만들기(Cluster IP = 내부 LB역할을 한다) - Pod IP는 가변적으로 기억할 필요 없음 :


-service 조회

1
2
3
4
5
[root@host01-4 hk]# k get svc
NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1     <none>        443/TCP   12m
test-svc     ClusterIP   10.96.25.31   <none>        80/TCP    8m
 
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
vi service yalm
 
apiVersion: v1
kind: Service
metadata:
  name: test-svc
spec:
        selector:
          type: test
        ports:
        - port: 80
          targetPort: 8080
 
[root@host01-4 hk]# k create -f service.yaml
service "test-svc" created
 
[root@host01-4 hk]# k get service
NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1     <none>        443/TCP   3m
test-svc     ClusterIP   10.96.25.31   <none>        80/TCP    6s
 
 
[root@host01-4 hk]# k get po -o wide
NAME              READY     STATUS    RESTARTS   AGE       IP          NODE
simple-rc-c8bcs   1/1       Running   0          4m        10.36.0.1   host01-3.cloud.com
simple-rc-nfssk   1/1       Running   0          4m        10.44.0.1   host01-2.cloud.com
simple-rc-zgcjv   1/1       Running   0          4m        10.36.0.2   host01-3.cloud.com
[root@host01-4 hk]# curl 10.96.25.31
You've hit simple-rc-zgcjv
[root@host01-4 hk]# curl 10.96.25.31
You've hit simple-rc-c8bcs
[root@host01-4 hk]# curl 10.96.25.31
You've hit simple-rc-zgcjv
cs


*Service 이름 만으로 Curl 가능

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@host01-4 hk]# k exec -it simple-rc-c8bcs bash
root@simple-rc-c8bcs:/# curl http://test-svc
 
You've hit simple-rc-c8bcs
root@simple-rc-c8bcs:/#
root@simple-rc-c8bcs:/# cat /etc/resolv.conf
nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local cloud.com
options ndots:5
root@simple-rc-c8bcs:/# curl http://test-svc.default
You've hit simple-rc-zgcjv
root@simple-rc-c8bcs:/# curl http://test-svc.default.svc
You've hit simple-rc-zgcjv
cs


*한번 연결되면 동일 Client는 동일 IP로 가도록 설정(similar to Sticky Session) : 


1
2
sessionAffinity: ClientIP  #  부분을 ClientIP로 바꿔주면 Sticky Session으로 변경된다
 
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
 
 
 
[root@host01-4 hk]# k edit svc test-svc
service "test-svc" edited
 
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: 2018-05-25T06:55:52Z
  name: test-svc
  namespace: default
  resourceVersion: "25644"
  selfLink: /api/v1/namespaces/default/services/test-svc
  uid: aa440afa-5fe8-11e8-8e09-005056b28b62
spec:
  clusterIP: 10.96.25.31
  ports:
  - port: 80
    protocol: TCP
    targetPort: 8080
  selector:
    type: test
  sessionAffinity: ClientIP  #  부분을 ClientIP로 바꿔주면 Sticky Session으로 변경된다
  type: ClusterIP
status:
  loadBalancer: {}
 
 
[root@host01-4 hk]# k get svc
NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1     <none>        443/TCP   15m
test-svc     ClusterIP   10.96.25.31   <none>        80/TCP    11m
 
[root@host01-4 hk]# k get pod -o wide
NAME              READY     STATUS    RESTARTS   AGE       IP          NODE
simple-rc-c8bcs   1/1       Running   0          15m       10.36.0.1   host01-3.cloud.com
simple-rc-nfssk   1/1       Running   0          15m       10.44.0.1   host01-2.cloud.com
simple-rc-zgcjv   1/1       Running   0          15m       10.36.0.2   host01-3.cloud.com
 
[root@host01-4 hk]# curl 10.96.25.31
You've hit simple-rc-nfssk
[root@host01-4 hk]# curl 10.96.25.31
You've hit simple-rc-nfssk
[root@host01-4 hk]# curl 10.96.25.31
You've hit simple-rc-nfssk
[root@host01-4 hk]#
cs



*Service Endpoint 확인(매핑 정보를 알 수 있다) :

1
2
3
4
5
[root@host01-4 hk]# k get ep
NAME         ENDPOINTS                                      AGE
kubernetes   10.10.12.14:6443                               17m
test-svc     10.36.0.1:8080,10.36.0.2:8080,10.44.0.1:8080   13m
 
cs




*Endpoint 만들기


endpoint는 service와 이름(label name)이 같아야 한다:

> k get svc 

입력 시 뜨는 name과 동일...그 이후에 

> k get ep 

를 입력 시 endpoint로 ip port가 잘 매핑되어 출력되는 것을 확인 할 수 있다



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
[root@host01-4 hk]# k get svc
NAME           TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
headless-svc   ClusterIP   10.96.102.169   <none>        80/TCP    2m
kubernetes     ClusterIP   10.96.0.1       <none>        443/TCP   23m
test-svc       ClusterIP   10.96.25.31     <none>        80/TCP    19m
 
vi endpoint.yaml
 
apiVersion: v1
kind: Endpoints
metadata:
  name: headless-svc
subsets:
  - addresses:
    - ip: 10.10.10.10
    - ip: 11.11.11.11
    ports:
      - port: 80
 
 
#위에서 metadata.name = service name(headless-svc )과 같아야 한다
 
 
 
[root@host01-4 hk]# k create -f endpoint.yaml
endpoints "headless-svc" created
[root@host01-4 hk]# k get service
NAME           TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
headless-svc   ClusterIP   10.96.102.169   <none>        80/TCP    6m
kubernetes     ClusterIP   10.96.0.1       <none>        443/TCP   27m
test-svc       ClusterIP   10.96.25.31     <none>        80/TCP    23m
 
[root@host01-4 hk]# k get ep
NAME           ENDPOINTS                                      AGE
headless-svc   10.10.10.10:80,11.11.11.11:80                  19s
kubernetes     10.10.12.14:6443                               27m
test-svc       10.36.0.1:8080,10.36.0.2:8080,10.44.0.1:8080   24m
 
cs

+ Recent posts