🐙

【deprecated】oktetoで無料Kubernetesを遊び尽くす

2021/12/03に公開
2

現在oktetoでは無料プランが終わってしまったようなので、この記事の内容は古くなっています。

https://okteto.com
最近知ったoktetoというサービス。無料でKubernetesを使えそうだということでとにかく遊び尽くしてみたいと思います。
Okteto CloudとOkteto Self-hostedの二種類ありますが、以降は全てOkteto Cloudの話をします。

一人で無料で使う場合は機能制限があったり、リソース使用量の制限があるので注意。

え・・・十分すぎない?

Setup

アカウントを作成する

まずはアカウントを作成してみましょう

この右の「Login with GitHub」ボタンをクリックして進めていってください。
アカウント作成が完了すると以下の画面が開きます。

(Option) okteto CLIのsetup

okteto CLIを利用するとUIをターミナル上から様々な操作ができます。
遊ぶ分にはUIからぽちぽちやれば十分なのでCLIのセットアップは任意です。

  1. [公式ページ]を参考にokteto CLIのインストール
  2. ターミナルでokteto loginを実行する。いくつか選択肢がでてくるのでhttps://cloud.okteto.com (Okteto Cloud)を選択する
  3. ブラウザにログイン完了のメッセージが出ればログイン完了!
  4. ターミナルのメッセージに従ってokteto context update-kubeconfigを実行してkubectlのconfigも設定しておく
❯ okteto login
✓  https://cloud.okteto.com (Okteto Cloud)
Authentication will continue in your default browser
You can also open a browser and navigate to the following address:
https://cloud.okteto.com/auth/authorization-code
 ✓  Context 'cloud.okteto.com' created
 ✓  Using context aoi1 @ cloud.okteto.com
 i  Run 'okteto context update-kubeconfig' to update your kubectl credentials

⛵ cloud_okteto_com (aoi1) in okteto-sample on  master [?] took 14s
❯ okteto context update-kubeconfig
 i  Updated kubernetes context 'cloud_okteto_com/aoi1' in '[/Downloads/okteto-kube.config /Users/.kube/config]'

ローカル環境からkubectlでコマンド実行できるよう設定する

※okteto CLIのセットアップでconfigを設定した方はこのパートをスキップしてください

ローカル環境からkubectlコマンド実行できるんですよ。素晴らしいですよね。
これができれば各種チュートリアルやハンズオンを簡単にできるようになります。
やり方は簡単。

  1. 続いてDownload Config Fileをクリック

  2. 後はダウンロードしたconfig fileをkubectlに読み込ませれば終わりです。
    kubectlに設定するには画面に書かれているコマンドをコピペすれば使えるようになります。

こんな感じ。

$ export KUBECONFIG=$HOME/Downloads/okteto-kube.config:${KUBECONFIG:-$HOME/.kube/config}
$ kubectl config current-context
cloud_okteto_com

// 本題とは逸れるのですがStarshipを使うと自分がどのクラスタやnamespaceを利用しているかわかって便利です☺️

さあ、遊ぶぞ!🤸‍♀️

PodリソースをデプロイしてNginxコンテナを立ち上げよう

ではまずKubernetes公式サイトから拝借したPodマニフェストを利用してNginxコンテナを立ち上げたいと思います。

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.14.2
    ports:
    - containerPort: 80

oktetoでは色々な方法でデプロイできるみたいです。
今回は以下の二通りを試してみようと思います。

  • ローカル環境から手動デプロイ
  • GitHubリポジトリを利用して自動デプロイ

ローカル環境から手動デプロイ

やっぱ最初はkubectl apply -fっしょ!
ということでこちらの手動デプロイ方法を試してみます。
前の章でkubectlのconfigを設定した環境で利用してください。

ではコマンド一つでいってみよー!

cat << EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.14.2
    ports:
    - containerPort: 80
EOF

しばらくするとできています

❯ kubectl get po
NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          73s

GOOD! 👍

せっかくなのでブラウザでもみてみましょう。
kubectl port-forwardを利用し・・・

❯ kubectl port-forward nginx 8080:80
Forwarding from 127.0.0.1:8080 -> 80
Forwarding from [::1]:8080 -> 80

ブラウザでlocalhostにアクセス!

こんにちは!!

GitHubリポジトリを利用して自動デプロイ

毎回kubectl applyは面倒だとか、マニフェストをきちんとリポジトリで管理したいというファナタ!
oktetoのパイプラインを設定することで、GitHubリポジトリを利用した自動デプロイができます。

oktetoパイプライン設定方法

公式ドキュメントはこちら
以下の順番でマニフェストを自動検知してくれるので、まずは自動で検知する方式で遊んでみましょう。

  1. Helm Chart: if your repository has a chart, charts, helm/chart, or helm/charts directory with a Chart.yaml file in it, Okteto will detect the chart and run helm upgrade --install on it.
  2. Kubernetes manifests folder: if your repository has a manifests, kubernetes, or k8s folder, Okteto will detect it and run kubectl apply on the folder.
  3. Kubernetes manifests file: if your repository has a manifests.yaml, kubernetes.yaml, or k8s.yaml file, Okteto will detect it and run kubectl apply on the manifest file.
  4. Okteto Stacks file: if your repository has a okteto-stack.yaml file, Okteto will detect it and run okteto stack deploy --build on this file.
  5. Docker-compose file: if your repository has a docker-compose.yaml, Okteto will detect it and run okteto stack deploy --build on this file.
  6. Okteto Manifest file: if your repository has an okteto.yml or .okteto/okteto.yml file, Okteto will detect it and run okteto push on the manifest file.

リポジトリの準備

今回okteto-sampleというリポジトリを使います。
manifestsというディレクトリを作成し、sample-pod.yamlを作成してpushします。参考

いざ尋常にデプロイ!

  1. ダッシュボードを開きます

  2. 上の「Deploy」ボタンをクリックする

  3. Deploy画面から該当するリポジトリを選ぶ
    3.1 リポジトリが一覧に出ない場合、「Configure GitHub」から該当するリポジトリのアクセスを許可する

3.2 リポジトリを選択し、Deployボタンをクリックする

  1. DashboardでRunnningになったら完了!

kubectl get podからも確認できます

❯ k get po                                                                                                                                          [~/github.com/okteto-sample][master]
NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          38s

(Option) okteto CLIを利用する方法

okteto pipeline deploy

を実行することでパイプラインを実行することもできます。

❯ okteto pipeline deploy 
i  Pipeline URL: https://cloud.okteto.com/#/spaces/aoi1?resourceId=d5f95f14
 ✓  Pipeline 'okteto-sample' scheduled for deployment

サービスを公開してみる

毎回port-forwardしても良いですが、外に公開してみたいですよね。
なんと公開も簡単!dev.okteto.com/auto-ingress: "true"ラベルをつけるだけでhttps通信できるエンドポイントを公開できます。

  1. Podをデプロイする
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.14.2
    ports:
    - containerPort: 80

冒頭で作成したNginx用Podにapp: nginxラベルをつけてください。
2. Serviceをデプロイする

cat << EOF | kubectl apply -f -
apiVersion: v1
kind: Service
metadata:
  name: hello-nginx
  labels:
    app: nginx
  annotations:
    dev.okteto.com/auto-ingress: "true"
spec:
  type: LoadBalancer
  ports:
    - port: 8080
      protocol: TCP
      targetPort: 80
  selector:
    app: nginx
EOF
  1. 確認
❯ k get svc
NAME          TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
hello-nginx   ClusterIP   10.151.181.110   <none>        8080/TCP   19m

⛵ cloud_okteto_com (aoi1) in okteto-sample/manifests on  master [!?]
❯ k get ingress
NAME                 CLASS    HOSTS                               ADDRESS        PORTS     AGE
okteto-hello-nginx   <none>   hello-nginx-aoi1.cloud.okteto.net   35.111.121.73   80, 443   19m

ingressのHOSTSに書かれているホストにアクセスするとNginxのページを開くことができます!

こんにちはー!

Preview Environmentを使ってみる

修正PRを出したらPRようのプレビューページを作ってくれるらしい。便利すぎますね!!!
やり方は以下のチュートリアルをそのままなぞればよいので、ところどころ端折ります。
https://okteto.com/docs/tutorials/preview-environments/

Step 1: Fork the Repository

Forkする!私は間違えてcloneした!

Step 2: Create the GitHub Workflow

「Actions」タブからActionsを有効にしてください!
また.github/workfolws/preview.yamlのcyndylopezを自分の利用するnamespaceに変更してください。

Step 3: Configure your Okteto API Token

  1. まずOkteto API Tokenを取得します。
    Settings > Setup > Developer Settings > New Tokens

出てきたTokenをコピーします。

  1. GitHubのリポジトリに移動し、Tokenを登録します。
    Settings > Secrets > Actions secrets > New repository secret

Token名はOKTETO_TOKEN、1で取得したTokenをペースとしてSecretを作成する。

Step 4: Open a Pull Request

あとはPRを作成するだけです。
とりあえず適当にfrontend/src/index.htmlに文字列を追加します

PRを作成してしばらくすると自動でPRのプレビューページが!

クリックするとプレビューページに追加した文字列が表示されているのがわかります。

かなりすぐプレビューページが作成されます。素晴らしい🎉

ちなみにokteto pipelineは以下のようになっています。
https://github.com/okteto/kubernetes-preview-environment/blob/master/okteto-pipeline.yml

icon: https://apps.okteto.com/movies/icon.png
deploy:
  - okteto build -t okteto.dev/api:${OKTETO_GIT_COMMIT} api
  - okteto build -t okteto.dev/frontend:${OKTETO_GIT_COMMIT} frontend
  - helm upgrade --install movies chart --set tag=${OKTETO_GIT_COMMIT}
devs:
  - api/okteto.yml
  - frontend/okteto.yml

開発フローを一通りまわしてみる

プログラム作成→Docker Image作成→Docker Imageビルド・プッシュ→Kuebernetes上にコンテナ作成
実際の開発現場ではこういったフローが一般的にあり得るのではと思います。
ということでこのフローを体験してみましょう!
といっても公式のチュートリアルを流すだけなのでかいつまんで説明します!
https://okteto.com/docs/tutorials/getting-started-with-pipelines/

Step 1: Code the Hello World application

ここでhello-worldディレクトリを作成していますが、作らないほうがそのあとがスムーズです。
最後go run main.goすると動作確認できる!

Step 2: Define a Dockerfile for building the Docker image of the Hello World application

コピペ!Dockerfileつくる!

Step 3: Create Kubernetes manifests to deploy the Hello World application on Okteto Cloud

コピペ!詳細な内容はKubernetes公式ドキュメントを読むなどして理解してくれよな!

Step 4: Automate the deployment of the Hello World application with an Okteto Pipeline

ここが肝。

deploy:
  - okteto build -t okteto.dev/hello-world:latest
  - kubectl apply -f k8s
  • okteto build -t okteto.dev/hello-world:latestこれでDocker build及びOkteto Registoryにイメージをpushする
  • kubectl apply -f k8s素直にapply

Docker build&pushがOktetoの世界の中で完結するのすごいな。

ちなみにokteto-pipeline.yamlを一番上の階層におかないと動かないので、もしStep1でhello-worldディレクトリを作った方は少し工夫が必要そう。(私は面倒だったのでhello-worldディレクトリは作成せず)

Step 5: Deployment time!

これまでのStepをローカルで実行していた方は一旦GitHub.comにpushするなどしてください。
あとはドキュメントに書かれている通り実行するとhttps://hello-world-aoi1.cloud.okteto.netでアクセスできるようになりました!

GitOpsを体験してみる

GitOpsなんぞやというかた、なんとOktetoで簡単に体験できちゃいます!すごい!
公式のブログをそのままなぞっていきましょう。

Getting Started with Flux on Okteto Cloud

まずはリポジトリをforkします。

Deploy Flux from the Okteto Cloud Application Catalog

かかれている通りにぽちぽちしていくとFluxが自分の環境で立ち上がります。

このFluxがデプロイを担当してくれるソフトウェアになります。

Give Flux Write Access

書かれている通りにやる。

Commit a Small Change

$YOU_GITHUB_IDを実際に自分のGitHub IDに置き換えてmasterダイレクトプッシュ!(ふつうはやっちゃだめです)
そうするとしばらくたったらdev-hello-worldというアプリケーションが勝手に立ち上がってきますね!すごい!

ということでGitOps体験でした。

今までは「デプロイボタンを押す」「GitHub Actionsを起動する」というkick操作を行ってデプロイしていましたが、今回はmaster pushという操作をしただけでデプロイの操作は何もしていません。
それはFluxがリポジトリを監視し、変更があったことを検知して自動でデプロイ作業をしてくれたからです。
これがGitOps!
その証拠にmaster pushした直後から何か動き出すわけではなく、しばらく待つ必要があったかと思います。
GitOpsはpull型になるので、push型のCIOpsとは違っていつデプロイ処理が走るか正確なタイミングに関してはデプロイツールにお任せすることになります。

その他

ハマったところ

  • okteto-pipeline.yamlは一番上の階層に置いておく必要があるらしい。hello-worldディレクトリ以下に置いてても検知してくれなかった

できないこと

Okteto Cloud gives you access to a vanilla Kubernetes namespace in a multi-tenant environment.

マルチテナント環境(1つのクラスタに複数ユーザーが共存)での提供なので、できないこともたくさんあります。
これは無料のDeveloperプランだからというわけではなく、Oktetoのサービス運用モデルとしてできないようになっています。
詳細なRBACは以下の通り。
https://okteto.com/docs/cloud/multitenancy/#rbac

例えばオペレータは使えないようになっています。Elastic Cloud on Kubernetesインストールしようとしたら怒られました🥺

Helmを利用すれば色々使えるようになる(Fluxをインストールできたので)と思うのですが、Helmのリポジトリ追加はDeveloper Pro Planより上である必要があります。

Oktetoボタン

※以下のボタンをクリックすると自分の環境で突然アプリケーションのデプロイが走るので注意
Develop on Okteto

便利通り越して怖くないですか・・・?

ということでoktetoを遊び尽くしました!たのし〜〜〜!!
今度ハンズオンやるときはokteto使おうかな。

Discussion