だいごろうのブログ

熊本出身で大阪、東京、パリを転勤して、今は福岡でデータエンジニアです

[MEMO] katacodaでLearn Kubernetes ver2 Service / Networking

Deploy Containers Using YAML

memo

apiVersion: extensions/v1beta1
kind: Deployment
kind: Service
spec:
  type: NodePort
kubectl create -f {file}
kubectl apply -f {file}

Service

  • kubernetes内部でお互いのpodsにselectorを使って、ポートを割り当てることができる。selectorを使わずに、Endpointsを使って、外部に対するアクセスを割り当てることができる。基本的には、kubenetesのpods通しでのアクセスをサポートするために使われる。

https://kubernetes.io/docs/concepts/services-networking/service/#services-without-selectors

Type

読んだことメモ。

  • ClusterIP: クラスター内でアクセスできるIPを作る。デフォルト
  • NodePort: StaticPortを割り当てる。外部からもそのNodeのIPとPortを指定すればアクセスできる。 :.
  • LoadBalancer: クラウドプロバイダーのLBを使って外部に公開できる。(?)NodePortとClusterIPが自動で作られる
  • ExternalName: サービスを外部のドメインに紐付ける。

https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types

Networking Introduction

f:id:daigorowhite:20190711081933p:plain

  • Cluster IP

ClusterIPは内部のPodに対して、内部からのアクセスをロードバランスするIP、ポートを用意すること

portだけをしているすると、podのポートとserviceのポート両方が同じポートになる。 targetPortを指定すると、podのポートはtargetPortが利用される。

 spec:
  ports:
  - port: 8080
    targetPort: 80
  • NodePort

ClusterIPとTargetPortは内部からのアクセスに対応した手法である。NodePortは外部からのアクセスを可能にするStaticIPを用意する。すべてのノードのPortを専有するかも?要検証。

spec:
  type: NodePort
  ports:
  - port: 80
    nodePort: 30080

同じポートを指定するNodePortを作ろうとしたが、エラー出たのでたぶん、全Nodeであってる。

master $ cat nodeport2.yaml  | grep nodePort -A2 -B2
  ports:
  - port: 80
    nodePort: 30080
  selector:
    app: webapp2-nodeport
master $ cat nodeport.yaml  | grep nodePort -A2 -B2
  ports:
  - port: 80
    nodePort: 30080
  selector:
    app: webapp1-nodeport
master $ kubectl create -f nodeport2.yaml
Error from server (Invalid): error when creating "nodeport2.yaml": Service "webapp2-nodeport-svc" is invalid: spec.ports[0].nodePort: Invalid value: 30080: provided port is already allocated
Error from server (AlreadyExists): error when creating "nodeport2.yaml": deployments.extensions "webapp2-nodeport-deployment" already exists
  • External IPs

指定のIPのポートを外部公開し、内部のPodにアクセスする。

spec:
  ports:
  - port: 80
  externalIPs:
  - {NODE_IP}
  • Load Balancer

GCPやAzure、AWSなどで外部のロードバランサーを通してLBSする機能。それがない場合でも、quay.io/munnerz/keepalived-cloud-provider:0.0.1このimageを使うことで、cloudproviderを内部に作成できるみたい。 https://github.com/munnerz/keepalived-cloud-provider

spec:
  type: LoadBalancer
  ports:
  - port: 80