Search

Linkerd

App
Linkerd Cli Install
curl --proto '=https' --tlsv1.2 -sSfL https://run.linkerd.io/install-edge | sh export PATH=$HOME/.linkerd2/bin:$PATH linkerd version
Shell
복사
linkerd cli를 사용하여 kubernetes 검증 과정은 진행
linkerd check --pre
Shell
복사
linkerd를 Kubernetes에 배포
Gateway API CRDs 설치
kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.2.1/standard-install.yaml
Shell
복사
Linkerd CRDs 설치
linkerd install --crds | kubectl apply -f -
Shell
복사
Linkerd Control Plane 설치
linkerd install | kubectl apply -f -
Shell
복사
Linkerd Viz(옵션) 설치
linkerd viz install | kubectl apply -f -
Shell
복사
설치 확인
linkerd check
Shell
복사
Dashboard
linkerd viz dashboard &
Shell
복사
나중에 TrafficSplit 같은 SMI도 사용하기 위해서 linkerd smi 설치
curl -sL https://linkerd.github.io/linkerd-smi/install | sh linkerd smi install | kubectl apply -f - linkerd smi check
Shell
복사
Linkerd를 설치하게 되면 Linkerd에서는 자동으로 mTLS 설정을 해주기에 설정할 필요가 없습니다. 이제 사용할 namespace에 annotation을 추가하면 됩니다.
kubectl create ns app kubectl annotate ns app linkerd.io/inject=enabled
Shell
복사
apiVersion: apps/v1 kind: Deployment metadata: name: customer-svc namespace: app spec: replicas: 2 selector: matchLabels: app: customer-svc template: metadata: labels: app: customer-svc spec: containers: - name: customer-svc image: 362708816803.dkr.ecr.ap-northeast-2.amazonaws.com/customer:latest ports: - containerPort: 8080 --- apiVersion: v1 kind: Service metadata: name: customer-svc namespace: app spec: selector: app: customer-svc ports: - port: 80 targetPort: 8080 type: ClusterIP
YAML
복사
apiVersion: apps/v1 kind: Deployment metadata: name: payment-svc namespace: app spec: replicas: 2 selector: matchLabels: app: payment-svc template: metadata: labels: app: payment-svc spec: containers: - name: payment-svc image: 362708816803.dkr.ecr.ap-northeast-2.amazonaws.com/payment:latest ports: - containerPort: 8081 --- apiVersion: v1 kind: Service metadata: name: payment-svc namespace: app spec: selector: app: payment-svc ports: - port: 80 targetPort: 8081 type: ClusterIP
YAML
복사
kubectl apply -f customer-app.yaml -n app kubectl apply -f payment-app.yaml -n app
Shell
복사
Ingress 배포
public_a=$(aws ec2 describe-subnets --filters "Name=tag:Name,Values=skills-public-subnet-a" --query "Subnets[].SubnetId[]" --region ap-northeast-2 --output text) public_b=$(aws ec2 describe-subnets --filters "Name=tag:Name,Values=skills-public-subnet-b" --query "Subnets[].SubnetId[]" --region ap-northeast-2 --output text) private_a=$(aws ec2 describe-subnets --filters "Name=tag:Name,Values=skills-private-subnet-a" --query "Subnets[].SubnetId[]" --region ap-northeast-2 --output text) private_b=$(aws ec2 describe-subnets --filters "Name=tag:Name,Values=skills-private-subnet-b" --query "Subnets[].SubnetId[]" --region ap-northeast-2 --output text) public_subnet_name=("$public_a" "$public_b") private_subnet_name=("$private_a" "$private_b") for name in "${public_subnet_name[@]}" do aws ec2 create-tags --resources $name --tags Key=kubernetes.io/role/elb,Value=1 done for name in "${private_subnet_name[@]}" do aws ec2 create-tags --resources $name --tags Key=kubernetes.io/role/internal-elb,Value=1 done
Shell
복사
helm repo add eks https://aws.github.io/eks-charts helm repo update eks helm install aws-load-balancer-controller eks/aws-load-balancer-controller \ -n kube-system \ --set clusterName=$EKS_CLUSTER_NAME \ --set serviceAccount.create=false \ --set serviceAccount.name=aws-load-balancer-controller
Shell
복사
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: app-ingress namespace: app annotations: alb.ingress.kubernetes.io/load-balancer-name: app-alb alb.ingress.kubernetes.io/scheme: internet-facing alb.ingress.kubernetes.io/target-type: ip alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}]' alb.ingress.kubernetes.io/healthcheck-path: /healthz alb.ingress.kubernetes.io/healthcheck-interval-seconds: "5" alb.ingress.kubernetes.io/healthcheck-timeout-seconds: "3" alb.ingress.kubernetes.io/healthy-threshold-count: "3" alb.ingress.kubernetes.io/unhealthy-threshold-count: "2" alb.ingress.kubernetes.io/target-group-attributes: deregistration_delay.timeout_seconds=30 spec: ingressClassName: alb rules: - http: paths: - path: /customer pathType: Prefix backend: service: name: customer-svc port: number: 80 - path: /payment pathType: Prefix backend: service: name: payment-svc port: number: 80
YAML
복사
kubectl apply -f ingress.yaml
Shell
복사

Linkerd로 가중치 기반 라우팅

사용하기 위해서는 linker smi가 설치되있어야 한다.
linkerd-service를 배포해야 하는데 이때 주의해야 할 점은 TargetPort는 app service에 대해 Port를 적으면 된다.
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-svc namespace: app spec: replicas: 2 selector: matchLabels: app: nginx-svc template: metadata: labels: app: nginx-svc spec: containers: - name: nginx-svc image: nginx ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: nginx-svc namespace: app spec: selector: app: nginx-svc ports: - port: 80 targetPort: 80 type: ClusterIP
YAML
복사
kubectl apply -f nginx.yaml
Shell
복사
apiVersion: apps/v1 kind: Deployment metadata: name: apache-svc namespace: app spec: replicas: 2 selector: matchLabels: app: apache-svc template: metadata: labels: app: apache-svc spec: containers: - name: apache-svc image: httpd ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: apache-svc namespace: app spec: selector: app: apache-svc ports: - port: 80 targetPort: 80 type: ClusterIP
YAML
복사
kubectl apply -f apache.yaml
Shell
복사
apiVersion: v1 kind: Service metadata: name: linkerd-svc namespace: app spec: selector: app: linkerd-svc ports: - port: 80 targetPort: 80 type: ClusterIP
YAML
복사
kubectl apply -f linkerd-service.yaml
Shell
복사
apiVersion: split.smi-spec.io/v1alpha2 kind: TrafficSplit metadata: name: linkerd-split namespace: app spec: service: linkerd-svc backends: - service: nginx-svc weight: 50 - service: apache-svc weight: 50
YAML
복사
kubectl apply -f trafficsplit.yaml
Shell
복사
nginx ingress controller 설치
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx helm install ingress-nginx ingress-nginx/ingress-nginx -n ingress-nginx --create-namespace
Shell
복사
정상적으로 동작한다면 ingress로 요청을 보냈을 때 50%씩 트래픽이 분산되어야 한다.
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: web-ingress namespace: app annotations: nginx.ingress.kubernetes.io/service-upstream: "true" spec: ingressClassName: nginx defaultBackend: service: name: linkerd-svc port: number: 80
YAML
복사
kubectl apply -f ingress.yaml
Shell
복사