버전 비교

  • 이 줄이 추가되었습니다.
  • 이 줄이 삭제되었습니다.
  • 서식이 변경되었습니다.

...

코드 블럭
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app.kubernetes.io/name: proxy
spec:
  containers:
  - name: nginx
    image: nginx:stable
    ports:
      - containerPort: 80
        name: http-web-svc

---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app.kubernetes.io/name: proxy
  ports:
  - name: name-of-service-port
    protocol: TCP
    port: 80
    targetPort: http-web-svc

(2) NodePort

  • 고정포트로 각 노드의 IP에 서비스를 노출합니다.

  • NodePort 서비스가 라우팅되는 ClusterIP가 자동으로 생성되며 NodeIP:NodePort를 요청하며, 서비스 외수에서 NodePort 서비스에 접속할 수 있습니다.

6/01-svc-nodeport.yaml

apiVersion: apps/v1
코드 블럭
코드 블럭
root@cp-k8s:~/2024_k8s/edu/6# k get svc
NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
kubernetes      ClusterIP   10.96.0.1       <none>        443/TCP   3h16m
nginx-service   ClusterIP   10.103.98.179   <none>  kind: Deployment     80/TCP    99s
root@cp-k8s:~/2024_k8s/edu/6# curl 10.103.98.179
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
     
metadata:                      <a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

(2) NodePort

  • 고정포트로 각 노드의 IP에 서비스를 노출합니다.

  • NodePort 서비스가 라우팅되는 ClusterIP가 자동으로 생성되며 NodeIP:NodePort를 요청하며, 서비스 외수에서 NodePort 서비스에 접속할 수 있습니다.

6/01-svc-nodeport.yaml

코드 블럭
apiVersion: apps/v1                                                                  name: nginx-deployment        
kind: Deployment                                                               labels:               
metadata:                                                                          app: nginx          
  name: nginx-deployment                                                                   spec:   
  labels:                                                                                     
replicas: 1   app: nginx                                                                                
selectorspec:                                                                                        matchLabels: 
  replicas: 1                                                                                 app:
nginx  selector:                                                                               template:    
    matchLabels:                                                                              
metadata:      app: nginx                                                                              
  labelstemplate:                                                                                   
    metadata:  app:   nginx                                                                            
    spec:  labels:                                                                                 
        containersapp: nginx                                                                            
    spec:  - name: nginx                                                                                 
  image: nginx   containers:                                                                             
  ports:    - name: nginx                                                                           
       - containerPortimage: 80nginx                                                                    ---      
        ports:                                                                             apiVersion: v1  
        - containerPort: 80                                                                   
kind:--- Service                                                                                  metadata:        
apiVersion: v1                                                                              name: my-service-nodeport 
kind: Service                                                                 spec:                
metadata:                                                                           type: NodePort         
  name: my-service-nodeport                                                                   
selectorspec:                                                                                        app: 
nginx  type: NodePort                                                                              
 ports selector:                                                                                   
    app: nginx    # 기본적으로 그리고 편의상 `targetPort`  `port` 필드와 동일한 값으로 설정된다.                                - port: 80                                
  ports:                                                    targetPort: 80                                 
      # 기본적으로 그리고 편의상 `targetPort`  `port` 필드와 동일한 값으로 설정된다.                           
   # 선택적- 필드port: 80                                                                                
    # 기본적으로 그리고targetPort: 편의상80 쿠버네티스 컨트롤 플레인은 포트 범위에서 할당한다(기본값: 30000-32767)                          nodePort: 30007

(3) LoadBalancer

  • 클라우드 공급자의 로드 밸런서를 사용하여 서비스를 외부에 노출시킵니다.

  • 클러스터 외부 IP를 가지고 있기 때문에, 클러스터 외부에서 접근 가능합니다.

  • 외부 로드 밸런서가 라우팅되는 NodePort와 ClusterIP 서비스가 자동으로 생성됩니다.

  • 프라이빗 클라우드 환경에서는 MetalLB를 이용하여 LoadBalancer 타입의 서비스를 이용 할 수 있습니다.

6/02-svc-loadbalancer.yaml

코드 블럭
--- apiVersion: apps/v1 kind: Deployment metadata:   name: nginx2-deployment   labels:     app: nginx spec:   replicas: 3   selector:     matchLabels:       app: nginx 
 template:     metadata:# 선택적 필드     labels:               app: nginx     spec:       containers:       - name: nginx         image: nginx         ports:         - containerPort: 80 --- apiVersion: v1 kind: Service metadata: 
 name: nginx2-service spec:   type:# LoadBalancer기본적으로 그리고 편의상 selector:쿠버네티스 컨트롤 플레인은 포트 범위에서 app할당한다(기본값: nginx30000-32767)    ports:     - protocol: TCP       port: 8088
      targetPortnodePort: 80

(4) ExternalName

  • 값과 함께 CNAME 레코드를 리턴하여, 서비스를 externalName 필드의 콘텐츠에 매핑합니다.

  • 클러스터 내에서 외부 서비스를 이름으로 참조할 수 있게 해주는 서비스 타입입니다.

  • 내부 클러스터에서 외부 DNS 이름을 내부 서비스로 변환하여 접근 가능하게 됩니다.

...

30007
코드 블럭
root@cp-k8s:~/2024_k8s/edu# curl localhost:30007
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
코드 블럭
root@cp-k8s:~/2024_k8s/edu# cat /etc/hosts
127.0.0.1 localhost
192.168.1.10 cp-k8s
192.168.1.101 w1-k8s
192.168.1.102 w2-k8s
192.168.1.103 w3-k8s
root@cp-k8s:~/2024_k8s/edu# curl 192.168.1.102:30007
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

...

(3) LoadBalancer

  • 클라우드 공급자의 로드 밸런서를 사용하여 서비스를 외부에 노출시킵니다.

  • 클러스터 외부 IP를 가지고 있기 때문에, 클러스터 외부에서 접근 가능합니다.

  • 외부 로드 밸런서가 라우팅되는 NodePort와 ClusterIP 서비스가 자동으로 생성됩니다.

  • 프라이빗 클라우드 환경에서는 MetalLB를 이용하여 LoadBalancer 타입의 서비스를 이용 할 수 있습니다.

6/02-svc-loadbalancer.yaml

코드 블럭
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx2-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx2-service
spec:
  type: LoadBalancer
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 8088
      targetPort: 80
코드 블럭
root@cp-k8s:~/2024_k8s/edu/6# k get svc
NAME                  TYPE           CLUSTER-IP       EXTERNAL-IP    PORT(S)          AGE
kubernetes            ClusterIP      10.96.0.1        <none>         443/TCP          3h22m
my-service-nodeport   NodePort       10.100.38.132    <none>         80:30007/TCP     5m1s
nginx-service         ClusterIP      10.103.98.179    <none>         80/TCP           8m1s
nginx2-service        LoadBalancer   10.100.170.165   192.168.1.11   8088:30843/TCP   7s

image-20240523-131147.pngImage Addedimage-20240523-131207.pngImage Added

(4) ExternalName

  • 값과 함께 CNAME 레코드를 리턴하여, 서비스를 externalName 필드의 콘텐츠에 매핑합니다.

  • 클러스터 내에서 외부 서비스를 이름으로 참조할 수 있게 해주는 서비스 타입입니다.

  • 내부 클러스터에서 외부 DNS 이름을 내부 서비스로 변환하여 접근 가능하게 됩니다.

6/03-svc-externalname.yaml

코드 블럭
apiVersion: v1
kind: Service
metadata:
  name: my-database
spec:
  type: ExternalName
  externalName: db.example.com

...

1.3 MetalLB 설치(Private 환경에서의 로드 밸런서)

(1) metallb 네임스페이스 생성 (이미 생성해 두었음)

코드 블럭
[root@m-k8s vagrant]# kubectl create ns metallb-system

(2) metallb 설치 (이미 생성해 두었음)

6/04-metallb-install.txt

코드 블럭
[root@m-k8s vagrant]# kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.11/config/manifests/metallb-native.yaml
namespace/metallb-system configured
customresourcedefinition.apiextensions.k8s.io/addresspools.metallb.io created
customresourcedefinition.apiextensions.k8s.io/bfdprofiles.metallb.io created
customresourcedefinition.apiextensions.k8s.io/bgpadvertisements.metallb.io created
customresourcedefinition.apiextensions.k8s.io/bgppeers.metallb.io created
customresourcedefinition.apiextensions.k8s.io/communities.metallb.io created
customresourcedefinition.apiextensions.k8s.io/ipaddresspools.metallb.io created
customresourcedefinition.apiextensions.k8s.io/l2advertisements.metallb.io created
serviceaccount/controller created
serviceaccount/speaker created
role.rbac.authorization.k8s.io/controller created
role.rbac.authorization.k8s.io/pod-lister created
clusterrole.rbac.authorization.k8s.io/metallb-system:controller created
clusterrole.rbac.authorization.k8s.io/metallb-system:speaker created
rolebinding.rbac.authorization.k8s.io/controller created
rolebinding.rbac.authorization.k8s.io/pod-lister created
clusterrolebinding.rbac.authorization.k8s.io/metallb-system:controller created
clusterrolebinding.rbac.authorization.k8s.io/metallb-system:speaker created
configmap/metallb-excludel2 created

...

코드 블럭
[root@m-k8s vagrant]# kubectl get all -n metallb-system
NAME                              READY   STATUS    RESTARTS   AGE
pod/controller-5567fb94fd-mn6jg   1/1     Running   0          2m4s
pod/speaker-2pxpd                 1/1     Running   0          2m3s
pod/speaker-lpnmf                 1/1     Running   0          2m3s
pod/speaker-q8hvp                 1/1     Running   0          2m3s

NAME                      TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
service/webhook-service   ClusterIP   10.108.47.177   <none>        443/TCP   2m4s

NAME                     DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
daemonset.apps/speaker   3         3         3       3            3           kubernetes.io/os=linux   2m4s

NAME                         READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/controller   1/1     1            1           2m4s

NAME                                    DESIRED   CURRENT   READY   AGE
replicaset.apps/controller-5567fb94fd   1         1         1       2m4s
[root@m-k8s vagrant]# kubectl get pod -n metallb-system -o wide
NAME                          READY   STATUS    RESTARTS   AGE     IP               NODE     NOMINATED NODE   READINESS GATES
controller-5567fb94fd-mn6jg   1/1     Running   0          2m13s   172.16.221.164   w1-k8s   <none>           <none>
speaker-2pxpd                 1/1     Running   0          2m12s   192.168.1.102    w2-k8s   <none>           <none>
speaker-lpnmf                 1/1     Running   0          2m12s   192.168.1.10     m-k8s    <none>           <none>
speaker-q8hvp                 1/1     Running   0          2m12s   192.168.1.101     Running   0          2m12s  w1-k8s   <none>           <none>

(4) IPAddressPool 생성

  • 외부로 노출할 VIP에 대한 범위를 지정합니다.

  • 아이피 대역은 실제 External IP로 사용할 IP를 적어줍니다. (노드에서 할당이 가능하여야 함)

6/05-metallb-ipaddresspool.yaml

코드 블럭
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: first-pool
  namespace: metallb-system
spec:
  addresses:
  - 192.168.1.101    w1-k8s   <none>           <none>

(4) IPAddressPool 생성

  • 외부로 노출할 VIP에 대한 범위를 지정합니다.

  • 아이피 대역은 실제 External IP로 사용할 IP를 적어줍니다. (노드에서 할당이 가능하여야 함)

6/05-metallb-ipaddresspool.yaml

코드 블럭
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: first-pool
  namespace: metallb-system
spec:
  addresses:
  - 192.168.1.150-192.168.1.200
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: first-pool-advertisement
  namespace: metallb-system
spec:
  ipAddressPools:
  - first-pool

...

.150-192.168.1.200
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: first-pool-advertisement
  namespace: metallb-system
spec:
  ipAddressPools:
  - first-pool
코드 블럭
root@cp-k8s:~/2024_k8s/edu/6# k get IPAddressPool -n metallb-system
NAME           AUTO ASSIGN   AVOID BUGGY IPS   ADDRESSES
first-pool     true          false             ["192.168.1.150-192.168.1.200"]
  • 생성

코드 블럭
kubectl apply -f 05-metallb-ipaddresspool.yaml
configmap/configipaddresspool.metallb.io/first-pool created
l2advertisement.metallb.io/first-pool-advertisement created

정보

Loadbalancer 타입으로 서비스를 생성해보고, External IP가 할당되었는지 확인해봅니다.

...