web-dev-qa-db-ja.com

Kubernetes、k8sサービスURLの作成方法は?

K8sを学習しています。私の質問は、minikubeコマンド「minikubeget service xxx --url」のように、k8sにサービスURLを取得させる方法です。私が尋ねる理由は、ポッドがダウンしてアップ/作成/開始されたときに、サービスのURLにアクセスしてURLを変更する必要がないためです。ポッドをNodePortとしてデプロイしている間、ホストIPとポートを使用してポッドにアクセスできましたが、ポッドを再開始/再作成すると、ポートが変更されます。

私のケースを以下に示します。

one master(172.16.100.91) and 
one node(hostname node3, 172.16.100.96) 

以下のようにポッドとサービスを作成し、helllocommをNodePortとしてデプロイし、helloextをClusterIPとしてデプロイします。 hellocommとhelloextは、どちらもSpring Boot helloworldアプリケーションです。

docker build -t jshenmaster2/hellocomm:0.0.2 .
kubectl run hellocomm --image=jshenmaster2/hellocomm:0.0.2 --port=8080
kubectl expose deployment hellocomm --type NodePort

docker build -t jshenmaster2/helloext:0.0.1 .
kubectl run helloext --image=jshenmaster2/helloext:0.0.1 --port=8080
kubectl expose deployment helloext --type ClusterIP


[root@master2 Shell]# kubectl get service -o wide
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE       SELECTOR
hellocomm    NodePort    10.108.175.143   <none>        8080:31666/TCP   8s        run=hellocomm
helloext     ClusterIP   10.102.5.44      <none>        8080/TCP         2m        run=helloext

[root@master2 hello]# kubectl get pods -o wide
NAME                         READY     STATUS    RESTARTS   AGE       IP              NODE
hellocomm-54584f59c5-7nxp4   1/1       Running   0          18m       192.168.136.2   node3
helloext-c455859cc-5zz4s     1/1       Running   0          21m       192.168.136.1   node3

上記では、ポッドはnode3(172.16.100.96)にデ​​プロイされているため、172.16.100.96:31666/helloでhellocommにアクセスできます。このシナリオでは、node3がダウンすると、新しいポッドが作成/開始されることが簡単にわかります。 、ポートも変更されます。クライアントが接続を失ったように。私はこの解決策を望んでいません。

私の現在の質問は、helloextがClusteriPとしてデプロイされており、上記のようなサービスでもあるということです。これは、ClusterIP 10.102.5.44とポート8080がサービスURLになることを意味します http://10.102.5.44:8080/hello

Yamlファイルでサービスを再度作成する必要がありますか?コマンドによって作成されたサービスとyamlファイルによって作成されたサービスの違いは何ですか? yamlでサービスを作成する必要がある場合、次のyamlファイルを書き込む方法は?

以下は、入力する必要のあるyaml定義テンプレートです。入力方法は?

apiVersion: v1
kind: Service
matadata:
  name: string         helloext      
  namespace: string    default
  labels:              
    - name: string     helloext
  annotations:
    - name: string     hello world   
spec:
  selector: []            ?
  type: string            ?
  clusterIP: string       anything I could give?  
  sessionAffinity: string  ? (yes or no) 
  ports:
  - name: string          helloext  
    protocol: string      tcp  
    port: int             8081? (port used by Host machine)
    targetPort: int       8080? (spring boot uses 8080)
    nodePort: int         ? 
  status:                 since I am not using loadBalancer in deploymennt, I could forget this.  
    loadBalancer:
      ingress:
        ip: string
        hostname: string
4
user84592

NodePortは、その名前が示すように、サービスにアクセスできるように、ノード上で直接(実際にはクラスター内のすべてのノード上で)ポートを開きます。デフォルトではランダムです。そのため、ポッドが停止すると、新しいポッドが生成されます。ただし、ポートを指定することもでき(3番目の段落 ここ )-ポッドが再作成された後でも同じポートでアクセスできます。

ClusterIPはプライベートIPであるため、クラスター内でのみアクセスできます。つまり、デフォルトのシナリオでは、クラスター内の別のコンテナー/ノードからこのサービスにアクセスできます。実行中のコンテナ/ノードにexec/sshを入れて、試してみることができます。

Yamlファイルは、バージョン管理、文書化、テンプレート化( Helm )などが可能です。

各フィールドの詳細については、 https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.10/#servicespec-v1-core を確認してください。

[〜#〜]編集[〜#〜]:サービスの詳細情報はこちら: https://medium.com/google -cloud/kubernetes-nodeport-vs-loadbalancer-vs-ingress-when-should-i-use-what-922f010849e

3
Amrit Bera

入力を作成し、それをサービスにポイントして、クラスターの外部でアクセスするのはどうですか?

1
Nathan Ogden