どのように[復刻版]通信サービスのK8S

どのように通信サービスのK8S

HTTPS:// www.jianshu.com/p/9fae09876eb7

 

この記事では、データベース・バックエンドサービスへのアクセス、異なるタイプのサービス間の相互訪問などのサービスの相互K8Sにアクセスする方法について説明します。そして、このようなアクセスを実現するためのリソースとサービスを記述するservice

ポッド本体の前にサービスに立ちます

我々は今、それは彼らがお互いを訪問任せることはできないという、ポッドを持っていますか?答えはノー、ポッドは、ライフサイクルであるので、彼はいつでも作成することができる任意の時点で破壊されなくてもよいし、各新しいポッドは、ランダムなIPアドレスに割り当てられます、そしてK8Sは自動的にポッドの数を調整します。ポッドとの間に直接アクセスするには、このリードは、入り口がある場合は、非現実的であることがより簡単に、まだ多くのことをアクセスしないように、同じサービスを提供し、固定ポート上でそれを開くことができ、それらのポッドを動的バインディング?これは、入口をK8Sと呼ばれますservice

 
サービスの前のポッドに立ちます

service(略称svc)は、共通リソースのK8Sあります。それは、configureに非常に簡単で、そして今、私たちは独自に作成する必要がありますsvcまず第一に、svc彼はサービスを提供するために、かなりのアプリケーションを持っている必要があります後ろに(自分自身にサービスを提供されていないとは限らないpod、それは後述します)。だから我々は、最初に通ってくるしているrsポッドを作成します。あなたがいる場合にはrs非常に理解していない、を参照してください  ライブ長いアプリケーションを作成する方法- RCとRS  。

まず、新規作成しkubia-replicaset.yamlたファイルを、そして以下に記入:

apiVersion: apps/v1beta2
kind: ReplicaSet
metadata:
  name: kubia spec: replicas: 3 selector: matchLabels: app: kubia template: metadata: labels: app: kubia spec: containers: - name: kubia image: luksa/kubia ports: - containerPort: 8080 

このファイルには、各ポッドが含まれ、3つのポッドを作成しapp: kubiaたラベル、およびオープンサービス配信8080ポートを。それを作成するには、次のコマンドを実行します。

kubectl create -f kubia-replicaset.yaml

そして、kubectl get poあなたはその後、私たちが作成し、3つのポッドの作成を見ることができsvc、これらの3つのポッドのアクセスを提供するために。新しいkubia-svc.yamlファイル、および以下に入力します。

apiVersion: v1
kind: Service
metadata:
  name: kubia
spec:
  ports:
  - name: http # 请为所有端口指定名称
    port: 80 # 对外开放的服务端口
    targetPort: 8080 # 后方 pod 的服务端口
  selector:
    app: kubia

あなたが基本的な見ることができますsvcちょうど2つのポートとセレクタを定義し、設定は非常に簡単です、我々はセレクタで指摘しているapp: kubia手段が、これは聞かせて、svcすべてのキャリーに行くapp: kubia彼らの後ろにポッドのラベルを。実際には、ports.nameフィールドが必須ではありませんが、メンテナンスの便宜のために、各ポートの名前を指定してください。その後、我々はこれを作成するには、次のコマンドを使用しますsvc

kubectl create -f 

外観を作成した後、実行しkubectl get svc kubia、我々は彼のポストを見ることができます:

NAME    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S) AGE kubia ClusterIP 10.98.237.175 <none> 80/TCP 127m 

あなたはできるCLUSTER-IP、この列現在のIPアドレスを参照してください。言い換えれば、あなたは、IPによってそのポッドに他のポッド背面にアクセスすることができます。次は、このサービスにアクセスするには、次のポッドを使用して気軽に。実行kubectl get poアイポッドに喜ばを選択します。そして、次のコマンドへのアクセスを使用しsvcポッドの名前とSVCのIPアドレスを変更するために注意を払うを

kubectl exec kubia-7rt2n -- curl -s 10.98.237.175 

ここで、このコマンドは、--一部が属する前のセパレータは、でありkubectl、そして実行されるコマンドの後に、ポッド内に属します。

次に、あなたが見ることができるからsvc後部ポッドの応答:

root@master1:~# kubectl exec kubia-7rt2n -- curl -s 10.98.237.175 
You've hit kubia-pxfw7
root@master1:~# kubectl exec kubia-7rt2n -- curl -s 10.98.237.175 
You've hit kubia-7rt2n
root@master1:~# kubectl exec kubia-7rt2n -- curl -s 10.98.237.175 
You've hit kubia-7rt2n
root@master1:~# kubectl exec kubia-7rt2n -- curl -s 10.98.237.175 
You've hit kubia-fxqcc

私たちは見ることができます、svcだけでなく、負荷分散を実現するために、各ポッド上の合理的な要求に等しい株式インチ

動的なサービスのポッドの結合

ので、svcIPアドレスのためのポッドを変更するように我々の事前定義されたタグセレクタを介してポッドを見つけるために、svc実際には、効果なし、svcpodも含むとの間にリソースが呼び出されendpointendpoint(のために短いep)アドレスとポートのセットであります限りとして、次に示すコレクション、svcラベルセレクタ、その後、彼は自動的に同名作成されep、管理するための独自のをマークするために、ポッドを。

 
SVC、EP、ポッドとの関係

私たちはただ、次のコマンドを使用して作成している見ることができるkubiaサービスep

root@master1:~# kubectl describe svc kubia
Name:              kubia
Namespace: default Labels: <none> Annotations: <none> Selector: app=kubia Type: ClusterIP IP: 10.98.237.175 Port: <unset> 80/TCP TargetPort: 8080/TCP Endpoints: 10.244.1.18:8080,10.244.2.14:8080,10.244.3.14:8080 Session Affinity: None Events: <none> 

次に、あなたができるEndpoints3と、列に含まれる彼のアドレスとポート番号を見つける,別のアドレスが3のポッドのアドレスです。あなたは使用することができますkubectl get pod -o wideポッドアドレスを表示します。あなたは、すべての再構築するには、次のコマンドを実行することができますkubia バックチェックし、ポッドをepあなたはそれを見つけるでしょう、ENDPOINTS自動的に3つのポッドの値に変更されます。

kubectl delete po -l app=kubia
root@master1:~# kubectl get endpoints kubia
NAME ENDPOINTS AGE kubia 10.244.1.18:8080,10.244.2.14:8080,10.244.3.14:8080 169m 

ディスカバリサービス

あなたは私たちが使用し、上記のテストでは、発見したことcurl http://x.x.x.xにアクセスする方法をsvcそうすれば、svc私たちが訪問していないではないことを、再構築リードIPアドレスが変更されましたか?また、この考えK8Sが、によって提供されるFQDNサービスにアクセスするために(完全修飾ドメイン名)の方法、あなたはサービスにアクセスするために、ポッドのいずれかに直接サービスの名前を使用することができます。

root@master1:~# k exec kubia-5n2m2 -- curl -s http://kubia
You've hit kubia-bv2k8 

あなたが同じ名前空間サービスにアクセスすることができますこの方法は、他の名前空間サービスへのアクセスをサポートしてもK8S。しかし、多くのドメイン名長いです。自分自身を知らせることができます興味を持っています。

如果你发现你访问不到服务的话请使用kubectl delete po -l app=kubia重建 pod。因为 k8s 只会在创建时间晚于服务的 pod 中注入服务域名。你可以在容器中查看/etc/resolv.conf文件来找到对应的解析。

顺带一提,这个功能是 k8s 的 dns 服务器coredns实现的,你可以在命名空间kube-system中找到它,让我们为它鼓掌!

访问集群外部的服务

现在问题又来了,对于一个集群内部的 pod 来说,如果他想访问一个集群外部的服务该怎么办呢?例如一个网站的公共 api,或者是一个云数据库。我们就没办法使用svc+标签选择器的方式来获取这些服务了,因为标签选择器只能监测集群内部的 pod 。而无法放眼外部。那么我们应该怎么做呢?

还记得我们之前介绍过的endpoint资源么,没错。我们可以 自定义一个endpoint资源,用它指定外部服务的 ip 及端口,然后绑定到一个svc上,这样内部的 pod 不就通过完全一样的方式访问外部服务了么?

 
使用ep手动指定外部资源

你可以把这张图拿去和"service 对 pod 的动态绑定"小节中的图做对比,你会发现最根本的service > endpoint > 服务提供者的传递流程是没有变的。ok,现在我们来动手操作一下,首先新建一个什么都不会做的呆萌svc,它只告诉别人自己有一个端口80可以提供访问:

external-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: external-service spec: ports: - port: 80 

然后通过kubectl create -f external-service.yaml创建它。然后查看一下他的信息:

root@master1: ~# kubectl describe svc external-service
Name: external-service Namespace: default Labels: <none> Annotations: <none> Selector: <none> Type: ClusterIP IP: 10.103.101.18 Port: <unset> 80/TCP TargetPort: 80/TCP Endpoints: <none> Session Affinity: None Events: <none> 

因为没有标签选择器,所以它不会自己去创建endpoint,现在我们来手动为它创建一个endpoint,只要是和svc同名,那么他们两个就会自动绑定在一起:

external-endpoint.yaml

apiVersion: v1
kind: Endpoints
metadata: # 和 svc 相同的名称 name: external-service subsets: - addresses: # 这里指定了外部服务的 ip - ip: 11.11.11.11 # 可以指定多个 - ip: 22.22.22.22 # 还要指定端口号 ports: - port: 80 

然后使用命令kubectl create -f external-endpoint.yaml创建endpoint,之后再查看svc的详情,你会发现他们已经完成了绑定。

root@master1:~/k8s-yaml# kubectl describe svc external-service Name: external-service Namespace: default Labels: <none> Annotations: <none> Selector: <none> Type: ClusterIP IP: 10.103.101.18 Port: <unset> 80/TCP TargetPort: 80/TCP # 看这里! Endpoints: 11.11.11.11:80,22.22.22.22:80 Session Affinity: None Events: <none> 

其实还有个更简单的方法,可以 通过在svc里的配置项中指定spec.typeExternalName,然后在使用spec.externalName字段来指定外部服务的完全限定域名,如下:

apiVersion: v1
kind: Service
metadata: name: external-service spec: # 要先指定 svc 的类型 type: ExternalName # 再在这里指定外部服务的完全限定域名 externalName: someapi.some.company.com ports: - port: 80 

这样就可以免于新建一个endpoint来直接实现对外部服务的访问。而且使用方式也完全没有变化。

总结

本篇文章讲解了 k8s 中服务的访问入口资源service以及请求的”终点“endpoint。任何可以提供实际请求处理能力的pod最终都要封装成统一的service才能对外提供服务。而service中的标签选择器则可以一直监测pod的状态,从而实现无论是pod增加还是减少对外部请求者来说都是无感知的。

おすすめ

転載: www.cnblogs.com/jinanxiaolaohu/p/12044469.html