NTTテクノクロス Advent Calendar 2019の14日目担当の、NTTテクノクロス新倉 (@niiku-y) です。
昨年(2018年)のAdvent Calendarでは Rancher 2.1のHA installを試してみる という記事を書きましたが、今回もコンテナ関連の記事になります。
自己紹介
-
私の部署では、OpenStackやコンテナを使ったシステムの構築や設計、問合せ対応等をしています。
- 例えば OSSクラウド基盤トータルサービス のチケット対応
-
CloudNative Days Tokyo 2019 で CI/CDつーるのエラビカタ というお題でCI/CDビギナー向け講演を行いました。
- 当社ブースなどイベントの様子は以下の記事で紹介されています。
-
仕事で使っているかどうかによらず、興味もったものはアウトプットするようにしています。
- MicroK8sを使ってみる などコンテナに関連するネタを中心に記事を書いています。
動機
-
今回の記事でも、昨年と同様「やったことがないことをやってみる」が動機となっています。
- 今回、やってみたいと思ったのは Rancher Labs の Rio . 名前だけ前から聞いたことがあって、興味ありました。また牛です
- 本記事では、構築時のエラーがなくなり、サンプルが実行でき、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
- Configs, Secrets : kubernetesのリソース。Configure a Pod to Use a ConfigMap などを参照。
その他一般的な用語について
その他、Rioを使うにあたり用語として知っておきたいものをメモっておきます。
マイクロサービス : 1つのサービスを、複数の小さいサービスの疎結合な集合体として構成するアーキテクチャ
-
Service mesh : サービス同士が網目のように通信するマイクロサービスにおける問題を解決するためのソフトウェア
Envoy : Lyft が開発したL4/L7 proxy。API経由の設定変更ができ、サーバ再起動が不要のため、設定変更頻度が高いサービスメッシュでのプロキシサーバとして需要がある
Circuit breaker : 障害が起きた時に、それに依存するコンポーネント群に障害が広まらないよう、異常の起きているコンポーネントを使われないように切り離す仕組み
-
mTLS (Mutual TLS)
- TLS通信でクライアント側、サーバ側が相互に認証する仕組み
- HTTPS , TLSクライアント認証
さて、ここからは実際に環境構築してrioを使えるようにしていきましょう。
環境情報
今回、お試しで作る環境は以下のような構成にしました。
構成
-
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
-
Rio : v0.6.0
- installすると以下が入る
- linkderd 2.6.0
- installすると以下が入る
-
その他
- HTTP proxy : なし
- HTTP proxyありの構成でlinkerdをうまく構築できませんでした。tap APIに関するエラーが取り切れず、断念しました。
- proxyが原因とは言い切れず、podネットワークアドオンおよび試行錯誤により何か余計なことをしたことが原因の可能性が高いので、これは再チャレンジする予定です
- 上記のほか、踏み台サーバあり。
- HTTP proxy : なし
-
podネットワークアドオンをciliumにした経緯
-
flannel v0.11.0 , canal v3.8とv3.10では、 linkerd でエラーが出て構築できなかった。
- 参考: canal で参照した manifect , requirements はこちら : manifest , requirements
- linkerd2 issues #2384 で linkerd2_proxy について私と同じエラー出ていた方が kube-router から cilium に変えたらうまく動いた、と述べていたので、試しに使ってみた。
- podネットワークアドオンを変え、cilium 1.6.4 にしたら、あっさり動作した。
-
flannel v0.11.0 , canal v3.8とv3.10では、 linkerd でエラーが出て構築できなかった。
Requirements
参考までにsystem requirementsを記載しておきます。
ただし、rio自体がベータ版の上、構築したときのk8sクラスタ自体が最新の1.17で、あまりこれに沿って構築していません。(^^;
-
- Linux kernel、Linux Distribution Compatibility、Firewall Rulesを確認
-
Rio Quick Startより
- kubernetes 1.15 or newer
構築手順
さて、ここからは実際の構築手順を記載します。
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 で適用
- /etc/hosts
- シンボリックリンク変更
- 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インストール
- docker-ceのubuntuへのインストール手順
- インストール後の手順
- /lib/systemd/system/docker.service の編集
- insecure-registryのアドレス帯やmtuの設定。例えば以下のような設定。アドレスは読み替える
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を入れる
-
- Ubuntuの手順を参照
- シングルマスター構成。HA構成ではない
-
masterの構築
- sudo kubeadm init --pod-network-cidr=10.217.0.0/16
- CIDRはciliumで使うものを指定している
- 上記のように、api-serverのadvertise-addressを指定していない場合はmasterのprivate IPアドレスとなる
- 出力の最後で以下のような文が出るのでメモっておく。nodeのクラスタへの組み込みで使用する
- sudo kubeadm init --pod-network-cidr=10.217.0.0/16
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のインストール
あらかじめVMには firewall rule を設定しておく
-
- 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本体のインストールになります。
- Quick Start に従いインストール
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を実行したマシンでブラウザにより画面を開こうとするので、インストールされていない場合はエラーとなる。
- 標準出力に出されるログから、dashboardのURLを確認
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
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画面
- 最初のwelcome画面では、adminユーザの初期passwordが記載されているので取っておく
- チェックボックス「Allow collection of anonymous statistics to help us improve Rio」に最初チェックが入っているが、今回不要のためチェックを外す
- 「Continue」ボタン押下
GitHub Integration画面
- welcome画面の次は、Githubとの連携を設定する画面となる。
- 「OAuth App」のリンクをクリックするとgithubへのsign inページに遷移する。
- ここでgithubアカウントでサインイン
- github のOAuth applicationの登録ページになるので、「Register a new application」ボタン押下。
-
github「Register a new OAuth application」画面で、rio-dashboardとして必要な情報を記載し、「Register application」ボタン押下で登録。
- Application nameおよびdescription : rio-dashboardと入力した。
- Homepage URLおよびAuthorization callback URL : https://dashboard-rio-system.i90ik6.on-rio.io:30300 と入力した。
以下のように、Githubの自分のアカウントのOAuth Appsにrio-dashboardが登録される。Client IDとsecretをメモっておく
- GitHub Integration画面に戻ってきて、OAuth Apps登録後に払い出されたClient IDとsecretを入力し、「Continue」ボタン押下。
ここで、githubのauthorize applicationのpopupが出る。
まだポップアップの許可をしていなかった場合、ブラウザの設定でrio dashboardのURLでポップアップを許可して再度Continueを押下して処理続行すれば問題ない。
Part Deux 画面
ここで「Done」ボタン押下すると、ダッシュボードにたどり着く。
Dashboardの画面
まだ全然つかっていないので表示対象自体がほとんどないが、
参考までにどのような画面かスクリーンショットを上げておく。
Top画面
App Mesh
Namespace
Stacks
Services
Routers
ConfigMaps
External Services
Public Domains
Secrets
Explorer
左下のほうにExplorerという部分があり、Rioに関するオブジェクトの内容がyamlとして見れるようです。
ユーザメニュー
Preferencesとlogoutを選べます。
Preferences
ログイン画面
まとめ
- RancherLabのRioを試してみました。構築してサンプルアプリを実行し、ダッシュボードを見てみました。
- まだ触ったことのない面白そうな機能がたくさんあります。今後、触ってみようと思います。
参考
- Introducing Rio - Containers at Their Best
- Rio: Revolutionizing the Way You Deploy Applications
- 「Rio」-古き良きDockerのUXをモダンなクラウドネイティブソフトウェア達に
- What's RIO ?
- DockerライクなUXでCloud Nativeな体験が出来るらしいRioを試してみる
- Early preview : Rio
- Rio: Getting Started
- Hands On With Rio Beta at KubeCon NA 2019
おまけ(小技とか)
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:~$
以上。