Kubernetesの公式チュートリアルをやってみる その5

尝试完成Kubernetes官方教程的第四部分,重点涉及节点和Pod的概念。
本文的教程将讨论有关Service的内容。

注意 && disclaimer

翻訳・意訳が主目的ではないのでいろいろ端折ったりすることがあります。
明らかな間違いはしないつもりですが、何かあれば優しくツッコんであげてください。

→ 在这里可以找到对 Kubernetes 官方教程 Part 1 的总结。

本記事の取り扱う範囲

使用一个服务来展示您的应用的内容。

Using a Service to Expose Your App

发布与Service相关的容器化应用程序

Service

Service とは、Pod の論理セットとそのアクセス方法を定義した抽象領域を指す。

Pod のレプリカがいくつあっても外部からは1つのエンドポイントとしてアクセスさせることができる。
Pod が停止したり入れ替える際もフロント側を無停止で制御することができる。
Pod のIP自体はグローバルに公開されないため、外部からのアクセス手段を提供する。

Service は selector でラベルを指定することで、トラフィックを転送する先の Pod を識別する。

ラベルは Pod に key-value ペアで定義する。
以下のようなユースケースがある。

環境ラベル、development, test, production など
バージョンタグで公開バージョンを指定する
ロール毎にタグを分ける

Service はいくつかの公開種別(type)がある。

ClusterIP

スペックに type を指定しない場合の既定値。
クラスタ内の内部IPを用いて公開する。

クラスタ外部からはアクセスできない。

NodePort

NAT経由で Node のポートを直接公開する。

[ノードIP]:[ポート] の指定で外部から直接アクセスできるようになる。

LoadBalancer

外部にロードバランサーを構築し、ロードバランサーと Pod のセットを紐付ける。
クラウドなどサポートされている環境でのみ使用可能。

ExternalName

外部のDNSで定義された CNAME レコードを用いて公開する。

kube-dns のv1.7以上で利用可能。

Service は selector を指定しないで構築することもできる。

Service を特定のエンドポイントに紐付ける際に使用する。

type = ExternalName の際に使用することができる。

kubectl run で Deployment を構築する際に –expose を付与することで同時に Service を作成することもできる。

互动教程

预计时间:10分钟

kubectl get service

Service をリストするコマンド。

このチュートリアルでは初期から Service が1つ作成されている。

$ kubectl get service
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   12s

kubectl expose [deployment name]

Service を作成するコマンド。
以下の例では NodePort の8080ポートでサービスを公開している。1

デフォルトでは deployment と同じ名称でサービスができるらしい。

$ kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080
service/kubernetes-bootcamp exposed
$ kubectl get service
NAME                  TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
kubernetes            ClusterIP   10.96.0.1       <none>        443/TCP          4m
kubernetes-bootcamp   NodePort    10.109.31.123   <none>        8080:31022/TCP   2m

kubectl describe service [service name]

Service の詳細内容を表示する。2

$ kubectl describe service kubernetes-bootcamp
Name:                     kubernetes-bootcamp
Namespace:                default
Labels:                   run=kubernetes-bootcamp
Annotations:              <none>
Selector:                 run=kubernetes-bootcamp
Type:                     NodePort
IP:                       10.109.31.123
Port:                     <unset>  8080/TCP
TargetPort:               8080/TCP
NodePort:                 <unset>  31022/TCP
Endpoints:                172.18.0.2:8080
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>
    • curlで確認

クラスタ内でクラスタIPとノードポートを指定すると Service 経由でアプリへアクセスできる。

$ export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')
$ echo NODE_PORT=$NODE_PORT
NODE_PORT=31022
$ curl $(minikube ip):$NODE_PORT
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5c69669756-9bk6s | v=1
    • ラベル管理

Pod や Service は管理元の deployment 名で run = [deployment name] のラベルが付与される。
既存のリソースに対して追加でラベルを付与することもできる。

既存のラベルを削除する場合は kubectl label [type] name [key]- とラベルキーにハイフンを付与する。

$ kubectl describe deployment | head -4
Name:                   kubernetes-bootcamp
Namespace:              default
CreationTimestamp:      Thu, 27 Sep 2018 15:23:36 +0000
Labels:                 run=kubernetes-bootcamp
# ラベル指定でPodをリストする
$ kubectl get pods -l run=kubernetes-bootcamp
NAME                                   READY     STATUS    RESTARTS   AGE
kubernetes-bootcamp-5c69669756-9bk6s   1/1       Running   0          20m
# ラベル指定でServiceをリストする
$ kubectl get services -l run=kubernetes-bootcamp
NAME                  TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
kubernetes-bootcamp   NodePort   10.109.31.123   <none>        8080:31022/TCP   19m
# 新規ラベルを付与
$ kubectl get pod $POD_NAME -o yaml | grep -i label -A3
  labels:
    pod-template-hash: "1725225312"
    run: kubernetes-bootcamp
  name: kubernetes-bootcamp-5c69669756-9bk6s
$ kubectl label pod $POD_NAME app=v1
pod/kubernetes-bootcamp-5c69669756-9bk6s labeled
$ kubectl get pod $POD_NAME -o yaml | grep -i label -A3
  labels:
    app: v1
    pod-template-hash: "1725225312"
    run: kubernetes-bootcamp

kubectl delete service [ラベルセレクタ]

ラベルを指定して Service を削除する。

Service を削除してもバックエンドの Pod は削除されない。

$ kubectl delete service -l run=kubernetes-bootcamp
service "kubernetes-bootcamp" deleted
# ノードポートはアクセスできなくなる。
$ curl $(minikube ip):$NODE_PORT
curl: (7) Failed to connect to 172.17.0.55 port 31022: Connection refused
# Pod内ではアプリは稼働している。
$ kubectl exec -ti $POD_NAME curl localhost:8080
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5c69669756-9bk6s | v=1

以下是参考链接

    • Kubernetes公式

 

    Kubernetes公式チュートリアル

在minikube中,由于不支持LoadBalancer,因此无法将服务暴露给外部进行测试。

在教程中,kubectl describe services/[service name] 等价于其他命令均可以使用。

广告
将在 10 秒后关闭
bannerAds