1:通过pod 来创建service: pod_nginx.yaml

pod_nginx.yml 
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: nginx
spec:
  containers:
  - name: nginx-container
    image: nginx
    ports:
    - name: nginx-port
      containerPort: 8

 来创建 pod:

kubectl create -f pod_nginx.yml 
kubectl get pods

[root@k8s-master script]# kubectl get pod
NAME                     READY   STATUS         RESTARTS   AGE
nginx-pod                1/1     Running        0          18m

发现pod 已经创建好了,但是 service 还没有好:

[root@k8s-master script]# kubectl get svc
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.1.0.1       <none>        443/TCP        2d

原来是这个pod 还没有暴露,下面暴露一下:

[root@k8s-master script]# kubectl expose pods nginx-pod

[root@k8s-master script]# kubectl get svc
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.1.0.1       <none>        443/TCP        2d
nginx-pod    ClusterIP   10.1.95.106    <none>        80/TCP         4s

这个时候,外面还是不能访问的,需要再expose type=NodePort 才可以:

root@k8s-master script]# kubectl expose pods nginx-pod --type=NodePort
Error from server (AlreadyExists): services "nginx-pod" already exists

上面报错,因为service : nignx 已经存在了。

删掉重建:
[root@k8s-master script]# kubectl delete service nginx-pod
service "nginx-pod" deleted
[root@k8s-master script]# kubectl expose pods nginx-pod --type=NodePort
service/nginx-pod exposed
[root@k8s-master script]# kubectl get svc
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.1.0.1       <none>        443/TCP        2d
nginx-pod    NodePort    10.1.236.69    <none>        80:30582/TCP   7s

再次访问就可以了: http://hostname_IP:20582 就可以了。

如果要指定访问port, 可以通过下面建立service 来实现:

----------------------

2: 创建service 文件:

service_nginx.yaml:

apiVersion: v1
kind: Service
metadata:
   name: nginx-service
spec:
  ports:
  - port: 31888
    nodePort: 31888
    targetPort: nginx-port
    protocol: TCP
  selector:
    app: nginx   # 注意, 这个app 一定要对应好相应的pod,具体可以用:kubectl get pod --show-labels 来看:
  type: NodePort

 

kubectl create -f service_nginx.yaml
service/nginx-service created

[root@k8s-master script]# kubectl get svc
NAME            TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)           AGE
kubernetes      ClusterIP   10.1.0.1       <none>        443/TCP           2d1h
nginx-pod       NodePort    10.1.236.69    <none>        80:30582/TCP      42m
nginx-service   NodePort    10.1.236.183   <none>        31888:31888/TCP   28s

可以看一下: pod 后面的lable, 来准确关联app:

[root@k8s-master script]# kubectl get pod --show-labels
NAME                     READY   STATUS    RESTARTS   AGE   LABELS
emptydir-test            2/2     Running   85         44h   <none>
nginx-86c57db685-86fjw   1/1     Running   5          47h   app=nginx,pod-template-hash=86c57db685
nginx-pod                1/1     Running   0          55m   app=nginx

由上面可以看出,对外发布service 的端口可以通过两种方法来实现,一种是创建pod, 还有一种方便的方法就是:创建service, 可以指定port, 关键是app 要对应相应的pod, 这个可以通过kubectl get pod --show-labels 来看。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐