知乎专栏 | 多维度架构 |
[root@localhost ~]# kubectl get service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE hello-minikube NodePort 10.109.33.86 <none> 8080:30436/TCP 134m kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 147m
排序
iMac:kubernetes neo$ kubectl get services --sort-by=.metadata.name NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 121m my-service ClusterIP 10.106.157.143 <none> 80/TCP,443/TCP 9m43s
创建 service.yaml 文件
apiVersion: v1 kind: Service metadata: name: my-service spec: selector: app: MyApp ports: - name: http protocol: TCP port: 80 targetPort: 80 - name: https protocol: TCP port: 443 targetPort: 443
iMac:kubernetes neo$ kubectl create -f service.yaml service/my-service created
查看服务
iMac:kubernetes neo$ kubectl get service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 113m my-service ClusterIP 10.106.157.143 <none> 80/TCP,443/TCP 64s
查看 service 后端代理的 pod 的 ip,这里没有挂载 pod 所以显示 none
iMac:kubernetes neo$ kubectl get endpoints my-service NAME ENDPOINTS AGE my-service <none> 2m20s
iMac:kubernetes neo$ kubectl describe service/registry Name: registry Namespace: default Labels: app=registry Annotations: <none> Selector: app=registry Type: NodePort IP: 10.10.0.188 Port: registry 5000/TCP TargetPort: 5000/TCP NodePort: registry 32050/TCP Endpoints: 172.17.0.6:5000 Session Affinity: None External Traffic Policy: Cluster Events: <none>
> kubectl get service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.43.0.1 <none> 443/TCP 4d13h nacos ClusterIP 10.43.175.40 <none> 8848/TCP,9848/TCP,9555/TCP 4d13h redis NodePort 10.43.129.224 <none> 6379:31436/TCP 42h kube-explorer ClusterIP 10.43.208.84 <none> 80/TCP 36h elasticsearch ClusterIP 10.43.241.136 <none> 9200/TCP,9300/TCP 13h elasticsearch-data ClusterIP 10.43.39.228 <none> 9300/TCP 13h kibana ClusterIP 10.43.193.15 <none> 80/TCP 13h mysql ExternalName <none> master 3306/TCP 6m24s mongo ExternalName <none> master 27017/TCP 6m24s > kubectl get service -o wide NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR kubernetes ClusterIP 10.43.0.1 <none> 443/TCP 4d13h <none> nacos ClusterIP 10.43.175.40 <none> 8848/TCP,9848/TCP,9555/TCP 4d13h app=nacos redis NodePort 10.43.129.224 <none> 6379:31436/TCP 42h app=redis kube-explorer ClusterIP 10.43.208.84 <none> 80/TCP 36h app=kube-explorer elasticsearch ClusterIP 10.43.241.136 <none> 9200/TCP,9300/TCP 13h app=elasticsearch,role=master elasticsearch-data ClusterIP 10.43.39.228 <none> 9300/TCP 13h app=elasticsearch,role=data kibana ClusterIP 10.43.193.15 <none> 80/TCP 13h app=kibana mysql ExternalName <none> master 3306/TCP 6m45s <none> mongo ExternalName <none> master 27017/TCP 6m45s <none>
语法
$ kubectl create service clusterip NAME [--tcp=<port>:<targetPort>] [--dry-run]
演示
kubectl create service clusterip my-service --tcp=5678:8080
headless 模式
kubectl create service clusterip my-service --clusterip="None"
报漏 80.11.12.10:80 地址
apiVersion: v1 kind: Service metadata: name: my-service spec: selector: app: MyApp ports: - name: http protocol: TCP port: 80 targetPort: 9376 externalIPs: - 80.11.12.10
语法
$ kubectl create service externalname NAME --external-name external.name [--dry-run]
演示
kubectl create service externalname my-externalname --external-name bar.com
apiVersion: v1 kind: Service metadata: name: my-service namespace: prod spec: type: ExternalName externalName: my.database.example.com
应用案例,在master节点宿主主机上安装了mysql和mongo地址,pod链接他们可以使用宿主IP链接,或者写 master 主机名。
我认为更好的方法使用使用 Service 做一层映射,然后使用统一容器域名访问 mysql.default.svc.cluster.local,mongo.default.svc.cluster.local
metadata: name: mysql namespace: default spec: ports: - name: mysql protocol: TCP port: 3306 targetPort: 3306 type: ExternalName externalName: master apiVersion: v1 kind: Service --- metadata: name: mongo namespace: default spec: ports: - name: mongo protocol: TCP port: 27017 targetPort: 27017 type: ExternalName externalName: master apiVersion: v1 kind: Service
apiVersion: v1 kind: Service metadata: name: mongo namespace: default spec: externalName: master ports: - name: mongo port: 27017 protocol: TCP targetPort: 27017 sessionAffinity: None type: ExternalName
语法
$ kubectl create service loadbalancer NAME [--tcp=port:targetPort] [--dry-run]
演示
kubectl create service loadbalancer my-lb --tcp=5678:8080
一般 HTTP 服务通过 ingress 对外报漏服务,TCP 的 Socket 服务可以使用 LoadBalancer 进行报漏
apiVersion: v1 kind: Service metadata: name: my-service spec: selector: app: MyApp ports: - protocol: TCP port: 80 targetPort: 9376 clusterIP: 10.0.171.239 type: LoadBalancer status: loadBalancer: ingress: - ip: 192.0.2.127
apiVersion: v1 kind: Service metadata: name: example-service spec: selector: app: example ports: - port: 8765 targetPort: 9376 type: LoadBalancer
apiVersion: v1 kind: Service metadata: name: test namespace: default resourceVersion: "42471353" spec: allocateLoadBalancerNodePorts: true clusterIP: 10.43.242.167 clusterIPs: - 10.43.242.167 externalIPs: - 172.18.200.55 externalTrafficPolicy: Cluster internalTrafficPolicy: Cluster ipFamilies: - IPv4 ipFamilyPolicy: SingleStack ports: - name: redis nodePort: 31143 port: 6380 protocol: TCP targetPort: 6379 selector: app: redis sessionAffinity: None type: LoadBalancer status: loadBalancer: ingress: - ip: 172.18.200.5 - ip: 172.18.200.50 - ip: 172.18.200.51
语法
$ kubectl create service nodeport NAME [--tcp=port:targetPort] [--dry-run]
演示
kubectl create service nodeport my-nodeport --tcp=5678:8080
apiVersion: v1 kind: Service metadata: name: my-service spec: type: NodePort selector: app: MyApp ports: # By default and for convenience, the `targetPort` is set to the same value as the `port` field. - port: 80 targetPort: 80 # Optional field # By default and for convenience, the Kubernetes control plane will allocate a port from a range (default: 30000-32767) nodePort: 30007
apiVersion: v1 kind: Service metadata: name: registry namespace: default labels: app: registry spec: type: NodePort selector: app: registry ports: - name: registry port: 5000 nodePort: 30050 protocol: TCP --- apiVersion: apps/v1 kind: Deployment metadata: name: registry namespace: default labels: app: registry spec: replicas: 1 selector: matchLabels: app: registry template: metadata: labels: app: registry spec: containers: - name: registry image: registry:latest resources: limits: cpu: 100m memory: 100Mi env: - name: REGISTRY_HTTP_ADDR value: :5000 - name: REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY value: /var/lib/registry ports: - containerPort: 5000 name: registry protocol: TCP