🌟

GKE(kubernetes)を使って、https(SSL)対応した独自ドメインのサイトを公開する方法

2023/01/14に公開

内容

GKEで独自ドメインのhttps対応したサイトを公開します。

GKEの作成

今回はmanaged certificateを利用して、GKEを公開するフローを紹介します。

GKEに使用する固定IPを取得します。

main.tf

resource "google_compute_global_address" "static_ip" {
  name    = "test-static-ip"
  project = "<project name>"
}
$ terraform apply

取得したIPアドレスをAレコードとして、ドメインに付与します。

独自ドメインとして公開したいドメインに、上記で取得したIPアドレスをAレコードとして登録してください。

GKEクラスターの作成

$ gcloud container clusters create-auto demo-cluster --region=us-west1

Credentialsの取得

Clusterにアクセスするためのcredentialsも取得します。

$ gcloud container clusters get-credentials demo-cluster --region us-west1

これで、kubectlコマンドでresourceを作成できるようになりました。

IngressとServiceを作成する

Serviceを作成します(今回はテストなので、Nginx Containerをサービスとして立てます)。
そして、そのサービスを独自ドメインにアクセスしたら表示できるようにIngressを設定していきます。

Nginxサービスの作成

nginx.yaml

apiVersion: v1
kind: Service
metadata:
  name: test-app
spec:
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
  type: ClusterIP
  selector:
    name: test-app
---
apiVersion: v1
kind: Pod
metadata:
  labels:
    name: test-app
  name: test-app
spec:
  containers:
  - image: nginx
    name: test-app
    ports:
    - containerPort: 80

上記のように、nginxサービスとPodを作成し、KubernetesにApplyします。

$ kubectl apply -f nginx.yaml

正常に作成できたことを確認します。

$ kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
test-app     ClusterIP   10.13.128.170   <none>        80/TCP    3m14s
$ kubectl get pod
NAME       READY   STATUS    RESTARTS   AGE
test-app   1/1     Running   0          3m21s

Ingrssの作成

次に、先ほど作成したnginxをBackendとするIngressリソースを作成します。

ingress.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    # 先ほど作成した固定IPアドレスを指定
    kubernetes.io/ingress.regional-static-ip-name: "test-static-ip"

    # gceを指定することで、Google Load Balancerを作成する
    kubernetes.io/ingress.class: "gce"

    # managed cert を指定する
    networking.gke.io/managed-certificates: test-cert

    kubernetes.io/ingress.allow-http: "true"
spec:
  defaultBackend:
    service:
      name: test-app
      port:
        number: 80
---
apiVersion: networking.gke.io/v1
kind: ManagedCertificate
metadata:
  name: test-cert
spec:
  domains:
    - <ドメイン名>.com
    - www.<ドメイン名>.com

※SSL証明書を作成するため、同時にManagedCertificateリソースも作成しています。
※Aレコードで設定したIPアドレスが正常に取得できるまでSSL証明書の取得ができないため、applyから実際に独自ドメイン名でアクセスできるようになるまで、時間がかかります。

$ kubectl apply -f ingress.yaml

正常にingressが作成されていることを確認します。

$ kubectl get ingress
NAME           CLASS    HOSTS   ADDRESS        PORTS   AGE
test-ingress   <none>   *       34.160.49.33   80      7m15s

これで、GKEのIngressリソースからnginxが動作するPodまでトラフィックが到達するようにアプリケーションを作成できました!

最後に、独自ドメインでhttpsアクセスができることを確認します。

$ curl https://<ドメイン名>
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

以上で、完成です。これで、httpsアクセスが可能なGKEクラスターを作成することができました。

note

勉強法やキャリア構築法など、エンジニアに役立つ記事をnoteで配信しています。

https://note.com/ring_belle/membership

Discussion