Kubernetes ServiceINFRA/Kubernetes2024. 7. 31. 01:11
Table of Contents
Service 개념
- 쿠버네티스 네트워크 → 클러스터 내 파드에 접근하는 법
- 파드는 컨트롤러가 관리하므로 한군데에 고정되서 실행되지 않고 클러스터 안을 옮겨다닌다. → 해결 : 서비스를 사용해서 파드가 클러스터 안 어디에 있든 고정 주소를 이용해 접근한다.
- 쿠버네티스야 nginx 웹서버 3개를 webui라는 이름으로 실행해줘 (서버 과부화 날 수도 있음) → 해결 : 쿠버네티스야 webui 파드들을 하나의 IP로 묶어서(=동일한 레이블) 관리해줘 (로드밸런싱) —>결과 : webui 서비스는 nginx 파드들에 대한 단일 진입점(Cluster IP)을 제공하고, 트래픽 자동으로 분산 시킴
<정리>
- 즉 디플로이에 서비스를 연결하고 라벨이 같은 것들끼리 하나로 묶어서 부하분산을 한다. 보통 같은 기능끼리 묶는다 web, was, db..등
- 동일한 서비스(동일 라벨)을 제공하는 pod그룹의 단일 진입점을 제공 → virtual IP=클러스터 IP 가 생겨서 사용자가 여기로 진입하고 웹서버 세개로 나눠서 트래픽 분산해서 배포하려고
deploy_service.yaml
- Deployment, Service 정의
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploy-web
spec:
replicas: 3
selector:
matchLabels:
app: web --이 디플로이먼트가 관리할 파드
template:
metadata:
labels:
app: web
spec:
containers:
- image: powermvp/marvel-collection
name: web
ports:
- containerPort: 80
resources:
requests:
cpu: 200m
--- --두개의 yaml을 합침
apiVersion: v1
kind: Service
metadata:
name: svc-web
spec:
ports:
- port: 80 --클러스터 ip 포트
targetPort: 80 --파드내의 컨테이너 ip 포트
selector:
app: web --이 서비스가 트래픽을 전달할 파드를 선택
1. 실행, 확인
root@k8s-masternew:~/k8slab/k8slab/8# kubectl apply -f deploy_service.yaml
deployment.apps/deploy-web created
service/svc-web created
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
deploy-web-55ccb4fcf8-8wllf 1/1 Running 0 13s 10.38.0.4 k8s-worker2new <none> <none>
deploy-web-55ccb4fcf8-mzpcs 1/1 Running 0 13s 10.40.0.9 k8s-worker1new <none> <none>
deploy-web-55ccb4fcf8-n7gtc 1/1 Running 0 13s 10.40.0.7 k8s-worker1new <none> <none>
2. 서비스 조회
root@k8s-masternew:~/k8slab/k8slab/8# kubectl get deployments.apps,rs,pods,svc
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/deploy-web 3/3 3 3 2m16s
NAME DESIRED CURRENT READY AGE
replicaset.apps/deploy-web-55ccb4fcf8 3 3 3 2m16s
NAME READY STATUS RESTARTS AGE
pod/deploy-web-55ccb4fcf8-8wllf 1/1 Running 0 2m16s
pod/deploy-web-55ccb4fcf8-mzpcs 1/1 Running 0 2m16s
pod/deploy-web-55ccb4fcf8-n7gtc 1/1 Running 0 2m16s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 10m
service/svc-web ClusterIP 10.111.171.233 <none> 80/TCP 2m16s
3. 클러스터 IP로 진입 가능 → 단일 진입점
- 10.111.171.233가 10.38.0.4, 10.40.0.9, 10.40.0.7를 하나로 묶어서 로드밸런싱 중
deploy_nginx.yaml
- nginx 웹 서버 3개를 실행하는 Deployment와 이를 Service로 묶어 고정된 IP 주소로 접근할 수 있게 설정
- Service : Deployment로 생성된 파드에 접근할 수 있는 네트워크 엔드포인트를 제공
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploy-web
spec:
replicas: 3
selector:
matchLabels:
app: nginx --이 디플로이먼트가 관리할 파드의 라벨
template:
metadata:
labels:
app: nginx --생성된 파드에 붙일 라벨
spec:
containers:
- image: nginx:1.14
name: web
ports:
- containerPort: 80
resources:
requests:
cpu: 200m
---
apiVersion: v1
kind: Service
metadata:
name: svc-web
spec:
ports:
- port: 80
targetPort: 80
selector:
app: nginx --이 서비스가 트래픽을 전달할 파드를 선택
1. 실행, 확인
root@k8s-masternew:~/k8slab/k8slab/8# kubectl apply -f deploy_nginx.yaml
deployment.apps/deploy-web created
service/svc-web created
root@k8s-masternew:~/k8slab/k8slab/8# kubectl get deployments.apps,rs,pods,svc
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/deploy-web 3/3 3 3 16s
--3개 만들어짐
NAME DESIRED CURRENT READY AGE
replicaset.apps/deploy-web-68d6d85757 3 3 3 16s
NAME READY STATUS RESTARTS AGE
pod/deploy-web-68d6d85757-btmww 1/1 Running 0 16s
pod/deploy-web-68d6d85757-xqc4d 1/1 Running 0 16s
pod/deploy-web-68d6d85757-z2tm9 1/1 Running 0 16s
--service/kubernetes : 기본 생성, 쿠버네티스 API 서버 접근 위함
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 64s
service/svc-web ClusterIP 10.100.193.79 <none> 80/TCP 16s
2. 클러스터 IP로 접속
3. 3개의 웹서버 안으로 진입 후 각각 다르게 index.html을 수정하고 로드밸런싱이 제대로 되는지 확인
→ 다르게 뜨는 것을 볼 수 있다.
root@k8s-masternew:~/k8slab/k8slab/8# curl 10.100.193.79
HI Nginx-WEB#2
root@k8s-masternew:~/k8slab/k8slab/8# curl 10.100.193.79
HI Nginx-WEB#1
root@k8s-masternew:~/k8slab/k8slab/8# curl 10.100.193.79
HI Nginx-WEB#1-1
4. 이번엔 hub.docker.com에서 이미지를 받아왔다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment
spec:
replicas: 3
selector:
matchLabels:
app: tomcat
template:
metadata:
labels:
app: tomcat
spec:
containers:
- image: sinhye/nginxweb:v1.0
name: containers
ports:
- containerPort: 80
resources:
requests:
cpu: 200m
---
apiVersion: v1
kind: Service
metadata:
name: service
spec:
#clusterIP: 10.96.0.5 적지않으면 랜덤으로 생성
ports:
- port: 80
targetPort: 80
selector:
app: tomcat
5. 결과 확인
root@k8s-masternew:~/k8slab/k8slab/8# kubectl get deployments.apps,rs,pods,svc
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/deployment 3/3 3 3 5s
NAME DESIRED CURRENT READY AGE
replicaset.apps/deployment-b4c66d86f 3 3 3 5s
NAME READY STATUS RESTARTS AGE
pod/deployment-b4c66d86f-j8svd 1/1 Running 0 5s
pod/deployment-b4c66d86f-tw8zq 1/1 Running 0 5s
pod/deployment-b4c66d86f-wd8wm 1/1 Running 0 5s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 11s
service/service ClusterIP 10.105.104.35 <none> 80/TCP 5s
6. 랜덤으로 생성된 클러스터 IP 결과
7. 클러스터 IP를 지정해준 결과
Service type
1. Cluster IP
- 쿠버네티스 클러스터 안에서만 사용, 외부 접근 불가
- 서비스 상세정보 확인
root@k8s-masternew:~/k8slab/k8slab/8# kubectl describe svc service
Name: service
Namespace: default
Labels: <none>
Annotations: <none>
Selector: app=tomcat --이 레이블 정보를 가지고
Type: ClusterIP --클러스터 IP 서비스가
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.105.104.35
IPs: 10.105.104.35
Port: <unset> 80/TCP
TargetPort: 80/TCP
Endpoints: 10.38.0.4:80,10.40.0.7:80,10.40.0.9:80 --세개 묶은것 확인
Session Affinity: None
Events: <none>
deploy-nginx.yaml
- nginx 웹 서버 파드를 3개 생성, 클러스터 내에서 단일 진입점으로 묶어주는 서비스 없음
apiVersion: apps/v1
kind: Deployment
metadata:
name: webui
spec:
replicas: 3
selector:
matchLabels:
app: webui
template:
metadata:
name: nginx-pod
labels:
app: webui
spec:
containers:
- name: nginx-container
image: nginx:1.14
service-nginx.yaml
- 디플로이먼트에 서비스 결합
apiVersion: v1
kind: Service
metadata:
name: webui-svc
spec:
selector:
app: webui
ports:
- protocol: TCP
port: 80
targetPort: 80
1. 둘 다 실행한 결과
root@k8s-masternew:~/k8slab/k8slab/7# kubectl get deployments.apps,svc,pods
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/webui 3/3 3 3 69s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2m36s
service/webui-svc ClusterIP 10.106.59.108 <none> 80/TCP 24s
NAME READY STATUS RESTARTS AGE
pod/webui-bd76d5967-2jpqm 1/1 Running 0 69s
pod/webui-bd76d5967-jxs4n 1/1 Running 0 69s
pod/webui-bd76d5967-xwrdg 1/1 Running 0 69s
--서비스 확인
root@k8s-masternew:~/k8slab/k8slab/7# kubectl describe svc webui-svc
Name: webui-svc
Namespace: default
Labels: <none>
Annotations: <none>
Selector: app=webui --생성된 서비스는 이것들 기준으로 묶인것
Type: ClusterIP
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.106.59.108
IPs: 10.106.59.108
Port: <unset> 80/TCP
TargetPort: 80/TCP
Endpoints: 10.38.0.4:80,10.40.0.7:80,10.40.0.9:80 --liveness porbe로 정상작동되는지 확인
Session Affinity: None
Events: <none>
2. NodePort
- Cluster IP가 생성된 후 모든 워크 노드에 외부에서 접속 가능한 포트가 예약
- node1:3000, node2:3000 (서비스 하나에 모든 노드의 지정된 포트 할당)
- default NodePort 범위 : 30000-32767
nodeport-nginx.yaml
- NodePort 타입의 서비스 정의
apiVersion: v1
kind: Service
metadata:
name: nodeport-service
spec:
type: NodePort
clusterIP: 10.100.100.200
selector:
app: webui
ports:
- protocol: TCP
port: 80
targetPort: 80 --서비스가 연결하려는 파드내의 컨테이너 포트
nodePort: 30200 --클러스터 외부에서 접근할 포트 번호, 안적으면 랜덤하게 생성됨
1. 실행, 확인
--파드를 먼저 만들고
root@k8s-masternew:~/k8slab/k8slab/7# kubectl apply -f deploy-nginx.yaml
deployment.apps/webui created
--노드 포트 생성
root@k8s-masternew:~/k8slab/k8slab/7# kubectl apply -f nodeport-nginx.yaml
service/nodeport-service created
--사용자들은 30200포트를 타고 들어옴
root@k8s-masternew:~/k8slab/k8slab/7# kubectl get deployments.apps,svc,pods
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/webui 3/3 3 3 88s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 6m18s
service/nodeport-service NodePort 10.100.100.200 <none> 80:30200/TCP 71s
NAME READY STATUS RESTARTS AGE
pod/webui-bd76d5967-czmj6 1/1 Running 0 88s
pod/webui-bd76d5967-jrpj7 1/1 Running 0 88s
pod/webui-bd76d5967-kqlng 1/1 Running 0 88s
root@k8s-masternew:~/k8slab/k8slab/7# kubectl describe svc nodeport-service
Name: nodeport-service
Namespace: default
Labels: <none>
Annotations: <none>
Selector: app=webui
Type: NodePort
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.100.100.200
IPs: 10.100.100.200
Port: <unset> 80/TCP
TargetPort: 80/TCP
NodePort: <unset> 30200/TCP
Endpoints: 10.38.0.4:80,10.40.0.7:80,10.40.0.9:80
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
2. 마스터, 워크노드 확인
root@k8s-masternew:~/k8slab/k8slab/7# curl 10.100.100.200:30200
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
root@k8s-worker1new:~# curl 10.100.100.200:30200
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
3.Load Balancer
- 클러스터 IP, NodePort 자동 할당
- 해당 로드밸런서의 IP를 이용해 클러스터 외부에서 파드에 접근할 수 있도록 함
loadbalancer-nginx.yaml
- 클러스터 외부에서 port: 80으로 접근 → targetPort: 80인 app: webui라벨을 가진 파드들과 연결
apiVersion: v1
kind: Service
metadata:
name: loadbalancer-service
spec:
type: LoadBalancer
selector:
app: webui
ports:
- protocol: TCP
port: 80
targetPort: 80
1. 실행
root@k8s-masternew:~/k8slab/k8slab/7# kubectl apply -f deploy-nginx.yaml
deployment.apps/webui created
root@k8s-masternew:~/k8slab/k8slab/7# kubectl apply -f loadbalancer-nginx.yaml
service/loadbalancer-service created
--로드밸런스 생성시 클러스터 ip랑 노드포트가 둘다 생김
--pending : 공인 ip 설정을 하지 않았기 때문에 생김
root@k8s-masternew:~/k8slab/k8slab/7# kubectl get deployments.apps,svc,pods
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/webui 3/3 3 3 43s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 103s
service/loadbalancer-service LoadBalancer 10.111.144.53 <pending> 80:31039/TCP 38s
NAME READY STATUS RESTARTS AGE
pod/webui-bd76d5967-5x9w6 1/1 Running 0 43s
pod/webui-bd76d5967-nzfdz 1/1 Running 0 43s
pod/webui-bd76d5967-xwlh2 1/1 Running 0 43s
4. ExternalName
- 클러스터 안에서 외부에 접근할때 사용
- 외부 DNS 이름을 서비스에 연결
DNS 조회
- 서비스 네임을 통한 nslookup을 통해 DNS 조회
- svc.default.svc.cluster.local
- nodeport-service.default.svc.cluster.local
- 10.100.100.200.default.svc.cluster.local
- 파드 IP를 통한 nslookup을 통해 DNS 조회
- PodIP.default.Pod.cluster.local
- 10-36-0-2.default.pod.cluster.local
external-name.yaml
- 외부 DNS 이름 google.com을 서비스 externalname-svc에 연결
apiVersion: v1
kind: Service
metadata:
name: externalname-svc
spec:
type: ExternalName
externalName: google.com
1. 실행, 확인
root@k8s-masternew:~/k8slab/k8slab/7# kubectl apply -f external-name.yaml
service/externalname-svc created
root@k8s-masternew:~/k8slab/k8slab/7# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
externalname-svc ExternalName <none> google.com <none> 9s
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 87s
--컨테이너 생성+진입
root@k8s-masternew:~/k8slab/k8slab/7# kubectl run centos -it --image=centos:7 -- /bin/bash
If you don't see a command prompt, try pressing enter.
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
centos 1/1 Running 0 107s 10.40.0.2 k8s-worker1new <none> <none>
--서비스 네임을 통한 DNS 조회
externalname-svc는 google.com를 가리키므로 구글로 가게 될 것임
내부에 지정된 도메인을 통해서 나가는 것.. 별로 쓸일은 없음..
[root@centos /]# curl externalname-svc.default.svc.cluster.local
<!DOCTYPE html>
<html lang=en>
<meta charset=utf-8>
<meta name=viewport content="initial-scale=1, minimum-scale=1, width=device-width">
<title>Error 404 (Not Found)!!1</title>
<style>
*{margin:0;padding:0}html,code{font:15px/22px arial,sans-serif}html{background:#fff;color:#222;padding:15px}body{margin:7% auto 0;max-width:390px;min-height:180px;padding:30px 0 15px}* > body{background:url(//www.google.com/images/errors/robot.png) 100% 5px no-repeat;padding-right:205px}p{margin:11px 0 22px;overflow:hidden}ins{color:#777;text-decoration:none}a img{border:0}@media screen and (max-width:772px){body{background:none;margin-top:0;max-width:none;padding-right:0}}#logo{background:url(//www.google.com/images/branding/googlelogo/1x/googlelogo_color_150x54dp.png) no-repeat;margin-left:-5px}@media only screen and (min-resolution:192dpi){#logo{background:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) no-repeat 0% 0%/100% 100%;-moz-border-image:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) 0}}@media only screen and (-webkit-min-device-pixel-ratio:2){#logo{background:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) no-repeat;-webkit-background-size:100% 100%}}#logo{display:inline-block;height:54px;width:150px}
</style>
<a href=//www.google.com/><span id=logo aria-label=Google></span></a>
<p><b>404.</b> <ins>That’s an error.</ins>
<p>The requested URL <code>/</code> was not found on this server. <ins>That’s all we know.</ins>
--DNS 설정에 등록되어 있을 것임
[root@centos /]# cat /etc/resolv.conf
search default.svc.cluster.local svc.cluster.local cluster.local
nameserver 10.96.0.10
options ndots:5
Headless Service
- ClusterIP 없음: clusterIP: None클러스터 내부에서 IP를 할당받지 않음
- Endpoint 있음
- 로드밸런싱 필요없을 때 사용 : DB는 active-standby
- 단일 진입점 필요없을 때 사용
- 클러스터IP 없이도 Pod의 Endpoint를 가지고 DNS를 통해 Pod의 IP를 조회하여 접근 → 각 Pod의 Endpoint 정보는 CoreDNS에 등록되어 있음
headless-nginx.yaml
- ClusterIP가 없는 Headless 서비스 정의
apiVersion: v1
kind: Service
metadata:
name: headless-service
spec:
type: ClusterIP
clusterIP: None
selector:
app: webui
ports:
- protocol: TCP
port: 80
targetPort: 80
1. 실행, 확인
root@k8s-masternew:~/k8slab/k8slab/7# kubectl apply -f deploy-nginx.yaml
deployment.apps/webui created
root@k8s-masternew:~/k8slab/k8slab/7# kubectl apply -f headless-nginx.yaml
service/headless-service created
root@k8s-masternew:~/k8slab/k8slab/7# kubectl get deployments.apps,svc,pods
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/webui 3/3 3 3 104s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/headless-service ClusterIP None <none> 80/TCP 54s
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 6m37s
NAME READY STATUS RESTARTS AGE
pod/webui-bd76d5967-hnmxb 1/1 Running 0 104s
pod/webui-bd76d5967-pvfz9 1/1 Running 0 104s
pod/webui-bd76d5967-wtp56 1/1 Running 0 104s
root@k8s-masternew:~/k8slab/k8slab/7# kubectl describe svc headless-service
Name: headless-service
Namespace: default
Labels: <none>
Annotations: <none>
Selector: app=webui
Type: ClusterIP
IP Family Policy: SingleStack
IP Families: IPv4
IP: None
IPs: None
Port: <unset> 80/TCP
TargetPort: 80/TCP
Endpoints: 10.38.0.5:80,10.40.0.2:80,10.40.0.6:80
Session Affinity: None
Events: <none>
root@k8s-masternew:~/k8slab/k8slab/7# kubectl run centos -it --image=centos:7 -- /bin/bash
If you don't see a command prompt, try pressing enter.
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
centos 1/1 Running 0 2m35s 10.38.0.10 k8s-worker2new <none> <none>
webui-bd76d5967-hnmxb 1/1 Running 0 8m38s 10.40.0.2 k8s-worker1new <none> <none>
webui-bd76d5967-pvfz9 1/1 Running 0 8m38s 10.40.0.6 k8s-worker1new <none> <none>
webui-bd76d5967-wtp56 1/1 Running 0 8m38s 10.38.0.5 k8s-worker2new <none> <none>
--파드 IP를 통해 DNS 조회
--클러스터 IP가 없어도 CentOS라는 DB서버에서 엔드포인트를 가지고 접속할 수 있다.
[root@centos /]# curl 10-40-0-2.default.pod.cluster.local:80;
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</titl
정리
- 로드밸런서(공인 ip 있는 nginx웹서버) > 노드포트(nginx웹서버) > 클러스터 IP (톰캣)
- db는 headless 서비스 : 각 Pod에 대한 직접 접근이 필요하며, StatefulSet과 함께 사용하여 Pod 간 직접 통신을 가능하게
- front는 node,로드밸런서 서비스 :사용자로부터의 외부 트래픽을 받아야 하며, 노드 포트를 통해 접근하거나 클라우드 로드 밸런서를 통해 트래픽을 분산
- back은 클러스터 ip 서비스 : 클러스터 내부에서만 접근 가능하도록 하여 내부 서비스 간 안전한 통신을 보장
- 로드 밸런서
- 특징
- 외부로부터의 트래픽을 여러 Pod로 분산하여 처리 → 가용성
- 활용 → 공인 IP를 가진 Nginx 웹 서버 : 사용자 트래픽을 여러 Nginx Pod로 분산하여 처리
- 노드 포트
- 특징 : 모든 클러스터 노드에 지정된 포트를 노출시켜 외부에서 직접 Pod에 접근할 수 있게 함
- 활용 → Nginx 웹 서버 : 특정 Nginx Pod에 직접 액세스할 수 있도록 함 트래픽을 분산
- 클러스터 IP
- 특징 : 클러스터 내부 Pod 간에만 통신 가능, 외부 직접 접근 불가능
- 활용 → Tomcat : 클러스터 내부에서만 접근 가능하도록 하여 내부 서비스 간 안전한 통신을 보장
- Headless 서비스
- 특징 : 클러스터 IP 없이 서비스를 제공, 각 Pod 직접 접근 가능
- 활용 → DB : Headless 서비스와 StatefulSet을 함께 사용하여 DB Pod 간의 직접 통신
Service 만드는 방법 2가지
1. 디플로이먼트 이용
- deployment 생성
root@k8s-masternew:~# kubectl create deployment web --image=nginx:1.14 --replicas=3 --port=80
deployment.apps/web created
- 서비스 생성 : expose
--클러스터포트 80, 컨테이너 포트 80, ip는 명령어로 못줌
root@k8s-masternew:~# kubectl expose deployment web --name=svc-web --type=ClusterIP --port=80 --target-port=80
service/svc-web exposed
- 생성 후 조회 : 디플로이를 가지고 서비스를 만들수있다
root@k8s-masternew:~# kubectl get deployments.apps,svc,pods
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/web 3/3 3 3 6m4s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 7m22s
service/svc-web ClusterIP 10.109.36.220 <none> 80/TCP 40s
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/front-nginx 1/1 Running 0 3m50s 10.38.0.3 k8s-worker2new <none> <none>
pod/web-694d587cbb-5fbrf 1/1 Running 0 25m 10.38.0.2 k8s-worker2new <none> <none>
pod/web-694d587cbb-fv964 1/1 Running 0 25m 10.38.0.1 k8s-worker2new <none> <none>
pod/web-694d587cbb-r89xq 1/1 Running 0 25m 10.40.0.3 k8s-worker1new <none> <none>
- 클러스터 내에서 파드 간의 네트워크 통신이 잘 이루어지고 있는지 확인
- 클러스터 DNS를 통해 svc-web이라는 서비스에 HTTP 요청
root@k8s-masternew:~# kubectl run front-nginx -it --image=centos:7 --port=80 -- /bin/bash
If you don't see a command prompt, try pressing enter.
[root@front-nginx /]# curl 10-38-0-2.default.pod.cluster.local
[root@front-nginx /]# curl svc-web.default.svc.cluster.local
<title>Welcome to nginx!</title>
2. 파드 이용
root@k8s-masternew:~# kubectl run webserver --image=nginx --port=80
pod/webserver created
root@k8s-masternew:~# kubectl expose pods webserver --name=webpod-svc --type=NodePort --port=80
service/webpod-svc exposed
--확인
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/webpod-svc NodePort 10.102.36.100 <none> 80:32216/TCP 35s run=webserver
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/webserver 1/1 Running 0 2m5s 10.38.0.4 k8s-worker2new <none> <none>
root@k8s-masternew:~# kubectl exec -it front-nginx -- /bin/bash
[root@front-nginx /]# curl 10-38-0-4.default.pod.cluster.local
'INFRA > Kubernetes' 카테고리의 다른 글
Kubernetes 명령어 모음 (0) | 2024.07.10 |
---|---|
Kubernetes Controller (0) | 2024.07.10 |