【Kubernetes】Service 之 使用

81 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第19天,点击查看活动详情

一、使用命令创建服务

需求: 创建一个名为 webappDeployment,它可以创建两个 Nginx Pod 副本,并且指定容器提供服务的端口号为 80 端口。

  1. 新建 nginx-deployment.yaml文件
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myweb
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.7.9
          ports:
            - containerPort: 80
  1. 执行创建
$ kubectl create -f nginx-deployment.yaml
deployment.apps/myweb created
  1. 查看新创建的 pods
$ kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
myweb-5754944d6c-2dfft   1/1     Running   0          18s
myweb-5754944d6c-7xr97   1/1     Running   0          18s
  1. 使用 kubectl expose创建服务

命令主要用于将一个已经存在的 Pod、RC、Service、或是 Deployment 暴露为一个新的 Service

# kubectl expose (-f FILENAME|TYPE NAME|TYPE/NAME) [--port=port] [--protocol=TCP|UDP] [--target-port=number-or-name][--name=name][--external-ip=external-ip-of-service][--type=type][flags]

$ kubectl expose deploy myweb
service/myweb exposed
  1. 查看创建好的服务

直接使用命令创建,不指定额外参数的话,新建的 Service 使用与 deploy 相同的名称,端口也会直接使用 Pod 中定义的 containerPort

$ kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP   81d
myweb        ClusterIP   10.106.77.234   <none>        80/TCP    52s
  1. 查找新建的两个 podip地址,查看myweb服务的详细信息
$ kubectl get pods -l app=nginx -o yaml|grep podIP
    podIP: 10.244.3.4
    podIP: 10.244.2.5
$ kubectl describe svc/myweb
 # 重点关注 Endpoints,可以看到它记录了符合要求的 Pods 在集群内部的 IP 地址和端口号
 
  1. 测试

进入集群内部,测试 clusterIP:port 是否可以访问

shiyanlou:~/ $ docker exec -it kube-master bash
root@kube-master:/# curl 10.105.149.130

可以看到在通过 ClusterIP 类型的 Service 已经可以成功实现集群内部的互相访问。



二、使用 YAML 文件创建服务

  1. 新建tomcat-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
spec:
  selector:
    matchLabels:
      app: tomcat
  replicas: 2
  template:
    metadata:
      labels:
        app: tomcat
    spec:
      containers:
        - name: tomcat
          image: tomcat
          ports:
            - containerPort: 8080
  1. 执行创建
$ kubectl create -f tomcat-deployment.yaml
deployment.apps/myapp created
  1. 查看新创建的 pods
$ kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
myapp-69ff6fc7c6-q5vwk   1/1     Running   0          108s
myapp-69ff6fc7c6-vwxm7   1/1     Running   0          108s
  1. 新建 myapp-svc.yaml文件

设置服务类型为 NodePort,集群内部服务的端口为 8081,对外提供服务的端口为 30001,并且 pod 的端口为 8080

apiVersion: v1
kind: Service
metadata:
  name: myapp
spec:
  type: NodePort # 指定服务类型为 NodePort
  ports:
    - port: 8081 # 指定集群内部 service 的端口
      targetPort: 8080 # 指定 Pod 的端口
      nodePort: 30001 # 指定外部连接的端口
  selector: # 标签选择器,选择带有 app=tomcat 的 Pod
    app: tomcat
  1. 执行创建
$ kubectl create -f myapp-svc.yaml
service/myapp created
  1. 查看服务信息
$ kubectl get svc
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP          82d
# 可以发现新建的 myapp 服务,类型为 NodePort;PORT 部分,8081 为集群 VIP 端口,30001 为外部连接 Node 的端口
myapp        NodePort    10.98.24.238   <none>        8081:30001/TCP   7s
$ kubectl get pods -l app=tomcat -o yaml|grep podIP
    podIP: 10.244.3.3
    podIP: 10.244.2.4
$ kubectl describe svc/myapp
Name:                     myapp
Namespace:                default
Labels:                   <none>
Annotations:              <none>
Selector:                 app=tomcat
Type:                     NodePort
IP:                       10.98.24.238
Port:                     <unset>  8081/TCP
TargetPort:               8080/TCP
NodePort:                 <unset>  30001/TCP
Endpoints:                10.244.2.4:8080,10.244.3.3:8080
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>
  1. 集群内部访问
shiyanlou:~/ $ docker exec -it kube-master bash
root@kube-master:/# curl 10.98.24.238:8081
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <title>Apache Tomcat/8.5.47</title>
        <link href="favicon.ico" rel="icon" type="image/x-icon" />
        <link href="favicon.ico" rel="shortcut icon" type="image/x-icon" />
        <link href="tomcat.css" rel="stylesheet" type="text/css" />
    </head>
......

通过 10.192.0.2:30001访问