kubernetes実戦-redisとdockerに基づく伝言簿ケース

18065 ワード

一、紹介
このケースはKubernetesとDockerに基づいています.
1、webフロントエンド
2、redis master
3、redis slave
Webフロントエンドはjavascript redis apiとredis masterでインタラクティブです
kubernetesアーキテクチャ
二、配置
0、前提条件
Kubernetesクラスタ
1.redisマスターを起動する
replication controllerを使用して、1つのpodのみが実行されていることを確認します(ノードがdownになった場合、rcは別の健康なnodeでredis masterを起動します).ただし、データが失われる可能性があります.
[root@centos1 example]# kubectl create -f redis-master-controller.json replicationcontrollers/redis-master[root@centos1 example]# kubectl get rcCONTROLLER     CONTAINER(S)   IMAGE(S)   SELECTOR            REPLICASredis-master   master         redis      name=redis-master   1

masterの動作が成功したことを検証し、podがcentos 2/192.168.1.1.1112という機械で動作していることを以下に示す.
[root@centos1 example]# kubectl get podsPOD                  IP           CONTAINER(S)   IMAGE(S)   HOST                    LABELS              STATUS    CREATED      MESSAGEredis-master-svar7   172.17.0.9                             centos2/192.168.1.112   name=redis-master   Running   55 seconds                                     master         redis                                                  Running   55 seconds

SSHからcentos 2/192.168.1.1.1112 dockerステータスの表示
[root@centos2 yum.repos.d]# docker psCONTAINER ID        IMAGE                                  COMMAND                CREATED             STATUS              PORTS               NAMES91689ce56668        redis:latest                           "/entrypoint.sh redi   3 minutes ago       Up 3 minutes                            k8s_master.52732b08_redis-master-svar7_default_5b6d5485-1894-11e5-b3ad-000c293c8c19_97e79b7b   38c3180813c3        gcr.io/google_containers/pause:0.8.0   "/pause"               3 minutes ago       Up 3 minutes                            k8s_POD.49eee8c2_redis-master-svar7_default_5b6d5485-1894-11e5-b3ad-000c293c8c19_298e038f

注意:kubectl create実行後、ミラーが存在しない場合はdocker pullが実行され、ネットワークの状況に応じてダウンロード中のpodsはkubertnetes UIにpending状態が表示されます
2、マスターサービスを起動する
1つのkubernetesサービスは、redis-masterで定義したlabelsメタデータによって実装されます.redisには1つのmasterしかありませんが、elastic IPを使用して特定のmasterにルーティングできるため、サービスを作成します.
kubernetesクラスタにおけるサービスはcontainerにおける環境変数によってサービス発見を実現し,サービスはpod labelに基づいてcontainerの負荷等化を実現する.
最初のステップで作成されたpodにはlabel「name=redis-master」が含まれており、サービスのselectorフィールドは、サービスがトラフィックをどのpodに転送するかを決定し、portおよびtargetPort情報は、サービスproxyがどのポートで実行されるかを定義します.
[root@centos1 example]# kubectl create -f redis-master-service.json services/redis-master[root@centos1 example]# kubectl get servicesNAME            LABELS                                    SELECTOR            IP(S)           PORT(S)redis-master    name=redis-master                         name=redis-master   10.254.154.90   6379/TCP

上記の実行に成功すると、すべてのpodsはredis masterが6379ポートで実行されていることを発見し、salveからmasterトラフィックへの移行には次の2つのステップがあります.
1、redis slaveがredis master serviceのportに接続される
2、トラフィックはサービスノードのportからtargetPortまで
targetPortが指定されていない場合、デフォルトはportと一致します.
3、replicated slave podを起動する
redis masterは単独のpodであるが、redis slavesはreplicated podであり、Kubernetesでは、1つのReplication Controlローラが1つのreplicated podの複数のインスタンスを管理し、RCはdownから落ちたreplicaを自動的に引き上げる(dockerプロセスを殺すことによって簡単にテストすることができる)
[root@centos1 example]# kubectl create -f redis-slave-controller.json replicationcontrollers/redis-slave[root@centos1 example]# kubectl get rcCONTROLLER     CONTAINER(S)   IMAGE(S)                    SELECTOR            REPLICASredis-master   master         redis                       name=redis-master   1redis-slave    slave          kubernetes/redis-slave:v2   name=redis-slave    2[root@centos1 example]# kubectl get podsPOD                  IP            CONTAINER(S)   IMAGE(S)                    HOST                    LABELS              STATUS    CREATED      MESSAGEredis-master-svar7   172.17.0.9                                               centos2/192.168.1.112   name=redis-master   Running   41 minutes                                      master         redis                                                                   Running   41 minutes   redis-slave-31tkb    172.17.0.10                                              centos2/192.168.1.112   name=redis-slave    Running   29 seconds                                      slave          kubernetes/redis-slave:v2                                               Running   28 seconds   redis-slave-uk8nu    172.17.0.11                                              centos2/192.168.1.112   name=redis-slave    Running   29 seconds                                      slave          kubernetes/redis-slave:v2                                               Running   28 seconds

1つのmaster podと2つのslave podが見えます
4、slaveサービスを起動する
マスターと同様に、サービス発見に加えて、slaveサービスはweb app clientに透明なエージェントを提供するエージェントサービスをredis slaveに接続することを望んでいます.
今回のサービスのselectorはname=redis-slaveで、kubectl getサービス-l「label=value」コマンドを使用してこれらのサービスを位置決めすることができます.
[root@centos1 example]# kubectl create -f redis-slave-service.json services/redis-slave[root@centos1 example]# kubectl get servicesNAME            LABELS                                    SELECTOR            IP(S)            PORT(S)redis-master    name=redis-master                         name=redis-master   10.254.154.90    6379/TCPredis-slave     name=redis-slave                          name=redis-slave    10.254.159.145   6379/TCP

5.frontend podの作成
これは、master service(ライトリクエスト)またはslave service(リードリクエスト)と対話するための簡単なPHPサービスです.
[root@centos1 example]# kubectl create -f frontend-controller.json replicationcontrollers/frontend[root@centos1 example]# kubectl get rcCONTROLLER     CONTAINER(S)   IMAGE(S)                                    SELECTOR            REPLICASfrontend       php-redis      kubernetes/example-guestbook-php-redis:v2   name=frontend       3redis-master   master         redis                                       name=redis-master   1redis-slave    slave          kubernetes/redis-slave:v2                   name=redis-slave    2

実行に成功したら、現在のpod実行ステータスを表示します.
[root@centos1 example]# kubectl get podsPOD                  IP            CONTAINER(S)   IMAGE(S)                                    HOST                    LABELS              STATUS    CREATED      MESSAGEfrontend-fr5z1       172.17.0.13                                                              centos2/192.168.1.112   name=frontend       Running   2 minutes                                       php-redis      kubernetes/example-guestbook-php-redis:v2                                               Running   2 minutes    frontend-gjx3t       172.17.0.14                                                              centos2/192.168.1.112   name=frontend       Running   2 minutes                                       php-redis      kubernetes/example-guestbook-php-redis:v2                                               Running   2 minutes    frontend-v608r       172.17.0.12                                                              centos2/192.168.1.112   name=frontend       Running   2 minutes                                       php-redis      kubernetes/example-guestbook-php-redis:v2                                               Running   2 minutes    redis-master-svar7   172.17.0.9                                                               centos2/192.168.1.112   name=redis-master   Running   53 minutes                                      master         redis                                                                                   Running   53 minutes   redis-slave-31tkb    172.17.0.10                                                              centos2/192.168.1.112   name=redis-slave    Running   12 minutes                                      slave          kubernetes/redis-slave:v2                                                               Running   12 minutes   redis-slave-uk8nu    172.17.0.11                                                              centos2/192.168.1.112   name=redis-slave    Running   12 minutes                                      slave          kubernetes/redis-slave:v2                                                               Running   12 minutes

1つのredis master,2つのredis slave,3つのfrontend podsが見られます
6、guestbookサービスの作成
他のサービスと同様に、サービス管理frontend podsを作成できます.
[root@centos1 example]# kubectl create -f frontend-service.json services/frontend[root@centos1 example]# kubectl get servicesNAME            LABELS                                    SELECTOR            IP(S)            PORT(S)frontend        name=frontend                             name=frontend       10.254.154.111   80/TCPredis-master    name=redis-master                         name=redis-master   10.254.154.90    6379/TCPredis-slave     name=redis-slave                          name=redis-slave    10.254.159.145   6379/TCP

frontendサービス(10.254.154.111)でpodsにアクセスできますが、このIPは明らかに外部でアクセスできません.次のセクションでは、guestbookに外部ネットワークでアクセスする方法について説明します.
7、外部ネットワークアクセスguestbook
kubernetesは、2つのアクセスをサポートし、1つのサービスを外部IPアドレスNodePort sおよびLoadBalancer sに暴露する.https://github.com/GoogleCloudPlatform/kubernetes/blob/master/docs/services.md#external-services
また、ファイアウォールを表示して、サービスに対応するポートを見つけることができます.
[root@centos1 example]# kubectl get pods,servicesPOD                  IP            CONTAINER(S)   IMAGE(S)                                    HOST                    LABELS              STATUS    CREATED         MESSAGEfrontend-fr5z1       172.17.0.13                                                              centos2/192.168.1.112   name=frontend       Running   22 minutes                                         php-redis      kubernetes/example-guestbook-php-redis:v2                                               Running   22 minutes      frontend-gjx3t       172.17.0.14                                                              centos2/192.168.1.112   name=frontend       Running   22 minutes                                         php-redis      kubernetes/example-guestbook-php-redis:v2                                               Running   22 minutes      frontend-v608r       172.17.0.12                                                              centos2/192.168.1.112   name=frontend       Running   22 minutes                                         php-redis      kubernetes/example-guestbook-php-redis:v2                                               Running   22 minutes      redis-master-svar7   172.17.0.9                                                               centos2/192.168.1.112   name=redis-master   Running   About an hour                                      master         redis                                                                                   Running   About an hour   redis-slave-31tkb    172.17.0.10                                                              centos2/192.168.1.112   name=redis-slave    Running   32 minutes                                         slave          kubernetes/redis-slave:v2                                                               Running   32 minutes      redis-slave-uk8nu    172.17.0.11                                                              centos2/192.168.1.112   name=redis-slave    Running   32 minutes                                         slave          kubernetes/redis-slave:v2                                                               Running   32 minutes      NAME            LABELS                                    SELECTOR            IP(S)            PORT(S)frontend        name=frontend                             name=frontend       10.254.154.111   80/TCPkubernetes      component=apiserver,provider=kubernetes                 10.254.0.2       443/TCPkubernetes-ro   component=apiserver,provider=kubernetes                 10.254.0.1       80/TCPredis-master    name=redis-master                         name=redis-master   10.254.154.90    6379/TCPredis-slave     name=redis-slave                          name=redis-slave    10.254.159.145   6379/TCP[root@centos1 example]# kubectl get servicesNAME            LABELS                                    SELECTOR            IP(S)            PORT(S)frontend        name=frontend                             name=frontend       10.254.154.111   80/TCPkubernetes      component=apiserver,provider=kubernetes                 10.254.0.2       443/TCPkubernetes-ro   component=apiserver,provider=kubernetes                 10.254.0.1       80/TCPredis-master    name=redis-master                         name=redis-master   10.254.154.90    6379/TCPredis-slave     name=redis-slave                          name=redis-slave    10.254.159.145   6379/TCP

発見redis-masterは10.254.154.90でcentos 2にログインしiptables-saveを実行し、その中にこのようなルールがあることを発見した.
-A KUBE-PORTALS-HOST -d 10.254.154.90/32 -p tcp -m comment --comment "default/redis-master:" -m tcp --dport 6379 -j DNAT --to-destination 192.168.1.112:49038

説明、centos 2ネイティブの49038ポートはmaster container内の6379にマッピングされています.もちろん、ネイティブでredisにアクセスすることができます.
[root@centos2 yum.repos.d]# redis-cli -p 49038127.0.0.1:49038> set a bOK127.0.0.1:49038> get a"b"

8、curlで簡単なテスト
データの送信
curl "localhost:8000/index.php?cmd=set&key=messages&value=jay_sais_hi"

データの問合せ
curl "localhost:8000/index.php?cmd=get&key=messages"

本例で用いる6個を添付する.jsonファイル
1、redis-master-controller.json
{   "kind":"ReplicationController",   "apiVersion":"v1beta3",   "metadata":{      "name":"redis-master",      "labels":{         "name":"redis-master"      }   },   "spec":{      "replicas":1,      "selector":{         "name":"redis-master"      },      "template":{         "metadata":{            "labels":{               "name":"redis-master"            }         },         "spec":{            "containers":[               {                  "name":"master",                  "p_w_picpath":"redis",                  "ports":[                     {                        "containerPort":6379                     }                  ]               }            ]         }      }   }}

2、redis-master-service.json
{   "kind":"Service",   "apiVersion":"v1beta3",   "metadata":{      "name":"redis-master",      "labels":{         "name":"redis-master"      }   },   "spec":{      "ports": [        {          "port":6379,          "targetPort":6379        }      ],      "selector":{         "name":"redis-master"      }   }}

3、redis-slave-controller.json
{   "kind":"ReplicationController",   "apiVersion":"v1beta3",   "metadata":{      "name":"redis-slave",      "labels":{         "name":"redis-slave"      }   },   "spec":{      "replicas":2,      "selector":{         "name":"redis-slave"      },      "template":{         "metadata":{            "labels":{               "name":"redis-slave"            }         },         "spec":{            "containers":[               {                  "name":"slave",                  "p_w_picpath":"kubernetes/redis-slave:v2",                  "ports":[                     {                        "containerPort":6379                     }                  ]               }            ]         }      }   }}

4、redis-slave-service.json
{   "kind":"Service",   "apiVersion":"v1beta3",   "metadata":{      "name":"redis-slave",      "labels":{         "name":"redis-slave"      }   },   "spec":{      "ports": [        {          "port":6379        }      ],      "selector":{         "name":"redis-slave"      }   }}

5、frontend-controller.json
{   "kind":"ReplicationController",   "apiVersion":"v1beta3",   "metadata":{      "name":"frontend",      "labels":{         "name":"frontend"      }   },   "spec":{      "replicas":3,      "selector":{         "name":"frontend"      },      "template":{         "metadata":{            "labels":{               "name":"frontend"            }         },         "spec":{            "containers":[               {                  "name":"php-redis",                  "p_w_picpath":"kubernetes/example-guestbook-php-redis:v2",                  "ports":[                     {                        "containerPort":80                     }                  ]               }            ]         }      }   }}

6、frontend-service.json
{   "kind":"Service",   "apiVersion":"v1beta3",   "metadata":{      "name":"frontend",      "labels":{         "name":"frontend"      }   },   "spec":{      "ports": [        {          "port":80        }      ],      "selector":{         "name":"frontend"      }   }}