LoginSignup
7
7

More than 5 years have passed since last update.

GKEへのRancher 2.1の導入手順

Last updated at Posted at 2018-11-17

目的

地味にGKE(Google Kubernetes Engine)にRancher 2.x系統のインストールではまる部分があるので解説します。

前提

  • Cloud DNSを使って操作可能なドメインを保有していること
  • Helmの基本的な操作ができること

手順概要

  1. Helmの導入
  2. external-dnsの導入
  3. nginx-ingressの導入
  4. cert-managerの導入
  5. Rancher 2.1のインストール

手順詳細

Helmの導入

ここでは、helmコマンドの導入については解説せず、
GKE上で稼働するk8sクラスタにtillerを導入する手順について解説します。

tillerを動作させるためのサービスアカウントtillerを準備します。
tillerサービスアカウントには、cluster-adminクラスタロールを付与します。

rbac-config.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: tiller
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: tiller
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
  - kind: ServiceAccount
    name: tiller
    namespace: kube-system
サービスアカウントの作成とtillerの導入
$ kubectl apply -f rbac-config.yaml
$ helm init --service-account tiller

external-dnsの導入

external-dnsサービスアカウントの作成

external-dnsで利用するためのサービスアカウントをGCP上に作成します。

IAMと管理メニューを選択肢、サービスアカウントをクリックします。

image.png

+サービスアカウントを作成リンクをクリックします。

image.png

サービスアカウント名external-dnsを指定して、作成ボタンをクリックします。
image.png

external-dnsサービスアカウントにDNS管理者権限を付与します。
image.png
続行ボタンをクリックして作業を進めます。

キーの作成ボタンをクリックします。
image.png

JSONを選択し、作成ボタンをクリックします。
image.png

ここでjsonファイルのダウンロードが始まるのでこれを保存します。
(ここで保存したファイルをcredentials.jsonとします)

external-dnsサービスアカウントの認証情報をk8sクラスタに登録

先程ダウンロードしたcredentials.jsonをbase64エンコーディングします。
(下記コマンドはUbuntu 18.04の場合です。OSごとにコマンドが異なるので注意してください)

credentials.jsonのbase64エンコーディング
$ cat credentials.json | base64
hogehoge

secret-external-dnsSecretリソースを作成します。
dataのキーとしてcredentials.json、値として先程のbase64エンコーディングの結果を記述します。

secre-external-dns.yaml
apiVersion: v1
kind: Secret
metadata:
  name: secret-external-dns
type: Opaque
data:
  credentials.json: "hogehoge"

ここで作成した認証情報を登録するためのexternal-dns namespaceを作成します。

external-dns名前空間の作成
$ kubectl create namespace external-dns
namespace/external-dns created

external-dnsnamespaceにsecret-external-dns.yamlの内容を適用します。

external-dnsサービスアカウントの認証情報のk8sクラスタへの登録
$ kubectl apply -f secret-external-dns.yaml -n external-dns

external-dnsの導入

まず、操作対象となるk8sクラスタの所属するプロジェクトのIDを確認します。
一般的には、GKEのk8sクラスタが所属しているGCPプロジェクトを選択します。
(下の例の場合だとsamplegoogle-projectとなります)

projectの確認
$ gcloud projects list
PROJECT_ID             NAME               PROJECT_NUMBER
samplegoogle-project   SampleProject      2312869999999
external-dnsのインストール
$ helm install stable/external-dns \
    --set provider=google\
    --set google.project=samplegoogle-project\
    --set google.ServiceAccountSecret=secret-external-dns \
    --set rbac.create=true \
    --set rbac.serviceAccountName=external-dns \
    --set rbac.apiVersion=v1 \
    --name external-dns \
    --namespace external-dns

DNSサービス(Cloud DNS)のプロバイダがGoogleなので、providergoogle
今回対象としているGCPプロジェクトのIDがsamplegoogle-projectなので、
google.projectsamplegoogle-project
Cloud DNSを操作するためのサービスアカウントの認証情報をsecret-external-dnsリソースに入れているため、
google.ServiceAccountSecretsecret-external-dnsを指定します。
また、今回GCPに作成したサービスアカウント名がexternal-dnsであるため、
rbac.serviceAccountNameexternal-dnsを指定します。

また、external-dnsnamespaceにインストールするため、
--namespace external-dnsを指定します

external-dnsのインストール後確認

Podの起動の確認
$ kubectl get pods -n external-dns
NAME                           READY   STATUS    RESTARTS   AGE
external-dns-f8bd984f4-c6jhn   1/1     Running   0          3m
$ kubectl logs pod/external-dns-f8bd984f4-c6jhn -n external-dns
time="2018-11-14T13:06:42Z" level=info msg="config: {Master: KubeConfig: RequestTimeout:30s IstioIngressGateway:istio-system/istio-ingressgateway Sources:[service ingress] Namespace: AnnotationFilter: FQDNTemplate: CombineFQDNAndAnnotation:false Compatibility: PublishInternal:false PublishHostIP:false ConnectorSourceServer:localhost:8080 Provider:google GoogleProject:youtubecaption-206603 DomainFilter:[] ZoneIDFilter:[] AlibabaCloudConfigFile:/etc/kubernetes/alibaba-cloud.json AlibabaCloudZoneType: AWSZoneType: AWSAssumeRole: AWSMaxChangeCount:4000 AWSEvaluateTargetHealth:true AzureConfigFile:/etc/kubernetes/azure.json AzureResourceGroup: CloudflareProxied:false InfobloxGridHost: InfobloxWapiPort:443 InfobloxWapiUsername:admin InfobloxWapiPassword: InfobloxWapiVersion:2.3.1 InfobloxSSLVerify:true DynCustomerName: DynUsername: DynPassword: DynMinTTLSeconds:0 OCIConfigFile:/etc/kubernetes/oci.yaml InMemoryZones:[] PDNSServer:http://localhost:8081 PDNSAPIKey: PDNSTLSEnabled:false TLSCA: TLSClientCert: TLSClientCertKey: Policy:upsert-only Registry:txt TXTOwnerID:default TXTPrefix: Interval:1m0s Once:false DryRun:false LogFormat:text MetricsAddress::7979 LogLevel:info TXTCacheInterval:0s ExoscaleEndpoint:https://api.exoscale.ch/dns ExoscaleAPIKey: ExoscaleAPISecret: CRDSourceAPIVersion:externaldns.k8s.io/v1alpha CRDSourceKind:DNSEndpoint ServiceTypeFilter:[]}"
time="2018-11-14T13:06:42Z" level=info msg="Created Kubernetes client https://10.19.240.1:443"
time="2018-11-14T13:06:44Z" level=info msg="All records are already up to date"

external-dnsのPodが起動していることがPodのログとしてAll records are already up to dateなどの
メッセージがあれば正常に動作していると判断して良いでしょう。

nginx-ingressの導入

Nginx ingressの導入に際しては以下の部分についての注意が必要です。

image.png
https://rancher.com/docs/rancher/v2.x/en/installation/ha/
より引用

この図にあるように、Nginx ingress controllerの前にL4のロードバランサーが必要です。
L4のロードバランサーの利用には、GCPでは静的IPアドレスの取得が必要となるので、この取得とNginx Ingress Controllerの導入手順を解説します。

静的IPアドレスの取得

VPCネットワークメニューを選択したあと外部IPアドレスをクリックします。

image.png

静的IPアドレスを予約リンクをクリックします。

image.png

名前rancherを指定します。
更にリージョンとして今回k8sクラスタを立ち上げているasia-northeast1を指定します。
ここまで設定が完了したら、予約ボタンをクリックします

image.png

静的IPアドレスが外部アドレスとして割り当てられていることを確認します。

image.png

ここで取得したIPアドレスを仮に8.8.8.8と今後の手順では仮置きして解説します。

nginx-ingressのインストール

nginx-ingressのインストール
$ helm install stable/nginx-ingress \
    --set rbac.create=true \
    --set controller.publishService.enabled=true \
    --set controller.service.loadBalancerIP=8.8.8.8 \
    --name nginx-ingress \
    --namespace nginx-ingress

`--set controller.service.loadBalancerIP=8.8.8.8`のIPアドレス部分には、
先程の作業で取得したIPアドレスを指定します。

podの起動確認
$ kubectl get pods -n nginx-ingress
NAME                                             READY   STATUS    RESTARTS   AGE
nginx-ingress-controller-6cb58b9bbb-n6wrc        1/1     Running   0          1m
nginx-ingress-default-backend-544cfb69fc-4tvsc   1/1     Running   0          1m
controlPodのログ確認
$ kubectl -n nginx-ingress logs nginx-ingress-controller-6cb58b9bbb-n6wrc
-------------------------------------------------------------------------------
NGINX Ingress controller
  Release:    0.19.0
  Build:      git-05025d6
  Repository: https://github.com/kubernetes/ingress-nginx.git
-------------------------------------------------------------------------------

I1114 13:15:57.456172       6 flags.go:184] Watching for Ingress class: nginx
nginx version: nginx/1.15.3
W1114 13:15:57.464280       6 client_config.go:552] Neither --kubeconfig nor --master was specified.  Using the inClusterConfig.  This might not work.
I1114 13:15:57.464731       6 main.go:191] Creating API client for https://10.19.240.1:443
I1114 13:15:57.477090       6 main.go:235] Running in Kubernetes cluster version v1.11+ (v1.11.2-gke.18) - git (clean) commit 5796233393d7bc034428de15191ad3d2eaff95fb - platform linux/amd64
I1114 13:15:57.479610       6 main.go:100] Validated nginx-ingress/nginx-ingress-default-backend as the default backend.
I1114 13:15:57.987832       6 nginx.go:256] Starting NGINX Ingress controller
I1114 13:15:58.014568       6 event.go:221] Event(v1.ObjectReference{Kind:"ConfigMap", Namespace:"nginx-ingress", Name:"nginx-ingress-controller", UID:"5dd77f27-e80f-11e8-93be-42010a9201cf", APIVersion:"v1", ResourceVersion:"34850", FieldPath:""}): type:'Normal' reason: 'CREATE' ConfigMap nginx-ingress/nginx-ingress-controller
I1114 13:15:59.188916       6 nginx.go:277] Starting NGINX process
I1114 13:15:59.190894       6 leaderelection.go:185] attempting to acquire leader lease  nginx-ingress/ingress-controller-leader-nginx...
I1114 13:15:59.192361       6 controller.go:171] Configuration changes detected, backend reload required.
I1114 13:15:59.198787       6 leaderelection.go:194] successfully acquired lease nginx-ingress/ingress-controller-leader-nginx
I1114 13:15:59.199190       6 status.go:197] new leader elected: nginx-ingress-controller-6cb58b9bbb-n6wrc
I1114 13:15:59.431225       6 controller.go:187] Backend successfully reloaded.
I1114 13:15:59.432060       6 controller.go:197] Initial synchronization of the NGINX configuration.
I1114 13:16:00.434350       6 controller.go:204] Dynamic reconfiguration succeeded.

Dynamic reconfiguration succeeded.のメッセージが出ていれば問題なし。

cert-managerの導入

Helmのチャートからインストールするだけなので、手順のみを掲載します。

cert-managerの導入
$ helm install stable/cert-manager \
    --namespace cert-manager \
    --name cert-manager
$ kubectl -n cert-manager get pods
NAME                            READY   STATUS    RESTARTS   AGE
cert-manager-787d565b77-4l4k8   1/1     Running   0          52s
$ kubectl -n cert-manager logs cert-manager-787d565b77-4l4k8
I1114 13:20:24.108042       1 start.go:79] starting cert-manager v0.5.0 (revision 7924346bd84e41053cc508956b0a1b567c932416)
I1114 13:20:24.122455       1 controller.go:126] Using the following nameservers for DNS01 checks: [10.19.240.10:53]
I1114 13:20:24.123793       1 leaderelection.go:175] attempting to acquire leader lease  cert-manager/cert-manager-controller...
I1114 13:20:24.124610       1 server.go:84] Listening on http://0.0.0.0:9402
I1114 13:20:24.140288       1 leaderelection.go:184] successfully acquired lease cert-manager/cert-manager-controller
I1114 13:20:24.145318       1 controller.go:68] Starting issuers controller
I1114 13:20:24.145702       1 controller.go:68] Starting certificates controller
I1114 13:20:24.148246       1 controller.go:68] Starting clusterissuers controller
I1114 13:20:24.148282       1 controller.go:68] Starting ingress-shim controller

Rancher 2.1のインストール

2018年11月12日時点では正常な動作に必要なチャートへのオプションの追加が
Rancher公式のチャートリポジトリに上がっているチャートではできない状態だったので、
最新のチャートの設定をGithubのリポジトリからダウンロードして適用します。

Rancher2.xのインストール
$ git clone https://github.com/rancher/server-chart.git
$ cd server-chart/rancher
$ helm install . \
  --name rancher \
  --namespace cattle-system \
  --set hostname=rancher.example.com\
  --set replicas=1 \
  --set ingress.extraAnnotations."kubernetes\.io/ingress\.class"="nginx"

Nginx Ingress Controllerを利用するため、
--set ingress.extraAnnotations."kubernetes\.io/ingress\.class"="nginx"を追加しています。
また、Rancherにアクセスする際のFQDNとしてrancher.example.com--set hostname=rancher.example.comで指定します。
ここで指定したドメイン(example.com)は実際には、ご自身のアカウントのCloud DNSで利用可能なドメインを指定してください。

image.png

すべてのPodが起動し、DNSを使って名前解決が可能になったタイミングでWebブラウザでアクセス & 初期設定を完了させると
Rancher 2.1のGKE上のk8sクラスタへのインストールは完了です。

7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7