GCP (Google Cloud Platform) の GKE 上の WordPress で HTTPS を使用

スポンサーリンク
Google Cloud Platform

はじめに

過去の投稿で、GCP (Google Cloud Platform) の GKE で 固定 IP アドレスを使用して WordPress を構築しました。

GCP (Google Cloud Platform) の GKE で WordPress を構築
はじめに 自分でサーバーを借りてブログを立ち上げるなら、まず思いつくのは WordPress かと思います。 しかし、サーバーを借りて、サーバーに OS をインストールして、PHP をインストールして、データベースをインストール...

続いて、この固定 IP アドレスに Google Domains で取得した独自ドメインを関連付け、GKE 上で動く WordPress で HTTPS を使用してみます。

事前準備

まず、固定 IP アドレスを Google Domains で取得した独自ドメインに関連付けます。

Google Domains https://domains.google.com/registrar にログインします。

ドメインの DNS アイコンをクリックします。最低限の設定だけしておきます。

ネームサーバー

“Google Domains のネームサーバーを使用する” を選択します。

DNSSEC

何も設定しません。

登録済みのホスト

何も設定しません。

合成レコード

何も設定しません。

カスタム リソース レコード

A レコードを追加します。

名前 タイプ TTL レコード
A 1h xxx.xxx.xxx.xxx (固定 IP アドレス(IPv4))

これて WordPress の固定 IP アドレスとドメイン名が関連付けられます。

手順

GitHubで公開されている Let’s Encrypt on GKE の手順に従えば実現できます。

ahmetb/gke-letsencrypt
Tutorial for installing cert-manager on GKE get HTTPS certificates from Let’s Encrypt - ahmetb/gke-letsencrypt

それでは実際にやったことを記していきます。

Helmのインストール

Helm は、Kubernetes のパッケージマネージャです。

Helm クライアント

macOS の場合は、Homebrew でインストールできます。

Helm - The Package Manager for Kubernetes.
Documentation for Helm - The Kubernetes Package Manager.
brew install kubernetes-helm

Helmサーバーサイド

GKEクラスタに、Helm サーバーサイドのコンポーネントをインストールします。

まず、サービスアカウントを作成します。

kubectl create serviceaccount -n kube-system tiller

実行結果です。

serviceaccount "tiller" created

続いて、ロースベースアクセス制御の設定を行います。

kubectl create clusterrolebinding tiller-binding \
    --clusterrole=cluster-admin \
    --serviceaccount kube-system:tiller

実行結果です。

clusterrolebinding.rbac.authorization.k8s.io "tiller-binding" created

そして、init します。

helm init --service-account tiller

実行結果です。

Creating /Users/xxx/.helm 
Creating /Users/xxx/.helm/repository 
Creating /Users/xxx/.helm/repository/cache 
Creating /Users/xxx/.helm/repository/local 
Creating /Users/xxx/.helm/plugins 
Creating /Users/xxx/.helm/starters 
Creating /Users/xxx/.helm/cache/archive 
Creating /Users/xxx/.helm/repository/repositories.yaml 
Adding stable repo with URL: ttps://kubernetes-charts.storage.googleapis.com 
Adding local repo with URL: ttp://127.0.0.1:8879/charts 
$HELM_HOME has been configured at /Users/xxx/.helm.

Tiller (the Helm server-side component) has been installed into your Kubernetes Cluster.

Please note: by default, Tiller is deployed with an insecure 'allow unauthenticated users' policy.
To prevent this, run `helm init` with the --tiller-tls-verify flag.
For more information on securing your installation see: ttps://docs.helm.sh/using_helm/#securing-your-helm-installation
Happy Helming!

Chart リポジトリをアップデートします。

helm repo update

実行結果です。

Hang tight while we grab the latest from your chart repositories...
...Skip local chart repository
...Successfully got an update from the "stable" chart repository
Update Complete. ⎈ Happy Helming!⎈ 

cert-manager のインストール

cert-manager をインストールします。

helm install --name cert-manager --version v0.5.0 \
    --namespace kube-system stable/cert-manager

実行結果です。

NAME:   cert-manager
LAST DEPLOYED: Tue Nov 13 20:45:03 2018
NAMESPACE: kube-system
STATUS: DEPLOYED

RESOURCES:
==> v1/ServiceAccount
NAME          AGE
cert-manager  0s

==> v1beta1/ClusterRole
cert-manager  0s

==> v1beta1/ClusterRoleBinding
cert-manager  0s

==> v1beta1/Deployment
cert-manager  0s

==> v1/Pod(related)

NAME                           READY  STATUS             RESTARTS  AGE
cert-manager-0000000000-00000  0/1    ContainerCreating  0         0s


NOTES:
cert-manager has been deployed successfully!

In order to begin issuing certificates, you will need to set up a ClusterIssuer
or Issuer resource (for example, by creating a 'letsencrypt-staging' issuer).

More information on the different types of issuers and how to configure them
can be found in our documentation:

ttps://cert-manager.readthedocs.io/en/latest/reference/issuers.html

For information on how to configure cert-manager to automatically provision
Certificates for Ingress resources, take a look at the `ingress-shim`
documentation:

ttps://cert-manager.readthedocs.io/en/latest/reference/ingress-shim.html

Let’s Encrypt 設定

Let’s Encrypt でサーバー証明書を取得するために、自分のメールアドレスを環境変数で設定しておきます。

export EMAIL=xxx@example.test

GitHub で公開されている Let’s Encrypt 設定用の YAML ファイルのメールアドレスの部分を書き換え、GKE に適用させます。

curl -sSL https://rawgit.com/ahmetb/gke-letsencrypt/master/yaml/letsencrypt-issuer.yaml | \
    sed -e "s/email: ''/email: $EMAIL/g" | \
    kubectl apply -f-

実行結果です。

clusterissuer.certmanager.k8s.io "letsencrypt-staging" created
clusterissuer.certmanager.k8s.io "letsencrypt-prod" created

サーバー証明書の取得

まず、サンプルの YAML ファイルをダウンロードします。

curl -O https://raw.githubusercontent.com/ahmetb/gke-letsencrypt/master/yaml/certificate.yaml

YAML ファイルの内容を編集します。ここでは例として自分の所有するドメイン名を example.com としています。

apiVersion: certmanager.k8s.io/v1alpha1
kind: Certificate
metadata:
  name: example-com-tls
  namespace: default
spec:
  secretName: example-com-tls
  issuerRef:
    name: letsencrypt-prod
    kind: ClusterIssuer
  commonName: example.com
  dnsNames:
  - example.com
  acme:
    config:
    - http01:
        ingress: wordpress
      domains:
      - example.com

編集した YAML ファイルを GKE に適用します。

kubectl apply -f certificate.yaml

実行結果です。

certificate.certmanager.k8s.io "example-com-tls" created

下記のコマンドでサーバー証明書の取得状況を確認できます。

kubectl describe -f certificate.yaml

自分の場合は、10分後くらいに確認すると証明書の発行が成功していました。

Name:         example-com-tls
Namespace:    default
Labels:       
Annotations:  kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"certmanager.k8s.io/v1alpha1","kind":"Certificate","metadata":{"annotations":{},"name":"example-com-tls","namespace":"default"},"spec":...
API Version:  certmanager.k8s.io/v1alpha1
Kind:         Certificate
Metadata:
  Cluster Name:        
  Creation Timestamp:  2018-11-xxT12:35:15Z
  Generation:          0
  Resource Version:    000000
  Self Link:           /apis/certmanager.k8s.io/v1alpha1/namespaces/default/certificates/example-com-tls
  UID:                 00000000-0000-0000-0000-000000000000
Spec:
  Acme:
    Config:
      Domains:
        example.com
      Http 01:
        Ingress:  wordpress-ingress
  Common Name:    example.com
  Dns Names:
    example.com
  Issuer Ref:
    Kind:       ClusterIssuer
    Name:       letsencrypt-prod
  Secret Name:  example-com-tls
Status:
  Acme:
    Order:
      URL:  https://acme-v02.api.letsencrypt.org/acme/order/00000000/000000000
  Conditions:
    Last Transition Time:  2018-11-13T12:41:16Z
    Message:               Certificate issued successfully
    Reason:                CertIssued
    Status:                True
    Type:                  Ready
    Last Transition Time:  
    Message:               Order validated
    Reason:                OrderValidated
    Status:                False
    Type:                  ValidateFailed
Events:
  Type    Reason          Age   From          Message
  ----    ------          ----  ----          -------
  Normal  CreateOrder     6m    cert-manager  Created new ACME order, attempting validation...
  Normal  DomainVerified  45s   cert-manager  Domain "example.com" verified with "http-01" validation
  Normal  IssueCert       45s   cert-manager  Issuing certificate...
  Normal  CertObtained    43s   cert-manager  Obtained certificate from ACME server
  Normal  CertIssued      43s   cert-manager  Certificate issued successfully

シークレットを確認してみます。

kubectl get secrets

確認結果です。

NAME                  TYPE                                  DATA      AGE
default-token-00000   kubernetes.io/service-account-token   3         1d
example-com-tls     kubernetes.io/tls                     2         3m
mysql                 Opaque                                1         1d

HTTPS提供開始

TLS のイングレスを設定する YAML ファイルを作成します。例えば下記の通りです。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: wordpress-ingress
  annotations:
    kubernetes.io/ingress.global-static-ip-name: example
spec:
  backend:
    serviceName: wordpress
    servicePort: 80
  tls:
  - secretName: example-com-tls
    hosts:
    - example.com

YAML ファイルを GKE に適用します。

kubectl apply -f wordpress-ingress-tls.yaml

実行結果です。

ingress.extensions "wordpress-ingress" configured

イングレスを確認してみます。

kubectl get ingress

確認結果です。

NAME                HOSTS     ADDRESS        PORTS     AGE
wordpress-ingress   *         x.x.x.x   80, 443   19h

https://<自分のドメイン名>で、WordPress にアクセスできることを確認します。

さいごに

WordPress の設定 – 一般で、

  • WordPress アドレス (URL)
  • サイトアドレス (URL)

に、https://<自分のドメイン名> と設定しておきましょう。