Application 배포 (pod(deployment) > service > ingress(alb))

cd ~/k8s-repo
mkdir app
cd app

app-deploy.yaml 파일 생성 및 배포

cat <<EOF > app-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: my-app
          image: pengbai/docker-supermario
          imagePullPolicy: Always
          ports:
            - containerPort: 8080
EOF
kubectl apply -f app-deploy.yaml
kubectl get deploy
kubectl get pod

Untitled

# (참고)
# pod 로그 확인
kubectl logs <pod-name>

# pod 내부 접속
kubectl exec -it <pod-name> -- bash

ls

app-service.yaml 파일 생성 및 배포

cat <<EOF > app-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: my-app-svc
spec:
  selector:
    app: my-app
  type: ClusterIP
  ports:
    - port: 8080
      targetPort: 8080
      protocol: TCP
EOF
kubectl apply -f app-service.yaml
kubectl get svc

Untitled



ALB Controller 생성

# IAM OIDC 확인
aws eks describe-cluster --name <cluster-name> --query "cluster.identity.oidc.issuer" --output text
aws iam list-open-id-connect-providers | grep B92E974912A4423AC4B83041B266E3FE # /id/ 뒤에 값으로 변경
cd ~/k8s-repo
mkdir alb-controller
cd alb-controller
# ALB Controller IAM Role 생성
curl -o iam-policy.json <https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.8.1/docs/install/iam_policy.json>

aws iam create-policy \\
    --policy-name AWSLoadBalancerControllerIAMPolicy-<name> \\
    --policy-document file://iam-policy.json
# ALB controller serviceaccount 생성
eksctl create iamserviceaccount \\
    --cluster <cluster-name> \\
    --namespace kube-system \\
    --name aws-load-balancer-controller \\
    --attach-policy-arn <policy-arn> \\
    --override-existing-serviceaccounts \\
    --approve
# cert-manager 설치
# pod 간의 http 통신을 할 수 있게끔
kubectl apply --validate=false -f <https://github.com/jetstack/cert-manager/releases/download/v1.12.3/cert-manager.yaml>
# ALB Controller 설치
wget <https://github.com/kubernetes-sigs/aws-load-balancer-controller/releases/download/v2.8.1/v2_8_1_full.yaml>

vi v2_8_1_full.yaml  
# cluster-name을 자신의 cluster-name으로 변경 후 저장
# ServiceAccount 삭제 (apiVersion, kind, metadata 전부)

kubectl apply -f v2_8_1_full.yaml
# ingressclass 파라미터 사용을 위한 작업
wget <https://github.com/kubernetes-sigs/aws-load-balancer-controller/releases/download/v2.8.1/v2_8_1_ingclass.yaml>

kubectl apply -f v2_8_1_ingclass.yaml
# ALB controller 생성 확인
kubectl get deployment -n kube-system aws-load-balancer-controller

Untitled

Untitled

Untitled

Untitled

Untitled

Untitled

Untitled

Untitled

Untitled

app-alb.yaml 파일 생성 및 배포

❗❗그 전에 ALB 배포할 public 서브넷 태그 달아주기❗❗

(public1 / public2 모두 key-value 넣어줘야함)

kubernetes.io/cluster/<cluster-name> shared
kubernetes.io/role/elb 1

Untitled

cd ~/k8s-repo/app

cat <<EOF > app-alb.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
    name: my-app-ingress
    namespace: default
    annotations:
      alb.ingress.kubernetes.io/scheme: internet-facing # 외부에서 접속
      alb.ingress.kubernetes.io/target-type: ip
      alb.ingress.kubernetes.io/group.name: my-alb
      alb.ingress.kubernetes.io/group.order: '1'
spec:
    ingressClassName: alb
    rules:
    - http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: "my-app-svc"
                port:
                  number: 8080
EOF
kubectl apply -f app-alb.yaml
kubectl get ingress

Untitled

Application 접속 확인