Help us understand the problem. What is going on with this article?

RancherのRioを試す

NTTテクノクロス Advent Calendar 2019の14日目担当の、NTTテクノクロス新倉 (@niiku-y) です。

昨年(2018年)のAdvent Calendarでは Rancher 2.1のHA installを試してみる という記事を書きましたが、今回もコンテナ関連の記事になります。

自己紹介

動機

  • 今回の記事でも、昨年と同様「やったことがないことをやってみる」が動機となっています。

    • 今回、やってみたいと思ったのは Rancher LabsRio . 名前だけ前から聞いたことがあって、興味ありました。また牛です
    • 本記事では、構築時のエラーがなくなり、サンプルが実行でき、Dashboardが見れるくらいまでをまず目標とします。
      • 一度で全部の機能を試すには盛沢山でした。無理しない。
  • 「私自身も経験がなく、Qiita上で探しても情報が少ないもの」を記事にする良い点は、以下と思っています。

    • 自分にとっての初モノをやるのは楽しい。(仕事をやる上で「楽しい」は重要な要素の1つ。)
    • トラブルシューティングの過程などで自分自身も得られるものが多い。
    • 前提条件やハマりどころ、解決方法を記載することで、未来の自分や他の誰かの参考・ヒントになるかもしれない。
    • やってみた実例を増やすことで、検索したとき見つかる情報を増やせる。特に日本語の情報が少ないものであれば、なお良い。

Rancher Rioについて

Rioとは?

  • Github - rancher/rioによると、「The Application Deployment Engine for Kubernetes」
  • Kubernetes 上にデプロイして使うMicroPaaSプラットフォーム。
  • イメージとしては、k8s上のアプリケーションをDocker的UIにより利用できるようにするツール。
    • run -p 8080:80 でアプリケーション起動、のようにコマンドのオプションがDockerと似たような感じになって、分かりやすく操作できるようになっている、と思ってくれればよいです。
  • 感想としては、kubectl等で実施している操作がよりシンプルな手順で扱えるようラッピングしてくれ、Docker-compose以上Kubernetes未満なところをカバーするツールという印象です。

機能

  • Rioの機能は ドキュメント に記載があり、以下のような機能があります。
    • ワークロードの実行とモニタリング、オートスケール
    • サービス間のルーティングの制御
    • 個人のドメイン名、外部サービスの設定
    • リソースの集合をDocker-compose的なファイル Riofile により管理
    • Webhook
    • Continuous Delivery
    • ダッシュボード
    • RBACによる権限管理

コンポーネント

内部で以下のようなComponentを使っています。

基本概念

ドキュメントの Concepts を読んで、知っておいたほうがよさそうな概念を記載しました。

使い始めたばかりで、使ってみると誤解しているところが出てくるかもしれません。
万が一、誤解や間違いがあったら、適宜、訂正したいと思います。

  • Service : スケーラブルなコンテナの集合。rio scaleコマンドでスケールするときの単位。
    • 各サービスはendpointとして以下のようなendpointをもつ
$service_name-$namespace.xxx.clusterdomain
  • Stack : docker-compose のような Riofile というファイルで定義されるリソースの集合のこと

  • Router : トラフィックのロードバランスやルーティングを扱うリソース。ヘッダやプロトコルなどの条件を組み合わせて作るルールによってサービス間通信を制御できる

  • External Service : Rio上のサービスからアクセスできる外部IPアドレスや外部ホスト名をサービスメッシュに登録できる。

  • Public Domain : サービスまたはルータにつけるドメイン名。(個人名を含むドメイン名、または個人を表すドメイン名)

  • Cluster Domain : サービスごとのDNS名。以下 のような名前。

$name-$namespace.xxx.on-rio.io

その他一般的な用語について

その他、Rioを使うにあたり用語として知っておきたいものをメモっておきます。

  • マイクロサービス : 1つのサービスを、複数の小さいサービスの疎結合な集合体として構成するアーキテクチャ

  • Service mesh : サービス同士が網目のように通信するマイクロサービスにおける問題を解決するためのソフトウェア

  • Envoy : Lyft が開発したL4/L7 proxy。API経由の設定変更ができ、サーバ再起動が不要のため、設定変更頻度が高いサービスメッシュでのプロキシサーバとして需要がある

  • Circuit breaker : 障害が起きた時に、それに依存するコンポーネント群に障害が広まらないよう、異常の起きているコンポーネントを使われないように切り離す仕組み

  • mTLS (Mutual TLS)

    • TLS通信でクライアント側、サーバ側が相互に認証する仕組み
    • HTTPS , TLSクライアント認証

さて、ここからは実際に環境構築してrioを使えるようにしていきましょう。

環境情報

今回、お試しで作る環境は以下のような構成にしました。

env.png

構成

  • VM : master 1, node 3の計4台。全て同スペック

    • vCPU : 2 core
    • Memory : 4 GB
    • Disk : 20 GB
    • OS : Ubuntu 18.04
  • container runtime : Docker-ce 19.03

  • Kubernetes : 1.17.0

    • master 1, node 3 のシングルマスター構成
    • kubeadm を使用してクラスタ構築
    • pod network : Cilium 1.6.4
  • Rio : v0.6.0

    • installすると以下が入る
  • その他

    • HTTP proxy : なし
      • HTTP proxyありの構成でlinkerdをうまく構築できませんでした。tap APIに関するエラーが取り切れず、断念しました。
      • proxyが原因とは言い切れず、podネットワークアドオンおよび試行錯誤により何か余計なことをしたことが原因の可能性が高いので、これは再チャレンジする予定です
    • 上記のほか、踏み台サーバあり。
  • podネットワークアドオンをciliumにした経緯

    • flannel v0.11.0 , canal v3.8とv3.10では、 linkerd でエラーが出て構築できなかった。
    • linkerd2 issues #2384 で linkerd2_proxy について私と同じエラー出ていた方が kube-router から cilium に変えたらうまく動いた、と述べていたので、試しに使ってみた。
    • podネットワークアドオンを変え、cilium 1.6.4 にしたら、あっさり動作した。

Requirements

参考までにsystem requirementsを記載しておきます。

ただし、rio自体がベータ版の上、構築したときのk8sクラスタ自体が最新の1.17で、あまりこれに沿って構築していません。(^^;

構築手順

さて、ここからは実際の構築手順を記載します。

VM構築

  • 2 core , 4GB memory , disk 20GB のVMを4台、準備。OSはUbuntu 18.04を指定。

    • VM自体の構築手順は割愛する。
    • sshで鍵ペアにより各ノードにログインできるようにしておく。パスワード認証はオフ
  • VMへのSecurity Group設定

    • 使用するソフトウェアごとに使用するプロトコル、ポート、通信方向を許可する。
    • 今回は各VMについて、outboundを制限せず、inboundを各ソフトウェアのrequirements/firewall rulesなど参照して制限している
    • Kubernetes : install kubeadm に従う
      • master : 2379-2380/TCP, 6443/TCP, 10250-10252/TCP
      • node : 10250/TCP , 30000-32767/TCP
    • cilium
      • master, node : 2379-2380/TCP, 4240/TCP, 8472/UDP, ICMP 0, 8 (0 = echo reply, 8 = echo request)
    • rio
      • linkerd : 4140/TCP, 4143/TCP, 4190/TCP, 4191/TCP, 8080/TCP, 8086/TCP, 9996/TCP
      • テスト用にサービス公開した時に使用したポート(master, node) : 8001/TCP , ソース 0.0.0.0/0
  • OSのパッケージ最新化

    • 手順は割愛
  • ネットワーク設定

    • 名前解決
      • /etc/hosts
        • master, node01, node02, node03と踏み台サーバに対応する private IPアドレスを記載
      • /etc/resolv.conf
        • netplanの設定ファイル /etc/netplan/50-cloud-init.yaml で設定
        • sudo netplan apply で適用
    • シンボリックリンク変更
      • cd /etc/; sudo ln -sf ../run/systemd/resolve/resolv.conf resolv.conf
    • SSH設定
      • /home/ubuntu/.ssh/config で、Host設定
      • ssh-agentのforwarding設定
    • NTP設定
      • /etc/systemd/timesyncd.conf で、NTP=ntp.nict.jpを指定
      • sudo systemctl restart systemd-timesyncd.service

Docker-ceインストール

  sudo sed -i 's/ExecStart=.*/ExecStart=\/usr\/bin\/dockerd -H fd:\/\/ --containerd=\/run\/containerd\/containerd.sock --insecure-registry=172.31.0.0\/16 --mtu=1450/g'   /lib/systemd/system/docker.service 
  sudo systemctl daemon-reload
  sudo systemctl restart docker
  • サービス再起動、構築後の状態確認
    • Server Version、Insecure registriesが反映されていることを確認
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo docker info

Kubernetesクラスタ構築

ランタイムとしてDockerをいれたあと、コンテナオーケストレーションツールとしてk8sを入れる

  • kubeadmインストール手順

    • Ubuntuの手順を参照
    • シングルマスター構成。HA構成ではない
  • masterの構築

    • sudo kubeadm init --pod-network-cidr=10.217.0.0/16
      • CIDRはciliumで使うものを指定している
      • 上記のように、api-serverのadvertise-addressを指定していない場合はmasterのprivate IPアドレスとなる
    • 出力の最後で以下のような文が出るのでメモっておく。nodeのクラスタへの組み込みで使用する
kubeadm join 172.31.4.127:6443 --token yyyyyyyyyyyyyyyyyyyyy \
    --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  • nodeの構築

    • masterでkubeadm initを実行したときに最後に出たkubeadm joinのコマンド列を各nodeで実行する
  • kubectlの準備

    • master, node 3台のうち、kubectlを実行するVMの/home/ubuntu/.kube/configに、masterの/etc/kubernetes/admin.conf をcp
    • sudo chown ubuntu:ubuntu /home/ubuntu/.kube/config
    • kubectl get nodesなどで軽く動作確認
ubuntu@master:~$ kubectl get nodes
NAME     STATUS   ROLES    AGE     VERSION
master   Ready    master   7m22s   v1.17.0
node01   Ready    <none>   4m38s   v1.17.0
node02   Ready    <none>   3m42s   v1.17.0
node03   Ready    <none>   3m18s   v1.17.0
ubuntu@master:~$
ubuntu@master:~$ kubectl get ns
NAME              STATUS   AGE
default           Active   8m7s
kube-node-lease   Active   8m9s
kube-public       Active   8m9s
kube-system       Active   8m9s
ubuntu@master:~$

podネットワークアドオンのインストール

podのネットワークはciliumの1.6.4を使う。

私の環境ではflannel、canalではrioインストール時のエラーが解消できずうまく行かなかった。
cilium 1.6.4はこれ自体がインストールできればrioのインストールは問題なくすぐ終わった。

ciliumのインストール

kubectl create -f https://raw.githubusercontent.com/cilium/cilium/1.6.4/install/kubernetes/quick-install.yaml
kubectl apply -f https://raw.githubusercontent.com/cilium/cilium/1.6.4/examples/kubernetes/connectivity-check/connectivity-check.yaml

以下のように、kube-systemにciliumのpodが起動していることを確認する。
DaemonSetなので、masterおよびnode01, node02, node03に1つずつ起動している。

defaultのnamespaceには Quick InstallationのDeploy the connectivity test にて入れたechoとprobeのpodが起動しているので、それも確認する。

ubuntu@master:~$ kubectl get pods -n kube-system
NAME                               READY   STATUS    RESTARTS   AGE
cilium-4mw67                       1/1     Running   0          117s
cilium-6lx7s                       1/1     Running   0          72s
cilium-9js49                       1/1     Running   0          27s
cilium-operator-69c684d865-p77rd   1/1     Running   0          11m
cilium-rrxp6                       1/1     Running   0          11m
coredns-6955765f44-bl28t           1/1     Running   0          87m
coredns-6955765f44-sbxcx           1/1     Running   0          87m
etcd-master                        1/1     Running   0          87m
kube-apiserver-master              1/1     Running   0          87m
kube-controller-manager-master     1/1     Running   0          87m
kube-proxy-2sgxv                   1/1     Running   0          87m
kube-proxy-68hbj                   1/1     Running   0          85m
kube-proxy-cskdt                   1/1     Running   0          86m
kube-proxy-mmw67                   1/1     Running   0          86m
kube-scheduler-master              1/1     Running   0          87m
ubuntu@master:~$
ubuntu@master:~$ kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
echo-5659cf6c69-bsk6j    1/1     Running   0          14m
echo-5659cf6c69-pswkx    1/1     Running   0          14m
echo-5659cf6c69-snz8j    1/1     Running   0          14m
echo-5659cf6c69-v4jfh    1/1     Running   0          14m
echo-5659cf6c69-wxb86    1/1     Running   0          14m
probe-765cbd6789-6lxzm   1/1     Running   0          14m
probe-765cbd6789-hf95l   1/1     Running   1          14m
probe-765cbd6789-hmgsc   1/1     Running   0          14m
probe-765cbd6789-qk46x   1/1     Running   1          14m
probe-765cbd6789-s76rx   1/1     Running   0          14m
ubuntu@master:~$
ubuntu@master:~$ kubectl -n kube-system exec -ti cilium-rrxp6 -- cilium status
KVStore:                Ok   Disabled
ContainerRuntime:       Ok   Disabled
Kubernetes:             Ok   1.17 (v1.17.0) [linux/amd64]
Kubernetes APIs:        ["CustomResourceDefinition", "cilium/v2::CiliumEndpoint", "cilium/v2::CiliumNetworkPolicy", "cilium/v2::CiliumNode", "core/v1::Endpoint", "core/v1::Namespace", "core/v1::Pods", "core/v1::Service", "networking.k8s.io/v1::NetworkPolicy"]
Cilium:                 Ok   OK
NodeMonitor:            Disabled
Cilium health daemon:   Ok
IPAM:                   IPv4: 2/255 allocated from 10.217.0.0/24,
Controller Status:      11/11 healthy
Proxy Status:           OK, ip 10.217.0.1, port-range 10000-20000
Cluster health:        0/4 reachable   (2019-12-15T13:29:09Z)
  Name                 IP              Reachable   Endpoints reachable
  master (localhost)   172.31.4.127    false       false
  node01               172.31.15.211   false       false
  node02               172.31.3.172    false       false
  node03               172.31.8.162    false       false
ubuntu@master:~$

エラー対処について

ciliumのインストール時に以下のようなエラー(★)が出た場合は、ip linkを調べて重複するものを削除する必要がありました。

ubuntu@master:~$ kubectl logs -n kube-system  cilium-bbf5s
・・・・
level=error msg="Command execution failed" cmd="[/var/lib/cilium/bpf/init.sh /var/lib/cilium/bpf /var/run/cilium/state 10.217.2.1 <nil> vxlan    9001 false false ]" error="exit status 2" subsys=daemon
・・略・・
level=warning msg="+ ip link set cilium_vxlan up" subsys=daemon
level=warning msg="RTNETLINK answers: Address already in use" subsys=daemon ★コレ
level=error msg="Error while initializing daemon" error="exit status 2" subsys=daemon
level=fatal msg="Error while creating daemon" error="exit status 2" subsys=daemon
・・略・・

私は以下のように重複分や不要なlinkを削除してから、エラーになっているpodを削除し、DaemonSetに再度podを作ってもらって復旧させました。

ubuntu@node03:~$ sudo ip link delete flannel.1
ubuntu@node03:~$ sudo ip link delete cilium_vxlan
ubuntu@node03:~$ sudo ip link delete cilium_net
ubuntu@node03:~$ ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP mode DEFAULT group default qlen 1000
    link/ether 02:2e:0b:68:35:3b brd ff:ff:ff:ff:ff:ff
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default
    link/ether 02:42:ad:e2:27:8d brd ff:ff:ff:ff:ff:ff
ubuntu@node03:~$

Rioのインストール

インストール

ここから、やっとRio本体のインストールになります。

ubuntu@master:~$ curl -sfL https://get.rio.io | sh -
[INFO]  Finding latest release
[INFO]  Using v0.6.0 as release
[INFO]  Downloading hash https://github.com/rancher/rio/releases/download/v0.6.0/sha256sum-amd64.txt
[INFO]  Downloading binary https://github.com/rancher/rio/releases/download/v0.6.0/rio-linux-amd64
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   606    0   606    0     0   5008      0 --:--:-- --:--:-- --:--:--  5008
100 46.1M  100 46.1M    0     0  57.9M      0 --:--:-- --:--:-- --:--:-- 79.0M
[INFO]  Verifying binary download
[INFO]  Installing rio to /usr/local/bin/rio
ubuntu@master:~$
ubuntu@master:~$ which rio
/usr/local/bin/rio
ubuntu@master:~$
ubuntu@master:~$ rio install
Deploying Rio control plane....
Generating clusterDomain for this cluster: i90ik6.on-rio.io. Verified clusterDomain is reachable.
rio controller version v0.6.0 (c1bff129) installed into namespace rio-system
Controller logs are available from `rio systemlogs`

Welcome to Rio!

Run `rio run -p 80:8080 https://github.com/rancher/rio-demo` as an example
ubuntu@master:~$

ここで増えたnamespaceを確認してみると、以下の5つのnamespace(★のところ)が追加されています。

  • cattle-global-data, cattle-system
  • linkerd , rio-system , tekton-pipelines
ubuntu@master:~$ kubectl get ns
NAME                 STATUS   AGE
cattle-global-data   Active   18h★
cattle-system        Active   18h★
default              Active   19h
kube-node-lease      Active   19h
kube-public          Active   19h
kube-system          Active   19h
linkerd              Active   20m★
rio-system           Active   21m★
tekton-pipelines     Active   20m★
ubuntu@master:~$ 

linkerdとrio-systemの中にあるpodについて、linkerd-installのjobに紐づくpodがcompletedになっており、他のpodが全てREADYになっていることを確認しましょう。

ubuntu@master:~$ rio -n rio-system pods
NAME                                    CREATED         READY     NODE      IP              STATE       DETAIL
pod/gateway-proxy-v2-6747d6fcfd-6mp92   2 minutes ago   2/2       node01    10.217.1.114    Running
pod/gateway-v2-75b45787c6-5rbrf         2 minutes ago   2/2       node03    10.217.3.180    Running
pod/gloo-75895cb6f8-97g96               2 minutes ago   2/2       node02    10.217.2.22     Running
pod/cert-manager-67896dc5db-9klj5       2 minutes ago   2/2       node01    10.217.1.182    Running
pod/dashboard-55ff777f6d-qb78w          2 minutes ago   2/2       node01    10.217.1.210    Running
pod/autoscaler-588cd6b867-nkvwm         2 minutes ago   2/2       node01    10.217.1.17     Running
pod/webhook-84677f56d-2c5vx             2 minutes ago   2/2       node01    10.217.1.28     Running
pod/socat-l9kp6                         2 minutes ago   1/1       node02    172.31.3.172    Running
pod/socat-q29gb                         2 minutes ago   1/1       node03    172.31.8.162    Running
pod/socat-q7zv6                         2 minutes ago   1/1       node01    172.31.15.211   Running
pod/buildkitd-8669457f8-fwkwt           2 minutes ago   2/2       node02    10.217.2.44     Running
pod/linkerd-install-96chc-7pn8v         2 minutes ago   0/1       node02    10.217.2.189    Succeeded
pod/rio-controller-6b65fbb9d6-z2j6b     3 minutes ago   1/1       node03    10.217.3.48     Running
ubuntu@master:~$

ubuntu@master:~$ kubectl get pods -n linkerd
NAME                                      READY   STATUS    RESTARTS   AGE
linkerd-controller-746c646797-wslvz       3/3     Running   0          72s
linkerd-destination-77bbfc8cbb-psgrr      2/2     Running   0          71s
linkerd-grafana-6674db9584-gfmkl          2/2     Running   0          71s
linkerd-identity-fdb9569fc-r662m          2/2     Running   0          72s
linkerd-prometheus-5c754746-m9tlc         2/2     Running   0          71s
linkerd-proxy-injector-5654bfbdcb-vqmhn   2/2     Running   0          71s
linkerd-sp-validator-7cd98c8549-64rpk     2/2     Running   0          71s
linkerd-tap-5bfbc8c69d-d5vmx              2/2     Running   0          71s
linkerd-web-85f9d6bc4c-2qllk              2/2     Running   0          71s
ubuntu@master:~$
ubuntu@master:~$ kubectl get pods -n rio-system
NAME                                READY   STATUS      RESTARTS   AGE
autoscaler-588cd6b867-nkvwm         2/2     Running     0          76s
buildkitd-8669457f8-fwkwt           2/2     Running     0          95s
cert-manager-67896dc5db-9klj5       2/2     Running     0          76s
dashboard-55ff777f6d-qb78w          2/2     Running     0          76s
gateway-proxy-v2-6747d6fcfd-6mp92   2/2     Running     0          75s
gateway-v2-75b45787c6-5rbrf         2/2     Running     1          76s
gloo-75895cb6f8-97g96               2/2     Running     1          76s
linkerd-install-96chc-7pn8v         0/1     Completed   0          101s
rio-controller-6b65fbb9d6-z2j6b     1/1     Running     1          111s
socat-l9kp6                         1/1     Running     0          95s
socat-q29gb                         1/1     Running     0          95s
socat-q7zv6                         1/1     Running     0          95s
webhook-84677f56d-2c5vx             2/2     Running     0          76s
ubuntu@master:~$

起動しているpodについて、--all-namespacesで見てみるとこんな感じです。

ubuntu@master:~$ kubectl get pods --all-namespaces
NAMESPACE          NAME                                                READY   STATUS      RESTARTS   AGE
default            echo-5659cf6c69-bsk6j                               1/1     Running     0          30m
default            echo-5659cf6c69-pswkx                               1/1     Running     0          30m
default            echo-5659cf6c69-snz8j                               1/1     Running     0          30m
default            echo-5659cf6c69-v4jfh                               1/1     Running     0          30m
default            echo-5659cf6c69-wxb86                               1/1     Running     0          30m
default            gracious-zhukovsky-v069dfm-5b67cbb888-xbg54         2/2     Running     0          11m
default            gracious-zhukovsky-v069dfm-ee709-4e40c-pod-3bb682   0/2     Completed   0          12m
default            probe-765cbd6789-6lxzm                              1/1     Running     0          30m
default            probe-765cbd6789-hf95l                              1/1     Running     1          30m
default            probe-765cbd6789-hmgsc                              1/1     Running     0          30m
default            probe-765cbd6789-qk46x                              1/1     Running     1          30m
default            probe-765cbd6789-s76rx                              1/1     Running     0          30m
kube-system        cilium-4mw67                                        1/1     Running     0          18m
kube-system        cilium-6lx7s                                        1/1     Running     0          18m
kube-system        cilium-9js49                                        1/1     Running     0          17m
kube-system        cilium-operator-69c684d865-p77rd                    1/1     Running     0          28m
kube-system        cilium-rrxp6                                        1/1     Running     0          28m
kube-system        coredns-6955765f44-bl28t                            1/1     Running     0          104m
kube-system        coredns-6955765f44-sbxcx                            1/1     Running     0          104m
kube-system        etcd-master                                         1/1     Running     0          104m
kube-system        kube-apiserver-master                               1/1     Running     0          104m
kube-system        kube-controller-manager-master                      1/1     Running     0          104m
kube-system        kube-proxy-2sgxv                                    1/1     Running     0          104m
kube-system        kube-proxy-68hbj                                    1/1     Running     0          102m
kube-system        kube-proxy-cskdt                                    1/1     Running     0          102m
kube-system        kube-proxy-mmw67                                    1/1     Running     0          103m
kube-system        kube-scheduler-master                               1/1     Running     0          104m
linkerd            linkerd-controller-746c646797-wslvz                 3/3     Running     0          14m
linkerd            linkerd-destination-77bbfc8cbb-psgrr                2/2     Running     0          14m
linkerd            linkerd-grafana-6674db9584-gfmkl                    2/2     Running     0          14m
linkerd            linkerd-identity-fdb9569fc-r662m                    2/2     Running     0          14m
linkerd            linkerd-prometheus-5c754746-m9tlc                   2/2     Running     0          14m
linkerd            linkerd-proxy-injector-5654bfbdcb-vqmhn             2/2     Running     0          14m
linkerd            linkerd-sp-validator-7cd98c8549-64rpk               2/2     Running     0          14m
linkerd            linkerd-tap-5bfbc8c69d-d5vmx                        2/2     Running     0          14m
linkerd            linkerd-web-85f9d6bc4c-2qllk                        2/2     Running     0          14m
rio-system         autoscaler-588cd6b867-nkvwm                         2/2     Running     0          14m
rio-system         buildkitd-8669457f8-fwkwt                           2/2     Running     0          14m
rio-system         cert-manager-67896dc5db-9klj5                       2/2     Running     0          14m
rio-system         dashboard-55ff777f6d-qb78w                          2/2     Running     0          14m
rio-system         gateway-proxy-v2-6747d6fcfd-6mp92                   2/2     Running     0          14m
rio-system         gateway-v2-75b45787c6-5rbrf                         2/2     Running     1          14m
rio-system         gloo-75895cb6f8-97g96                               2/2     Running     1          14m
rio-system         linkerd-install-96chc-7pn8v                         0/1     Completed   0          14m
rio-system         rio-controller-6b65fbb9d6-z2j6b                     1/1     Running     1          14m
rio-system         socat-l9kp6                                         1/1     Running     0          14m
rio-system         socat-q29gb                                         1/1     Running     0          14m
rio-system         socat-q7zv6                                         1/1     Running     0          14m
rio-system         webhook-84677f56d-2c5vx                             2/2     Running     0          14m
tekton-pipelines   tekton-pipelines-controller-55f95fbb9b-ltfhc        1/1     Running     0          14m
tekton-pipelines   tekton-pipelines-webhook-6dd8446c85-fmdfn           1/1     Running     0          14m
ubuntu@master:~$

KubernetesのServiceも見てみましょう。

ubuntu@master:~$ kubectl get svc -n rio-system -o wide
NAME                TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE    SELECTOR
autoscaler          ClusterIP      10.96.70.63     <none>        80/TCP                       100m   app=autoscaler
autoscaler-v0       ClusterIP      10.96.120.12    <none>        80/TCP                       100m   app=autoscaler,version=v0
buildkitd           ClusterIP      10.96.206.142   <none>        8080/TCP,80/TCP              100m   app=buildkitd
buildkitd-v0        ClusterIP      10.96.163.248   <none>        8080/TCP,80/TCP              100m   app=buildkitd,version=v0
cert-manager        ClusterIP      10.96.16.62     <none>        80/TCP                       100m   app=cert-manager
cert-manager-v0     ClusterIP      10.96.64.15     <none>        80/TCP                       100m   app=cert-manager,version=v0
dashboard           ClusterIP      10.96.189.53    <none>        80/TCP                       100m   app=dashboard
dashboard-v0        ClusterIP      10.96.238.103   <none>        80/TCP                       100m   app=dashboard,version=v0
gateway-proxy-v2    LoadBalancer   10.96.105.183   <pending>     80:30100/TCP,443:31175/TCP   100m   gateway-proxy-id=gateway-proxy-v2,gateway-proxy=live
gloo                ClusterIP      10.96.218.113   <none>        9977/TCP,9988/TCP,9966/TCP   100m   gloo=gloo
rio-api-validator   ClusterIP      10.96.136.180   <none>        443/TCP                      101m   rio-controller=true
webhook             ClusterIP      10.96.122.219   <none>        8090/TCP                     100m   app=webhook
webhook-v0          ClusterIP      10.96.60.32     <none>        8090/TCP                     100m   app=webhook,version=v0
ubuntu@master:~$
ubuntu@master:~$ kubectl get svc -n linkerd -o wide
NAME                     TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)             AGE    SELECTOR
linkerd-controller-api   ClusterIP   10.96.133.68    <none>        8085/TCP            101m   linkerd.io/control-plane-component=controller
linkerd-destination      ClusterIP   10.96.119.199   <none>        8086/TCP            101m   linkerd.io/control-plane-component=controller
linkerd-dst              ClusterIP   10.96.39.199    <none>        8086/TCP            101m   linkerd.io/control-plane-component=destination
linkerd-grafana          ClusterIP   10.96.121.26    <none>        3000/TCP            101m   linkerd.io/control-plane-component=grafana
linkerd-identity         ClusterIP   10.96.76.9      <none>        8080/TCP            101m   linkerd.io/control-plane-component=identity
linkerd-prometheus       ClusterIP   10.96.89.170    <none>        9090/TCP            101m   linkerd.io/control-plane-component=prometheus
linkerd-proxy-injector   ClusterIP   10.96.231.46    <none>        443/TCP             101m   linkerd.io/control-plane-component=proxy-injector
linkerd-sp-validator     ClusterIP   10.96.145.210   <none>        443/TCP             101m   linkerd.io/control-plane-component=sp-validator
linkerd-tap              ClusterIP   10.96.92.165    <none>        8088/TCP,443/TCP    101m   linkerd.io/control-plane-component=tap
linkerd-web              ClusterIP   10.96.253.96    <none>        8084/TCP,9994/TCP   101m   linkerd.io/control-plane-component=web
ubuntu@master:~$
ubuntu@master:~$ kubectl get svc -n tekton-pipelines -o wide
NAME                          TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE    SELECTOR
tekton-pipelines-controller   ClusterIP   10.96.171.106   <none>        9090/TCP   108m   app=tekton-pipelines-controller
tekton-pipelines-webhook      ClusterIP   10.96.156.72    <none>        443/TCP    108m   app=tekton-pipelines-webhook
ubuntu@master:~$

proxy環境で試した時にハマったところ

参考までに、proxy環境でrio installした時にどの辺で詰まったのか見てみましょう。

rio installでのpodエラー

  • linkerd-installのjob

linkerdのセットアップ中は、proxy関連と思われるエラーが多かった。
たとえばバージョンチェックのためのURLに接続できないとか↓

ubuntu@node03:~$ kubectl logs -n rio-system linkerd-install-bhbzt-8cld9
・・・・
linkerd-version
---------------
× can determine the latest version
    Get https://versioncheck.linkerd.io/version.json?version=stable-2.6.0&uuid=5d89e6f0-50eb-41c0-9378-b92bc3e7a7aa&source=cli: dial tcp: lookup versioncheck.linkerd.io on 10.96.0.10:53: no such host
    see https://linkerd.io/checks/#l5d-version-latest for hints
? cli is up-to-date
    unsupported version channel: stable-2.6.0
    see https://linkerd.io/checks/#l5d-version-cli for hints

結局、PodPresetなど使い、力づくでエラーを減らしていったのですが、次に記載のdashboardのエラーは原因が分かりませんでした。

  • dashboard

上記linkerdのインストールが不完全なのでそれに引きずられている可能性が高いと思っていましたが、linkerdのnamespaceで全部のpodをREADYにできても、linkerd-installのjobがCompletedになっても、下記のエラーは解消できませんでした。

ubuntu@master:~$ kubectl logs -n rio-system dashboard-86579f65c5-k9d6p
time="2019-12-13T09:40:16Z" level=info msg="Rancher version dev is starting"
time="2019-12-13T09:40:16Z" level=info msg="Rancher arguments {Config:{Kubeconfig: UserKubeconfig: HTTPSPort:443 HTTPPort:80 Namespace: WebhookConfig:{WebhookAuthentication:false WebhookKubeconfig: WebhookURL: CacheTTLSeconds:0}} AuditLogPath:/var/log/auditlog/rancher-api-audit.log AuditLogMaxage:10 AuditLogMaxsize:100 AuditLogMaxbackup:10 AuditLevel:0 Features:}"
time="2019-12-13T09:40:17Z" level=info msg="Starting API controllers"
I1213 09:40:17.107001       6 leaderelection.go:241] attempting to acquire leader lease  kube-system/cattle-controllers...
I1213 09:40:17.110282       6 leaderelection.go:241] attempting to acquire leader lease  kube-system/cloud-controllers...
time="2019-12-13T09:40:18Z" level=info msg="Starting apiregistration.k8s.io/v1, Kind=APIService controller"
time="2019-12-13T09:40:18Z" level=info msg="Refreshing all schemas"
time="2019-12-13T09:40:18Z" level=info msg="Starting apiextensions.k8s.io/v1beta1, Kind=CustomResourceDefinition controller"
time="2019-12-13T09:40:18Z" level=info msg="Refreshing all schemas"
time="2019-12-13T09:40:18Z" level=fatal msg="unable to retrieve the complete list of server APIs: tap.linkerd.io/v1alpha1: the server is currently unable to handle the request"

ここで、いろいろ試行錯誤での作業が状況を混乱させている可能性があるので、プロキシなし環境でpodネットワークアドオンを変えずにcanalのまま、一度、組んでみることにしました。

  • linkerd2_proxyのエラー

組みなおした環境はproxyなしでしたが、canalで組むと結局、linkerd-controllerでエラーになりました。

$ kubectl logs -n linkerd linkerd-controller-7cb66b4456-4l8ln -c linkerd-proxy
・・略・・
ERR! [   620.109715s] admin={bg=identity} linkerd2_proxy::app::identity Failed to certify identity: grpc-status: Unknown, grpc-message: "the request could not be dispatched in a timely fashion"

調べているうちに以下のようなissueをみつけ、podネットワークアドオンとの相性をこの辺で疑い、ciliumを試してみたわけです。

linkerd2 issues #3388
linkerd2 issues #2384

flannel, canalでうまくいかない明確な理由があるはずですが、そこまでは追いきれていません。

参考 : アンインストールについて

なお、エラーになって、少しの修正では復旧せず再インストールしたくなった場合、rio uninstallによりきれいにしてから再度インストールすることができます。

rio uninstallすると、以下の3つのnamespaceにある全てのオブジェクトとnamespace自身が削除されます。

  • linkerd , rio-system , tekton-pipelines
ubuntu@master:~$ rio uninstall
Waiting for linkerd uninstall job to be finished
Cleaning up CRDs...
Deleting System Namespace rio-system...
Delete validating webhook
Rio is uninstalled from your cluster
ubuntu@master:~$

サンプルサービスの実行

インストール後に出力されたデモを実行してみましょう。
Serviceが作成され、Endpointが付与されています。

ubuntu@master:~$ rio run -p 80:8080 https://github.com/rancher/rio-demo
default:gracious-zhukovsky
ubuntu@master:~$
ubuntu@master:~$ rio ps
NAME                 IMAGE                                      ENDPOINT                                                      PORTS     SCALE     WEIGHT    CREATED              DETAIL
gracious-zhukovsky   default-gracious-zhukovsky-v069dfm:f8fab   http://gracious-zhukovsky-v0-default.i90ik6.on-rio.io:30872   80:8080   1         100%      About a minute ago
ubuntu@master:~$
ubuntu@master:~$ rio info
Rio Version: v0.6.0 (c1bff129)
Rio CLI Version: v0.6.0 (c1bff129)
Cluster Domain: i90ik6.on-rio.io
Cluster Domain IPs: 172.31.15.211
System Namespace: rio-system
Wildcard certificates: true

ubuntu@master:~$

curlなどでこのENDPOINTにアクセスし、「Hi there, I'm running in Rio」というメッセージが出れば成功です。
以下は実行例。

ubuntu@master:~$ curl -s  https://gracious-zhukovsky-v0-default.i90ik6.on-rio.io:30300
Hi there, I'm running in Rio
ubuntu@master:~$

Dashboardへのアクセス

  • rio dashboard実行してみる
    • 標準出力に出されるログから、dashboardのURLを確認
      • rio dashboardを実行したマシンでブラウザにより画面を開こうとするので、インストールされていない場合はエラーとなる。
ubuntu@master:~$ rio dashboard
INFO[0000] Opening browser to https://dashboard-rio-system.i90ik6.on-rio.io:30300/dashboard/?setup=nx48s8fm4prkbch794lhtl8vb7nkdh896xxhk5tj4k56cnw26xkf88
FATA[0000] exec: "xdg-open": executable file not found in $PATH
ubuntu@master:~$
ubuntu@master:~$ sudo apt-get install -y xdg-utils
ubuntu@master:~$
ubuntu@master:~$ rio dashboard
INFO[0000] Opening browser to https://dashboard-rio-system.i90ik6.on-rio.io:30300/dashboard/?setup=nx48s8fm4prkbch794lhtl8vb7nkdh896xxhk5tj4k56cnw26xkf88
/usr/bin/xdg-open: 851: /usr/bin/xdg-open: www-browser: not found
/usr/bin/xdg-open: 851: /usr/bin/xdg-open: links2: not found
/usr/bin/xdg-open: 851: /usr/bin/xdg-open: elinks: not found
/usr/bin/xdg-open: 851: /usr/bin/xdg-open: links: not found
/usr/bin/xdg-open: 851: /usr/bin/xdg-open: lynx: not found
/usr/bin/xdg-open: 851: /usr/bin/xdg-open: w3m: not found
xdg-open: no method available for opening 'https://dashboard-rio-system.i90ik6.on-rio.io:30300/dashboard/?setup=nx48s8fm4prkbch794lhtl8vb7nkdh896xxhk5tj4k56cnw26xkf88'
exit status 3
ubuntu@master:~$
  • masterで dashboard-rio-system.i90ik6.on-rio.io に対応するアドレスを調べると、dashboardが起動しているVM (今回はnode01) と分かる

  • なので、以下のようにすればSSHポート転送でとりあえずdashboardにアクセス可能となる。

    • クライアントのWindows10から踏み台サーバにSSHでログインし、
    • localhost(Windows10)の30300/TCPからnode01の30300/TCPへポート転送した状態で、
    • localhost(Windows10)のhosts (C:\Windows\System32\drivers\etc\hosts) にてdashboard-rio-system.i90ik6.on-rio.ioを127.0.0.1だと記載し、
    • localhost(Windows10)のブラウザから上記dashboardのURLにアクセスすれば、踏み台経由でdashboardにアクセスできる。
    • なお上記のとおりHTTPSでのアクセスのため、localhost:30300ではアクセスできない。
# C:\Windows\System32\drivers\etc\hosts
# localhost name resolution is handled within DNS itself.
127.0.0.1   localhost dashboard-rio-system.i90ik6.on-rio.io

fwd2.png

Dashboard初期設定

  • 上記のようにポート転送, hostsを設定し、ダッシュボード(今回のURLは以下。)に初回アクセスすると、初期設定となる。
https://dashboard-rio-system.i90ik6.on-rio.io:30300/dashboard/?setup=nx48s8fm4prkbch794lhtl8vb7nkdh896xxhk5tj4k56cnw26xkf88
  • のちほど、githubのauthorize applicationのpopupが出るので、ブラウザでポップアップの許可をしておくこと。
    • 今回の場合 dashboard-rio-system.i90ik6.on-rio.io:30300 でのポップアップを許可しておく。

Welcome画面

rio-1-1.png

  • 最初のwelcome画面では、adminユーザの初期passwordが記載されているので取っておく
  • チェックボックス「Allow collection of anonymous statistics to help us improve Rio」に最初チェックが入っているが、今回不要のためチェックを外す
  • 「Continue」ボタン押下

GitHub Integration画面

  • welcome画面の次は、Githubとの連携を設定する画面となる。
  • 「OAuth App」のリンクをクリックするとgithubへのsign inページに遷移する。
    • ここでgithubアカウントでサインイン

rio-1-2.png

  • github のOAuth applicationの登録ページになるので、「Register a new application」ボタン押下。

rio-1-3.png

  • github「Register a new OAuth application」画面で、rio-dashboardとして必要な情報を記載し、「Register application」ボタン押下で登録。

  • 以下のように、Githubの自分のアカウントのOAuth Appsにrio-dashboardが登録される。Client IDとsecretをメモっておく

rio-1-4.png

  • GitHub Integration画面に戻ってきて、OAuth Apps登録後に払い出されたClient IDとsecretを入力し、「Continue」ボタン押下。

rio-1-5.png

ここで、githubのauthorize applicationのpopupが出る。

まだポップアップの許可をしていなかった場合、ブラウザの設定でrio dashboardのURLでポップアップを許可して再度Continueを押下して処理続行すれば問題ない。

Part Deux 画面

ここで「Done」ボタン押下すると、ダッシュボードにたどり着く。

rio-1-6.png

Dashboardの画面

まだ全然つかっていないので表示対象自体がほとんどないが、
参考までにどのような画面かスクリーンショットを上げておく。

Top画面

rio-dashboard-7.png

App Mesh

rio-dashboard-8.png

Namespace

rio-dashboard-9.png

Stacks

rio-dashboard-10.png

Services

rio-dashboard-11.png

Routers

rio-dashboard-12.png

ConfigMaps

rio-dashboard-13.png

External Services

rio-dashboard-14.png

Public Domains

rio-dashboard-15.png

Secrets

rio-dashboard-16.png

Explorer

左下のほうにExplorerという部分があり、Rioに関するオブジェクトの内容がyamlとして見れるようです。

rio-dashboard-17.png

rio-dashboard-18.png

ユーザメニュー

Preferencesとlogoutを選べます。

rio-dashboard-19.png

Preferences

rio-dashboard-20.png

ログイン画面

rio-dashboard-21.png

まとめ

  • RancherLabのRioを試してみました。構築してサンプルアプリを実行し、ダッシュボードを見てみました。
  • まだ触ったことのない面白そうな機能がたくさんあります。今後、触ってみようと思います。

参考

おまけ(小技とか)

ssh-agent

秘密鍵をサーバ側におきたくないときに是非。

eval `ssh-agent`
ssh-add private-key.pem
vi .ssh/config
ssh -A node

kubectl proxy

  • kubectl proxyによるAPI公開
ubuntu@master:~$ kubectl proxy --address='172.31.4.127' --accept-hosts='.*' &
[1] 23706
ubuntu@master:~$ Starting to serve on 172.31.4.127:8001

↓
他のノードから
$ curl http://172.31.4.127:8001/api/v1/namespaces/rio-system/services/dashboard
などによりAPIを叩けるようになる。
  • kubectl proxyでアクセス元を絞る場合、accept-hostsにホストのIPアドレスをカンマ区切りで列挙。
--accept-hosts='^localhost$,^127\.0\.0\.1$,^\[::1\]$,^172\.31\.4\.127$,^172\.31\.15\.202$'

PodPreset

  • PodPresetでpodに環境変数を追加注入する場合、デフォルトでは無効になっているので、API有効化の設定をした後にapi-server再起動が必要になる。

  • /etc/kubernetes/manifests/kube-apiserver.yamlでAPI Serverの --runtime-configオプションをみて
    settings.k8s.io/v1alpha1=trueを含むようにできればよい

ubuntu@master:/etc/kubernetes/manifests$
ubuntu@master:/etc/kubernetes/manifests$ sudo diff kube-apiserver.yaml ~/kube-apiserver.yaml.bak191213
18c18
<     - --enable-admission-plugins=NodeRestriction,PodPreset
---
>     - --enable-admission-plugins=NodeRestriction
35d34
<     - --runtime-config=settings.k8s.io/v1alpha1=true
ubuntu@master:/etc/kubernetes/manifests$
  • kube-apiserver.yamlを書き換えたらkubeletが即、api-server再起動してくれる。

  • どのような条件のpodに対してどのような環境変数を注入するかは、yamlにて指定し、applyする。

ubuntu@master:~$ cat podpreset.yaml
apiVersion: settings.k8s.io/v1alpha1
kind: PodPreset
metadata:
  name: my-podpreset
  namespace: hoge-system
spec:
  selector:
    matchLabels:
      job-name: install-hoge
  env:
    - name: AP_URL
      value: http://serv.hoge.co.jp:10080

ubuntu@master:~$
ubuntu@master:~$ cat podpreset2.yaml
apiVersion: settings.k8s.io/v1alpha1
kind: PodPreset
metadata:
  name: my-podpreset2
  namespace: hoge-system
spec:
  selector:
    matchExpressions:
    - key: db-name
      operator: Exists
  env:
    - name: AP_URL
      value: http://serv.hoge.co.jp:10080

ubuntu@master:~$

以上。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした