Kubernetes,k8s如何制作服务url?
Kubernetes,k8s how to make service url?
我正在学习k8s。我的问题是如何让 k8s 像 minikube 命令 "minikube get service xxx --url" 一样得到服务 url 呢?
为什么我问是因为当 pod 关闭并再次 up/created/initiated 时,不需要通过访问服务 url 来更改 url。尽管
我将 pod 部署为 NodePort,我可以使用主机 IP 和端口访问 pod,但如果它再次为 reinitiated/created,则端口会更改。
我的情况如下图所示:我有
one master(172.16.100.91) and
one node(hostname node3, 172.16.100.96)
我如下创建 pod 和服务,hellocomm 部署为 NodePort,helloext 部署为 ClusterIP。 hellocomm 和 helloext 都是
spring 启动 hello world 应用程序。
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
上面我的pod部署在node3(172.16.100.96),所以可以通过172.16.100.96:31666/hello访问hellocomm,
在这种情况下,可以很容易地看到当 node3 关闭时,一个新的 pod 是 created/initiated,端口也发生了变化。
这样我的客户就失去了联系。我不想要这个解决方案。
我目前的问题是,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,顾名思义,直接在节点上(实际上是在集群中的所有节点上)打开一个端口,以便您可以访问您的服务。默认情况下它是随机的——这就是为什么当一个 pod 死亡时,它会为你生成一个新的。但是,您也可以指定一个端口(第 3 段 here)- 即使在重新创建 pod 后,您也可以访问同一端口。
clusterIP 只能在集群内部访问,因为它是私有 IP。这意味着,在默认情况下,您可以从集群内的另一个容器/节点访问此服务。您可以 exec
/ ssh
进入任何 运行 container/node 并尝试一下。
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-922f010849e0
我正在学习k8s。我的问题是如何让 k8s 像 minikube 命令 "minikube get service xxx --url" 一样得到服务 url 呢? 为什么我问是因为当 pod 关闭并再次 up/created/initiated 时,不需要通过访问服务 url 来更改 url。尽管 我将 pod 部署为 NodePort,我可以使用主机 IP 和端口访问 pod,但如果它再次为 reinitiated/created,则端口会更改。
我的情况如下图所示:我有
one master(172.16.100.91) and
one node(hostname node3, 172.16.100.96)
我如下创建 pod 和服务,hellocomm 部署为 NodePort,helloext 部署为 ClusterIP。 hellocomm 和 helloext 都是 spring 启动 hello world 应用程序。
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
上面我的pod部署在node3(172.16.100.96),所以可以通过172.16.100.96:31666/hello访问hellocomm, 在这种情况下,可以很容易地看到当 node3 关闭时,一个新的 pod 是 created/initiated,端口也发生了变化。 这样我的客户就失去了联系。我不想要这个解决方案。
我目前的问题是,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,顾名思义,直接在节点上(实际上是在集群中的所有节点上)打开一个端口,以便您可以访问您的服务。默认情况下它是随机的——这就是为什么当一个 pod 死亡时,它会为你生成一个新的。但是,您也可以指定一个端口(第 3 段 here)- 即使在重新创建 pod 后,您也可以访问同一端口。
clusterIP 只能在集群内部访问,因为它是私有 IP。这意味着,在默认情况下,您可以从集群内的另一个容器/节点访问此服务。您可以 exec
/ ssh
进入任何 运行 container/node 并尝试一下。
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-922f010849e0