【deprecated】oktetoで無料Kubernetesを遊び尽くす
現在oktetoでは無料プランが終わってしまったようなので、この記事の内容は古くなっています。
Okteto CloudとOkteto Self-hostedの二種類ありますが、以降は全てOkteto Cloudの話をします。
一人で無料で使う場合は機能制限があったり、リソース使用量の制限があるので注意。
え・・・十分すぎない?
Setup
アカウントを作成する
まずはアカウントを作成してみましょう
この右の「Login with GitHub」ボタンをクリックして進めていってください。
アカウント作成が完了すると以下の画面が開きます。
(Option) okteto CLIのsetup
okteto CLIを利用するとUIをターミナル上から様々な操作ができます。
遊ぶ分にはUIからぽちぽちやれば十分なのでCLIのセットアップは任意です。
- [公式ページ]を参考にokteto CLIのインストール
- ターミナルで
okteto login
を実行する。いくつか選択肢がでてくるのでhttps://cloud.okteto.com (Okteto Cloud)
を選択する - ブラウザにログイン完了のメッセージが出ればログイン完了!
- ターミナルのメッセージに従って
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コマンド実行できるんですよ。素晴らしいですよね。
これができれば各種チュートリアルやハンズオンを簡単にできるようになります。
やり方は簡単。
-
続いて
Download Config File
をクリック
-
後はダウンロードした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パイプライン設定方法
公式ドキュメントはこちら
以下の順番でマニフェストを自動検知してくれるので、まずは自動で検知する方式で遊んでみましょう。
- 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.
- Kubernetes manifests folder: if your repository has a manifests, kubernetes, or k8s folder, Okteto will detect it and run kubectl apply on the folder.
- 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.
- 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.
- Docker-compose file: if your repository has a docker-compose.yaml, Okteto will detect it and run okteto stack deploy --build on this file.
- 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します。参考
いざ尋常にデプロイ!
-
ダッシュボードを開きます
-
上の「Deploy」ボタンをクリックする
-
Deploy画面から該当するリポジトリを選ぶ
3.1 リポジトリが一覧に出ない場合、「Configure GitHub」から該当するリポジトリのアクセスを許可する
3.2 リポジトリを選択し、Deployボタンをクリックする
- 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通信できるエンドポイントを公開できます。
- 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
- 確認
❯ 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ようのプレビューページを作ってくれるらしい。便利すぎますね!!!
やり方は以下のチュートリアルをそのままなぞればよいので、ところどころ端折ります。
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
- まずOkteto API Tokenを取得します。
Settings > Setup > Developer Settings > New Tokens
出てきたTokenをコピーします。
- 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は以下のようになっています。
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上にコンテナ作成
実際の開発現場ではこういったフローが一般的にあり得るのではと思います。
ということでこのフローを体験してみましょう!
といっても公式のチュートリアルを流すだけなのでかいつまんで説明します!
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は以下の通り。
例えばオペレータは使えないようになっています。Elastic Cloud on Kubernetesインストールしようとしたら怒られました🥺
Helmを利用すれば色々使えるようになる(Fluxをインストールできたので)と思うのですが、Helmのリポジトリ追加はDeveloper Pro Planより上である必要があります。
Oktetoボタン
※以下のボタンをクリックすると自分の環境で突然アプリケーションのデプロイが走るので注意
便利通り越して怖くないですか・・・?
ということでoktetoを遊び尽くしました!たのし〜〜〜!!
今度ハンズオンやるときはokteto使おうかな。
Discussion
Okteto Cloud(OktetoのSaaSの無料ティア)は、2024年1月15日に終了しています。
ありがとうございます!!記事のタイトルに追記しておきますね