More Related Content Similar to OCP Meetup Tokyo #05 ECK on OCP (20) More from Tetsuya Sodo (10) OCP Meetup Tokyo #05 ECK on OCP1. Elastic Cloud on Kubernetes
(ECK)をOCPに入れてみた
@tetsuyasd
OpenShift Meetup Tokyo #05
2019/07/24
~OpenShiftあるある、なつらみ~
2. Who am I ?
2
名前: 惣道 哲也 (そうどう てつや)
Twitter: @tetsuyasd
所属: 日本ヒューレット・パッカード株式会社 Pointnext事業統括
職務: オープンソース関連いろいろ(調査、検証、構築、提案)
- Cloud / Container / Data Analytics / etc…
Elasticsearch実践ガイド(impress top gear)
インプレスより発売中
3. Agenda (40min)
3
1. Elastic Cloud on Kubernetes(ECK)とは何か?
2. Elasticsearchの概要
3. ECKをAKS(Azure k8s)に入れてみる
4. ECKをOCPに入れてみる
5. OCPにOperatorを入れる際の(たぶん)一般的な注意点
Operatorは最高だ~
9. Elastic Cloud on Kubernetes(ECK)のリリース(2019/05/21)
– Kubernetes Operatorパターンに基づいた新しいプロダクト
– “Elasticライセンス”に基づいてソースコードも公開 (https://github.com/elastic/cloud-on-k8s)
– 現時点ではalphaリリースであり、GKEとvanilla Kubernetes version 1.11以降をサポート
9
■注意
本セッションでは、あくまでOperatorの利用方法や
仕組みを学ぶ目的でECKを試しております。
https://www.elastic.co/jp/blog/introducing-elastic-cloud-on-kubernetes-the-elasticsearch-operator-and-beyond
10. Elasticsearchのデプロイ方法いろいろ
–Elastic社が提供するもの
– Elastic Stack (Elasticsearch + Kibana + Logstash + Beats)
–Linux / MacOS / Windows
– Elastic Cloud (Managed Service)
–AWS / GCP
– コンテナ
–Docker Engine (docker / docker-compose)
–Helm Chart (beta)
–Elastic Cloud on Kubernetes (alpha)
–その他から提供されているもの
– Amazon Elasticsearch Service (Managed Service)
– Open Distro for Elasticsearch by AWS
10
★New★
11. ECKの提供する主な機能
– ElasticsearchクラスタとKibanaのデプロイと設定管理
– Elastic Stackの新しいバージョンへのアップグレード容易に
– クラスタのスケールアウト/スケールイン
– クラスタ設定・ノード設定の変更
– Persistent volumes / ローカルストレージの利用
– CronJobリソースを利用した定期的な自動スナップショット取得
– デフォルトで通信暗号化などのセキュア設定が有効化
11
https://www.elastic.co/jp/blog/introducing-elastic-cloud-on-kubernetes-the-elasticsearch-operator-and-beyond
12. ECKを用いた環境デプロイのざっくりイメージ (1/3)
① Elasticsearchクラスタデプロイ用yamlの作成
12
apiVersion:
elasticsearch.k8s.elastic.co/v1alpha1
kind: Elasticsearch
metadata:
name: quickstart
spec:
version: 7.2.0
nodes:
- nodeCount: 3
config:
node.master: true
node.data: true
node.ingest: true
apiVersion: kibana.k8s.elastic.co/v1alpha1
kind: Kibana
metadata:
name: quickstart
spec:
version: 7.2.0
nodeCount: 1
elasticsearchRef:
name: quickstart
② Kibanaデプロイ用yamlの作成
CRDリソース
CRDリソース
$ oc apply –f my-es-cluster.yaml
elasticsearch.elasticsearch.k8s.elastic.co/quickstart
created
$ oc apply –f my-kibana.yaml
kibana.kibana.k8s.elastic.co/quickstart created
③ ElasticsearchとKibanaのデプロイ
13. ECKを用いた環境デプロイのざっくりイメージ (2/3)
④ リソースが作成される
13
[sodo@bastion01 eck]$ oc get all
NAME READY STATUS RESTARTS AGE
pod/quickstart-es-bp92fwgvvj 1/1 Running 0 3m2s
pod/quickstart-es-dctcm56pj6 1/1 Running 0 3m2s
pod/quickstart-es-dx48cjc4sp 1/1 Running 0 3m2s
pod/quickstart-kibana-67f5b76b74-bcgwg 1/1 Running 0 3m2s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/quickstart-es NodePort 172.30.104.195 <none> 9200:32489/TCP 3m3s
service/quickstart-es-discovery ClusterIP None <none> 9300/TCP 3m3s
service/quickstart-kibana NodePort 172.30.12.244 <none> 5601:32641/TCP 3m2s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/quickstart-kibana 1/1 1 1 3m2s
NAME DESIRED CURRENT READY AGE
replicaset.apps/quickstart-kibana-67f5b76b74 1 1 1 3m2s
3node cluster
kibana
17. Elasticsearchのインデックス登録とクエリの例
– インデックス登録の例
17
$ curl -XPOST ’http://localhost:9200/my_index/_doc/’ -H ’Content-Type: application/json’ -d ’
{
"user": "kimchy",
"post_date": "2009-11-15T13:12:00",
"message": "Trying out Elasticsearch, so far so good?"
}’
$ curl -XGET ’http://localhost:9200/my_index/_search’ -H ’Content-Type: application/json’ -d ’
{
"query": {
"match": {
"message": "Elasticsearch"
}
}
}’
– クエリの例
複数のkey:valueからなる
任意のJSONドキュメント
特定のkeyに対して文字列
検索をした例
23. ECKをAKSに入れる手順概要 (1/2)
–AKSをセットアップする(Azure CLI/kubectl利用)
– “az login”
– “az group create”
– “az network vnet create”
– “az aks create”
– “az aks get-credentials”
– “kubectl get nodes”
– ECK Operatorデプロイ
– “kubectl apply -f https://download.elastic.co/downloads/eck/0.8.1/all-in-one.yaml”
– Elasticsearchクラスタデプロイ
– “kubectl apply -f my-es-cluster.yaml”
– Kibanaデプロイ
– “kubectl apply -f my-kibana.yaml”
23
AKSクラスタ作成方法は
Appendixに手順を掲載
デプロイするyamlを任意に
記述してapplyする(後述)
24. ECKをAKSに入れる手順概要 (2/2)
– Elasticsearchクラスタデプロイ用yamlの例
(例: my-es-cluster.yaml)
24
apiVersion:
elasticsearch.k8s.elastic.co/v1alpha1
kind: Elasticsearch
metadata:
name: quickstart
spec:
version: 7.2.0
nodes:
- nodeCount: 3
config:
node.master: true
node.data: true
node.ingest: true
apiVersion: kibana.k8s.elastic.co/v1alpha1
kind: Kibana
metadata:
name: quickstart
spec:
version: 7.2.0
nodeCount: 1
elasticsearchRef:
name: quickstart
– Kibanaデプロイ用yamlの例
(例: my-kibana.yaml)
CRDリソース
CRDリソース
$ kubectl apply -f https://download.elastic.co/downloads/eck/0.8.1/all-in-one.yaml
– ECK Operatorの導入
$ kubectl apply –f my-es-cluster.yaml
$ kubectl apply –f my-kibana.yaml
– よしなにデプロイ
28. ECKをOCPに入れる手順概要(仮) (1/6)
① 事前準備:手動でnamespaceとservice accountを作っておき、事前にSCCのprivileged権限を付与しておく
28
$ oc create namespace elastic-system
namespace/elastic-system created
$ oc create serviceaccount elastic-operator -n elastic-system
serviceaccount/elastic-operator created
$ oc adm policy add-scc-to-user privileged -z elastic-operator
securitycontextconstraints.security.openshift.io/privileged added to:
["system:serviceaccount:openshift-ingress-operator:elastic-operator"]
② 事前準備:Operator導入用yamlをダウンロードする(内容の編集が必要なため)
$ wget https://download.elastic.co/downloads/eck/0.8.1/all-in-one.yaml
■注意:①~⑤まではClusterAdminで実行してください
※注意:権限付与はセキュリティリスクを伴うため常にコンテナイメージの安全性を確認してください
29. ECKをOCPに入れる手順概要(仮) (2/6)
③ 事前準備:ダウンロードしたall-in-one.yamlを編集する(赤枠の4か所・5行を追加)
29
- apiGroups:
- elasticsearch.k8s.elastic.co
resources:
- elasticsearches
- elasticsearches/status
- elasticsearches/finalizers
- clusterlicenses
- enterpriselicenses
- enterpriselicenses/status
- enterpriselicenses/finalizers
- trustrelationships
…
- apiGroups:
- kibana.k8s.elastic.co
resources:
- kibanas
- kibanas/status
- kibanas/finalizers
apiVersion: apps/v1
kind: StatefulSet
…
spec:
selector:
matchLabels:
control-plane: elastic-operator
serviceName: elastic-operator
template:
metadata:
labels:
control-plane: elastic-operator
spec:
serviceAccountName: elastic-operator
containers:
- image: docker.elastic.co/eck/eck-operator:0.8.1
securityContext:
privileged: true
elastic-operatorのClusterRole定義(L.1080あたり) elastic-operatorのStatefulSet定義(L.1190あたり)
30. ECKをOCPに入れる手順概要(仮) (3/6)
④ all-in-one.yamlをapplyしてOperatorを作成する
30
$ oc apply -f all-in-one.yaml
customresourcedefinition.apiextensions.k8s.io/apmservers.apm.k8s.elastic.co created
customresourcedefinition.apiextensions.k8s.io/clusterlicenses.elasticsearch.k8s.elastic.co created
customresourcedefinition.apiextensions.k8s.io/elasticsearches.elasticsearch.k8s.elastic.co created
customresourcedefinition.apiextensions.k8s.io/enterpriselicenses.elasticsearch.k8s.elastic.co created
customresourcedefinition.apiextensions.k8s.io/remoteclusters.elasticsearch.k8s.elastic.co created
customresourcedefinition.apiextensions.k8s.io/trustrelationships.elasticsearch.k8s.elastic.co created
customresourcedefinition.apiextensions.k8s.io/users.elasticsearch.k8s.elastic.co created
customresourcedefinition.apiextensions.k8s.io/kibanas.kibana.k8s.elastic.co created
clusterrole.rbac.authorization.k8s.io/elastic-operator created
clusterrolebinding.rbac.authorization.k8s.io/elastic-operator created
namespace/elastic-system configured
statefulset.apps/elastic-operator created
secret/webhook-server-secret created
serviceaccount/elastic-operator configured
⑤ Operatorが属するelastic-systemネームスペースを他テナントと疎通可能にする
$ oc adm pod-network make-projects-global elastic-system
(ovs-multitenant構成の場合のみ実行する ※後述)
31. ECKをOCPに入れる手順概要(仮) (4/6)
31
$ oc new-project myeck
Now using project "myeck" on server "https://api.ocp4101.vlan016.cnta.local:6443".
…
$ oc project
Using project "myeck" on server "https://api.ocp4101.vlan016.cnta.local:6443".
⑥ 利用者テナントに切り替える
$ oc apply –f my-es-cluster.yaml
elasticsearch.elasticsearch.k8s.elastic.co/quickstart created
$ oc apply –f my-kibana.yaml
kibana.kibana.k8s.elastic.co/quickstart created
⑦ ElasticsearchとKibanaのデプロイ (yamlの書き方については後述)
■注意:⑥~⑨まではテナント利用者として実行してください
32. ECKをOCPに入れる手順概要(仮) (5/6)
32
$ PASSWORD=$(kubectl get secret quickstart-elastic-user -o=jsonpath='{.data.elastic}' |¥
base64 --decode)
$ echo $PASSWORD
bh4f4k5vjtbb664dz79hgtjw
$ curl -u "elastic:$PASSWORD" -k https://<Master_or_Worker_Node_IP>:<NodePort>
{
"name" : "quickstart-es-sbngffdhkf",
"cluster_name" : "quickstart",
"cluster_uuid" : "EDip-cpRR6qo8lQdtiJFdA",
"version" : {
"number" : "7.2.0",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "508c38a",
"build_date" : "2019-06-20T15:54:18.811730Z",
"build_snapshot" : false,
"lucene_version" : "8.0.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
⑧ Elasticsearchクラスタへの疎通確認
33. ECKをOCPに入れる手順概要(仮) (6/6)
33
$ echo $(kubectl get secret quickstart-elastic-user -o=jsonpath='{.data.elastic}' |¥
base64 --decode)
bh4f4k5vjtbb664dz79hgtjw
⑨ Kibanaのログインパスワード確認
⑩ KibanaのServiceへのSSHポート転送設定 ⑪ Kibanaへelasticユーザでログイン(localhost:5601)
Kibana serviceの
NodePort
Master/Workerの中の
いずれかのIPアドレス
40. OCPにOperatorを入れる際の注意点 (3/5)
–OpenShiftデフォルトのElasticsearchリソースと名前空間がかぶる
症状:最初からelasticsearches.logging.openshift.ioというCRDがあるため名前衝突が起こる
回避策:リソースをフルパス?で指定する(usersリソースも同様にusers.openshift.ioとかぶる)
40
$ oc get crds | grep -e elastic -e kibana
apmservers.apm.k8s.elastic.co 2019-07-07T01:02:07Z
clusterlicenses.elasticsearch.k8s.elastic.co 2019-07-07T01:02:07Z
elasticsearches.elasticsearch.k8s.elastic.co 2019-07-07T01:02:07Z
elasticsearches.logging.openshift.io 2019-06-17T03:53:42Z
enterpriselicenses.elasticsearch.k8s.elastic.co 2019-07-07T01:02:07Z
kibanas.kibana.k8s.elastic.co 2019-07-07T01:02:07Z
remoteclusters.elasticsearch.k8s.elastic.co 2019-07-07T01:02:07Z
trustrelationships.elasticsearch.k8s.elastic.co 2019-07-07T01:02:07Z
users.elasticsearch.k8s.elastic.co 2019-07-07T01:02:07Z
$ oc get elasticsearch/quickstart
Error from server (NotFound): elasticsearches.logging.openshift.io "quickstart" not found
$ oc get elasticsearch.elasticsearch.k8s.elastic.co/quickstart
NAME HEALTH NODES VERSION PHASE AGE
quickstart green 3 7.2.0 Operational 3m45s
42. OCPにOperatorを入れる際の注意点 (4/5)
–CNIでovs-multitenant構成にしている場合のみテナント(project)間疎通ができない
回避策:テナント間疎通を以下のいずれかのコマンドで有効化する
42
$ oc adm pod-network join-projects --to=eck elastic-system ## 特定のテナントだけ疎通可能にする
$ oc adm pod-network make-projects-global elastic-system ## elastic-systemを全部疎通可能にする
$ oc get netnamespaces
NAME NETID EGRESS IPS
default 0 []
eck 12556575 []
elastic-system 14389832 []
kafka 8405702 []
kube-public 16343347 []
kube-service-catalog 0 []
kube-system 4594827 []
openshift-infra 10726890 []
openshift-logging 11674285 []
openshift-monitoring 0 []
…
$ oc get netnamespaces
NAME NETID EGRESS IPS
default 0 []
eck 12556575 []
elastic-system 12556575 []
kafka 8405702 []
kube-public 16343347 []
kube-service-catalog 0 []
kube-system 4594827 []
openshift-infra 10726890 []
openshift-logging 11674285 []
openshift-monitoring 0 []
…
ちなみに
make-projects-globalにすると
NETIDは0になる
デフォルトのnetnamespace 特定のテナントだけ疎通可能にした状態
50. AKSクラスタセットアップ手順
– 前提:Azure CLIとkubectlはインストール済み
50
## ログイン
$ az login
## リソースグループの作成
$ az group create --name aks01rg ¥
--location japaneast
## 仮想ネットワークとサブネットの作成
$ az network vnet create ¥
--name aksVNet ¥
--resource-group aks01rg ¥
--address-prefixes 10.0.0.0/8 ¥
--subnet-name aksSubNet ¥
--subnet-prefixes 10.1.0.0/16 ¥
--location japaneast
## サブネットID の取得
$ VNET_SUBNET_ID=$(az network vnet subnet list ¥
--resource-group aks01rg ¥
--vnet-name aksVNet ¥
--query [].id --output tsv)
## AKSクラスタの作成
$ az aks create --resource-group aks01rg ¥
--name aks01 ¥
--network-plugin azure ¥
--vnet-subnet-id ${VNET_SUBNET_ID} ¥
--docker-bridge-address 172.17.0.1/16 ¥
--dns-service-ip 10.0.0.10 ¥
--service-cidr 10.0.0.0/16 ¥
--node-count 3 ¥
--kubernetes-version 1.13.5 ¥
--generate-ssh-keys
## クレデンシャル情報の登録
$ az aks get-credentials --resource-group aks01rg ¥
--name aks01
## 動作確認(ノード一覧の取得)
$ kubectl get node
NAME STATUS ROLES AGE VERSION
aks-nodepool1-38425010-0 Ready agent 3m31s v1.13.5
aks-nodepool1-38425010-1 Ready agent 3m19s v1.13.5
aks-nodepool1-38425010-2 Ready agent 3m7s v1.13.5
※本手順は「Kubernetes実践ガイド(impress top gear)」を参考にさせていただきました。