티스토리 뷰

○ yaml 파일 생성하기 전에 편리한 설정 확인

[vagrant@ms work]$ cat $HOME/.vimrc
autocmd FileType yaml setlocal ts=2 sts=2 sw=2 expandtab autoindent

 

 

○ pod version 확인

 

[vagrant@ms ~]$ kubectl api-resources | grep -i -w pod
pods                              po           v1                                true         Pod

 

 

○ kind 는 대문자로 등록되어 있다 >> yaml 에는 kind 로 적었다

[vagrant@ms ~]$ kubectl api-resources | head -n 1
NAME                              SHORTNAMES   APIVERSION                        NAMESPACED   KIND

 

 

● apache.yml 파일 생성

# kubernetes 는 syntax-check 없다..

>> 파일 형식 기억하자 ( 순서 등등.. )

>> 거의 90 % 이상은 apiVersion / kind / metadata 까지는 들어간다

>> Podspec 이 꼭 들어가줘야 한다

>>> 컨테이너의 정보가 들어간다

>> label 은 없어도 된다

---
apiVersion: v1
kind: Pod
metadata:
  name: apache-pod
#  labels:
#    app: myweb
spec:
  containers:
  - name: myweb-container
    image: httpd:2.4
    ports:
      - containerPort: 80

 

▩ 문제 있으면 에러 뜸

 

○ 문제가 없으면 바로 에러가 뜨지 않는다

[vagrant@ms work]$ kubectl apply -f apache.yml
pod/apache-pod created

 

kubectl get pods

 

 

# wide 를 쓰면 주소를 알 수 있다

[vagrant@ms work]$ kubectl get pods -o wide
NAME         READY   STATUS    RESTARTS   AGE     IP           NODE              NOMINATED NODE   READINESS GATES
apache-pod   1/1     Running   0          2m35s   10.244.1.3   wk1.example.com   <none>           <none>

 

 

● 컨테이너에 접속

# 컨테이너 명이 아니라 파드 명으로 들어간다

[vagrant@ms work]$ kubectl exec -it apache-pod /bin/bash

 

>> 접속은 됐으나 다음 버전부터는 안 될테니 새로운 방법을 알려주었다

 

 

○ 정상 접속하여 index.html 생성

[vagrant@ms work]$ kubectl exec -it apache-pod -- /bin/bash

root@apache-pod:/usr/local/apache2# echo "hello kububububub" > htdocs/index.html
root@apache-pod:/usr/local/apache2# exit
[vagrant@ms work]$ curl 10.244.1.3
hello kububububub

 

 

 

● 포트포워딩으로 windows 에서 접속 가능하도록 설정

# kind 는 항상 첫 글자가 대문자이다

# targetPort 에서 P 대문자 주의

[vagrant@ms work]$ cat myweb-service.yml
---
apiVersion: v1
kind: Service
metadata:
  name: myweb-service
spec:
  ports:
  - port: 8001
    targetPort: 80


  selector:
    myapp: myweb

 

 

 

○ service 는 pod 가 아니다

>> 바로 올라간다

▷ ClusterIP 는 ms 와 wk1 , 2 가 하나로 묶어서 쓰는 IP 를 의미한다 ( 컴퓨터 3대가 묶여있는 IP )

[vagrant@ms work]$ kubectl apply -f myweb-service.yml
service/myweb-service created

[vagrant@ms work]$ kubectl get service
NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
myweb-service   ClusterIP   10.101.11.242   <none>        8001/TCP   5s

 

>> 문제를 해결해야한다

 

 

 

# Cluster IP 를 지나서 Entdpoint 에서 나눠져야 한다

# Endpoint IP 는 Pod의 주소이다 >> Pod 가 여러개가 있으면 원하는  pod 로 보내줘야 한다

>> 찾는 방법을 이해해야 한다

 

>> Endpoints 가 모르는 상태이다

[vagrant@ms work]$ kubectl describe svc myweb-service

 

>> 라벨 확인

[vagrant@ms work]$ kubectl get pods --show-labels

 

 

>> 추가로 더 pod 를 올렸다

[vagrant@ms work]$ kubectl run mynginx --image
apache.yml         myweb-service.yml  ns.yml
[vagrant@ms work]$ kubectl run mynginx --image nginx
pod/mynginx created
[vagrant@ms work]$ kubectl run myapache --image httpd
pod/myapache created
[vagrant@ms work]$ kubectl get pods
NAME         READY   STATUS    RESTARTS   AGE
apache-pod   1/1     Running   0          13m
myapache     1/1     Running   0          4s
mynginx      1/1     Running   0          22s

 

 

왼쪽이 키 오른쪽이 value?

 

 

>> service 는 라벨을 보고 찾는다

>> label 주석 제거

[vagrant@ms work]$ cat apache.yml
---
apiVersion: v1
kind: Pod
metadata:
  name: apache-pod
  labels:
    app: myweb
spec:
  containers:
  - name: myweb-container
    image: httpd:2.4
    ports:
      - containerPort: 80

 

 

○ create 는 같은 이름이 있으면 생성 안되나 / apply 는 업데이트 해준다

[vagrant@ms work]$ kubectl create -f apache.yml
Error from server (AlreadyExists): error when creating "apache.yml": pods "apache-pod" already exists
[vagrant@ms work]$ kubectl apply -f
apache.yml         myweb-service.yml  ns.yml
[vagrant@ms work]$ kubectl apply -f apache.yml
pod/apache-pod configured
[vagrant@ms work]$ kubectl get pods --show-labels
NAME         READY   STATUS    RESTARTS   AGE     LABELS
apache-pod   1/1     Running   0          17m     app=myweb
myapache     1/1     Running   0          3m16s   run=myapache
mynginx      1/1     Running   0          3m34s   run=mynginx

>>> 위에서는 apache-pod 의 LABELS 가 app=myweb 이다

 

>> apache.yml 의 LABELS 을 myweb-service.yml 의 selector 와 맞춰주면, Endpoints 를 찾을 수 있다

 

>> service 가 pod 보다 더 상위에 위치하고 있다

 

 

 

>> 위 그림처럼 서로 맞춰주고 apache.yml 적용

[vagrant@ms work]$ kubectl apply -f apache.yml
[vagrant@ms work]$ kubectl describe  svc myweb-service

EndPoints 를 찾았다
위 사진의 IP 는 CLUSTER-IP

 

○ 아주 잘 된다

# Endpoints 는 포트번호 안 써도 됐다

# CLUSTER-IP 는 포트번호를 붙여야 접속된다

 

 

 

 

● service 는 selector 이며, selector 는 pods 의 Label 만 찾는다

 

◎ pod IP

 

 

◎ service 의 CLUSTER-IP

 

 

# 출력은 되지 않으나, 8001 포트로 지정하면 설정이 된다

# proxy 처리...?

sudo iptables -t nat -L -n | grep 8001

 

 

# 하나의 파드 내부에 있는 container 들은 파드의 IP 를 사용하는데, 컨테이너 구별은 PortNumber 로 구별한다

 

 

● 하지만, 아직 Host ms Windows 에서 접속이 안된다

>> type 을 지정해줘야한다

>> NodePort 대소문자 구별하기

 

 

 

▶ apply 로 바뀌거나 안바뀌거나 알 수 있다

>> TYPE 이 Cluster-IP 에서 NodePort 로 변경됨

>> NodePort 는 32183 으로 지정되었다

>> 32183 의 NodePort 로 패킷이 들어오면 8001 포트면서, Cluster-IP 10.101.11.242 로 보낸다

>>> 그리고 Endpoints 로 보내진다

# Cluster IP 는 서비스가 쓰는 IP 이다

# NodePort 는 가장 상층부에 뚫린다고 생각하자

 

▷ cluster 로 묶여있기 때문에 3개의 IP 중에 한개로 접속한다

 

 

 

 

 

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/09   »
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
글 보관함