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