KubeStackを使用してAKSにGOベースのアプリケーションを配備する


このポストでは、私はあなたをKubernetesにGolangアプリケーションを配備する方法を示していますKubestack . KubeStackは、開発速度の展開と増加のリスクを減らすために、Traformに組み込まれたGITOPSオートメーションです.KubeStackを使ってKubernetesのマニフェストをどのように展開するかをカバーする方法はないと言われています.KubeStackのパイプラインの起動方法の詳細についてはhere .
さあ飛び込みましょう.

セットアップ
あなたのフォルダ構造を設定したkubestackパイプラインを一度このようにしてください
    .
    ├── Dockerfile
    ├── Dockerfile.loc
    ├── README.md
    ├── aks_zero_cluster.tf
    ├── aks_zero_ingress.tf
    ├── aks_zero_providers.tf
    ├── manifests
    └── versions.tf
Kubernetesマニフェストを展開するには、クラスタサービスモジュールを使用します.KubeStackでのクラスタサービスモジュールでは、Torraformが直接Torraformを介してKubernetesと対話することができます.これは展開を作成し、名前空間を作成するようなものを展開します.など
開くask-zero_cluster.tf 次の行を追加します
    ...

    module "custom_manifests" {
      providers = {
        kustomization = kustomization.aks_zero
      }
      source  = "kbst.xyz/catalog/custom-manifests/kustomization"
      version = "0.1.0"
      configuration = {
        apps = {
          namespace = "apps-${terraform.workspace}"
          resources = [
                "${path.root}/manifests/apps/namespace.yaml",
            "${path.root}/manifests/apps/deployment.yaml",
            "${path.root}/manifests/apps/service.yaml",
            "${path.root}/manifests/apps/ingress.yaml"
          ]
          common_labels = {
            "env" = terraform.workspace
          }
        }
        ops = {}
        loc = {}
      }
    }
ここでは、カスタムマニフェストクラスタサービスモジュールを初期化し、既存のaks_zero モジュールを使用します.
     providers = {
        kustomization = kustomization.aks_zero
      }
構成ブロックは、魔法が発生する場所です.最初に、私たちは、我々のリソースを使用するためにどのようなワークスペースを展開するかを宣言します

     apps = {
          namespace = "apps-${terraform.workspace}"
          resources = [
                "${path.root}/manifests/apps/namespace.yaml",
            "${path.root}/manifests/apps/deployment.yaml",
            "${path.root}/manifests/apps/service.yaml",
            "${path.root}/manifests/apps/ingress.yaml"
          ]
          common_labels = {
            "env" = terraform.workspace
          }
        }
次に、マニフェストを使用してどの名前空間を展開するかを宣言しますnamespace = "apps${terraform.workspace}" これはapps-ops or apps-apps 現在のワークスペースに応じて、次のリソースブロックは、現在のディレクトリ内のマニフェストフォルダーを展開したいマニフェストを参照してください.クラスタモジュールをセットアップしたので、マニフェストを作成しましょう.
次のコマンドを実行します.
mkdir manifests/apps && cd manifests/apps && touch deployment.yaml service.yaml ingress.yaml
ファイルを次のコードで設定します.
# manifests/apps/namespace.yaml
---
apiVersion: v1
kind: Namespace
metadata:
  name: apps-apps

---
apiVersion: v1
kind: Namespace
metadata:
  name: apps-ops
注:これは新鮮なKubernetesクラスタであるので、KubeStackが名前空間のようにモジュールで指定された順序でリソースを展開するので、名前空間のマニフェストを含んでいますapps-apps が最初に存在する必要があります.
#manifests/apps/deployment.yaml
--------
apiVersion: apps/v1
kind: Deployment
metadata:
  name: ping-api
spec:
  selector:
    matchLabels:
      app: ping-api
  template:
    metadata:
      labels:
        app: ping-api
    spec:
      containers:
      - name: ping-api
        image: ghcr.io/s1ntaxe770r/evil-ekow:latest
        resources:
          limits:
            memory: "128Mi"
            cpu: "500m"
        ports:
        - containerPort: 8080
        env:
          - name: REDIS_CACHE_HOST
            value: "redis-svc"
          - name: REDIS_PORT
            value: "6379"

--------
apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis
spec:
  selector:
    matchLabels:
      app: redis
  template:
    metadata:
      labels:
        app: redis
    spec:
      containers:
      - name: redis
        image: redis:alpine
        resources:
          limits:
            memory: "128Mi"
            cpu: "500m"
        ports:
        - containerPort: 6379

# manifests/apps/service.yaml
--
apiVersion: v1
kind: Service
metadata:
  name: redis-svc
spec:
  selector:
    app: redis
  ports:
  - port: 6379
    targetPort: 6379

--------
apiVersion: v1
kind: Service
metadata:
  name: ping-svc
spec:
  selector:
    app: ping-api
  ports:
  - port: 80
    targetPort: 8080
# manifests/apps/ingress.yaml
--------
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: myingress
  labels:
    name: myingress
spec:
  rules:
  - host: prod.evil.corp
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: ping-svc
            port:
              number: 80
上記のマニフェストは、Redisを使用してキー値のペアを格納するAPIのバージョンを展開します.ソースコードをチェックアウトできますhere .
次に、実行中にこれらの変更をローカルでテストすることができますkbst apply local , すべてがよくなるならば、あなたは以下のようにタグをつけて、配備することができなければなりません:
$ git tag apps-deploy-1
$ git push origin apps-deploy-1

展開へのアクセス
書き込みの際に有効なドメインを持っていないので、展開にアクセスするために私のIngress Controller外部IPを使用していますが、ドメインが適切に設定されている場合は
Kubestack ドキュメント.
まず、Ingressコントローラの外部IPを使用します.
$  kubectl get ingresses -A
次に、次のエントリを作成します/etc/hosts
10.10.20.5   prod.evil.corp
あなたのIngressコントローラ外部IPにIPを変えるようにしてください
http://prod.evil.corp


結論
このポストでは、私はKubeStackを使用してKubenetesマニフェストを展開する方法をカバーします.これはKubetackとしてAzureに限られていないことに注意してください、また、このポストを書くとき、KubetackもGKEとAWSを支持します
documentation プロバイダ固有の手順については.今すぐ行くとgit展開😄