본문 바로가기

DevOps/쿠버네티스

쿠버네티스 service를 사용한 네트워크 설정

POD 배포하기

test-pod.yml

<span class="pln">apiVersion</span><span class="pun">:</span><span class="pln"> v1
kind</span><span class="pun">:</span><span class="pln"> </span><span class="typ">ReplicationController</span><span class="pln">
metadata</span><span class="pun">:</span><span class="pln">
  name</span><span class="pun">:</span><span class="pln"> kubia
spec</span><span class="pun">:</span><span class="pln">
  replicas</span><span class="pun">:</span><span class="pln"> </span><span class="lit">3</span><span class="pln">
  selector</span><span class="pun">:</span><span class="pln">
    app</span><span class="pun">:</span><span class="pln"> kubia
  </span><span class="kwd">template</span><span class="pun">:</span><span class="pln">
    metadata</span><span class="pun">:</span><span class="pln">
      labels</span><span class="pun">:</span><span class="pln">
        app</span><span class="pun">:</span><span class="pln"> kubia
    spec</span><span class="pun">:</span><span class="pln">
      containers</span><span class="pun">:</span><span class="pln">
      </span><span class="pun">-</span><span class="pln"> name</span><span class="pun">:</span><span class="pln"> kubia
        image</span><span class="pun">:</span><span class="pln"> reg</span><span class="pun">.</span><span class="pln">cloud</span><span class="pun">.</span><span class="pln">com</span><span class="pun">/</span><span class="pln">kubia
        ports</span><span class="pun">:</span><span class="pln">
        </span><span class="pun">-</span><span class="pln"> containerPort</span><span class="pun">:</span><span class="pln"> </span><span class="lit">8080</span>

$ k create -f test-pod.yml

## test pod 실행 총 3개 실행 8080으로 열기

Service 배포하기

test-service.yml

<span class="pln">apiVersion</span><span class="pun">:</span><span class="pln"> v1
kind</span><span class="pun">:</span><span class="pln"> </span><span class="typ">Service</span><span class="pln">
metadata</span><span class="pun">:</span><span class="pln">
  name</span><span class="pun">:</span><span class="pln"> kubia
spec</span><span class="pun">:</span><span class="pln">
  ports</span><span class="pun">:</span><span class="pln">
  </span><span class="pun">-</span><span class="pln"> port</span><span class="pun">:</span><span class="pln"> </span><span class="lit">80</span><span class="pln"> </span><span class="com">##clusterIP port</span><span class="pln">
    targetPort</span><span class="pun">:</span><span class="pln"> </span><span class="lit">8080</span><span class="pln"> </span><span class="com">## pod port</span><span class="pln">
  selector</span><span class="pun">:</span><span class="pln">
    app</span><span class="pun">:</span><span class="pln"> kubia </span><span class="com">## 대상 pod</span>

$ k create -f test-service.yml

## service 실행



## service로 만든 LB인 10.96.187.178로 호출해도 정상적으로 호출됨(internal dns통해서 실제 ip찾아서 연결시킴)


외부와 연결하기


$ k edit svc kubia

## service의 type을 NodePort로 변경하기

## ClusterIP를 지우고 NodePort로 입력, 저장

(대소문자 띄어쓰기 주의!!)


$ k get svc

$ k get po -o wide

ip a 

## ens192에 매칭되는 ip를 찾고, service의 port를 찾는다.




ens192의 ipservice와 매칭되는 port 즉, http://10.10.12.141:31143 를 접속하면 아래와 같이 외부에서도 접속된다.



session affinity 구성

## 외부로 부터 처음 호출받을때는 random, 그러나 지속적으로 해당 ip로 부터 call올때는 한개의 서버와만 통신하도록 할때 아래와 같이 설


$ k edit service kubia



## sessionAffinity : None -> ClinetIP

(대소문자 띄어쓰기 주의!!)


동일 서비스에 여러 포트 사용

## 명시적으로 할 경우
<span class="pln">apiVersion</span><span class="pun">:</span><span class="pln"> v1
kind</span><span class="pun">:</span><span class="pln"> </span><span class="typ">Service</span><span class="pln">
metadata</span><span class="pun">:</span><span class="pln">
  name</span><span class="pun">:</span><span class="pln"> kubia
spec</span><span class="pun">:</span><span class="pln">
  ports</span><span class="pun">:</span><span class="pln">
  </span><span class="pun">-</span><span class="pln"> port</span><span class="pun">:</span><span class="pln"> </span><span class="lit">80</span><span class="pln"> </span><span class="com">## 내부 cilentIP는 8080으로 매칭</span><span class="pln">
    targetPort</span><span class="pun">:</span><span class="pln"> </span><span class="lit">8080</span><span class="pln">
  </span><span class="pun">-</span><span class="pln"> port</span><span class="pun">:</span><span class="pln"> </span><span class="lit">443</span><span class="pln"> </span><span class="com">## 내부 clientIP는 1443으로 매칭</span><span class="pln">
    targetPort</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1443</span><span class="pln">
  selector</span><span class="pun">:</span><span class="pln">
    app</span><span class="pun">:</span><span class="pln"> kubia </span><span class="com">## 대상 pod</span>

## 비 명시적으로 할 경우
<span class="pln">apiVersion</span><span class="pun">:</span><span class="pln"> v1
kind</span><span class="pun">:</span><span class="pln"> </span><span class="typ">Service</span><span class="pln">
metadata</span><span class="pun">:</span><span class="pln">
  name</span><span class="pun">:</span><span class="pln"> kubia
spec</span><span class="pun">:</span><span class="pln">
  ports</span><span class="pun">:</span><span class="pln">
  </span><span class="pun">-</span><span class="pln"> port</span><span class="pun">:</span><span class="pln"> </span><span class="lit">80</span><span class="pln"> </span><span class="com">## 내부 cilentIP는 자동으로 80으로 매칭</span><span class="pln">
  </span><span class="pun">-</span><span class="pln"> port</span><span class="pun">:</span><span class="pln"> </span><span class="lit">443</span><span class="pln"> </span><span class="com">## 내부 clientIP는 자동으로 443으로 매칭</span><span class="pln">
  selector</span><span class="pun">:</span><span class="pln">
    app</span><span class="pun">:</span><span class="pln"> kubia </span><span class="com">## 대상 pod</span>


DNS찾기

$ k get po -o wide
$ k exec -it <host> sh
cat /etc/resolv.conf


## dns는 10.96.0.10을 사용

## 10.96.0.10은 어디있을까?


$ k get po -n kube-system -o wide

## 여기아님 ip가 다른걸 볼 수 있음



$ k get svc -n kube-system

## 찾았따




Headless service 

<span class="pln">apiVersion</span><span class="pun">:</span><span class="pln"> v1
kind</span><span class="pun">:</span><span class="pln"> </span><span class="typ">Service</span><span class="pln">
metadata</span><span class="pun">:</span><span class="pln">
  name</span><span class="pun">:</span><span class="pln"> kubia</span><span class="pun">-</span><span class="pln">hl
spec</span><span class="pun">:</span><span class="pln">
  clusterIP</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">None</span><span class="pln">
  ports</span><span class="pun">:</span><span class="pln">
  </span><span class="pun">-</span><span class="pln"> port</span><span class="pun">:</span><span class="pln"> </span><span class="lit">80</span><span class="pln">
    targetPort</span><span class="pun">:</span><span class="pln"> </span><span class="lit">8080</span><span class="pln">
  selector</span><span class="pun">:</span><span class="pln">
    app</span><span class="pun">:</span><span class="pln"> kubia</span>

## 라운드로빈말고 다른방식으로 쓰고 싶을때 사용


서비스가 셀렉터를 안주면 어떻게 될까

<span class="pln">apiVersion</span><span class="pun">:</span><span class="pln"> v1
kind</span><span class="pun">:</span><span class="pln"> </span><span class="typ">Service</span><span class="pln">
metadata</span><span class="pun">:</span><span class="pln">
  name</span><span class="pun">:</span><span class="pln"> kubia</span><span class="pun">-</span><span class="pln">hl
spec</span><span class="pun">:</span><span class="pln">
  clusterIP</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">None</span><span class="pln">
  ports</span><span class="pun">:</span><span class="pln">
  </span><span class="pun">-</span><span class="pln"> port</span><span class="pun">:</span><span class="pln"> </span><span class="lit">80</span><span class="pln">
    targetPort</span><span class="pun">:</span><span class="pln"> </span><span class="lit">8080</span>

## 매핑되는 값을 삭제되면?



## label 매핑이 안된 놈들끼리 매핑되게 됨


반응형