どのように通信サービスの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
だけでなく、負荷分散を実現するために、各ポッド上の合理的な要求に等しい株式インチ
動的なサービスのポッドの結合
ので、svc
IPアドレスのためのポッドを変更するように我々の事前定義されたタグセレクタを介してポッドを見つけるために、svc
実際には、効果なし、svc
とpod
も含むとの間にリソースが呼び出されendpoint
、 endpoint
(のために短い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>
次に、あなたができるEndpoints
3と、列に含まれる彼のアドレスとポート番号を見つける,
別のアドレスが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 不就通过完全一样的方式访问外部服务了么?
你可以把这张图拿去和"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.type
为ExternalName
,然后在使用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
增加还是减少对外部请求者来说都是无感知的。