第11节 service


❤️💕💕新时代拥抱云原生,云原生具有环境统一、按需付费、即开即用、稳定性强特点。Myblog:http://nsddd.topopen in new window


[TOC]

service

我们发现一个问题,就是使用pod -owide查看的ip是每一个pod结点都不一样的,那么是不是会出现一个问题:就是当我们有一个pod结点宕机了,这个岂不是凉凉了(还需要修改前端的地址嘛?)太麻烦了,我们可以直接使用service对外暴露一个公开为网络服务的抽象方法。

🔥Service:Pod的服务发现和负载均衡

  • Service 通过 label 关联对应的 Pod
  • Servcie 生命周期不跟 Pod 绑定,不会因为 Pod 重创改变 IP
  • 提供了负载均衡功能,自动转发流量到不同 Pod
  • 可对集群外部提供访问端口
  • 集群内部可通过服务名字访问

img

将pod统一暴露成一组服务

修改nginx配置文件

进入nginx并且修改配置文件访问

查看当前pod详细信息:

kubectl get pod -owide

image-20221022175600469

进入容器内部命令:

kubectl exec -it my-dep-6d4ddbf4f7-bllhd -- /bin/bash

修改配置文件(index.html):

[root@k8s-master01 ~]# kubectl exec -it my-dep-6d4ddbf4f7-bllhd -- /bin/bash
root@my-dep-6d4ddbf4f7-bllhd:/# cd /usr/share/nginx/html/
root@my-dep-6d4ddbf4f7-bllhd:/usr/share/nginx/html# echo "my name is xiongxinwei email:xxw@nsddd.top" > index.html 
root@my-dep-6d4ddbf4f7-bllhd:/usr/share/nginx/html# exit 
exit
[root@k8s-master01 ~]# curl 100.66.195.43
my name is xiongxinwei email:xxw@nsddd.top

此时已经修改成功~

同样的方式修改:

  • my-dep-6d4ddbf4f7-dckmw
  • my-dep-6d4ddbf4f7-vvxt8

使用service配置公共地址

查看信息:

image-20221022180728395

暴露成为一个固定的ip:

[root@k8s-master01 ~]# kubectl expose deploy my-dep --port=8000 --target-port=80
service/my-dep exposed

查看service的IP:

kubectl get service

image-20221022181104154

我们访问 `10.96.2.163:8000`

curl 10.96.2.163:8000

效果:

image-20221022181355962

这样就实现了负载均衡了~

yaml配置文件实现service

编写yaml文件:

apiVersion: v1
kind: Service
metadata:
  labels:
  	app: my-dep
  name: my-dep
spec:
  selector: 
  	app: my-dep
  ports:
  - port: 8000
  	protocol: TCP
  	targetPort: 80

特别注意的参数

⚠️ 在容器内部也可使用域名访问:

[root@k8s-master01 ~]# kubectl exec -it  my-dep-6d4ddbf4f7-dckmw  -- bin/bash
root@my-dep-6d4ddbf4f7-dckmw:/# curl 100.66.195.42  # ip方式访问
my name is xiongxinwei email:3293172751@qq.com
root@my-dep-6d4ddbf4f7-dckmw:/# curl my-dep.default.svc:8000  # 域名方式访问
my name is xiongxinwei email:xiongxinwei@mail.com
root@my-dep-6d4ddbf4f7-dckmw:/# curl my-dep.default.svc:8000 #也能实现负载均衡
my name is xiongxinwei email:xxw@nsddd.top

注意

在机器上是没办法这样访问的

image-20221022192356049

测试service的服务发现

提示

我们测试一下其中一台主机下线,service继续实现负载均衡

再开启也是恢复到了默认页面,新开启的nginx而不是以前的~

service服务暴露公网nodeport

注意

我们之前的还是只能在服务器内部访问,要想实现在公网访问,我们还可以用另外一种方式

删除之前的my-depservice

image-20221022193330095

重新暴露:

kubectl expose deploy my-dep --port=8000 --target-port=80 --type=NodePort

警告service默认模式

  • --type=NodePort:默认情况,集群内部的访问
  • --type=ClusterIP:设置为集群外部可以访问
kubectl expose deploy my-dep --port=8000 --target-port=80 --type=NodePort
kubectl expose deploy my-dep --port=8000 --target-port=80 --type=ClusterIP
kubectl expose deploy my-dep --port=8000 --target-port=80 #默认情况,集群内部的访问

image-20221022193953537

我们还可以看到暴露的多了一个端口80:31729/TCP ,这个是随机开放的端口。这样的话,我们访问任何一台机器的30948端口都可以访问~

这个端口是随机暴露的, 但是也是有范围,就是30000 - 32767之间,我们可以开启防火墙和vpc的端口转化。

🔥我们可以直接在浏览器上面访问这个页面了~

image-20221022194722363

多端口

多端口时必须配置 name, 文档open in new window

apiVersion: v1
kind: Service
metadata:
  name: test-k8s
spec:
  selector:
    app: test-k8s
  type: NodePort
  ports:
    - port: 8080        # 本 Service 的端口
      name: test-k8s    # 必须配置
      targetPort: 8080  # 容器端口
      nodePort: 31000   # 节点端口,范围固定 30000 ~ 32767
    - port: 8090
      name: test-other
      targetPort: 8090
      nodePort: 32000

image-20221103212958297

说明

与一般的Kubernetes名称一样,端口名称只能包含小写字母数字字符 和 -。 端口名称还必须以字母数字字符开头和结尾。

例如,名称 123-abcweb 有效,但是 123_abc-web 无效。

删除service

kubectl delete svc/kubernetes-bootcamp

image-20221103213132408

END 链接