kmg28801 / kubernetes-study

2 stars 0 forks source link

Chapter 5. 서비스 : 클라이언트가 파드를 검색하고 통신을 가능하게 함 #6

Open kmg28801 opened 1 year ago

kmg28801 commented 1 year ago

서비스

image

세션 어피니티 서비스 생성 yaml

apiVersion: v1
kind: Service
metadata:
  name: kubia
spec:
  sessionAffinity: ClientIP
  ports:
  - port: 80
    targetPort: 8080
  selector:
    app: kubia

멀티 포트 서비스 생성 yaml

apiVersion: v1
kind: Service
metadata:
  name: kubia
spec:
  ports:
  - name: http
    port: 80
    targetPort: 8080
  - name: https
    port: 443
    targetPort: 8443
  selector:
    app: kubia

서비스 검색

환경변수를 통한 서비스 검색

서비스 IP에 핑을 할 수 없는 이유

서비스 엔드포인트

kmg48801@cloudshell:~ (kubers-368504)$ kubectl describe svc kubia-loadbalancer
Name:                     kubia-loadbalancer
Namespace:                default
Labels:                   <none>
Annotations:              cloud.google.com/neg: {"ingress":true}
Selector:                 app=kubia
Type:                     LoadBalancer
IP Family Policy:         SingleStack
IP Families:              IPv4
IP:                       10.1.1.160
IPs:                      10.1.1.160
LoadBalancer Ingress:     34.64.123.50
Port:                     <unset>  80/TCP
TargetPort:               8080/TCP
NodePort:                 <unset>  31697/TCP
Endpoints:                10.0.128.28:8080,10.0.128.29:8080,10.0.128.30:8080
Session Affinity:         None
External Traffic Policy:  Cluster
Events:
  Type    Reason                Age    From                Message
  ----    ------                ----   ----                -------
  Normal  EnsuringLoadBalancer  2m43s  service-controller  Ensuring load balancer
  Normal  EnsuredLoadBalancer   107s   service-controller  Ensured load balancer

서비스 엔드포인트 수동 구성

엔드포인트 생성 yaml

apiVersion: v1
kind: Endpoints
metadata:
  name: external-service # 엔드포인트 오브젝트의 이름은 서비스 이름과 일치해야함
subsets:
  - addresses:
    - ip: 11.11.11.11 # 서비스가 연결 전달한 엔드포인트 IP
    - ip: 22.22.22.22
    ports:
    - port: 80 # 엔드포인트 대상 포트

외부 서비스를 위한 별칭

외부 서비스 yaml

apiVersion: v1
kind: Service
metadata:
  name: external-service
spec:
  type: ExternalName # 서비스 유형을 ExternalName으로 설정
  externalName: someapi.somecompany.com #실제 서비스의 정규화된 도메인 이름 (FQDN)
  ports:
  - port: 80

외부 클라이언트에 서비스 노출

노드포트 서비스

노드포트 서비스 yaml

apiVersion: v1
kind: Service
metadata:
  name: kubia-nodeport
spec:
  type: NodePort # 서비스 유형을 노드포트로 설정
  ports:
  - port: 80 # 서비스 내부 클러스터 IP 포트
    targetPort: 8080 #서비스 대상 파드의 포트
    nodePort: 30123 #각 클러스터 노드의 포트 30123으로 서비스에 액세스 가능
  selector:
    app: kubia

외부 로드밸런서로 서비스 노출

로드밸런서 서비스 yaml

apiVersion: v1
kind: Service
metadata:
  name: kubia-loadbalancer
spec:
  type: LoadBalancer # 이 유형의 서비스는 쿠버네티스 클러스터를 호스팅하는 인프라에서 로드밸런서를 얻는다.
  ports:
  - port: 80
    targetPort: 8080
  selector:
    app: kubia

외부 연결의 특성 이해

인그레스

인그레스 생성 yaml (교재대로 하면 안됨)

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
spec:
  defaultBackend:
    service:
      name: kubia-nodeport
      port:
        number: 80
  rules:
  - http:
      paths:
      - path: /
        pathType: ImplementationSpecific
        backend:
          service:
            name: kubia-nodeport
            port:
              number: 80

인그레스에서 사용할 서비스 yaml

apiVersion: v1
kind: Service
metadata:
  name: kubia-nodeport
spec:
  type: NodePort # 서비스 유형을 노드포트로 설정
  ports:
  - port: 80 # 서비스 내부 클러스터 IP 포트
    targetPort: 8080 #서비스 대상 파드의 포트
  selector:
    app: kubia
image

TLS 트래픽 처리용 인그레스 구성

TLS 트래픽 처리용 인그레스

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
spec:
  tls:
  - hosts:
    - kubia.example.com
    secretName: tls-secret
  defaultBackend:
    service:
      name: kubia-nodeport
      port:
        number: 80
  rules:
  - http:
      paths:
      - path: /
        pathType: ImplementationSpecific
        backend:
          service:
            name: kubia-nodeport
            port:
              number: 80

레디니스 프로브

레디니스 프로브 동작

image

레디니스 프로브를 가진 레플리카셋 (교재에서는 레플리케이션컨트롤러로 했지만, 레플리케이션컨트롤러는 이제 안쓰이기 때문에 replicaset으로 실습 진행)

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: kubia
spec:
  replicas: 3
  selector:
    matchLabels:
      app: kubia
  template:
    metadata:
      labels:
        app: kubia
    spec:
      containers:
      - name: kubia
        image: luksa/kubia
        readinessProbe:
          exec:
            command:
            - ls
            - /var/ready  
kmg48801@cloudshell:~ (kubers-368504)$ kubectl get po
NAME          READY   STATUS    RESTARTS   AGE
kubia-2l9dg   0/1     Running   0          2m27s
kubia-fh46k   0/1     Running   0          2m27s
kubia-xgx5s   0/1     Running   0          2m27s
kmg48801@cloudshell:~ (kubers-368504)$
kmg48801@cloudshell:~ (kubers-368504)$ kubectl get po
NAME          READY   STATUS    RESTARTS   AGE
kubia-2l9dg   0/1     Running   0          3m50s
kubia-fh46k   1/1     Running   0          3m50s
kubia-xgx5s   0/1     Running   0          3m50s
kmg48801@cloudshell:~ (kubers-368504)$

서비스 문제 해결

요약

쿠버 치트 history

kubectl apply -f kubia-svc.yml
kubectl delete svc --all
kubectl get po
kubectl delete po --all
kubectl apply -f kubia-replicaset.yaml
kubectl get rs
kubectl get po
kubectl exec kubia-dq8nv -- curl http://10.1.3.80

curl http://kubia.default.svc.cluster.local
curl http://kubia.default
curl http://kubia

kubectl describe svc kubia
kubectl get endpoints kubia
kubectl get svc
kubectl delet svc kubia
kubectl delete svc --all
kubectl apply -f external-service.yml
kubectl apply -f external-service-endpoints.yml
kubectl delete po --all
kubectl get po
kubectl exec kubia-gj7db env

kubectl get nodes -o jsonpath='{.items[*].status.addresses[?(@.type=="ExternalIP")].address}'

kmg48801@cloudshell:~ (kubers-368504)$ kubectl describe svc kubia-loadbalancer
Name:                     kubia-loadbalancer
Namespace:                default
Labels:                   <none>
Annotations:              cloud.google.com/neg: {"ingress":true}
Selector:                 app=kubia
Type:                     LoadBalancer
IP Family Policy:         SingleStack
IP Families:              IPv4
IP:                       10.1.1.160
IPs:                      10.1.1.160
LoadBalancer Ingress:     34.64.123.50
Port:                     <unset>  80/TCP
TargetPort:               8080/TCP
NodePort:                 <unset>  31697/TCP
Endpoints:                10.0.128.28:8080,10.0.128.29:8080,10.0.128.30:8080
Session Affinity:         None
External Traffic Policy:  Cluster
Events:
  Type    Reason                Age    From                Message
  ----    ------                ----   ----                -------
  Normal  EnsuringLoadBalancer  2m43s  service-controller  Ensuring load balancer
  Normal  EnsuredLoadBalancer   107s   service-controller  Ensured load balancer
thesun4sky commented 1 year ago

@kmg28801 님, 수고하셨습니다.

superadmin22 commented 1 year ago

수고 많으셨습니다!