개발강의정리/DevOps

[데브옵스를 위한 쿠버네티스 마스터] 쿠버네티스 핵심 개념-Services

nineDeveloper 2020. 12. 27.
728x90

Services

포드의 문제점

  • 포드는 일시적으로 생성한 컨테이너의 집합
  • 때문에 포드가 지속적으로 생겨났을 때 서비스를 하기에 적합하지 않음
  • IP 주소의 지속적인 변동, 로드밸런싱을 관리해줄 또 다른 개체가 필요
  • 이 문제를 해결하기위해 서비스라는 리소스가 존재

서비스의 요구사항

  • 외부 클라이언트가 몇 개이든지 프론트엔드 포드로 연결
  • 프론트엔드는 다시 백엔드 데이터베이스로 연결
  • 포드의 IP가 변경될 때마다 재설정 하지 않도록 해야함

서비스의 생성방법

  • kubectl의 expose가 가장 쉬운 방법
  • YAML을 통해 버전 관리 가능
apiVersion: v1
kind: Service
metadata:
  name: http-go-svc
spec:
  ports:
    - port: 80
      targetPort: 8080
  selector:
    app: http-go
$ kubectl create -f http-go-svc.yaml
service/http-go-srv created

$ kubectl create -f http-go-rs.yaml
replicaset.apps/http-go-rs created

$ kubectl get svc
NAME          TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
http-go-svc   ClusterIP   10.102.70.41   <none>        80/TCP    28s
kubernetes    ClusterIP   10.96.0.1      <none>        443/TCP   8h

서비스의 기능 확인

  • 서비스를 생성하면 EXTERNAL-IP를 아직 받지 못한 것을 확인
  • kubectl exec <포드 이름> -- curl 명령어로 확인해보자.
$ kubectl exec http-go-rs-4l52m -- curl 10.12.0.237:80 -s
Welcome! http-go-rs-vsf5n

포드 간의 통신을 위한 ClusterIP

  • 다수의 포드를 하나의 서비스로 묶어서 관리

ClusterIP 정의 예

서비스의 세션 고정하기

  • 서비스가 다수의 포드로 구성하면 웹서비스의 세션이 유지되지 않음
  • 이를 위해 처음 들어왔던 클라이언트 IP를 그대로 유지해주는 방법이 필요
  • sessionAffinity: ClientIP라는 옵션을 주면 해결 완료!

다중 포트 서비스 방법

  • 포트에 그대로 나열해서 사용
$ kubectl get svc
NAME          TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)           AGE
http-go-svc   ClusterIP   10.102.70.41   <none>        80/TCP,443/TCP    4m28s
kubernetes    ClusterIP   10.96.0.1      <none>        443/TCP           9h

서비스하는 IP 정보 확인

  • 서비스 세부 사항에는 연결될 IP에 대한 정보가 존재
$ kubectl describe svc http-go-svc
Name:              http-go-svc
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          app=http-go
Type:              ClusterIP
IP Families:       <none>
IP:                10.102.70.41
IPs:               10.102.70.41
Port:              http  80/TCP
TargetPort:        8080/TCP
Endpoints:         10.8.1.2:8080,10.8.1.3:8080,10.8.1.4:8080
Port:              https  443/TCP
TargetPort:        8443/TCP
Endpoints:         10.8.1.2:8443,10.8.1.3:8443,10.8.1.4:8443
Session Affinity:  ClientIP
Events:            <none>

외부 IP 연결 설정 YAML

  • Service와 Endpoints 리소스 모두 생성 필요

external-svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: external-service
spec:
  ports:
    - port: 80

external-endpoint.yaml

apiVersion: v1
kind: Endpoints
metadata:
  name: external-service
subsets:
  - addresses:
    - ip: 11.11.11.11
    - ip: 22.22.22.22
    ports:
      - port: 80

외부 IP 연결 설정 YAML

  • Service와 Endpoints 연결 구조

실습

  1. GKE로 실습하기 위해 GCP 접속
  2. http-go-deploy.yaml 파일 생성
$ kubectl create deploy --image=gasbugs/http-go http-go --dry-run=client -o yaml > http-go-deploy.yaml
  1. http-go-deploy.yaml 에 service 설정 추가

https://kubernetes.io/docs/concepts/services-networking/service/#defining-a-service

apiVersion: v1
kind: Service
metadata:
  name: http-go-svc
spec:
  selector:
    app: http-go
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
---
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: http-go
  name: http-go
spec:
  replicas: 1
  selector:
    matchLabels:
      app: http-go
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: http-go
    spec:
      containers:
      - image: gasbugs/http-go
        name: http-go
        ports:
        - containerPort: 8080
        resources: {}
status: {}
  1. yaml 설정 내용 생성
$ kubectl create -f http-go-deploy.yaml
service/http-go-svc created
deployment.apps/http-go created
  1. 생성확인
$ kubectl get all
NAME                           READY   STATUS    RESTARTS   AGE
pod/http-go-6d46d6c74d-gwdd9   1/1     Running   0          2m6s
NAME                  TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
service/http-go-svc   ClusterIP   10.36.3.126   <none>        80/TCP    2m7s
service/kubernetes    ClusterIP   10.36.0.1     <none>        443/TCP   2m45s
NAME                      READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/http-go   1/1     1            1           2m7s
NAME                                 DESIRED   CURRENT   READY   AGE
replicaset.apps/http-go-6d46d6c74d   1         1         1       2m7s
  1. IP 할당 확인
$ kubectl get pod -o wide
NAME                       READY   STATUS    RESTARTS   AGE   IP          NODE                                       NOMINATED NODE   READINESS GATES
http-go-6d46d6c74d-gwdd9   1/1     Running   0          18s   10.32.1.8   gke-cluster-1-default-pool-718c64c6-bj5l   <none>           <none>

Endpoints 에 10.32.1.8:8080 할당 확인

$ kubectl describe svc
Name:              http-go-svc
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          run=http-go
Type:              ClusterIP
IP:                10.36.3.126
Port:              <unset>  80/TCP
TargetPort:        8080/TCP
Endpoints:         10.32.1.8:8080
Session Affinity:  None
Events:            <none>

Name:              kubernetes
Namespace:         default
Labels:            component=apiserver
                   provider=kubernetes
Annotations:       <none>
Selector:          <none>
Type:              ClusterIP
IP:                10.36.0.1
Port:              https  443/TCP
TargetPort:        443/TCP
Endpoints:         34.64.230.226:443
Session Affinity:  None
Events:            <none>
  1. replicas 5 설정
$ kubectl scale deploy http-go --replicas=5
deployment.apps/http-go scaled

replica 생성 확인

$ kubectl get pod -w
NAME                       READY   STATUS    RESTARTS   AGE
http-go-6d46d6c74d-gwdd9   1/1     Running   0          4m7s
http-go-6d46d6c74d-kx872   1/1     Running   0          49s
http-go-6d46d6c74d-sm8tq   1/1     Running   0          49s
http-go-6d46d6c74d-tb7vc   1/1     Running   0          49s
http-go-6d46d6c74d-wn465   1/1     Running   0          49s

$ kubectl get pod -o wide
NAME                       READY   STATUS    RESTARTS   AGE     IP           NODE                                       NOMINATED NODE   READINESS GATES
http-go-6d46d6c74d-gwdd9   1/1     Running   0          5m21s   10.32.1.8    gke-cluster-1-default-pool-718c64c6-bj5l   <none>           <none>
http-go-6d46d6c74d-kx872   1/1     Running   0          2m3s    10.32.1.10   gke-cluster-1-default-pool-718c64c6-bj5l   <none>           <none>
http-go-6d46d6c74d-sm8tq   1/1     Running   0          2m3s    10.32.0.5    gke-cluster-1-default-pool-718c64c6-vtxb   <none>           <none>
http-go-6d46d6c74d-tb7vc   1/1     Running   0          2m3s    10.32.1.9    gke-cluster-1-default-pool-718c64c6-bj5l   <none>           <none>
http-go-6d46d6c74d-wn465   1/1     Running   0          2m3s    10.32.2.8    gke-cluster-1-default-pool-718c64c6-7qq2   <none>           <none>
  1. Endpoints 추가 등록된 사항 확인
$ kubectl describe svc
Name:              http-go-svc
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          run=http-go
Type:              ClusterIP
IP:                10.36.3.126
Port:              <unset>  80/TCP
TargetPort:        8080/TCP
Endpoints:         10.32.0.5:8080,10.32.1.10:8080,10.32.1.8:8080 + 2 more...
Session Affinity:  None
Events:            <none>

...
  1. http-go-svc 설정 수정
$ kubectl edit svc http-go-svc

한번 접속한 IP로 계속 접속하게 만드는 설정
타입을 지정하지 않으면 자동으로 ClusterIP로 지정됨

...
spec:
  sessionAffinity: ClientIP
...
  1. 직접 접속 확인

ClientIP를 추가했기 때문에 접속시도시 로드밸런싱 되지 않고 계속 같은 IP로 유지되는 것을 확인할 수 있음

$ kubectl get svc
NAME          TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
http-go-svc   ClusterIP   10.36.3.126   <none>        80/TCP    11m
kubernetes    ClusterIP   10.36.0.1     <none>        443/TCP   11m

$ kubectl run -it --rm --image=busybox bash
If you don't see a command prompt, try pressing enter.
/ # wget -O- -q 10.36.3.126
Welcome! http-go-6d46d6c74d-sm8tq
/ # wget -O- -q 10.36.3.126
Welcome! http-go-6d46d6c74d-sm8tq
/ # wget -O- -q 10.36.3.126
Welcome! http-go-6d46d6c74d-sm8tq
/ # wget -O- -q 10.36.3.126
Welcome! http-go-6d46d6c74d-sm8tq
  1. ClientIP의 timeoutSeconds 를 수정하고 싶을때

service.spec.sessionAffinityConfig.clientIP.timeoutSeconds 는 기본 10800초(3시간)로 설정되어있는데
수정하고 싶은 설정값으로 설정하면 됨

서비스 노출하는 세 가지 방법

  • NodePort: 노드의 자체 포트를 사용하여 포드로 리다이렉션
  • LoadBalancer: 외부 게이트웨이를 사용해 노드 포트로 리다이렉션
  • Ingress: 하나의 IP 주소를 통해 여러 서비스를 제공하는 특별한 메커니즘

노드포트 생성하기

  • 서비스 yaml 파일을 작성
  • type에 NodePort를 지정
  • 30000-32767포트만 사용가능

http-go-np.yaml

apiVersion: v1
kind: Service
metadata:
  name: http-go-svc
spec:
  type: NodePort
  ports:
    - port: 80 # 서비스의 포트
      targetPort: 8080 # 포드의 포트
      nodePort: 30001 # 최종적으로 서비스되는 포트
  selector:
    app: http-go
$ kubectl get svc
NAME          TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
http-go-np    NodePort    10.36.2.195   <none>        80:30001/TCP   47s
http-go-svc   ClusterIP   10.36.3.126   <none>        80/TCP         106m
kubernetes    ClusterIP   10.36.0.1     <none>        443/TCP        107m
  • GCP에서 방화벽 해제 후 노드로 직접 접속
$ gcloud compute firewall-rules create http-go-svc-rule --allow=tcp:30001
Creating firewall...⠹Created [https://www.googleapis.com/compute/v1/projects/freework-gke-test-20201227/global/firewalls/http-go-svc-rule].
Creating firewall...done.
NAME              NETWORK  DIRECTION  PRIORITY  ALLOW      DENY  DISABLED
http-go-svc-rule  default  INGRESS    1000      tcp:30001        False

$ kubectl get node -o wide
NAME                                       STATUS   ROLES    AGE    VERSION             INTERNAL-IP   EXTERNAL-IP     OS-IMAGE                             KERNEL-VERSION 
  CONTAINER-RUNTIME
gke-cluster-1-default-pool-718c64c6-7qq2   Ready    <none>   179m   v1.16.15-gke.4901   10.178.0.4    34.64.177.86    Container-Optimized OS from Google   4.19.112+      
  docker://19.3.1
gke-cluster-1-default-pool-718c64c6-bj5l   Ready    <none>   179m   v1.16.15-gke.4901   10.178.0.3    34.64.68.80     Container-Optimized OS from Google   4.19.112+      
  docker://19.3.1
gke-cluster-1-default-pool-718c64c6-vtxb   Ready    <none>   179m   v1.16.15-gke.4901   10.178.0.2    34.64.142.148   Container-Optimized OS from Google   4.19.112+      
  docker://19.3.1

$ curl 34.64.177.86:30001
Welcome! http-go-6d46d6c74d-tb7vc

노드포트 서비스의 패킷 흐름

그림 출처: https://kubernetes.io/docs/concepts/services-networking/service/

노드포트 실습

  1. http-go-np.yaml 파일 생성 후 수정
$ cp http-go-deploy.yaml http-go-np.yaml

아래와 같이 수정

apiVersion: v1
kind: Service
metadata:
  name: http-go-np
spec:
  type: NodePort
  selector:
    app: http-go
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
      nodePort: 30001

create 하여 http-go-np service 생성

$ kubectl create -f http-go-np.yaml
service/http-go-np created

$ kubectl get svc
NAME          TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
http-go-np    NodePort    10.36.2.195   <none>        80:30001/TCP   47s
http-go-svc   ClusterIP   10.36.3.126   <none>        80/TCP         106m
kubernetes    ClusterIP   10.36.0.1     <none>        443/TCP        107m
  1. 외부 IP 확인
$ kubectl get nodes -o wide
NAME                                       STATUS   ROLES    AGE    VERSION             INTERNAL-IP   EXTERNAL-IP     OS-IMAGE                             KERNEL-VERSION 
  CONTAINER-RUNTIME
gke-cluster-1-default-pool-718c64c6-7qq2   Ready    <none>   177m   v1.16.15-gke.4901   10.178.0.4    34.64.177.86    Container-Optimized OS from Google   4.19.112+      
  docker://19.3.1
gke-cluster-1-default-pool-718c64c6-bj5l   Ready    <none>   177m   v1.16.15-gke.4901   10.178.0.3    34.64.68.80     Container-Optimized OS from Google   4.19.112+      
  docker://19.3.1
gke-cluster-1-default-pool-718c64c6-vtxb   Ready    <none>   177m   v1.16.15-gke.4901   10.178.0.2    34.64.142.148   Container-Optimized OS from Google   4.19.112+      
  docker://19.3.1
  1. gcloud 방화벽 허용 하기
$ gcloud compute firewall-rules create http-go-svc-rule --allow=tcp:30001
Creating firewall...⠹Created [https://www.googleapis.com/compute/v1/projects/freework-gke-test-20201227/global/firewalls/http-go-svc-rule].
Creating firewall...done.
NAME              NETWORK  DIRECTION  PRIORITY  ALLOW      DENY  DISABLED
http-go-svc-rule  default  INGRESS    1000      tcp:30001        False

접속 확인

$ curl 34.64.177.86:30001
Welcome! http-go-6d46d6c74d-tb7vc
$ curl 34.64.68.80:30001
Welcome! http-go-6d46d6c74d-gwdd9
$ curl 34.64.142.148:30001
Welcome! http-go-6d46d6c74d-tb7vc

노드포트를 활용한 로드밸런싱

그림 출처: https://en.wikipedia.org/wiki/Kubernetes

로드밸런스 생성하기

  • NodePort 서비스의 확장된 서비스
  • 클라우드 서비스에서 사용 가능
  • yaml 파일에서 타입을 NodePort 대신 LoadBalancer를 설정
  • 로드 밸런서의 IP 주소를 통해 서비스에 액세스

  • 로드밸런스가 잘 생성됐는지 확인
  • 30533포트는 지정해주지 않으면 임의로 생성됨
$ kubectl get svc

$ curl 34.68.131.99

로드밸런스 서비스의 패킷 흐름

  • 클러스터에 로드밸런싱을 해주는 개체 필요
  • 로드밸런스는 노드포트의 기능을 포함

그림 출처: https://kubernetes.io/docs/concepts/services-networking/service/

실습

  1. http-go-lb.yaml 파일 생성 후 수정
$ cp http-go-np.yaml http-go-lb.yaml

아래와 같이 수정

apiVersion: v1
kind: Service
metadata:
  name: http-go-lb
spec:
  type: LoadBalancer
  selector:
    app: http-go
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080

create 하여 http-go-lb service 생성

$ kubectl create -f http-go-lb.yaml
service/http-go-lb created
  1. 로드밸런스 생성확인

생성하기까지 시간이 조금 걸림 클라우드와 연계된 서비스 이므로 클라우드 환경에서만 생성가능
VitualBox 환경에서는 생성 불가
포트를 정해주지 않았는데 노드 포트가 자동으로 31114로 만들어져서 제공이 된다

$ kubectl get svc -w
NAME          TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
http-go-lb    LoadBalancer   10.36.3.68    34.64.239.127   80:31114/TCP   39s
http-go-np    NodePort       10.36.2.195   <none>        80:30001/TCP   24m
http-go-svc   ClusterIP      10.36.3.126   <none>        80/TCP         130m
kubernetes    ClusterIP      10.36.0.1     <none>        443/TCP        131m
  1. 접속 확인
$ curl 34.64.239.127
Welcome! http-go-6d46d6c74d-gwdd9
  1. Kuebernetes Engine 웹에서 로드밸런서 생성 확인

서비스 및 수신 - http-go-lb - 부하 분산기 생성 확인

GCP의 부하 분산 기능을 사용해 부하 분산기를 생성

연습문제

  • tomcat을 노드포트로 서비스하기(30002번 포트 사용)
  • tomcat을 로드밸런스로 서비스하기(80번 포트 사용)
  1. 기존 생성 서비스 및 pod 모두 삭제
$ kubectl delete all --all
  1. tomcat-deploy-np-lb.yaml 파일 생성
$ kubectl create deploy tomcat --image=tomcat --dry-run=client -o yaml > tomcat-deploy-np-lb.yaml

yaml 파일 수정

https://kubernetes.io/docs/concepts/services-networking/service/#defining-a-service

에서 설정내용 복사 후 수정

apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: tomcat
  name: tomcat
spec:
  replicas: 1
  selector:
    matchLabels:
      app: tomcat
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: tomcat
    spec:
      containers:
      - image: tomcat
        name: tomcat
        resources: {}
status: {}
---
apiVersion: v1
kind: Service
metadata:
  name: tomcat-svc
spec:
  type: NodePort
  selector:
    app: tomcat
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
      nodePort: 30002
---
apiVersion: v1
kind: Service
metadata:
  name: tomcat-lb
spec:
  type: LoadBalancer
  selector:
    app: tomcat
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  1. create
$ kubectl create -f tomcat-deploy-np-lb.yaml
deployment.apps/tomcat created
service/tomcat-svc created
service/tomcat-lb created
  1. tomcat 구동 확인
$ kubectl get pod -w
NAME                      READY   STATUS    RESTARTS   AGE
tomcat-7989d99887-nrhgl   1/1     Running   0          3m22s
  1. 로드 밸런서 및 노드 포트 생성확인
$ kubectl get svc
NAME         TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)        AGE
kubernetes   ClusterIP      10.36.0.1      <none>          443/TCP        3m57s
tomcat-lb    LoadBalancer   10.36.10.205   34.64.239.127   80:32515/TCP   3m54s
tomcat-svc   NodePort       10.36.7.103    <none>          80:30002/TCP   3m54s
  1. 로드 밸런서 접속 확인
$ curl 34.64.239.127
<!doctype html><html lang="en"><head><title>HTTP Status 404 – Not Found</title><style type="text/css">body {font-family:Tahoma,Arial,sans-serif;} h1, h2, h3, b {color:white;background-color:#525D76;} h1 {font-
size:22px;} h2 {font-size:16px;} h3 {font-size:14px;} p {font-size:12px;} a {color:black;} .line {height:1px;background-color:#525D76;border:none;}</style></head><body><h1>HTTP Status 404 – Not Found</h1><hr c
lass="line" /><p><b>Type</b> Status Report</p><p><b>Description</b> The origin server did not find a current representation for the target resource or is not willing to disclose that one exists.</p><hr class="
line" /><h3>Apache Tomcat/9.0.41</h3></body></html>
  1. gcloud 방화벅 룰 추가
$ gcloud compute firewall-rules create tomcat-svc-rule --allow=tcp:30002
Creating firewall...⠹Created [https://www.googleapis.com/compute/v1/projects/freework-gke-test-20201227/global/firewalls/tomcat-svc-rule].
Creating firewall...done.
NAME             NETWORK  DIRECTION  PRIORITY  ALLOW      DENY  DISABLED
tomcat-svc-rule  default  INGRESS    1000      tcp:30002        False
  1. 노드포트 접속 확인
$ curl 34.64.177.86:30002

tomcat 버전 변경

$ kubectl edit deploy tomcat
deployment.apps/tomcat edited

아래와 같이 image명 수정

spec:
...
  template:
  ...
    spec:
      containers:
      - image: consol/tomcat-7.0

업데이트 확인

$ kubectl get pod -w
NAME                      READY   STATUS              RESTARTS   AGE
tomcat-7447869cb8-vwr5s   0/1     ContainerCreating   0          9s
tomcat-7989d99887-nrhgl   1/1     Running             0          18m

로드밸런서 및 노드포트 접속확인

$ curl 34.64.239.127
$ curl 34.64.177.86:30002

인그레스의 필요성

  • 인그레스는 하나의 IP이나 도메인으로 다수의 서비스 제공

ingress (어떤 장소에) 들어감, 입장; 들어갈 수 있는 권리, 입장권

인그레스 생성하기

http-go-ingress.yaml

인그레스 정보 확인 및 접속

  • 접속을 위해서는 반드시 룰에 일치되어야 하므로 HTTP 요청의 host가 gasbugs.com 값을 가질 수 있도록 설정 (/etc/hosts를 변경)
  • 만약 ADDRESS가 장시간 설정되지 않는다면 연결할 노드포트와 포드가 제대로 올라와있는지 확인해야 함.
$ kubectl get ingresses
NAME              HOSTS         ADDRESS        PORTS   AGE
http-go-ingress   gasbugs.com   34.120.67.97   80      56s

$ sudo vim /etc/hosts
34.120.67.97  gasbugs.com

$ curl http://gasbugs.com
Welcome! http-go-6d46d6c74d-q6hwh

다수의 서비스를 제공하고 싶을 때는?

$ kubectl get ingress
NAME      HOSTS                                              ADDRESS        PORTS   AGE
http-go   www.gasbugs.com dict.gasbugs.com map.gasbugs.com   34.120.67.97   80      56s

$ sudo vim /etc/hosts
34.120.67.97  www.gasbugs.com dict.gasbugs.com map.gasbugs.com

$ curl www.gasbugs.com
Welcome! http-go-6d46d6c74d-q6hwh
$ curl dict.gasbugs.com
Welcome! http-go-6d46d6c74d-q6hwh
$ curl map.gasbugs.com
Welcome! http-go-6d46d6c74d-q6hwh

인그레스 HTTPS 서비스하기

  • TLS 인증성 생성
$ openssl genrsa -out tls.key 2048
Generating RSA private key, 2048 bit long modulus (2 primes)
.....+++++
.....................................................................+++++
e is 65537 (0x010001)

$ openssl req -new -x509 -key tls.key -out tls.cert -days 360 -subj /CN=www.gasbugs.com

$ kubectl create secret tls tls-secret --cert=tls.cert --key=tls.key
secret/tls-secret created

$ curl -k https://www.gasbugs.com
Welcome! http-go-rs-vsf5n

-k 옵션: Allow connections to SSL sites without certs (H)

실습

  1. http-go-deploy.yaml create
$ kubectl create -f http-go-deploy.yaml
service/http-go-svc created
deployment.apps/http-go created

설정 ClusterIP -> NodePort 수정

$ kubectl edit svc http-go-svc
service/http-go-svc edited
...
sepc:
...
  type: NodePort
  1. http-go-ingress.yaml create

https://kubernetes.io/docs/concepts/services-networking/ingress/#the-ingress-resource

내용 복사 후 수정

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: http-go-ingress
spec:
  rules:
  - host: gasbugs.com
    http:
      paths:
      - path: /
        backend:
          serviceName: http-go-svc
          servicePort: 80

create

$ kubectl create -f http-go-ingress.yaml
ingress.networking.k8s.io/http-go-ingress created
  1. ingress 생성 확인
$ kubectl get ingress
NAME              HOSTS         ADDRESS        PORTS   AGE
http-go-ingress   gasbugs.com   34.120.67.97   80      56s
  1. 접속 확인
curl 34.120.67.97

/etc/hosts 에 임시로 도메인 정보 추가

34.120.67.97  gasbugs.com

다시 접속 확인 시 정상응답

$ curl gasbugs.com
Welcome! http-go-6d46d6c74d-q6hwh

연습문제

  1. ingress-tomcat-http-go.yaml create

https://www.notion.so/gasbugs/1ad380a39042434ba71ae286c1560af8

내용 복사 후 create

$ kubectl create -f ingress-tomcat-http-go.yaml
ingress.extensions/tomcat-http-go-ingress created
deployment.apps/deploy-tomcat created
deployment.apps/http-go created
service/http-go created
service/tomcat created
  1. 방화벽 정책 추가
$ gcloud compute firewall-rules create rule1 --allow tcp:30001-30002
Creating firewall...⠹Created [https://www.googleapis.com/compute/v1/projects/freework-gke-test-20201227/global/firewalls/rule1].
Creating firewall...done.
NAME   NETWORK  DIRECTION  PRIORITY  ALLOW            DENY  DISABLED
rule1  default  INGRESS    1000      tcp:30001-30002        False
  1. tis 인증서 추가
kubectl delete secret tls-secret
openssl genrsa -out tls.key 2048
openssl req -new -x509 -key tls.key -out tls.cert -days 360 -subj /CN=tomcat.gasbugs.com
kubectl create secret tls tls-secret --cert=tls.cert --key=tls.key
  1. 생성 확인
$ kubectl get ingress
NAME                     HOSTS                                    ADDRESS         PORTS     AGE
http-go-ingress          gasbugs.com                              34.120.67.97    80        54m
tomcat-http-go-ingress   tomcat.gasbugs.com,http-go.gasbugs.com   35.227.204.85   80, 443   35m
  1. /etc/hosts 에 ip 및 host 정보 추가
34.120.67.97    gasbugs.com
35.227.204.85   tomcat.gasbugs.com
35.227.204.85   http-go.gasbugs.com
  1. 접속 확인
curl -k  https://tomcat.gasbugs.com
curl -k  http-go.gasbugs.com
728x90

댓글

💲 추천 글