기본적인 kubernetes resource, option 등을 설명한 블로그입니다. 추가적인 기능을 보고싶으시면 docs를 참고바랍니다.
https://kubernetes.io/docs/home/
- Kubernetes Service -> pod들은 각각의 ip를 가지는데, 특정 pod들에 집중되면 성능이 안좋으니 pod들을 하나의 ip로 묶어 load balancer를 등록한다.
apiVersion: v1 kind: Service metadata: name: webui-svc spec: clusterIP: 10.96.100.100 selector: app: webui # deployment의 labels를 넣는다. ports: - protocol: TCP port: 80 # cluster ip로 들어가는 port targetPort: 80 # pod들의 port
- Service Type : ClusterIP, NodePort, LoadBalancer, ExternalName
- ClusterIP -> 가장 basic하며, pod들의 진입점을 설정한다음 균등하게 분배한다.
- NodePort -> ClusterIP기능을 가지고 있으면서 특정 포트를 ClusterIP를 통해 열었을 때 pod들의 port도 같은 넘버로 모두 열린다. 특정 node로 요청했을 때 load balancer역할을 한다.
- LoadBalancer -> node로 요청했을 때 실제 LB와 node을 연결해준다음 Load Balancer를 해주는 작업.(aws, azure, gcp같은 플랫폼에서만 쓸 수 있다.)
- ExternalName -> dns 서비스처럼 특정 domain을 설정해주면 pod들이 외부와 통신할 때 domain을 설정한 domain으로 바꿔준다.
- cluster ip를 지정하지 않으면 default로 10.96.0.0/12 범위에서 랜덤으로 할당. 보통 충돌 막기위해 랜덤으로 할당.
- kubectl describe svc [svc name] -> ip와 port, endpoints(pod ip)들의 정보를 볼 수 있음.
- NodePort -> 모든 노드를 대상으로 외부 접속 가능한 포트를 예약, default NodePort 범위는 30000-32767이며, ClusterIP를 생성 후 NodePort를 예약.
apiVersion: v1
kind: Service
metadata:
name: myapp-service
spec:
type: NodePort
clusterIP: 10.100.100.200
selector:
app:sebui
ports:
- protocol: TCP
port: 80 # service ip를 통해 나가는 port
targetPort: 80 # pod의 port
nodePort: 30200 # 생략가능. 생략하면 default port가 생성.
# 외부에서 특정 노드에 접근해서 다른 노드들에 load balance해준다.
- load balancer는 public 클라우드에 쓰이며, nodeport를 예약 한 후 해당 nodeport로 load balance장비로 자동으로 연결해준다.
apiVersion: v1
kind: Service
...
spec:
type: LoadBalancer
...
externalIPs:
- 80.11.12.10
- 실제 장비 EXTERNAL-IP가 있어야 하며, 없으면 pending상태.
- externalName은 클러스터 내부에서 외부로 통신하고자 할때 dns service를 해주는 기능.
- externalName: domain.com 으로 설정하고, cluster pod내에서 curl [externalname-svc: externalName 이름].default.svc.cluster.local하면 domain.com으로 가게 된다.
...
spec:
type: ExternalName
externalName: google.com
- Headless Service -> clusterIP가 없는 서비스이며 routing, load-balancer가 필요없는 서비스에 적합. DNS resolving service로 control plane의 coreDNS에 저장해서 [pod-ip-addr].namespace.pod.cluster.local을 통해 연결해주는 서비스.
...
spec:
type: ClusterIP
clusterIP: None
externalName: google.com
...
- pod의 /etc/resolv.conf 파일을 보면 nameserver는 coredns ip인 것을 볼 수있으며, ex)curl 10-45-0-1.default.pod.cluster.local을 통해 dns resolving서비스를 지원해줘서 연결할 수 있게 된다.
- kube-proxy -> kubernetes Service의 backend 구현. master, node들에 kube-proxy라는 namespace가 작동됨. 즉, clusterip로 접속하면 특정 service pod로 접근하도록 iptables가 만들어짐. 또한, nodeport로의 접근과 pod 연결을 iptables에 구성한다.
'kubernetes, helm, rancher' 카테고리의 다른 글
kubernetes configmap, secret (0) | 2021.11.30 |
---|---|
kubernetes labels (0) | 2021.11.28 |
kubernetes HA(Highly Available), multi master node (0) | 2021.11.27 |
kubernetes Statefulset, Job, Cronjob (0) | 2021.11.25 |
kubernetes ReplicaSet, Deployment, Daemon set (0) | 2021.11.24 |