클라우드 엔지니어/클라우드 캠프과정

쿠버네티스 - 서비스(Kubernetes Service)

해아's 2022. 10. 17. 22:37
Service
	파드는 일시적으로 만들어지기도 하고 삭제되기도 하면서 IP가 바뀌기도한다.
	컨테이너에 올라간 서비스를 이용하는 사용자들은 이러한 변화를 바로 알아차릴 수 없기 때문에 
	쿠버네티스에서는 서비스를 이용해서 사용자들에게 서비스를 제공한다.

  1) 서비스의 종류
    (1) Cluster IP
	타입을 지정하지 않으면 기본으로 설정되며, 클러스터 내부의 파드에서 서비스의 이름으로 접근할 수 있다.

실습

apiVersion: v1
kind: Pod
metadata:
  name: pod-1
  labels:
     app: pod
spec:
  containers:
  - name: container
    image: yoskr/yos_node:0.1
    ports:
    - containerPort: 8000


apiVersion: v1
kind: Service
metadata:
  name: svc-1
spec:
  selector: #어떤 파드를 연결할것인지...레이블로 가져온다 셀렉터와 파드생성시 레이블이 매칭되어야하며 1:N이다
    app: pod
  ports:
  - port: 9000       # 사용자들이 접속할 포트
    targetPort: 8000 # 파드의 포트번호

#서비스에있는 클러스터 IP는 재부팅되어도 변경되지 않는다.
#클러스터 IP는 내부에서만 동작한다.
#서비스에서 지정한 이름으로는 서비스 내부에 있는 파드끼리 통신이 가능하다.
#ex curl svc-1:9000
#쿠버네티스에서 설정하는 모든 이름들은 자체 DNS서버를 통해서 확인한다. >> coredns-
#그래서 외부에서 접속할때 허용할거면 노트포트를 사용한다.

    (2) NodePort
ClusterIP의 접근 범위뿐만 아니라 쿠버네티스 클러스터 외부에서도 노드의 IP주소와 포트번호로 접근할 수 있다.
잠깐 동안 데모버전을 공개하거나 할 때 사용, 노드가 사라졌을때 자동으로 다른노드를 통해 접근이 불가능 
따라서 실제 서비스를 운용할 때는 로드밸런서 타입을 사용

노드포트 > 특정노드의 포트를 열어줌
어플리케이션 개발할때, 프로토 타입, 개발자버전 일때나 사용하는 방식이다.
노트포트 = 클러스터방식+외부포트기능추가 특정보트범위는 3만번이상부터
By default, the range of the service NodePorts is 30000-32768. This range contains 2768 ports, 
which means that you can create up to 2768 services with NodePorts. If you need more services, 
or you need to expose specific ports that are not in this range for certain applications, 
then you need to change the default range.

 

apiVersion: v1
kind: Service
metadata:
  name: svc-2
spec:
  selector:
    app: pod
  ports:
  - port: 9000
    targetPort: 8000
    nodePort: 30000
  type: NodePort

#노드의 아이피는 어떤노드든 상관없다
#node1, node2, master 모두 상관없다

 

    (3) LoadBalancer
NodePort의 접근 범위뿐만 아니라 쿠버네티크 클러스터 외부에서 대표 IP주소로 접근할 수 있다.
쿠버네티스 클러스터 환경을 직접 구축했다면 기본적으로 LoadBalancer 타입은 제공되지 않는다.
추가적으로 플러그인 설치 필요

      [1] 플러그인 설치
https://mlops-for-all.github.io/docs/appendix/metallb/

#현재 모드확인
# see what changes would be made, returns nonzero returncode if different
kubectl get configmap kube-proxy -n kube-system -o yaml | \
grep strictARP


strictARP: false
#strictARP: false 가 출력되는 경우 다음을 실행하여 strictARP: true로 변경합니다. (strictARP: true가 이미 출력된다면 다음 커맨드를 수행하지 않으셔도 됩니다.)
# actually apply the changes, returns nonzero returncode on errors only
kubectl get configmap kube-proxy -n kube-system -o yaml | \
sed -e "s/strictARP: false/strictARP: true/" | \
kubectl apply -f - -n kube-system


Warning: resource configmaps/kube-proxy is missing the kubectl.kubernetes.io/last-applied-configuration annotation which is required by kubectl apply. kubectl apply should only be used on resources created declaratively by either kubectl create --save-config or kubectl apply. The missing annotation will be patched automatically.
configmap/kube-proxy configured

#
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.11.0/manifests/namespace.yaml
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.11.0/manifests/metallb.yaml





#서비스 실행상태확인
kubectl get pod -n metallb-system

vi metallb_config.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - 192.168.35.100-192.168.35.110  # IP 대역폭 실제 사용중인 대역폭

kubectl apply -f metallb_config.yaml 
>configmap/config created

 

 

#로드벨런서

apiVersion: v1
kind: Service
metadata:
  name: svc-3
spec:
  selector:
    app: pod
  ports:
  - port: 9000
    targetPort: 8000
  type: LoadBalancer


#로드벨런싱구현
#파드 두개 만들고 두개의 포트는 동일하게
#이거는 순차방식이아니라
#다른브라우저로 하면 다른파드로 접속된다.
728x90
반응형