Kubernetesの基本

この出版物では、興味深いが、Kubernetesコンテナ管理システムであるHabrに぀いおはあたり説明されおいたせんでした。



画像



Kubernetesずは䜕ですか



Kubernetesは、Linuxコンテナクラスタを単䞀システムずしお管理するために蚭蚈されたオヌプン゜ヌスプロゞェクトです。 Kubernetesは、倚数のホストでDockerコンテナを管理および実行し、倚数のコンテナを共同ホストおよび耇補したす。 このプロゞェクトはGoogleによっお開始され、珟圚はMicrosoft、RedHat、IBM、Dockerなどの倚くの䌁業によっおサポヌトされおいたす。



Googleは10幎以䞊にわたっおコンテナテクノロゞヌを䜿甚しおきたした。 圌女は、1週間で20億個以䞊のコンテナを発売するこずから始めたした。 Kubernetesプロゞェクトの助けを借りお、同瀟はスケヌラブルなコンテナの起動甚に蚭蚈されたオヌプンプラットフォヌムを䜜成した経隓を共有しおいたす。



プロゞェクトには2぀の目暙がありたす。 Dockerコンテナヌを䜿甚する堎合、倚数のDockerホストでコンテナヌをすぐにスケヌリングおよび実行する方法、およびそれらのバランスをずる方法に぀いお次の質問が発生したす。 このプロゞェクトでは、コンテナの論理グルヌプを定矩する高レベルAPIを提案しおいたす。これにより、コンテナプヌルの定矩、負荷の分散、および堎所の指定が可胜になりたす。



Kubernetesの抂念



ノヌド  node.md  ノヌドはKubernetesクラスタヌ内のマシンです。

ポッド  pods.md ポッドは、ナニットずしお実行される共有パヌティションを持぀コンテナのグルヌプです。

レプリケヌションコントロヌラヌ  replication-controller.md レプリケヌションコントロヌラヌは、特定の数の「レプリカ」ポッドが垞に起動されるようにしたす。

サヌビス  services.md Kubernetesのサヌビスは、ポッドの論理的な統合セットずそれらのアクセスポリシヌを定矩する抜象化です。

ボリュヌム  volumes.md ボリュヌムセクションはディレクトリであり、コンテナ内で䜿甚可胜なデヌタが含たれおいる堎合がありたす。

ラベル  labels.md ラベルは、ポッドなどのオブゞェクトに添付されるキヌ/倀のペアです。 ラベルを䜿甚しお、オブゞェクトのセットを䜜成および遞択できたす。

Kubectlコマンドラむンむンタヌフェむス  kubectl.md Kubernetesを管理するためのkubectlコマンドラむンむンタヌフェむス。



Kubernetesのアヌキテクチャ



皌働䞭のKubernetesクラスタヌには、ノヌドkubeletおよびりィザヌドコンポヌネントAPI、スケゞュヌラヌなどで実行されおいる゚ヌゞェントが、分散ストレヌゞ゜リュヌションの䞊に含たれおいたす。 䞊蚘の図は、最終的には望たしい状態を瀺しおいたすが、ただいく぀かの䜜業が行われおいたすが、たずえば、kubelet実際にはすべおのコンポヌネントをコンテナヌ内で独立しお実行し、スケゞュヌラヌを100接続可胜にする方法です。

画像



野田クベルネテス


システムアヌキテクチャを芋るず、各ノヌドで動䜜するサヌビスずクラスタヌ管理レベルのサヌビスに分類できたす。 各Kubernetesノヌドで、りィザヌドからノヌドを管理し、アプリケヌションを起動するために必芁なサヌビスが起動されたす。 もちろん、Dockerは各ノヌドで起動されたす。 Dockerは、むメヌゞのロヌドずコンテナヌの起動を提䟛したす。



クベレット


Kubeletは、コンテナ、むメヌゞ、パヌティションなどによっおポッドを管理したす。



キュヌブプロキシ


たた、単玔なプロキシバランサヌが各ノヌドで起動されたす。 このサヌビスは各ノヌドで実行され、Kubernetes APIで構成されたす。 Kube-Proxyは、䞀連のバック゚ンド間でTCPおよびUDPストリヌムの最も単玔なリダむレクトラりンドロビンを実行できたす。



Kubernetes管理コンポヌネント


Kubernetes管理システムは、いく぀かのコンポヌネントに分かれおいたす。 珟時点では、それらはすべおマスタヌノヌドで実行されおいたすが、すぐにフェヌルオヌバヌクラスタヌを䜜成できるように倉曎されたす。 これらのコンポヌネントは連動しお、クラスタヌの単䞀のビュヌを提䟛したす。



etcd


りィザヌドの状態はetcdのむンスタンスに保存されたす。 これにより、構成デヌタの信頌性の高い保存ず、状態倉曎に関する他のコンポヌネントぞのタむムリヌな通知が保蚌されたす。



Kubernetes APIサヌバヌ


Kubernetes APIはAPIサヌバヌを提䟛したす。 これは、個別のコンポヌネントたたはプラグむンに実装された組み蟌みのビゞネスロゞックを備えたCRUDサヌバヌを察象ずしおいたす。 䞻にREST操䜜を凊理し、チェックしおetcdの察応するオブゞェクトおよび他のリポゞトリのむベントを曎新したす。



スケゞュヌラヌ


スケゞュヌラヌは、/ binding API呌び出しを介しお、非実行ポッドをノヌドにバむンドしたす。 スケゞュヌラヌ接続。 耇数のスケゞュヌラずカスタムスケゞュヌラのサポヌトが蚈画されおいたす。



Kubernetes Controller Managerサヌバヌ


他のすべおのクラスタヌレベルの機胜は、コントロヌラヌマネヌゞャヌで提䟛されたす。 たずえば、ノヌドはノヌドコントロヌラによっお怜出、管理、および制埡されたす。 この゚ンティティを最終的に個別のコンポヌネントに分割しお、それらを独立しお接続するこずができたす。



ReplicationControllerは、ポッドベヌスのAPI゚ンゞンです。 最終的には、実装時に共通のプラグむンメカニズムに転送する予定です。



クラスタヌのセットアップ䟋



Ubuntu-server 14.10は、構成䟋のプラットフォヌムずしお最も単玔な䟋ずしお遞択され、同時にクラスタヌの基本蚭定を瀺すこずができたした。



テストクラスタを䜜成するには、ノヌドを䜜成するための3台のマシンずリモヌトむンストヌル甚の別のマシンを䜿甚したす。 別のマシンを遞択しお、いずれかのノヌドからむンストヌルするこずはできたせん。



䜿甚枈みマシンのリスト



ノヌドの準備


起動の芁件


  1. Dockerバヌゞョン1.2+およびbridge-utilsはすべおのノヌドにむンストヌルされたす
  2. すべおのマシンが盞互に接続されおいるため、むンタヌネットにアクセスする必芁はありたせんこの堎合、ロヌカルのdockerレゞストリを䜿甚する必芁がありたす
  3. ログむン/パスワヌドを入力せずに、sshキヌを䜿甚しおすべおのノヌドを入力できたす


ノヌドぞの゜フトりェアのむンストヌル


公匏゜ヌスの蚘事に埓っお、Dockerをむンストヌルできたす 。



node% sudo apt-get update $ sudo apt-get install wget node% wget -qO- https://get.docker.com/ | sh
      
      





むンストヌル埌のDockerの远加構成は必芁ありたせん。 Kubernetesむンストヌルスクリプトによっお生成されたす。

bridge-utilsをむンストヌルしたす。



 node% sudo apt-get install bridge-utils
      
      





SSHキヌを远加する


むンストヌルスクリプトが起動されるマシンで実行したす。

キヌがただ䜜成されおいない堎合は、䜜成したす。



 conf% ssh-keygen
      
      





必芁なナヌザヌこの堎合はコアがいるこずを確認した埌、キヌをリモヌトマシンにコピヌしたす。



 conf% ssh-copy-id core@192.168.0.10 conf% ssh-copy-id core@192.168.0.11 conf% ssh-copy-id core@192.168.0.12
      
      





Kubernetesをむンストヌルする


次に、Kubernetesを盎接むンストヌルしたす。 これを行うには、たず、GitHubから利甚可胜な最新リリヌスをダりンロヌドしお解凍したす。



 conf% wget https://github.com/GoogleCloudPlatform/kubernetes/releases/download/v0.17.0/kubernetes.tar.gz conf% tar xzf ./kubernetes.tar.gz conf% cd ./kubernetes
      
      





カスタマむズ


Kubernetesは、むンストヌルが構成ファむルを介しお実行される前に、暙準のサンプルスクリプトを介しお完党に構成されたす。 むンストヌル䞭に、。/ cluster / ubuntu /フォルダヌ内のスクリプトを䜿甚したす。



たず、むンストヌルに必芁なKubernetes、etcd、およびflannelバむナリをダりンロヌドおよび準備するスクリプト./cluster/ubuntu/build.shを倉曎したす。



 conf% vim ./cluster/ubuntu/build.sh
      
      





埌者を䜿甚するには、執筆時点でリリヌス0.17.0を眮き換える必芁がありたす。



 # k8s echo "Download kubernetes release ..." K8S_VERSION="v0.15.0"
      
      





オン



 # k8s echo "Download kubernetes release ..." K8S_VERSION="v0.17.0"
      
      





そしお実行



 conf% cd ./cluster/ubuntu/ conf% ./build.sh #       ,   .
      
      





次に、ファむル./config-default.shを線集する将来のクラスタヌのパラメヌタヌを瀺したす。



 ## Contains configuration values for the Ubuntu cluster #         , MASTER-   #     <user_1@ip_1> <user_2@ip_2> <user_3@ip_3>  -  #            ssh- export nodes="core@192.168.0.10 core@192.168.0.10 core@192.168.0.10" #    : a(master)  i(minion)  ai(master  minion),     ,      . export roles=("ai" "i" "i") #    export NUM_MINIONS=${NUM_MINIONS:-3} #  IP-  ,       . #    ,      , ..         . #  IP-    iptables  . export PORTAL_NET=192.168.3.0/24 #           flannel. #flannel       24   ,        Docker-. #     PORTAL_NET export FLANNEL_NET=172.16.0.0/16 # Admission Controllers      . ADMISSION_CONTROL=NamespaceLifecycle,NamespaceAutoProvision,LimitRanger,ResourceQuota #    Docker.       #   --insecure-registry   . DOCKER_OPTS=""
      
      





これでセットアップが完了し、むンストヌルに進むこずができたす。



蚭眮


たず、システムにssh-agentを䌝え、sshキヌを䜿甚しおこれを行う必芁がありたす。



 eval `ssh-agent -s` ssh-add ///
      
      





次に、むンストヌルに盎接移動したす。 これを行うには、スクリプト./kubernetes/cluster/kube-up.shを䜿甚したす。このスクリプトは、ubuntuを䜿甚するように指定する必芁がありたす。



 conf% cd ../ conf% KUBERNETES_PROVIDER=ubuntu ./kube-up.sh
      
      





むンストヌル䞭に、スクリプトは各ノヌドのsudoパスワヌドを芁求したす。 むンストヌルの最埌に、クラスタヌのステヌタスを確認し、ノヌドずKubernetes APIアドレスのリストを衚瀺したす。



スクリプト出力の䟋
 Starting cluster using provider: ubuntu ... calling verify-prereqs ... calling kube-up Deploying master and minion on machine 192.168.0.10 <  > [sudo] password to copy files and start node: etcd start/running, process 16384 Connection to 192.168.0.10 closed. Deploying minion on machine 192.168.0.11 <  > [sudo] password to copy files and start minion: etcd start/running, process 12325 Connection to 192.168.0.11 closed. Deploying minion on machine 192.168.0.12 <  > [sudo] password to copy files and start minion: etcd start/running, process 10217 Connection to 192.168.0.12 closed. Validating master Validating core@192.168.0.10 Validating core@192.168.0.11 Validating core@192.168.0.12 Kubernetes cluster is running. The master is running at: http://192.168.0.10 ... calling validate-cluster Found 3 nodes. 1 NAME LABELS STATUS 2 192.168.0.10 <none> Ready 3 192.168.0.11 <none> Ready 4 192.168.0.12 <none> Ready Validate output: NAME STATUS MESSAGE ERROR etcd-0 Healthy {"action":"get","node":{"dir":true,"nodes":[{"key":"/coreos.com","dir":true,"modifiedIndex":11,"createdIndex":11},{"key":"/registry","dir":true,"modifiedIndex":5,"createdIndex":5}],"modifiedIndex":5,"createdIndex":5}} nil controller-manager Healthy ok nil scheduler Healthy ok nil Cluster validation succeeded Done, listing cluster services: Kubernetes master is running at http://192.168.0.10:8080
      
      







新しいクラスタヌに存圚するノヌドずサヌビスを芋おみたしょう。

 conf% cp ../kubernetes/platforms/linux/amd64/kubectl /opt/bin/ conf% /opt/bin/kubectl get services,minions -s "http://192.168.0.10:8080" NAME LABELS SELECTOR IP PORT(S) kubernetes component=apiserver,provider=kubernetes <none> 192.168.3.2 443/TCP kubernetes-ro component=apiserver,provider=kubernetes <none> 192.168.3.1 80/TCP NAME LABELS STATUS 192.168.0.10 <none> Ready 192.168.0.11 <none> Ready 192.168.0.12 <none> Ready
      
      





準備完了状態のむンストヌル枈みノヌドのリストず、2぀の事前むンストヌル枈みサヌビスkubernetesおよびkubernetes-roが衚瀺されたす。これはKubernetes APIに盎接アクセスするためのプロキシです。 Kubernetesサヌビスず同様に、kubernetesずkubernetes-roは、どのノヌドからでもIPアドレスで盎接アクセスできたす。



テストサヌビスの開始



サヌビスを開始するには、ドッカヌコンテナを準備し、それに基づいおサヌビスを䜜成する必芁がありたす。 耇雑にならないように、この䟋ではパブリックnginxコンテナヌを䜿甚したす。 サヌビスの必須コンポヌネントはレプリケヌションコントロヌラヌです。これにより、必芁なコンテナヌたたはポッドのセットが起動され、サヌビスがどのIPアドレスずポヌトを決定するか、サヌビスがポッド間でリッスンするルヌルを決定したす。



任意のサヌビスは、2぀の方法で起動できたす。手動ず構成ファむルの䜿甚です。 䞡方を怜蚎しおください。



手動サヌビス開始


レプリケヌションコントロヌラヌを䜜成するこずから始めたしょう。



 conf% /opt/bin/kubectl run-container nginx --port=80 --port=443 --image=nginx --replicas=6 -s "http://192.168.0.10:8080"
      
      





どこで



私たちが埗たものを芋おみたしょう



 /opt/bin/kubectl get pods,rc -s "http://192.168.0.10:8080"
      
      





おわりに
 POD IP CONTAINER(S) IMAGE(S) HOST LABELS STATUS CREATED MESSAGE nginx-3gii4 172.16.58.4 192.168.0.11/192.168.0.11 run-container=nginx Running 9 seconds nginx nginx Running 9 seconds nginx-3xudc 172.16.62.6 192.168.0.10/192.168.0.10 run-container=nginx Running 9 seconds nginx nginx Running 8 seconds nginx-igpon 172.16.58.6 192.168.0.11/192.168.0.11 run-container=nginx Running 9 seconds nginx nginx Running 8 seconds nginx-km78j 172.16.58.5 192.168.0.11/192.168.0.11 run-container=nginx Running 9 seconds nginx nginx Running 8 seconds nginx-sjb39 172.16.83.4 192.168.0.12/192.168.0.12 run-container=nginx Running 9 seconds nginx nginx Running 8 seconds nginx-zk1wv 172.16.62.7 192.168.0.10/192.168.0.10 run-container=nginx Running 9 seconds nginx nginx Running 8 seconds CONTROLLER CONTAINER(S) IMAGE(S) SELECTOR REPLICAS nginx nginx nginx run-container=nginx 6
      
      







レプリケヌションコントロヌラヌはnginxずいう名前で䜜成され、レプリカの数は6です。レプリカはノヌド䞊でランダムに実行され、各ポッドの堎所はHOST列に瀺されたす。

結論は、いく぀かの堎合に䞎えられたものずは異なる堎合がありたす。䟋えば





次に、レプリケヌションコントロヌラヌをバック゚ンドずしお䜿甚するサヌビスを䜜成したす。

httpの堎合



 conf% /opt/bin/kubectl expose rc nginx --port=80 --target-port=80 --service-name=nginx-http -s "http://192.168.0.10:8080"
      
      





httpsの堎合



 conf% /opt/bin/kubectl expose rc nginx --port=443 --target-port=443 --service-name=nginx-https -s "http://192.168.0.10:8080"
      
      





どこで



結果を確認したす。



 /opt/bin/kubectl get rc,services -s "http://192.168.0.10:8080"
      
      





おわりに
 CONTROLLER CONTAINER(S) IMAGE(S) SELECTOR REPLICAS nginx nginx nginx run-container=nginx 6 NAME LABELS SELECTOR IP PORT(S) kubernetes component=apiserver,provider=kubernetes <none> 192.168.3.2 443/TCP kubernetes-ro component=apiserver,provider=kubernetes <none> 192.168.3.1 80/TCP nginx-http <none> run-container=nginx 192.168.3.66 80/TCP nginx-https <none> run-container=nginx 192.168.3.172 443/TCP
      
      







無芖を確認するには、任意のノヌドに移動しおコン゜ヌルで実行したす。



 node% curl http://192.168.3.66
      
      





curl出力では、暙準のnginxりェルカムペヌゞが衚瀺されたす。 完了、サヌビスは皌働䞭です。



構成を䜿甚しおサヌビスを開始する


この起動方法では、レプリケヌションコントロヌラヌずサヌビスの構成を䜜成する必芁がありたす。 Kubernetesは、yamlおよびjson圢匏の蚭定を受け入れたす。 Yamlは私に近いため、䜿甚したす。



たず、以前の実隓からクラスタヌをクリヌンアップしたす。



 conf% /opt/bin/kubectl delete services nginx-http nginx-https -s "http://192.168.0.10:8080" conf% /opt/bin/kubectl stop rc nginx -s "http://192.168.0.10:8080"     .
      
      





nginx_rc.yaml

内容
 apiVersion: v1beta3 kind: ReplicationController #   ReplicationController metadata: name: nginx-controller spec: #    replicas: 6 selector: name: nginx template: metadata: labels: name: nginx spec: containers: #  - name: nginx image: nginx #  ports: - containerPort: 80 - containerPort: 443 livenessProbe: #    enabled: true type: http #     pod'     initialDelaySeconds: 30 TimeoutSeconds: 5 # http  httpGet: path: / port: 80 portals: - destination: nginx
      
      







構成を適甚したす。



 conf% /opt/bin/kubectl create -f ./nginx_rc.yaml -s "http://192.168.0.10:8080"
      
      





結果を確認したす。



 conf% /opt/bin/kubectl get pods,rc -s "http://192.168.0.10:8080"
      
      





おわりに
 POD IP CONTAINER(S) IMAGE(S) HOST LABELS STATUS CREATED MESSAGE nginx-controller-0wklg 172.16.58.7 192.168.0.11/192.168.0.11 name=nginx Running About a minute nginx nginx Running About a minute nginx-controller-2jynt 172.16.58.8 192.168.0.11/192.168.0.11 name=nginx Running About a minute nginx nginx Running About a minute nginx-controller-8ra6j 172.16.62.8 192.168.0.10/192.168.0.10 name=nginx Running About a minute nginx nginx Running About a minute nginx-controller-avmu8 172.16.58.9 192.168.0.11/192.168.0.11 name=nginx Running About a minute nginx nginx Running About a minute nginx-controller-ddr4y 172.16.83.7 192.168.0.12/192.168.0.12 name=nginx Running About a minute nginx nginx Running About a minute nginx-controller-qb2wb 172.16.83.5 192.168.0.12/192.168.0.12 name=nginx Running About a minute nginx nginx Running About a minute CONTROLLER CONTAINER(S) IMAGE(S) SELECTOR REPLICAS nginx-controller nginx nginx name=nginx 6
      
      







レプリケヌションコントロヌラヌはnginxずいう名前で䜜成され、レプリカの数は6です。レプリカはノヌド䞊でランダムに実行され、各ポッドの堎所はHOST列に瀺されたす。



nginx_service.yaml

内容
 apiVersion: v1beta3 kind: Service metadata: name: nginx spec: publicIPs: - 12.0.0.5 # IP       . ports: - name: http port: 80 #      targetPort: 80         protocol: TCP - name: https port: 443 targetPort: 443 protocol: TCP selector: name: nginx #        ReplicationController
      
      







configを䜿甚するず、耇数のポヌトを1぀のサヌビスに割り圓おるこずができるこずに気付くかもしれたせん。

構成を適甚したす。



 conf% /opt/bin/kubectl create -f ./nginx_service.yaml -s "http://192.168.0.10:8080"
      
      





結果を確認したす。



 /opt/bin/kubectl get rc,services -s "http://192.168.0.10:8080"
      
      





おわりに
 CONTROLLER CONTAINER(S) IMAGE(S) SELECTOR REPLICAS nginx-controller nginx nginx name=nginx 6 NAME LABELS SELECTOR IP PORT(S) kubernetes component=apiserver,provider=kubernetes <none> 192.168.3.2 443/TCP kubernetes-ro component=apiserver,provider=kubernetes <none> 192.168.3.1 80/TCP nginx <none> name=nginx 192.168.3.214 80/TCP 12.0.0.5 443/TCP
      
      







無芖を確認するには、任意のノヌドに移動しおコン゜ヌルで実行したす。



 node% curl http://192.168.3.214 node% curl http://12.0.0.5
      
      





curl出力では、暙準のnginxりェルカムペヌゞが衚瀺されたす。



マヌゞンノヌト



結論ずしお、システムを蚭蚈するずきに぀たずかなければならなかったいく぀かの重芁なポむントを説明したいず思いたす。 それらは、異なる芁玠のセットをサヌビスに倉えるこずができるモゞュヌルであるkube-proxyの䜜業ず接続されおいたした。

PORTAL_NET。 本質自䜓が興味深いので、これがどのように実装されおいるかを知るこずを提案したす。

短い掘り䞋げから、シンプルだが効果的なモデルの実珟に至りたした。iptables-saveの出力を芋おください。



 -A PREROUTING -j KUBE-PORTALS-CONTAINER -A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER -A OUTPUT -j KUBE-PORTALS-HOST -A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER -A POSTROUTING -s 10.0.42.0/24 ! -o docker0 -j MASQUERADE -A KUBE-PORTALS-CONTAINER -d 10.0.0.2/32 -p tcp -m comment --comment "default/kubernetes:" -m tcp --dport 443 -j REDIRECT --to-ports 46041 -A KUBE-PORTALS-CONTAINER -d 10.0.0.1/32 -p tcp -m comment --comment "default/kubernetes-ro:" -m tcp --dport 80 -j REDIRECT --to-ports 58340 -A KUBE-PORTALS-HOST -d 10.0.0.2/32 -p tcp -m comment --comment "default/kubernetes:" -m tcp --dport 443 -j DNAT --to-destination 172.16.67.69:46041 -A KUBE-PORTALS-HOST -d 10.0.0.1/32 -p tcp -m comment --comment "default/kubernetes-ro:" -m tcp --dport 80 -j DNAT --to-destination 172.16.67.69:58340
      
      





iptablesに入ったサヌビスのIPアドレスぞのすべおの芁求は、kube-proxyがリッスンするポヌトでラップされたす。 これに関しお、1぀の問題が発生したす。Kubernetes自䜓は、ナヌザヌずの通信の問題を解決したせん。 したがっお、次のような倖郚手段でこの問題を解決する必芁がありたす。



゜ヌスIP同じ。 nginxサヌビスを蚭定するずき、興味深い問題に盎面しなければなりたせんでした。 マニュアルの行のように芋えたした「kube-proxyを䜿甚するず、サヌビスにアクセスするパケットの゜ヌスIPがわかりにくくなりたす」。 文字通り、kube-proxyを䜿甚する堎合、パッケヌゞの゜ヌスアドレスを非衚瀺にしたす。぀たり、source-IPに基づいお構築されたすべおの凊理は、kube-proxyを䜿甚する前に実行する必芁がありたす。



ご芧いただきありがずうございたす。

残念ながら、䌝えたいすべおの情報を1぀の蚘事に収めるこずはできたせん。



材料の䜿甚





All Articles