Kubernetes service ClusterIP

jaeyeon ha·2026년 3월 7일

[교육] Kubernetes

목록 보기
24/34

ClusterIP

사용자가 특정 IP를 할당하지 않으면, 자동으로 available range에서 IP 할당됨
available range : 10.233.0.0 ~ 20.233.63.255

▶ 서비스 할당 IP 대역과 Pod IP 대역 확인

kubespray 설정 값 확인

[root@master ~/kube/08]# cd ~/kubespray/inventory/mycluster/group_vars/k8s_cluster/
[root@master ~/kubespray/inventory/mycluster/group_vars/k8s_cluster]# ls
addons.yml       k8s-net-calico.yml  k8s-net-flannel.yml   k8s-net-kube-router.yml  k8s-net-weave.yml
k8s-cluster.yml  k8s-net-cilium.yml  k8s-net-kube-ovn.yml  k8s-net-macvlan.yml
[root@master ~/kubespray/inventory/mycluster/group_vars/k8s_cluster]# cat k8s-cluster.yml | egrep "kube_service|kube_pods"
kube_service_addresses: 10.233.0.0/18
kube_pods_subnet: 10.233.64.0/18
#  - kube_pods_subnet: 10.233.64.0/18
#  - kube_pods_subnet: 10.233.64.0/18
kube_service_addresses_ipv6: fd85:ee78:d8a6:8607::1000/116
kube_pods_subnet_ipv6: fd85:ee78:d8a6:8607::1:0000/112
kube_apiserver_ip: "{{ kube_service_addresses | ipaddr('net') | ipaddr(1) | ipaddr('address') }}"
skydns_server: "{{ kube_service_addresses | ipaddr('net') | ipaddr(3) | ipaddr('address') }}"
skydns_server_secondary: "{{ kube_service_addresses | ipaddr('net') | ipaddr(4) | ipaddr('address') }}"
# kubelet_runtime_cgroups: "/{{ kube_service_cgroups }}/{{ container_manager }}.service"
# kubelet_kubelet_cgroups: "/{{ kube_service_cgroups }}/kubelet.service"
[root@master ~]# ip address
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
	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
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
	link/ether 00:0c:29:54:ee:2e brd ff:ff:ff:ff:ff:ff
	altname enp2s1
	inet 192.168.2.60/24 brd 192.168.2.255 scope global noprefixroute ens33
	valid_lft forever preferred_lft forever
	inet6 fe80::20c:29ff:fe54:ee2e/64 scope link noprefixroute
	valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
	link/ether b2:5c:bc:72:b4:f0 brd ff:ff:ff:ff:ff:ff
	inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
	valid_lft forever preferred_lft forever
4: nodelocaldns: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN group default
	link/ether 26:44:dd:45:bb:7b brd ff:ff:ff:ff:ff:ff
	inet 169.254.25.10/32 scope global nodelocaldns
	valid_lft forever preferred_lft forever
5: kube-ipvs0: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN group default
	link/ether de:ec:49:cd:4e:de brd ff:ff:ff:ff:ff:ff
	inet 10.233.0.3/32 scope global kube-ipvs0
	valid_lft forever preferred_lft forever
	inet 10.233.0.1/32 scope global kube-ipvs0
	valid_lft forever preferred_lft forever
6: calidcc8a760e41@if3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default
	link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netnsid 0
	inet6 fe80::ecee:eeff:feee:eeee/64 scope link
	valid_lft forever preferred_lft forever
7: calia42ce326ad9@if3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default
	link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netnsid 1
	inet6 fe80::ecee:eeff:feee:eeee/64 scope link
	valid_lft forever preferred_lft forever
10: vxlan.calico: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN group default
	link/ether 66:4f:26:ae:af:db brd ff:ff:ff:ff:ff:ff
	inet 10.233.97.128/32 scope global vxlan.calico
	valid_lft forever preferred_lft forever
	inet6 fe80::644f:26ff:feae:afdb/64 scope link
	valid_lft forever preferred_lft forever
[root@master ~]# kubectl get svc -A
NAMESPACE     NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
default       kubernetes   ClusterIP   10.233.0.1   <none>        443/TCP                  4h22m
kube-system   coredns      ClusterIP   10.233.0.3   <none>        53/UDP,53/TCP,9153/TCP   29h
[root@master ~]# kubectl describe svc kubernetes
Name:              kubernetes
Namespace:         default
Labels:            component=apiserver
				provider=kubernetes
Annotations:       <none>
Selector:          <none>
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.233.0.1
IPs:               10.233.0.1
Port:              https  443/TCP
TargetPort:        6443/TCP
Endpoints:         192.168.2.60:6443
Session Affinity:  None
Events:            <none>
[root@master ~]# kubectl get pod -o wide -A | grep 192.168.2.60
kube-system   calico-node-hbv94                          1/1     Running   1 (6h35m ago)   29h   192.168.2.60     master   <none>           <none>
kube-system   kube-apiserver-master                      1/1     Running   2 (6h35m ago)   29h   192.168.2.60     master   <none>           <none>
kube-system   kube-controller-manager-master             1/1     Running   3 (6h35m ago)   29h   192.168.2.60     master   <none>           <none>
kube-system   kube-proxy-trxht                           1/1     Running   1 (6h35m ago)   29h   192.168.2.60     master   <none>           <none>
kube-system   kube-scheduler-master                      1/1     Running   3 (6h35m ago)   29h   192.168.2.60     master   <none>           <none>
kube-system   nodelocaldns-7lp84                         1/1     Running   2 (6h35m ago)   29h   192.168.2.60     master   <none>           <none>

▶ vxlan.calico :: pod와 네트워크 통신하는 장치
▶ kube-ipvs0 :: 서비스가 사용하는 IP 주소 → kube-system/coredns와 default/kubernetes가 사용중

ClusterIP Service 생성

[root@master ~/kube/08/clusterip]# vi clusterip-test.yaml
[root@master ~/kube/08/clusterip]# cat clusterip-test.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: nginx-sts
spec:
  replicas: 3
  selector:
    matchLabels:
      app: webui
  template:
    metadata:
      name: nginx-pod
      labels:
        app: webui
    spec:
      containers:
      - name: nginx-container
        image: nginx:1.14
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-clusterip
spec:
  selector:
    app: webui
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
[root@master ~/kube/08/clusterip]# kubectl apply -f clusterip-test.yaml
statefulset.apps/nginx-sts created
service/nginx-clusterip created
[root@master ~/kube/08/clusterip]# kubectl get all
NAME              READY   STATUS              RESTARTS   AGE
pod/nginx-sts-0   1/1     Running             0          5s
pod/nginx-sts-1   1/1     Running             0          3s
pod/nginx-sts-2   0/1     ContainerCreating   0          1s

NAME                      TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
service/kubernetes        ClusterIP   10.233.0.1      <none>        443/TCP   4h37m
service/nginx-clusterip   ClusterIP   10.233.41.245   <none>        80/TCP    5s

NAME                         READY   AGE
statefulset.apps/nginx-sts   2/3     5s
[root@master ~/kube/08/clusterip]# kubectl get svc -o wide
NAME              TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE     SELECTOR
kubernetes        ClusterIP   10.233.0.1      <none>        443/TCP   4h39m   <none>
nginx-clusterip   ClusterIP   10.233.41.245   <none>        80/TCP    73s     app=webui
[root@master ~/kube/08/clusterip]# ip address show kube-ipvs0
[root@master ~/kube/08/clusterip]# ip address show kube-ipvs0
5: kube-ipvs0: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN group default
    link/ether de:ec:49:cd:4e:de brd ff:ff:ff:ff:ff:ff
    inet 10.233.0.3/32 scope global kube-ipvs0
       valid_lft forever preferred_lft forever
    inet 10.233.0.1/32 scope global kube-ipvs0
       valid_lft forever preferred_lft forever
    inet 10.233.41.245/32 scope global kube-ipvs0
       valid_lft forever preferred_lft forever

node1에서 확인

[root@node1 /etc/kubernetes/manifests]# ip address show kube-ipvs0
5: kube-ipvs0: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN group default
    link/ether f6:6c:1c:e0:4e:1c brd ff:ff:ff:ff:ff:ff
    inet 10.233.0.3/32 scope global kube-ipvs0
       valid_lft forever preferred_lft forever
    inet 10.233.0.1/32 scope global kube-ipvs0
       valid_lft forever preferred_lft forever
    inet 10.233.41.245/32 scope global kube-ipvs0
       valid_lft forever preferred_lft forever

▶ master에서 확인한 바와 동일

Deploy 생성

[root@master ~/kube/08/clusterip]# vi nginx-deploy.yaml
[root@master ~/kube/08/clusterip]# cat nginx-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy
spec:
replicas: 3
selector:
	matchLabels:
	app: webui
template:
	metadata:
	name: nginx-pod
	labels:
		app: webui
	spec:
	containers:
	- name: nginx-container
		image: nginx:1.14
[root@master ~/kube/08/clusterip]# kubectl get all
NAME                               READY   STATUS    RESTARTS   AGE
pod/nginx-deploy-9cc457697-f2dc2   1/1     Running   0          19s
pod/nginx-deploy-9cc457697-gvrnn   1/1     Running   0          19s
pod/nginx-deploy-9cc457697-s4tgm   1/1     Running   0          19s

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.233.0.1   <none>        443/TCP   4h41m

NAME                           READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx-deploy   3/3     3            3           19s

NAME                                     DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-deploy-9cc457697   3         3         3       19s

Service 생성

[root@master ~/kube/08/clusterip]# vi clusterip-svc.yaml
[root@master ~/kube/08/clusterip]# cat clusterip-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-clusterip
spec:
selector:
	app: webui
ports:
- protocol: TCP
	port: 80
	targetPort: 80
[root@master ~/kube/08/clusterip]# kubectl apply -f clusterip-svc.yaml
service/nginx-clusterip created
[root@master ~/kube/08/clusterip]# kubectl get svc
NAME              TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
kubernetes        ClusterIP   10.233.0.1     <none>        443/TCP   4h44m
nginx-clusterip   ClusterIP   10.233.5.174   <none>        80/TCP    2s
[root@master ~/kube/08/clusterip]# kubectl get svc
NAME              TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
kubernetes        ClusterIP   10.233.0.1     <none>        443/TCP   4h44m
nginx-clusterip   ClusterIP   10.233.5.174   <none>        80/TCP    2s
[root@master ~/kube/08/clusterip]# kubectl describe svc nginx-clusterip
Name:              nginx-clusterip
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          app=webui
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.233.5.174
IPs:               10.233.5.174
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         10.233.102.170:80,10.233.71.37:80,10.233.75.59:80
Session Affinity:  None
Events:            <none>
[root@master ~/kube/08/clusterip]# kubectl get pod -o wide
NAME                           READY   STATUS    RESTARTS   AGE    IP               NODE    NOMINATED NODE   READINESS GATES
nginx-deploy-9cc457697-f2dc2   1/1     Running   0          4m9s   10.233.102.170   node1   <none>           <none>
nginx-deploy-9cc457697-gvrnn   1/1     Running   0          4m9s   10.233.71.37     node3   <none>           <none>
nginx-deploy-9cc457697-s4tgm   1/1     Running   0          4m9s   10.233.75.59     node2   <none>           <none>

▶ Endpoints가 위 생성된 Deploy의 Pod로 되어있음을 확인할 수 있음

각 pod에 개별적 작업

[root@master ~/kube/08/clusterip]# kubectl get pod -o wide
NAME                           READY   STATUS    RESTARTS   AGE     IP               NODE    NOMINATED NODE   READINESS GATES
nginx-deploy-9cc457697-f2dc2   1/1     Running   0          4m59s   10.233.102.170   node1   <none>           <none>
nginx-deploy-9cc457697-gvrnn   1/1     Running   0          4m59s   10.233.71.37     node3   <none>           <none>
nginx-deploy-9cc457697-s4tgm   1/1     Running   0          4m59s   10.233.75.59     node2   <none>           <none>
[root@master ~/kube/08/clusterip]# kubectl exec nginx-deploy-9cc457697-f2dc2 -it -- bash
root@nginx-deploy-9cc457697-f2dc2:/# echo "<h1>#1# Test Page</h1>" > /usr/share/nginx/html/index.html
root@nginx-deploy-9cc457697-f2dc2:/# exit
exit
[root@master ~/kube/08/clusterip]# kubectl exec nginx-deploy-9cc457697-gvrnn -it -- bash
root@nginx-deploy-9cc457697-gvrnn:/# echo "<h1>#2# Test Page</h1>" > /usr/share/nginx/html/index.html
root@nginx-deploy-9cc457697-gvrnn:/# exit
exit
[root@master ~/kube/08/clusterip]# kubectl exec nginx-deploy-9cc457697-s4tgm -it -- bash
root@nginx-deploy-9cc457697-s4tgm:/# echo "<h1>#3# Test Page</h1>" > /usr/share/nginx/html/index.html
root@nginx-deploy-9cc457697-s4tgm:/# exit
exit

replicas scale up 3 to 5

[root@master ~/kube/08/clusterip]# kubectl scale deployment nginx-deploy --replicas=5
deployment.apps/nginx-deploy scaled
[root@master ~/kube/08/clusterip]# kubectl get pod -o wide
NAME                           READY   STATUS    RESTARTS   AGE   IP               NODE    NOMINATED NODE   READINESS GATES
nginx-deploy-9cc457697-d5hjg   1/1     Running   0          77s   10.233.75.60     node2   <none>           <none>
nginx-deploy-9cc457697-f2dc2   1/1     Running   0          13m   10.233.102.170   node1   <none>           <none>
nginx-deploy-9cc457697-gvrnn   1/1     Running   0          13m   10.233.71.37     node3   <none>           <none>
nginx-deploy-9cc457697-pb5tm   1/1     Running   0          77s   10.233.102.171   node1   <none>           <none>
nginx-deploy-9cc457697-s4tgm   1/1     Running   0          13m   10.233.75.59     node2   <none>           <none>
[root@master ~/kube/08/clusterip]# kubectl get ep
NAME              ENDPOINTS                                                         AGE
kubernetes        192.168.2.60:6443                                                 4h54m
nginx-clusterip   10.233.102.170:80,10.233.102.171:80,10.233.71.37:80 + 2 more...   10m

새로 생긴 pod에도 동일한 작업 수행

[root@master ~/kube/08/clusterip]# kubectl exec nginx-deploy-9cc457697-pb5tm -it -- bash
root@nginx-deploy-9cc457697-pb5tm:/# echo "<h1>#4# Test Page</h1>" > /usr/share/nginx/html/index.html
root@nginx-deploy-9cc457697-pb5tm:/# exit
exit
[root@master ~/kube/08/clusterip]# kubectl exec nginx-deploy-9cc457697-d5hjg -it -- bash
root@nginx-deploy-9cc457697-d5hjg:/# echo "<h1>#5# Test Page</h1>" > /usr/share/nginx/html/index.html
root@nginx-deploy-9cc457697-d5hjg:/# exit
exit

실제로 서비스가 원활히 가는지 확인

[root@master ~/kube/08/clusterip]# kubectl get svc
NAME              TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
kubernetes        ClusterIP   10.233.0.1     <none>        443/TCP   4h56m
nginx-clusterip   ClusterIP   10.233.5.174   <none>        80/TCP    11m
[root@master ~/kube/08/clusterip]# curl <http://10.233.5.174>
<h1>#4# Test Page</h1>
[root@master ~/kube/08/clusterip]# curl <http://10.233.5.174>
<h1>#5# Test Page</h1>
[root@master ~/kube/08/clusterip]# curl <http://10.233.5.174>
<h1>#3# Test Page</h1>
[root@master ~/kube/08/clusterip]# curl <http://10.233.5.174>
<h1>#2# Test Page</h1>
[root@master ~/kube/08/clusterip]# curl <http://10.233.5.174>
<h1>#1# Test Page</h1>

replicas scale down 5 to 3

[root@master ~/kube/08/clusterip]# kubectl scale deployment nginx-deploy --replicas=3
deployment.apps/nginx-deploy scaled

0개의 댓글