hylom'sWeblog

- hylom's blog
| about hylom / hylom.net | old contents | login

Kubernetesのサービス周りのトラブルシュート

posted on 2018/07/04 19:13:50

 自前で構築したKubernetesクラスタでサービス(serivces、svc)関連がうまく動かない場合、原因としてfirewall関連の設定が不適切だったということがよくあります。kube-dns関連のトラブル(kube-dns Podが起動しないなど)もこれが原因であることがよくあります。

 そういった場合、とりあえずiptablesが正しく設定されているか、またクラスタ内からapiserverのbind-addressで指定したアドレスの8080番および6443番ポート)にアクセスできるよう設定しているかを確認してみましょう。

 また、Kubernetesのパケットは複雑な経路でやってくるので、インターフェイス単位でアクセス許可を指定した場合うまく動かない場合があります。そのため、たとえばfirewalldを利用している場合、コンテナに割り当てられるネットワーク(たとえば172.17.0.0/16)をinternalゾーンに追加したうえで8080/tcpおよび6443/tcpを許可する、もしくはtrustedゾーンに追加する、といったようにネットワーク単位で設定した方が確実です。

kubectlコマンドで「NotAcceptable」というエラーが出たときの話

posted on 2018/07/04 18:20:48

 テスト用のKubernetesクラスタをメンテナンスしていたら、突然クラスタの操作ができなくなった。次のようなエラーが出る。

$ kubectl get nodes
No resources found.
Error from server (NotAcceptable): unknown (get nodes)

 色々調べたところ、うっかりkubectlコマンドをアップデートしてしまってクラスタ側とバージョンが一致しなくなっていた(クラスタ側は1.7.7、kubectlコマンドは1.11)。kubectlコマンドをダウングレードすることで対処できた。

Fedora28で自前Kubernetesクラスタを作るメモ

posted on 2018/05/11 19:48:58

 とりあえず基本的な流れは以前さくらのナレッジに書いたものと同じ。ただし、クラスタノードのkubelet設定ファイル(/etc/kubernetes/kubelet)の「KUBELET_ARGS」に次のように「--kubeconfig」および「--require-kubeconfig」パラメータを追加した上で、kubelet.ymlファイルを用意する必要がある。

KUBELET_ARGS="--cgroup-driver=systemd --fail-swap-on=false --kubeconfig=/etc/kubernetes/kubelet.yml --require-kubeconfig"

 kubelet.ymlファイルはこんな感じ。

kind: Config
clusters:
- name: local
  cluster:
    server: http://<api-serverのホスト名かIPアドレス>:8080
users:
- name: kubelet
contexts:
- context:
    cluster: local
    user: kubelet
  name: kubelet-context
current-context: kubelet-context

 --api_servers(--api-servers)オプションは廃止されているので、このように設定ファイルでapi-serverのURLを指定しなければならない模様(https://github.com/kubernetes/website/issues/7417)。

(追記@2018-05-15)

 kube-proxyにはiptables 1.6.2と組み合わせて使うとiptablesルールを適切に設定できないという不具合がある。Fedora 28のiptablesは1.6.2なので、これに引っかかる。Fedora 28のKubernetesパッケージに含まれているkubeletでは現時点でこれが修正されていない。とりあえずFedora 27用のiptables 1.6.1に置き換えることで問題は回避できそう。

$ wget https://dl.fedoraproject.org/pub/fedora/linux/releases/27/Everything/x86_64/os/Packages/i/iptables-1.6.1-4.fc27.x86_64.rpm
$ wget https://dl.fedoraproject.org/pub/fedora/linux/releases/27/Everything/x86_64/os/Packages/i/iptables-libs-1.6.1-4.fc27.x86_64.rpm
# dnf install iptables-*.rpm

Debianで突然mysqlサービスが起動しなくなった

posted on 2018/05/07 14:02:44

 Debianのmysqlパッケージをアップデートしたら突然mysqlサービスが起動しなくなった。journalctlでエラーメッセージを見ると、次のように出力されている。

# journalctl -u mysql
  :
  :
May 07 06:10:09 gate mysqld[3528]: /usr/sbin/mysqld: Error on realpath() on '/var/lib/mysql-files' (Error 2)
May 07 06:10:09 gate mysqld[3528]: 180507  6:10:09 [ERROR] Failed to access directory for --secure-file-priv. Please make sure that directory exists and is accessible by MySQL Server. Supplied value : /var/lib/mysql-files

 この場合、/var/lib/mysql-filesディレクトリを作成すればOKのようだ。問題のパラメータ「--secure-file-priv」についてのドキュメントはここにある

# mkdir /var/lib/mysql-files
# chown mysql:mysql  /var/lib/mysql-files
# chmod 700 /var/lib/mysql-files

Raspberry Piを使ってSpotifyをheadlessで聞く

posted on 2018/03/21 17:23:26

 Raspberry Piを使ってSpotifyを再生できるデバイスを作ったので手順などを備忘録代わりに。使用したデバイスはRaspberry Pi Zero W。OSはRaspbian(Stretch)。なお利用にはSpotifyの有料アカウントが必須。

Spotify Connectデバイスとして使用する

 Spotifyを再生するためには、デバイス側でSpotifyにログインしてプレイリストなどの情報を取得して再生する、という処理を全部行うやり方と、PC/Macやスマートフォン、タブレットなどのSpotifyアプリ側で認証やプレイリスト/楽曲管理などを行い、Spotifyとの通信およびデータダウンロード、再生などのみをデバイス側で行う「Spotify Connect」という機能を使うやり方がある。

 Spotify Connectデバイスとして利用する場合、Raspotifyというソフトウェアを利用すると簡単に実現できる。librespotというオープンソースで開発されているSpotifyクライアントライブラリが使われているが、これらを含有したRaspberry Pi向けのバイナリパッケージが配布されているので、これをインストールし、設定ファイルを編集してサービスを起動するだけで良い。

 設定ファイルは/etc/default/raspotify。変更したのはデバイス名を指定する「DEVICE_NAME」、ビットレートを指定する「BITRATE」といくつかのオプション。オプションについてはlibrespotのドキュメントにまとめられているが、ここでは使用するALSAデバイスを指定する「--device」、Spotifyアプリとの接続に使用するポートを指定する「--zeroconf-port」、キャッシュディレクトリを指定する「--cache」、音量の自動調整を有効にする「--enable-volume-normalisation」、初期音量を指定する「--initial-volume」を使用している。--deviceの引数はALSAの設定によって変わるので適宜適切なものを選択(後述)。ユーザー名などはSpotifyアプリ経由で取得するので設定不要。「--zeroconf-port」は指定しなくても良いのだが、指定するとポートを固定できるためファイアウォールの設定が簡単になる。

# /etc/default/raspotify -- Arguments/configuration for librespot

# Device name on Spotify Connect
#DEVICE_NAME="raspotify"
DEVICE_NAME="5potpy"

# Bitrate, one of 96 (low quality), 160 (default quality), or 320 (high quality)
#BITRATE="160"
BITRATE="320"

# Additional command line arguments for librespot can be set below.
# See `librespot -h` for more info. Make sure whatever arguments you specify
# aren't already covered by other variables in this file. (See the daemon's
# config at `/lib/systemd/system/raspotify.service` for more technical details.)
#
# To make your device visible on Spotify Connect across the Internet add your
# username and password which can be set via "Set device password", on your
# account settings, use `--username` and `--password`.
#
# To choose a different output device (ie a USB audio dongle or HDMI audio out),
# use `--device` with something like `--device hw:0,1`. Your mileage may vary.
#
#OPTIONS="--username <USERNAME> --password <PASSWORD>"
OPTIONS="--device mydev --zeroconf-port 65432"

# Uncomment to use a cache for downloaded audio files. Cache is disabled by
# default. It's best to leave this as-is if you want to use it, since
# permissions are properly set on the directory `/var/cache/raspotify'.
CACHE_ARGS="--cache /var/cache/raspotify"

# By default, the volume normalization is enabled, add another volume argument
# here if you'd like, ie `VOLUME_ARGS=--initial-volume 100`.
VOLUME_ARGS="--enable-volume-normalisation --initial-volume 100"

 設定ファイルを作成したら、systemctlコマンドでサービスを開始できる。

# systemctl start raspotify

 ログはjournalctlコマンドで閲覧できる。

# journalctl -u raspotify

 確認していないが、zeroconfを使っているとのことで別途avahi-daemonも必須かもしれない。

# systemctl start avahi-daemon

Webブラウザ経由で操作できるSpotifyクライアントを使う

 基本的にはSpotify Connect経由での利用で事足りるのだが、Webブラウザ経由で操作できるクライアントについても試しに導入してみた。こちらはMopidyというミュージックサーバーソフトウェアとSpotify用のプラグインを組み合わせて利用することで実現できる・

 Mopidy自体はRaspbian標準でパッケージが提供されているので、これをインストールする。

# apt-get install mopidy

 次に、Spotify用のプラグインをインストールする。必要なのは下記。

  • mopidy-mopify:MopidyにSpotify連携用のWeb UIを追加するプラグイン
  • mopidy-spotify:MopidyにSpotifyからのストリーミング再生機能を追加するプラグイン
  • libspotify:かつてSpotifyが公式に提供していたSpotify連携ライブラリ。すでに開発終了でいつサポートが終了してもおかしくない
  • pyspotify:libspotifyのPythonラッパー

 libspotifyとコンパイル済みのpyspotifyはMopidyのaptリポジトリから入手可能(ドキュメント)。自分は次のように直接ダウンロードして使用した。

$ wget http://apt.mopidy.com/dists/jessie/non-free/binary-armhf/libspotify12_12.1.103-0mopidy1_armhf.deb
$ wget http://apt.mopidy.com/dists/jessie/contrib/binary-armhf/python-spotify_2.0.5-0mopidy1_armhf.deb

 いくつか依存するパッケージがあるので、それはapt-getでインストールする。mopidy-spotifyとmopidy-mopifyについてはpipでインストールできる。

# pip install Mopidy-Spotify
# pip install Mopidy-Mopify

 続いて設定ファイルの編集。

[core]
cache_dir = /var/cache/mopidy
config_dir = /etc/mopidy
data_dir = /var/lib/mopidy

[logging]
config_file = /etc/mopidy/logging.conf
debug_file = /var/log/mopidy/mopidy-debug.log

[local]
media_dir = /var/lib/mopidy/media

[m3u]
playlists_dir = /var/lib/mopidy/playlists

[http]
enabled = true
hostname = 192.168.1.210
port = 6680
zeroconf = Mopidy HTTP server on $hostname

[mopify]
enabled = true
debug = false

[spotify]
enabled = true
username = <Spotifyのユーザー名>
password = <Spotifyのパスワード>
client_id = <client ID>
client_secret = <client secret>
bitrate = 320

 hostnameやusername、passwordは各自適切な物を指定する。client_idおよびclient_secertはMopidyのWebサイトにアクセスして「LOG IN WITH SPOTIFY」リンクをクリックしてOAuth認証を行うと、このページにリダイレクトされて設定すべきclient_idおよびcluent_secretが表示される。これをコピペすればOK。

ALSAの設定

 RaspotifyもMopidyもサウンド出力にはALSAを使用する。認識されているデバイスは/proc/asound/cardsファイルで確認できる。たとえば次の例では、デバイス0としてRaspberry Pi内蔵オーディオ(Raspberry Pi Zero Wの場合HDMI経由での出力に相当するはず)、デバイス1としてUSB端子に接続したオーディオIFが認識されている。

# cat /proc/asound/cards
 0 [ALSA           ]: bcm2835 - bcm2835 ALSA
                      bcm2835 ALSA
 1 [USB            ]: USB-Audio - <USBサウンドデバイスの情報がここに表示される>

 ALSAの場合、各アプリケーションが使用するサウンドデバイスに関する設定は/etc/asound.confで行える。今回はデフォルト設定(pcm.!default)に加えて、「pcm.mydev」という設定を作ってこれをRaspotifyで使用するよう指定している(前述)。dmixerの設定ではuidが異なる複数のプロセスからの非排他的音声出力を可能にするため「ipc_key_add_uid 0」「ipc_perm 0660」の2つを指定している。また、「slave」以下で「hw:1」を指定することで、オーディオデバイス1、つまりUSBサウンドデバイスを使用するよう指定している。

# cat /etc/asound.conf 
pcm.mydev {
  type plug
  slave {
    pcm "dmixer"
  }
}

pcm.!default {
  type plug
  slave {
    pcm "dmixer"
  }
}

pcm.dmixer {
  type dmix
  ipc_key 1024
  ipc_key_add_uid 0
  ipc_perm 0660
  slave {
    pcm "hw:1"
  }
}

問題点

 Mopidyでは一部のプレイリストが適切に取得できなかったりする模様。これはlibspotifyがもうdeprecatedであるためらしい。

 また、MopidyとRaspotify両方で発生する問題だが、ネットワークが遅くなる時間帯だとストリームのキャッシュに時間がかかったり、間に合わずに音切れが発生する状況となっている。Spotifyアプリだとこの問題は発生しないのでパケットを調べたりしたのだが、どうもSpotify公式アプリはakamai経由でコンテンツをダウンロードしているため混雑時でも高速にコンテンツをダウンロードできているようだ。この機能はMopidy(libspotify)やlibrespotではサポートされていないようなので、簡単には解決できなさそうである。

「start-limit-hit」といったメッセージが出てdocker serviceの起動に失敗した場合の対処法

posted on 2018/03/07 17:14:13

 systemdでdocker serviceの起動時に、次のようなエラーが出て起動できない場合がある(このメッセージはjournalctl -xeコマンドで確認)。

-- The result is failed.
 3月 07 18:28:10 fedora25 systemd[1]: docker.service: Unit entered failed state.
 3月 07 18:28:10 fedora25 systemd[1]: docker.service: Failed with result 'start-limit-hit'.

 このエラーは使用しているdockerのバージョンとsystemdのdocker.service設定ファイルの内容が合っていない場合に出るようだ。このエラーが出た環境は、Dockerが配布しているパッケージでDockerをインストール後、そのパッケージを削除してFedora 25標準のパッケージに入れ直したというもの。自分で作成して忘れていたのか、それともパッケージによってインストールされたのか分からないが、/etc/systemd/systemディレクトリ以下にdocker.serviceファイルが残っていたのが原因。

 このファイルを削除し、systemctl daemon-reloadでsystemdの設定を読み直したら復旧した。

Fedora 25のhttpd(Apache HTTP Server)でLet's Encryptを使う

posted on 2017/02/10 20:22:39

 Fedora 25では、httpdをインストールするとデフォルトで自己署名証明書を作成してSSLを有効にする設定になっている模様。そのため、certbotコマンドでLet's Encryptで証明書を取得しようとすると失敗するようだ。

# dnf install certbot
# certbot --apche
(...ここで設定を入力する)
Failed authorization procedure. test.hylom.net (tls-sni-01): urn:acme:error:connection :: The server could not connect to the client to verify the domain :: Failed to connect to <IPアドレス>:443 for TLS-SNI-01 challenge

 対策としては、まず/etc/httpd/conf.d/ssl.confをssl.conf.orgなどにリネーム後にhttpdを再起動してSSLをいったん無効にした後、certbotコマンドを実行すれば良い。

Sambaで共有したディレクトリ内のパーミッション問題

posted on 2015/02/27 19:36:50

 Sambaで共有したLinuxマシン上のディレクトリにWindowsからアクセスした際、作成したファイルのパーミッションが755とかになってしまう問題がある。この場合、smb.confで「map archive = no」を指定すると解決する。副作用などについてはググれ。

firewalldでのファイアウォール制御・超基本編

posted on 2014/12/19 17:15:32

 Red Hat Enterprise Linux 7(やCentOS 7など)では、iptablesなどによるパケット制御をfirewalldで行うようになった。このfirewalldを使って、ファイアウォールの設定を行う手順メモ。

前提条件

  • systemctlコマンドでfirewalldを稼動させておく
  • firewalldの設定は「firewall-cmd」コマンドで行う

zone設定

 firewalldには「ゾーン」という概念があり、ゾーンごとに有効なポートなどを指定する。デフォルトで用意されているゾーンには「public」や「home」、「trusted」などが用意されている。

 現在有効なゾーンは「firewall-cmd --list-all」コマンドで確認できる。

# firewall-cmd --list-all
public (default, active)
  interfaces: enp8s0 virbr0 virbr1
  sources:
  services: dhcpv6-client samba ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

 この例では、「enp8s0」および「virbr0」、「virbr1」というインターフェイスが「public」ゾーンに割り当てられている。また、publicゾーンでは「dhcpv6-client」と「samba」、「ssh」というサービスが有効になっている。

サービスの追加

 ゾーンに「サービス」を追加することで、そのサービスを追加できる。定義されているサービスは「firewall-cmd --get-services」コマンドで確認できる。

# firewall-cmd --get-services
amanda-client bacula bacula-client dhcp dhcpv6 dhcpv6-client dns ftp high-availability http https imaps ipp ipp-client ipsec kerberos kpasswd ldap ldaps libvirt libvirt-tls mdns mountd ms-wbt mysql nfs ntp openvpn pmcd pmproxy pmwebapi pmwebapis pop3s postgresql proxy-dhcp radius rpc-bind samba samba-client smtp ssh telnet tftp tftp-client transmission-client vnc-server wbem-https

 特定のゾーンで許可されているサービスは「firewall-cmd --list-service --zone=<ゾーン名>」で確認できる。

# firewall-cmd --list-service --zone=public
dhcpv6-client samba ssh

 ゾーンにサービスを追加するには、「firewall-cmd --add-service=<サービス名> --zone=<ゾーン名>」コマンドを使用する。下記は「public」ゾーンに「http」サービスを追加する例。

# firewall-cmd --list-service --zone=public
dhcpv6-client mysql samba ssh
# firewall-cmd --add-service=http --zone=public
success
# firewall-cmd --list-service --zone=public
dhcpv6-client http mysql samba ssh

 なお、--add-serviceオプションで追加したサービスは、firewalldの再起動後には保持されない。恒久的にサービスを追加するには、「--permanent」オプションを指定する。この場合、即座にはサービスが追加されないので、その後に「firewall-cmf --reload」コマンドを実行してfirewalldの設定をリロードさせると変更が反映される。

# firewall-cmd --add-service=http --zone=public --permanent
success
# firewall-cmd --list-service --zone=public
dhcpv6-client samba ssh
# firewall-cmd --reload

 また、追加したサービスを削除するには「--remove-service」オプションを使用する。

# firewall-cmd --remove-service=dhcpv6-client --zone=public

systemdでのサービス制御・超基本編

posted on 2014/12/19 16:55:35

 Red Hat Enterprise Linux 7(やCentOS 7など)で導入されたsystemdで、サービスの開始/停止やシステム起動後の自動起動などを設定する手順メモ。

 systemdでは、「systemctl」というコマンドでサービスの制御を行う。サービスを開始/停止するには「start」および「stop」サブコマンドを使用する。また、「status」サブコマンドで稼働状況をチェックできる。

systemctl start <サービス名>
systemctl stop <サービス名>
systemctl status <サービス名>

 システムの起動時にサービスを自動起動させるには「enable」サブコマンドを、自動起動させないように設定するには「disable」サブコマンドを使う。

systemctl enable <サービス名>
systemctl disable <サービス名>

 稼働中のサービスの確認は、「list-units」サブコマンドで行える。サブコマンドを省略すると「list-units」サブコマンドが実行されるので、引数無しでsystemctlコマンドを実行しても同じ結果が得られる。

# systemctl
UNIT                        LOAD   ACTIVE SUB       DESCRIPTION
proc-sys...t_misc.automount loaded active waiting   Arbitrary Executable File Fo
sys-devi...-sda-sda1.device loaded active plugged   VBOX_HARDDISK
  :
  :

 このうち、「.service」で終わっているものがサービスとなる。また、「-t service」オプション付きでsystemctlコマンドを実行することでサービスのみを一覧表示できる。

$ systemctl -t service

 また、「list-units」サブコマンドでは「disabled」に設定されているサービスは表示されない。これらも含めて確認するには、「list-unit-files」サブコマンドを実行する。

$ systemctl list-unit-files