TORICO Tech ブログhttps://tech.torico-corp.com/blog/2024-03-28T10:59:55+00:00株式会社TORICO 技術開発チームのブログKubernetes GUIクライアントの紹介2023-07-17T04:37:55+00:002024-03-28T08:21:22+00:00四柳剛https://tech.torico-corp.com/blog/author/yotsuyanagi/https://tech.torico-corp.com/blog/kubernetes-gui-client/<p>当社 TORICO では、Webアプリのサーババックエンドに Kubernetes を使っています。</p>
<p>Kubernetes を使うには覚えなければいけないことが多く、最初はハードルが高いと感じると思います。とくに kubectl コマンドだけを使っていると、内部の階層構造が見えにくく理解が難しく感じます。</p>
<p>GUIクライアントを活用することで、内部の理解がしやすくなり、習得が早まります。</p>
<h2>Rancher</h2>
<p><a href="https://www.rancher.com/">https://www.rancher.com/</a><a href="https://www.rancher.com/" target="_blank"></a></p>
<p><img alt="" height="618" src="https://d1qjlssvz4u32r.cloudfront.net/media/uploads/site-6/kubernetes-gui-client/rancher-1.png" width="1001"/></p>
<p>Web アプリとして動作する Kubernetes クライアントです。</p>
<p>Docker で起動できるので、当社では Kubernetes 上に Rancher を起動させ、各クラスタを操作するのが一般的です。</p>
<p>必要十分な機能があり、構築や操作もわかりやすいので初学におすすめです。<br/>私も Rancher からの学びは多く、心の中では Rancher 先生と呼んでいます。</p>
<p>Helm チャートをブラウザで一覧して、クリックしていくだけでアプリを起動できるのは便利です。</p>
<p><img alt="" height="618" src="https://d1qjlssvz4u32r.cloudfront.net/media/uploads/site-6/kubernetes-gui-client/rancher-2.png" width="1001"/></p>
<p>Kubernetes 上で稼働させていると、たまにログが出てこなくなったりなどの不具合が発生することがありますが、再起動・アップグレードを行うことで改善する場合が多いです。</p>
<p>ただアップグレードの際に起動不能になり、何度か作り直したこともあります。<br/>使う際は、作り直す時に焦らないよう手順書を残しておくと良いでしょう。</p>
<p>当社では、社内の Ubuntu サーバの中の microk8s で Rancher を起動しています。</p>
<p>使っている Kubernetes マニフェストを書いておきます。<br/>Docker イメージのタグ (下記 v2.6-head の箇所)は適宜最新版に修正版に修正してください。</p>
<p><a href="https://hub.docker.com/r/rancher/rancher/tags" target="_blank">Rancher の Docker イメージのタグ</a></p>
<h3>deployment.yml</h3>
<pre>apiVersion: apps/v1
kind: Deployment
metadata:
name: devserver-rancher-deployment
namespace: torico
spec:
replicas: 1
selector:
matchLabels:
app: devserver-rancher
template:
metadata:
labels:
app: devserver-rancher
spec:<br/> # serviceAccountName: devserver-rancher # (追記・後述)
containers:
- name: devserver-rancher
image: rancher/rancher:v2.6-head
imagePullPolicy: Always
ports:
- containerPort: 80
volumeMounts:
- name: data-rancher
mountPath: /var/lib/rancher
volumes:
- name: data-rancher
hostPath:
path: /data/rancher
</pre>
<h3>service.yml</h3>
<pre>apiVersion: v1
kind: Service
metadata:
name: devserver-rancher-service
namespace: torico
spec:
type: NodePort
ports:
- port: 80
protocol: TCP
targetPort: 80
name: devserver-rancher-http
selector:
app: devserver-rancher</pre>
<h3>ingress.yml</h3>
<pre>apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: devserver-rancher-ingress
namespace: torico
spec:
tls:
- hosts:
- devserver-rancher.torico-corp.com
secretName: tls-certificate
rules:
- host: devserver-rancher.torico-corp.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: devserver-rancher-service
port:
number: 80</pre>
<p>追記: 上記のマニフェストだけでは Rancher のトップページで下記のようなエラーを見るかもしれません。</p>
<pre>Failed to create local/local-fleet-local-owner management.cattle.io/v3, Kind=ClusterRoleTemplateBinding for cluster-create fleet-local/local: admission webhook "rancherauth.cattle.io" denied the request: user "system:serviceaccount:torico:default" (groups=["system:serviceaccounts" "system:serviceaccounts:torico" "system:authenticated"]) is attempting to grant RBAC permissions not currently held: {APIGroups:["*"], Resources:["*"], Verbs:["*"]} {APIGroups:["cluster.x-k8s.io"], Resources:["machines"], Verbs:["*"]} {APIGroups:["management.cattle.io"], Resources:["clusters"], Verbs:["own"]} {APIGroups:["provisioning.cattle.io"], Resources:["clusters"], Verbs:["*"]} {APIGroups:["rke-machine-config.cattle.io"], Resources:["*"], Verbs:["*"]} {APIGroups:["rke-machine.cattle.io"], Resources:["*"], Verbs:["*"]} {APIGroups:["rke.cattle.io"], Resources:["etcdsnapshots"], Verbs:["get" "list" "watch"]} {NonResourceURLs:["*"], Verbs:["*"]}</pre>
<p>その場合はアカウントとロールを作ってください。</p>
<pre>kind: ServiceAccount
apiVersion: v1
metadata:
name: devserver-rancher
namespace: torico
labels:
app: devserver-rancher
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: cluster-admin
rules:
- apiGroups: ["*"]
resources: ["*"]
verbs: ["*"]
- nonResourceURLs: ["*"]
verbs: ["*"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: devserver-rancher-cluster-role-binding
labels:
app: devserver-rancher
subjects:
- kind: ServiceAccount
name: devserver-rancher
namespace: torico
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io</pre>
<p>そして、 deployments の ServiceAccount をこのアカウントに設定してください。</p>
<pre>apiVersion: apps/v1<br/>kind: Deployment<br/>...<br/>spec:<br/> ...<br/> template:<br/> ...<br/> spec:<br/> serviceAccountName: devserver-rancher # これ<br/> containers:<br/> ...</pre>
<h2>OpenLens</h2>
<p><a href="https://github.com/MuhammedKalkan/OpenLens" target="_blank">https://github.com/MuhammedKalkan/OpenLens</a></p>
<p>Lens というオープンソースプロジェクトから派生した OpenLens という Kubernetes の GUI クライアントがあります。</p>
<p>PCにインストールして起動させるアプリで、 Electron で作られています。</p>
<p>使った感じは、例えば Cronjobから関係する Job や Pod に掘っていけなかったり、Deployments → Pod → コンテナ と掘っていった後に Pod に戻るUIが無いなど、Rancher と比べると使いにくい点があります。</p>
<p>ただ、「新しいクラスタにとりあえず繋いで調べる」点において非常に便利なので、EKS でクラスタを作った後に管理する時にはよく使います。</p>
<p>kubeconfig ファイルを PC 上で管理し、外部にコピーしたくない場合は良い選択です。</p>
<h3>Lens の歴史</h3>
<p>もともとは Lens というオープンソースプロジェクトがあり、2020年の3月にアプリがリリースされました。</p>
<p><a href="https://medium.com/k8slens/lens-a-year-in-review-90c81e9c1509" target="_blank">Lens — A Year In Review. Just a year ago, in March 2020, we… | by Edward Ionel | k8slens | Medium</a></p>
<p>その後、2020年8月に Mirantis社が Lens プロジェクトを買収します。</p>
<p><a href="https://www.zdnet.com/article/mirantis-acquires-popular-kubernetes-ide-lens/" target="_blank">Mirantis acquires popular Kubernetes IDE Lens | ZDNET</a></p>
<p>結果、Lens は Mirantis 社が提供するフリーミアムのプロジェクトとなりました。</p>
<p><a href="https://k8slens.dev/">https://k8slens.dev/</a></p>
<p>2023年時点では、Free 版 と Pro 版がリリースされています。</p>
<p>Free 版は、業務利用をする場合は年商 $10M (14億円程度) 以下の企業に限られるため、当社では使えませんでした。</p>
<p>Pro版は機能は豊富なものの $19.90/月 です。</p>
<p>Lens がプロプライエタリとなり、フリーミアムの製品となったことに対抗する形で、 OpenLens プロジェクトが立ち上がります。</p>
<p><a href="https://github.com/MuhammedKalkan/OpenLens">https://github.com/MuhammedKalkan/OpenLens</a></p>
<p>もとものオープンソースである Lens の最新リポジトリのビルド成果が公開され、インストールが容易になったのは良かったのですが、v6.3以降は主要機能である「ログ」と「シェル」のボタンが表示されない問題が発生します。</p>
<p><a href="https://github.com/lensapp/lens/issues/6823" target="_blank">https://github.com/lensapp/lens/issues/6823</a></p>
<p>実際にコード上からボタンは削除されており、おそらく Mirantis 社のマネタイズのための変更だと考えられ、オープンソースプロジェクトの姿勢についての話題となり上記Issueは荒れます。</p>
<p>その後、 <a href="https://github.com/alebcay" target="_blank">@alebcay</a> さんが OpenLens に「ログ」と「シェル」のボタンを表示するエクステンションを公開され、それを導入することで OpenLens は実用的な Kubernetes クライアントアプリとして使えます。</p>
<p><a href="https://github.com/alebcay/openlens-node-pod-menu" target="_blank">https://github.com/alebcay/openlens-node-pod-menu</a></p>
<p>このエクステンションを入れない限り、OpenLensはおすすめできません。</p>
<h3>インストール方法</h3>
<pre>brew install --cask openlens</pre>
<p>インストール直後は、Shell と Log のボタンが表示されないため、エクステンションを導入します。</p>
<p><img alt="" height="605" src="https://d1qjlssvz4u32r.cloudfront.net/media/uploads/site-6/kubernetes-gui-client/openlens-1.png" width="1001"/></p>
<ol>
<li>アプリを起動する</li>
<li>メニューバーの OpenLens → Extensions ( Shift + Command + E)</li>
<li>URL入力欄に @alebcay/openlens-node-pod-menu を入力</li>
<li>Install をクリック</li>
</ol>
<p><img alt="" height="639" src="https://d1qjlssvz4u32r.cloudfront.net/media/uploads/site-6/kubernetes-gui-client/openlens-2.png" width="1003"/></p>
<p>インストール直後は Status が Enabled と Disabled で点滅するなどして変な挙動になるかもしれませんが、一度アプリを再起動させ、Extensions ページからプラグインを Enabledにすることで有効になります。</p>
<p><img alt="" height="604" src="https://d1qjlssvz4u32r.cloudfront.net/media/uploads/site-6/kubernetes-gui-client/openlens-3.png" width="1001"/></p>
<h2>k9s</h2>
<p>ターミナル上で動作する TUI アプリです。</p>
<p><a href="https://github.com/derailed/k9s">https://github.com/derailed/k9s</a><a href="https://github.com/derailed/k9s" target="_blank"></a></p>
<p><img alt="" height="531" src="https://d1qjlssvz4u32r.cloudfront.net/media/uploads/site-6/kubernetes-gui-client/k9s-1.png" width="966"/></p>
<p>複数クラスタの管理機能は無く、起動時の環境変数 KUBECONFIG でクラスタを切り替えます。また -n でネームスペースを指定することもできます。 kubectl と同じような使い勝手です。</p>
<p>例えば</p>
<pre>$ KUBECONFIG=${HOME}/.kube/confg-devserver k9s -n torico</pre>
<p>といったコマンドで起動します。</p>
<p>複数クラスタを管理している場合は選択して起動できるようなメニューのスクリプトを作ると使いやすいと思います。</p>
<p>キーバインドは Vim でおなじみの j, k で上下移動で、Enter で掘り下げ、Esc で上階に戻ります。<br/>ステータスを簡易的に確認する、ログを見る、シェルを起動する、程度であれば手軽に実現できます。</p>
<p>全てをキーボードで操作するため、慣れるとUIの軽快さもありかなりの速度で操作できます。複数ある Pod の標準出力を見て回るような操作を爆速でできます。</p>
<h3>インストール方法</h3>
<pre>brew install k9s</pre>
<h2>Devtron</h2>
<p>Kubernetes クライアントの範囲を超えて、CI など広い開発体験を提供するアプリです。</p>
<p><a href="https://docs.devtron.ai/" target="_blank">https://docs.devtron.ai/</a></p>
<p>( 同名で Electron 用のデバッガーアプリがあり、少し紛らわしいです)</p>
<p>Devtron がどんなものであるかは下記の記事に詳しく書いてあります。</p>
<p><a href="https://blog.devgenius.io/devtron-open-source-software-delivery-workflow-for-k8s-23bd136efe06" target="_blank">Devtron: Open-Source Software Delivery Workflow for K8s</a></p>
<p>上記記事によると、Argo CD, コンテナスキャナ, メトリクスの可視化などがパッケージされたものが Devtron のようです。</p>
<p>Helm で Kubernetes にインストールできます。</p>
<h3>インストール方法</h3>
<p><a href="https://docs.devtron.ai/install/install-devtron">https://docs.devtron.ai/install/install-devtron</a></p>
<p>上記の Helm チャートを Rancher 経由で microk8s にインストールしてみようとしましたが、私の環境では失敗しました。</p>
<p>そのため、Devtron はまだ試せていません。今後また再トライしてみたいと思います。</p>PHPをnginx+FPMの環境で動作させる2023-03-07T00:49:45+00:002024-03-28T10:59:55+00:00工藤淳https://tech.torico-corp.com/blog/author/kudou/https://tech.torico-corp.com/blog/php%E3%82%92nginxfpm%E3%81%AE%E7%92%B0%E5%A2%83%E3%81%A7%E5%8B%95%E4%BD%9C%E3%81%95%E3%81%9B%E3%82%8B/<div>
<div style="display: block; margin-left: auto; margin-right: auto;" width="512px"> <img alt="" src="https://d1qjlssvz4u32r.cloudfront.net/media/uploads/site-6/kudou/php-logo.svg.png" width="256px"/></div>
</div>
古いPHPのWebアプリの改修を行うことになりました。<br/> まずはメンテナンス性の確保のためにオレオレフレームワークからLaravelに載せ替える。<br/> また、1台サーバーを使用して動かしていたが、あまり大きなアプリではないので、kubernetesで動作させることにします。<br/> そして合わせて将来的な技術投資としてWebサーバーをApacheからnginx + FastCGI Process Manager(FPM)を試してみることにしました。<br/> その際のdokcerとkubernetesの設定の備忘録になります。<br/> <br/>
<h4>nginxのconfファイルの作成</h4>
まずはLaravelとphp-fpm用にしたnginxのconfファイルを作成。<br/> <strong>default.conf</strong><br/>
<pre>server {
listen 80;
listen [::]:80;
server_name example.com;
access_log /var/log/nginx/host.access.log;
error_log /var/log/nginx/host.error.log;
location / {
root /usr/share/nginx/html;
index index.php index.html index.htm;
# リクエストされたファイルが存在しなければ、Laravelのフロントコントローラーに内部リダイレクトさせる
try_files $uri /index.php?$query_string;
}
# 400番台のエラーページの設定
error_page 404 /404.html;
# 500番台のエラーページの設定
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# Apacheの設定なので今回はコメントアウトのまま
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# FastCGIの設定
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
# Laravelのルートディレクトリ
root /var/www/html/public;
# nginxからphp-fpmに受け渡すIPアドレスとポート番号の設定
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
# 全てのリクエストをLaravelのフロントコントローラーで実行させる
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
include fastcgi_params;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
</pre>
ここでの注意点はnginxからphp-fpmに受け渡すIPアドレスとポート番号の設定<br/> ローカル環境で動作させる場合はdokcerのphp-fpmのコンテナを指定してください。<br/>
<pre>fastcgi_pass php-fpm:9000;
</pre>
kubernetesで動作させる場合は1pod内でnginxのコンテナとphp-fpmのコンテナを動作させるため<code>127.0.0.1:9000</code>で受け取ることができます<br/> <br/>
<h4>nginxのDockerfileの作成</h4>
Docker Hubから最新のものを使用。<br/> <strong>Dockerfile</strong><br/>
<pre>FROM nginx:1.23.3
COPY docker/nginx/default.conf /etc/nginx/conf.d/default.conf
EXPOSE 80 443
STOPSIGNAL SIGQUIT
CMD ["nginx", "-g", "daemon off;"]
</pre>
<br/>
<h4>php-fpmのDockerfileの作成</h4>
こちらもDocker Hubから最新のものを使用。<br/> 注意点はnginxがアクセスできるようにLaravelのプロジェクトを配置しているディレクトリの所有ユーザーを変更すること。<br/> アクセスしてくるのはnginxなので所有ユーザーを<code>www-data</code>に変更しておかないと404エラーになります。<br/> <strong>Dockerfile</strong><br/>
<pre>FROM php:8.1.16-fpm
#PHPの拡張機能のインストール
RUN apt update \
&& apt install -y libonig-dev libxml2-dev libcurl4-openssl-dev libssl-dev libzip-dev \
&& docker-php-ext-install pdo pdo_mysql mysqli simplexml curl phar zip ftp \
&& pecl install xdebug redis \
&& docker-php-ext-enable xdebug redis
# nginxがアクセスできるように所有ユーザーを変更
COPY project /var/www/html
RUN chown -R www-data:www-data /var/www/html
EXPOSE 9000
ENTRYPOINT ["docker-php-entrypoint"]
CMD ["php-fpm"]
</pre>
<br/>
<h4>kubernetesの設定の作成</h4>
kubernetesに反映させるdeployment、service、ingressを作成します。<br/> <strong>deployment.yaml</strong><br/> 1pod内で動作させるためcontainersにnginxとphp-fpmのコンテナを記載します。<br/>
<pre>apiVersion: apps/v1
kind: Deployment
metadata:
name: example-deployment
labels:
app: example
spec:
replicas: 1
selector:
matchLabels:
app: example
template:
metadata:
labels:
app: example
spec:
containers:
- image: php-fpm:latest
name: example-php-fpm
ports:
- containerPort: 9000
protocol: TCP
- image: nginx:latest
name: example-nginx
ports:
- containerPort: 80
protocol: TCP
</pre>
<strong>service.yaml</strong><br/> 外からのアクセスはnginxが受けるのでポートは80番。<br/>
<pre>kind: Service
apiVersion: v1
metadata:
name: example-service
spec:
type: NodePort
selector:
app: example
ports:
- port: 80
targetPort: 80
protocol: TCP
</pre>
<strong>ingress.yaml</strong><br/>
<pre>apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
spec:
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: example-service
port:
number: 80
</pre>
<br/> kubernetesに反映を実行。 これで動作できました。Ubuntu22 に MicroK8s で Kubernetes 環境を構築し、その中で Rancher を起動する2022-06-17T12:42:53+00:002024-03-28T10:49:01+00:00四柳剛https://tech.torico-corp.com/blog/author/yotsuyanagi/https://tech.torico-corp.com/blog/ubuntu22-microk8s-kubernetes-rancher/<p></p>
<p>今まで(2021年頃まで) は、社内サーバの Kubernetes 環境を作る際は、 Rancher を Docker で起動し、その中の RKE で Kubernetes クラスタを構築していました。</p>
<p>ところが、それだと OS のアップデートがあったりした時など、年一回ぐらいのペースでトラブルがあり、環境が再構築不能になってしまっていました。</p>
<p>Rancher + RKE で Kubernetes 環境を作っている場合、トラブルの原因を追うのが非常に難しくて、原因まで解明して解決できたことはありません。</p>
<p>今回は、 Kubernetes 環境は Ubuntu の MicroK8s で起動し、その K8s の中で、 Deployment として Rancher を起動するようにしました。</p>
<p>試してみた所、なかなか快適だったため、今後もこのパターンは使っていこうと思います。</p>
<p>OS は Ubutntu 22.04 で、ノードはシングルノード構成です。やはり OS が Ubutnu の場合は MicroK8s が簡単で安定しており、Ingress なども一発で有効化できるため、セットアップは楽でした。</p>
<h2>1. MicroK8s の セットアップ</h2>
<h3>1-1. インストール</h3>
<pre>sudo snap install microk8s --classic</pre>
<h3>1-2. ユーザーに権限を付与する</h3>
<pre>sudo usermod -a -G microk8s ubuntu<br/>sudo chown -f -R ubuntu ~/.kube<br/>newgrp microk8s</pre>
<h3>1-3. DNS, Ingress の有効化</h3>
<pre>microk8s enable dns ingress</pre>
<h3>1-4. ダッシュボードを使う場合</h3>
<p>Rancher が起動したらダッシュボードは不要だと思いますが、Rancher 起動前の確認用として重宝します。</p>
<pre>microk8s enable dashboard</pre>
<p>Kubernetes のノード上で</p>
<pre>microk8s kubectl port-forward -n kube-system service/kubernetes-dashboard --address 0.0.0.0 31443:443</pre>
<p>してから、<a href="https://%3Cyour-host%3E:31443/">https://<your-host>:31443/</a> を見る</p>
<h2>2. kubeconfig の取得</h2>
<pre>microk8s config</pre>
<p>コピペして、 Mac の <code>.kube/config-<Config名></code> にコピーしておく</p>
<h2>3. namespace の作成</h2>
<p>※ Macで実行</p>
<pre>#!/usr/bin/env zsh<br/><br/>export KUBECONFIG=${HOME}/.kube/config-<Config名><br/><br/>kubectl create namespace <ネームスペース></pre>
<h2>4. secrets の作成</h2>
<p>SSL証明書 (wildcard.example.com.key, wildcard.example.com.crt) を mac のディレクトリに用意して、</p>
<p>※ Macで実行</p>
<pre>#!/usr/bin/env zsh<br/><br/>export KUBECONFIG=${HOME}/.kube/config-<Config名><br/><br/>kubectl -n <ネームスペース> create secret tls tls-certificate \<br/> --key <wildcard.example.com.key> \<br/> --cert <wildcard.example.com.crt></pre>
<h2>5. Rancher のインストール</h2>
<p>サーバに <code>/data/rancher</code> ディレクトリを作っておく</p>
<h4>deployment.yml</h4>
<pre>apiVersion: apps/v1<br/>kind: Deployment<br/>metadata:<br/> name: my-awesome-rancher-deployment<br/> namespace: <ネームスペース><br/>spec:<br/> replicas: 1<br/> selector:<br/> matchLabels:<br/> app: my-awesome-rancher<br/> template:<br/> metadata:<br/> labels:<br/> app: my-awesome-rancher<br/> spec:<br/> containers:<br/> - name: my-awesome-rancher<br/> image: rancher/rancher:v2.6-head<br/> imagePullPolicy: Always<br/> ports:<br/> - containerPort: 80<br/><br/> volumeMounts:<br/> - name: data-rancher<br/> mountPath: /var/lib/rancher<br/><br/> imagePullSecrets:<br/> - name: ecr-credeintial<br/><br/> volumes:<br/> - name: data-rancher<br/> hostPath:<br/> path: /data/rancher</pre>
<h4>service.yml</h4>
<pre>apiVersion: v1<br/>kind: Service<br/>metadata:<br/> name: my-awesome-rancher-service<br/> namespace: <ネームスペース><br/>spec:<br/> type: NodePort<br/> ports:<br/> - port: 80<br/> protocol: TCP<br/> targetPort: 80<br/> name: my-awesome-rancher-http<br/> selector:<br/> app: my-awesome-rancher</pre>
<h4>ingress.yml</h4>
<pre>apiVersion: networking.k8s.io/v1<br/>kind: Ingress<br/>metadata:<br/> name: my-awesome-rancher-ingress<br/> namespace: <ネームスペース><br/>spec:<br/> tls:<br/> - hosts:<br/> - my-awesome-rancher.example.com<br/> secretName: tls-certificate<br/> rules:<br/> - host: my-awesome-rancher.example.com<br/> http:<br/> paths:<br/> - path: /<br/> pathType: Prefix<br/> backend:<br/> service:<br/> name: my-awesome-rancher-service<br/> port:<br/> number: 80</pre>
<p>※ mac で実行</p>
<pre>#!/usr/bin/env zsh<br/><br/>export KUBECONFIG=${HOME}/.kube/config-<Config名><br/><br/>kubectl apply -f deployment.yml<br/>kubectl apply -f service.yml<br/>kubectl apply -f ingress.yml</pre>
<h2>6. Rancher の ブートストラップパスワードの取得</h2>
<p>Rancher を起動すると、「ブートストラップパスワード」が発行され、ログに表示されます。</p>
<p>今回は Kubernetes の Pod として起動しているため、Pod のログを grep します。</p>
<p> ※ Macで実行</p>
<pre>#!/usr/bin/env zsh<br/><br/>export KUBECONFIG=${HOME}/.kube/config-<Config名><br/><br/>pods=( $(kubectl get pod -n <ネームスペース> | egrep -o "my-awesome-rancher-deployment-[a-zA-Z0-9-]+") )<br/><br/>for pod in "${pods[@]}" ; do<br/> kubectl logs -n <ネームスペース> ${pod} | grep "Bootstrap Password:"<br/>done</pre>
<h2>7. ブラウザから Rancher へのログイン</h2>
<p>my-awesome-rancher.example.com (仮のドメインです) というドメインで Rancher が起動しているはずなので、DNS を設定してからブラウザでアクセスします。</p>
<p>Bootstrap Password の入力を求められるので、先程取得したものを入力します。</p>
<p>ローカルで起動している MicroK8s のシングルノードクラスタを自動的に認識し、管理できるようになります。</p>
<h2>付録</h2>
<h3>kubernetes の secret へ、AWS の EKS のログイントークンを登録する Python スクリプト</h3>
<p>当社は、Docker イメージリポジトリは AWS ECR を使っています。<br/>ローカルPCの <code>~/.aws/credentials</code> の認証情報を元に、 Kubernetes の Secret を作るスクリプトを紹介します。</p>
<pre>#!/usr/bin/env python3<br/><br/>import subprocess<br/>import re<br/>import sys<br/><br/>namespace = '<ネームスペース>'<br/>secret_name = 'ecr-credeintial'<br/>aws_region = 'ap-northeast-1'<br/>docker_server = 'https://<AWS-ID>.dkr.ecr.ap-northeast-1.amazonaws.com'<br/><br/><br/>def main():<br/> output = subprocess.check_output([<br/> '/usr/bin/aws', 'ecr', 'get-login',<br/> '--no-include-email', '--region', aws_region,<br/> ]).decode()<br/> words = output.split()<br/> username = words[words.index('-u') + 1]<br/> password = words[words.index('-p') + 1]<br/><br/> // 既に作成済みの secret を消す<br/> command = [<br/> // kubectl の実行環境に合わせて調整してください<br/> 'microk8s', 'kubectl', '-n', namespace, 'delete', 'secret', secret_name]<br/> subprocess.run(command)<br/><br/> // secret を再登録する<br/> command = [<br/> 'microk8s', 'kubectl', '-n', namespace, 'create', 'secret',<br/> 'docker-registry', secret_name,<br/> f'--docker-username={username}',<br/> f'--docker-password={password}',<br/> f'--docker-server={docker_server}'<br/> ]<br/> subprocess.run(command)<br/><br/><br/>if __name__ == '__main__':<br/> main()</pre>