Google Container Engine (GKE)で動いているアプリのSSL証明書 Let's Encrypt を kubernetes で更新する

こんにちは、yoshiです。

今回はkubernetes で動かしている example.com の SSL 証明書(Let's encrypt)が切れるので更新してみます。

条件

Macのターミナルでkubectlが使える
=> 使えない方はこちら

手順

まず大まかな手順を見てみましょう。

手順

1: 新しくComputer Instanceを立ち上げ、example.com の DNS を新しいものに変え、Let's Encrypt bot をインストールする。インストールした後証明書をダウンロードする。
2: DNSを元のものに戻して、ローカルに落とした証明書を正しいIPアドレスのComputer Instanceにアップする。
3: example.com がSSLで接続されていることを確認する。

1つずつ見ていきましょう。

インスタンス立ち上げ

https://console.cloud.google.com にアクセスしてCompute Engineのページにいきます。

CREATE INSTANCEをクリックしてインスタンスを作成します。

変更する点は以下の5つです。
Name: 適当な名前をつけます。
Zone: 日本であれば asia-east1-aで良いでしょう。
Machine type: 一番小さい大きさのインスタで構いません。
Boot disk: 今回は Ubuntu 14.04 を使います。
Firewall: HTTPとHTTPSを両方とも許可します。

External IP取得

作成したらそのインスタンスに入って、External IPを取得します。
今回は104.xxx.xxx.xxxですね。

DNS設定

次に Networking > Cloud DNSから適切な独自ドメインの対応するDataを先ほどのExternal IPに変更します。  

インスタンスへSSH接続

適切なインスタンスに入ってSSH接続を行います。いくつか方法はあるのですが、一番簡単なのは"Open in browser window"です。

SSH接続ができました。

nginxのインストール

次にnginxをこのインスタンスに導入します。

How To Install Linux, nginx, MySQL, PHP (LEMP) stack on Ubuntu 14.04
nginxを導入する際にはこのサイトがとても参考になります。もし時間があれば全て読んでおくと良いでしょう。

書いてあるままですが、以下のコマンドに従います。

$ sudo apt-get update
$ sudo apt-get install nginx

nginx -Vでインストールされたかを確認できます。 nginx -V

しばらく時間が経つと次のページがブラウザで見れると思います。

let's encrypt bot の導入

次にこのインスタンスに let's encrypt の証明書をダウンロードします。
おそらくインストールするにはgitが必要なので、次のコマンドを走らせます。

$ sudo apt-get install git

Do you want to continue? [Y/n]と聞かれたらYで大丈夫です。
次に

$ git clone https://github.com/letsencrypt/letsencrypt

lsで確認するとファイルがインストールされていることが確認できます。

次に次のコマンドで実行環境を整えます。(少し時間がかかります)

$ cd letsencrypt
$ ./letsencrypt-auto --help

このような画面が出たら完了です。

証明書のダウンロードとBase64 Encode

次にこのコマンドで証明書をダウンロードします。

./letsencrypt-auto certonly --webroot -w /usr/share/nginx/html -d example.com

この画面が表示されたら完了です。 /etc/letsencrypt/live/example.com/fullchain.pemに保存されていることが書かれています。

今回はfullchain.pemprivkey.pemを使うので

$ sudo -i 
$ cat /etc/letsencrypt/live/example.com/fullchain.pem

でファイルの中を見てコピー&sublimeにペースト。同様に

$ cat /etc/letsencrypt/live/example.com/privkey.pem

でコピーします。それぞれfullchain.pem, privkey.pemとして保存したとしましょう。

次にこれらのファイルをそれぞれbase64 encodeします。

$ cat fullchain.pem | base64 > fullchain.txt
$ cat privkey.pem | base64 > privkey.txt

でファイルを作ります。

実はもう一つコードが必要です。

$ openssl dhparam -out dhparam.pem 2048

でdhparams.pemを作り、また

$ cat dhparam.pem | base64 > dhparam.txt

でbase64 encodeします。

Important!!
このタイミングでinstance を止めてDNSを元に戻しましょう。

kubenet の proxyに Secrets をアップする。

次に secret.yamlを作ります

apiVersion: v1  
kind: Secret  
metadata:  
  name: example.com-ssl
  namespace: example
data:  
  proxycert: {base64 encoded}
  proxykey: {base64 encoded}
  dhparam: {base64 encoded}

これをkubernetesにあげます。 例えばserviceの名前がexample-ssl-proxyであれば

$ kubectl create -f [file path]   #fileをアップロード
$ kubectl scale rc example-ssl-proxy --replicas 0 --namespace example    #scale 0にする
$ kubectl scale rc example-ssl-proxy --replicas 1 --namespace example    #scale 1にする

scale0 から scale1 にあげる時に新しいイメージ、ファイルを再読み込みするので、sslがアップデートされます。

参考

Reference Documentation > Secrets