• Ingress Controller 를 사용하는 이유: L7의 부하분산 역할을 한다. 
  • 하나의 Ingress 를 통해 여러 Service 를 통합 지원
  • HTTP 연결 지원
  • load balancing
  • SSL termination
  • Name 기반 virtual Hosting
  • 외부에서 접근시 https로 접근시 ingress에서 인증서를 관리
  • client -> https -> ingress -> http -> service로 

Ingress Controller 시나리오

-ingress 엔진을 traefik으로 사용한다.
- rules에 host: www.webapp1.com으로 요청이 들어오면 webapp1으로 포워딩한다는 의미
- 서비스 객체를 2개(lab, www) 만들어 놓고 분산을 시킨다.
- path가 /class인 경우, /home인 경우 분산을 시킨다.

1.서비스 객체를 2개 생성 (개별 테스트를 하기위해서 2개 생성)

kubectl create deployment webapp1  --image=nasamjang02/app:v1
kubectl expose deployment webapp1  --type=NodePort --port=80 #@ 외부에서 접근가능하도록 NodePort로 설정
kubectl create deployment webapp2  --image=nasamjang02/app:v2
kubectl expose deployment webapp2  --type=NodePort --port=80


root@ip-172-31-4-27:~# kubectl get deploy,svc,rs,po
NAME                      READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/webapp1   1/1     1            1           2m33s
deployment.apps/webapp2   1/1     1            1           109s

NAME                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
service/app1         ClusterIP   10.104.31.130    <none>        80/TCP         76m
service/kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP        2d7h
service/webapp1      NodePort    10.101.171.207   <none>        80:31048/TCP   2m14s
service/webapp2      NodePort    10.98.238.77     <none>        80:31042/TCP   104s

NAME                                 DESIRED   CURRENT   READY   AGE
replicaset.apps/webapp1-5b9448d6c4   1         1         1       2m33s
replicaset.apps/webapp2-5dc7d6fd6    1         1         1       109s

NAME                           READY   STATUS    RESTARTS   AGE
pod/webapp1-5b9448d6c4-46mbt   1/1     Running   0          2m33s
pod/webapp2-5dc7d6fd6-hsrkm    1/1     Running   0          109s

2. 내부 리소스의 접근 권한을 만들어준다. RBAC을 이용하여 리소스 접근 권한을 설정한다.

ingress_rbac.yaml 명세서 작성

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: traefik-ingress-controller
rules:
  - apiGroups:
      - ""
    resources:
      - services #아래 3개의 접근을 허용
      - endpoints
      - secrets
    verbs:
      - get # 수정불가하고 나머지 3개는 가능
      - list
      - watch
  - apiGroups:
      - extensions
    resources:
      - ingresses #ingresses에 관한 권한 허용
    verbs:
      - get
      - list
      - watch
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: traefik-ingress-controller
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: traefik-ingress-controller
subjects:
- kind: ServiceAccount #ServiceAccount가 pod내에 프로세스에 주체
  name: traefik-ingress-controller
  namespace: kube-system

3. 생성 및 확인

root@ip-172-31-4-27:~/ingress# kubectl create -f ingress_rbac.yaml 
Warning: rbac.authorization.k8s.io/v1beta1 ClusterRole is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 ClusterRole
clusterrole.rbac.authorization.k8s.io/traefik-ingress-controller created
Warning: rbac.authorization.k8s.io/v1beta1 ClusterRoleBinding is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 ClusterRoleBinding
clusterrolebinding.rbac.authorization.k8s.io/traefik-ingress-controller created

4. traefik-ds.yaml 명세서 작성

apiVersion: v1
kind: ServiceAccount #ServiceAccount에 assign할 주체를 설정
metadata:
  name: traefik-ingress-controller
  namespace: kube-system
---
kind: DaemonSet
apiVersion: apps/v1
metadata:
  name: traefik-ingress-controller
  namespace: kube-system
  labels:
    k8s-app: traefik-ingress-lb
spec:
  selector:
    matchLabels:
      k8s-app: traefik-ingress-lb
      name: traefik-ingress-lb
  template:
    metadata:
      labels:
        k8s-app: traefik-ingress-lb
        name: traefik-ingress-lb
    spec:
      serviceAccountName: traefik-ingress-controller #pod의 ServiceAccount 지정한다 (프로세스에 대한 User)
      terminationGracePeriodSeconds: 60
      containers:
      - image: traefik:v1.7
        name: traefik-ingress-lb
        ports:
        - name: http
          containerPort: 80 # 컨테이너 하나에 포트2개 80, 8080
          hostPort: 80 # 80으로 요청이 들어오면 80으로 포워딩한다
        - name: admin
          containerPort: 8080
          hostPort: 8080
        securityContext: #보안context 설정한다
          capabilities: #기본특권
            drop:
            - ALL #기본특권 다 버리고
            add:
            - NET_BIND_SERVICE #네트워크 인터페이스 공유권한만 추가 (호스트의 
        args:
        - --api #args 추가
        - --kubernetes
        - --logLevel=INFO
---
kind: Service #Service 객체가 올라간다
apiVersion: v1
metadata:
  name: traefik-ingress-service
  namespace: kube-system
spec:
  selector:
    k8s-app: traefik-ingress-lb
  ports:
    - protocol: TCP
      port: 80
      name: web
    - protocol: TCP
      port: 8080
      name: admin

5. 생성 및 확인

root@ip-172-31-4-27:~/ingress# kubectl create -f traefik-ds.yaml 
serviceaccount/traefik-ingress-controller created
daemonset.apps/traefik-ingress-controller created
service/traefik-ingress-service created

6. ingress_rule.yaml 명세서 작성

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-test
  annotations:
    kubernetes.io/ingress.class: traefik
spec:
  rules:
  - host: www.webapp1.com #로 접근하면 webapp1로 포워딩
    http:
      paths:
      - backend:
          serviceName: webapp1
          servicePort: 80
        path: /
  - host: www.webapp2.com  #로 접근하면 webapp2로 포워딩
    http:  
      paths: 
      - backend: 
           serviceName: webapp2 
           servicePort: 80 
        path: /

7. 생성 및 확인

#kubectl create -f ingress_rule.yaml

	root@ip-172-31-4-27:~/ingress# kubectl create -f ingress_rule.yaml 
	Warning: extensions/v1beta1 Ingress is deprecated in v1.14+, unavailable in v1.22+; use networking.k8s.io/v1 Ingress
	ingress.extensions/ingress-test created

#curl -H "Host: www.webapp1.com" http://master_ip/
	root@ip-172-31-4-27:~/ingress# curl -H "Host: www.webapp1.com" http://172.31.4.27/
	This is app v1 test…

#curl -H "Host: www.webapp2.com" http://master_ip/
	root@ip-172-31-4-27:~/ingress# curl -H "Host: www.webapp2.com" http://172.31.4.27/
	This is app v2 test…

#kubectl get svc,ds,po -o wide --all-namespaces |grep traefix

#curl -H "Host: www.webapp1.com" http://Service_IP/
	root@ip-172-31-4-27:~/ingress# curl -H "Host: www.webapp1.com" http://172.31.13.180/
	This is app v1 test…

#curl -H "Host: www.webapp1.com" http://Service_IP/

kubectl edit -n kube-system svc traefik-ingress-service
type=NodePort  로 변경 (외부에서 적근가능하도록)
kubectl get -n kube-system svc  (Node port확인 후 접속)

8. 외부에서 접근 확인

'클라우드 컴퓨팅 & NoSQL > k8s' 카테고리의 다른 글

limit range/resource-quota 시나리오  (0) 2020.12.06
Pod의 Resource 관리  (0) 2020.12.03
Service Controller  (0) 2020.12.03
Job/CronJob Controller  (0) 2020.12.03
DaemonSetController  (0) 2020.12.03

+ Recent posts